From f20694754fc74c930bf9e64b67afa23f6629c3af Mon Sep 17 00:00:00 2001 From: dashixiong Date: Tue, 27 Jan 2026 14:03:02 +0800 Subject: [PATCH] first commit --- LICENSE | 661 ++ README.md | 125 + configure/dev/application.properties | 115 + configure/prod/application.properties | 115 + db/fuint-db.sql | 6571 +++++++++++++++++ db/update_for_20250403.sql | 4 + db/update_for_20250422.sql | 2 + db/update_for_20250429.sql | 14 + db/update_for_20250514.sql | 5 + db/update_for_20250603.sql | 2 + db/update_for_20250925.sql | 2 + db/update_for_20251013.sql | 2 + db/update_for_20251020.sql | 5 + db/update_for_20251212.sql | 2 + db/update_for_20260109.sql | 2 + db/说明.txt | 2 + fuint-application/pom.xml | 193 + .../main/java/com/fuint/common/Constants.java | 38 + .../java/com/fuint/common/aspect/LogAop.java | 147 + .../fuint/common/aspect/RedisModelAspect.java | 16 + .../fuint/common/aspect/TActionLogAop.java | 240 + .../com/fuint/common/bean/AliPayBean.java | 43 + .../com/fuint/common/bean/H5SceneInfo.java | 83 + .../com/fuint/common/bean/UnionPayBean.java | 35 + .../java/com/fuint/common/bean/WxPayBean.java | 33 + .../com/fuint/common/bean/WxPayV3Bean.java | 43 + .../bean/shoppingOrders/ContactBean.java | 36 + .../bean/shoppingOrders/OrderKeyBean.java | 49 + .../common/bean/shoppingOrders/PayerBean.java | 31 + .../bean/shoppingOrders/ShippingInfo.java | 67 + .../bean/shoppingOrders/ShippingListBean.java | 64 + .../fuint/common/config/CaptchaConfig.java | 41 + .../java/com/fuint/common/config/Message.java | 23 + .../common/config/MybatisPlusConfig.java | 51 + .../com/fuint/common/config/RedisConfig.java | 67 + .../fuint/common/config/SecurityConfig.java | 100 + .../fuint/common/config/SwaggerConfig.java | 44 + .../com/fuint/common/config/WebConfig.java | 110 + .../com/fuint/common/domain/TreeNode.java | 66 + .../com/fuint/common/domain/TreeSelect.java | 61 + .../java/com/fuint/common/dto/AccountDto.java | 67 + .../com/fuint/common/dto/AccountInfo.java | 74 + .../java/com/fuint/common/dto/AddressDto.java | 54 + .../java/com/fuint/common/dto/ArticleDto.java | 60 + .../java/com/fuint/common/dto/AssetDto.java | 23 + .../java/com/fuint/common/dto/BalanceDto.java | 53 + .../java/com/fuint/common/dto/BannerDto.java | 57 + .../main/java/com/fuint/common/dto/Body.java | 31 + .../com/fuint/common/dto/BookCateDto.java | 51 + .../java/com/fuint/common/dto/BookDto.java | 83 + .../com/fuint/common/dto/BookItemDto.java | 87 + .../com/fuint/common/dto/BookTimeDto.java | 25 + .../fuint/common/dto/CommissionCashDto.java | 67 + .../fuint/common/dto/CommissionLogDto.java | 96 + .../common/dto/CommissionRelationDto.java | 57 + .../fuint/common/dto/CommissionRuleDto.java | 64 + .../common/dto/CommissionRuleItemDto.java | 40 + .../com/fuint/common/dto/ConfirmLogDto.java | 65 + .../com/fuint/common/dto/CouponCellDto.java | 28 + .../java/com/fuint/common/dto/CouponDto.java | 80 + .../java/com/fuint/common/dto/DateDto.java | 20 + .../java/com/fuint/common/dto/DayDto.java | 24 + .../java/com/fuint/common/dto/ExpressDto.java | 27 + .../java/com/fuint/common/dto/GiveDto.java | 76 + .../com/fuint/common/dto/GiveItemDto.java | 47 + .../com/fuint/common/dto/GoodsCateDto.java | 59 + .../com/fuint/common/dto/GoodsDetailDto.java | 92 + .../java/com/fuint/common/dto/GoodsDto.java | 132 + .../com/fuint/common/dto/GoodsSkuDto.java | 53 + .../fuint/common/dto/GoodsSpecChildDto.java | 27 + .../com/fuint/common/dto/GoodsSpecDto.java | 28 + .../fuint/common/dto/GoodsSpecItemDto.java | 28 + .../fuint/common/dto/GoodsSpecValueDto.java | 27 + .../com/fuint/common/dto/GoodsTopDto.java | 34 + .../com/fuint/common/dto/GroupDataDto.java | 31 + .../fuint/common/dto/GroupDataListDto.java | 21 + .../com/fuint/common/dto/GroupMemberDto.java | 28 + .../java/com/fuint/common/dto/HangUpDto.java | 36 + .../main/java/com/fuint/common/dto/Head.java | 38 + .../com/fuint/common/dto/MemberGroupDto.java | 48 + .../com/fuint/common/dto/MemberTopDto.java | 34 + .../com/fuint/common/dto/MerchantDto.java | 68 + .../fuint/common/dto/MerchantSettingDto.java | 34 + .../com/fuint/common/dto/MessageResDto.java | 24 + .../com/fuint/common/dto/MyCouponDto.java | 77 + .../com/fuint/common/dto/NavigationDto.java | 37 + .../com/fuint/common/dto/OpenGiftDto.java | 51 + .../com/fuint/common/dto/OpenWxCardDto.java | 33 + .../java/com/fuint/common/dto/OrderDto.java | 127 + .../com/fuint/common/dto/OrderGoodsDto.java | 55 + .../com/fuint/common/dto/OrderUserDto.java | 40 + .../main/java/com/fuint/common/dto/Page.java | 120 + .../java/com/fuint/common/dto/ParamDto.java | 30 + .../java/com/fuint/common/dto/PointDto.java | 50 + .../com/fuint/common/dto/PreStoreRuleDto.java | 22 + .../com/fuint/common/dto/RechargeRuleDto.java | 26 + .../java/com/fuint/common/dto/RefundDto.java | 83 + .../java/com/fuint/common/dto/RegionDto.java | 39 + .../com/fuint/common/dto/ReqCouponDto.java | 120 + .../fuint/common/dto/ReqCouponGroupDto.java | 44 + .../java/com/fuint/common/dto/ReqResult.java | 29 + .../com/fuint/common/dto/ReqSendLogDto.java | 66 + .../java/com/fuint/common/dto/ResCartDto.java | 43 + .../java/com/fuint/common/dto/ResCateDto.java | 33 + .../java/com/fuint/common/dto/RoleDto.java | 33 + .../com/fuint/common/dto/SettlementDto.java | 58 + .../fuint/common/dto/SettlementOrderDto.java | 44 + .../com/fuint/common/dto/SmsTemplateDto.java | 45 + .../java/com/fuint/common/dto/SourceDto.java | 71 + .../java/com/fuint/common/dto/StaffDto.java | 64 + .../com/fuint/common/dto/StockGoodsDto.java | 46 + .../java/com/fuint/common/dto/StoreDto.java | 46 + .../java/com/fuint/common/dto/StoreInfo.java | 87 + .../com/fuint/common/dto/SubMessageDto.java | 38 + .../java/com/fuint/common/dto/TimeDto.java | 21 + .../java/com/fuint/common/dto/TokenDto.java | 28 + .../com/fuint/common/dto/UserCouponDto.java | 80 + .../java/com/fuint/common/dto/UserDto.java | 112 + .../com/fuint/common/dto/UserGroupDto.java | 54 + .../java/com/fuint/common/dto/UserInfo.java | 25 + .../com/fuint/common/dto/UserOrderDto.java | 149 + .../java/com/fuint/common/dto/WxCardDto.java | 75 + .../com/fuint/common/enums/AdminRoleEnum.java | 77 + .../fuint/common/enums/ApplyGoodsEnum.java | 57 + .../common/enums/BalanceSettingEnum.java | 57 + .../fuint/common/enums/BookStatusEnum.java | 71 + .../enums/CommissionCashStatusEnum.java | 51 + .../common/enums/CommissionStatusEnum.java | 50 + .../common/enums/CommissionTargetEnum.java | 49 + .../common/enums/CommissionTypeEnum.java | 66 + .../fuint/common/enums/CouponContentEnum.java | 37 + .../common/enums/CouponExpireTypeEnum.java | 37 + .../fuint/common/enums/CouponTypeEnum.java | 50 + .../fuint/common/enums/CouponUseForEnum.java | 69 + .../common/enums/ExpressCompanyEnum.java | 60 + .../com/fuint/common/enums/GenderEnum.java | 39 + .../com/fuint/common/enums/GoodsTypeEnum.java | 70 + .../fuint/common/enums/InvoiceStatusEnum.java | 69 + .../fuint/common/enums/MemberSourceEnum.java | 59 + .../fuint/common/enums/MerchantTypeEnum.java | 51 + .../com/fuint/common/enums/MessageEnum.java | 35 + .../com/fuint/common/enums/OrderModeEnum.java | 49 + .../fuint/common/enums/OrderSettingEnum.java | 61 + .../fuint/common/enums/OrderStatusEnum.java | 66 + .../com/fuint/common/enums/OrderTypeEnum.java | 69 + .../com/fuint/common/enums/PayStatusEnum.java | 49 + .../com/fuint/common/enums/PayTypeEnum.java | 55 + .../fuint/common/enums/PlatformTypeEnum.java | 66 + .../fuint/common/enums/PointSettingEnum.java | 59 + .../common/enums/PrinterSettingEnum.java | 59 + .../com/fuint/common/enums/QrCodeEnum.java | 76 + .../fuint/common/enums/RefundStatusEnum.java | 53 + .../fuint/common/enums/RefundTypeEnum.java | 50 + .../com/fuint/common/enums/SendWayEnum.java | 58 + .../fuint/common/enums/SettingTypeEnum.java | 64 + .../fuint/common/enums/SettleStatusEnum.java | 49 + .../fuint/common/enums/SmsSettingEnum.java | 59 + .../fuint/common/enums/StaffCategoryEnum.java | 90 + .../com/fuint/common/enums/StatusEnum.java | 55 + .../fuint/common/enums/UserActionEnum.java | 64 + .../common/enums/UserCouponStatusEnum.java | 72 + .../common/enums/UserGradeCatchTypeEnum.java | 51 + .../fuint/common/enums/UserSettingEnum.java | 61 + .../com/fuint/common/enums/WxMessageEnum.java | 62 + .../com/fuint/common/enums/YesOrNoEnum.java | 57 + .../fuint/common/http/HttpRESTDataClient.java | 138 + .../common/param/AddressDetailParam.java | 18 + .../common/param/ArticleDetailParam.java | 18 + .../fuint/common/param/ArticleListParam.java | 21 + .../com/fuint/common/param/ArticlePage.java | 31 + .../fuint/common/param/BalanceListParam.java | 18 + .../com/fuint/common/param/BalancePage.java | 40 + .../com/fuint/common/param/BannerPage.java | 28 + .../com/fuint/common/param/BookCatePage.java | 28 + .../fuint/common/param/BookDetailParam.java | 18 + .../com/fuint/common/param/BookItemPage.java | 37 + .../com/fuint/common/param/BookListParam.java | 24 + .../java/com/fuint/common/param/BookPage.java | 31 + .../com/fuint/common/param/BookableParam.java | 25 + .../fuint/common/param/CartClearParam.java | 25 + .../com/fuint/common/param/CartListParam.java | 45 + .../com/fuint/common/param/CartSaveParam.java | 39 + .../common/param/CommissionCashPage.java | 40 + .../fuint/common/param/CommissionLogPage.java | 43 + .../common/param/CommissionRelationPage.java | 46 + .../common/param/CommissionRuleItemParam.java | 31 + .../common/param/CommissionRulePage.java | 37 + .../common/param/CommissionRuleParam.java | 57 + .../fuint/common/param/ConfirmLogPage.java | 34 + .../com/fuint/common/param/ConfirmParam.java | 24 + .../fuint/common/param/CouponInfoParam.java | 21 + .../fuint/common/param/CouponListParam.java | 46 + .../common/param/CouponReceiveParam.java | 27 + .../com/fuint/common/param/GiveListParam.java | 21 + .../com/fuint/common/param/GiveParam.java | 36 + .../fuint/common/param/GivePointParam.java | 25 + .../com/fuint/common/param/GoodsCatePage.java | 31 + .../fuint/common/param/GoodsInfoParam.java | 21 + .../fuint/common/param/GoodsListParam.java | 58 + .../com/fuint/common/param/InvoiceParam.java | 74 + .../fuint/common/param/MemberDetailParam.java | 19 + .../fuint/common/param/MemberInfoParam.java | 37 + .../fuint/common/param/MemberListParam.java | 61 + .../com/fuint/common/param/MemberPage.java | 67 + .../fuint/common/param/OrderConfirmParam.java | 25 + .../fuint/common/param/OrderDetailParam.java | 18 + .../fuint/common/param/OrderListParam.java | 83 + .../com/fuint/common/param/PageParam.java | 69 + .../com/fuint/common/param/PrinterPage.java | 34 + .../com/fuint/common/param/PrinterParam.java | 50 + .../com/fuint/common/param/RechargeParam.java | 25 + .../fuint/common/param/RefundDetailParam.java | 19 + .../fuint/common/param/RefundListParam.java | 83 + .../fuint/common/param/SendCouponParam.java | 31 + .../fuint/common/param/SettlementParam.java | 78 + .../fuint/common/param/ShareListParam.java | 18 + .../com/fuint/common/param/StaffParam.java | 40 + .../fuint/common/param/StatisticParam.java | 25 + .../common/permission/PermissionService.java | 73 + .../fuint/common/service/AccountService.java | 122 + .../common/service/ActionLogService.java | 31 + .../fuint/common/service/AddressService.java | 42 + .../fuint/common/service/AlipayService.java | 62 + .../fuint/common/service/ArticleService.java | 67 + .../fuint/common/service/BalanceService.java | 56 + .../fuint/common/service/BannerService.java | 72 + .../fuint/common/service/BookCateService.java | 63 + .../fuint/common/service/BookItemService.java | 93 + .../com/fuint/common/service/BookService.java | 76 + .../fuint/common/service/CaptchaService.java | 43 + .../com/fuint/common/service/CartService.java | 80 + .../com/fuint/common/service/CateService.java | 83 + .../common/service/CommissionCashService.java | 83 + .../common/service/CommissionLogService.java | 53 + .../service/CommissionRelationService.java | 36 + .../common/service/CommissionRuleService.java | 51 + .../common/service/ConfirmLogService.java | 47 + .../common/service/CouponGroupService.java | 93 + .../fuint/common/service/CouponService.java | 179 + .../com/fuint/common/service/DutyService.java | 121 + .../fuint/common/service/GenCodeService.java | 58 + .../com/fuint/common/service/GiveService.java | 58 + .../fuint/common/service/GoodsService.java | 175 + .../fuint/common/service/InvoiceService.java | 88 + .../common/service/MemberGroupService.java | 59 + .../fuint/common/service/MemberService.java | 276 + .../fuint/common/service/MerchantService.java | 119 + .../fuint/common/service/MessageService.java | 58 + .../fuint/common/service/OpenGiftService.java | 73 + .../fuint/common/service/OrderService.java | 259 + .../fuint/common/service/PaymentService.java | 50 + .../fuint/common/service/PointService.java | 46 + .../fuint/common/service/PrinterService.java | 81 + .../fuint/common/service/RefundService.java | 94 + .../fuint/common/service/SendLogService.java | 51 + .../fuint/common/service/SendSmsService.java | 37 + .../fuint/common/service/SettingService.java | 94 + .../common/service/SettlementService.java | 54 + .../common/service/SmsTemplateService.java | 58 + .../fuint/common/service/SourceService.java | 103 + .../fuint/common/service/StaffService.java | 91 + .../fuint/common/service/StockService.java | 79 + .../fuint/common/service/StoreService.java | 152 + .../fuint/common/service/UnionPayService.java | 62 + .../fuint/common/service/UploadService.java | 23 + .../common/service/UserActionService.java | 49 + .../common/service/UserCouponService.java | 116 + .../common/service/UserGradeService.java | 94 + .../common/service/VerifyCodeService.java | 45 + .../fuint/common/service/WeixinService.java | 195 + .../service/impl/AccountServiceImpl.java | 416 ++ .../service/impl/ActionLogServiceImpl.java | 81 + .../service/impl/AddressServiceImpl.java | 120 + .../service/impl/AlipayServiceImpl.java | 261 + .../service/impl/ArticleServiceImpl.java | 288 + .../service/impl/BalanceServiceImpl.java | 326 + .../service/impl/BannerServiceImpl.java | 257 + .../service/impl/BookCateServiceImpl.java | 231 + .../service/impl/BookItemServiceImpl.java | 369 + .../common/service/impl/BookServiceImpl.java | 403 + .../service/impl/CaptchaServiceImpl.java | 107 + .../common/service/impl/CartServiceImpl.java | 322 + .../common/service/impl/CateServiceImpl.java | 287 + .../impl/CommissionCashServiceImpl.java | 434 ++ .../impl/CommissionLogServiceImpl.java | 377 + .../impl/CommissionRelationServiceImpl.java | 173 + .../impl/CommissionRuleServiceImpl.java | 357 + .../service/impl/ConfirmLogServiceImpl.java | 167 + .../service/impl/CouponGroupServiceImpl.java | 489 ++ .../service/impl/CouponServiceImpl.java | 1303 ++++ .../common/service/impl/DutyServiceImpl.java | 305 + .../service/impl/GenCodeServiceImpl.java | 186 + .../common/service/impl/GiveServiceImpl.java | 332 + .../common/service/impl/GoodsServiceImpl.java | 1074 +++ .../service/impl/InvoiceServiceImpl.java | 241 + .../service/impl/MemberGroupServiceImpl.java | 265 + .../service/impl/MemberServiceImpl.java | 1137 +++ .../service/impl/MerchantServiceImpl.java | 435 ++ .../service/impl/MessageServiceImpl.java | 133 + .../service/impl/OpenGiftServiceImpl.java | 365 + .../common/service/impl/OrderServiceImpl.java | 2433 ++++++ .../service/impl/PaymentServiceImpl.java | 331 + .../common/service/impl/PointServiceImpl.java | 274 + .../service/impl/PrinterServiceImpl.java | 419 ++ .../service/impl/RefundServiceImpl.java | 666 ++ .../service/impl/SendLogServiceImpl.java | 149 + .../service/impl/SendSmsServiceImpl.java | 310 + .../service/impl/SettingServiceImpl.java | 231 + .../service/impl/SettlementServiceImpl.java | 255 + .../service/impl/SmsTemplateServiceImpl.java | 170 + .../service/impl/SourceServiceImpl.java | 340 + .../common/service/impl/StaffServiceImpl.java | 330 + .../common/service/impl/StockServiceImpl.java | 257 + .../common/service/impl/StoreServiceImpl.java | 629 ++ .../service/impl/UnionPayServiceImpl.java | 271 + .../service/impl/UploadServiceImpl.java | 74 + .../service/impl/UserActionServiceImpl.java | 147 + .../service/impl/UserCouponServiceImpl.java | 766 ++ .../service/impl/UserGradeServiceImpl.java | 264 + .../service/impl/VerifyCodeServiceImpl.java | 125 + .../service/impl/WeixinServiceImpl.java | 1376 ++++ .../com/fuint/common/util/AliyunOssUtil.java | 124 + .../com/fuint/common/util/AuthUserUtil.java | 29 + .../com/fuint/common/util/Base64Util.java | 106 + .../fuint/common/util/BizCodeGenerator.java | 65 + .../com/fuint/common/util/CommonUtil.java | 532 ++ .../java/com/fuint/common/util/DateUtil.java | 198 + .../common/util/DtoConversionEntity.java | 94 + .../java/com/fuint/common/util/ExcelUtil.java | 130 + .../java/com/fuint/common/util/GenUtils.java | 134 + .../com/fuint/common/util/HashSignUtil.java | 49 + .../com/fuint/common/util/HtmlEncode.java | 35 + .../com/fuint/common/util/HttpClientUtil.java | 274 + .../fuint/common/util/HttpPostUploadUtil.java | 156 + .../java/com/fuint/common/util/KD100Util.java | 67 + .../java/com/fuint/common/util/ListUtil.java | 73 + .../java/com/fuint/common/util/MD5Util.java | 62 + .../com/fuint/common/util/NoteFormatter.java | 279 + .../common/util/PhoneFormatCheckUtils.java | 51 + .../com/fuint/common/util/PrinterUtil.java | 249 + .../com/fuint/common/util/QRCodeUtil.java | 147 + .../com/fuint/common/util/QuartzCronUtil.java | 50 + .../java/com/fuint/common/util/RedisLock.java | 56 + .../java/com/fuint/common/util/RedisUtil.java | 160 + .../java/com/fuint/common/util/RegexUtil.java | 130 + .../java/com/fuint/common/util/SeqUtil.java | 57 + .../java/com/fuint/common/util/TimeUtil.java | 161 + .../java/com/fuint/common/util/TimeUtils.java | 110 + .../java/com/fuint/common/util/TokenUtil.java | 197 + .../java/com/fuint/common/util/TreeUtil.java | 46 + .../common/util/VelocityInitializer.java | 30 + .../com/fuint/common/util/VelocityUtils.java | 141 + .../java/com/fuint/common/util/XlsUtil.java | 181 + .../main/java/com/fuint/common/vo/MetaVo.java | 101 + .../java/com/fuint/common/vo/RouterVo.java | 149 + .../common/vo/printer/AddPrinterRequest.java | 24 + .../vo/printer/AddPrinterRequestItem.java | 35 + .../common/vo/printer/DelPrinterRequest.java | 23 + .../common/vo/printer/ObjectRestResponse.java | 94 + .../common/vo/printer/OrderStatisResult.java | 35 + .../common/vo/printer/OrderStatusType.java | 31 + .../fuint/common/vo/printer/PrintRequest.java | 124 + .../common/vo/printer/PrinterRequest.java | 23 + .../common/vo/printer/PrinterResult.java | 57 + .../common/vo/printer/PrinterStatusType.java | 43 + .../common/vo/printer/PrintersRequest.java | 25 + .../vo/printer/QueryOrderStateRequest.java | 23 + .../vo/printer/QueryOrderStatisRequest.java | 35 + .../fuint/common/vo/printer/RestRequest.java | 59 + .../vo/printer/SetVoiceTypeRequest.java | 36 + .../common/vo/printer/UpdPrinterRequest.java | 59 + .../fuint/common/vo/printer/VoiceRequest.java | 60 + .../common/web/AdminUserInterceptor.java | 45 + .../java/com/fuint/common/web/CORSFilter.java | 30 + .../common/web/ClientUserInterceptor.java | 77 + .../fuint/common/web/CommandInterceptor.java | 23 + .../fuint/common/web/SpringContextHolder.java | 37 + .../java/com/fuint/common/web/SystemInit.java | 48 + .../main/java/com/fuint/fuintApplication.java | 46 + .../controller/BackendAccountController.java | 381 + .../BackendActionLogController.java | 81 + .../controller/BackendArticleController.java | 157 + .../controller/BackendBalanceController.java | 274 + .../controller/BackendBannerController.java | 155 + .../controller/BackendBookCateController.java | 157 + .../controller/BackendBookController.java | 192 + .../controller/BackendBookItemController.java | 163 + .../controller/BackendCaptchaController.java | 83 + .../controller/BackendCashierController.java | 371 + .../controller/BackendCateController.java | 171 + .../BackendCommissionCashController.java | 180 + .../BackendCommissionLogController.java | 172 + .../BackendCommissionRelationController.java | 129 + .../BackendCommissionRuleController.java | 134 + .../controller/BackendCommonController.java | 118 + .../BackendConfirmLogController.java | 105 + .../controller/BackendCouponController.java | 381 + .../BackendCouponGroupController.java | 292 + .../BackendDoConfirmController.java | 149 + .../controller/BackendDutyController.java | 244 + .../controller/BackendFileController.java | 156 + .../controller/BackendGenCodeController.java | 170 + .../controller/BackendGiveLogController.java | 189 + .../controller/BackendGoodsController.java | 746 ++ .../controller/BackendHomeController.java | 167 + .../controller/BackendInvoiceController.java | 162 + .../controller/BackendLoginController.java | 179 + .../controller/BackendMemberController.java | 458 ++ .../BackendMemberGroupController.java | 173 + .../controller/BackendMerchantController.java | 191 + .../controller/BackendNavigateController.java | 111 + .../controller/BackendOpenGiftController.java | 210 + .../controller/BackendOrderController.java | 483 ++ .../controller/BackendPointController.java | 246 + .../controller/BackendPrinterController.java | 261 + .../controller/BackendRefundController.java | 218 + .../controller/BackendSendLogController.java | 126 + .../BackendSettlementController.java | 176 + .../controller/BackendSmsController.java | 167 + .../BackendSmsTemplateController.java | 124 + .../controller/BackendSourceController.java | 217 + .../controller/BackendStaffController.java | 228 + .../BackendStatisticController.java | 179 + .../controller/BackendStockController.java | 208 + .../controller/BackendStoreController.java | 221 + .../BackendSubMessageController.java | 241 + .../BackendUserCouponController.java | 272 + .../BackendUserGradeController.java | 240 + .../request/AccountInfoRequest.java | 41 + .../request/CommissionCashRequest.java | 30 + .../request/CommissionLogRequest.java | 33 + .../CommissionSettleConfirmRequest.java | 25 + .../request/CommissionSettleRequest.java | 37 + .../backendApi/request/DutyStatusRequest.java | 22 + .../backendApi/request/LoginRequest.java | 27 + .../request/MemberSubmitRequest.java | 61 + .../request/MerchantSubmitRequest.java | 62 + .../backendApi/request/SettlementRequest.java | 36 + .../request/StoreSubmitRequest.java | 88 + .../backendApi/response/LoginResponse.java | 19 + .../controller/ClientAddressController.java | 193 + .../controller/ClientArticleController.java | 85 + .../controller/ClientBalanceController.java | 182 + .../controller/ClientBookController.java | 268 + .../controller/ClientCaptchaController.java | 80 + .../controller/ClientCartController.java | 316 + .../controller/ClientCashierController.java | 63 + .../controller/ClientConfirmController.java | 140 + .../controller/ClientCouponController.java | 171 + .../controller/ClientFileController.java | 174 + .../controller/ClientGiveController.java | 101 + .../controller/ClientGoodsController.java | 301 + .../controller/ClientHelpController.java | 42 + .../controller/ClientMessageController.java | 151 + .../controller/ClientMyCouponController.java | 105 + .../controller/ClientOrderController.java | 156 + .../controller/ClientPageController.java | 79 + .../controller/ClientPayController.java | 282 + .../controller/ClientPointsController.java | 81 + .../controller/ClientRefundController.java | 169 + .../controller/ClientRegionController.java | 102 + .../ClientSettlementController.java | 43 + .../controller/ClientShareController.java | 114 + .../controller/ClientSignController.java | 424 ++ .../controller/ClientSmsController.java | 125 + .../controller/ClientStoreController.java | 72 + .../controller/ClientSystemController.java | 162 + .../controller/ClientUserController.java | 387 + .../ClientUserCouponController.java | 199 + .../clientApi/request/AddressRequest.java | 43 + .../clientApi/request/GoodsSearchRequest.java | 34 + .../clientApi/request/MemberInfoRequest.java | 49 + .../clientApi/request/MyCouponRequest.java | 22 + .../clientApi/request/RefundListRequest.java | 23 + .../request/RefundSubmitRequest.java | 32 + .../controller/MerchantBalanceController.java | 86 + .../controller/MerchantBookController.java | 173 + .../controller/MerchantController.java | 104 + .../controller/MerchantCouponController.java | 132 + .../controller/MerchantMemberController.java | 172 + .../controller/MerchantOrderController.java | 165 + .../controller/MerchantRefundController.java | 133 + .../controller/MerchantSettingController.java | 94 + .../controller/MerchantStaffController.java | 144 + .../merchantApi/request/BookConfirmParam.java | 22 + .../merchantApi/request/BookDetailParam.java | 19 + .../merchantApi/request/BookListRequest.java | 26 + .../request/MerchantSettingParam.java | 37 + .../merchantApi/request/StaffListRequest.java | 20 + .../fuint/module/schedule/CommissionJob.java | 106 + .../module/schedule/CouponExpireJob.java | 157 + .../com/fuint/module/schedule/MessageJob.java | 93 + .../fuint/module/schedule/OrderAutoJob.java | 123 + .../fuint/module/schedule/OrderCancelJob.java | 105 + .../schedule/UploadShippingInfoJob.java | 85 + .../src/main/resources/application.properties | 31 + .../main/resources/captcha-conf.properties | 25 + .../src/main/resources/ehcache.xml | 25 + .../international/message_en_US.properties | 24 + .../international/message_zh_CN.properties | 25 + .../src/main/resources/logback-spring.xml | 35 + .../src/main/resources/sentry.properties | 1 + .../main/resources/static/defaultImage/1.png | Bin 0 -> 755 bytes .../main/resources/static/defaultImage/2.png | Bin 0 -> 1587 bytes .../main/resources/static/defaultImage/3.png | Bin 0 -> 1685 bytes .../main/resources/static/defaultImage/4.png | Bin 0 -> 1305 bytes .../resources/static/defaultImage/all.png | Bin 0 -> 2026 bytes .../resources/static/defaultImage/avatar.png | Bin 0 -> 1754 bytes .../static/defaultImage/banner-1.png | Bin 0 -> 79516 bytes .../static/defaultImage/banner-2.png | Bin 0 -> 106948 bytes .../main/resources/static/defaultImage/bg.png | Bin 0 -> 12693 bytes .../resources/static/defaultImage/card.png | Bin 0 -> 3453 bytes .../resources/static/defaultImage/coupon.png | Bin 0 -> 7076 bytes .../resources/static/defaultImage/hot.png | Bin 0 -> 2198 bytes .../resources/static/defaultImage/life.png | Bin 0 -> 1853 bytes .../resources/static/defaultImage/logo.png | Bin 0 -> 17478 bytes .../resources/static/defaultImage/love.png | Bin 0 -> 1303 bytes .../resources/static/defaultImage/none.png | Bin 0 -> 1694 bytes .../resources/static/defaultImage/office.png | Bin 0 -> 504 bytes .../resources/static/defaultImage/timer.png | Bin 0 -> 3720 bytes .../31cbf7ad0ef442a4b10dcefc24db0662.jpg | Bin 0 -> 100475 bytes .../4c90921a7fc34c97b0f62cebf314d2bb.jpg | Bin 0 -> 69315 bytes .../56e306c812f240f89c0ed96ab8f94ad0.jpg | Bin 0 -> 82488 bytes .../6083071182cd48afa6c2b9e23f181832.jpg | Bin 0 -> 37071 bytes .../6b67b70f35734ff28a03aa3d82ac96a0.jpg | Bin 0 -> 76355 bytes .../856dbc96197e4782b4febb7a6e671bcb.jpg | Bin 0 -> 23269 bytes .../9b64b3d65fa04296b62de186899f24ea.jpg | Bin 0 -> 60669 bytes .../bfdd063cda3043688252ff49513e1fec.jpg | Bin 0 -> 80678 bytes .../d39f84568b9746f89d9f6a368b8067c4.jpg | Bin 0 -> 77714 bytes .../e641d7430df04c35a93a8238f5f6e312.jpg | Bin 0 -> 76469 bytes .../ee5c67ed338442fc90e5c647ccbfd381.jpg | Bin 0 -> 105933 bytes .../ff4809f7a17d4142ace9bc287aab105a.jpg | Bin 0 -> 125261 bytes .../resources/template/GoodsTemplate.xlsx | Bin 0 -> 11701 bytes .../resources/template/MemberTemplate.xlsx | Bin 0 -> 10287 bytes .../src/main/resources/urlRewrite.xml | 5 + .../vm/java/BackendController.java.vm | 153 + .../src/main/resources/vm/java/mapper.java.vm | 14 + .../src/main/resources/vm/java/model.java.vm | 33 + .../main/resources/vm/java/service.java.vm | 71 + .../resources/vm/java/serviceImpl.java.vm | 167 + .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 505 ++ .../src/main/resources/vm/vue/index.vue.vm | 602 ++ .../resources/vm/vue/v3/index-tree.vue.vm | 474 ++ .../src/main/resources/vm/vue/v3/index.vue.vm | 590 ++ .../src/main/resources/vm/xml/mapper.xml.vm | 5 + fuint-framework/pom.xml | 42 + .../fuint/framework/FrameworkConstants.java | 11 + .../annoation/OperationServiceLog.java | 16 + .../fuint/framework/dto/ExcelExportDto.java | 65 + .../exception/BusinessCheckException.java | 71 + .../exception/BusinessRuntimeException.java | 71 + .../exception/GlobalExceptionHandler.java | 106 + .../pagination/PaginationRequest.java | 97 + .../pagination/PaginationResponse.java | 167 + .../framework/service/ExportService.java | 21 + .../framework/service/ExportServiceImpl.java | 68 + .../fuint/framework/web/BaseController.java | 78 + .../fuint/framework/web/ResponseObject.java | 55 + fuint-repository/pom.xml | 30 + .../com/fuint/repository/base/MyMapper.java | 11 + .../com/fuint/repository/bean/ColumnBean.java | 28 + .../fuint/repository/bean/CouponNumBean.java | 26 + .../com/fuint/repository/bean/GoodsBean.java | 54 + .../fuint/repository/bean/GoodsTopBean.java | 52 + .../fuint/repository/bean/MemberTopBean.java | 50 + .../repository/bean/StoreDistanceBean.java | 26 + .../bean/UploadShippingLogBean.java | 38 + .../repository/mapper/MtAddressMapper.java | 15 + .../repository/mapper/MtArticleMapper.java | 15 + .../repository/mapper/MtBalanceMapper.java | 18 + .../repository/mapper/MtBannerMapper.java | 14 + .../repository/mapper/MtBookCateMapper.java | 14 + .../repository/mapper/MtBookItemMapper.java | 19 + .../fuint/repository/mapper/MtBookMapper.java | 14 + .../fuint/repository/mapper/MtCartMapper.java | 21 + .../mapper/MtCommissionCashMapper.java | 19 + .../mapper/MtCommissionLogMapper.java | 19 + .../mapper/MtCommissionRelationMapper.java | 17 + .../mapper/MtCommissionRuleItemMapper.java | 21 + .../mapper/MtCommissionRuleMapper.java | 14 + .../repository/mapper/MtConfirmLogMapper.java | 23 + .../mapper/MtCouponGoodsMapper.java | 19 + .../mapper/MtCouponGroupMapper.java | 14 + .../repository/mapper/MtCouponMapper.java | 21 + .../repository/mapper/MtGiveItemMapper.java | 14 + .../fuint/repository/mapper/MtGiveMapper.java | 20 + .../repository/mapper/MtGoodsCateMapper.java | 14 + .../repository/mapper/MtGoodsMapper.java | 35 + .../repository/mapper/MtGoodsSkuMapper.java | 19 + .../repository/mapper/MtGoodsSpecMapper.java | 19 + .../repository/mapper/MtInvoiceMapper.java | 20 + .../repository/mapper/MtMerchantMapper.java | 19 + .../repository/mapper/MtMessageMapper.java | 20 + .../mapper/MtOpenGiftItemMapper.java | 14 + .../repository/mapper/MtOpenGiftMapper.java | 14 + .../mapper/MtOrderAddressMapper.java | 19 + .../repository/mapper/MtOrderGoodsMapper.java | 14 + .../repository/mapper/MtOrderMapper.java | 46 + .../repository/mapper/MtPointMapper.java | 14 + .../repository/mapper/MtPrinterMapper.java | 14 + .../repository/mapper/MtRefundMapper.java | 21 + .../repository/mapper/MtRegionMapper.java | 14 + .../repository/mapper/MtSendLogMapper.java | 19 + .../repository/mapper/MtSettingMapper.java | 20 + .../repository/mapper/MtSettlementMapper.java | 14 + .../mapper/MtSettlementOrderMapper.java | 14 + .../mapper/MtSmsSendedLogMapper.java | 14 + .../mapper/MtSmsTemplateMapper.java | 14 + .../repository/mapper/MtStaffMapper.java | 22 + .../repository/mapper/MtStockItemMapper.java | 14 + .../repository/mapper/MtStockMapper.java | 14 + .../repository/mapper/MtStoreGoodsMapper.java | 17 + .../repository/mapper/MtStoreMapper.java | 30 + .../mapper/MtUploadShippingLogMapper.java | 19 + .../repository/mapper/MtUserActionMapper.java | 21 + .../repository/mapper/MtUserCouponMapper.java | 42 + .../repository/mapper/MtUserGradeMapper.java | 19 + .../repository/mapper/MtUserGroupMapper.java | 17 + .../fuint/repository/mapper/MtUserMapper.java | 48 + .../repository/mapper/MtVerifyCodeMapper.java | 22 + .../repository/mapper/TAccountDutyMapper.java | 20 + .../repository/mapper/TAccountMapper.java | 14 + .../repository/mapper/TActionLogMapper.java | 14 + .../fuint/repository/mapper/TDutyMapper.java | 23 + .../repository/mapper/TDutySourceMapper.java | 21 + .../repository/mapper/TGenCodeMapper.java | 21 + .../repository/mapper/TPlatformMapper.java | 14 + .../repository/mapper/TSourceMapper.java | 22 + .../com/fuint/repository/model/MtAddress.java | 62 + .../com/fuint/repository/model/MtArticle.java | 68 + .../com/fuint/repository/model/MtBalance.java | 63 + .../com/fuint/repository/model/MtBanner.java | 62 + .../com/fuint/repository/model/MtBook.java | 77 + .../fuint/repository/model/MtBookCate.java | 59 + .../fuint/repository/model/MtBookItem.java | 80 + .../com/fuint/repository/model/MtCart.java | 61 + .../repository/model/MtCommissionCash.java | 66 + .../repository/model/MtCommissionLog.java | 90 + .../model/MtCommissionRelation.java | 59 + .../repository/model/MtCommissionRule.java | 62 + .../model/MtCommissionRuleItem.java | 80 + .../fuint/repository/model/MtConfirmLog.java | 79 + .../com/fuint/repository/model/MtCoupon.java | 127 + .../fuint/repository/model/MtCouponGoods.java | 44 + .../fuint/repository/model/MtCouponGroup.java | 64 + .../com/fuint/repository/model/MtGive.java | 82 + .../fuint/repository/model/MtGiveItem.java | 44 + .../com/fuint/repository/model/MtGoods.java | 115 + .../fuint/repository/model/MtGoodsCate.java | 59 + .../fuint/repository/model/MtGoodsSku.java | 59 + .../fuint/repository/model/MtGoodsSpec.java | 41 + .../com/fuint/repository/model/MtInvoice.java | 93 + .../fuint/repository/model/MtMerchant.java | 81 + .../com/fuint/repository/model/MtMessage.java | 65 + .../fuint/repository/model/MtOpenGift.java | 58 + .../repository/model/MtOpenGiftItem.java | 42 + .../com/fuint/repository/model/MtOrder.java | 129 + .../repository/model/MtOrderAddress.java | 57 + .../fuint/repository/model/MtOrderGoods.java | 57 + .../com/fuint/repository/model/MtPoint.java | 59 + .../com/fuint/repository/model/MtPrinter.java | 59 + .../com/fuint/repository/model/MtRefund.java | 75 + .../com/fuint/repository/model/MtRegion.java | 41 + .../com/fuint/repository/model/MtSendLog.java | 81 + .../com/fuint/repository/model/MtSetting.java | 60 + .../fuint/repository/model/MtSettlement.java | 66 + .../repository/model/MtSettlementOrder.java | 50 + .../repository/model/MtSmsSendedLog.java | 51 + .../fuint/repository/model/MtSmsTemplate.java | 59 + .../com/fuint/repository/model/MtStaff.java | 65 + .../com/fuint/repository/model/MtStock.java | 53 + .../fuint/repository/model/MtStockItem.java | 53 + .../com/fuint/repository/model/MtStore.java | 114 + .../fuint/repository/model/MtStoreGoods.java | 50 + .../repository/model/MtUploadShippingLog.java | 56 + .../com/fuint/repository/model/MtUser.java | 118 + .../fuint/repository/model/MtUserAction.java | 58 + .../fuint/repository/model/MtUserCoupon.java | 87 + .../fuint/repository/model/MtUserGrade.java | 62 + .../fuint/repository/model/MtUserGroup.java | 54 + .../fuint/repository/model/MtVerifyCode.java | 48 + .../com/fuint/repository/model/TAccount.java | 70 + .../fuint/repository/model/TAccountDuty.java | 34 + .../fuint/repository/model/TActionLog.java | 62 + .../com/fuint/repository/model/TDuty.java | 42 + .../fuint/repository/model/TDutySource.java | 30 + .../com/fuint/repository/model/TGenCode.java | 65 + .../com/fuint/repository/model/TPlatform.java | 40 + .../com/fuint/repository/model/TSource.java | 69 + .../model/base/AutoIncrementIdModel.java | 18 + .../model/base/ElasticSearchModel.java | 26 + .../repository/model/base/OpsExercise.java | 38 + .../repository/model/base/RedisCache.java | 17 + .../main/resources/mapper/MtAddressMapper.xml | 7 + .../main/resources/mapper/MtArticleMapper.xml | 7 + .../main/resources/mapper/MtBalanceMapper.xml | 7 + .../main/resources/mapper/MtBannerMapper.xml | 5 + .../resources/mapper/MtBookItemMapper.xml | 14 + .../main/resources/mapper/MtCartMapper.xml | 15 + .../mapper/MtCommissionCashMapper.xml | 17 + .../mapper/MtCommissionLogMapper.xml | 17 + .../mapper/MtCommissionRelationMapper.xml | 9 + .../mapper/MtCommissionRuleItemMapper.xml | 23 + .../mapper/MtCommissionRuleMapper.xml | 4 + .../resources/mapper/MtConfirmLogMapper.xml | 22 + .../resources/mapper/MtCouponGoodsMapper.xml | 7 + .../resources/mapper/MtCouponGroupMapper.xml | 5 + .../main/resources/mapper/MtCouponMapper.xml | 11 + .../resources/mapper/MtGiveItemMapper.xml | 5 + .../main/resources/mapper/MtGiveMapper.xml | 7 + .../resources/mapper/MtGoodsCateMapper.xml | 5 + .../main/resources/mapper/MtGoodsMapper.xml | 100 + .../resources/mapper/MtGoodsSkuMapper.xml | 7 + .../resources/mapper/MtGoodsSpecMapper.xml | 7 + .../main/resources/mapper/MtInvoiceMapper.xml | 19 + .../resources/mapper/MtMerchantMapper.xml | 11 + .../main/resources/mapper/MtMessageMapper.xml | 10 + .../resources/mapper/MtOpenGiftItemMapper.xml | 5 + .../resources/mapper/MtOpenGiftMapper.xml | 5 + .../resources/mapper/MtOrderAddressMapper.xml | 7 + .../resources/mapper/MtOrderGoodsMapper.xml | 5 + .../main/resources/mapper/MtOrderMapper.xml | 74 + .../main/resources/mapper/MtPointMapper.xml | 5 + .../main/resources/mapper/MtPrinterMapper.xml | 5 + .../main/resources/mapper/MtRefundMapper.xml | 10 + .../main/resources/mapper/MtRegionMapper.xml | 5 + .../main/resources/mapper/MtSendLogMapper.xml | 11 + .../main/resources/mapper/MtSettingMapper.xml | 15 + .../resources/mapper/MtSettlementMapper.xml | 5 + .../mapper/MtSettlementOrderMapper.xml | 5 + .../resources/mapper/MtSmsSendedLogMapper.xml | 5 + .../resources/mapper/MtSmsTemplateMapper.xml | 5 + .../main/resources/mapper/MtStaffMapper.xml | 15 + .../resources/mapper/MtStoreGoodsMapper.xml | 7 + .../main/resources/mapper/MtStoreMapper.xml | 51 + .../mapper/MtUploadShippingLogMapper.xml | 17 + .../resources/mapper/MtUserActionMapper.xml | 14 + .../resources/mapper/MtUserCouponMapper.xml | 72 + .../resources/mapper/MtUserGradeMapper.xml | 13 + .../resources/mapper/MtUserGroupMapper.xml | 13 + .../main/resources/mapper/MtUserMapper.xml | 117 + .../resources/mapper/MtVerifyCodeMapper.xml | 11 + .../resources/mapper/TAccountDutyMapper.xml | 11 + .../main/resources/mapper/TAccountMapper.xml | 5 + .../resources/mapper/TActionLogMapper.xml | 5 + .../src/main/resources/mapper/TDutyMapper.xml | 33 + .../resources/mapper/TDutySourceMapper.xml | 12 + .../main/resources/mapper/TGenCodeMapper.xml | 12 + .../main/resources/mapper/TPlatformMapper.xml | 5 + .../main/resources/mapper/TSourceMapper.xml | 31 + fuint-utils/pom.xml | 70 + .../java/com/fuint/exception/Exceptions.java | 70 + .../main/java/com/fuint/text/CharsetKit.java | 87 + .../src/main/java/com/fuint/text/Convert.java | 1007 +++ .../java/com/fuint/text/StrFormatter.java | 93 + .../src/main/java/com/fuint/utils/AES.java | 99 + .../main/java/com/fuint/utils/ArrayUtil.java | 5546 ++++++++++++++ .../main/java/com/fuint/utils/Base64Util.java | 175 + .../java/com/fuint/utils/BeanToMapUtil.java | 83 + .../main/java/com/fuint/utils/ClassUtil.java | 1250 ++++ .../main/java/com/fuint/utils/CommonUtil.java | 28 + .../java/com/fuint/utils/ContextUtils.java | 42 + .../main/java/com/fuint/utils/Digests.java | 110 + .../main/java/com/fuint/utils/Encodes.java | 125 + .../java/com/fuint/utils/ExportExcelUtil.java | 363 + .../main/java/com/fuint/utils/HttpUtil.java | 147 + .../src/main/java/com/fuint/utils/IDCard.java | 416 ++ .../src/main/java/com/fuint/utils/IpUtil.java | 72 + .../main/java/com/fuint/utils/MD5Util.java | 41 + .../main/java/com/fuint/utils/ObjectUtil.java | 376 + .../java/com/fuint/utils/PropertiesUtil.java | 57 + .../main/java/com/fuint/utils/QRCodeUtil.java | 40 + .../main/java/com/fuint/utils/RSAKeys.java | 15 + .../main/java/com/fuint/utils/SeqUtil.java | 122 + .../main/java/com/fuint/utils/StringUtil.java | 4210 +++++++++++ .../main/java/com/fuint/utils/TimeUtils.java | 82 + .../java/com/fuint/utils/ValidationUtil.java | 138 + pom.xml | 186 + sbin/kill.sh | 8 + sbin/restart.sh | 8 + sbin/start.sh | 8 + sbin/stop.sh | 16 + sbin/yanhe.fuint | 132 + screenshots/cashier.png | Bin 0 -> 155908 bytes screenshots/coupon-list.png | Bin 0 -> 101590 bytes screenshots/create.png | Bin 0 -> 140340 bytes screenshots/f1.png | Bin 0 -> 208989 bytes screenshots/f2.png | Bin 0 -> 73989 bytes screenshots/f3.png | Bin 0 -> 61960 bytes screenshots/f4.png | Bin 0 -> 85410 bytes screenshots/g1.png | Bin 0 -> 326546 bytes screenshots/g2.png | Bin 0 -> 140613 bytes screenshots/g3.png | Bin 0 -> 157852 bytes screenshots/g4.png | Bin 0 -> 148102 bytes screenshots/g5.png | Bin 0 -> 183893 bytes screenshots/home.png | Bin 0 -> 99754 bytes screenshots/homeV1.png | Bin 0 -> 103847 bytes screenshots/homeV2.png | Bin 0 -> 91908 bytes screenshots/login.png | Bin 0 -> 264914 bytes screenshots/miniapp.png | Bin 0 -> 15523 bytes screenshots/mp.jpg | Bin 0 -> 27233 bytes screenshots/qr.png | Bin 0 -> 36251 bytes screenshots/system.png | Bin 0 -> 356500 bytes 805 files changed, 92805 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 configure/dev/application.properties create mode 100644 configure/prod/application.properties create mode 100644 db/fuint-db.sql create mode 100644 db/update_for_20250403.sql create mode 100644 db/update_for_20250422.sql create mode 100644 db/update_for_20250429.sql create mode 100644 db/update_for_20250514.sql create mode 100644 db/update_for_20250603.sql create mode 100644 db/update_for_20250925.sql create mode 100644 db/update_for_20251013.sql create mode 100644 db/update_for_20251020.sql create mode 100644 db/update_for_20251212.sql create mode 100644 db/update_for_20260109.sql create mode 100644 db/说明.txt create mode 100644 fuint-application/pom.xml create mode 100644 fuint-application/src/main/java/com/fuint/common/Constants.java create mode 100644 fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java create mode 100644 fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java create mode 100644 fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ContactBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/OrderKeyBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/PayerBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingInfo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingListBean.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/Message.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java create mode 100644 fuint-application/src/main/java/com/fuint/common/config/WebConfig.java create mode 100644 fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java create mode 100644 fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/Body.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/BookCateDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/BookDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/BookItemDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/BookTimeDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CommissionRelationDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/DateDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/DayDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/Head.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/MerchantDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/MerchantSettingDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/NavigationDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/Page.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/PointDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/StaffDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/StockGoodsDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/StoreInfo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/TimeDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/UserDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/ExpressCompanyEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/InvoiceStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/PrinterSettingEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/SmsSettingEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/ArticlePage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BalancePage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BannerPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BookCatePage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BookDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BookItemPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BookListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BookPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/BookableParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CartListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CommissionCashPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CommissionLogPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CommissionRelationPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CommissionRulePage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/ConfirmLogPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/GiveParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/GivePointParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/GoodsCatePage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/GoodsListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/InvoiceParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/MemberDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/MemberPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/OrderConfirmParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/PageParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/PrinterPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/PrinterParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/RefundDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/RefundListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/SendCouponParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/ShareListParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/StaffParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/StatisticParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/AccountService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/AddressService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/AlipayService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/ArticleService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/BalanceService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/BannerService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/BookCateService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/BookItemService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/BookService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CartService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CateService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CommissionRelationService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/CouponService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/DutyService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/GiveService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/GoodsService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/InvoiceService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/MemberService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/MerchantService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/MessageService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/OrderService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/PaymentService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/PointService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/PrinterService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/RefundService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/SendLogService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/SettingService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/SettlementService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/SourceService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/StaffService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/StockService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/StoreService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/UnionPayService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/UploadService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/UserActionService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/WeixinService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/BannerServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/BookCateServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/BookServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CaptchaServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CartServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CateServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CommissionCashServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CommissionLogServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRelationServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRuleServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/ConfirmLogServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CouponGroupServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/CouponServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/DutyServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/GenCodeServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/GiveServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/GoodsServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/InvoiceServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/MemberGroupServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/MemberServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/MerchantServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/MessageServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/OpenGiftServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/PaymentServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/PointServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/PrinterServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/RefundServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/SendLogServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/SendSmsServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/SettingServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/SettlementServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/SmsTemplateServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/SourceServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/StaffServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/StockServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/StoreServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/UnionPayServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/UploadServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/UserActionServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/UserCouponServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/UserGradeServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/VerifyCodeServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/WeixinServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/AliyunOssUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/AuthUserUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/Base64Util.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/BizCodeGenerator.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/CommonUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/DateUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/DtoConversionEntity.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/ExcelUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/GenUtils.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/HashSignUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/HtmlEncode.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/HttpClientUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/HttpPostUploadUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/KD100Util.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/ListUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/MD5Util.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/NoteFormatter.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/PhoneFormatCheckUtils.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/PrinterUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/QRCodeUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/QuartzCronUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/RedisLock.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/RedisUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/RegexUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/SeqUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/TimeUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/TimeUtils.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/TokenUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/TreeUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/VelocityInitializer.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/VelocityUtils.java create mode 100644 fuint-application/src/main/java/com/fuint/common/util/XlsUtil.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/MetaVo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/RouterVo.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/AddPrinterRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/AddPrinterRequestItem.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/DelPrinterRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/ObjectRestResponse.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/OrderStatisResult.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/OrderStatusType.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/PrintRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/PrinterRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/PrinterResult.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/PrinterStatusType.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/PrintersRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/QueryOrderStateRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/QueryOrderStatisRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/RestRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/SetVoiceTypeRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/UpdPrinterRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/vo/printer/VoiceRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/common/web/AdminUserInterceptor.java create mode 100644 fuint-application/src/main/java/com/fuint/common/web/CORSFilter.java create mode 100644 fuint-application/src/main/java/com/fuint/common/web/ClientUserInterceptor.java create mode 100644 fuint-application/src/main/java/com/fuint/common/web/CommandInterceptor.java create mode 100644 fuint-application/src/main/java/com/fuint/common/web/SpringContextHolder.java create mode 100644 fuint-application/src/main/java/com/fuint/common/web/SystemInit.java create mode 100644 fuint-application/src/main/java/com/fuint/fuintApplication.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendAccountController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendActionLogController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendArticleController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendBalanceController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendBannerController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendBookCateController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendBookController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendBookItemController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCaptchaController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCashierController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCateController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCommissionCashController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCommissionLogController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCommissionRelationController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCommissionRuleController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCommonController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendConfirmLogController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCouponController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendCouponGroupController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendDoConfirmController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendDutyController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendFileController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendGenCodeController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendGiveLogController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendGoodsController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendHomeController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendInvoiceController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendLoginController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendMemberController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendMemberGroupController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendMerchantController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendNavigateController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendOpenGiftController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendOrderController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendPointController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendPrinterController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRefundController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSendLogController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSettlementController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSmsController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSmsTemplateController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSourceController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendStaffController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendStatisticController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendStockController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendStoreController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSubMessageController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendUserCouponController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendUserGradeController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/AccountInfoRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/CommissionCashRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/CommissionLogRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/CommissionSettleConfirmRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/CommissionSettleRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/DutyStatusRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/LoginRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/MemberSubmitRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/MerchantSubmitRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/SettlementRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/request/StoreSubmitRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/response/LoginResponse.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientAddressController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientArticleController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBalanceController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBookController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientCaptchaController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientCartController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientCashierController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientConfirmController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientCouponController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientFileController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientGiveController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientGoodsController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientHelpController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientMessageController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientMyCouponController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientOrderController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientPageController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientPayController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientPointsController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRefundController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRegionController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSettlementController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientShareController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSignController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSmsController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientStoreController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSystemController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientUserController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientUserCouponController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/request/AddressRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/request/GoodsSearchRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/request/MemberInfoRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/request/MyCouponRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/request/RefundListRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/request/RefundSubmitRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantBalanceController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantBookController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantCouponController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantMemberController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantOrderController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantRefundController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantSettingController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantStaffController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/request/BookConfirmParam.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/request/BookDetailParam.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/request/BookListRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/request/MerchantSettingParam.java create mode 100644 fuint-application/src/main/java/com/fuint/module/merchantApi/request/StaffListRequest.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/CommissionJob.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/CouponExpireJob.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/MessageJob.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/OrderAutoJob.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/OrderCancelJob.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/UploadShippingInfoJob.java create mode 100644 fuint-application/src/main/resources/application.properties create mode 100644 fuint-application/src/main/resources/captcha-conf.properties create mode 100644 fuint-application/src/main/resources/ehcache.xml create mode 100644 fuint-application/src/main/resources/international/message_en_US.properties create mode 100644 fuint-application/src/main/resources/international/message_zh_CN.properties create mode 100644 fuint-application/src/main/resources/logback-spring.xml create mode 100644 fuint-application/src/main/resources/sentry.properties create mode 100644 fuint-application/src/main/resources/static/defaultImage/1.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/2.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/3.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/4.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/all.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/avatar.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/banner-1.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/banner-2.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/bg.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/card.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/coupon.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/hot.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/life.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/logo.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/love.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/none.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/office.png create mode 100644 fuint-application/src/main/resources/static/defaultImage/timer.png create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/31cbf7ad0ef442a4b10dcefc24db0662.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/4c90921a7fc34c97b0f62cebf314d2bb.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/6083071182cd48afa6c2b9e23f181832.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/6b67b70f35734ff28a03aa3d82ac96a0.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/856dbc96197e4782b4febb7a6e671bcb.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/9b64b3d65fa04296b62de186899f24ea.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/bfdd063cda3043688252ff49513e1fec.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/d39f84568b9746f89d9f6a368b8067c4.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/e641d7430df04c35a93a8238f5f6e312.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/ee5c67ed338442fc90e5c647ccbfd381.jpg create mode 100644 fuint-application/src/main/resources/static/uploadImages/20220110/ff4809f7a17d4142ace9bc287aab105a.jpg create mode 100644 fuint-application/src/main/resources/template/GoodsTemplate.xlsx create mode 100644 fuint-application/src/main/resources/template/MemberTemplate.xlsx create mode 100644 fuint-application/src/main/resources/urlRewrite.xml create mode 100644 fuint-application/src/main/resources/vm/java/BackendController.java.vm create mode 100644 fuint-application/src/main/resources/vm/java/mapper.java.vm create mode 100644 fuint-application/src/main/resources/vm/java/model.java.vm create mode 100644 fuint-application/src/main/resources/vm/java/service.java.vm create mode 100644 fuint-application/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 fuint-application/src/main/resources/vm/js/api.js.vm create mode 100644 fuint-application/src/main/resources/vm/sql/sql.vm create mode 100644 fuint-application/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 fuint-application/src/main/resources/vm/vue/index.vue.vm create mode 100644 fuint-application/src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 fuint-application/src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 fuint-application/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 fuint-framework/pom.xml create mode 100644 fuint-framework/src/main/java/com/fuint/framework/FrameworkConstants.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/annoation/OperationServiceLog.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/dto/ExcelExportDto.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/exception/BusinessCheckException.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/exception/BusinessRuntimeException.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/exception/GlobalExceptionHandler.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationRequest.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationResponse.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/service/ExportService.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/service/ExportServiceImpl.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/web/BaseController.java create mode 100644 fuint-framework/src/main/java/com/fuint/framework/web/ResponseObject.java create mode 100644 fuint-repository/pom.xml create mode 100644 fuint-repository/src/main/java/com/fuint/repository/base/MyMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/ColumnBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/CouponNumBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/GoodsBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/GoodsTopBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/MemberTopBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/StoreDistanceBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/bean/UploadShippingLogBean.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtAddressMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtArticleMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtBalanceMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtBannerMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookCateMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookItemMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCartMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionCashMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionLogMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRelationMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleItemMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtConfirmLogMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGoodsMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGroupMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveItemMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsCateMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSkuMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSpecMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtInvoiceMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtMerchantMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtMessageMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftItemMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderAddressMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderGoodsMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtPointMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtPrinterMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtRefundMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtRegionMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtSendLogMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettingMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementOrderMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsSendedLogMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsTemplateMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtStaffMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockItemMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreGoodsMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtUploadShippingLogMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserActionMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserCouponMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGradeMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGroupMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtVerifyCodeMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountDutyMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TActionLogMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TDutyMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TDutySourceMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TGenCodeMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TPlatformMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/TSourceMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtAddress.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtArticle.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtBalance.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtBanner.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtBook.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtBookCate.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtBookItem.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCart.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionCash.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionLog.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRelation.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRule.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRuleItem.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtConfirmLog.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCoupon.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGoods.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGroup.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGive.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGiveItem.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGoods.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsCate.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSku.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSpec.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtInvoice.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtMerchant.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtMessage.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGift.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGiftItem.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtOrder.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtOrderAddress.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtOrderGoods.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtPoint.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtPrinter.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtRefund.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtRegion.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtSendLog.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtSetting.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtSettlement.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtSettlementOrder.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtSmsSendedLog.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtSmsTemplate.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtStaff.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtStock.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtStockItem.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtStore.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtStoreGoods.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtUploadShippingLog.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtUser.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtUserAction.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtUserCoupon.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtUserGrade.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtUserGroup.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtVerifyCode.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TAccount.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TAccountDuty.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TActionLog.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TDuty.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TDutySource.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TGenCode.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TPlatform.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/TSource.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/base/AutoIncrementIdModel.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/base/ElasticSearchModel.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/base/OpsExercise.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/base/RedisCache.java create mode 100644 fuint-repository/src/main/resources/mapper/MtAddressMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtArticleMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtBalanceMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtBannerMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtBookItemMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCartMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCommissionCashMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCommissionLogMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCommissionRelationMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCommissionRuleItemMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCommissionRuleMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtConfirmLogMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCouponGoodsMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCouponGroupMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtCouponMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtGiveItemMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtGiveMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtGoodsCateMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtGoodsMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtGoodsSkuMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtGoodsSpecMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtInvoiceMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtMerchantMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtMessageMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtOpenGiftItemMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtOpenGiftMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtOrderAddressMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtOrderGoodsMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtOrderMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtPointMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtPrinterMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtRefundMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtRegionMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtSendLogMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtSettingMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtSettlementMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtSettlementOrderMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtSmsSendedLogMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtSmsTemplateMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtStaffMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtStoreGoodsMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtStoreMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtUploadShippingLogMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtUserActionMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtUserCouponMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtUserGradeMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtUserGroupMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtUserMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtVerifyCodeMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TAccountDutyMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TAccountMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TActionLogMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TDutyMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TDutySourceMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TGenCodeMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TPlatformMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/TSourceMapper.xml create mode 100644 fuint-utils/pom.xml create mode 100644 fuint-utils/src/main/java/com/fuint/exception/Exceptions.java create mode 100644 fuint-utils/src/main/java/com/fuint/text/CharsetKit.java create mode 100644 fuint-utils/src/main/java/com/fuint/text/Convert.java create mode 100644 fuint-utils/src/main/java/com/fuint/text/StrFormatter.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/AES.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/ArrayUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/Base64Util.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/BeanToMapUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/ClassUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/CommonUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/ContextUtils.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/Digests.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/Encodes.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/ExportExcelUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/HttpUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/IDCard.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/IpUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/MD5Util.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/ObjectUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/PropertiesUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/QRCodeUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/RSAKeys.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/SeqUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/StringUtil.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/TimeUtils.java create mode 100644 fuint-utils/src/main/java/com/fuint/utils/ValidationUtil.java create mode 100644 pom.xml create mode 100644 sbin/kill.sh create mode 100644 sbin/restart.sh create mode 100644 sbin/start.sh create mode 100644 sbin/stop.sh create mode 100644 sbin/yanhe.fuint create mode 100644 screenshots/cashier.png create mode 100644 screenshots/coupon-list.png create mode 100644 screenshots/create.png create mode 100644 screenshots/f1.png create mode 100644 screenshots/f2.png create mode 100644 screenshots/f3.png create mode 100644 screenshots/f4.png create mode 100644 screenshots/g1.png create mode 100644 screenshots/g2.png create mode 100644 screenshots/g3.png create mode 100644 screenshots/g4.png create mode 100644 screenshots/g5.png create mode 100644 screenshots/home.png create mode 100644 screenshots/homeV1.png create mode 100644 screenshots/homeV2.png create mode 100644 screenshots/login.png create mode 100644 screenshots/miniapp.png create mode 100644 screenshots/mp.jpg create mode 100644 screenshots/qr.png create mode 100644 screenshots/system.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dbbe355 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1207b79 --- /dev/null +++ b/README.md @@ -0,0 +1,125 @@ +# fuint会员营销系统介绍 + +#### 介绍 +fuint会员营销系统是一套开源的实体店铺会员管理和营销系统。系统基于前后端分离的架构,后端采用Java SpringBoot + Mysql,前端基于当前流行的UniappElement UI,支持小程序、h5。主要功能包含电子优惠券、储值卡、实体卡、集次卡(计次卡)、短信发送、储值卡、会员积分、会员等级权益体系,支付收款等会员日常营销工具。本系统适用于各类实体店铺,如零售超市、酒吧、酒店、汽车4S店、鲜花店、奶茶店、甜品店、餐饮店、农家乐等,是实体店铺会员营销必备的一款利器。 +以下是前台的页面展示: +

前台页面1

+

前台页面2

+

前台页面3

+

前台页面4

+

前台页面4

+ +fuint侧重于线下实体店的私域流量的运营,同时提供会员端小程序和收银系统的线上线下统一渠道,帮助商户降低获客成本。顾客通过扫码支付成为私域流量,支付即可成为会员。积分和卡券功能建立起会员等级体系,通过消息推送和短信营销方便触达用户。 +

1、会员运营自动化:商家通过日常活动设置,如开卡礼设置,沉睡唤醒等,成为会员后自动给顾客送优惠券,让顾客更有黏性,提升会员运营效率。

+

2、打通收银系统和会员营销的壁垒,代客下单收银,支付即成为会员。

+

3、会员体系完整化:积分兑换、积分转赠、会员等级权益、积分加速、买单折扣。

+

4、会员卡券齐全:储值卡、电子券、优惠券、集次卡、计次卡、实体卡购买并兑换、会员充值、余额支付。

+

5、线上代客下单收银系统,后台管理员可帮助临柜的会员下单、扫码支付。

+

6、支持手机短信、站内弹框消息、微信订阅消息:支持包括发货消息、卡券到期提醒、活动提醒、会员到期提醒、积分余额变动提醒等消息。

+

7、具有门店预约、到店支付等线上线下结合的o2o能力。

+

小程序前端仓库:https://gitee.com/fuint/fuint-uniapp

+扫码小程序演示:
+

小程序演示

+
+官网演示地址:
+

+ 1、官网:https://www.fuint.cn 点击 -> 系统演示,演示账号:fuint / 123456
+ 2、swagger接口文档:https://www.fuint.cn/fuint-application/swagger-ui.html +

+ +#### 软件架构 +后端:JAVA SpringBoot + MYSQL Mybatis Plus + Redis +前端:采用基于Vue的Uniapp、Element UI,前后端分离,支持微信小程序、h5等 +

后台截图:

+

登录界面

+

首页

+ +前端使用技术
+2.1 Vue2
+2.2 Uniapp
+2.3 Element UI +2.4 Nodejs 14或16版本 + +后端使用技术
+1.1 SpringBoot 2.5
+1.2 Mybatis Plus
+1.3 Maven
+1.4 SpringSecurity
+1.5 Druid
+1.6 Slf4j
+1.7 Fastjson
+1.8 JWT
+1.9 Redis
+1.10 Quartz
+1.11 Mysql 5.7或8版
+1.12 Swagger UI
+ + +#### 安装步骤 +软件环境版本:jdk 1.8、mysql 5.7或5.8、Redis任意版本 +1. 导入db目录下的fuint-db.sql数据库文件。 +2. 修改configure目录下的配置文件。 +3. 将工程导入Idea,并安装插件:Lombok Plugin。 +3. 使用maven执行install,打jar包(在fuint-application/target目录),把jar包上传并执行启动: + nohup java -Dfile.encoding=UTF-8 -Xmx2048m -Xms2048m -Xss256k -Xmn1024m -jar fuint-application-1.0.0.jar +

提示:无后端和linux基础的朋友,可以使用宝塔部署,非常方便简单。

+ + +#### 前台使用说明 + +1. 会员登录,登录成功后可看到会员的卡券列表。 +2. 卡券领取和购买,预存券的充值等。 +3. 核销卡券,会员在前台出示二维码,管理员用微信扫一扫即可核销。 +4. 卡券转赠,会员可将自己的卡券转赠给其他用户,输入对方的手机号即可完成转赠,获赠的好友会收到卡券赠送的短信。 + +

卡券创建界面

+

卡券创建界面

+ +#### 后台使用 +1. 会员管理:会员新增、导入、禁用等。 +2. 内容管理:焦点图管理、文章管理等。 +3. 卡券管理:电子券管理为2层结构,即电子券组和电子券。 +4. 会员积分:会员积分管理,会员积分的操作,会员积分明细查看。 +5. 转赠管理:卡券转赠记录。 +6. 短信管理:短信营销功能,已发送的短信列表。 +7. 系统配置:配置系统管理员权限等。 +8. 店铺管理:支持多店铺模式。 +9. 核销管理员:核销人员管理主要包含3个功能:核销人员列表、核销人员审核、核销人员信息编辑。 +10. 短信模板管理:可配置不同场景和业务的短信内容。 +11. 卡券发放:单独发放、批量发放,发放成功后给会员发送短信通知 +12. 操作日志主要针对电子券系统后台的一些关键操作进行日志记录,方便排查相关操作人的行为等问题。 +13. 发券记录主要根据发券的实际操作情况来记录,分为单用户发券和批量发券,同时可针对该次发券记录进行作废操作。 +14. 代客下单、收银功能,支持小票打印,包括本地打印和云打印(对接芯烨云打印服务)。 +

卡券营销:

+

卡券列表

+ +

收银代客下单功能:店员角色登录后台,从首页的“下单首页”菜单可进入代客收银下单界面,完成代客下单收银的流程。

+

收银界面

+

发起结算:

+

收银结算

+ +#### 开发计划 +1. 完善的报表统计; +2. 分享助力、分享领券、分享获得积分; +3. 员工提成、分销功能; +4. 更多营销工具,比如签到等。 + + +#### 允许使用范围: +1. 允许个人学习使用 +2. 允许用于毕业设计、论文参考代码 +3. 推荐Watch、Star项目,获取项目第一时间更新,同时也是对项目最好的支持 +4. 希望大家多多支持原创软件 +5. 请勿去除版权标签,要商用请购买源码授权(非常便宜),感谢理解! + +不足和待完善之处请谅解!源码仅供学习交流,更多功能欢迎进群咨询讨论,或需安装帮助请联系我们(麻烦先点star!!!!!!)。
+官方网站:https://www.fuint.cn
+开源不易,感谢支持!
+作者wx:fsq_better:
+

公众号二维码

+ + +特别鸣谢:
+Mybaits Plus: https://github.com/baomidou/mybatis-plus
+Vue: https://github.com/vuejs/vue
+Element UI: https://element.eleme.cn \ No newline at end of file diff --git a/configure/dev/application.properties b/configure/dev/application.properties new file mode 100644 index 0000000..2cb728f --- /dev/null +++ b/configure/dev/application.properties @@ -0,0 +1,115 @@ +# 数据库配置 +spring.datasource.url=jdbc:mysql://localhost:3306/fuint-db?useUnicode=true&characterEncoding=UTF8&useSSL=false +spring.datasource.username=root +spring.datasource.password=root + +# Redis配置 +spring.session.store-type=redis +spring.session.redis.namespace=fuint +# Redis数据库索引(默认为0) +spring.redis.database=0 +# Redis服务器地址(生产) +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +# 连接池最大连接数(使用负值表示没有限制) +spring.redis.pool.max-active=-1 +# 连接池最大阻塞等待时间(使用负值表示没有限制) +spring.redis.pool.max-wait=-1 +# 连接池中的最大空闲连接 +spring.redis.pool.max-idle=8 +# 连接池中的最小空闲连接 +spring.redis.pool.min-idle=0 +# 连接超时时间(毫秒) +spring.redis.timeout=0 + +# 系统名称 +system.name = fuint会员营销管理系统 + +# 前端h5地址 +website.url=https://www.fuint.cn/h5/ + +# 上传图片本地地址 +images.root=C:/fuintV3.0.1/fuintBackend/fuint-application/target/classes +images.path=/static/uploadImages/ + +# 上传图片服务器域名 +images.upload.url=http://localhost:8080 + +# 上传图片允许的大小(单位:MB) +images.upload.maxSize=5 + +################## 定时脚本配置 ######################### +# 定时发送消息 +message.job.switch = 1 +message.job.time = 0 0/1 * * * ? + +# 卡券到期处理 +couponExpire.job.switch = 1 +couponExpire.job.time = 0 0/1 * * * ? + +# 订单超时取消 +orderCancel.job.switch = 1 +orderCancel.job.time = 0 0/1 * * * ? + +# 分佣提成计算 +commission.job.switch = 1 +commission.job.time = 0 0/1 * * * ? + +# 微信小程序上传发货信息处理 +uploadShippingInfoJob.job.switch = 1 +uploadShippingInfoJob.job.time = 0 0/1 * * * ? + +################## 阿里云短信配置 ####################### +# 短信接口模式[0-关闭 1-打开] +aliyun.sms.mode = 0 +aliyun.sms.accessKeyId=LTAI4GJMjV123oXsrQJLnPZt +aliyun.sms.accessKeySecret=eGVBL30u5Ypj234d7XODlwYKWTaGT +# 阿里云短信签名 +aliyun.sms.signName=延禾技术 + +################## 阿里云OSS存储配置###################### +# 模式[0-关闭 1-打开] +aliyun.oss.mode = 0 +aliyun.oss.accessKeyId = LTAI4GJMjVhBa212rQJLnPZtt +aliyun.oss.accessKeySecret = eGVBL30u53456gXd7XODlwYKWTaGT +aliyun.oss.endpoint = https://oss-cn-shenzhen.aliyuncs.com +aliyun.oss.bucketName = fuint-application +# 上传文件夹 +aliyun.oss.folder = uploads +# 访问域名 +aliyun.oss.domain = https://fuint-application.oss-cn-shenzhen.aliyuncs.com + +################## 高德地图配置 ########################### +amap.key = 高德地图key + +################## 微信相关配置 ########################## +# 公众号配置 +weixin.official.appId=wxf4327ef05c27a0 +weixin.official.appSecret=1f55e8749332234d9a074873d8e6a3 + +# 小程序配置 +wxpay.appId = wxb6af3741234162bc +wxpay.appSecret = 76a538bfa5b55a4564d5f2be5540 +wxpay.mchId=1636980812 +wxpay.apiV2=34354320201030y323e432342343 +wxpay.certPath=/usr/local/fuint/cert/apiclient_cert.p12 +wxpay.domain=https://www.fuint.cn/fuint-application + +################## 支付宝支付相关配置 ###################### +alipay.appId = 应用编号 +alipay.privateKey = 应用私钥 +alipay.publicKey = 支付宝公钥(通过应用公钥上传到支付宝开放平台换取支付宝公钥) +alipay.serverUrl=https://openapi.alipay.com/gateway.do +alipay.domain=https://www.fuint.cn/fuint-application/clientApi/pay/aliPayCallback + +################ 微信订阅模板消息配置 ###################### +weixin.subMessage.orderCreated=[{'key':'time', 'name':'订单时间'},{'key':'orderSn', 'name':'订单号'},{'key':'remark', 'name':'备注信息'}] +weixin.subMessage.deliverGoods=[{'key':'receiver', 'name':'收货人'}, {'key':'orderSn', 'name':'订单号'}, {'key':'expressCompany', 'name':'快递公司'}, {'key':'expressNo', 'name':'快递单号'}] +weixin.subMessage.couponExpire=[{'key':'name', 'name':'卡券名称'}, {'key':'expireTime', 'name':'到期时间'},{'key':'tips', 'name':'温馨提示'}] +weixin.subMessage.couponArrival=[{'key':'name', 'name':'卡券名称'},{'key':'amount', 'name':'金额'},{'key':'tips', 'name':'温馨提示'}] +weixin.subMessage.balanceChange=[{'key':'amount', 'name':'变动金额'},{'key':'time', 'name':'变动时间'},{'key':'tips', 'name':'温馨提示'}] +weixin.subMessage.couponConfirm=[{'key':'name', 'name':'卡券名称'},{'key':'time', 'name':'核销时间'}] +weixin.subMessage.pointChange=[{'key':'amount', 'name':'变动数量'},{'key':'time', 'name':'变动时间'},{'key':'remark', 'name':'备注信息'}] diff --git a/configure/prod/application.properties b/configure/prod/application.properties new file mode 100644 index 0000000..46506f4 --- /dev/null +++ b/configure/prod/application.properties @@ -0,0 +1,115 @@ +# 数据库配置 +spring.datasource.url=jdbc:mysql://localhost:3306/fuint-db?useUnicode=true&characterEncoding=UTF8&useSSL=false +spring.datasource.username=root +spring.datasource.password=root + +# Redis配置 +spring.session.store-type=redis +spring.session.redis.namespace=fuint +# Redis数据库索引(默认为0) +spring.redis.database=0 +# Redis服务器地址(生产) +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +# 连接池最大连接数(使用负值表示没有限制) +spring.redis.pool.max-active=-1 +# 连接池最大阻塞等待时间(使用负值表示没有限制) +spring.redis.pool.max-wait=-1 +# 连接池中的最大空闲连接 +spring.redis.pool.max-idle=8 +# 连接池中的最小空闲连接 +spring.redis.pool.min-idle=0 +# 连接超时时间(毫秒) +spring.redis.timeout=0 + +# 系统名称 +system.name = fuint会员营销管理系统 + +# 前端h5地址 +website.url=https://www.fuint.cn/h5/ + +# 上传图片本地地址 +images.root=/www/wwwroot/www.xxx.com +images.path=/static/uploadImages/ + +# 上传图片服务器域名 +images.upload.url=http://localhost:8080 + +# 上传图片允许的大小(单位:MB) +images.upload.maxSize=5 + +################## 定时脚本配置 ######################### +# 定时发送消息 +message.job.switch = 1 +message.job.time = 0 0/1 * * * ? + +# 卡券到期处理 +couponExpire.job.switch = 1 +couponExpire.job.time = 0 0/1 * * * ? + +# 订单超时取消 +orderCancel.job.switch = 1 +orderCancel.job.time = 0 0/1 * * * ? + +# 分佣提成计算 +commission.job.switch = 1 +commission.job.time = 0 0/1 * * * ? + +# 微信小程序上传发货信息处理 +uploadShippingInfoJob.job.switch = 1 +uploadShippingInfoJob.job.time = 0 0/1 * * * ? + +################## 阿里云短信配置 ####################### +# 短信接口模式[0-关闭 1-打开] +aliyun.sms.mode = 0 +aliyun.sms.accessKeyId=LTAI4GJMjV123oXsrQJLnPZt +aliyun.sms.accessKeySecret=eGVBL30u5Ypj234d7XODlwYKWTaGT +# 阿里云短信签名 +aliyun.sms.signName=延禾技术 + +################## 阿里云OSS存储配置###################### +# 模式[0-关闭 1-打开] +aliyun.oss.mode = 0 +aliyun.oss.accessKeyId = LTAI4GJMjVhBa212rQJLnPZt +aliyun.oss.accessKeySecret = eGVBL30u53456gXd7XODlwYKWTaGT +aliyun.oss.endpoint = https://oss-cn-shenzhen.aliyuncs.com +aliyun.oss.bucketName = fuint-application +# 上传文件夹 +aliyun.oss.folder = uploads +# 访问域名 +aliyun.oss.domain = https://fuint-application.oss-cn-shenzhen.aliyuncs.com + +################## 高德地图配置 ########################### +amap.key = 高德地图key + +################## 微信相关配置 ########################### +# 公众号配置 +weixin.official.appId=wxf4327ef05c27a0 +weixin.official.appSecret=1f55e8749332234d9a074873d8e6a3 + +# 小程序配置 +wxpay.appId = wxb6af3741234162bc +wxpay.appSecret = 76a538bfa5b55a4564d5f2be5540 +wxpay.mchId=1636980812 +wxpay.apiV2=34354320201030y323e432342343 +wxpay.certPath=/usr/local/fuint/cert/apiclient_cert.p12 +wxpay.domain=https://www.fuint.cn/fuint-application + +################## 支付宝支付相关配置 ###################### +alipay.appId = 应用编号 +alipay.privateKey = 应用私钥 +alipay.publicKey = 支付宝公钥(通过应用公钥上传到支付宝开放平台换取支付宝公钥) +alipay.serverUrl=https://openapi.alipay.com/gateway.do +alipay.domain=https://www.fuint.cn/fuint-application/clientApi/pay/aliPayCallback + +################ 微信订阅模板消息配置 ###################### +weixin.subMessage.orderCreated=[{'key':'time', 'name':'订单时间'},{'key':'orderSn', 'name':'订单号'},{'key':'remark', 'name':'备注信息'}] +weixin.subMessage.deliverGoods=[{'key':'receiver', 'name':'收货人'}, {'key':'orderSn', 'name':'订单号'}, {'key':'expressCompany', 'name':'快递公司'}, {'key':'expressNo', 'name':'快递单号'}] +weixin.subMessage.couponExpire=[{'key':'name', 'name':'卡券名称'}, {'key':'expireTime', 'name':'到期时间'},{'key':'tips', 'name':'温馨提示'}] +weixin.subMessage.couponArrival=[{'key':'name', 'name':'卡券名称'},{'key':'amount', 'name':'金额'},{'key':'tips', 'name':'温馨提示'}] +weixin.subMessage.balanceChange=[{'key':'amount', 'name':'变动金额'},{'key':'time', 'name':'变动时间'},{'key':'tips', 'name':'温馨提示'}] +weixin.subMessage.couponConfirm=[{'key':'name', 'name':'卡券名称'},{'key':'time', 'name':'核销时间'}] +weixin.subMessage.pointChange=[{'key':'amount', 'name':'变动数量'},{'key':'time', 'name':'变动时间'},{'key':'remark', 'name':'备注信息'}] diff --git a/db/fuint-db.sql b/db/fuint-db.sql new file mode 100644 index 0000000..0855c47 --- /dev/null +++ b/db/fuint-db.sql @@ -0,0 +1,6571 @@ +/*Table structure for table `mt_address` */ + +DROP TABLE IF EXISTS `mt_address`; + +CREATE TABLE `mt_address` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID', + `NAME` varchar(30) NOT NULL DEFAULT '' COMMENT '收货人姓名', + `MOBILE` varchar(20) DEFAULT '' COMMENT '收货手机号', + `PROVINCE_ID` int unsigned DEFAULT '0' COMMENT '省份ID', + `CITY_ID` int unsigned DEFAULT '0' COMMENT '城市ID', + `REGION_ID` int DEFAULT '0' COMMENT '区/县ID', + `DETAIL` varchar(255) DEFAULT '' COMMENT '详细地址', + `IS_DEFAULT` char(1) DEFAULT 'N' COMMENT '是否默认', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员地址表'; + +/*Data for the table `mt_address` */ + +/*Table structure for table `mt_article` */ + +DROP TABLE IF EXISTS `mt_article`; + +CREATE TABLE `mt_article` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '目录ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `TITLE` varchar(100) DEFAULT '' COMMENT '标题', + `BRIEF` varchar(500) DEFAULT '' COMMENT '简介', + `URL` varchar(100) DEFAULT '' COMMENT '链接地址', + `IMAGE` varchar(200) DEFAULT '' COMMENT '图片地址', + `DESCRIPTION` text COMMENT '描述', + `CLICK` int DEFAULT '0' COMMENT '点击次数', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `SORT` int DEFAULT '0' COMMENT '排序', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;N:禁用;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8 COMMENT='文章表'; + +/*Data for the table `mt_article` */ + +insert into `mt_article`(`ID`,`STORE_ID`,`MERCHANT_ID`,`TITLE`,`BRIEF`,`URL`,`IMAGE`,`DESCRIPTION`,`CLICK`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values +(3,7,1,'“美食荒漠”? 温州:不存在的!','吃妈妈做的菜?或者足不出户,优哉游哉?不管在哪,假期的意义,绝对少不了一个“吃”。周刊君特别推出“五一就要吃”评论系列,小伙伴们会来讲讲,他们各自心心念念的家乡美食。也欢迎大家留言参与,看看哪个更馋人。','','/static/defaultImage/banner-2.png?v=1','

oi五一假期终于来了,你在哪?是去看人山人海,搞“特种兵式的旅行”,还是回老家,吃妈妈做的菜?或者足不出户,优哉游哉?不管在哪,假期的意义,绝对少不了一个“吃”。周刊君特别推出“五一就要吃”评论系列,小伙伴们会来讲讲,他们各自心心念念的家乡美食。也欢迎大家留言参与,看看哪个更馋人。  我的家乡,是一座山城相拥、海陆交融的山水之城。


  诗画山水,温润之州,是为温州。


  这里有“欲写龙湫难下笔,不游雁荡是虚生”中国东南第一山雁荡山,有山水诗的发祥地楠溪江,有山与海的尽头、东海明珠南麂岛,更有“走遍千山万水、想尽千方百计、说尽千言万语、吃尽千辛万苦”的温州精神。


  温州古为瓯越大地,也称东瓯,故这里的食物被称为“瓯菜”。


  这里山川湖海汇聚,美食自然丰富多样。山里的、海里的、湖里的、江里的、溪里的,各有各的滋味,所谓一方水土一方美食,无外乎如此。


  很多人对温州美食的初印象,来自电视剧《温州一家人》,这部由李立群、殷桃、张译主演的热播剧,讲述了温州一个普通家庭的草根创业奋斗史。



  在这部剧中,温州的美食伴随着市井烟火气,令人垂涎欲滴。但现实却是,或许是温州人对于这些美食太过习以为常,又或许是温州于经商一途上声名太响,让人潜意识里忽略了这里的吃食,误以为是“美食荒漠”,并不为太多人所熟知,以至于忽略了这里蕴藏着一座城的美食。


  至少来温州旅游的人,很少是冲着美食来的。

',105,'2023-05-12 09:12:16','2023-06-20 17:14:24','fuint',0,'A'), +(5,1,1,'又到一年最佳赏樱季','又到一年最佳赏樱季,一直想去亲眼目睹一次被誉为“世界三大赏樱胜地”之一 的无锡鼋头渚,正值无锡太湖鼋头渚国际樱花节 ,3万多株、100多个品种的樱花树,着实让人期待。','','/static/defaultImage/banner-1.png?v=1','

又到一年最佳赏樱季,一直想去亲眼目睹一次被誉为“世界三大赏樱胜地”之一 的无锡鼋头渚,正值无锡太湖鼋头渚国际樱花节 ,3万多株、100多个品种的樱花树,着实让人期待。

无锡太湖鼋头渚国际樱花节将从3月1日持续至5月3日,这期间来可以看到早樱、中樱、晚樱等各品种的樱花独揽芳华,晨赏、日赏、暮赏、夜赏,能看到千姿百态的樱花。


走在鼋头渚的小道上,空气里都是芬芳的樱花味道,漫山遍野的樱花,粉白、玫红、粉红色……不同的颜色交叠,层次感丰富,浪漫迷人~


我喜欢这里樱花盛开的时候,建筑的设计和樱花的飘落,虽然去的那天是阴天,但是却也别有一番诗情画意,小桥流水,樱花古韵,水波带着花影泛起阵阵涟漪,随手一拍就会有一种中式浪漫的感觉,沉醉在江南意境中,尤其穿上汉服拍照,绝美!

',88,'2023-05-12 18:29:01','2023-07-05 15:05:37','fuint',1,'A'); + +/*Table structure for table `mt_balance` */ + +DROP TABLE IF EXISTS `mt_balance`; + +CREATE TABLE `mt_balance` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `MOBILE` varchar(11) DEFAULT '' COMMENT '手机号', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID', + `ORDER_SN` varchar(32) DEFAULT '' COMMENT '订单号', + `AMOUNT` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额变化数量', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `DESCRIPTION` varchar(200) DEFAULT '' COMMENT '备注说明', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A正常;D作废', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='余额变化表'; + +/*Data for the table `mt_balance` */ + +insert into `mt_balance`(`ID`,`MERCHANT_ID`,`STORE_ID`,`MOBILE`,`USER_ID`,`ORDER_SN`,`AMOUNT`,`CREATE_TIME`,`UPDATE_TIME`,`DESCRIPTION`,`OPERATOR`,`STATUS`) values +(1,1,0,'18976679980',163,'202309082201183531567',-72.08,'2023-09-08 22:01:18','2023-09-08 22:01:18','','','A'), +(2,1,0,'18976679980',163,'202309082204254176805',-72.08,'2023-09-08 22:04:25','2023-09-08 22:04:25','','','A'), +(4,0,3,'18976679980',163,'202309201800308947963',-4.04,'2023-09-20 18:00:31','2023-09-20 18:00:31','','','A'), +(5,0,3,'18976679980',163,'202309210835395956418',-80.00,'2023-09-21 08:35:40','2023-09-21 08:35:40','','','A'); + +/*Table structure for table `mt_banner` */ + +DROP TABLE IF EXISTS `mt_banner`; + +CREATE TABLE `mt_banner` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `TITLE` varchar(100) DEFAULT '' COMMENT '标题', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `URL` varchar(100) DEFAULT '' COMMENT '链接地址', + `IMAGE` varchar(200) DEFAULT '' COMMENT '图片地址', + `DESCRIPTION` text COMMENT '描述', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `SORT` int DEFAULT '0' COMMENT '排序', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=215 DEFAULT CHARSET=utf8 COMMENT='会员端焦点图表'; + +/*Data for the table `mt_banner` */ + +insert into `mt_banner`(`ID`,`TITLE`,`MERCHANT_ID`,`STORE_ID`,`URL`,`IMAGE`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values +(1,'活动',1,0,'pages/user/index','/static/defaultImage/banner-2.png?v=1','','2021-04-14 09:38:20','2023-08-01 07:52:08','fuint',1,'A'), +(2,'活动',2,0,'pages/category/index','/static/defaultImage/banner-1.png?v=1','','2021-04-14 09:38:36','2023-07-25 17:37:40','fuint',1,'A'); + +/*Table structure for table `mt_book` */ + +DROP TABLE IF EXISTS `mt_book`; + +CREATE TABLE `mt_book` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `NAME` varchar(255) DEFAULT NULL COMMENT '预约名称', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `TYPE` varchar(30) DEFAULT 'time' COMMENT '预约方式,time:按时间预约;staff:按员工预约', + `LOGO` varchar(255) DEFAULT '' COMMENT 'LOGO图片', + `GOODS_ID` int DEFAULT '0' COMMENT '预约服务ID', + `CATE_ID` int DEFAULT '0' COMMENT '预约分类', + `SERVICE_DATES` varchar(1000) DEFAULT '' COMMENT '可预约日期', + `SERVICE_TIMES` varchar(1000) DEFAULT '' COMMENT '可预约时间段', + `SERVICE_STAFF_IDS` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '可预约员工ID', + `DESCRIPTION` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '预约说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `SORT` int DEFAULT '0' COMMENT '排序', + `STATUS` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'A' COMMENT '订单状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='预约表'; + +/*Data for the table `mt_book` */ + +insert into `mt_book`(`ID`,`NAME`,`MERCHANT_ID`,`STORE_ID`,`TYPE`,`LOGO`,`GOODS_ID`,`CATE_ID`,`SERVICE_DATES`,`SERVICE_TIMES`,`SERVICE_STAFF_IDS`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values +(1,'门店大保养预约',1,2,'time','/static/defaultImage/banner-2.png?v=1',1,1,'2024-08-21,2024-08-22,2024-08-23,2024-08-24,2024-08-31,2024-08-30,2024-08-29','08:30-12:00-2,14:00-18:00-3','1,2,3','小保养预约,请提前预约。线上预约提交后,店员审核,审核结果将以短信通知您,给您带来不便敬请谅解,感谢您的支持!','2023-02-14 11:45:54','2024-08-16 18:01:50','fuint',3,'A'), +(2,'门店小保养预约',1,0,'time','/static/defaultImage/banner-1.png?v=1',0,2,'2024-08-14,2024-08-15,2024-08-16','08:30-12:00-3,14:00-18:00-4','','小保养预约,请提前预约。线上预约提交后,店员审核,审核结果将以短信通知您,给您带来不便敬请谅解,感谢您的支持!','2024-08-05 18:58:45','2024-08-16 18:01:42','fuint',2,'A'); + +/*Table structure for table `mt_book_cate` */ + +DROP TABLE IF EXISTS `mt_book_cate`; + +CREATE TABLE `mt_book_cate` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int NOT NULL COMMENT '所属商户', + `STORE_ID` int DEFAULT NULL COMMENT '所属店铺', + `NAME` varchar(50) NOT NULL COMMENT '分类名称', + `LOGO` varchar(255) DEFAULT NULL COMMENT '封面图片', + `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `SORT` int DEFAULT NULL COMMENT '排序', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `STATUS` char(1) DEFAULT NULL COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='预约分类'; + +/*Data for the table `mt_book_cate` */ + +insert into `mt_book_cate`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`LOGO`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`SORT`,`OPERATOR`,`STATUS`) values +(1,1,0,'测试001','/static/defaultImage/banner-2.png?v=1','11211111','2024-08-05 14:36:16','2024-08-14 09:52:29',2,'fuint','A'), +(2,1,0,'测试002','/static/defaultImage/banner-2.png?v=1','223112','2024-08-05 15:57:39','2024-08-13 18:55:32',1,'fuint','A'); + +/*Table structure for table `mt_book_item` */ + +DROP TABLE IF EXISTS `mt_book_item`; + +CREATE TABLE `mt_book_item` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `CATE_ID` int DEFAULT '0' COMMENT '预约分类ID', + `BOOK_ID` int DEFAULT '0' COMMENT '预约ID', + `USER_ID` int DEFAULT '0' COMMENT '预约用户ID', + `GOODS_ID` int DEFAULT '0' COMMENT '预约服务ID', + `VERIFY_CODE` varchar(10) DEFAULT '' COMMENT '核销码', + `CONTACT` varchar(30) DEFAULT NULL COMMENT '预约联系人', + `MOBILE` varchar(30) DEFAULT NULL COMMENT '预约手机号', + `SERVICE_DATE` varchar(100) DEFAULT NULL COMMENT '预约日期', + `SERVICE_TIME` varchar(100) DEFAULT NULL COMMENT '预约时间段', + `SERVICE_STAFF_ID` int DEFAULT NULL COMMENT '预约员工ID', + `REMARK` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '预约说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='预约详情表'; + +/*Data for the table `mt_book_item` */ + +/*Table structure for table `mt_cart` */ + +DROP TABLE IF EXISTS `mt_cart`; + +CREATE TABLE `mt_cart` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '会员ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `IS_VISITOR` char(1) DEFAULT 'N' COMMENT '是否游客', + `HANG_NO` varchar(10) DEFAULT '' COMMENT '挂单号', + `SKU_ID` int DEFAULT '0' COMMENT 'skuID', + `GOODS_ID` int DEFAULT '0' COMMENT '商品ID', + `NUM` double(10,2) DEFAULT '1.00' COMMENT '数量', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='购物车'; + +/*Data for the table `mt_cart` */ + +/*Table structure for table `mt_commission_cash` */ + +DROP TABLE IF EXISTS `mt_commission_cash`; + +CREATE TABLE `mt_commission_cash` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `SETTLE_NO` varchar(32) DEFAULT NULL COMMENT '结算单号', + `UUID` varchar(32) DEFAULT NULL COMMENT '结算UUID', + `MERCHANT_ID` int NOT NULL COMMENT '商户ID', + `STORE_ID` int DEFAULT NULL COMMENT '店铺ID', + `USER_ID` int DEFAULT NULL COMMENT '会员ID', + `STAFF_ID` int DEFAULT NULL COMMENT '员工ID', + `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '金额', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '备注信息', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:待确认,B:已确认,C:已支付,D:已作废', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分佣提现记录表'; + +/*Data for the table `mt_commission_cash` */ + +/*Table structure for table `mt_commission_log` */ + +DROP TABLE IF EXISTS `mt_commission_log`; + +CREATE TABLE `mt_commission_log` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int NOT NULL COMMENT '商户ID', + `TARGET` varchar(30) DEFAULT '' COMMENT '对象,member:会员分销;staff:员工提成', + `TYPE` varchar(30) NOT NULL COMMENT '分佣类型', + `LEVEL` int DEFAULT '1' COMMENT '分销等级', + `USER_ID` int DEFAULT NULL COMMENT '会员ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `STAFF_ID` int DEFAULT '0' COMMENT '员工ID', + `ORDER_ID` int DEFAULT '0' COMMENT '订单ID', + `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '分佣金额', + `RULE_ID` int DEFAULT NULL COMMENT '分佣规则ID', + `RULE_ITEM_ID` int DEFAULT NULL COMMENT '分佣规则项ID', + `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '备注信息', + `SETTLE_UUID` varchar(32) DEFAULT NULL COMMENT '结算uuid', + `CASH_ID` int DEFAULT NULL COMMENT '提现记录ID', + `IS_CASH` char(1) DEFAULT 'N' COMMENT '是否提现,Y:是;N:否', + `CASH_TIME` datetime DEFAULT NULL COMMENT '提现时间', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:待结算;B:已结算;C:已作废', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='佣金记录表'; + +/*Data for the table `mt_commission_log` */ + +/*Table structure for table `mt_commission_relation` */ + +DROP TABLE IF EXISTS `mt_commission_relation`; + +CREATE TABLE `mt_commission_relation` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int NOT NULL COMMENT '商户ID', + `USER_ID` int DEFAULT NULL COMMENT '邀请会员ID', + `LEVEL` int DEFAULT '1' COMMENT '等级', + `INVITE_CODE` varchar(32) DEFAULT '' COMMENT '邀请码', + `SUB_USER_ID` int DEFAULT NULL COMMENT '被邀请会员ID', + `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;D:删除', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员分销关系表'; + +/*Data for the table `mt_commission_relation` */ + +/*Table structure for table `mt_commission_rule` */ + +DROP TABLE IF EXISTS `mt_commission_rule`; + +CREATE TABLE `mt_commission_rule` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `NAME` varchar(100) DEFAULT '' COMMENT '规则名称', + `TYPE` varchar(30) DEFAULT NULL COMMENT '方案类型', + `TARGET` varchar(30) DEFAULT '' COMMENT '方案对象,member:会员分销;staff:员工提成', + `MERCHANT_ID` int NOT NULL COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `STORE_IDS` varchar(500) DEFAULT '' COMMENT '适用店铺', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `DESCRIPTION` varchar(1000) DEFAULT NULL COMMENT '备注信息', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='方案规则表'; + +/*Data for the table `mt_commission_rule` */ + +/*Table structure for table `mt_commission_rule_item` */ + +DROP TABLE IF EXISTS `mt_commission_rule_item`; + +CREATE TABLE `mt_commission_rule_item` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `TYPE` varchar(30) DEFAULT NULL COMMENT '分佣类型', + `RULE_ID` int NOT NULL DEFAULT '0' COMMENT '规则ID', + `MERCHANT_ID` int NOT NULL COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '适用店铺', + `TARGET` varchar(30) DEFAULT NULL COMMENT '分佣对象', + `TARGET_ID` int NOT NULL DEFAULT '0' COMMENT '对象ID', + `METHOD` varchar(30) DEFAULT NULL COMMENT '提成方式(按比例/固定金额)', + `STORE_IDS` varchar(500) DEFAULT '' COMMENT '适用店铺', + `GUEST` decimal(10,2) DEFAULT NULL COMMENT '散客佣金', + `SUB_GUEST` decimal(10,2) DEFAULT NULL COMMENT '二级散客佣金', + `MEMBER` decimal(10,2) DEFAULT NULL COMMENT '会员佣金', + `SUB_MEMBER` decimal(10,2) DEFAULT NULL COMMENT '二级会员佣金', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分佣提成规则项目表'; + +/*Data for the table `mt_commission_rule_item` */ + +/*Table structure for table `mt_confirm_log` */ + +DROP TABLE IF EXISTS `mt_confirm_log`; + +CREATE TABLE `mt_confirm_log` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `CODE` varchar(32) NOT NULL DEFAULT '' COMMENT '编码', + `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '核销金额', + `COUPON_ID` int DEFAULT '0' COMMENT '卡券ID', + `USER_COUPON_ID` int NOT NULL DEFAULT '0' COMMENT '用户券ID', + `ORDER_ID` int DEFAULT '0' COMMENT '订单ID', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '卡券所属用户ID', + `OPERATOR_USER_ID` int DEFAULT NULL COMMENT '核销者用户ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '核销店铺ID', + `STATUS` varchar(1) NOT NULL COMMENT '状态,A正常核销;D:撤销使用', + `CANCEL_TIME` datetime DEFAULT NULL COMMENT '撤销时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `OPERATOR_FROM` varchar(30) DEFAULT 'mt_user' COMMENT '操作来源user_id对应表t_account 还是 mt_user', + `REMARK` varchar(500) DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='核销记录表'; + +/*Data for the table `mt_confirm_log` */ + +/*Table structure for table `mt_coupon` */ + +DROP TABLE IF EXISTS `mt_coupon`; + +CREATE TABLE `mt_coupon` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `GROUP_ID` int NOT NULL DEFAULT '0' COMMENT '券组ID', + `TYPE` char(1) DEFAULT 'C' COMMENT '券类型,C优惠券;P预存卡;T集次卡', + `CONTENT` int DEFAULT '1' COMMENT '内容,如:1表示满减券、2表示折扣券', + `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '券名称', + `IS_GIVE` tinyint(1) DEFAULT '0' COMMENT '是否允许转赠', + `GRADE_IDS` varchar(100) DEFAULT '' COMMENT '适用会员等级', + `POINT` int DEFAULT '0' COMMENT '获得卡券所消耗积分', + `APPLY_GOODS` varchar(20) DEFAULT '' COMMENT '适用商品:allGoods、parkGoods', + `RECEIVE_CODE` varchar(32) DEFAULT '' COMMENT '领取码', + `USE_FOR` varchar(30) DEFAULT '' COMMENT '使用专项', + `EXPIRE_TYPE` varchar(30) DEFAULT '' COMMENT '过期类型', + `EXPIRE_TIME` int DEFAULT '0' COMMENT '有效期,单位:天', + `BEGIN_TIME` datetime DEFAULT NULL COMMENT '开始有效期', + `END_TIME` datetime DEFAULT NULL COMMENT '结束有效期', + `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '面额', + `SEND_WAY` varchar(20) DEFAULT 'backend' COMMENT '发放方式', + `SEND_NUM` int unsigned DEFAULT '1' COMMENT '每次发放数量', + `TOTAL` int DEFAULT '0' COMMENT '发行数量', + `LIMIT_NUM` int DEFAULT '1' COMMENT '每人拥有数量限制', + `EXCEPT_TIME` varchar(500) DEFAULT '' COMMENT '不可用日期,逗号隔开。周末:weekend;其他:2019-01-02_2019-02-09', + `STORE_IDS` varchar(100) DEFAULT '' COMMENT '所属店铺ID,逗号隔开', + `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '描述信息', + `IMAGE` varchar(100) DEFAULT '' COMMENT '效果图片', + `REMARKS` varchar(1000) DEFAULT '' COMMENT '后台备注', + `IN_RULE` varchar(1000) DEFAULT '' COMMENT '获取券的规则', + `OUT_RULE` varchar(1000) DEFAULT '' COMMENT '核销券的规则', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='卡券信息表'; + +/*Data for the table `mt_coupon` */ + +/*Table structure for table `mt_coupon_goods` */ + +DROP TABLE IF EXISTS `mt_coupon_goods`; + +CREATE TABLE `mt_coupon_goods` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `COUPON_ID` int NOT NULL COMMENT '卡券ID', + `GOODS_ID` int NOT NULL COMMENT '商品ID', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='卡券商品表'; + +/*Data for the table `mt_coupon_goods` */ + +/*Table structure for table `mt_coupon_group` */ + +DROP TABLE IF EXISTS `mt_coupon_group`; + +CREATE TABLE `mt_coupon_group` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '券组名称', + `MONEY` decimal(18,2) DEFAULT '0.00' COMMENT '价值金额', + `NUM` int DEFAULT '0' COMMENT '券种类数量', + `TOTAL` int DEFAULT '0' COMMENT '发行数量', + `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建日期', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新日期', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='优惠券组'; + +/*Data for the table `mt_coupon_group` */ + +/*Table structure for table `mt_freight` */ + +DROP TABLE IF EXISTS `mt_freight`; + +CREATE TABLE `mt_freight` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `NAME` varchar(100) NOT NULL COMMENT '名称', + `TYPE` int NOT NULL COMMENT '计费类型,1:按件数;2:按重量', + `AMOUNT` decimal(10,2) NOT NULL COMMENT '费用', + `INCRE_AMOUNT` decimal(10,2) NOT NULL COMMENT '续费', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `STATUS` char(1) NOT NULL COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='运费模板'; + +/*Data for the table `mt_freight` */ + +/*Table structure for table `mt_freight_region` */ + +DROP TABLE IF EXISTS `mt_freight_region`; + +CREATE TABLE `mt_freight_region` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `FREIGHT_ID` int NOT NULL COMMENT '运费模板ID', + `PROVINCE_ID` int NOT NULL COMMENT '省份ID', + `CITY_ID` int NOT NULL COMMENT '城市ID', + `AREA_ID` int NOT NULL COMMENT '区域ID', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `STATUS` char(1) NOT NULL COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='运费模板地区'; + +/*Data for the table `mt_freight_region` */ + +/*Table structure for table `mt_give` */ + +DROP TABLE IF EXISTS `mt_give`; + +CREATE TABLE `mt_give` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '获赠者用户ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `GIVE_USER_ID` int NOT NULL DEFAULT '0' COMMENT '赠送者用户ID', + `MOBILE` varchar(20) NOT NULL DEFAULT '' COMMENT '赠予对象手机号', + `USER_MOBILE` varchar(20) NOT NULL DEFAULT '' COMMENT '用户手机', + `GROUP_IDS` varchar(200) NOT NULL DEFAULT '' COMMENT '券组ID,逗号隔开', + `GROUP_NAMES` varchar(500) NOT NULL DEFAULT '' COMMENT '券组名称,逗号隔开', + `COUPON_IDS` varchar(200) NOT NULL DEFAULT '' COMMENT '券ID,逗号隔开', + `COUPON_NAMES` varchar(500) NOT NULL DEFAULT '' COMMENT '券名称,逗号隔开', + `NUM` int NOT NULL DEFAULT '0' COMMENT '数量', + `MONEY` decimal(10,2) NOT NULL COMMENT '总金额', + `NOTE` varchar(200) DEFAULT '' COMMENT '备注', + `MESSAGE` varchar(500) DEFAULT '' COMMENT '留言', + `CREATE_TIME` datetime NOT NULL COMMENT '赠送时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态,A正常;C取消', + PRIMARY KEY (`ID`), + KEY `index_user_id` (`USER_ID`) USING BTREE, + KEY `index_give_user_id` (`GIVE_USER_ID`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='转赠记录表'; + +/*Data for the table `mt_give` */ + +insert into `mt_give`(`ID`,`USER_ID`,`MERCHANT_ID`,`STORE_ID`,`GIVE_USER_ID`,`MOBILE`,`USER_MOBILE`,`GROUP_IDS`,`GROUP_NAMES`,`COUPON_IDS`,`COUPON_NAMES`,`NUM`,`MONEY`,`NOTE`,`MESSAGE`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`) values +(1,163,1,1,693,'18976679980','18888884444','4','2021年中秋','4','酬宾早餐优惠券',1,50.00,'','转赠一张优惠券给你','2022-02-11 13:43:47','2022-02-11 13:43:47','A'), +(2,772,1,1,772,'18175702219','18175702219','12','26656','30','tanyi',1,10.00,'','转赠一张优惠券给你','2022-03-06 20:19:18','2022-03-06 20:19:18','A'), +(3,921,1,1,921,'13882064775','13882064775','6','十月份活动','14','优惠券10元',1,100.00,'','转赠一张优惠券给你','2022-04-13 19:46:41','2022-04-13 19:46:41','A'), +(4,1,1,1,163,'18976679981','18976679980','5','2021十一活动','15','100元优惠券',1,20.00,'','转赠一张优惠券给你','2022-05-11 20:43:02','2022-05-11 20:43:02','A'), +(5,1,1,1,163,'18976679981','18976679980','4','2021年中秋','3','2022年51限额500名活动预存券',1,200.00,'','转赠一张优惠券给你','2022-05-11 21:28:41','2022-05-11 21:28:41','A'), +(6,1162,1,1,1126,'18818996621','','26','全场典藏卡券(测试)','70','全场典藏卡券(测试)',1,50.00,'','转赠一张优惠券给你','2022-06-06 15:40:11','2022-06-06 15:40:11','A'), +(7,1234,1,1,1233,'13560320801','','26','全场典藏卡券(测试)','71','全场免单优惠券',1,999.00,'','转赠一张优惠券给你','2022-06-22 10:01:14','2022-06-22 10:01:14','A'), +(8,1235,1,1,1233,'13711105014','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-06-22 10:01:25','2022-06-22 10:01:25','A'), +(9,1,1,1,163,'18976679981','18976679980','6','十月份活动','14','优惠券10元',1,100.00,'','转赠一张优惠券给你','2022-06-28 15:22:41','2022-06-28 15:22:41','A'), +(10,1322,1,1,1069,'17796656160','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-07-14 09:35:37','2022-07-14 09:35:37','A'), +(11,1359,1,1,1356,'18208252470','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-07-22 18:39:17','2022-07-22 18:39:17','A'), +(12,1385,1,1,1369,'15713899276','18695879188','31','test分组','94','test22272109',1,10.00,'','转赠一张优惠券给你','2022-07-29 16:54:15','2022-07-29 16:54:15','A'), +(13,1386,1,1,1369,'15713899276','18695879188','31','test分组','94','test22272109',1,10.00,'','转赠一张优惠券给你','2022-07-29 17:04:24','2022-07-29 17:04:24','A'), +(14,1392,1,1,1392,'15988426226','15988426226','35','你妹','95','你妹洗脚优惠100元抵250元',1,100.00,'','转赠一张优惠券给你','2022-07-30 18:00:13','2022-07-30 18:00:13','A'), +(15,1496,1,1,1495,'15968205442','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-08-20 00:18:24','2022-08-20 00:18:24','A'), +(16,1592,1,1,1592,'15117012015','15117012015','12','26656','29','新年快乐',1,10.00,'','转赠一张优惠券给你','2022-09-13 21:21:16','2022-09-13 21:21:16','A'), +(17,1650,1,1,1649,'18531161003','','12','26656','29','新年快乐',1,10.00,'','转赠一张优惠券给你','2022-09-26 08:23:22','2022-09-26 08:23:22','A'), +(18,1980,1,1,1977,'18946222313','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-11-20 17:31:21','2022-11-20 17:31:21','A'), +(19,1981,1,1,1977,'13645684859','','5','2021十一活动','15','100元优惠券',1,20.00,'','转赠一张优惠券给你','2022-11-20 17:31:59','2022-11-20 17:31:59','A'), +(20,1992,1,1,1991,'18616998528','','4','2021年中秋','11','10元无门槛电子券',1,10.00,'','转赠一张优惠券给你','2022-11-21 18:11:18','2022-11-21 18:11:18','A'), +(21,2031,1,1,1508,'18667669897','18105765365','43','用于购买会员卡券','140','升级专用001',1,599.00,'','转赠一张优惠券给你','2022-11-25 18:22:52','2022-11-25 18:22:52','A'), +(22,2100,1,1,2099,'14716981537','','4','2021年中秋','18','12月份优惠券',1,6.00,'','转赠一张优惠券给你','2022-12-06 19:24:32','2022-12-06 19:24:32','A'), +(23,2228,1,1,163,'18988877767','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:20:49','2023-01-08 23:20:49','A'), +(24,2229,1,1,163,'18978878878','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:21:12','2023-01-08 23:21:12','A'), +(25,2230,1,1,163,'18977776678','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:21:39','2023-01-08 23:21:39','A'), +(26,2231,1,1,163,'18966643218','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:28:34','2023-01-08 23:28:34','A'), +(27,2232,1,1,163,'18976656656','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-09 07:50:51','2023-01-09 07:50:51','A'), +(28,163,1,1,163,'18976679980','18976679980','39','卡券测试1','139','店庆预存卡1',1,10000.00,'','转赠一张优惠券给你','2023-01-09 08:03:08','2023-01-09 08:03:08','A'), +(29,2021,1,1,163,'18976679981','18976679980','39','卡券测试1','139','店庆预存卡1',1,10000.00,'','转赠一张优惠券给你','2023-01-09 08:03:30','2023-01-09 08:03:30','A'), +(30,2021,1,1,163,'18976679981','18976679980','56','贷款手续费抵用券10','148','自制品礼品卡',1,10.00,'','转赠一张优惠券给你','2023-01-09 08:04:02','2023-01-09 08:04:02','A'), +(31,2021,1,1,163,'18976679981','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-09 14:30:55','2023-01-09 14:30:55','A'), +(32,2376,1,1,2369,'15721593486','','57','2023年套餐一','153','20元优惠券',1,20.00,'','转赠一张优惠券给你','2023-02-03 14:50:39','2023-02-03 14:50:39','A'), +(33,2408,1,1,2364,'17743256453','','60','早餐','163','前台卡券',1,200.00,'','转赠一张优惠券给你','2023-02-07 15:13:34','2023-02-07 15:13:34','A'), +(34,2733,1,1,2733,'18333615432','18333615432','64','d卡券分组','180','储值卡',1,100.00,'','转赠一张优惠券给你','2023-03-07 10:58:12','2023-03-07 10:58:12','A'), +(35,3375,1,1,975,'18921201520','','45','优惠券','210','满200送50',1,50.00,'','转赠一张优惠券给你','2023-04-23 11:16:08','2023-04-23 11:16:08','A'), +(36,3586,1,1,3583,'18566798813','16620860215','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-12 16:20:24','2023-05-12 16:20:24','A'), +(37,3582,1,1,3583,'18566798813','16620860215','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-12 16:23:38','2023-05-12 16:23:38','A'), +(38,3627,1,1,3627,'17762624971','17762624971','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-16 14:03:15','2023-05-16 14:03:15','A'), +(39,3631,1,1,3627,'17608449215','17762624971','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-16 14:26:45','2023-05-16 14:26:45','A'), +(40,3646,1,1,3645,'13316396329','13620482612','45','优惠券','246','卡币',1,100.00,'','转赠一张优惠券给你','2023-05-17 09:59:18','2023-05-17 09:59:18','A'), +(41,4010,1,1,3907,'13730420256','','45','优惠券','210','满200送50',1,50.00,'','转赠一张优惠券给你','2023-06-13 09:29:39','2023-06-13 09:29:39','A'), +(42,3907,1,1,3907,'13730420256','13730420256','76','服务卡项','274','洗车券',1,10.00,'','转赠一张优惠券给你','2023-06-13 10:46:58','2023-06-13 10:46:58','A'), +(43,4492,1,1,3721,'13122858538','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-11 20:18:34','2023-07-11 20:18:34','A'), +(44,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-11 20:22:04','2023-07-11 20:22:04','A'), +(45,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-11 20:27:51','2023-07-11 20:27:51','A'), +(46,4510,1,1,4550,'18188889999','18112345678','91','游戏充值','321','穿越火线满100减50优惠券',1,50.00,'','转赠一张优惠券给你','2023-07-13 11:40:41','2023-07-13 11:40:41','A'), +(47,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:01:49','2023-07-13 17:01:49','A'), +(48,4567,1,1,4365,'15317665576','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:12:08','2023-07-13 17:12:08','A'), +(49,4567,1,1,4365,'15317665576','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:38:50','2023-07-13 17:38:50','A'), +(50,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:57:46','2023-07-13 17:57:46','A'), +(51,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 18:34:45','2023-07-13 18:34:45','A'), +(52,6000,1,1,6002,'18728796753','','57','2023年套餐一','153','20元优惠券',1,34.00,'','转赠一张优惠券给你','2023-07-24 19:28:55','2023-07-24 19:28:55','A'), +(53,6000,1,1,6002,'18728796753','','57','2023年套餐一','153','20元优惠券',1,34.00,'','转赠一张优惠券给你','2023-07-24 19:29:50','2023-07-24 19:29:50','A'), +(54,6038,1,1,6036,'18645122682','','57','2023年套餐一','153','20元优惠券',1,20.00,'','转赠一张优惠券给你','2023-07-25 10:16:37','2023-07-25 10:16:37','A'); + +/*Table structure for table `mt_give_item` */ + +DROP TABLE IF EXISTS `mt_give_item`; + +CREATE TABLE `mt_give_item` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `GIVE_ID` int NOT NULL COMMENT '转赠ID', + `USER_COUPON_ID` int NOT NULL COMMENT '用户电子券ID', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `STATUS` char(1) NOT NULL COMMENT '状态,A正常;D删除', + PRIMARY KEY (`ID`), + KEY `index_give_id` (`GIVE_ID`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='转赠明细表'; + +/*Data for the table `mt_give_item` */ + +insert into `mt_give_item`(`ID`,`GIVE_ID`,`USER_COUPON_ID`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`) values +(1,1,613,'2022-02-11 13:43:47','2022-02-11 13:43:47','A'), +(2,2,1658,'2022-03-06 20:19:18','2022-03-06 20:19:18','A'), +(3,3,122298,'2022-04-13 19:46:41','2022-04-13 19:46:41','A'), +(4,4,15,'2022-05-11 20:43:02','2022-05-11 20:43:02','A'), +(5,5,44,'2022-05-11 21:28:41','2022-05-11 21:28:41','A'), +(6,6,1798,'2022-06-06 15:40:11','2022-06-06 15:40:11','A'), +(7,7,2404,'2022-06-22 10:01:14','2022-06-22 10:01:14','A'), +(8,8,2405,'2022-06-22 10:01:25','2022-06-22 10:01:25','A'), +(9,9,2621,'2022-06-28 15:22:41','2022-06-28 15:22:41','A'), +(10,10,67,'2022-07-14 09:35:37','2022-07-14 09:35:37','A'), +(11,11,23,'2022-07-22 18:39:17','2022-07-22 18:39:17','A'), +(12,12,400,'2022-07-29 16:54:15','2022-07-29 16:54:15','A'), +(13,13,399,'2022-07-29 17:04:24','2022-07-29 17:04:24','A'), +(14,14,419,'2022-07-30 18:00:13','2022-07-30 18:00:13','A'), +(15,15,30701,'2022-08-20 00:18:24','2022-08-20 00:18:24','A'), +(16,16,211369,'2022-09-13 21:21:16','2022-09-13 21:21:16','A'), +(17,17,211502,'2022-09-26 08:23:22','2022-09-26 08:23:22','A'), +(18,18,19294,'2022-11-20 17:31:21','2022-11-20 17:31:21','A'), +(19,19,19548,'2022-11-20 17:31:59','2022-11-20 17:31:59','A'), +(20,20,19575,'2022-11-21 18:11:18','2022-11-21 18:11:18','A'), +(21,21,20280,'2022-11-25 18:22:52','2022-11-25 18:22:52','A'), +(22,22,29107,'2022-12-06 19:24:32','2022-12-06 19:24:32','A'), +(23,23,31903,'2023-01-08 23:20:49','2023-01-08 23:20:49','A'), +(24,24,31903,'2023-01-08 23:21:12','2023-01-08 23:21:12','A'), +(25,25,31903,'2023-01-08 23:21:39','2023-01-08 23:21:39','A'), +(26,26,31903,'2023-01-08 23:28:34','2023-01-08 23:28:34','A'), +(27,27,31903,'2023-01-09 07:50:51','2023-01-09 07:50:51','A'), +(28,28,31902,'2023-01-09 08:03:08','2023-01-09 08:03:08','A'), +(29,29,31902,'2023-01-09 08:03:30','2023-01-09 08:03:30','A'), +(30,30,31765,'2023-01-09 08:04:02','2023-01-09 08:04:02','A'), +(31,31,26562,'2023-01-09 14:30:55','2023-01-09 14:30:55','A'), +(32,32,42627,'2023-02-03 14:50:39','2023-02-03 14:50:39','A'), +(33,33,42858,'2023-02-07 15:13:34','2023-02-07 15:13:34','A'), +(34,34,600134,'2023-03-07 10:58:12','2023-03-07 10:58:12','A'), +(35,35,7000,'2023-04-23 11:16:08','2023-04-23 11:16:08','A'), +(36,36,674,'2023-05-12 16:20:24','2023-05-12 16:20:24','A'), +(37,37,670,'2023-05-12 16:23:38','2023-05-12 16:23:38','A'), +(38,38,854,'2023-05-16 14:03:15','2023-05-16 14:03:15','A'), +(39,39,854,'2023-05-16 14:26:45','2023-05-16 14:26:45','A'), +(40,40,870,'2023-05-17 09:59:18','2023-05-17 09:59:18','A'), +(41,41,1166,'2023-06-13 09:29:39','2023-06-13 09:29:39','A'), +(42,42,1198,'2023-06-13 10:46:58','2023-06-13 10:46:58','A'), +(43,43,1520,'2023-07-11 20:18:34','2023-07-11 20:18:34','A'), +(44,44,1521,'2023-07-11 20:22:04','2023-07-11 20:22:04','A'), +(45,45,1522,'2023-07-11 20:27:51','2023-07-11 20:27:51','A'), +(46,46,1555,'2023-07-13 11:40:41','2023-07-13 11:40:41','A'), +(47,47,1558,'2023-07-13 17:01:49','2023-07-13 17:01:49','A'), +(48,48,1560,'2023-07-13 17:12:08','2023-07-13 17:12:08','A'), +(49,49,1561,'2023-07-13 17:38:50','2023-07-13 17:38:50','A'), +(50,50,1559,'2023-07-13 17:57:46','2023-07-13 17:57:46','A'), +(51,51,1570,'2023-07-13 18:34:45','2023-07-13 18:34:45','A'), +(52,52,5114,'2023-07-24 19:28:55','2023-07-24 19:28:55','A'), +(53,53,5128,'2023-07-24 19:29:50','2023-07-24 19:29:50','A'), +(54,54,5152,'2023-07-25 10:16:37','2023-07-25 10:16:37','A'); + +/*Table structure for table `mt_goods` */ + +DROP TABLE IF EXISTS `mt_goods`; + +CREATE TABLE `mt_goods` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `TYPE` varchar(30) DEFAULT 'goods' COMMENT '商品类别', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `NAME` varchar(100) DEFAULT '' COMMENT '商品名称', + `CATE_ID` int DEFAULT '0' COMMENT '分类ID', + `BOOK_ID` int DEFAULT '0' COMMENT '预约项目ID', + `GOODS_NO` varchar(100) DEFAULT '' COMMENT '商品编码', + `PLATFORM` int DEFAULT '0' COMMENT '可用平台,0:不限,1:仅会员端(小程序和h5);2:仅收银端', + `IS_SINGLE_SPEC` char(1) NOT NULL DEFAULT 'Y' COMMENT '是否单规格', + `LOGO` varchar(200) DEFAULT '' COMMENT '主图地址', + `IMAGES` varchar(1000) DEFAULT '' COMMENT '图片地址', + `PRICE` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '价格', + `LINE_PRICE` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '划线价格', + `COST_PRICE` decimal(10,2) DEFAULT '0.00' COMMENT '成本价格', + `STOCK` double(10,2) unsigned DEFAULT '0.00' COMMENT '库存', + `WEIGHT` decimal(10,2) DEFAULT '0.00' COMMENT '重量', + `COUPON_IDS` varchar(500) DEFAULT '' COMMENT '关联卡券ID', + `SERVICE_TIME` int DEFAULT '0' COMMENT '服务时长,单位:分钟', + `INIT_SALE` double(10,2) DEFAULT '0.00' COMMENT '初始销量', + `SALE_POINT` varchar(100) DEFAULT '' COMMENT '商品卖点', + `CAN_USE_POINT` char(1) DEFAULT 'N' COMMENT '可否使用积分抵扣', + `IS_MEMBER_DISCOUNT` char(1) DEFAULT 'Y' COMMENT '会员是否有折扣', + `SORT` int DEFAULT '0' COMMENT '排序', + `DESCRIPTION` text COMMENT '商品描述', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=386 DEFAULT CHARSET=utf8 COMMENT='商品表'; + +/*Data for the table `mt_goods` */ + +insert into `mt_goods`(`ID`,`TYPE`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`CATE_ID`,`GOODS_NO`,`PLATFORM`,`IS_SINGLE_SPEC`,`LOGO`,`IMAGES`,`PRICE`,`LINE_PRICE`,`COST_PRICE`,`STOCK`,`WEIGHT`,`COUPON_IDS`,`SERVICE_TIME`,`INIT_SALE`,`SALE_POINT`,`CAN_USE_POINT`,`IS_MEMBER_DISCOUNT`,`SORT`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values +(1,'goods',1,0,'韩式防水围裙',1,'9983242340',0,'N','/static/uploadImages/20220110/4c90921a7fc34c97b0f62cebf314d2bb.jpg','[\"/static/uploadImages/20220110/4c90921a7fc34c97b0f62cebf314d2bb.jpg\",\"/static/uploadImages/20220110/9b64b3d65fa04296b62de186899f24ea.jpg\",\"/static/uploadImages/20220110/ff4809f7a17d4142ace9bc287aab105a.jpg\"]',88.00,99.00,0.00,90013.00,1.00,'',0,747.00,'超级防水','Y','Y',1,'

1234444

','2021-10-13 13:56:04','2023-07-31 19:51:21','fuint','A'), +(2,'goods',1,0,'小清新水果刀三件套',4,'6975486820418',0,'Y','/static/uploadImages/20220110/6b67b70f35734ff28a03aa3d82ac96a0.jpg','[\"/static/uploadImages/20220110/6b67b70f35734ff28a03aa3d82ac96a0.jpg\"]',0.01,20.00,0.00,1946.00,2.00,'',0,33.00,'小清新','Y','N',1,'

123

','2021-10-13 14:19:45','2023-07-31 20:01:44','fuint','A'), +(3,'goods',1,0,'可爱旅行大号牙刷杯两个装',3,'92342342342',0,'N','/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg','[\"/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg\",\"/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg\",\"/static/uploadImages/20220110/d39f84568b9746f89d9f6a368b8067c4.jpg\"]',99.00,120.00,0.00,6000.00,1.00,'',0,1532.00,'超级实惠','Y','Y',1,'


','2021-10-14 01:08:45','2023-09-22 13:38:42','fuint','A'), +(4,'goods',1,0,'筷子便携餐盒3件套',1,'6914068026176',0,'N','/static/uploadImages/20220110/31cbf7ad0ef442a4b10dcefc24db0662.jpg','[\"/static/uploadImages/20220110/31cbf7ad0ef442a4b10dcefc24db0662.jpg\"]',80.00,99.00,0.00,4010.00,1.00,'',0,1325.00,'一体成型','Y','N',1,'

测试商品

','2021-10-14 05:46:23','2023-07-28 15:13:50','fuint','A'), +(5,'goods',1,0,'简壳 一拖三可收纳伸缩充电线',2,'6922577729501',0,'N','/static/uploadImages/20220110/856dbc96197e4782b4febb7a6e671bcb.jpg','[\"/static/uploadImages/20220110/856dbc96197e4782b4febb7a6e671bcb.jpg\"]',0.10,100.00,0.00,3877.00,0.00,'',0,1168.00,'可伸缩','Y','Y',1,'


','2021-10-14 05:47:31','2023-07-24 19:00:45','fuint','A'), +(6,'goods',1,0,'抽绳垃圾袋16只*4卷',1,'6975486820418',0,'Y','/static/uploadImages/20220110/6083071182cd48afa6c2b9e23f181832.jpg','[\"/static/uploadImages/20220110/6083071182cd48afa6c2b9e23f181832.jpg\",\"/static/uploadImages/20220110/ee5c67ed338442fc90e5c647ccbfd381.jpg\"]',18.00,20.00,0.00,109528.00,1.00,'',11,4209.00,'厨房必备小帮手','Y','Y',0,'

','2021-10-14 05:48:43','2023-07-31 20:00:49','fuint','A'); + +/*Table structure for table `mt_goods_cate` */ + +DROP TABLE IF EXISTS `mt_goods_cate`; + +CREATE TABLE `mt_goods_cate` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺', + `NAME` varchar(100) DEFAULT '' COMMENT '分类名称', + `LOGO` varchar(200) DEFAULT '' COMMENT 'LOGO地址', + `DESCRIPTION` text COMMENT '分类描述', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `SORT` int DEFAULT '0' COMMENT '排序', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8 COMMENT='商品分类表'; + +/*Data for the table `mt_goods_cate` */ + +insert into `mt_goods_cate`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`LOGO`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values +(1,1,0,'生活用品','/static/defaultImage/life.png','1234','2021-10-09 06:27:11','2023-07-24 23:30:10','fuint',1,'A'), +(2,1,0,'办公用品','/static/defaultImage/office.png','','2021-10-09 06:27:11','2023-07-21 18:47:52','fuint',3,'A'), +(3,1,0,'好物推荐','/static/defaultImage/love.png','好物推荐','2021-10-09 06:27:11','2023-07-24 19:13:13','fuint',1,'A'), +(4,1,0,'打折热销','/static/defaultImage/hot.png','低价甩卖','2021-10-14 02:20:00','2023-07-27 17:04:42','fuint',3,'A'), +(187,2,0,'美妆','/static/uploadImages/20230918/7567dc29707c41dca8381cc072944d2f.PNG','123','2023-09-18 17:53:49','2023-09-18 17:53:49','anan',0,'A'), +(188,2,0,'办公','/static/uploadImages/20230918/ebfab5816a374bec97fb223b51cf63fe.png','123','2023-09-18 17:54:37','2023-09-18 17:54:37','anan',0,'A'); + +/*Table structure for table `mt_goods_sku` */ + +DROP TABLE IF EXISTS `mt_goods_sku`; + +CREATE TABLE `mt_goods_sku` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `SKU_NO` varchar(50) DEFAULT '' COMMENT 'sku编码', + `LOGO` varchar(255) DEFAULT '' COMMENT '图片', + `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID', + `SPEC_IDS` varchar(100) NOT NULL DEFAULT '' COMMENT '规格ID', + `STOCK` double(10,2) NOT NULL DEFAULT '0.00' COMMENT '库存', + `PRICE` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', + `LINE_PRICE` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '划线价格', + `COST_PRICE` decimal(10,2) DEFAULT '0.00' COMMENT '成本价格', + `WEIGHT` decimal(10,2) DEFAULT '0.00' COMMENT '重量', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=745 DEFAULT CHARSET=utf8 COMMENT='商品SKU表'; + +/*Data for the table `mt_goods_sku` */ + +insert into `mt_goods_sku`(`ID`,`SKU_NO`,`LOGO`,`GOODS_ID`,`SPEC_IDS`,`STOCK`,`PRICE`,`LINE_PRICE`,`COST_PRICE`,`WEIGHT`,`STATUS`) values +(142,'','',27,'46',0.00,0.00,0.00,0.00,0.00,'A'), +(143,'','',27,'47',0.00,0.00,0.00,0.00,0.00,'A'), +(145,'','',37,'56',51.00,200.00,300.00,0.00,1.20,'A'), +(189,'','',40,'66-69',1.00,1.00,1.00,0.00,1.00,'A'), +(190,'','',40,'66-70',1.00,1.00,1.00,0.00,1.00,'A'), +(191,'','',40,'67-69',1.00,1.00,1.00,0.00,1.00,'A'), +(192,'','',40,'67-70',1.00,1.00,1.00,0.00,1.00,'A'), +(193,'','',40,'68-69',1.00,1.00,1.00,0.00,1.00,'A'), +(194,'','',40,'68-70',1.00,1.00,1.00,0.00,1.00,'A'), +(261,'8888880','',45,'86',88.00,10.00,20.00,0.00,2.00,'A'), +(262,'8888881','',45,'87',90.00,10.00,20.00,0.00,2.00,'A'), +(263,'8888882','',45,'88',89.00,10.00,20.00,0.00,2.00,'A'), +(264,'8888883','',45,'89',90.00,10.00,20.00,0.00,2.00,'A'), +(265,'34234','',48,'90',220.00,21.00,112.00,0.00,1.00,'A'), +(266,'234230','',51,'92',100.00,10.00,12.00,0.00,1.00,'A'), +(267,'234231','',51,'93',98.00,10.00,12.00,0.00,1.00,'A'), +(269,'34235','',48,'95',887.00,20.00,120.00,0.00,1.00,'A'), +(315,'2222','/uploads/20230228/656a1aef1e8c4a8e8e80c5b817e15255.jpg',79,'138-142',999.00,24.00,24.00,0.00,2.00,'A'), +(317,'4444','',79,'139-142',999.00,24.00,24.00,0.00,2.00,'A'), +(339,'111111','/uploads/20230307/55126b64546945f4a6393ad5259cfc03.jpg',86,'153',100.00,0.01,99.00,0.00,0.00,'A'), +(340,'222222','/uploads/20230307/67d54c99787b4114affd86c5248d1431.jpg',86,'157',100.00,0.01,99.00,0.00,0.00,'A'), +(341,'333333','/uploads/20230307/72cc5a1c16ee4c21a8ea35612741f87e.jpg',86,'158',98.00,0.01,99.00,0.00,0.00,'A'), +(386,'','',91,'185',0.00,0.00,0.00,0.00,0.00,'A'), +(387,'SKU12434','/uploads/20230314/7333fe6a66884de59e560278c2de609b.jpg',95,'191-193',99.00,10.00,15.00,0.00,1.00,'A'), +(388,'SKU12432','/uploads/20230314/0d4f3ea2741e495f82a23f8443b54e18.jpg',95,'191-194',98.00,10.00,15.00,0.00,1.00,'A'), +(389,'SKU12442','/uploads/20230314/e87014e2f81c466398e35a01472cedb4.jpg',95,'192-193',100.00,19.00,25.00,0.00,1.00,'A'), +(390,'SKU12423','/uploads/20230314/4aab2fc389a54de6b66c19b69eff8ebc.jpg',95,'192-194',98.00,19.00,25.00,0.00,1.00,'A'), +(391,'瓶','',96,'195',4.00,3.00,3.00,0.00,500.00,'A'), +(424,'1230','',119,'220',100.00,1.00,0.00,0.00,1.00,'A'), +(425,'1231','',119,'223',100.00,1.00,0.00,0.00,1.00,'A'), +(426,'1232','',119,'224',100.00,1.00,0.00,0.00,1.00,'A'), +(427,'1233','',119,'225',100.00,1.00,0.00,0.00,1.00,'A'), +(515,'34423423420','',5,'214-215',898.00,99.00,100.00,0.00,1.00,'A'), +(516,'34423423421','',5,'214-217',931.00,99.00,100.00,0.00,1.00,'A'), +(517,'34423423422','',5,'216-215',954.00,99.00,100.00,0.00,1.00,'A'), +(518,'34423423423','',5,'216-217',838.00,99.00,100.00,0.00,1.00,'A'), +(519,'','',140,'262',0.00,0.00,0.00,0.00,0.00,'A'), +(547,'79232344230','',165,'274',100.00,3.99,5.00,0.00,0.25,'A'), +(548,'79232344231','',165,'275',100.00,6.00,7.00,0.00,0.25,'A'), +(555,'','',169,'282-286',9.00,189.00,289.00,0.00,0.00,'A'), +(556,'','',169,'282-287',10.00,189.00,289.00,0.00,0.00,'A'), +(557,'','',169,'282-288',10.00,189.00,289.00,0.00,0.00,'A'), +(558,'','',169,'282-289',10.00,189.00,289.00,0.00,0.00,'A'), +(559,'','',169,'282-290',10.00,189.00,289.00,0.00,0.00,'A'), +(560,'','',169,'283-286',10.00,189.00,289.00,0.00,0.00,'A'), +(561,'','',169,'283-287',9.00,189.00,289.00,0.00,0.00,'A'), +(562,'','',169,'283-288',9.00,189.00,289.00,0.00,0.00,'A'), +(563,'','',169,'283-289',10.00,189.00,289.00,0.00,0.00,'A'), +(564,'','',169,'283-290',10.00,189.00,289.00,0.00,0.00,'A'), +(565,'','',169,'285-286',10.00,189.00,289.00,0.00,0.00,'A'), +(566,'','',169,'285-287',10.00,189.00,289.00,0.00,0.00,'A'), +(567,'','',169,'285-288',8.00,189.00,289.00,0.00,0.00,'A'), +(568,'','',169,'285-289',9.00,189.00,289.00,0.00,0.00,'A'), +(569,'','',169,'285-290',6.00,189.00,289.00,0.00,0.00,'A'), +(583,'4353452','/uploads/20230609/92a39796268246c7865ff10d560a9d10.gif',176,'296',7.00,56.00,80.00,0.00,0.00,'A'), +(584,'45345','',177,'297',88.00,677.00,5888.00,0.00,0.00,'A'), +(585,'45345345','',177,'299',75.00,888.00,8888.00,0.00,0.00,'A'), +(604,'','',169,'309-286',0.00,0.00,0.00,0.00,0.00,'A'), +(605,'','',169,'309-287',0.00,0.00,0.00,0.00,0.00,'A'), +(606,'','',169,'309-288',0.00,0.00,0.00,0.00,0.00,'A'), +(607,'','',169,'309-289',0.00,0.00,0.00,0.00,0.00,'A'), +(608,'','',169,'309-290',0.00,0.00,0.00,0.00,0.00,'A'), +(609,'','',183,'310-311',10.00,99.00,0.00,0.00,0.00,'A'), +(610,'','',183,'310-312',10.00,99.00,0.00,0.00,0.00,'A'), +(611,'','',183,'310-313',10.00,99.00,0.00,0.00,0.00,'A'), +(612,'','',183,'310-314',10.00,99.00,0.00,0.00,0.00,'A'), +(613,'','',183,'310-315',10.00,99.00,0.00,0.00,0.00,'A'), +(614,'','',183,'310-316',10.00,99.00,0.00,0.00,0.00,'A'), +(615,'','',183,'317-311',10.00,99.00,0.00,0.00,0.00,'A'), +(616,'','',183,'317-312',10.00,99.00,0.00,0.00,0.00,'A'), +(617,'','',183,'317-313',10.00,99.00,0.00,0.00,0.00,'A'), +(618,'','',183,'317-314',10.00,99.00,0.00,0.00,0.00,'A'), +(619,'','',183,'317-315',10.00,99.00,0.00,0.00,0.00,'A'), +(620,'','',183,'317-316',10.00,99.00,0.00,0.00,0.00,'A'), +(621,'','',183,'318-311',10.00,99.00,0.00,0.00,0.00,'A'), +(622,'','',183,'318-312',10.00,99.00,0.00,0.00,0.00,'A'), +(623,'','',183,'318-313',10.00,99.00,0.00,0.00,0.00,'A'), +(624,'','',183,'318-314',10.00,99.00,0.00,0.00,0.00,'A'), +(625,'','',183,'318-315',10.00,99.00,0.00,0.00,0.00,'A'), +(626,'','',183,'318-316',9.00,99.00,0.00,0.00,0.00,'A'), +(627,'1','',187,'324',20.00,22.00,25.00,0.00,0.50,'A'), +(628,'2','',187,'325',20.00,40.00,50.00,0.00,1.00,'A'), +(629,'1','',185,'327',0.00,120.00,150.00,0.00,5.00,'A'), +(630,'2','',185,'328',1.00,150.00,180.00,0.00,5.00,'A'), +(631,'3','',185,'329',0.00,200.00,250.00,0.00,5.00,'A'), +(644,'','/uploads/20230628/0c17bcee89dc4838be59aba2db990e22.png',197,'339',997.00,68.00,0.00,0.00,0.00,'A'), +(659,'180521342436380','',207,'345-351-353',1.00,1.00,1.00,0.00,1.00,'A'), +(660,'180521342436381','',207,'348-351-353',1.00,1.00,1.00,0.00,1.00,'A'), +(661,'179699761475660','',232,'355-356',10.00,20.00,30.00,0.00,1.00,'A'), +(662,'179699761475661','',232,'355-357',10.00,30.00,60.00,0.00,1.00,'A'), +(663,'179699761475662','',232,'358-356',1.00,20.00,30.00,0.00,1.00,'A'), +(664,'179699761475663','',232,'358-357',2.00,30.00,60.00,0.00,1.00,'A'), +(669,'148503337738370','',305,'372-374',10.00,99.00,299.00,0.00,0.00,'A'), +(670,'148503337738371','',305,'372-375',10.00,99.00,299.00,0.00,0.00,'A'), +(671,'148503337738372','',305,'373-374',10.00,99.00,299.00,0.00,0.00,'A'), +(672,'148503337738373','',305,'373-375',10.00,99.00,299.00,0.00,0.00,'A'), +(673,'','',361,'388',0.00,0.00,0.00,0.00,0.00,'A'), +(674,'','',361,'389',0.00,0.00,0.00,0.00,0.00,'A'), +(675,'','',361,'390',0.00,0.00,0.00,0.00,0.00,'A'), +(676,'','',361,'391',0.00,0.00,0.00,0.00,0.00,'A'), +(677,'','',361,'393',0.00,0.00,0.00,0.00,0.00,'A'), +(689,'164348379384740','',382,'413-416-419',990.00,18.00,0.00,0.00,0.00,'A'), +(690,'164348379384741','',382,'413-417-419',990.00,18.00,0.00,0.00,0.00,'A'), +(691,'164348379384742','',382,'413-418-419',990.00,18.00,0.00,0.00,0.00,'A'), +(692,'164348379384743','',382,'414-416-419',990.00,18.00,0.00,0.00,0.00,'A'), +(693,'164348379384744','',382,'414-417-419',990.00,18.00,0.00,0.00,0.00,'A'), +(694,'164348379384745','',382,'414-418-419',990.00,18.00,0.00,0.00,0.00,'A'), +(695,'164348379384746','',382,'415-416-419',990.00,18.00,0.00,0.00,0.00,'A'), +(696,'164348379384747','',382,'415-417-419',990.00,18.00,0.00,0.00,0.00,'A'), +(697,'164348379384748','',382,'415-418-419',990.00,18.00,0.00,0.00,0.00,'A'), +(710,'125946837840450','',1,'107-180',10004.00,88.00,99.00,0.00,1.00,'A'), +(711,'125946837840451','',1,'107-331',10002.00,88.00,99.00,0.00,1.00,'A'), +(712,'125946837840452','',1,'107-421',10001.00,88.00,99.00,0.00,1.00,'A'), +(716,'134518978667720','',4,'402-404',1000.00,80.00,99.00,0.00,1.00,'A'), +(717,'134518978667721','',4,'402-405',1000.00,80.00,99.00,0.00,1.00,'A'), +(718,'134518978667722','',4,'403-404',997.00,80.00,99.00,0.00,1.00,'A'), +(719,'134518978667723','',4,'403-405',995.00,80.00,99.00,0.00,1.00,'A'), +(732,'155430306154340','',384,'430',1.00,1.00,1.00,0.00,1.00,'A'), +(733,'125946837840453','',1,'431-180',10000.00,88.00,99.00,0.00,1.00,'A'), +(734,'125946837840454','',1,'431-331',9998.00,88.00,99.00,0.00,1.00,'A'), +(735,'125946837840455','',1,'431-421',10000.00,88.00,99.00,0.00,1.00,'A'), +(736,'125946837840456','',1,'432-180',10000.00,88.00,99.00,0.00,1.00,'A'), +(737,'125946837840457','',1,'432-331',9999.00,88.00,99.00,0.00,1.00,'A'), +(738,'125946837840458','',1,'432-421',9998.00,88.00,99.00,0.00,1.00,'A'), +(739,'197171320996910','',3,'6-74-401',1000.00,99.00,120.00,0.00,1.00,'A'), +(740,'197171320996911','',3,'6-75-401',1000.00,99.00,120.00,0.00,1.00,'A'), +(741,'197171320996912','',3,'6-429-401',1000.00,99.00,120.00,0.00,1.00,'A'), +(742,'197171320996913','',3,'7-74-401',1000.00,99.00,120.00,0.00,1.00,'A'), +(743,'197171320996914','',3,'7-75-401',1000.00,99.00,120.00,0.00,1.00,'A'), +(744,'197171320996915','',3,'7-429-401',1000.00,99.00,120.00,0.00,1.00,'A'); + +/*Table structure for table `mt_goods_spec` */ + +DROP TABLE IF EXISTS `mt_goods_spec`; + +CREATE TABLE `mt_goods_spec` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID', + `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '规格名称', + `VALUE` varchar(100) NOT NULL DEFAULT '' COMMENT '规格值', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=433 DEFAULT CHARSET=utf8 COMMENT='规格表'; + +/*Data for the table `mt_goods_spec` */ + +insert into `mt_goods_spec`(`ID`,`GOODS_ID`,`NAME`,`VALUE`,`STATUS`) values +(1,6,'厚度','正常','D'), +(2,6,'厚度','加厚','D'), +(3,6,'糖分','黑色','D'), +(4,6,'糖分','黄色','D'), +(5,6,'糖分','白色','D'), +(6,3,'材质','304不锈钢','A'), +(7,3,'材质','塑料','A'), +(8,6,'尺码','m','D'), +(9,6,'尺码','l','D'), +(10,6,'口味','1','D'), +(11,6,'口味','2','D'), +(12,6,'口味','3','D'), +(13,2,'m','m','D'), +(14,6,'厚度','超薄','D'), +(15,16,'风味','孜然','D'), +(16,16,'特色','炭火','D'), +(17,16,'风味','秘制','D'), +(18,16,'特色','木炭','D'), +(19,16,'特色','风味小吃','D'), +(20,6,'大小','啥啥啥','D'), +(21,6,'大小','L','D'), +(22,24,'500ML','7','D'), +(23,24,'700ML','10','D'), +(24,24,'小杯','500ML','A'), +(25,24,'大杯','700ML','D'), +(26,24,'大杯','700ML','D'), +(27,24,'小杯','122','D'), +(28,24,'小杯','任天野','D'), +(29,24,'小杯','700ML','A'), +(30,6,'大小','12','D'), +(31,6,'2','3','D'), +(32,6,'1','','D'), +(33,6,'大小','M','D'), +(34,6,'大小','L','D'), +(35,11,'ddd','rr','A'), +(36,11,'gggg','ttt','A'), +(37,11,'ddd','yyu','A'), +(38,11,'gggg','==999','A'), +(39,12,'1','1,2','A'), +(40,16,'年份','82年','A'), +(41,16,'年份','90年','A'), +(42,16,'年份','00年','A'), +(43,6,'尺码','大','D'), +(44,6,'尺码','小','D'), +(45,2,'7','','D'), +(46,27,'颜色','红色','A'), +(47,27,'颜色','白色','A'), +(48,2,'大小','5','D'), +(49,2,'品牌','6','D'), +(50,2,'大小','IIS','D'), +(51,2,'品牌','8','D'), +(52,6,'xxx','','D'), +(53,6,'糖分','绿色','D'), +(54,37,'test1','12','D'), +(55,37,'test2','13','D'), +(56,37,'test1','123','A'), +(57,38,'颜色','黑色','A'), +(58,38,'颜色','蓝色','A'), +(59,38,'颜色','绿色','D'), +(60,38,'大小','大号','A'), +(61,38,'大小','小号','A'), +(62,38,'颜色','绿色','D'), +(63,4,'颜色','红色','D'), +(64,6,'重量','10KG','D'), +(65,6,'重量','10g','D'), +(66,40,'时长','两小时','A'), +(67,40,'时长','三小时','A'), +(68,40,'时长','四小时','A'), +(69,40,'面积','80平米','A'), +(70,40,'面积','100平米','A'), +(71,41,'11','1','A'), +(72,41,'11','11','A'), +(73,41,'11','111','A'), +(74,3,'颜色','粉红色','A'), +(75,3,'颜色','黑色','A'), +(76,6,'jj','','D'), +(77,6,'重量','nihao','D'), +(78,6,'糖分','红色','D'), +(79,6,'糖分','紫色','D'), +(80,6,'nih','hth','D'), +(81,2,'颜色','1111','D'), +(82,6,'糖分','蓝色','D'), +(83,6,'大小','XL','D'), +(84,6,'呃呃','','D'), +(86,45,'容量','300W','A'), +(87,45,'容量','300W','A'), +(88,45,'容量','300','A'), +(89,45,'容量','300','A'), +(90,48,'颜色','红色','A'), +(91,48,'1','','D'), +(92,51,'颜色','白色','A'), +(93,51,'颜色','黑色','A'), +(94,51,'颜色','绿色','D'), +(95,48,'颜色','黑色','A'), +(96,52,'eee','12','D'), +(97,52,'eee','222','D'), +(98,52,'dfsfsa','33','A'), +(99,52,'dfsfsa','22','A'), +(100,53,'ddd','','D'), +(101,53,'天泰','营业','A'), +(102,52,'eee','22','D'), +(103,1,'123','123','D'), +(104,1,'123123','','D'), +(105,1,'123','qwe123','D'), +(106,1,'123','qwe123','D'), +(107,1,'尺码','39','A'), +(108,1,'尺码','39','D'), +(109,1,'尺码','40','D'), +(110,6,'糖分','d','D'), +(111,5,'abg','1','D'), +(112,5,'abg','1234','D'), +(113,6,'款式','长','D'), +(114,6,'款式','A','D'), +(115,6,'款式','宽','D'), +(116,65,'套房','套一','A'), +(117,69,'小码','S','A'), +(118,69,'小码','d','A'), +(119,4,'颜色','蓝色','D'), +(120,4,'颜色','蓝色','D'), +(121,2,'大小','L','D'), +(122,2,'品牌','10','D'), +(123,4,'颜色','白色','D'), +(124,4,'颜色','黑色','D'), +(125,4,'颜色','黑色','D'), +(126,6,'test','1','D'), +(127,76,'颜色','黄色','A'), +(128,76,'颜色','黄','D'), +(129,76,'尺码','L','A'), +(130,76,'颜色','1','D'), +(131,76,'颜色','蓝色','A'), +(132,76,'尺码','M','A'), +(133,6,'款式','高','D'), +(134,6,'款式','宽','D'), +(135,6,'款式','宽','D'), +(136,79,'颜色','大小','D'), +(137,79,'颜色','规格','D'), +(138,79,'颜色','红色','A'), +(139,79,'颜色','绿色','A'), +(140,79,'大小','黄色','D'), +(141,79,'大小','500ml','D'), +(142,79,'大小','1L','A'), +(143,6,'款式','宽','D'), +(144,6,'款式','宽','D'), +(145,6,'款式','宽','D'), +(146,6,'款式','11','D'), +(147,81,'caoi','1','A'), +(148,81,'caoi','1','A'), +(149,81,'caoi','2','A'), +(150,81,'iphone','64g','A'), +(151,81,'iphone','128g','A'), +(152,81,'iphone','256g','D'), +(153,86,'颜色','红','A'), +(154,86,'颜色','黄色','D'), +(155,86,'颜色','红色','D'), +(156,86,'颜色','绿色','D'), +(157,86,'颜色','黄','A'), +(158,86,'颜色','绿','A'), +(159,90,'33','33','A'), +(160,90,'3','','A'), +(161,90,'4','5','A'), +(162,91,'华为','1号','D'), +(163,91,'hw','01','D'), +(164,91,'xm','01','A'), +(165,91,'xm','02','A'), +(166,91,'xm','03','A'), +(167,91,'hw','02','A'), +(168,91,'hw','03','A'), +(169,91,'xm','01','D'), +(170,91,'xm','02','D'), +(171,91,'xm','03','D'), +(172,91,'hw','01','D'), +(173,91,'xm','01','D'), +(174,91,'hw','02','D'), +(175,91,'xm','02','D'), +(176,91,'hw','03','D'), +(177,91,'xm','03','D'), +(178,91,'xm','04','D'), +(179,91,'xm','04','D'), +(180,1,'颜色','黑色','A'), +(181,1,'颜色','蓝色','D'), +(182,1,'颜色','黄色','D'), +(183,1,'卡通图','米老鼠','D'), +(184,1,'卡通图','唐老鸭','D'), +(185,91,'原味','','A'), +(186,91,'味道','原味','A'), +(187,91,'味道','酸辣','A'), +(188,93,'打包','小包','A'), +(189,93,'打包','的','A'), +(190,95,'数量','口味','D'), +(191,95,'数量','一包','A'), +(192,95,'数量','两包','A'), +(193,95,'口味','奶香味','A'), +(194,95,'口味','草莓味','A'), +(195,96,'口味','普通','A'), +(196,110,'lll','iiii','A'), +(197,110,'lll','iiii','A'), +(198,110,'9999','llll','A'), +(199,110,'9999','9999','A'), +(200,110,'8888','99999','A'), +(201,110,'8888','7777','A'), +(202,1,'尺码','43','D'), +(203,6,'111','11','D'), +(204,6,'糖分','1','D'), +(205,6,'糖分','2','D'), +(206,6,'糖分','3','D'), +(207,6,'糖分','4','D'), +(208,6,'糖分','5','D'), +(209,6,'糖分','6','D'), +(210,6,'糖分','7','D'), +(211,6,'糖分','8','D'), +(212,6,'糖分','9','D'), +(213,6,'糖分','10','D'), +(214,5,'A','A-1','A'), +(215,5,'B','B-1','A'), +(216,5,'A','A-2','A'), +(217,5,'B','B-2','A'), +(218,6,'款式','13','D'), +(219,119,'代杀','1','D'), +(220,119,'可选备注','','A'), +(221,119,'代杀','代杀','A'), +(222,119,'代杀','不杀','A'), +(223,119,'可选备注','杀(清洗)','A'), +(224,119,'可选备注','杀(不清洗)','A'), +(225,119,'可选备注','不杀','A'), +(226,122,'大小','小','A'), +(227,122,'大小','中','A'), +(228,122,'大小','大','A'), +(229,122,'甜度','少','A'), +(230,122,'甜度','多','A'), +(231,122,'甜度','超多','A'), +(232,122,'abc','1','A'), +(233,122,'abc','23','A'), +(234,122,'abc','33','D'), +(235,131,'小轿车','','A'), +(236,131,'法拉利','','A'), +(237,131,'兰博基尼','','A'), +(238,122,'234','','A'), +(239,5,'qwe','','D'), +(240,5,'B','w','D'), +(241,5,'B','3','D'), +(242,6,'长度','1','D'), +(243,6,'长度','2','D'), +(244,6,'长度','0','D'), +(245,6,'款式','西米','D'), +(246,6,'款式','红豆','D'), +(247,135,'尺寸','大杯','A'), +(248,135,'尺寸','中杯','A'), +(249,135,'尺寸','小杯','A'), +(250,135,'温度','热','A'), +(251,135,'温度','常温','A'), +(252,135,'温度','冰','A'), +(253,135,'颜色','白色','A'), +(254,135,'颜色','白色','D'), +(255,135,'颜色','黑色','A'), +(258,6,'nihoa','','D'), +(260,2,'大小','M','D'), +(261,2,'大小','XL','D'), +(262,140,'222','333','A'), +(263,141,'123','345','D'), +(264,141,'小','1','D'), +(265,141,'小','2','D'), +(266,3,'颜色','白色','D'), +(267,6,'大小','s','D'), +(268,6,'大小','XXL','D'), +(269,6,'长度','3','D'), +(270,6,'长度','ww','D'), +(271,6,'宽度','1','D'), +(272,1,'卡通图','唐老鸭','D'), +(273,165,'单卖','包装','D'), +(274,165,'单卖','1','A'), +(275,165,'单卖','2','A'), +(276,6,'长度','1M','D'), +(277,6,'长度','2M','D'), +(278,6,'宽度','10CM','D'), +(279,6,'宽度','20CM','D'), +(280,6,'宽度','30CM','D'), +(281,6,'长度','3','D'), +(282,169,'颜色','红色','A'), +(283,169,'颜色','蓝色','A'), +(284,169,'颜色','皇上','D'), +(285,169,'颜色','黄色','A'), +(286,169,'尺码','S','A'), +(287,169,'尺码','M','A'), +(288,169,'尺码','L','A'), +(289,169,'尺码','XL','A'), +(290,169,'尺码','XXL','A'), +(291,1,'卡通图','3','D'), +(292,6,'长度','36','D'), +(293,6,'3','','D'), +(294,6,'宽度','3','D'), +(295,6,'656','','D'), +(296,176,'测试1','25','A'), +(297,177,'规格1','个','A'), +(298,177,'规格2','包','D'), +(299,177,'规格1','包','A'), +(300,181,'颜色','红色','A'), +(301,181,'尺码','S','A'), +(302,181,'颜色','蓝色','A'), +(303,181,'尺码','M','A'), +(304,181,'尺码','L','A'), +(305,6,'颜色','大','D'), +(306,6,'宽度','6','D'), +(307,6,'长度','52','D'), +(308,1,'卡通图','cs','D'), +(309,169,'颜色','213','A'), +(310,183,'颜色','红','A'), +(311,183,'尺码','35','A'), +(312,183,'尺码','36','A'), +(313,183,'尺码','37','A'), +(314,183,'尺码','38','A'), +(315,183,'尺码','39','A'), +(316,183,'尺码','40','A'), +(317,183,'颜色','白','A'), +(318,183,'颜色','黑','A'), +(319,185,'八寸蛋糕','10寸蛋糕','D'), +(320,185,'八寸蛋糕','8寸','D'), +(321,185,'八寸蛋糕','12寸','D'), +(322,185,'八寸蛋糕','15寸','D'), +(323,187,'紫薯包','','D'), +(324,187,'紫薯包','x6','A'), +(325,187,'紫薯包','x12','A'), +(326,187,'紫薯包','x32','A'), +(327,185,'尺寸','8寸','A'), +(328,185,'尺寸','10寸','A'), +(329,185,'尺寸','14寸','A'), +(330,1,'尺码','40','D'), +(331,1,'颜色','白色','A'), +(332,1,'ddd','333','D'), +(333,1,'ddd','222','D'), +(334,1,'ddd','111','D'), +(335,1,'ddd','22','D'), +(336,6,'高度','2M','D'), +(337,6,'高度','3M','D'), +(338,6,'长度','3','D'), +(339,197,'颜色','款式','A'), +(340,199,'分享','20分钟','A'), +(341,199,'预约','30分钟','A'), +(342,6,'高度','黑','D'), +(343,6,'颜色','红','D'), +(344,6,'颜色','黄','D'), +(345,207,'颜色','黑色','A'), +(346,207,'12332','红色','D'), +(347,207,'颜色','黑色','D'), +(348,207,'颜色','红色','A'), +(349,196,'111','11111','A'), +(350,196,'111','1111111','A'), +(351,207,'尺码','S','A'), +(352,207,'尺码','L','A'), +(353,207,'赠礼','1','A'), +(354,207,'赠礼','2','A'), +(355,232,'颜色','白色','A'), +(356,232,'数量','5包','A'), +(357,232,'数量','10包','A'), +(358,232,'颜色','黑色','A'), +(359,233,'22222','22222','A'), +(360,245,'码数','34码','A'), +(361,245,'码数','35码','A'), +(362,245,'码数','36码','A'), +(363,245,'码数','37码','A'), +(364,245,'颜色','红色','A'), +(365,245,'颜色','白色','A'), +(366,245,'颜色','黑色','A'), +(367,2,'xl','xxl','D'), +(368,2,'xl','xl','D'), +(369,2,'l','l','D'), +(370,2,'m','l','D'), +(371,2,'l','22','D'), +(372,305,'颜色','蓝色','A'), +(373,305,'颜色','黑色','A'), +(374,305,'尺码','22','A'), +(375,305,'尺码','23','A'), +(376,2,'l','vv','D'), +(377,358,'热尔特谈','','D'), +(378,358,'111','111','D'), +(379,358,'热尔特谈','111','D'), +(380,358,'热尔特谈','1实物','D'), +(381,358,'热尔特谈','1是qqq','D'), +(382,358,'热尔特谈','111SSS安徽','D'), +(383,358,'热尔特谈','111sss汉字###','D'), +(384,358,'热尔特谈','汉字','D'), +(385,358,'热尔特谈','汉字sss','D'), +(386,358,'i0p','h8iuh','A'), +(387,358,'i0p','oljiho;ok\'','A'), +(388,361,'111','111','A'), +(389,361,'111','222','A'), +(390,361,'111','111','A'), +(391,361,'111','444','A'), +(392,361,'111','77','D'), +(393,361,'111','11111','A'), +(394,2,'m','隔热','D'), +(395,2,'l','1','D'), +(396,6,'chicun','1','D'), +(397,6,'chicun','2','D'), +(398,6,'chicun','3','D'), +(399,6,'颜色','中','D'), +(400,6,'颜色','小','D'), +(401,3,'大小','12G','A'), +(402,4,'着色','白','A'), +(403,4,'着色','红','A'), +(404,4,'大小','11','A'), +(405,4,'大小','22','A'), +(406,378,'杯','60ml','D'), +(407,378,'瓶','750ml','D'), +(408,6,'颜色','111','D'), +(409,6,'111','111111','D'), +(410,378,'5','6','D'), +(411,378,'5','6','D'), +(412,378,'瓶','100','D'), +(413,382,'温度','正常冰','A'), +(414,382,'温度','少冰','A'), +(415,382,'温度','去冰','A'), +(416,382,'甜度','正常糖(推荐)','A'), +(417,382,'甜度','少糖','A'), +(418,382,'甜度','不另外放糖(不推荐)','A'), +(419,382,'特殊口味','标准搭配','A'), +(420,382,'脆波波','','D'), +(421,1,'颜色','蓝色','A'), +(422,1,'重量','1KG','D'), +(423,1,'重量','2KG','D'), +(424,1,'长度','11','D'), +(425,1,'长度','22','D'), +(426,6,'111','11','D'), +(427,6,'111','11','D'), +(428,6,'111','22','D'), +(429,3,'颜色','蓝色','A'), +(430,384,'时长','12','A'), +(431,1,'尺码','45','A'), +(432,1,'尺码','55','A'); + +/*Table structure for table `mt_merchant` */ + +DROP TABLE IF EXISTS `mt_merchant`; + +CREATE TABLE `mt_merchant` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `TYPE` varchar(30) DEFAULT '' COMMENT '类型,restaurant:餐饮;retail:零售;service:服务;other:其他', + `LOGO` varchar(255) DEFAULT '' COMMENT 'logo', + `NO` varchar(20) NOT NULL DEFAULT '' COMMENT '商户号', + `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '商户名称', + `CONTACT` varchar(30) DEFAULT '' COMMENT '联系人姓名', + `PHONE` varchar(20) DEFAULT '' COMMENT '联系电话', + `ADDRESS` varchar(100) DEFAULT '' COMMENT '联系地址', + `WX_APP_ID` varchar(50) DEFAULT '' COMMENT '微信小程序appId', + `WX_APP_SECRET` varchar(50) DEFAULT '' COMMENT '微信小程序秘钥', + `WX_OFFICIAL_APP_ID` varchar(50) DEFAULT '' COMMENT '微信公众号appId', + `WX_OFFICIAL_APP_SECRET` varchar(50) DEFAULT '' COMMENT '微信公众号秘钥', + `SETTLE_RATE` decimal(10,0) DEFAULT NULL COMMENT '结算比例', + `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注信息', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:有效/启用;D:无效', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商户表'; + +/*Data for the table `mt_merchant` */ + +insert into `mt_merchant`(`ID`,`TYPE`,`LOGO`,`NO`,`NAME`,`CONTACT`,`PHONE`,`ADDRESS`,`WX_APP_ID`,`WX_APP_SECRET`,`WX_OFFICIAL_APP_ID`,`WX_OFFICIAL_APP_SECRET`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values +(1,'','/uploads/20230804/8e5893378bec4b8ab3cabb77e15162d2.PNG','10001','小隅安商行','安安','18976679980','海口市永万路7号','','','','','默认','2023-08-01 12:03:55','2023-08-04 09:55:37','A','fuint'), +(2,'','/uploads/20230804/11f9b3135db043488e4b9bdcadda9f56.png','10002','延禾技术','FSQ','18976679980','海口市国兴大道100号','','','','','测试','2023-08-01 14:04:14','2023-08-04 09:56:04','A','fuint'); + +/*Table structure for table `mt_message` */ + +DROP TABLE IF EXISTS `mt_message`; + +CREATE TABLE `mt_message` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `USER_ID` int NOT NULL COMMENT '用户ID', + `TYPE` varchar(30) NOT NULL DEFAULT '' COMMENT '消息类型', + `TITLE` varchar(200) DEFAULT '友情提示' COMMENT '消息标题', + `CONTENT` varchar(500) NOT NULL DEFAULT '' COMMENT '消息内容', + `IS_READ` char(1) DEFAULT 'N' COMMENT '是否已读', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `PARAMS` varchar(1000) DEFAULT '' COMMENT '参数信息', + `IS_SEND` char(1) DEFAULT 'N' COMMENT '是否已发送', + `SEND_TIME` datetime DEFAULT NULL COMMENT '发送时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`), + KEY `index_user_id` (`USER_ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统消息表'; + +/*Data for the table `mt_message` */ + +/*Table structure for table `mt_open_gift` */ + +DROP TABLE IF EXISTS `mt_open_gift`; + +CREATE TABLE `mt_open_gift` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '门店ID', + `GRADE_ID` int NOT NULL DEFAULT '0' COMMENT '会员等级ID', + `POINT` int NOT NULL DEFAULT '0' COMMENT '赠送积分', + `COUPON_ID` int NOT NULL DEFAULT '0' COMMENT '卡券ID', + `COUPON_NUM` int NOT NULL DEFAULT '1' COMMENT '卡券数量', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8 COMMENT='会员开卡赠礼'; + +/*Data for the table `mt_open_gift` */ + +insert into `mt_open_gift`(`ID`,`MERCHANT_ID`,`STORE_ID`,`GRADE_ID`,`POINT`,`COUPON_ID`,`COUPON_NUM`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values +(115,1,0,1,1000,0,0,'2023-07-24 20:06:48','2023-07-24 20:06:48','A','fuint'), +(116,1,0,1,0,153,1,'2023-07-24 22:17:38','2023-07-24 22:17:38','A','fuint'); + +/*Table structure for table `mt_open_gift_item` */ + +DROP TABLE IF EXISTS `mt_open_gift_item`; + +CREATE TABLE `mt_open_gift_item` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `USER_ID` int NOT NULL COMMENT '会用ID', + `OPEN_GIFT_ID` int NOT NULL COMMENT '赠礼ID', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `STATUS` char(1) NOT NULL COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf32 COMMENT='开卡赠礼明细表'; + +/*Data for the table `mt_open_gift_item` */ + +/*Table structure for table `mt_order` */ + +DROP TABLE IF EXISTS `mt_order`; + +CREATE TABLE `mt_order` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `TYPE` varchar(30) DEFAULT NULL COMMENT '订单类型', + `PAY_TYPE` varchar(30) DEFAULT 'JSAPI' COMMENT '支付类型', + `ORDER_MODE` varchar(30) DEFAULT 'express' COMMENT '订单模式', + `PLATFORM` varchar(30) DEFAULT '' COMMENT '平台', + `ORDER_SN` varchar(32) NOT NULL DEFAULT '' COMMENT '订单号', + `COUPON_ID` int DEFAULT '0' COMMENT '卡券ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID', + `VERIFY_CODE` varchar(10) DEFAULT '' COMMENT '核销验证码', + `IS_VISITOR` char(1) DEFAULT 'N' COMMENT '是否游客', + `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '订单金额', + `PAY_AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '支付金额', + `USE_POINT` int DEFAULT '0' COMMENT '使用积分数量', + `POINT_AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '积分金额', + `DISCOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '折扣金额', + `DELIVERY_FEE` decimal(10,2) DEFAULT '0.00' COMMENT '配送费用', + `PARAM` varchar(500) DEFAULT '' COMMENT '订单参数', + `EXPRESS_INFO` varchar(500) DEFAULT '' COMMENT '物流信息', + `REMARK` varchar(500) DEFAULT '' COMMENT '用户备注', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '订单状态', + `PAY_TIME` datetime DEFAULT NULL COMMENT '支付时间', + `PAY_STATUS` char(1) DEFAULT '' COMMENT '支付状态', + `SETTLE_STATUS` char(1) DEFAULT 'A' COMMENT '结算状态', + `STAFF_ID` int DEFAULT '0' COMMENT '操作员工', + `CONFIRM_STATUS` char(1) DEFAULT 'N' COMMENT '核销状态', + `CONFIRM_TIME` datetime DEFAULT NULL COMMENT '核销时间', + `CONFIRM_REMARK` varchar(500) DEFAULT NULL COMMENT '核销备注', + `COMMISSION_STATUS` char(1) DEFAULT 'A' COMMENT '分佣提成计算状态', + `COMMISSION_USER_ID` int DEFAULT '0' COMMENT '分佣提成用户ID', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表'; + +/*Data for the table `mt_order` */ + +/*Table structure for table `mt_order_address` */ + +DROP TABLE IF EXISTS `mt_order_address`; + +CREATE TABLE `mt_order_address` ( + `ID` int unsigned NOT NULL AUTO_INCREMENT COMMENT '地址ID', + `NAME` varchar(30) NOT NULL DEFAULT '' COMMENT '收货人姓名', + `MOBILE` varchar(20) NOT NULL DEFAULT '' COMMENT '联系电话', + `PROVINCE_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '省份ID', + `CITY_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '城市ID', + `REGION_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '区/县ID', + `DETAIL` varchar(255) NOT NULL DEFAULT '' COMMENT '详细地址', + `ORDER_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '订单ID', + `USER_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`ID`) USING BTREE, + KEY `ORDER_ID` (`ORDER_ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单收货地址记录表'; + +/*Data for the table `mt_order_address` */ + +/*Table structure for table `mt_order_goods` */ + +DROP TABLE IF EXISTS `mt_order_goods`; + +CREATE TABLE `mt_order_goods` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `ORDER_ID` int NOT NULL DEFAULT '0' COMMENT '订单ID', + `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID', + `SKU_ID` int DEFAULT '0' COMMENT 'skuID', + `PRICE` decimal(10,2) DEFAULT '0.00' COMMENT '价格', + `DISCOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '优惠价', + `NUM` double(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品数量', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单商品表'; + +/*Data for the table `mt_order_goods` */ + +/*Table structure for table `mt_point` */ + +DROP TABLE IF EXISTS `mt_point`; + +CREATE TABLE `mt_point` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID', + `ORDER_SN` varchar(32) DEFAULT '' COMMENT '订单号', + `AMOUNT` int NOT NULL DEFAULT '0' COMMENT '积分变化数量', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `DESCRIPTION` varchar(200) DEFAULT '' COMMENT '备注说明', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A正常;D作废', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='积分变化表'; + +/*Data for the table `mt_point` */ + +insert into `mt_point`(`ID`,`MERCHANT_ID`,`STORE_ID`,`USER_ID`,`ORDER_SN`,`AMOUNT`,`CREATE_TIME`,`UPDATE_TIME`,`DESCRIPTION`,`OPERATOR`,`STATUS`) values +(1,0,0,163,'202309082158244549616',-1000,'2023-09-08 21:58:24','2023-09-08 21:58:24','支付扣除1000积分','','A'), +(2,0,0,163,'202309082158244549616',1000,'2023-09-10 09:58:01','2023-09-10 09:58:01','订单取消202309082158244549616退回1000积分','','A'), +(3,2,7,6143,'',1000,'2023-09-18 18:02:17','2023-09-18 18:02:17','开卡赠送1000积分','系统','A'), +(5,1,3,163,'202309201800308947963',-1000,'2023-09-20 18:00:31','2023-09-20 18:00:31','支付扣除1000积分','','A'), +(6,1,2,1,'',1000,'2023-10-19 09:39:45','2023-10-19 09:39:45','开卡赠送1000积分','系统','A'), +(7,1,3,1,'',1000,'2024-04-09 14:40:19','2024-04-09 14:40:19','开卡赠送1000积分','系统','A'), +(8,1,3,2,'',1000,'2024-04-09 14:40:21','2024-04-09 14:40:21','开卡赠送1000积分','系统','A'); + +/*Table structure for table `mt_printer` */ + +DROP TABLE IF EXISTS `mt_printer`; + +CREATE TABLE `mt_printer` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `SN` varchar(64) DEFAULT NULL COMMENT '打印机编号', + `NAME` varchar(64) DEFAULT NULL COMMENT '打印机名称', + `AUTO_PRINT` char(1) DEFAULT 'N' COMMENT '是否自动打印', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `DESCRIPTION` varchar(255) DEFAULT '' COMMENT '备注说明', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A正常;D作废', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='打印机表'; + +/*Data for the table `mt_printer` */ + +/*Table structure for table `mt_refund` */ + +DROP TABLE IF EXISTS `mt_refund`; + +CREATE TABLE `mt_refund` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `ORDER_ID` int NOT NULL COMMENT '订单ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `USER_ID` int NOT NULL COMMENT '会员ID', + `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '退款金额', + `TYPE` varchar(20) DEFAULT '' COMMENT '售后类型', + `REMARK` varchar(500) DEFAULT '' COMMENT '退款备注', + `EXPRESS_NAME` varchar(30) DEFAULT '' COMMENT '物流公司', + `EXPRESS_NO` varchar(30) DEFAULT '' COMMENT '物流单号', + `REJECT_REASON` varchar(1000) DEFAULT NULL COMMENT '拒绝原因', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + `IMAGES` varchar(1000) DEFAULT NULL COMMENT '图片', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='售后表'; + +/*Data for the table `mt_refund` */ + +/*Table structure for table `mt_region` */ + +DROP TABLE IF EXISTS `mt_region`; + +CREATE TABLE `mt_region` ( + `ID` int unsigned NOT NULL AUTO_INCREMENT COMMENT '区划信息ID', + `NAME` varchar(255) NOT NULL DEFAULT '' COMMENT '区划名称', + `PID` int unsigned NOT NULL DEFAULT '0' COMMENT '父级ID', + `CODE` varchar(255) NOT NULL DEFAULT '' COMMENT '区划编码', + `LEVEL` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '层级(1省级 2市级 3区/县级)', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=3705 DEFAULT CHARSET=utf8 COMMENT='省市区数据表'; + +/*Data for the table `mt_region` */ + +insert into `mt_region`(`ID`,`NAME`,`PID`,`CODE`,`LEVEL`) values +(1,'北京',0,'110000',1), +(2,'北京市',1,'110010',2), +(3,'东城区',2,'110101',3), +(4,'西城区',2,'110102',3), +(5,'朝阳区',2,'110105',3), +(6,'丰台区',2,'110106',3), +(7,'石景山区',2,'110107',3), +(8,'海淀区',2,'110108',3), +(9,'门头沟区',2,'110109',3), +(10,'房山区',2,'110111',3), +(11,'通州区',2,'110112',3), +(12,'顺义区',2,'110113',3), +(13,'昌平区',2,'110114',3), +(14,'大兴区',2,'110115',3), +(15,'怀柔区',2,'110116',3), +(16,'平谷区',2,'110117',3), +(17,'密云区',2,'110118',3), +(18,'延庆区',2,'110119',3), +(19,'天津',0,'120000',1), +(20,'天津市',19,'120010',2), +(21,'和平区',20,'120101',3), +(22,'河东区',20,'120102',3), +(23,'河西区',20,'120103',3), +(24,'南开区',20,'120104',3), +(25,'河北区',20,'120105',3), +(26,'红桥区',20,'120106',3), +(27,'东丽区',20,'120110',3), +(28,'西青区',20,'120111',3), +(29,'津南区',20,'120112',3), +(30,'北辰区',20,'120113',3), +(31,'武清区',20,'120114',3), +(32,'宝坻区',20,'120115',3), +(33,'滨海新区',20,'120116',3), +(34,'宁河区',20,'120117',3), +(35,'静海区',20,'120118',3), +(36,'蓟州区',20,'120119',3), +(37,'河北省',0,'130000',1), +(38,'石家庄市',37,'130100',2), +(39,'长安区',38,'130102',3), +(40,'桥西区',38,'130104',3), +(41,'新华区',38,'130105',3), +(42,'井陉矿区',38,'130107',3), +(43,'裕华区',38,'130108',3), +(44,'藁城区',38,'130109',3), +(45,'鹿泉区',38,'130110',3), +(46,'栾城区',38,'130111',3), +(47,'井陉县',38,'130121',3), +(48,'正定县',38,'130123',3), +(49,'行唐县',38,'130125',3), +(50,'灵寿县',38,'130126',3), +(51,'高邑县',38,'130127',3), +(52,'深泽县',38,'130128',3), +(53,'赞皇县',38,'130129',3), +(54,'无极县',38,'130130',3), +(55,'平山县',38,'130131',3), +(56,'元氏县',38,'130132',3), +(57,'赵县',38,'130133',3), +(58,'辛集市',38,'130181',3), +(59,'晋州市',38,'130183',3), +(60,'新乐市',38,'130184',3), +(61,'唐山市',37,'130200',2), +(62,'路南区',61,'130202',3), +(63,'路北区',61,'130203',3), +(64,'古冶区',61,'130204',3), +(65,'开平区',61,'130205',3), +(66,'丰南区',61,'130207',3), +(67,'丰润区',61,'130208',3), +(68,'曹妃甸区',61,'130209',3), +(69,'滦南县',61,'130224',3), +(70,'乐亭县',61,'130225',3), +(71,'迁西县',61,'130227',3), +(72,'玉田县',61,'130229',3), +(73,'遵化市',61,'130281',3), +(74,'迁安市',61,'130283',3), +(75,'滦州市',61,'130284',3), +(76,'秦皇岛市',37,'130300',2), +(77,'海港区',76,'130302',3), +(78,'山海关区',76,'130303',3), +(79,'北戴河区',76,'130304',3), +(80,'抚宁区',76,'130306',3), +(81,'青龙满族自治县',76,'130321',3), +(82,'昌黎县',76,'130322',3), +(83,'卢龙县',76,'130324',3), +(84,'邯郸市',37,'130400',2), +(85,'邯山区',84,'130402',3), +(86,'丛台区',84,'130403',3), +(87,'复兴区',84,'130404',3), +(88,'峰峰矿区',84,'130406',3), +(89,'肥乡区',84,'130407',3), +(90,'永年区',84,'130408',3), +(91,'临漳县',84,'130423',3), +(92,'成安县',84,'130424',3), +(93,'大名县',84,'130425',3), +(94,'涉县',84,'130426',3), +(95,'磁县',84,'130427',3), +(96,'邱县',84,'130430',3), +(97,'鸡泽县',84,'130431',3), +(98,'广平县',84,'130432',3), +(99,'馆陶县',84,'130433',3), +(100,'魏县',84,'130434',3), +(101,'曲周县',84,'130435',3), +(102,'武安市',84,'130481',3), +(103,'邢台市',37,'130500',2), +(104,'桥东区',103,'130502',3), +(105,'桥西区',103,'130503',3), +(106,'邢台县',103,'130521',3), +(107,'临城县',103,'130522',3), +(108,'内丘县',103,'130523',3), +(109,'柏乡县',103,'130524',3), +(110,'隆尧县',103,'130525',3), +(111,'任县',103,'130526',3), +(112,'南和县',103,'130527',3), +(113,'宁晋县',103,'130528',3), +(114,'巨鹿县',103,'130529',3), +(115,'新河县',103,'130530',3), +(116,'广宗县',103,'130531',3), +(117,'平乡县',103,'130532',3), +(118,'威县',103,'130533',3), +(119,'清河县',103,'130534',3), +(120,'临西县',103,'130535',3), +(121,'南宫市',103,'130581',3), +(122,'沙河市',103,'130582',3), +(123,'保定市',37,'130600',2), +(124,'竞秀区',123,'130602',3), +(125,'莲池区',123,'130606',3), +(126,'满城区',123,'130607',3), +(127,'清苑区',123,'130608',3), +(128,'徐水区',123,'130609',3), +(129,'涞水县',123,'130623',3), +(130,'阜平县',123,'130624',3), +(131,'定兴县',123,'130626',3), +(132,'唐县',123,'130627',3), +(133,'高阳县',123,'130628',3), +(134,'容城县',123,'130629',3), +(135,'涞源县',123,'130630',3), +(136,'望都县',123,'130631',3), +(137,'安新县',123,'130632',3), +(138,'易县',123,'130633',3), +(139,'曲阳县',123,'130634',3), +(140,'蠡县',123,'130635',3), +(141,'顺平县',123,'130636',3), +(142,'博野县',123,'130637',3), +(143,'雄县',123,'130638',3), +(144,'涿州市',123,'130681',3), +(145,'定州市',123,'130682',3), +(146,'安国市',123,'130683',3), +(147,'高碑店市',123,'130684',3), +(148,'张家口市',37,'130700',2), +(149,'桥东区',148,'130702',3), +(150,'桥西区',148,'130703',3), +(151,'宣化区',148,'130705',3), +(152,'下花园区',148,'130706',3), +(153,'万全区',148,'130708',3), +(154,'崇礼区',148,'130709',3), +(155,'张北县',148,'130722',3), +(156,'康保县',148,'130723',3), +(157,'沽源县',148,'130724',3), +(158,'尚义县',148,'130725',3), +(159,'蔚县',148,'130726',3), +(160,'阳原县',148,'130727',3), +(161,'怀安县',148,'130728',3), +(162,'怀来县',148,'130730',3), +(163,'涿鹿县',148,'130731',3), +(164,'赤城县',148,'130732',3), +(165,'承德市',37,'130800',2), +(166,'双桥区',165,'130802',3), +(167,'双滦区',165,'130803',3), +(168,'鹰手营子矿区',165,'130804',3), +(169,'承德县',165,'130821',3), +(170,'兴隆县',165,'130822',3), +(171,'滦平县',165,'130824',3), +(172,'隆化县',165,'130825',3), +(173,'丰宁满族自治县',165,'130826',3), +(174,'宽城满族自治县',165,'130827',3), +(175,'围场满族蒙古族自治县',165,'130828',3), +(176,'平泉市',165,'130881',3), +(177,'沧州市',37,'130900',2), +(178,'新华区',177,'130902',3), +(179,'运河区',177,'130903',3), +(180,'沧县',177,'130921',3), +(181,'青县',177,'130922',3), +(182,'东光县',177,'130923',3), +(183,'海兴县',177,'130924',3), +(184,'盐山县',177,'130925',3), +(185,'肃宁县',177,'130926',3), +(186,'南皮县',177,'130927',3), +(187,'吴桥县',177,'130928',3), +(188,'献县',177,'130929',3), +(189,'孟村回族自治县',177,'130930',3), +(190,'泊头市',177,'130981',3), +(191,'任丘市',177,'130982',3), +(192,'黄骅市',177,'130983',3), +(193,'河间市',177,'130984',3), +(194,'廊坊市',37,'131000',2), +(195,'安次区',194,'131002',3), +(196,'广阳区',194,'131003',3), +(197,'固安县',194,'131022',3), +(198,'永清县',194,'131023',3), +(199,'香河县',194,'131024',3), +(200,'大城县',194,'131025',3), +(201,'文安县',194,'131026',3), +(202,'大厂回族自治县',194,'131028',3), +(203,'霸州市',194,'131081',3), +(204,'三河市',194,'131082',3), +(205,'衡水市',37,'131100',2), +(206,'桃城区',205,'131102',3), +(207,'冀州区',205,'131103',3), +(208,'枣强县',205,'131121',3), +(209,'武邑县',205,'131122',3), +(210,'武强县',205,'131123',3), +(211,'饶阳县',205,'131124',3), +(212,'安平县',205,'131125',3), +(213,'故城县',205,'131126',3), +(214,'景县',205,'131127',3), +(215,'阜城县',205,'131128',3), +(216,'深州市',205,'131182',3), +(217,'山西省',0,'140000',1), +(218,'太原市',217,'140100',2), +(219,'小店区',218,'140105',3), +(220,'迎泽区',218,'140106',3), +(221,'杏花岭区',218,'140107',3), +(222,'尖草坪区',218,'140108',3), +(223,'万柏林区',218,'140109',3), +(224,'晋源区',218,'140110',3), +(225,'清徐县',218,'140121',3), +(226,'阳曲县',218,'140122',3), +(227,'娄烦县',218,'140123',3), +(228,'古交市',218,'140181',3), +(229,'大同市',217,'140200',2), +(230,'新荣区',229,'140212',3), +(231,'平城区',229,'140213',3), +(232,'云冈区',229,'140214',3), +(233,'云州区',229,'140215',3), +(234,'阳高县',229,'140221',3), +(235,'天镇县',229,'140222',3), +(236,'广灵县',229,'140223',3), +(237,'灵丘县',229,'140224',3), +(238,'浑源县',229,'140225',3), +(239,'左云县',229,'140226',3), +(240,'阳泉市',217,'140300',2), +(241,'城区',240,'140302',3), +(242,'矿区',240,'140303',3), +(243,'郊区',240,'140311',3), +(244,'平定县',240,'140321',3), +(245,'盂县',240,'140322',3), +(246,'长治市',217,'140400',2), +(247,'潞州区',246,'140403',3), +(248,'上党区',246,'140404',3), +(249,'屯留区',246,'140405',3), +(250,'潞城区',246,'140406',3), +(251,'襄垣县',246,'140423',3), +(252,'平顺县',246,'140425',3), +(253,'黎城县',246,'140426',3), +(254,'壶关县',246,'140427',3), +(255,'长子县',246,'140428',3), +(256,'武乡县',246,'140429',3), +(257,'沁县',246,'140430',3), +(258,'沁源县',246,'140431',3), +(259,'晋城市',217,'140500',2), +(260,'城区',259,'140502',3), +(261,'沁水县',259,'140521',3), +(262,'阳城县',259,'140522',3), +(263,'陵川县',259,'140524',3), +(264,'泽州县',259,'140525',3), +(265,'高平市',259,'140581',3), +(266,'朔州市',217,'140600',2), +(267,'朔城区',266,'140602',3), +(268,'平鲁区',266,'140603',3), +(269,'山阴县',266,'140621',3), +(270,'应县',266,'140622',3), +(271,'右玉县',266,'140623',3), +(272,'怀仁市',266,'140681',3), +(273,'晋中市',217,'140700',2), +(274,'榆次区',273,'140702',3), +(275,'太谷区',273,'140703',3), +(276,'榆社县',273,'140721',3), +(277,'左权县',273,'140722',3), +(278,'和顺县',273,'140723',3), +(279,'昔阳县',273,'140724',3), +(280,'寿阳县',273,'140725',3), +(281,'祁县',273,'140727',3), +(282,'平遥县',273,'140728',3), +(283,'灵石县',273,'140729',3), +(284,'介休市',273,'140781',3), +(285,'运城市',217,'140800',2), +(286,'盐湖区',285,'140802',3), +(287,'临猗县',285,'140821',3), +(288,'万荣县',285,'140822',3), +(289,'闻喜县',285,'140823',3), +(290,'稷山县',285,'140824',3), +(291,'新绛县',285,'140825',3), +(292,'绛县',285,'140826',3), +(293,'垣曲县',285,'140827',3), +(294,'夏县',285,'140828',3), +(295,'平陆县',285,'140829',3), +(296,'芮城县',285,'140830',3), +(297,'永济市',285,'140881',3), +(298,'河津市',285,'140882',3), +(299,'忻州市',217,'140900',2), +(300,'忻府区',299,'140902',3), +(301,'定襄县',299,'140921',3), +(302,'五台县',299,'140922',3), +(303,'代县',299,'140923',3), +(304,'繁峙县',299,'140924',3), +(305,'宁武县',299,'140925',3), +(306,'静乐县',299,'140926',3), +(307,'神池县',299,'140927',3), +(308,'五寨县',299,'140928',3), +(309,'岢岚县',299,'140929',3), +(310,'河曲县',299,'140930',3), +(311,'保德县',299,'140931',3), +(312,'偏关县',299,'140932',3), +(313,'原平市',299,'140981',3), +(314,'临汾市',217,'141000',2), +(315,'尧都区',314,'141002',3), +(316,'曲沃县',314,'141021',3), +(317,'翼城县',314,'141022',3), +(318,'襄汾县',314,'141023',3), +(319,'洪洞县',314,'141024',3), +(320,'古县',314,'141025',3), +(321,'安泽县',314,'141026',3), +(322,'浮山县',314,'141027',3), +(323,'吉县',314,'141028',3), +(324,'乡宁县',314,'141029',3), +(325,'大宁县',314,'141030',3), +(326,'隰县',314,'141031',3), +(327,'永和县',314,'141032',3), +(328,'蒲县',314,'141033',3), +(329,'汾西县',314,'141034',3), +(330,'侯马市',314,'141081',3), +(331,'霍州市',314,'141082',3), +(332,'吕梁市',217,'141100',2), +(333,'离石区',332,'141102',3), +(334,'文水县',332,'141121',3), +(335,'交城县',332,'141122',3), +(336,'兴县',332,'141123',3), +(337,'临县',332,'141124',3), +(338,'柳林县',332,'141125',3), +(339,'石楼县',332,'141126',3), +(340,'岚县',332,'141127',3), +(341,'方山县',332,'141128',3), +(342,'中阳县',332,'141129',3), +(343,'交口县',332,'141130',3), +(344,'孝义市',332,'141181',3), +(345,'汾阳市',332,'141182',3), +(346,'内蒙古自治区',0,'150000',1), +(347,'呼和浩特市',346,'150100',2), +(348,'新城区',347,'150102',3), +(349,'回民区',347,'150103',3), +(350,'玉泉区',347,'150104',3), +(351,'赛罕区',347,'150105',3), +(352,'土默特左旗',347,'150121',3), +(353,'托克托县',347,'150122',3), +(354,'和林格尔县',347,'150123',3), +(355,'清水河县',347,'150124',3), +(356,'武川县',347,'150125',3), +(357,'包头市',346,'150200',2), +(358,'东河区',357,'150202',3), +(359,'昆都仑区',357,'150203',3), +(360,'青山区',357,'150204',3), +(361,'石拐区',357,'150205',3), +(362,'白云鄂博矿区',357,'150206',3), +(363,'九原区',357,'150207',3), +(364,'土默特右旗',357,'150221',3), +(365,'固阳县',357,'150222',3), +(366,'达尔罕茂明安联合旗',357,'150223',3), +(367,'乌海市',346,'150300',2), +(368,'海勃湾区',367,'150302',3), +(369,'海南区',367,'150303',3), +(370,'乌达区',367,'150304',3), +(371,'赤峰市',346,'150400',2), +(372,'红山区',371,'150402',3), +(373,'元宝山区',371,'150403',3), +(374,'松山区',371,'150404',3), +(375,'阿鲁科尔沁旗',371,'150421',3), +(376,'巴林左旗',371,'150422',3), +(377,'巴林右旗',371,'150423',3), +(378,'林西县',371,'150424',3), +(379,'克什克腾旗',371,'150425',3), +(380,'翁牛特旗',371,'150426',3), +(381,'喀喇沁旗',371,'150428',3), +(382,'宁城县',371,'150429',3), +(383,'敖汉旗',371,'150430',3), +(384,'通辽市',346,'150500',2), +(385,'科尔沁区',384,'150502',3), +(386,'科尔沁左翼中旗',384,'150521',3), +(387,'科尔沁左翼后旗',384,'150522',3), +(388,'开鲁县',384,'150523',3), +(389,'库伦旗',384,'150524',3), +(390,'奈曼旗',384,'150525',3), +(391,'扎鲁特旗',384,'150526',3), +(392,'霍林郭勒市',384,'150581',3), +(393,'鄂尔多斯市',346,'150600',2), +(394,'东胜区',393,'150602',3), +(395,'康巴什区',393,'150603',3), +(396,'达拉特旗',393,'150621',3), +(397,'准格尔旗',393,'150622',3), +(398,'鄂托克前旗',393,'150623',3), +(399,'鄂托克旗',393,'150624',3), +(400,'杭锦旗',393,'150625',3), +(401,'乌审旗',393,'150626',3), +(402,'伊金霍洛旗',393,'150627',3), +(403,'呼伦贝尔市',346,'150700',2), +(404,'海拉尔区',403,'150702',3), +(405,'扎赉诺尔区',403,'150703',3), +(406,'阿荣旗',403,'150721',3), +(407,'莫力达瓦达斡尔族自治旗',403,'150722',3), +(408,'鄂伦春自治旗',403,'150723',3), +(409,'鄂温克族自治旗',403,'150724',3), +(410,'陈巴尔虎旗',403,'150725',3), +(411,'新巴尔虎左旗',403,'150726',3), +(412,'新巴尔虎右旗',403,'150727',3), +(413,'满洲里市',403,'150781',3), +(414,'牙克石市',403,'150782',3), +(415,'扎兰屯市',403,'150783',3), +(416,'额尔古纳市',403,'150784',3), +(417,'根河市',403,'150785',3), +(418,'巴彦淖尔市',346,'150800',2), +(419,'临河区',418,'150802',3), +(420,'五原县',418,'150821',3), +(421,'磴口县',418,'150822',3), +(422,'乌拉特前旗',418,'150823',3), +(423,'乌拉特中旗',418,'150824',3), +(424,'乌拉特后旗',418,'150825',3), +(425,'杭锦后旗',418,'150826',3), +(426,'乌兰察布市',346,'150900',2), +(427,'集宁区',426,'150902',3), +(428,'卓资县',426,'150921',3), +(429,'化德县',426,'150922',3), +(430,'商都县',426,'150923',3), +(431,'兴和县',426,'150924',3), +(432,'凉城县',426,'150925',3), +(433,'察哈尔右翼前旗',426,'150926',3), +(434,'察哈尔右翼中旗',426,'150927',3), +(435,'察哈尔右翼后旗',426,'150928',3), +(436,'四子王旗',426,'150929',3), +(437,'丰镇市',426,'150981',3), +(438,'兴安盟',346,'152200',2), +(439,'乌兰浩特市',438,'152201',3), +(440,'阿尔山市',438,'152202',3), +(441,'科尔沁右翼前旗',438,'152221',3), +(442,'科尔沁右翼中旗',438,'152222',3), +(443,'扎赉特旗',438,'152223',3), +(444,'突泉县',438,'152224',3), +(445,'锡林郭勒盟',346,'152500',2), +(446,'二连浩特市',445,'152501',3), +(447,'锡林浩特市',445,'152502',3), +(448,'阿巴嘎旗',445,'152522',3), +(449,'苏尼特左旗',445,'152523',3), +(450,'苏尼特右旗',445,'152524',3), +(451,'东乌珠穆沁旗',445,'152525',3), +(452,'西乌珠穆沁旗',445,'152526',3), +(453,'太仆寺旗',445,'152527',3), +(454,'镶黄旗',445,'152528',3), +(455,'正镶白旗',445,'152529',3), +(456,'正蓝旗',445,'152530',3), +(457,'多伦县',445,'152531',3), +(458,'阿拉善盟',346,'152900',2), +(459,'阿拉善左旗',458,'152921',3), +(460,'阿拉善右旗',458,'152922',3), +(461,'额济纳旗',458,'152923',3), +(462,'辽宁省',0,'210000',1), +(463,'沈阳市',462,'210100',2), +(464,'和平区',463,'210102',3), +(465,'沈河区',463,'210103',3), +(466,'大东区',463,'210104',3), +(467,'皇姑区',463,'210105',3), +(468,'铁西区',463,'210106',3), +(469,'苏家屯区',463,'210111',3), +(470,'浑南区',463,'210112',3), +(471,'沈北新区',463,'210113',3), +(472,'于洪区',463,'210114',3), +(473,'辽中区',463,'210115',3), +(474,'康平县',463,'210123',3), +(475,'法库县',463,'210124',3), +(476,'新民市',463,'210181',3), +(477,'大连市',462,'210200',2), +(478,'中山区',477,'210202',3), +(479,'西岗区',477,'210203',3), +(480,'沙河口区',477,'210204',3), +(481,'甘井子区',477,'210211',3), +(482,'旅顺口区',477,'210212',3), +(483,'金州区',477,'210213',3), +(484,'普兰店区',477,'210214',3), +(485,'长海县',477,'210224',3), +(486,'瓦房店市',477,'210281',3), +(487,'庄河市',477,'210283',3), +(488,'鞍山市',462,'210300',2), +(489,'铁东区',488,'210302',3), +(490,'铁西区',488,'210303',3), +(491,'立山区',488,'210304',3), +(492,'千山区',488,'210311',3), +(493,'台安县',488,'210321',3), +(494,'岫岩满族自治县',488,'210323',3), +(495,'海城市',488,'210381',3), +(496,'抚顺市',462,'210400',2), +(497,'新抚区',496,'210402',3), +(498,'东洲区',496,'210403',3), +(499,'望花区',496,'210404',3), +(500,'顺城区',496,'210411',3), +(501,'抚顺县',496,'210421',3), +(502,'新宾满族自治县',496,'210422',3), +(503,'清原满族自治县',496,'210423',3), +(504,'本溪市',462,'210500',2), +(505,'平山区',504,'210502',3), +(506,'溪湖区',504,'210503',3), +(507,'明山区',504,'210504',3), +(508,'南芬区',504,'210505',3), +(509,'本溪满族自治县',504,'210521',3), +(510,'桓仁满族自治县',504,'210522',3), +(511,'丹东市',462,'210600',2), +(512,'元宝区',511,'210602',3), +(513,'振兴区',511,'210603',3), +(514,'振安区',511,'210604',3), +(515,'宽甸满族自治县',511,'210624',3), +(516,'东港市',511,'210681',3), +(517,'凤城市',511,'210682',3), +(518,'锦州市',462,'210700',2), +(519,'古塔区',518,'210702',3), +(520,'凌河区',518,'210703',3), +(521,'太和区',518,'210711',3), +(522,'黑山县',518,'210726',3), +(523,'义县',518,'210727',3), +(524,'凌海市',518,'210781',3), +(525,'北镇市',518,'210782',3), +(526,'营口市',462,'210800',2), +(527,'站前区',526,'210802',3), +(528,'西市区',526,'210803',3), +(529,'鲅鱼圈区',526,'210804',3), +(530,'老边区',526,'210811',3), +(531,'盖州市',526,'210881',3), +(532,'大石桥市',526,'210882',3), +(533,'阜新市',462,'210900',2), +(534,'海州区',533,'210902',3), +(535,'新邱区',533,'210903',3), +(536,'太平区',533,'210904',3), +(537,'清河门区',533,'210905',3), +(538,'细河区',533,'210911',3), +(539,'阜新蒙古族自治县',533,'210921',3), +(540,'彰武县',533,'210922',3), +(541,'辽阳市',462,'211000',2), +(542,'白塔区',541,'211002',3), +(543,'文圣区',541,'211003',3), +(544,'宏伟区',541,'211004',3), +(545,'弓长岭区',541,'211005',3), +(546,'太子河区',541,'211011',3), +(547,'辽阳县',541,'211021',3), +(548,'灯塔市',541,'211081',3), +(549,'盘锦市',462,'211100',2), +(550,'双台子区',549,'211102',3), +(551,'兴隆台区',549,'211103',3), +(552,'大洼区',549,'211104',3), +(553,'盘山县',549,'211122',3), +(554,'铁岭市',462,'211200',2), +(555,'银州区',554,'211202',3), +(556,'清河区',554,'211204',3), +(557,'铁岭县',554,'211221',3), +(558,'西丰县',554,'211223',3), +(559,'昌图县',554,'211224',3), +(560,'调兵山市',554,'211281',3), +(561,'开原市',554,'211282',3), +(562,'朝阳市',462,'211300',2), +(563,'双塔区',562,'211302',3), +(564,'龙城区',562,'211303',3), +(565,'朝阳县',562,'211321',3), +(566,'建平县',562,'211322',3), +(567,'喀喇沁左翼蒙古族自治县',562,'211324',3), +(568,'北票市',562,'211381',3), +(569,'凌源市',562,'211382',3), +(570,'葫芦岛市',462,'211400',2), +(571,'连山区',570,'211402',3), +(572,'龙港区',570,'211403',3), +(573,'南票区',570,'211404',3), +(574,'绥中县',570,'211421',3), +(575,'建昌县',570,'211422',3), +(576,'兴城市',570,'211481',3), +(577,'吉林省',0,'220000',1), +(578,'长春市',577,'220100',2), +(579,'南关区',578,'220102',3), +(580,'宽城区',578,'220103',3), +(581,'朝阳区',578,'220104',3), +(582,'二道区',578,'220105',3), +(583,'绿园区',578,'220106',3), +(584,'双阳区',578,'220112',3), +(585,'九台区',578,'220113',3), +(586,'农安县',578,'220122',3), +(587,'榆树市',578,'220182',3), +(588,'德惠市',578,'220183',3), +(589,'吉林市',577,'220200',2), +(590,'昌邑区',589,'220202',3), +(591,'龙潭区',589,'220203',3), +(592,'船营区',589,'220204',3), +(593,'丰满区',589,'220211',3), +(594,'永吉县',589,'220221',3), +(595,'蛟河市',589,'220281',3), +(596,'桦甸市',589,'220282',3), +(597,'舒兰市',589,'220283',3), +(598,'磐石市',589,'220284',3), +(599,'四平市',577,'220300',2), +(600,'铁西区',599,'220302',3), +(601,'铁东区',599,'220303',3), +(602,'梨树县',599,'220322',3), +(603,'伊通满族自治县',599,'220323',3), +(604,'公主岭市',599,'220381',3), +(605,'双辽市',599,'220382',3), +(606,'辽源市',577,'220400',2), +(607,'龙山区',606,'220402',3), +(608,'西安区',606,'220403',3), +(609,'东丰县',606,'220421',3), +(610,'东辽县',606,'220422',3), +(611,'通化市',577,'220500',2), +(612,'东昌区',611,'220502',3), +(613,'二道江区',611,'220503',3), +(614,'通化县',611,'220521',3), +(615,'辉南县',611,'220523',3), +(616,'柳河县',611,'220524',3), +(617,'梅河口市',611,'220581',3), +(618,'集安市',611,'220582',3), +(619,'白山市',577,'220600',2), +(620,'浑江区',619,'220602',3), +(621,'江源区',619,'220605',3), +(622,'抚松县',619,'220621',3), +(623,'靖宇县',619,'220622',3), +(624,'长白朝鲜族自治县',619,'220623',3), +(625,'临江市',619,'220681',3), +(626,'松原市',577,'220700',2), +(627,'宁江区',626,'220702',3), +(628,'前郭尔罗斯蒙古族自治县',626,'220721',3), +(629,'长岭县',626,'220722',3), +(630,'乾安县',626,'220723',3), +(631,'扶余市',626,'220781',3), +(632,'白城市',577,'220800',2), +(633,'洮北区',632,'220802',3), +(634,'镇赉县',632,'220821',3), +(635,'通榆县',632,'220822',3), +(636,'洮南市',632,'220881',3), +(637,'大安市',632,'220882',3), +(638,'延边朝鲜族自治州',577,'222400',2), +(639,'延吉市',638,'222401',3), +(640,'图们市',638,'222402',3), +(641,'敦化市',638,'222403',3), +(642,'珲春市',638,'222404',3), +(643,'龙井市',638,'222405',3), +(644,'和龙市',638,'222406',3), +(645,'汪清县',638,'222424',3), +(646,'安图县',638,'222426',3), +(647,'黑龙江省',0,'230000',1), +(648,'哈尔滨市',647,'230100',2), +(649,'道里区',648,'230102',3), +(650,'南岗区',648,'230103',3), +(651,'道外区',648,'230104',3), +(652,'平房区',648,'230108',3), +(653,'松北区',648,'230109',3), +(654,'香坊区',648,'230110',3), +(655,'呼兰区',648,'230111',3), +(656,'阿城区',648,'230112',3), +(657,'双城区',648,'230113',3), +(658,'依兰县',648,'230123',3), +(659,'方正县',648,'230124',3), +(660,'宾县',648,'230125',3), +(661,'巴彦县',648,'230126',3), +(662,'木兰县',648,'230127',3), +(663,'通河县',648,'230128',3), +(664,'延寿县',648,'230129',3), +(665,'尚志市',648,'230183',3), +(666,'五常市',648,'230184',3), +(667,'齐齐哈尔市',647,'230200',2), +(668,'龙沙区',667,'230202',3), +(669,'建华区',667,'230203',3), +(670,'铁锋区',667,'230204',3), +(671,'昂昂溪区',667,'230205',3), +(672,'富拉尔基区',667,'230206',3), +(673,'碾子山区',667,'230207',3), +(674,'梅里斯达斡尔族区',667,'230208',3), +(675,'龙江县',667,'230221',3), +(676,'依安县',667,'230223',3), +(677,'泰来县',667,'230224',3), +(678,'甘南县',667,'230225',3), +(679,'富裕县',667,'230227',3), +(680,'克山县',667,'230229',3), +(681,'克东县',667,'230230',3), +(682,'拜泉县',667,'230231',3), +(683,'讷河市',667,'230281',3), +(684,'鸡西市',647,'230300',2), +(685,'鸡冠区',684,'230302',3), +(686,'恒山区',684,'230303',3), +(687,'滴道区',684,'230304',3), +(688,'梨树区',684,'230305',3), +(689,'城子河区',684,'230306',3), +(690,'麻山区',684,'230307',3), +(691,'鸡东县',684,'230321',3), +(692,'虎林市',684,'230381',3), +(693,'密山市',684,'230382',3), +(694,'鹤岗市',647,'230400',2), +(695,'向阳区',694,'230402',3), +(696,'工农区',694,'230403',3), +(697,'南山区',694,'230404',3), +(698,'兴安区',694,'230405',3), +(699,'东山区',694,'230406',3), +(700,'兴山区',694,'230407',3), +(701,'萝北县',694,'230421',3), +(702,'绥滨县',694,'230422',3), +(703,'双鸭山市',647,'230500',2), +(704,'尖山区',703,'230502',3), +(705,'岭东区',703,'230503',3), +(706,'四方台区',703,'230505',3), +(707,'宝山区',703,'230506',3), +(708,'集贤县',703,'230521',3), +(709,'友谊县',703,'230522',3), +(710,'宝清县',703,'230523',3), +(711,'饶河县',703,'230524',3), +(712,'大庆市',647,'230600',2), +(713,'萨尔图区',712,'230602',3), +(714,'龙凤区',712,'230603',3), +(715,'让胡路区',712,'230604',3), +(716,'红岗区',712,'230605',3), +(717,'大同区',712,'230606',3), +(718,'肇州县',712,'230621',3), +(719,'肇源县',712,'230622',3), +(720,'林甸县',712,'230623',3), +(721,'杜尔伯特蒙古族自治县',712,'230624',3), +(722,'伊春市',647,'230700',2), +(723,'伊美区',722,'230717',3), +(724,'乌翠区',722,'230718',3), +(725,'友好区',722,'230719',3), +(726,'嘉荫县',722,'230722',3), +(727,'汤旺县',722,'230723',3), +(728,'丰林县',722,'230724',3), +(729,'大箐山县',722,'230725',3), +(730,'南岔县',722,'230726',3), +(731,'金林区',722,'230751',3), +(732,'铁力市',722,'230781',3), +(733,'佳木斯市',647,'230800',2), +(734,'向阳区',733,'230803',3), +(735,'前进区',733,'230804',3), +(736,'东风区',733,'230805',3), +(737,'郊区',733,'230811',3), +(738,'桦南县',733,'230822',3), +(739,'桦川县',733,'230826',3), +(740,'汤原县',733,'230828',3), +(741,'同江市',733,'230881',3), +(742,'富锦市',733,'230882',3), +(743,'抚远市',733,'230883',3), +(744,'七台河市',647,'230900',2), +(745,'新兴区',744,'230902',3), +(746,'桃山区',744,'230903',3), +(747,'茄子河区',744,'230904',3), +(748,'勃利县',744,'230921',3), +(749,'牡丹江市',647,'231000',2), +(750,'东安区',749,'231002',3), +(751,'阳明区',749,'231003',3), +(752,'爱民区',749,'231004',3), +(753,'西安区',749,'231005',3), +(754,'林口县',749,'231025',3), +(755,'绥芬河市',749,'231081',3), +(756,'海林市',749,'231083',3), +(757,'宁安市',749,'231084',3), +(758,'穆棱市',749,'231085',3), +(759,'东宁市',749,'231086',3), +(760,'黑河市',647,'231100',2), +(761,'爱辉区',760,'231102',3), +(762,'逊克县',760,'231123',3), +(763,'孙吴县',760,'231124',3), +(764,'北安市',760,'231181',3), +(765,'五大连池市',760,'231182',3), +(766,'嫩江市',760,'231183',3), +(767,'绥化市',647,'231200',2), +(768,'北林区',767,'231202',3), +(769,'望奎县',767,'231221',3), +(770,'兰西县',767,'231222',3), +(771,'青冈县',767,'231223',3), +(772,'庆安县',767,'231224',3), +(773,'明水县',767,'231225',3), +(774,'绥棱县',767,'231226',3), +(775,'安达市',767,'231281',3), +(776,'肇东市',767,'231282',3), +(777,'海伦市',767,'231283',3), +(778,'大兴安岭地区',647,'232700',2), +(779,'漠河市',778,'232701',3), +(780,'呼玛县',778,'232721',3), +(781,'塔河县',778,'232722',3), +(782,'上海',0,'310000',1), +(783,'上海市',782,'310010',2), +(784,'黄浦区',783,'310101',3), +(785,'徐汇区',783,'310104',3), +(786,'长宁区',783,'310105',3), +(787,'静安区',783,'310106',3), +(788,'普陀区',783,'310107',3), +(789,'虹口区',783,'310109',3), +(790,'杨浦区',783,'310110',3), +(791,'闵行区',783,'310112',3), +(792,'宝山区',783,'310113',3), +(793,'嘉定区',783,'310114',3), +(794,'浦东新区',783,'310115',3), +(795,'金山区',783,'310116',3), +(796,'松江区',783,'310117',3), +(797,'青浦区',783,'310118',3), +(798,'奉贤区',783,'310120',3), +(799,'崇明区',783,'310151',3), +(800,'江苏省',0,'320000',1), +(801,'南京市',800,'320100',2), +(802,'玄武区',801,'320102',3), +(803,'秦淮区',801,'320104',3), +(804,'建邺区',801,'320105',3), +(805,'鼓楼区',801,'320106',3), +(806,'浦口区',801,'320111',3), +(807,'栖霞区',801,'320113',3), +(808,'雨花台区',801,'320114',3), +(809,'江宁区',801,'320115',3), +(810,'六合区',801,'320116',3), +(811,'溧水区',801,'320117',3), +(812,'高淳区',801,'320118',3), +(813,'无锡市',800,'320200',2), +(814,'锡山区',813,'320205',3), +(815,'惠山区',813,'320206',3), +(816,'滨湖区',813,'320211',3), +(817,'梁溪区',813,'320213',3), +(818,'新吴区',813,'320214',3), +(819,'江阴市',813,'320281',3), +(820,'宜兴市',813,'320282',3), +(821,'徐州市',800,'320300',2), +(822,'鼓楼区',821,'320302',3), +(823,'云龙区',821,'320303',3), +(824,'贾汪区',821,'320305',3), +(825,'泉山区',821,'320311',3), +(826,'铜山区',821,'320312',3), +(827,'丰县',821,'320321',3), +(828,'沛县',821,'320322',3), +(829,'睢宁县',821,'320324',3), +(830,'新沂市',821,'320381',3), +(831,'邳州市',821,'320382',3), +(832,'常州市',800,'320400',2), +(833,'天宁区',832,'320402',3), +(834,'钟楼区',832,'320404',3), +(835,'新北区',832,'320411',3), +(836,'武进区',832,'320412',3), +(837,'金坛区',832,'320413',3), +(838,'溧阳市',832,'320481',3), +(839,'苏州市',800,'320500',2), +(840,'虎丘区',839,'320505',3), +(841,'吴中区',839,'320506',3), +(842,'相城区',839,'320507',3), +(843,'姑苏区',839,'320508',3), +(844,'吴江区',839,'320509',3), +(845,'常熟市',839,'320581',3), +(846,'张家港市',839,'320582',3), +(847,'昆山市',839,'320583',3), +(848,'太仓市',839,'320585',3), +(849,'南通市',800,'320600',2), +(850,'崇川区',849,'320602',3), +(851,'港闸区',849,'320611',3), +(852,'通州区',849,'320612',3), +(853,'如东县',849,'320623',3), +(854,'启东市',849,'320681',3), +(855,'如皋市',849,'320682',3), +(856,'海门市',849,'320684',3), +(857,'海安市',849,'320685',3), +(858,'连云港市',800,'320700',2), +(859,'连云区',858,'320703',3), +(860,'海州区',858,'320706',3), +(861,'赣榆区',858,'320707',3), +(862,'东海县',858,'320722',3), +(863,'灌云县',858,'320723',3), +(864,'灌南县',858,'320724',3), +(865,'淮安市',800,'320800',2), +(866,'淮安区',865,'320803',3), +(867,'淮阴区',865,'320804',3), +(868,'清江浦区',865,'320812',3), +(869,'洪泽区',865,'320813',3), +(870,'涟水县',865,'320826',3), +(871,'盱眙县',865,'320830',3), +(872,'金湖县',865,'320831',3), +(873,'盐城市',800,'320900',2), +(874,'亭湖区',873,'320902',3), +(875,'盐都区',873,'320903',3), +(876,'大丰区',873,'320904',3), +(877,'响水县',873,'320921',3), +(878,'滨海县',873,'320922',3), +(879,'阜宁县',873,'320923',3), +(880,'射阳县',873,'320924',3), +(881,'建湖县',873,'320925',3), +(882,'东台市',873,'320981',3), +(883,'扬州市',800,'321000',2), +(884,'广陵区',883,'321002',3), +(885,'邗江区',883,'321003',3), +(886,'江都区',883,'321012',3), +(887,'宝应县',883,'321023',3), +(888,'仪征市',883,'321081',3), +(889,'高邮市',883,'321084',3), +(890,'镇江市',800,'321100',2), +(891,'京口区',890,'321102',3), +(892,'润州区',890,'321111',3), +(893,'丹徒区',890,'321112',3), +(894,'丹阳市',890,'321181',3), +(895,'扬中市',890,'321182',3), +(896,'句容市',890,'321183',3), +(897,'泰州市',800,'321200',2), +(898,'海陵区',897,'321202',3), +(899,'高港区',897,'321203',3), +(900,'姜堰区',897,'321204',3), +(901,'兴化市',897,'321281',3), +(902,'靖江市',897,'321282',3), +(903,'泰兴市',897,'321283',3), +(904,'宿迁市',800,'321300',2), +(905,'宿城区',904,'321302',3), +(906,'宿豫区',904,'321311',3), +(907,'沭阳县',904,'321322',3), +(908,'泗阳县',904,'321323',3), +(909,'泗洪县',904,'321324',3), +(910,'浙江省',0,'330000',1), +(911,'杭州市',910,'330100',2), +(912,'上城区',911,'330102',3), +(913,'下城区',911,'330103',3), +(914,'江干区',911,'330104',3), +(915,'拱墅区',911,'330105',3), +(916,'西湖区',911,'330106',3), +(917,'滨江区',911,'330108',3), +(918,'萧山区',911,'330109',3), +(919,'余杭区',911,'330110',3), +(920,'富阳区',911,'330111',3), +(921,'临安区',911,'330112',3), +(922,'桐庐县',911,'330122',3), +(923,'淳安县',911,'330127',3), +(924,'建德市',911,'330182',3), +(925,'宁波市',910,'330200',2), +(926,'海曙区',925,'330203',3), +(927,'江北区',925,'330205',3), +(928,'北仑区',925,'330206',3), +(929,'镇海区',925,'330211',3), +(930,'鄞州区',925,'330212',3), +(931,'奉化区',925,'330213',3), +(932,'象山县',925,'330225',3), +(933,'宁海县',925,'330226',3), +(934,'余姚市',925,'330281',3), +(935,'慈溪市',925,'330282',3), +(936,'温州市',910,'330300',2), +(937,'鹿城区',936,'330302',3), +(938,'龙湾区',936,'330303',3), +(939,'瓯海区',936,'330304',3), +(940,'洞头区',936,'330305',3), +(941,'永嘉县',936,'330324',3), +(942,'平阳县',936,'330326',3), +(943,'苍南县',936,'330327',3), +(944,'文成县',936,'330328',3), +(945,'泰顺县',936,'330329',3), +(946,'瑞安市',936,'330381',3), +(947,'乐清市',936,'330382',3), +(948,'龙港市',936,'330383',3), +(949,'嘉兴市',910,'330400',2), +(950,'南湖区',949,'330402',3), +(951,'秀洲区',949,'330411',3), +(952,'嘉善县',949,'330421',3), +(953,'海盐县',949,'330424',3), +(954,'海宁市',949,'330481',3), +(955,'平湖市',949,'330482',3), +(956,'桐乡市',949,'330483',3), +(957,'湖州市',910,'330500',2), +(958,'吴兴区',957,'330502',3), +(959,'南浔区',957,'330503',3), +(960,'德清县',957,'330521',3), +(961,'长兴县',957,'330522',3), +(962,'安吉县',957,'330523',3), +(963,'绍兴市',910,'330600',2), +(964,'越城区',963,'330602',3), +(965,'柯桥区',963,'330603',3), +(966,'上虞区',963,'330604',3), +(967,'新昌县',963,'330624',3), +(968,'诸暨市',963,'330681',3), +(969,'嵊州市',963,'330683',3), +(970,'金华市',910,'330700',2), +(971,'婺城区',970,'330702',3), +(972,'金东区',970,'330703',3), +(973,'武义县',970,'330723',3), +(974,'浦江县',970,'330726',3), +(975,'磐安县',970,'330727',3), +(976,'兰溪市',970,'330781',3), +(977,'义乌市',970,'330782',3), +(978,'东阳市',970,'330783',3), +(979,'永康市',970,'330784',3), +(980,'衢州市',910,'330800',2), +(981,'柯城区',980,'330802',3), +(982,'衢江区',980,'330803',3), +(983,'常山县',980,'330822',3), +(984,'开化县',980,'330824',3), +(985,'龙游县',980,'330825',3), +(986,'江山市',980,'330881',3), +(987,'舟山市',910,'330900',2), +(988,'定海区',987,'330902',3), +(989,'普陀区',987,'330903',3), +(990,'岱山县',987,'330921',3), +(991,'嵊泗县',987,'330922',3), +(992,'台州市',910,'331000',2), +(993,'椒江区',992,'331002',3), +(994,'黄岩区',992,'331003',3), +(995,'路桥区',992,'331004',3), +(996,'三门县',992,'331022',3), +(997,'天台县',992,'331023',3), +(998,'仙居县',992,'331024',3), +(999,'温岭市',992,'331081',3), +(1000,'临海市',992,'331082',3), +(1001,'玉环市',992,'331083',3), +(1002,'丽水市',910,'331100',2), +(1003,'莲都区',1002,'331102',3), +(1004,'青田县',1002,'331121',3), +(1005,'缙云县',1002,'331122',3), +(1006,'遂昌县',1002,'331123',3), +(1007,'松阳县',1002,'331124',3), +(1008,'云和县',1002,'331125',3), +(1009,'庆元县',1002,'331126',3), +(1010,'景宁畲族自治县',1002,'331127',3), +(1011,'龙泉市',1002,'331181',3), +(1012,'安徽省',0,'340000',1), +(1013,'合肥市',1012,'340100',2), +(1014,'瑶海区',1013,'340102',3), +(1015,'庐阳区',1013,'340103',3), +(1016,'蜀山区',1013,'340104',3), +(1017,'包河区',1013,'340111',3), +(1018,'长丰县',1013,'340121',3), +(1019,'肥东县',1013,'340122',3), +(1020,'肥西县',1013,'340123',3), +(1021,'庐江县',1013,'340124',3), +(1022,'巢湖市',1013,'340181',3), +(1023,'芜湖市',1012,'340200',2), +(1024,'镜湖区',1023,'340202',3), +(1025,'弋江区',1023,'340203',3), +(1026,'鸠江区',1023,'340207',3), +(1027,'三山区',1023,'340208',3), +(1028,'芜湖县',1023,'340221',3), +(1029,'繁昌县',1023,'340222',3), +(1030,'南陵县',1023,'340223',3), +(1031,'无为市',1023,'340281',3), +(1032,'蚌埠市',1012,'340300',2), +(1033,'龙子湖区',1032,'340302',3), +(1034,'蚌山区',1032,'340303',3), +(1035,'禹会区',1032,'340304',3), +(1036,'淮上区',1032,'340311',3), +(1037,'怀远县',1032,'340321',3), +(1038,'五河县',1032,'340322',3), +(1039,'固镇县',1032,'340323',3), +(1040,'淮南市',1012,'340400',2), +(1041,'大通区',1040,'340402',3), +(1042,'田家庵区',1040,'340403',3), +(1043,'谢家集区',1040,'340404',3), +(1044,'八公山区',1040,'340405',3), +(1045,'潘集区',1040,'340406',3), +(1046,'凤台县',1040,'340421',3), +(1047,'寿县',1040,'340422',3), +(1048,'马鞍山市',1012,'340500',2), +(1049,'花山区',1048,'340503',3), +(1050,'雨山区',1048,'340504',3), +(1051,'博望区',1048,'340506',3), +(1052,'当涂县',1048,'340521',3), +(1053,'含山县',1048,'340522',3), +(1054,'和县',1048,'340523',3), +(1055,'淮北市',1012,'340600',2), +(1056,'杜集区',1055,'340602',3), +(1057,'相山区',1055,'340603',3), +(1058,'烈山区',1055,'340604',3), +(1059,'濉溪县',1055,'340621',3), +(1060,'铜陵市',1012,'340700',2), +(1061,'铜官区',1060,'340705',3), +(1062,'义安区',1060,'340706',3), +(1063,'郊区',1060,'340711',3), +(1064,'枞阳县',1060,'340722',3), +(1065,'安庆市',1012,'340800',2), +(1066,'迎江区',1065,'340802',3), +(1067,'大观区',1065,'340803',3), +(1068,'宜秀区',1065,'340811',3), +(1069,'怀宁县',1065,'340822',3), +(1070,'太湖县',1065,'340825',3), +(1071,'宿松县',1065,'340826',3), +(1072,'望江县',1065,'340827',3), +(1073,'岳西县',1065,'340828',3), +(1074,'桐城市',1065,'340881',3), +(1075,'潜山市',1065,'340882',3), +(1076,'黄山市',1012,'341000',2), +(1077,'屯溪区',1076,'341002',3), +(1078,'黄山区',1076,'341003',3), +(1079,'徽州区',1076,'341004',3), +(1080,'歙县',1076,'341021',3), +(1081,'休宁县',1076,'341022',3), +(1082,'黟县',1076,'341023',3), +(1083,'祁门县',1076,'341024',3), +(1084,'滁州市',1012,'341100',2), +(1085,'琅琊区',1084,'341102',3), +(1086,'南谯区',1084,'341103',3), +(1087,'来安县',1084,'341122',3), +(1088,'全椒县',1084,'341124',3), +(1089,'定远县',1084,'341125',3), +(1090,'凤阳县',1084,'341126',3), +(1091,'天长市',1084,'341181',3), +(1092,'明光市',1084,'341182',3), +(1093,'阜阳市',1012,'341200',2), +(1094,'颍州区',1093,'341202',3), +(1095,'颍东区',1093,'341203',3), +(1096,'颍泉区',1093,'341204',3), +(1097,'临泉县',1093,'341221',3), +(1098,'太和县',1093,'341222',3), +(1099,'阜南县',1093,'341225',3), +(1100,'颍上县',1093,'341226',3), +(1101,'界首市',1093,'341282',3), +(1102,'宿州市',1012,'341300',2), +(1103,'埇桥区',1102,'341302',3), +(1104,'砀山县',1102,'341321',3), +(1105,'萧县',1102,'341322',3), +(1106,'灵璧县',1102,'341323',3), +(1107,'泗县',1102,'341324',3), +(1108,'六安市',1012,'341500',2), +(1109,'金安区',1108,'341502',3), +(1110,'裕安区',1108,'341503',3), +(1111,'叶集区',1108,'341504',3), +(1112,'霍邱县',1108,'341522',3), +(1113,'舒城县',1108,'341523',3), +(1114,'金寨县',1108,'341524',3), +(1115,'霍山县',1108,'341525',3), +(1116,'亳州市',1012,'341600',2), +(1117,'谯城区',1116,'341602',3), +(1118,'涡阳县',1116,'341621',3), +(1119,'蒙城县',1116,'341622',3), +(1120,'利辛县',1116,'341623',3), +(1121,'池州市',1012,'341700',2), +(1122,'贵池区',1121,'341702',3), +(1123,'东至县',1121,'341721',3), +(1124,'石台县',1121,'341722',3), +(1125,'青阳县',1121,'341723',3), +(1126,'宣城市',1012,'341800',2), +(1127,'宣州区',1126,'341802',3), +(1128,'郎溪县',1126,'341821',3), +(1129,'泾县',1126,'341823',3), +(1130,'绩溪县',1126,'341824',3), +(1131,'旌德县',1126,'341825',3), +(1132,'宁国市',1126,'341881',3), +(1133,'广德市',1126,'341882',3), +(1134,'福建省',0,'350000',1), +(1135,'福州市',1134,'350100',2), +(1136,'鼓楼区',1135,'350102',3), +(1137,'台江区',1135,'350103',3), +(1138,'仓山区',1135,'350104',3), +(1139,'马尾区',1135,'350105',3), +(1140,'晋安区',1135,'350111',3), +(1141,'长乐区',1135,'350112',3), +(1142,'闽侯县',1135,'350121',3), +(1143,'连江县',1135,'350122',3), +(1144,'罗源县',1135,'350123',3), +(1145,'闽清县',1135,'350124',3), +(1146,'永泰县',1135,'350125',3), +(1147,'平潭县',1135,'350128',3), +(1148,'福清市',1135,'350181',3), +(1149,'厦门市',1134,'350200',2), +(1150,'思明区',1149,'350203',3), +(1151,'海沧区',1149,'350205',3), +(1152,'湖里区',1149,'350206',3), +(1153,'集美区',1149,'350211',3), +(1154,'同安区',1149,'350212',3), +(1155,'翔安区',1149,'350213',3), +(1156,'莆田市',1134,'350300',2), +(1157,'城厢区',1156,'350302',3), +(1158,'涵江区',1156,'350303',3), +(1159,'荔城区',1156,'350304',3), +(1160,'秀屿区',1156,'350305',3), +(1161,'仙游县',1156,'350322',3), +(1162,'三明市',1134,'350400',2), +(1163,'梅列区',1162,'350402',3), +(1164,'三元区',1162,'350403',3), +(1165,'明溪县',1162,'350421',3), +(1166,'清流县',1162,'350423',3), +(1167,'宁化县',1162,'350424',3), +(1168,'大田县',1162,'350425',3), +(1169,'尤溪县',1162,'350426',3), +(1170,'沙县',1162,'350427',3), +(1171,'将乐县',1162,'350428',3), +(1172,'泰宁县',1162,'350429',3), +(1173,'建宁县',1162,'350430',3), +(1174,'永安市',1162,'350481',3), +(1175,'泉州市',1134,'350500',2), +(1176,'鲤城区',1175,'350502',3), +(1177,'丰泽区',1175,'350503',3), +(1178,'洛江区',1175,'350504',3), +(1179,'泉港区',1175,'350505',3), +(1180,'惠安县',1175,'350521',3), +(1181,'安溪县',1175,'350524',3), +(1182,'永春县',1175,'350525',3), +(1183,'德化县',1175,'350526',3), +(1184,'金门县',1175,'350527',3), +(1185,'石狮市',1175,'350581',3), +(1186,'晋江市',1175,'350582',3), +(1187,'南安市',1175,'350583',3), +(1188,'漳州市',1134,'350600',2), +(1189,'芗城区',1188,'350602',3), +(1190,'龙文区',1188,'350603',3), +(1191,'云霄县',1188,'350622',3), +(1192,'漳浦县',1188,'350623',3), +(1193,'诏安县',1188,'350624',3), +(1194,'长泰县',1188,'350625',3), +(1195,'东山县',1188,'350626',3), +(1196,'南靖县',1188,'350627',3), +(1197,'平和县',1188,'350628',3), +(1198,'华安县',1188,'350629',3), +(1199,'龙海市',1188,'350681',3), +(1200,'南平市',1134,'350700',2), +(1201,'延平区',1200,'350702',3), +(1202,'建阳区',1200,'350703',3), +(1203,'顺昌县',1200,'350721',3), +(1204,'浦城县',1200,'350722',3), +(1205,'光泽县',1200,'350723',3), +(1206,'松溪县',1200,'350724',3), +(1207,'政和县',1200,'350725',3), +(1208,'邵武市',1200,'350781',3), +(1209,'武夷山市',1200,'350782',3), +(1210,'建瓯市',1200,'350783',3), +(1211,'龙岩市',1134,'350800',2), +(1212,'新罗区',1211,'350802',3), +(1213,'永定区',1211,'350803',3), +(1214,'长汀县',1211,'350821',3), +(1215,'上杭县',1211,'350823',3), +(1216,'武平县',1211,'350824',3), +(1217,'连城县',1211,'350825',3), +(1218,'漳平市',1211,'350881',3), +(1219,'宁德市',1134,'350900',2), +(1220,'蕉城区',1219,'350902',3), +(1221,'霞浦县',1219,'350921',3), +(1222,'古田县',1219,'350922',3), +(1223,'屏南县',1219,'350923',3), +(1224,'寿宁县',1219,'350924',3), +(1225,'周宁县',1219,'350925',3), +(1226,'柘荣县',1219,'350926',3), +(1227,'福安市',1219,'350981',3), +(1228,'福鼎市',1219,'350982',3), +(1229,'江西省',0,'360000',1), +(1230,'南昌市',1229,'360100',2), +(1231,'东湖区',1230,'360102',3), +(1232,'西湖区',1230,'360103',3), +(1233,'青云谱区',1230,'360104',3), +(1234,'青山湖区',1230,'360111',3), +(1235,'新建区',1230,'360112',3), +(1236,'红谷滩区',1230,'360113',3), +(1237,'南昌县',1230,'360121',3), +(1238,'安义县',1230,'360123',3), +(1239,'进贤县',1230,'360124',3), +(1240,'景德镇市',1229,'360200',2), +(1241,'昌江区',1240,'360202',3), +(1242,'珠山区',1240,'360203',3), +(1243,'浮梁县',1240,'360222',3), +(1244,'乐平市',1240,'360281',3), +(1245,'萍乡市',1229,'360300',2), +(1246,'安源区',1245,'360302',3), +(1247,'湘东区',1245,'360313',3), +(1248,'莲花县',1245,'360321',3), +(1249,'上栗县',1245,'360322',3), +(1250,'芦溪县',1245,'360323',3), +(1251,'九江市',1229,'360400',2), +(1252,'濂溪区',1251,'360402',3), +(1253,'浔阳区',1251,'360403',3), +(1254,'柴桑区',1251,'360404',3), +(1255,'武宁县',1251,'360423',3), +(1256,'修水县',1251,'360424',3), +(1257,'永修县',1251,'360425',3), +(1258,'德安县',1251,'360426',3), +(1259,'都昌县',1251,'360428',3), +(1260,'湖口县',1251,'360429',3), +(1261,'彭泽县',1251,'360430',3), +(1262,'瑞昌市',1251,'360481',3), +(1263,'共青城市',1251,'360482',3), +(1264,'庐山市',1251,'360483',3), +(1265,'新余市',1229,'360500',2), +(1266,'渝水区',1265,'360502',3), +(1267,'分宜县',1265,'360521',3), +(1268,'鹰潭市',1229,'360600',2), +(1269,'月湖区',1268,'360602',3), +(1270,'余江区',1268,'360603',3), +(1271,'贵溪市',1268,'360681',3), +(1272,'赣州市',1229,'360700',2), +(1273,'章贡区',1272,'360702',3), +(1274,'南康区',1272,'360703',3), +(1275,'赣县区',1272,'360704',3), +(1276,'信丰县',1272,'360722',3), +(1277,'大余县',1272,'360723',3), +(1278,'上犹县',1272,'360724',3), +(1279,'崇义县',1272,'360725',3), +(1280,'安远县',1272,'360726',3), +(1281,'龙南县',1272,'360727',3), +(1282,'定南县',1272,'360728',3), +(1283,'全南县',1272,'360729',3), +(1284,'宁都县',1272,'360730',3), +(1285,'于都县',1272,'360731',3), +(1286,'兴国县',1272,'360732',3), +(1287,'会昌县',1272,'360733',3), +(1288,'寻乌县',1272,'360734',3), +(1289,'石城县',1272,'360735',3), +(1290,'瑞金市',1272,'360781',3), +(1291,'吉安市',1229,'360800',2), +(1292,'吉州区',1291,'360802',3), +(1293,'青原区',1291,'360803',3), +(1294,'吉安县',1291,'360821',3), +(1295,'吉水县',1291,'360822',3), +(1296,'峡江县',1291,'360823',3), +(1297,'新干县',1291,'360824',3), +(1298,'永丰县',1291,'360825',3), +(1299,'泰和县',1291,'360826',3), +(1300,'遂川县',1291,'360827',3), +(1301,'万安县',1291,'360828',3), +(1302,'安福县',1291,'360829',3), +(1303,'永新县',1291,'360830',3), +(1304,'井冈山市',1291,'360881',3), +(1305,'宜春市',1229,'360900',2), +(1306,'袁州区',1305,'360902',3), +(1307,'奉新县',1305,'360921',3), +(1308,'万载县',1305,'360922',3), +(1309,'上高县',1305,'360923',3), +(1310,'宜丰县',1305,'360924',3), +(1311,'靖安县',1305,'360925',3), +(1312,'铜鼓县',1305,'360926',3), +(1313,'丰城市',1305,'360981',3), +(1314,'樟树市',1305,'360982',3), +(1315,'高安市',1305,'360983',3), +(1316,'抚州市',1229,'361000',2), +(1317,'临川区',1316,'361002',3), +(1318,'东乡区',1316,'361003',3), +(1319,'南城县',1316,'361021',3), +(1320,'黎川县',1316,'361022',3), +(1321,'南丰县',1316,'361023',3), +(1322,'崇仁县',1316,'361024',3), +(1323,'乐安县',1316,'361025',3), +(1324,'宜黄县',1316,'361026',3), +(1325,'金溪县',1316,'361027',3), +(1326,'资溪县',1316,'361028',3), +(1327,'广昌县',1316,'361030',3), +(1328,'上饶市',1229,'361100',2), +(1329,'信州区',1328,'361102',3), +(1330,'广丰区',1328,'361103',3), +(1331,'广信区',1328,'361104',3), +(1332,'玉山县',1328,'361123',3), +(1333,'铅山县',1328,'361124',3), +(1334,'横峰县',1328,'361125',3), +(1335,'弋阳县',1328,'361126',3), +(1336,'余干县',1328,'361127',3), +(1337,'鄱阳县',1328,'361128',3), +(1338,'万年县',1328,'361129',3), +(1339,'婺源县',1328,'361130',3), +(1340,'德兴市',1328,'361181',3), +(1341,'山东省',0,'370000',1), +(1342,'济南市',1341,'370100',2), +(1343,'历下区',1342,'370102',3), +(1344,'市中区',1342,'370103',3), +(1345,'槐荫区',1342,'370104',3), +(1346,'天桥区',1342,'370105',3), +(1347,'历城区',1342,'370112',3), +(1348,'长清区',1342,'370113',3), +(1349,'章丘区',1342,'370114',3), +(1350,'济阳区',1342,'370115',3), +(1351,'莱芜区',1342,'370116',3), +(1352,'钢城区',1342,'370117',3), +(1353,'平阴县',1342,'370124',3), +(1354,'商河县',1342,'370126',3), +(1355,'青岛市',1341,'370200',2), +(1356,'市南区',1355,'370202',3), +(1357,'市北区',1355,'370203',3), +(1358,'黄岛区',1355,'370211',3), +(1359,'崂山区',1355,'370212',3), +(1360,'李沧区',1355,'370213',3), +(1361,'城阳区',1355,'370214',3), +(1362,'即墨区',1355,'370215',3), +(1363,'胶州市',1355,'370281',3), +(1364,'平度市',1355,'370283',3), +(1365,'莱西市',1355,'370285',3), +(1366,'淄博市',1341,'370300',2), +(1367,'淄川区',1366,'370302',3), +(1368,'张店区',1366,'370303',3), +(1369,'博山区',1366,'370304',3), +(1370,'临淄区',1366,'370305',3), +(1371,'周村区',1366,'370306',3), +(1372,'桓台县',1366,'370321',3), +(1373,'高青县',1366,'370322',3), +(1374,'沂源县',1366,'370323',3), +(1375,'枣庄市',1341,'370400',2), +(1376,'市中区',1375,'370402',3), +(1377,'薛城区',1375,'370403',3), +(1378,'峄城区',1375,'370404',3), +(1379,'台儿庄区',1375,'370405',3), +(1380,'山亭区',1375,'370406',3), +(1381,'滕州市',1375,'370481',3), +(1382,'东营市',1341,'370500',2), +(1383,'东营区',1382,'370502',3), +(1384,'河口区',1382,'370503',3), +(1385,'垦利区',1382,'370505',3), +(1386,'利津县',1382,'370522',3), +(1387,'广饶县',1382,'370523',3), +(1388,'烟台市',1341,'370600',2), +(1389,'芝罘区',1388,'370602',3), +(1390,'福山区',1388,'370611',3), +(1391,'牟平区',1388,'370612',3), +(1392,'莱山区',1388,'370613',3), +(1393,'长岛县',1388,'370634',3), +(1394,'龙口市',1388,'370681',3), +(1395,'莱阳市',1388,'370682',3), +(1396,'莱州市',1388,'370683',3), +(1397,'蓬莱市',1388,'370684',3), +(1398,'招远市',1388,'370685',3), +(1399,'栖霞市',1388,'370686',3), +(1400,'海阳市',1388,'370687',3), +(1401,'潍坊市',1341,'370700',2), +(1402,'潍城区',1401,'370702',3), +(1403,'寒亭区',1401,'370703',3), +(1404,'坊子区',1401,'370704',3), +(1405,'奎文区',1401,'370705',3), +(1406,'临朐县',1401,'370724',3), +(1407,'昌乐县',1401,'370725',3), +(1408,'青州市',1401,'370781',3), +(1409,'诸城市',1401,'370782',3), +(1410,'寿光市',1401,'370783',3), +(1411,'安丘市',1401,'370784',3), +(1412,'高密市',1401,'370785',3), +(1413,'昌邑市',1401,'370786',3), +(1414,'济宁市',1341,'370800',2), +(1415,'任城区',1414,'370811',3), +(1416,'兖州区',1414,'370812',3), +(1417,'微山县',1414,'370826',3), +(1418,'鱼台县',1414,'370827',3), +(1419,'金乡县',1414,'370828',3), +(1420,'嘉祥县',1414,'370829',3), +(1421,'汶上县',1414,'370830',3), +(1422,'泗水县',1414,'370831',3), +(1423,'梁山县',1414,'370832',3), +(1424,'曲阜市',1414,'370881',3), +(1425,'邹城市',1414,'370883',3), +(1426,'泰安市',1341,'370900',2), +(1427,'泰山区',1426,'370902',3), +(1428,'岱岳区',1426,'370911',3), +(1429,'宁阳县',1426,'370921',3), +(1430,'东平县',1426,'370923',3), +(1431,'新泰市',1426,'370982',3), +(1432,'肥城市',1426,'370983',3), +(1433,'威海市',1341,'371000',2), +(1434,'环翠区',1433,'371002',3), +(1435,'文登区',1433,'371003',3), +(1436,'荣成市',1433,'371082',3), +(1437,'乳山市',1433,'371083',3), +(1438,'日照市',1341,'371100',2), +(1439,'东港区',1438,'371102',3), +(1440,'岚山区',1438,'371103',3), +(1441,'五莲县',1438,'371121',3), +(1442,'莒县',1438,'371122',3), +(1443,'临沂市',1341,'371300',2), +(1444,'兰山区',1443,'371302',3), +(1445,'罗庄区',1443,'371311',3), +(1446,'河东区',1443,'371312',3), +(1447,'沂南县',1443,'371321',3), +(1448,'郯城县',1443,'371322',3), +(1449,'沂水县',1443,'371323',3), +(1450,'兰陵县',1443,'371324',3), +(1451,'费县',1443,'371325',3), +(1452,'平邑县',1443,'371326',3), +(1453,'莒南县',1443,'371327',3), +(1454,'蒙阴县',1443,'371328',3), +(1455,'临沭县',1443,'371329',3), +(1456,'德州市',1341,'371400',2), +(1457,'德城区',1456,'371402',3), +(1458,'陵城区',1456,'371403',3), +(1459,'宁津县',1456,'371422',3), +(1460,'庆云县',1456,'371423',3), +(1461,'临邑县',1456,'371424',3), +(1462,'齐河县',1456,'371425',3), +(1463,'平原县',1456,'371426',3), +(1464,'夏津县',1456,'371427',3), +(1465,'武城县',1456,'371428',3), +(1466,'乐陵市',1456,'371481',3), +(1467,'禹城市',1456,'371482',3), +(1468,'聊城市',1341,'371500',2), +(1469,'东昌府区',1468,'371502',3), +(1470,'茌平区',1468,'371503',3), +(1471,'阳谷县',1468,'371521',3), +(1472,'莘县',1468,'371522',3), +(1473,'东阿县',1468,'371524',3), +(1474,'冠县',1468,'371525',3), +(1475,'高唐县',1468,'371526',3), +(1476,'临清市',1468,'371581',3), +(1477,'滨州市',1341,'371600',2), +(1478,'滨城区',1477,'371602',3), +(1479,'沾化区',1477,'371603',3), +(1480,'惠民县',1477,'371621',3), +(1481,'阳信县',1477,'371622',3), +(1482,'无棣县',1477,'371623',3), +(1483,'博兴县',1477,'371625',3), +(1484,'邹平市',1477,'371681',3), +(1485,'菏泽市',1341,'371700',2), +(1486,'牡丹区',1485,'371702',3), +(1487,'定陶区',1485,'371703',3), +(1488,'曹县',1485,'371721',3), +(1489,'单县',1485,'371722',3), +(1490,'成武县',1485,'371723',3), +(1491,'巨野县',1485,'371724',3), +(1492,'郓城县',1485,'371725',3), +(1493,'鄄城县',1485,'371726',3), +(1494,'东明县',1485,'371728',3), +(1495,'河南省',0,'410000',1), +(1496,'郑州市',1495,'410100',2), +(1497,'中原区',1496,'410102',3), +(1498,'二七区',1496,'410103',3), +(1499,'管城回族区',1496,'410104',3), +(1500,'金水区',1496,'410105',3), +(1501,'上街区',1496,'410106',3), +(1502,'惠济区',1496,'410108',3), +(1503,'中牟县',1496,'410122',3), +(1504,'巩义市',1496,'410181',3), +(1505,'荥阳市',1496,'410182',3), +(1506,'新密市',1496,'410183',3), +(1507,'新郑市',1496,'410184',3), +(1508,'登封市',1496,'410185',3), +(1509,'开封市',1495,'410200',2), +(1510,'龙亭区',1509,'410202',3), +(1511,'顺河回族区',1509,'410203',3), +(1512,'鼓楼区',1509,'410204',3), +(1513,'禹王台区',1509,'410205',3), +(1514,'祥符区',1509,'410212',3), +(1515,'杞县',1509,'410221',3), +(1516,'通许县',1509,'410222',3), +(1517,'尉氏县',1509,'410223',3), +(1518,'兰考县',1509,'410225',3), +(1519,'洛阳市',1495,'410300',2), +(1520,'老城区',1519,'410302',3), +(1521,'西工区',1519,'410303',3), +(1522,'瀍河回族区',1519,'410304',3), +(1523,'涧西区',1519,'410305',3), +(1524,'吉利区',1519,'410306',3), +(1525,'洛龙区',1519,'410311',3), +(1526,'孟津县',1519,'410322',3), +(1527,'新安县',1519,'410323',3), +(1528,'栾川县',1519,'410324',3), +(1529,'嵩县',1519,'410325',3), +(1530,'汝阳县',1519,'410326',3), +(1531,'宜阳县',1519,'410327',3), +(1532,'洛宁县',1519,'410328',3), +(1533,'伊川县',1519,'410329',3), +(1534,'偃师市',1519,'410381',3), +(1535,'平顶山市',1495,'410400',2), +(1536,'新华区',1535,'410402',3), +(1537,'卫东区',1535,'410403',3), +(1538,'石龙区',1535,'410404',3), +(1539,'湛河区',1535,'410411',3), +(1540,'宝丰县',1535,'410421',3), +(1541,'叶县',1535,'410422',3), +(1542,'鲁山县',1535,'410423',3), +(1543,'郏县',1535,'410425',3), +(1544,'舞钢市',1535,'410481',3), +(1545,'汝州市',1535,'410482',3), +(1546,'安阳市',1495,'410500',2), +(1547,'文峰区',1546,'410502',3), +(1548,'北关区',1546,'410503',3), +(1549,'殷都区',1546,'410505',3), +(1550,'龙安区',1546,'410506',3), +(1551,'安阳县',1546,'410522',3), +(1552,'汤阴县',1546,'410523',3), +(1553,'滑县',1546,'410526',3), +(1554,'内黄县',1546,'410527',3), +(1555,'林州市',1546,'410581',3), +(1556,'鹤壁市',1495,'410600',2), +(1557,'鹤山区',1556,'410602',3), +(1558,'山城区',1556,'410603',3), +(1559,'淇滨区',1556,'410611',3), +(1560,'浚县',1556,'410621',3), +(1561,'淇县',1556,'410622',3), +(1562,'新乡市',1495,'410700',2), +(1563,'红旗区',1562,'410702',3), +(1564,'卫滨区',1562,'410703',3), +(1565,'凤泉区',1562,'410704',3), +(1566,'牧野区',1562,'410711',3), +(1567,'新乡县',1562,'410721',3), +(1568,'获嘉县',1562,'410724',3), +(1569,'原阳县',1562,'410725',3), +(1570,'延津县',1562,'410726',3), +(1571,'封丘县',1562,'410727',3), +(1572,'卫辉市',1562,'410781',3), +(1573,'辉县市',1562,'410782',3), +(1574,'长垣市',1562,'410783',3), +(1575,'焦作市',1495,'410800',2), +(1576,'解放区',1575,'410802',3), +(1577,'中站区',1575,'410803',3), +(1578,'马村区',1575,'410804',3), +(1579,'山阳区',1575,'410811',3), +(1580,'修武县',1575,'410821',3), +(1581,'博爱县',1575,'410822',3), +(1582,'武陟县',1575,'410823',3), +(1583,'温县',1575,'410825',3), +(1584,'沁阳市',1575,'410882',3), +(1585,'孟州市',1575,'410883',3), +(1586,'濮阳市',1495,'410900',2), +(1587,'华龙区',1586,'410902',3), +(1588,'清丰县',1586,'410922',3), +(1589,'南乐县',1586,'410923',3), +(1590,'范县',1586,'410926',3), +(1591,'台前县',1586,'410927',3), +(1592,'濮阳县',1586,'410928',3), +(1593,'许昌市',1495,'411000',2), +(1594,'魏都区',1593,'411002',3), +(1595,'建安区',1593,'411003',3), +(1596,'鄢陵县',1593,'411024',3), +(1597,'襄城县',1593,'411025',3), +(1598,'禹州市',1593,'411081',3), +(1599,'长葛市',1593,'411082',3), +(1600,'漯河市',1495,'411100',2), +(1601,'源汇区',1600,'411102',3), +(1602,'郾城区',1600,'411103',3), +(1603,'召陵区',1600,'411104',3), +(1604,'舞阳县',1600,'411121',3), +(1605,'临颍县',1600,'411122',3), +(1606,'三门峡市',1495,'411200',2), +(1607,'湖滨区',1606,'411202',3), +(1608,'陕州区',1606,'411203',3), +(1609,'渑池县',1606,'411221',3), +(1610,'卢氏县',1606,'411224',3), +(1611,'义马市',1606,'411281',3), +(1612,'灵宝市',1606,'411282',3), +(1613,'南阳市',1495,'411300',2), +(1614,'宛城区',1613,'411302',3), +(1615,'卧龙区',1613,'411303',3), +(1616,'南召县',1613,'411321',3), +(1617,'方城县',1613,'411322',3), +(1618,'西峡县',1613,'411323',3), +(1619,'镇平县',1613,'411324',3), +(1620,'内乡县',1613,'411325',3), +(1621,'淅川县',1613,'411326',3), +(1622,'社旗县',1613,'411327',3), +(1623,'唐河县',1613,'411328',3), +(1624,'新野县',1613,'411329',3), +(1625,'桐柏县',1613,'411330',3), +(1626,'邓州市',1613,'411381',3), +(1627,'商丘市',1495,'411400',2), +(1628,'梁园区',1627,'411402',3), +(1629,'睢阳区',1627,'411403',3), +(1630,'民权县',1627,'411421',3), +(1631,'睢县',1627,'411422',3), +(1632,'宁陵县',1627,'411423',3), +(1633,'柘城县',1627,'411424',3), +(1634,'虞城县',1627,'411425',3), +(1635,'夏邑县',1627,'411426',3), +(1636,'永城市',1627,'411481',3), +(1637,'信阳市',1495,'411500',2), +(1638,'浉河区',1637,'411502',3), +(1639,'平桥区',1637,'411503',3), +(1640,'罗山县',1637,'411521',3), +(1641,'光山县',1637,'411522',3), +(1642,'新县',1637,'411523',3), +(1643,'商城县',1637,'411524',3), +(1644,'固始县',1637,'411525',3), +(1645,'潢川县',1637,'411526',3), +(1646,'淮滨县',1637,'411527',3), +(1647,'息县',1637,'411528',3), +(1648,'周口市',1495,'411600',2), +(1649,'川汇区',1648,'411602',3), +(1650,'淮阳区',1648,'411603',3), +(1651,'扶沟县',1648,'411621',3), +(1652,'西华县',1648,'411622',3), +(1653,'商水县',1648,'411623',3), +(1654,'沈丘县',1648,'411624',3), +(1655,'郸城县',1648,'411625',3), +(1656,'太康县',1648,'411627',3), +(1657,'鹿邑县',1648,'411628',3), +(1658,'项城市',1648,'411681',3), +(1659,'驻马店市',1495,'411700',2), +(1660,'驿城区',1659,'411702',3), +(1661,'西平县',1659,'411721',3), +(1662,'上蔡县',1659,'411722',3), +(1663,'平舆县',1659,'411723',3), +(1664,'正阳县',1659,'411724',3), +(1665,'确山县',1659,'411725',3), +(1666,'泌阳县',1659,'411726',3), +(1667,'汝南县',1659,'411727',3), +(1668,'遂平县',1659,'411728',3), +(1669,'新蔡县',1659,'411729',3), +(1670,'济源市',1495,'419001',3), +(1671,'湖北省',0,'420000',1), +(1672,'武汉市',1671,'420100',2), +(1673,'江岸区',1672,'420102',3), +(1674,'江汉区',1672,'420103',3), +(1675,'硚口区',1672,'420104',3), +(1676,'汉阳区',1672,'420105',3), +(1677,'武昌区',1672,'420106',3), +(1678,'青山区',1672,'420107',3), +(1679,'洪山区',1672,'420111',3), +(1680,'东西湖区',1672,'420112',3), +(1681,'汉南区',1672,'420113',3), +(1682,'蔡甸区',1672,'420114',3), +(1683,'江夏区',1672,'420115',3), +(1684,'黄陂区',1672,'420116',3), +(1685,'新洲区',1672,'420117',3), +(1686,'黄石市',1671,'420200',2), +(1687,'黄石港区',1686,'420202',3), +(1688,'西塞山区',1686,'420203',3), +(1689,'下陆区',1686,'420204',3), +(1690,'铁山区',1686,'420205',3), +(1691,'阳新县',1686,'420222',3), +(1692,'大冶市',1686,'420281',3), +(1693,'十堰市',1671,'420300',2), +(1694,'茅箭区',1693,'420302',3), +(1695,'张湾区',1693,'420303',3), +(1696,'郧阳区',1693,'420304',3), +(1697,'郧西县',1693,'420322',3), +(1698,'竹山县',1693,'420323',3), +(1699,'竹溪县',1693,'420324',3), +(1700,'房县',1693,'420325',3), +(1701,'丹江口市',1693,'420381',3), +(1702,'宜昌市',1671,'420500',2), +(1703,'西陵区',1702,'420502',3), +(1704,'伍家岗区',1702,'420503',3), +(1705,'点军区',1702,'420504',3), +(1706,'猇亭区',1702,'420505',3), +(1707,'夷陵区',1702,'420506',3), +(1708,'远安县',1702,'420525',3), +(1709,'兴山县',1702,'420526',3), +(1710,'秭归县',1702,'420527',3), +(1711,'长阳土家族自治县',1702,'420528',3), +(1712,'五峰土家族自治县',1702,'420529',3), +(1713,'宜都市',1702,'420581',3), +(1714,'当阳市',1702,'420582',3), +(1715,'枝江市',1702,'420583',3), +(1716,'襄阳市',1671,'420600',2), +(1717,'襄城区',1716,'420602',3), +(1718,'樊城区',1716,'420606',3), +(1719,'襄州区',1716,'420607',3), +(1720,'南漳县',1716,'420624',3), +(1721,'谷城县',1716,'420625',3), +(1722,'保康县',1716,'420626',3), +(1723,'老河口市',1716,'420682',3), +(1724,'枣阳市',1716,'420683',3), +(1725,'宜城市',1716,'420684',3), +(1726,'鄂州市',1671,'420700',2), +(1727,'梁子湖区',1726,'420702',3), +(1728,'华容区',1726,'420703',3), +(1729,'鄂城区',1726,'420704',3), +(1730,'荆门市',1671,'420800',2), +(1731,'东宝区',1730,'420802',3), +(1732,'掇刀区',1730,'420804',3), +(1733,'沙洋县',1730,'420822',3), +(1734,'钟祥市',1730,'420881',3), +(1735,'京山市',1730,'420882',3), +(1736,'孝感市',1671,'420900',2), +(1737,'孝南区',1736,'420902',3), +(1738,'孝昌县',1736,'420921',3), +(1739,'大悟县',1736,'420922',3), +(1740,'云梦县',1736,'420923',3), +(1741,'应城市',1736,'420981',3), +(1742,'安陆市',1736,'420982',3), +(1743,'汉川市',1736,'420984',3), +(1744,'荆州市',1671,'421000',2), +(1745,'沙市区',1744,'421002',3), +(1746,'荆州区',1744,'421003',3), +(1747,'公安县',1744,'421022',3), +(1748,'监利县',1744,'421023',3), +(1749,'江陵县',1744,'421024',3), +(1750,'石首市',1744,'421081',3), +(1751,'洪湖市',1744,'421083',3), +(1752,'松滋市',1744,'421087',3), +(1753,'黄冈市',1671,'421100',2), +(1754,'黄州区',1753,'421102',3), +(1755,'团风县',1753,'421121',3), +(1756,'红安县',1753,'421122',3), +(1757,'罗田县',1753,'421123',3), +(1758,'英山县',1753,'421124',3), +(1759,'浠水县',1753,'421125',3), +(1760,'蕲春县',1753,'421126',3), +(1761,'黄梅县',1753,'421127',3), +(1762,'麻城市',1753,'421181',3), +(1763,'武穴市',1753,'421182',3), +(1764,'咸宁市',1671,'421200',2), +(1765,'咸安区',1764,'421202',3), +(1766,'嘉鱼县',1764,'421221',3), +(1767,'通城县',1764,'421222',3), +(1768,'崇阳县',1764,'421223',3), +(1769,'通山县',1764,'421224',3), +(1770,'赤壁市',1764,'421281',3), +(1771,'随州市',1671,'421300',2), +(1772,'曾都区',1771,'421303',3), +(1773,'随县',1771,'421321',3), +(1774,'广水市',1771,'421381',3), +(1775,'恩施土家族苗族自治州',1671,'422800',2), +(1776,'恩施市',1775,'422801',3), +(1777,'利川市',1775,'422802',3), +(1778,'建始县',1775,'422822',3), +(1779,'巴东县',1775,'422823',3), +(1780,'宣恩县',1775,'422825',3), +(1781,'咸丰县',1775,'422826',3), +(1782,'来凤县',1775,'422827',3), +(1783,'鹤峰县',1775,'422828',3), +(1784,'仙桃市',1671,'429004',3), +(1785,'潜江市',1671,'429005',3), +(1786,'天门市',1671,'429006',3), +(1787,'神农架林区',1671,'429021',3), +(1788,'湖南省',0,'430000',1), +(1789,'长沙市',1788,'430100',2), +(1790,'芙蓉区',1789,'430102',3), +(1791,'天心区',1789,'430103',3), +(1792,'岳麓区',1789,'430104',3), +(1793,'开福区',1789,'430105',3), +(1794,'雨花区',1789,'430111',3), +(1795,'望城区',1789,'430112',3), +(1796,'长沙县',1789,'430121',3), +(1797,'浏阳市',1789,'430181',3), +(1798,'宁乡市',1789,'430182',3), +(1799,'株洲市',1788,'430200',2), +(1800,'荷塘区',1799,'430202',3), +(1801,'芦淞区',1799,'430203',3), +(1802,'石峰区',1799,'430204',3), +(1803,'天元区',1799,'430211',3), +(1804,'渌口区',1799,'430212',3), +(1805,'攸县',1799,'430223',3), +(1806,'茶陵县',1799,'430224',3), +(1807,'炎陵县',1799,'430225',3), +(1808,'醴陵市',1799,'430281',3), +(1809,'湘潭市',1788,'430300',2), +(1810,'雨湖区',1809,'430302',3), +(1811,'岳塘区',1809,'430304',3), +(1812,'湘潭县',1809,'430321',3), +(1813,'湘乡市',1809,'430381',3), +(1814,'韶山市',1809,'430382',3), +(1815,'衡阳市',1788,'430400',2), +(1816,'珠晖区',1815,'430405',3), +(1817,'雁峰区',1815,'430406',3), +(1818,'石鼓区',1815,'430407',3), +(1819,'蒸湘区',1815,'430408',3), +(1820,'南岳区',1815,'430412',3), +(1821,'衡阳县',1815,'430421',3), +(1822,'衡南县',1815,'430422',3), +(1823,'衡山县',1815,'430423',3), +(1824,'衡东县',1815,'430424',3), +(1825,'祁东县',1815,'430426',3), +(1826,'耒阳市',1815,'430481',3), +(1827,'常宁市',1815,'430482',3), +(1828,'邵阳市',1788,'430500',2), +(1829,'双清区',1828,'430502',3), +(1830,'大祥区',1828,'430503',3), +(1831,'北塔区',1828,'430511',3), +(1832,'新邵县',1828,'430522',3), +(1833,'邵阳县',1828,'430523',3), +(1834,'隆回县',1828,'430524',3), +(1835,'洞口县',1828,'430525',3), +(1836,'绥宁县',1828,'430527',3), +(1837,'新宁县',1828,'430528',3), +(1838,'城步苗族自治县',1828,'430529',3), +(1839,'武冈市',1828,'430581',3), +(1840,'邵东市',1828,'430582',3), +(1841,'岳阳市',1788,'430600',2), +(1842,'岳阳楼区',1841,'430602',3), +(1843,'云溪区',1841,'430603',3), +(1844,'君山区',1841,'430611',3), +(1845,'岳阳县',1841,'430621',3), +(1846,'华容县',1841,'430623',3), +(1847,'湘阴县',1841,'430624',3), +(1848,'平江县',1841,'430626',3), +(1849,'汨罗市',1841,'430681',3), +(1850,'临湘市',1841,'430682',3), +(1851,'常德市',1788,'430700',2), +(1852,'武陵区',1851,'430702',3), +(1853,'鼎城区',1851,'430703',3), +(1854,'安乡县',1851,'430721',3), +(1855,'汉寿县',1851,'430722',3), +(1856,'澧县',1851,'430723',3), +(1857,'临澧县',1851,'430724',3), +(1858,'桃源县',1851,'430725',3), +(1859,'石门县',1851,'430726',3), +(1860,'津市市',1851,'430781',3), +(1861,'张家界市',1788,'430800',2), +(1862,'永定区',1861,'430802',3), +(1863,'武陵源区',1861,'430811',3), +(1864,'慈利县',1861,'430821',3), +(1865,'桑植县',1861,'430822',3), +(1866,'益阳市',1788,'430900',2), +(1867,'资阳区',1866,'430902',3), +(1868,'赫山区',1866,'430903',3), +(1869,'南县',1866,'430921',3), +(1870,'桃江县',1866,'430922',3), +(1871,'安化县',1866,'430923',3), +(1872,'沅江市',1866,'430981',3), +(1873,'郴州市',1788,'431000',2), +(1874,'北湖区',1873,'431002',3), +(1875,'苏仙区',1873,'431003',3), +(1876,'桂阳县',1873,'431021',3), +(1877,'宜章县',1873,'431022',3), +(1878,'永兴县',1873,'431023',3), +(1879,'嘉禾县',1873,'431024',3), +(1880,'临武县',1873,'431025',3), +(1881,'汝城县',1873,'431026',3), +(1882,'桂东县',1873,'431027',3), +(1883,'安仁县',1873,'431028',3), +(1884,'资兴市',1873,'431081',3), +(1885,'永州市',1788,'431100',2), +(1886,'零陵区',1885,'431102',3), +(1887,'冷水滩区',1885,'431103',3), +(1888,'祁阳县',1885,'431121',3), +(1889,'东安县',1885,'431122',3), +(1890,'双牌县',1885,'431123',3), +(1891,'道县',1885,'431124',3), +(1892,'江永县',1885,'431125',3), +(1893,'宁远县',1885,'431126',3), +(1894,'蓝山县',1885,'431127',3), +(1895,'新田县',1885,'431128',3), +(1896,'江华瑶族自治县',1885,'431129',3), +(1897,'怀化市',1788,'431200',2), +(1898,'鹤城区',1897,'431202',3), +(1899,'中方县',1897,'431221',3), +(1900,'沅陵县',1897,'431222',3), +(1901,'辰溪县',1897,'431223',3), +(1902,'溆浦县',1897,'431224',3), +(1903,'会同县',1897,'431225',3), +(1904,'麻阳苗族自治县',1897,'431226',3), +(1905,'新晃侗族自治县',1897,'431227',3), +(1906,'芷江侗族自治县',1897,'431228',3), +(1907,'靖州苗族侗族自治县',1897,'431229',3), +(1908,'通道侗族自治县',1897,'431230',3), +(1909,'洪江市',1897,'431281',3), +(1910,'娄底市',1788,'431300',2), +(1911,'娄星区',1910,'431302',3), +(1912,'双峰县',1910,'431321',3), +(1913,'新化县',1910,'431322',3), +(1914,'冷水江市',1910,'431381',3), +(1915,'涟源市',1910,'431382',3), +(1916,'湘西土家族苗族自治州',1788,'433100',2), +(1917,'吉首市',1916,'433101',3), +(1918,'泸溪县',1916,'433122',3), +(1919,'凤凰县',1916,'433123',3), +(1920,'花垣县',1916,'433124',3), +(1921,'保靖县',1916,'433125',3), +(1922,'古丈县',1916,'433126',3), +(1923,'永顺县',1916,'433127',3), +(1924,'龙山县',1916,'433130',3), +(1925,'广东省',0,'440000',1), +(1926,'广州市',1925,'440100',2), +(1927,'荔湾区',1926,'440103',3), +(1928,'越秀区',1926,'440104',3), +(1929,'海珠区',1926,'440105',3), +(1930,'天河区',1926,'440106',3), +(1931,'白云区',1926,'440111',3), +(1932,'黄埔区',1926,'440112',3), +(1933,'番禺区',1926,'440113',3), +(1934,'花都区',1926,'440114',3), +(1935,'南沙区',1926,'440115',3), +(1936,'从化区',1926,'440117',3), +(1937,'增城区',1926,'440118',3), +(1938,'韶关市',1925,'440200',2), +(1939,'武江区',1938,'440203',3), +(1940,'浈江区',1938,'440204',3), +(1941,'曲江区',1938,'440205',3), +(1942,'始兴县',1938,'440222',3), +(1943,'仁化县',1938,'440224',3), +(1944,'翁源县',1938,'440229',3), +(1945,'乳源瑶族自治县',1938,'440232',3), +(1946,'新丰县',1938,'440233',3), +(1947,'乐昌市',1938,'440281',3), +(1948,'南雄市',1938,'440282',3), +(1949,'深圳市',1925,'440300',2), +(1950,'罗湖区',1949,'440303',3), +(1951,'福田区',1949,'440304',3), +(1952,'南山区',1949,'440305',3), +(1953,'宝安区',1949,'440306',3), +(1954,'龙岗区',1949,'440307',3), +(1955,'盐田区',1949,'440308',3), +(1956,'龙华区',1949,'440309',3), +(1957,'坪山区',1949,'440310',3), +(1958,'光明区',1949,'440311',3), +(1959,'珠海市',1925,'440400',2), +(1960,'香洲区',1959,'440402',3), +(1961,'斗门区',1959,'440403',3), +(1962,'金湾区',1959,'440404',3), +(1963,'汕头市',1925,'440500',2), +(1964,'龙湖区',1963,'440507',3), +(1965,'金平区',1963,'440511',3), +(1966,'濠江区',1963,'440512',3), +(1967,'潮阳区',1963,'440513',3), +(1968,'潮南区',1963,'440514',3), +(1969,'澄海区',1963,'440515',3), +(1970,'南澳县',1963,'440523',3), +(1971,'佛山市',1925,'440600',2), +(1972,'禅城区',1971,'440604',3), +(1973,'南海区',1971,'440605',3), +(1974,'顺德区',1971,'440606',3), +(1975,'三水区',1971,'440607',3), +(1976,'高明区',1971,'440608',3), +(1977,'江门市',1925,'440700',2), +(1978,'蓬江区',1977,'440703',3), +(1979,'江海区',1977,'440704',3), +(1980,'新会区',1977,'440705',3), +(1981,'台山市',1977,'440781',3), +(1982,'开平市',1977,'440783',3), +(1983,'鹤山市',1977,'440784',3), +(1984,'恩平市',1977,'440785',3), +(1985,'湛江市',1925,'440800',2), +(1986,'赤坎区',1985,'440802',3), +(1987,'霞山区',1985,'440803',3), +(1988,'坡头区',1985,'440804',3), +(1989,'麻章区',1985,'440811',3), +(1990,'遂溪县',1985,'440823',3), +(1991,'徐闻县',1985,'440825',3), +(1992,'廉江市',1985,'440881',3), +(1993,'雷州市',1985,'440882',3), +(1994,'吴川市',1985,'440883',3), +(1995,'茂名市',1925,'440900',2), +(1996,'茂南区',1995,'440902',3), +(1997,'电白区',1995,'440904',3), +(1998,'高州市',1995,'440981',3), +(1999,'化州市',1995,'440982',3), +(2000,'信宜市',1995,'440983',3), +(2001,'肇庆市',1925,'441200',2), +(2002,'端州区',2001,'441202',3), +(2003,'鼎湖区',2001,'441203',3), +(2004,'高要区',2001,'441204',3), +(2005,'广宁县',2001,'441223',3), +(2006,'怀集县',2001,'441224',3), +(2007,'封开县',2001,'441225',3), +(2008,'德庆县',2001,'441226',3), +(2009,'四会市',2001,'441284',3), +(2010,'惠州市',1925,'441300',2), +(2011,'惠城区',2010,'441302',3), +(2012,'惠阳区',2010,'441303',3), +(2013,'博罗县',2010,'441322',3), +(2014,'惠东县',2010,'441323',3), +(2015,'龙门县',2010,'441324',3), +(2016,'梅州市',1925,'441400',2), +(2017,'梅江区',2016,'441402',3), +(2018,'梅县区',2016,'441403',3), +(2019,'大埔县',2016,'441422',3), +(2020,'丰顺县',2016,'441423',3), +(2021,'五华县',2016,'441424',3), +(2022,'平远县',2016,'441426',3), +(2023,'蕉岭县',2016,'441427',3), +(2024,'兴宁市',2016,'441481',3), +(2025,'汕尾市',1925,'441500',2), +(2026,'城区',2025,'441502',3), +(2027,'海丰县',2025,'441521',3), +(2028,'陆河县',2025,'441523',3), +(2029,'陆丰市',2025,'441581',3), +(2030,'河源市',1925,'441600',2), +(2031,'源城区',2030,'441602',3), +(2032,'紫金县',2030,'441621',3), +(2033,'龙川县',2030,'441622',3), +(2034,'连平县',2030,'441623',3), +(2035,'和平县',2030,'441624',3), +(2036,'东源县',2030,'441625',3), +(2037,'阳江市',1925,'441700',2), +(2038,'江城区',2037,'441702',3), +(2039,'阳东区',2037,'441704',3), +(2040,'阳西县',2037,'441721',3), +(2041,'阳春市',2037,'441781',3), +(2042,'清远市',1925,'441800',2), +(2043,'清城区',2042,'441802',3), +(2044,'清新区',2042,'441803',3), +(2045,'佛冈县',2042,'441821',3), +(2046,'阳山县',2042,'441823',3), +(2047,'连山壮族瑶族自治县',2042,'441825',3), +(2048,'连南瑶族自治县',2042,'441826',3), +(2049,'英德市',2042,'441881',3), +(2050,'连州市',2042,'441882',3), +(2051,'东莞市',1925,'441900',2), +(2052,'中山市',1925,'442000',2), +(2053,'潮州市',1925,'445100',2), +(2054,'湘桥区',2053,'445102',3), +(2055,'潮安区',2053,'445103',3), +(2056,'饶平县',2053,'445122',3), +(2057,'揭阳市',1925,'445200',2), +(2058,'榕城区',2057,'445202',3), +(2059,'揭东区',2057,'445203',3), +(2060,'揭西县',2057,'445222',3), +(2061,'惠来县',2057,'445224',3), +(2062,'普宁市',2057,'445281',3), +(2063,'云浮市',1925,'445300',2), +(2064,'云城区',2063,'445302',3), +(2065,'云安区',2063,'445303',3), +(2066,'新兴县',2063,'445321',3), +(2067,'郁南县',2063,'445322',3), +(2068,'罗定市',2063,'445381',3), +(2069,'广西壮族自治区',0,'450000',1), +(2070,'南宁市',2069,'450100',2), +(2071,'兴宁区',2070,'450102',3), +(2072,'青秀区',2070,'450103',3), +(2073,'江南区',2070,'450105',3), +(2074,'西乡塘区',2070,'450107',3), +(2075,'良庆区',2070,'450108',3), +(2076,'邕宁区',2070,'450109',3), +(2077,'武鸣区',2070,'450110',3), +(2078,'隆安县',2070,'450123',3), +(2079,'马山县',2070,'450124',3), +(2080,'上林县',2070,'450125',3), +(2081,'宾阳县',2070,'450126',3), +(2082,'横县',2070,'450127',3), +(2083,'柳州市',2069,'450200',2), +(2084,'城中区',2083,'450202',3), +(2085,'鱼峰区',2083,'450203',3), +(2086,'柳南区',2083,'450204',3), +(2087,'柳北区',2083,'450205',3), +(2088,'柳江区',2083,'450206',3), +(2089,'柳城县',2083,'450222',3), +(2090,'鹿寨县',2083,'450223',3), +(2091,'融安县',2083,'450224',3), +(2092,'融水苗族自治县',2083,'450225',3), +(2093,'三江侗族自治县',2083,'450226',3), +(2094,'桂林市',2069,'450300',2), +(2095,'秀峰区',2094,'450302',3), +(2096,'叠彩区',2094,'450303',3), +(2097,'象山区',2094,'450304',3), +(2098,'七星区',2094,'450305',3), +(2099,'雁山区',2094,'450311',3), +(2100,'临桂区',2094,'450312',3), +(2101,'阳朔县',2094,'450321',3), +(2102,'灵川县',2094,'450323',3), +(2103,'全州县',2094,'450324',3), +(2104,'兴安县',2094,'450325',3), +(2105,'永福县',2094,'450326',3), +(2106,'灌阳县',2094,'450327',3), +(2107,'龙胜各族自治县',2094,'450328',3), +(2108,'资源县',2094,'450329',3), +(2109,'平乐县',2094,'450330',3), +(2110,'荔浦市',2094,'450381',3), +(2111,'恭城瑶族自治县',2094,'450332',3), +(2112,'梧州市',2069,'450400',2), +(2113,'万秀区',2112,'450403',3), +(2114,'长洲区',2112,'450405',3), +(2115,'龙圩区',2112,'450406',3), +(2116,'苍梧县',2112,'450421',3), +(2117,'藤县',2112,'450422',3), +(2118,'蒙山县',2112,'450423',3), +(2119,'岑溪市',2112,'450481',3), +(2120,'北海市',2069,'450500',2), +(2121,'海城区',2120,'450502',3), +(2122,'银海区',2120,'450503',3), +(2123,'铁山港区',2120,'450512',3), +(2124,'合浦县',2120,'450521',3), +(2125,'防城港市',2069,'450600',2), +(2126,'港口区',2125,'450602',3), +(2127,'防城区',2125,'450603',3), +(2128,'上思县',2125,'450621',3), +(2129,'东兴市',2125,'450681',3), +(2130,'钦州市',2069,'450700',2), +(2131,'钦南区',2130,'450702',3), +(2132,'钦北区',2130,'450703',3), +(2133,'灵山县',2130,'450721',3), +(2134,'浦北县',2130,'450722',3), +(2135,'贵港市',2069,'450800',2), +(2136,'港北区',2135,'450802',3), +(2137,'港南区',2135,'450803',3), +(2138,'覃塘区',2135,'450804',3), +(2139,'平南县',2135,'450821',3), +(2140,'桂平市',2135,'450881',3), +(2141,'玉林市',2069,'450900',2), +(2142,'玉州区',2141,'450902',3), +(2143,'福绵区',2141,'450903',3), +(2144,'容县',2141,'450921',3), +(2145,'陆川县',2141,'450922',3), +(2146,'博白县',2141,'450923',3), +(2147,'兴业县',2141,'450924',3), +(2148,'北流市',2141,'450981',3), +(2149,'百色市',2069,'451000',2), +(2150,'右江区',2149,'451002',3), +(2151,'田阳区',2149,'451003',3), +(2152,'田东县',2149,'451022',3), +(2153,'德保县',2149,'451024',3), +(2154,'那坡县',2149,'451026',3), +(2155,'凌云县',2149,'451027',3), +(2156,'乐业县',2149,'451028',3), +(2157,'田林县',2149,'451029',3), +(2158,'西林县',2149,'451030',3), +(2159,'隆林各族自治县',2149,'451031',3), +(2160,'靖西市',2149,'451081',3), +(2161,'平果市',2149,'451082',3), +(2162,'贺州市',2069,'451100',2), +(2163,'八步区',2162,'451102',3), +(2164,'平桂区',2162,'451103',3), +(2165,'昭平县',2162,'451121',3), +(2166,'钟山县',2162,'451122',3), +(2167,'富川瑶族自治县',2162,'451123',3), +(2168,'河池市',2069,'451200',2), +(2169,'金城江区',2168,'451202',3), +(2170,'宜州区',2168,'451203',3), +(2171,'南丹县',2168,'451221',3), +(2172,'天峨县',2168,'451222',3), +(2173,'凤山县',2168,'451223',3), +(2174,'东兰县',2168,'451224',3), +(2175,'罗城仫佬族自治县',2168,'451225',3), +(2176,'环江毛南族自治县',2168,'451226',3), +(2177,'巴马瑶族自治县',2168,'451227',3), +(2178,'都安瑶族自治县',2168,'451228',3), +(2179,'大化瑶族自治县',2168,'451229',3), +(2180,'来宾市',2069,'451300',2), +(2181,'兴宾区',2180,'451302',3), +(2182,'忻城县',2180,'451321',3), +(2183,'象州县',2180,'451322',3), +(2184,'武宣县',2180,'451323',3), +(2185,'金秀瑶族自治县',2180,'451324',3), +(2186,'合山市',2180,'451381',3), +(2187,'崇左市',2069,'451400',2), +(2188,'江州区',2187,'451402',3), +(2189,'扶绥县',2187,'451421',3), +(2190,'宁明县',2187,'451422',3), +(2191,'龙州县',2187,'451423',3), +(2192,'大新县',2187,'451424',3), +(2193,'天等县',2187,'451425',3), +(2194,'凭祥市',2187,'451481',3), +(2195,'海南省',0,'460000',1), +(2196,'海口市',2195,'460100',2), +(2197,'秀英区',2196,'460105',3), +(2198,'龙华区',2196,'460106',3), +(2199,'琼山区',2196,'460107',3), +(2200,'美兰区',2196,'460108',3), +(2201,'三亚市',2195,'460200',2), +(2202,'海棠区',2201,'460202',3), +(2203,'吉阳区',2201,'460203',3), +(2204,'天涯区',2201,'460204',3), +(2205,'崖州区',2201,'460205',3), +(2206,'三沙市',2195,'460300',2), +(2207,'儋州市',2195,'460400',2), +(2208,'五指山市',2195,'469001',3), +(2209,'琼海市',2195,'469002',3), +(2210,'文昌市',2195,'469005',3), +(2211,'万宁市',2195,'469006',3), +(2212,'东方市',2195,'469007',3), +(2213,'定安县',2195,'469021',3), +(2214,'屯昌县',2195,'469022',3), +(2215,'澄迈县',2195,'469023',3), +(2216,'临高县',2195,'469024',3), +(2217,'白沙黎族自治县',2195,'469025',3), +(2218,'昌江黎族自治县',2195,'469026',3), +(2219,'乐东黎族自治县',2195,'469027',3), +(2220,'陵水黎族自治县',2195,'469028',3), +(2221,'保亭黎族苗族自治县',2195,'469029',3), +(2222,'琼中黎族苗族自治县',2195,'469030',3), +(2223,'重庆',0,'500000',1), +(2224,'重庆市',2223,'500010',2), +(2225,'万州区',2224,'500101',3), +(2226,'涪陵区',2224,'500102',3), +(2227,'渝中区',2224,'500103',3), +(2228,'大渡口区',2224,'500104',3), +(2229,'江北区',2224,'500105',3), +(2230,'沙坪坝区',2224,'500106',3), +(2231,'九龙坡区',2224,'500107',3), +(2232,'南岸区',2224,'500108',3), +(2233,'北碚区',2224,'500109',3), +(2234,'綦江区',2224,'500110',3), +(2235,'大足区',2224,'500111',3), +(2236,'渝北区',2224,'500112',3), +(2237,'巴南区',2224,'500113',3), +(2238,'黔江区',2224,'500114',3), +(2239,'长寿区',2224,'500115',3), +(2240,'江津区',2224,'500116',3), +(2241,'合川区',2224,'500117',3), +(2242,'永川区',2224,'500118',3), +(2243,'南川区',2224,'500119',3), +(2244,'璧山区',2224,'500120',3), +(2245,'铜梁区',2224,'500151',3), +(2246,'潼南区',2224,'500152',3), +(2247,'荣昌区',2224,'500153',3), +(2248,'开州区',2224,'500154',3), +(2249,'梁平区',2224,'500155',3), +(2250,'武隆区',2224,'500156',3), +(2251,'城口县',2224,'500229',3), +(2252,'丰都县',2224,'500230',3), +(2253,'垫江县',2224,'500231',3), +(2254,'忠县',2224,'500233',3), +(2255,'云阳县',2224,'500235',3), +(2256,'奉节县',2224,'500236',3), +(2257,'巫山县',2224,'500237',3), +(2258,'巫溪县',2224,'500238',3), +(2259,'石柱土家族自治县',2224,'500240',3), +(2260,'秀山土家族苗族自治县',2224,'500241',3), +(2261,'酉阳土家族苗族自治县',2224,'500242',3), +(2262,'彭水苗族土家族自治县',2224,'500243',3), +(2263,'四川省',0,'510000',1), +(2264,'成都市',2263,'510100',2), +(2265,'锦江区',2264,'510104',3), +(2266,'青羊区',2264,'510105',3), +(2267,'金牛区',2264,'510106',3), +(2268,'武侯区',2264,'510107',3), +(2269,'成华区',2264,'510108',3), +(2270,'龙泉驿区',2264,'510112',3), +(2271,'青白江区',2264,'510113',3), +(2272,'新都区',2264,'510114',3), +(2273,'温江区',2264,'510115',3), +(2274,'双流区',2264,'510116',3), +(2275,'郫都区',2264,'510117',3), +(2276,'金堂县',2264,'510121',3), +(2277,'大邑县',2264,'510129',3), +(2278,'蒲江县',2264,'510131',3), +(2279,'新津县',2264,'510132',3), +(2280,'都江堰市',2264,'510181',3), +(2281,'彭州市',2264,'510182',3), +(2282,'邛崃市',2264,'510183',3), +(2283,'崇州市',2264,'510184',3), +(2284,'简阳市',2264,'510185',3), +(2285,'自贡市',2263,'510300',2), +(2286,'自流井区',2285,'510302',3), +(2287,'贡井区',2285,'510303',3), +(2288,'大安区',2285,'510304',3), +(2289,'沿滩区',2285,'510311',3), +(2290,'荣县',2285,'510321',3), +(2291,'富顺县',2285,'510322',3), +(2292,'攀枝花市',2263,'510400',2), +(2293,'东区',2292,'510402',3), +(2294,'西区',2292,'510403',3), +(2295,'仁和区',2292,'510411',3), +(2296,'米易县',2292,'510421',3), +(2297,'盐边县',2292,'510422',3), +(2298,'泸州市',2263,'510500',2), +(2299,'江阳区',2298,'510502',3), +(2300,'纳溪区',2298,'510503',3), +(2301,'龙马潭区',2298,'510504',3), +(2302,'泸县',2298,'510521',3), +(2303,'合江县',2298,'510522',3), +(2304,'叙永县',2298,'510524',3), +(2305,'古蔺县',2298,'510525',3), +(2306,'德阳市',2263,'510600',2), +(2307,'旌阳区',2306,'510603',3), +(2308,'罗江区',2306,'510604',3), +(2309,'中江县',2306,'510623',3), +(2310,'广汉市',2306,'510681',3), +(2311,'什邡市',2306,'510682',3), +(2312,'绵竹市',2306,'510683',3), +(2313,'绵阳市',2263,'510700',2), +(2314,'涪城区',2313,'510703',3), +(2315,'游仙区',2313,'510704',3), +(2316,'安州区',2313,'510705',3), +(2317,'三台县',2313,'510722',3), +(2318,'盐亭县',2313,'510723',3), +(2319,'梓潼县',2313,'510725',3), +(2320,'北川羌族自治县',2313,'510726',3), +(2321,'平武县',2313,'510727',3), +(2322,'江油市',2313,'510781',3), +(2323,'广元市',2263,'510800',2), +(2324,'利州区',2323,'510802',3), +(2325,'昭化区',2323,'510811',3), +(2326,'朝天区',2323,'510812',3), +(2327,'旺苍县',2323,'510821',3), +(2328,'青川县',2323,'510822',3), +(2329,'剑阁县',2323,'510823',3), +(2330,'苍溪县',2323,'510824',3), +(2331,'遂宁市',2263,'510900',2), +(2332,'船山区',2331,'510903',3), +(2333,'安居区',2331,'510904',3), +(2334,'蓬溪县',2331,'510921',3), +(2335,'大英县',2331,'510923',3), +(2336,'射洪市',2331,'510981',3), +(2337,'内江市',2263,'511000',2), +(2338,'市中区',2337,'511002',3), +(2339,'东兴区',2337,'511011',3), +(2340,'威远县',2337,'511024',3), +(2341,'资中县',2337,'511025',3), +(2342,'隆昌市',2337,'511083',3), +(2343,'乐山市',2263,'511100',2), +(2344,'市中区',2343,'511102',3), +(2345,'沙湾区',2343,'511111',3), +(2346,'五通桥区',2343,'511112',3), +(2347,'金口河区',2343,'511113',3), +(2348,'犍为县',2343,'511123',3), +(2349,'井研县',2343,'511124',3), +(2350,'夹江县',2343,'511126',3), +(2351,'沐川县',2343,'511129',3), +(2352,'峨边彝族自治县',2343,'511132',3), +(2353,'马边彝族自治县',2343,'511133',3), +(2354,'峨眉山市',2343,'511181',3), +(2355,'南充市',2263,'511300',2), +(2356,'顺庆区',2355,'511302',3), +(2357,'高坪区',2355,'511303',3), +(2358,'嘉陵区',2355,'511304',3), +(2359,'南部县',2355,'511321',3), +(2360,'营山县',2355,'511322',3), +(2361,'蓬安县',2355,'511323',3), +(2362,'仪陇县',2355,'511324',3), +(2363,'西充县',2355,'511325',3), +(2364,'阆中市',2355,'511381',3), +(2365,'眉山市',2263,'511400',2), +(2366,'东坡区',2365,'511402',3), +(2367,'彭山区',2365,'511403',3), +(2368,'仁寿县',2365,'511421',3), +(2369,'洪雅县',2365,'511423',3), +(2370,'丹棱县',2365,'511424',3), +(2371,'青神县',2365,'511425',3), +(2372,'宜宾市',2263,'511500',2), +(2373,'翠屏区',2372,'511502',3), +(2374,'南溪区',2372,'511503',3), +(2375,'叙州区',2372,'511504',3), +(2376,'江安县',2372,'511523',3), +(2377,'长宁县',2372,'511524',3), +(2378,'高县',2372,'511525',3), +(2379,'珙县',2372,'511526',3), +(2380,'筠连县',2372,'511527',3), +(2381,'兴文县',2372,'511528',3), +(2382,'屏山县',2372,'511529',3), +(2383,'广安市',2263,'511600',2), +(2384,'广安区',2383,'511602',3), +(2385,'前锋区',2383,'511603',3), +(2386,'岳池县',2383,'511621',3), +(2387,'武胜县',2383,'511622',3), +(2388,'邻水县',2383,'511623',3), +(2389,'华蓥市',2383,'511681',3), +(2390,'达州市',2263,'511700',2), +(2391,'通川区',2390,'511702',3), +(2392,'达川区',2390,'511703',3), +(2393,'宣汉县',2390,'511722',3), +(2394,'开江县',2390,'511723',3), +(2395,'大竹县',2390,'511724',3), +(2396,'渠县',2390,'511725',3), +(2397,'万源市',2390,'511781',3), +(2398,'雅安市',2263,'511800',2), +(2399,'雨城区',2398,'511802',3), +(2400,'名山区',2398,'511803',3), +(2401,'荥经县',2398,'511822',3), +(2402,'汉源县',2398,'511823',3), +(2403,'石棉县',2398,'511824',3), +(2404,'天全县',2398,'511825',3), +(2405,'芦山县',2398,'511826',3), +(2406,'宝兴县',2398,'511827',3), +(2407,'巴中市',2263,'511900',2), +(2408,'巴州区',2407,'511902',3), +(2409,'恩阳区',2407,'511903',3), +(2410,'通江县',2407,'511921',3), +(2411,'南江县',2407,'511922',3), +(2412,'平昌县',2407,'511923',3), +(2413,'资阳市',2263,'512000',2), +(2414,'雁江区',2413,'512002',3), +(2415,'安岳县',2413,'512021',3), +(2416,'乐至县',2413,'512022',3), +(2417,'阿坝藏族羌族自治州',2263,'513200',2), +(2418,'马尔康市',2417,'513201',3), +(2419,'汶川县',2417,'513221',3), +(2420,'理县',2417,'513222',3), +(2421,'茂县',2417,'513223',3), +(2422,'松潘县',2417,'513224',3), +(2423,'九寨沟县',2417,'513225',3), +(2424,'金川县',2417,'513226',3), +(2425,'小金县',2417,'513227',3), +(2426,'黑水县',2417,'513228',3), +(2427,'壤塘县',2417,'513230',3), +(2428,'阿坝县',2417,'513231',3), +(2429,'若尔盖县',2417,'513232',3), +(2430,'红原县',2417,'513233',3), +(2431,'甘孜藏族自治州',2263,'513300',2), +(2432,'康定市',2431,'513301',3), +(2433,'泸定县',2431,'513322',3), +(2434,'丹巴县',2431,'513323',3), +(2435,'九龙县',2431,'513324',3), +(2436,'雅江县',2431,'513325',3), +(2437,'道孚县',2431,'513326',3), +(2438,'炉霍县',2431,'513327',3), +(2439,'甘孜县',2431,'513328',3), +(2440,'新龙县',2431,'513329',3), +(2441,'德格县',2431,'513330',3), +(2442,'白玉县',2431,'513331',3), +(2443,'石渠县',2431,'513332',3), +(2444,'色达县',2431,'513333',3), +(2445,'理塘县',2431,'513334',3), +(2446,'巴塘县',2431,'513335',3), +(2447,'乡城县',2431,'513336',3), +(2448,'稻城县',2431,'513337',3), +(2449,'得荣县',2431,'513338',3), +(2450,'凉山彝族自治州',2263,'513400',2), +(2451,'西昌市',2450,'513401',3), +(2452,'木里藏族自治县',2450,'513422',3), +(2453,'盐源县',2450,'513423',3), +(2454,'德昌县',2450,'513424',3), +(2455,'会理县',2450,'513425',3), +(2456,'会东县',2450,'513426',3), +(2457,'宁南县',2450,'513427',3), +(2458,'普格县',2450,'513428',3), +(2459,'布拖县',2450,'513429',3), +(2460,'金阳县',2450,'513430',3), +(2461,'昭觉县',2450,'513431',3), +(2462,'喜德县',2450,'513432',3), +(2463,'冕宁县',2450,'513433',3), +(2464,'越西县',2450,'513434',3), +(2465,'甘洛县',2450,'513435',3), +(2466,'美姑县',2450,'513436',3), +(2467,'雷波县',2450,'513437',3), +(2468,'贵州省',0,'520000',1), +(2469,'贵阳市',2468,'520100',2), +(2470,'南明区',2469,'520102',3), +(2471,'云岩区',2469,'520103',3), +(2472,'花溪区',2469,'520111',3), +(2473,'乌当区',2469,'520112',3), +(2474,'白云区',2469,'520113',3), +(2475,'观山湖区',2469,'520115',3), +(2476,'开阳县',2469,'520121',3), +(2477,'息烽县',2469,'520122',3), +(2478,'修文县',2469,'520123',3), +(2479,'清镇市',2469,'520181',3), +(2480,'六盘水市',2468,'520200',2), +(2481,'钟山区',2480,'520201',3), +(2482,'六枝特区',2480,'520203',3), +(2483,'水城县',2480,'520221',3), +(2484,'盘州市',2480,'520281',3), +(2485,'遵义市',2468,'520300',2), +(2486,'红花岗区',2485,'520302',3), +(2487,'汇川区',2485,'520303',3), +(2488,'播州区',2485,'520304',3), +(2489,'桐梓县',2485,'520322',3), +(2490,'绥阳县',2485,'520323',3), +(2491,'正安县',2485,'520324',3), +(2492,'道真仡佬族苗族自治县',2485,'520325',3), +(2493,'务川仡佬族苗族自治县',2485,'520326',3), +(2494,'凤冈县',2485,'520327',3), +(2495,'湄潭县',2485,'520328',3), +(2496,'余庆县',2485,'520329',3), +(2497,'习水县',2485,'520330',3), +(2498,'赤水市',2485,'520381',3), +(2499,'仁怀市',2485,'520382',3), +(2500,'安顺市',2468,'520400',2), +(2501,'西秀区',2500,'520402',3), +(2502,'平坝区',2500,'520403',3), +(2503,'普定县',2500,'520422',3), +(2504,'镇宁布依族苗族自治县',2500,'520423',3), +(2505,'关岭布依族苗族自治县',2500,'520424',3), +(2506,'紫云苗族布依族自治县',2500,'520425',3), +(2507,'毕节市',2468,'520500',2), +(2508,'七星关区',2507,'520502',3), +(2509,'大方县',2507,'520521',3), +(2510,'黔西县',2507,'520522',3), +(2511,'金沙县',2507,'520523',3), +(2512,'织金县',2507,'520524',3), +(2513,'纳雍县',2507,'520525',3), +(2514,'威宁彝族回族苗族自治县',2507,'520526',3), +(2515,'赫章县',2507,'520527',3), +(2516,'铜仁市',2468,'520600',2), +(2517,'碧江区',2516,'520602',3), +(2518,'万山区',2516,'520603',3), +(2519,'江口县',2516,'520621',3), +(2520,'玉屏侗族自治县',2516,'520622',3), +(2521,'石阡县',2516,'520623',3), +(2522,'思南县',2516,'520624',3), +(2523,'印江土家族苗族自治县',2516,'520625',3), +(2524,'德江县',2516,'520626',3), +(2525,'沿河土家族自治县',2516,'520627',3), +(2526,'松桃苗族自治县',2516,'520628',3), +(2527,'黔西南布依族苗族自治州',2468,'522300',2), +(2528,'兴义市',2527,'522301',3), +(2529,'兴仁市',2527,'522302',3), +(2530,'普安县',2527,'522323',3), +(2531,'晴隆县',2527,'522324',3), +(2532,'贞丰县',2527,'522325',3), +(2533,'望谟县',2527,'522326',3), +(2534,'册亨县',2527,'522327',3), +(2535,'安龙县',2527,'522328',3), +(2536,'黔东南苗族侗族自治州',2468,'522600',2), +(2537,'凯里市',2536,'522601',3), +(2538,'黄平县',2536,'522622',3), +(2539,'施秉县',2536,'522623',3), +(2540,'三穗县',2536,'522624',3), +(2541,'镇远县',2536,'522625',3), +(2542,'岑巩县',2536,'522626',3), +(2543,'天柱县',2536,'522627',3), +(2544,'锦屏县',2536,'522628',3), +(2545,'剑河县',2536,'522629',3), +(2546,'台江县',2536,'522630',3), +(2547,'黎平县',2536,'522631',3), +(2548,'榕江县',2536,'522632',3), +(2549,'从江县',2536,'522633',3), +(2550,'雷山县',2536,'522634',3), +(2551,'麻江县',2536,'522635',3), +(2552,'丹寨县',2536,'522636',3), +(2553,'黔南布依族苗族自治州',2468,'522700',2), +(2554,'都匀市',2553,'522701',3), +(2555,'福泉市',2553,'522702',3), +(2556,'荔波县',2553,'522722',3), +(2557,'贵定县',2553,'522723',3), +(2558,'瓮安县',2553,'522725',3), +(2559,'独山县',2553,'522726',3), +(2560,'平塘县',2553,'522727',3), +(2561,'罗甸县',2553,'522728',3), +(2562,'长顺县',2553,'522729',3), +(2563,'龙里县',2553,'522730',3), +(2564,'惠水县',2553,'522731',3), +(2565,'三都水族自治县',2553,'522732',3), +(2566,'云南省',0,'530000',1), +(2567,'昆明市',2566,'530100',2), +(2568,'五华区',2567,'530102',3), +(2569,'盘龙区',2567,'530103',3), +(2570,'官渡区',2567,'530111',3), +(2571,'西山区',2567,'530112',3), +(2572,'东川区',2567,'530113',3), +(2573,'呈贡区',2567,'530114',3), +(2574,'晋宁区',2567,'530115',3), +(2575,'富民县',2567,'530124',3), +(2576,'宜良县',2567,'530125',3), +(2577,'石林彝族自治县',2567,'530126',3), +(2578,'嵩明县',2567,'530127',3), +(2579,'禄劝彝族苗族自治县',2567,'530128',3), +(2580,'寻甸回族彝族自治县',2567,'530129',3), +(2581,'安宁市',2567,'530181',3), +(2582,'曲靖市',2566,'530300',2), +(2583,'麒麟区',2582,'530302',3), +(2584,'沾益区',2582,'530303',3), +(2585,'马龙区',2582,'530304',3), +(2586,'陆良县',2582,'530322',3), +(2587,'师宗县',2582,'530323',3), +(2588,'罗平县',2582,'530324',3), +(2589,'富源县',2582,'530325',3), +(2590,'会泽县',2582,'530326',3), +(2591,'宣威市',2582,'530381',3), +(2592,'玉溪市',2566,'530400',2), +(2593,'红塔区',2592,'530402',3), +(2594,'江川区',2592,'530403',3), +(2595,'通海县',2592,'530423',3), +(2596,'华宁县',2592,'530424',3), +(2597,'易门县',2592,'530425',3), +(2598,'峨山彝族自治县',2592,'530426',3), +(2599,'新平彝族傣族自治县',2592,'530427',3), +(2600,'元江哈尼族彝族傣族自治县',2592,'530428',3), +(2601,'澄江市',2592,'530481',3), +(2602,'保山市',2566,'530500',2), +(2603,'隆阳区',2602,'530502',3), +(2604,'施甸县',2602,'530521',3), +(2605,'龙陵县',2602,'530523',3), +(2606,'昌宁县',2602,'530524',3), +(2607,'腾冲市',2602,'530581',3), +(2608,'昭通市',2566,'530600',2), +(2609,'昭阳区',2608,'530602',3), +(2610,'鲁甸县',2608,'530621',3), +(2611,'巧家县',2608,'530622',3), +(2612,'盐津县',2608,'530623',3), +(2613,'大关县',2608,'530624',3), +(2614,'永善县',2608,'530625',3), +(2615,'绥江县',2608,'530626',3), +(2616,'镇雄县',2608,'530627',3), +(2617,'彝良县',2608,'530628',3), +(2618,'威信县',2608,'530629',3), +(2619,'水富市',2608,'530681',3), +(2620,'丽江市',2566,'530700',2), +(2621,'古城区',2620,'530702',3), +(2622,'玉龙纳西族自治县',2620,'530721',3), +(2623,'永胜县',2620,'530722',3), +(2624,'华坪县',2620,'530723',3), +(2625,'宁蒗彝族自治县',2620,'530724',3), +(2626,'普洱市',2566,'530800',2), +(2627,'思茅区',2626,'530802',3), +(2628,'宁洱哈尼族彝族自治县',2626,'530821',3), +(2629,'墨江哈尼族自治县',2626,'530822',3), +(2630,'景东彝族自治县',2626,'530823',3), +(2631,'景谷傣族彝族自治县',2626,'530824',3), +(2632,'镇沅彝族哈尼族拉祜族自治县',2626,'530825',3), +(2633,'江城哈尼族彝族自治县',2626,'530826',3), +(2634,'孟连傣族拉祜族佤族自治县',2626,'530827',3), +(2635,'澜沧拉祜族自治县',2626,'530828',3), +(2636,'西盟佤族自治县',2626,'530829',3), +(2637,'临沧市',2566,'530900',2), +(2638,'临翔区',2637,'530902',3), +(2639,'凤庆县',2637,'530921',3), +(2640,'云县',2637,'530922',3), +(2641,'永德县',2637,'530923',3), +(2642,'镇康县',2637,'530924',3), +(2643,'双江拉祜族佤族布朗族傣族自治县',2637,'530925',3), +(2644,'耿马傣族佤族自治县',2637,'530926',3), +(2645,'沧源佤族自治县',2637,'530927',3), +(2646,'楚雄彝族自治州',2566,'532300',2), +(2647,'楚雄市',2646,'532301',3), +(2648,'双柏县',2646,'532322',3), +(2649,'牟定县',2646,'532323',3), +(2650,'南华县',2646,'532324',3), +(2651,'姚安县',2646,'532325',3), +(2652,'大姚县',2646,'532326',3), +(2653,'永仁县',2646,'532327',3), +(2654,'元谋县',2646,'532328',3), +(2655,'武定县',2646,'532329',3), +(2656,'禄丰县',2646,'532331',3), +(2657,'红河哈尼族彝族自治州',2566,'532500',2), +(2658,'个旧市',2657,'532501',3), +(2659,'开远市',2657,'532502',3), +(2660,'蒙自市',2657,'532503',3), +(2661,'弥勒市',2657,'532504',3), +(2662,'屏边苗族自治县',2657,'532523',3), +(2663,'建水县',2657,'532524',3), +(2664,'石屏县',2657,'532525',3), +(2665,'泸西县',2657,'532527',3), +(2666,'元阳县',2657,'532528',3), +(2667,'红河县',2657,'532529',3), +(2668,'金平苗族瑶族傣族自治县',2657,'532530',3), +(2669,'绿春县',2657,'532531',3), +(2670,'河口瑶族自治县',2657,'532532',3), +(2671,'文山壮族苗族自治州',2566,'532600',2), +(2672,'文山市',2671,'532601',3), +(2673,'砚山县',2671,'532622',3), +(2674,'西畴县',2671,'532623',3), +(2675,'麻栗坡县',2671,'532624',3), +(2676,'马关县',2671,'532625',3), +(2677,'丘北县',2671,'532626',3), +(2678,'广南县',2671,'532627',3), +(2679,'富宁县',2671,'532628',3), +(2680,'西双版纳傣族自治州',2566,'532800',2), +(2681,'景洪市',2680,'532801',3), +(2682,'勐海县',2680,'532822',3), +(2683,'勐腊县',2680,'532823',3), +(2684,'大理白族自治州',2566,'532900',2), +(2685,'大理市',2684,'532901',3), +(2686,'漾濞彝族自治县',2684,'532922',3), +(2687,'祥云县',2684,'532923',3), +(2688,'宾川县',2684,'532924',3), +(2689,'弥渡县',2684,'532925',3), +(2690,'南涧彝族自治县',2684,'532926',3), +(2691,'巍山彝族回族自治县',2684,'532927',3), +(2692,'永平县',2684,'532928',3), +(2693,'云龙县',2684,'532929',3), +(2694,'洱源县',2684,'532930',3), +(2695,'剑川县',2684,'532931',3), +(2696,'鹤庆县',2684,'532932',3), +(2697,'德宏傣族景颇族自治州',2566,'533100',2), +(2698,'瑞丽市',2697,'533102',3), +(2699,'芒市',2697,'533103',3), +(2700,'梁河县',2697,'533122',3), +(2701,'盈江县',2697,'533123',3), +(2702,'陇川县',2697,'533124',3), +(2703,'怒江傈僳族自治州',2566,'533300',2), +(2704,'泸水市',2703,'533301',3), +(2705,'福贡县',2703,'533323',3), +(2706,'贡山独龙族怒族自治县',2703,'533324',3), +(2707,'兰坪白族普米族自治县',2703,'533325',3), +(2708,'迪庆藏族自治州',2566,'533400',2), +(2709,'香格里拉市',2708,'533401',3), +(2710,'德钦县',2708,'533422',3), +(2711,'维西傈僳族自治县',2708,'533423',3), +(2712,'西藏自治区',0,'540000',1), +(2713,'拉萨市',2712,'540100',2), +(2714,'城关区',2713,'540102',3), +(2715,'堆龙德庆区',2713,'540103',3), +(2716,'达孜区',2713,'540104',3), +(2717,'林周县',2713,'540121',3), +(2718,'当雄县',2713,'540122',3), +(2719,'尼木县',2713,'540123',3), +(2720,'曲水县',2713,'540124',3), +(2721,'墨竹工卡县',2713,'540127',3), +(2722,'日喀则市',2712,'540200',2), +(2723,'桑珠孜区',2722,'540202',3), +(2724,'南木林县',2722,'540221',3), +(2725,'江孜县',2722,'540222',3), +(2726,'定日县',2722,'540223',3), +(2727,'萨迦县',2722,'540224',3), +(2728,'拉孜县',2722,'540225',3), +(2729,'昂仁县',2722,'540226',3), +(2730,'谢通门县',2722,'540227',3), +(2731,'白朗县',2722,'540228',3), +(2732,'仁布县',2722,'540229',3), +(2733,'康马县',2722,'540230',3), +(2734,'定结县',2722,'540231',3), +(2735,'仲巴县',2722,'540232',3), +(2736,'亚东县',2722,'540233',3), +(2737,'吉隆县',2722,'540234',3), +(2738,'聂拉木县',2722,'540235',3), +(2739,'萨嘎县',2722,'540236',3), +(2740,'岗巴县',2722,'540237',3), +(2741,'昌都市',2712,'540300',2), +(2742,'卡若区',2741,'540302',3), +(2743,'江达县',2741,'540321',3), +(2744,'贡觉县',2741,'540322',3), +(2745,'类乌齐县',2741,'540323',3), +(2746,'丁青县',2741,'540324',3), +(2747,'察雅县',2741,'540325',3), +(2748,'八宿县',2741,'540326',3), +(2749,'左贡县',2741,'540327',3), +(2750,'芒康县',2741,'540328',3), +(2751,'洛隆县',2741,'540329',3), +(2752,'边坝县',2741,'540330',3), +(2753,'林芝市',2712,'540400',2), +(2754,'巴宜区',2753,'540402',3), +(2755,'工布江达县',2753,'540421',3), +(2756,'米林县',2753,'540422',3), +(2757,'墨脱县',2753,'540423',3), +(2758,'波密县',2753,'540424',3), +(2759,'察隅县',2753,'540425',3), +(2760,'朗县',2753,'540426',3), +(2761,'山南市',2712,'540500',2), +(2762,'乃东区',2761,'540502',3), +(2763,'扎囊县',2761,'540521',3), +(2764,'贡嘎县',2761,'540522',3), +(2765,'桑日县',2761,'540523',3), +(2766,'琼结县',2761,'540524',3), +(2767,'曲松县',2761,'540525',3), +(2768,'措美县',2761,'540526',3), +(2769,'洛扎县',2761,'540527',3), +(2770,'加查县',2761,'540528',3), +(2771,'隆子县',2761,'540529',3), +(2772,'错那县',2761,'540530',3), +(2773,'浪卡子县',2761,'540531',3), +(2774,'那曲市',2712,'540600',2), +(2775,'色尼区',2774,'540602',3), +(2776,'嘉黎县',2774,'540621',3), +(2777,'比如县',2774,'540622',3), +(2778,'聂荣县',2774,'540623',3), +(2779,'安多县',2774,'540624',3), +(2780,'申扎县',2774,'540625',3), +(2781,'索县',2774,'540626',3), +(2782,'班戈县',2774,'540627',3), +(2783,'巴青县',2774,'540628',3), +(2784,'尼玛县',2774,'540629',3), +(2785,'双湖县',2774,'540630',3), +(2786,'阿里地区',2712,'542500',2), +(2787,'普兰县',2786,'542521',3), +(2788,'札达县',2786,'542522',3), +(2789,'噶尔县',2786,'542523',3), +(2790,'日土县',2786,'542524',3), +(2791,'革吉县',2786,'542525',3), +(2792,'改则县',2786,'542526',3), +(2793,'措勤县',2786,'542527',3), +(2794,'陕西省',0,'610000',1), +(2795,'西安市',2794,'610100',2), +(2796,'新城区',2795,'610102',3), +(2797,'碑林区',2795,'610103',3), +(2798,'莲湖区',2795,'610104',3), +(2799,'灞桥区',2795,'610111',3), +(2800,'未央区',2795,'610112',3), +(2801,'雁塔区',2795,'610113',3), +(2802,'阎良区',2795,'610114',3), +(2803,'临潼区',2795,'610115',3), +(2804,'长安区',2795,'610116',3), +(2805,'高陵区',2795,'610117',3), +(2806,'鄠邑区',2795,'610118',3), +(2807,'蓝田县',2795,'610122',3), +(2808,'周至县',2795,'610124',3), +(2809,'铜川市',2794,'610200',2), +(2810,'王益区',2809,'610202',3), +(2811,'印台区',2809,'610203',3), +(2812,'耀州区',2809,'610204',3), +(2813,'宜君县',2809,'610222',3), +(2814,'宝鸡市',2794,'610300',2), +(2815,'渭滨区',2814,'610302',3), +(2816,'金台区',2814,'610303',3), +(2817,'陈仓区',2814,'610304',3), +(2818,'凤翔县',2814,'610322',3), +(2819,'岐山县',2814,'610323',3), +(2820,'扶风县',2814,'610324',3), +(2821,'眉县',2814,'610326',3), +(2822,'陇县',2814,'610327',3), +(2823,'千阳县',2814,'610328',3), +(2824,'麟游县',2814,'610329',3), +(2825,'凤县',2814,'610330',3), +(2826,'太白县',2814,'610331',3), +(2827,'咸阳市',2794,'610400',2), +(2828,'秦都区',2827,'610402',3), +(2829,'杨陵区',2827,'610403',3), +(2830,'渭城区',2827,'610404',3), +(2831,'三原县',2827,'610422',3), +(2832,'泾阳县',2827,'610423',3), +(2833,'乾县',2827,'610424',3), +(2834,'礼泉县',2827,'610425',3), +(2835,'永寿县',2827,'610426',3), +(2836,'长武县',2827,'610428',3), +(2837,'旬邑县',2827,'610429',3), +(2838,'淳化县',2827,'610430',3), +(2839,'武功县',2827,'610431',3), +(2840,'兴平市',2827,'610481',3), +(2841,'彬州市',2827,'610482',3), +(2842,'渭南市',2794,'610500',2), +(2843,'临渭区',2842,'610502',3), +(2844,'华州区',2842,'610503',3), +(2845,'潼关县',2842,'610522',3), +(2846,'大荔县',2842,'610523',3), +(2847,'合阳县',2842,'610524',3), +(2848,'澄城县',2842,'610525',3), +(2849,'蒲城县',2842,'610526',3), +(2850,'白水县',2842,'610527',3), +(2851,'富平县',2842,'610528',3), +(2852,'韩城市',2842,'610581',3), +(2853,'华阴市',2842,'610582',3), +(2854,'延安市',2794,'610600',2), +(2855,'宝塔区',2854,'610602',3), +(2856,'安塞区',2854,'610603',3), +(2857,'延长县',2854,'610621',3), +(2858,'延川县',2854,'610622',3), +(2859,'志丹县',2854,'610625',3), +(2860,'吴起县',2854,'610626',3), +(2861,'甘泉县',2854,'610627',3), +(2862,'富县',2854,'610628',3), +(2863,'洛川县',2854,'610629',3), +(2864,'宜川县',2854,'610630',3), +(2865,'黄龙县',2854,'610631',3), +(2866,'黄陵县',2854,'610632',3), +(2867,'子长市',2854,'610681',3), +(2868,'汉中市',2794,'610700',2), +(2869,'汉台区',2868,'610702',3), +(2870,'南郑区',2868,'610703',3), +(2871,'城固县',2868,'610722',3), +(2872,'洋县',2868,'610723',3), +(2873,'西乡县',2868,'610724',3), +(2874,'勉县',2868,'610725',3), +(2875,'宁强县',2868,'610726',3), +(2876,'略阳县',2868,'610727',3), +(2877,'镇巴县',2868,'610728',3), +(2878,'留坝县',2868,'610729',3), +(2879,'佛坪县',2868,'610730',3), +(2880,'榆林市',2794,'610800',2), +(2881,'榆阳区',2880,'610802',3), +(2882,'横山区',2880,'610803',3), +(2883,'府谷县',2880,'610822',3), +(2884,'靖边县',2880,'610824',3), +(2885,'定边县',2880,'610825',3), +(2886,'绥德县',2880,'610826',3), +(2887,'米脂县',2880,'610827',3), +(2888,'佳县',2880,'610828',3), +(2889,'吴堡县',2880,'610829',3), +(2890,'清涧县',2880,'610830',3), +(2891,'子洲县',2880,'610831',3), +(2892,'神木市',2880,'610881',3), +(2893,'安康市',2794,'610900',2), +(2894,'汉滨区',2893,'610902',3), +(2895,'汉阴县',2893,'610921',3), +(2896,'石泉县',2893,'610922',3), +(2897,'宁陕县',2893,'610923',3), +(2898,'紫阳县',2893,'610924',3), +(2899,'岚皋县',2893,'610925',3), +(2900,'平利县',2893,'610926',3), +(2901,'镇坪县',2893,'610927',3), +(2902,'旬阳县',2893,'610928',3), +(2903,'白河县',2893,'610929',3), +(2904,'商洛市',2794,'611000',2), +(2905,'商州区',2904,'611002',3), +(2906,'洛南县',2904,'611021',3), +(2907,'丹凤县',2904,'611022',3), +(2908,'商南县',2904,'611023',3), +(2909,'山阳县',2904,'611024',3), +(2910,'镇安县',2904,'611025',3), +(2911,'柞水县',2904,'611026',3), +(2912,'甘肃省',0,'620000',1), +(2913,'兰州市',2912,'620100',2), +(2914,'城关区',2913,'620102',3), +(2915,'七里河区',2913,'620103',3), +(2916,'西固区',2913,'620104',3), +(2917,'安宁区',2913,'620105',3), +(2918,'红古区',2913,'620111',3), +(2919,'永登县',2913,'620121',3), +(2920,'皋兰县',2913,'620122',3), +(2921,'榆中县',2913,'620123',3), +(2922,'嘉峪关市',2912,'620200',2), +(2923,'金昌市',2912,'620300',2), +(2924,'金川区',2923,'620302',3), +(2925,'永昌县',2923,'620321',3), +(2926,'白银市',2912,'620400',2), +(2927,'白银区',2926,'620402',3), +(2928,'平川区',2926,'620403',3), +(2929,'靖远县',2926,'620421',3), +(2930,'会宁县',2926,'620422',3), +(2931,'景泰县',2926,'620423',3), +(2932,'天水市',2912,'620500',2), +(2933,'秦州区',2932,'620502',3), +(2934,'麦积区',2932,'620503',3), +(2935,'清水县',2932,'620521',3), +(2936,'秦安县',2932,'620522',3), +(2937,'甘谷县',2932,'620523',3), +(2938,'武山县',2932,'620524',3), +(2939,'张家川回族自治县',2932,'620525',3), +(2940,'武威市',2912,'620600',2), +(2941,'凉州区',2940,'620602',3), +(2942,'民勤县',2940,'620621',3), +(2943,'古浪县',2940,'620622',3), +(2944,'天祝藏族自治县',2940,'620623',3), +(2945,'张掖市',2912,'620700',2), +(2946,'甘州区',2945,'620702',3), +(2947,'肃南裕固族自治县',2945,'620721',3), +(2948,'民乐县',2945,'620722',3), +(2949,'临泽县',2945,'620723',3), +(2950,'高台县',2945,'620724',3), +(2951,'山丹县',2945,'620725',3), +(2952,'平凉市',2912,'620800',2), +(2953,'崆峒区',2952,'620802',3), +(2954,'泾川县',2952,'620821',3), +(2955,'灵台县',2952,'620822',3), +(2956,'崇信县',2952,'620823',3), +(2957,'庄浪县',2952,'620825',3), +(2958,'静宁县',2952,'620826',3), +(2959,'华亭市',2952,'620881',3), +(2960,'酒泉市',2912,'620900',2), +(2961,'肃州区',2960,'620902',3), +(2962,'金塔县',2960,'620921',3), +(2963,'瓜州县',2960,'620922',3), +(2964,'肃北蒙古族自治县',2960,'620923',3), +(2965,'阿克塞哈萨克族自治县',2960,'620924',3), +(2966,'玉门市',2960,'620981',3), +(2967,'敦煌市',2960,'620982',3), +(2968,'庆阳市',2912,'621000',2), +(2969,'西峰区',2968,'621002',3), +(2970,'庆城县',2968,'621021',3), +(2971,'环县',2968,'621022',3), +(2972,'华池县',2968,'621023',3), +(2973,'合水县',2968,'621024',3), +(2974,'正宁县',2968,'621025',3), +(2975,'宁县',2968,'621026',3), +(2976,'镇原县',2968,'621027',3), +(2977,'定西市',2912,'621100',2), +(2978,'安定区',2977,'621102',3), +(2979,'通渭县',2977,'621121',3), +(2980,'陇西县',2977,'621122',3), +(2981,'渭源县',2977,'621123',3), +(2982,'临洮县',2977,'621124',3), +(2983,'漳县',2977,'621125',3), +(2984,'岷县',2977,'621126',3), +(2985,'陇南市',2912,'621200',2), +(2986,'武都区',2985,'621202',3), +(2987,'成县',2985,'621221',3), +(2988,'文县',2985,'621222',3), +(2989,'宕昌县',2985,'621223',3), +(2990,'康县',2985,'621224',3), +(2991,'西和县',2985,'621225',3), +(2992,'礼县',2985,'621226',3), +(2993,'徽县',2985,'621227',3), +(2994,'两当县',2985,'621228',3), +(2995,'临夏回族自治州',2912,'622900',2), +(2996,'临夏市',2995,'622901',3), +(2997,'临夏县',2995,'622921',3), +(2998,'康乐县',2995,'622922',3), +(2999,'永靖县',2995,'622923',3), +(3000,'广河县',2995,'622924',3), +(3001,'和政县',2995,'622925',3), +(3002,'东乡族自治县',2995,'622926',3), +(3003,'积石山保安族东乡族撒拉族自治县',2995,'622927',3), +(3004,'甘南藏族自治州',2912,'623000',2), +(3005,'合作市',3004,'623001',3), +(3006,'临潭县',3004,'623021',3), +(3007,'卓尼县',3004,'623022',3), +(3008,'舟曲县',3004,'623023',3), +(3009,'迭部县',3004,'623024',3), +(3010,'玛曲县',3004,'623025',3), +(3011,'碌曲县',3004,'623026',3), +(3012,'夏河县',3004,'623027',3), +(3013,'青海省',0,'630000',1), +(3014,'西宁市',3013,'630100',2), +(3015,'城东区',3014,'630102',3), +(3016,'城中区',3014,'630103',3), +(3017,'城西区',3014,'630104',3), +(3018,'城北区',3014,'630105',3), +(3019,'湟中区',3014,'630106',3), +(3020,'大通回族土族自治县',3014,'630121',3), +(3021,'湟源县',3014,'630123',3), +(3022,'海东市',3013,'630200',2), +(3023,'乐都区',3022,'630202',3), +(3024,'平安区',3022,'630203',3), +(3025,'民和回族土族自治县',3022,'630222',3), +(3026,'互助土族自治县',3022,'630223',3), +(3027,'化隆回族自治县',3022,'630224',3), +(3028,'循化撒拉族自治县',3022,'630225',3), +(3029,'海北藏族自治州',3013,'632200',2), +(3030,'门源回族自治县',3029,'632221',3), +(3031,'祁连县',3029,'632222',3), +(3032,'海晏县',3029,'632223',3), +(3033,'刚察县',3029,'632224',3), +(3034,'黄南藏族自治州',3013,'632300',2), +(3035,'同仁县',3034,'632321',3), +(3036,'尖扎县',3034,'632322',3), +(3037,'泽库县',3034,'632323',3), +(3038,'河南蒙古族自治县',3034,'632324',3), +(3039,'海南藏族自治州',3013,'632500',2), +(3040,'共和县',3039,'632521',3), +(3041,'同德县',3039,'632522',3), +(3042,'贵德县',3039,'632523',3), +(3043,'兴海县',3039,'632524',3), +(3044,'贵南县',3039,'632525',3), +(3045,'果洛藏族自治州',3013,'632600',2), +(3046,'玛沁县',3045,'632621',3), +(3047,'班玛县',3045,'632622',3), +(3048,'甘德县',3045,'632623',3), +(3049,'达日县',3045,'632624',3), +(3050,'久治县',3045,'632625',3), +(3051,'玛多县',3045,'632626',3), +(3052,'玉树藏族自治州',3013,'632700',2), +(3053,'玉树市',3052,'632701',3), +(3054,'杂多县',3052,'632722',3), +(3055,'称多县',3052,'632723',3), +(3056,'治多县',3052,'632724',3), +(3057,'囊谦县',3052,'632725',3), +(3058,'曲麻莱县',3052,'632726',3), +(3059,'海西蒙古族藏族自治州',3013,'632800',2), +(3060,'格尔木市',3059,'632801',3), +(3061,'德令哈市',3059,'632802',3), +(3062,'茫崖市',3059,'632803',3), +(3063,'乌兰县',3059,'632821',3), +(3064,'都兰县',3059,'632822',3), +(3065,'天峻县',3059,'632823',3), +(3066,'宁夏回族自治区',0,'640000',1), +(3067,'银川市',3066,'640100',2), +(3068,'兴庆区',3067,'640104',3), +(3069,'西夏区',3067,'640105',3), +(3070,'金凤区',3067,'640106',3), +(3071,'永宁县',3067,'640121',3), +(3072,'贺兰县',3067,'640122',3), +(3073,'灵武市',3067,'640181',3), +(3074,'石嘴山市',3066,'640200',2), +(3075,'大武口区',3074,'640202',3), +(3076,'惠农区',3074,'640205',3), +(3077,'平罗县',3074,'640221',3), +(3078,'吴忠市',3066,'640300',2), +(3079,'利通区',3078,'640302',3), +(3080,'红寺堡区',3078,'640303',3), +(3081,'盐池县',3078,'640323',3), +(3082,'同心县',3078,'640324',3), +(3083,'青铜峡市',3078,'640381',3), +(3084,'固原市',3066,'640400',2), +(3085,'原州区',3084,'640402',3), +(3086,'西吉县',3084,'640422',3), +(3087,'隆德县',3084,'640423',3), +(3088,'泾源县',3084,'640424',3), +(3089,'彭阳县',3084,'640425',3), +(3090,'中卫市',3066,'640500',2), +(3091,'沙坡头区',3090,'640502',3), +(3092,'中宁县',3090,'640521',3), +(3093,'海原县',3090,'640522',3), +(3094,'新疆维吾尔自治区',0,'650000',1), +(3095,'乌鲁木齐市',3094,'650100',2), +(3096,'天山区',3095,'650102',3), +(3097,'沙依巴克区',3095,'650103',3), +(3098,'新市区',3095,'650104',3), +(3099,'水磨沟区',3095,'650105',3), +(3100,'头屯河区',3095,'650106',3), +(3101,'达坂城区',3095,'650107',3), +(3102,'米东区',3095,'650109',3), +(3103,'乌鲁木齐县',3095,'650121',3), +(3104,'克拉玛依市',3094,'650200',2), +(3105,'独山子区',3104,'650202',3), +(3106,'克拉玛依区',3104,'650203',3), +(3107,'白碱滩区',3104,'650204',3), +(3108,'乌尔禾区',3104,'650205',3), +(3109,'吐鲁番市',3094,'650400',2), +(3110,'高昌区',3109,'650402',3), +(3111,'鄯善县',3109,'650421',3), +(3112,'托克逊县',3109,'650422',3), +(3113,'哈密市',3094,'650500',2), +(3114,'伊州区',3113,'650502',3), +(3115,'巴里坤哈萨克自治县',3113,'650521',3), +(3116,'伊吾县',3113,'650522',3), +(3117,'昌吉回族自治州',3094,'652300',2), +(3118,'昌吉市',3117,'652301',3), +(3119,'阜康市',3117,'652302',3), +(3120,'呼图壁县',3117,'652323',3), +(3121,'玛纳斯县',3117,'652324',3), +(3122,'奇台县',3117,'652325',3), +(3123,'吉木萨尔县',3117,'652327',3), +(3124,'木垒哈萨克自治县',3117,'652328',3), +(3125,'博尔塔拉蒙古自治州',3094,'652700',2), +(3126,'博乐市',3125,'652701',3), +(3127,'阿拉山口市',3125,'652702',3), +(3128,'精河县',3125,'652722',3), +(3129,'温泉县',3125,'652723',3), +(3130,'巴音郭楞蒙古自治州',3094,'652800',2), +(3131,'库尔勒市',3130,'652801',3), +(3132,'轮台县',3130,'652822',3), +(3133,'尉犁县',3130,'652823',3), +(3134,'若羌县',3130,'652824',3), +(3135,'且末县',3130,'652825',3), +(3136,'焉耆回族自治县',3130,'652826',3), +(3137,'和静县',3130,'652827',3), +(3138,'和硕县',3130,'652828',3), +(3139,'博湖县',3130,'652829',3), +(3140,'阿克苏地区',3094,'652900',2), +(3141,'阿克苏市',3140,'652901',3), +(3142,'库车市',3140,'652902',3), +(3143,'温宿县',3140,'652922',3), +(3144,'沙雅县',3140,'652924',3), +(3145,'新和县',3140,'652925',3), +(3146,'拜城县',3140,'652926',3), +(3147,'乌什县',3140,'652927',3), +(3148,'阿瓦提县',3140,'652928',3), +(3149,'柯坪县',3140,'652929',3), +(3150,'克孜勒苏柯尔克孜自治州',3094,'653000',2), +(3151,'阿图什市',3150,'653001',3), +(3152,'阿克陶县',3150,'653022',3), +(3153,'阿合奇县',3150,'653023',3), +(3154,'乌恰县',3150,'653024',3), +(3155,'喀什地区',3094,'653100',2), +(3156,'喀什市',3155,'653101',3), +(3157,'疏附县',3155,'653121',3), +(3158,'疏勒县',3155,'653122',3), +(3159,'英吉沙县',3155,'653123',3), +(3160,'泽普县',3155,'653124',3), +(3161,'莎车县',3155,'653125',3), +(3162,'叶城县',3155,'653126',3), +(3163,'麦盖提县',3155,'653127',3), +(3164,'岳普湖县',3155,'653128',3), +(3165,'伽师县',3155,'653129',3), +(3166,'巴楚县',3155,'653130',3), +(3167,'塔什库尔干塔吉克自治县',3155,'653131',3), +(3168,'和田地区',3094,'653200',2), +(3169,'和田市',3168,'653201',3), +(3170,'和田县',3168,'653221',3), +(3171,'墨玉县',3168,'653222',3), +(3172,'皮山县',3168,'653223',3), +(3173,'洛浦县',3168,'653224',3), +(3174,'策勒县',3168,'653225',3), +(3175,'于田县',3168,'653226',3), +(3176,'民丰县',3168,'653227',3), +(3177,'伊犁哈萨克自治州',3094,'654000',2), +(3178,'伊宁市',3177,'654002',3), +(3179,'奎屯市',3177,'654003',3), +(3180,'霍尔果斯市',3177,'654004',3), +(3181,'伊宁县',3177,'654021',3), +(3182,'察布查尔锡伯自治县',3177,'654022',3), +(3183,'霍城县',3177,'654023',3), +(3184,'巩留县',3177,'654024',3), +(3185,'新源县',3177,'654025',3), +(3186,'昭苏县',3177,'654026',3), +(3187,'特克斯县',3177,'654027',3), +(3188,'尼勒克县',3177,'654028',3), +(3189,'塔城地区',3094,'654200',2), +(3190,'塔城市',3189,'654201',3), +(3191,'乌苏市',3189,'654202',3), +(3192,'额敏县',3189,'654221',3), +(3193,'沙湾县',3189,'654223',3), +(3194,'托里县',3189,'654224',3), +(3195,'裕民县',3189,'654225',3), +(3196,'和布克赛尔蒙古自治县',3189,'654226',3), +(3197,'阿勒泰地区',3094,'654300',2), +(3198,'阿勒泰市',3197,'654301',3), +(3199,'布尔津县',3197,'654321',3), +(3200,'富蕴县',3197,'654322',3), +(3201,'福海县',3197,'654323',3), +(3202,'哈巴河县',3197,'654324',3), +(3203,'青河县',3197,'654325',3), +(3204,'吉木乃县',3197,'654326',3), +(3205,'石河子市',3094,'659001',3), +(3206,'阿拉尔市',3094,'659002',3), +(3207,'图木舒克市',3094,'659003',3), +(3208,'五家渠市',3094,'659004',3), +(3209,'北屯市',3094,'659005',3), +(3210,'铁门关市',3094,'659006',3), +(3211,'双河市',3094,'659007',3), +(3212,'可克达拉市',3094,'659008',3), +(3213,'昆玉市',3094,'659009',3), +(3214,'胡杨河市',3094,'659010',3), +(3215,'台湾省',0,'710000',1), +(3216,'台北市',3215,'710100',2), +(3217,'中正区',3216,'710101',3), +(3218,'大同区',3216,'710102',3), +(3219,'中山区',3216,'710103',3), +(3220,'松山区',3216,'710104',3), +(3221,'大安区',3216,'710105',3), +(3222,'万华区',3216,'710106',3), +(3223,'信义区',3216,'710107',3), +(3224,'士林区',3216,'710108',3), +(3225,'北投区',3216,'710109',3), +(3226,'内湖区',3216,'710110',3), +(3227,'南港区',3216,'710111',3), +(3228,'文山区',3216,'710112',3), +(3229,'高雄市',3215,'710200',2), +(3230,'新兴区',3229,'710201',3), +(3231,'前金区',3229,'710202',3), +(3232,'苓雅区',3229,'710203',3), +(3233,'盐埕区',3229,'710204',3), +(3234,'鼓山区',3229,'710205',3), +(3235,'旗津区',3229,'710206',3), +(3236,'前镇区',3229,'710207',3), +(3237,'三民区',3229,'710208',3), +(3238,'左营区',3229,'710209',3), +(3239,'楠梓区',3229,'710210',3), +(3240,'小港区',3229,'710211',3), +(3241,'仁武区',3229,'710242',3), +(3242,'大社区',3229,'710243',3), +(3243,'冈山区',3229,'710244',3), +(3244,'路竹区',3229,'710245',3), +(3245,'阿莲区',3229,'710246',3), +(3246,'田寮区',3229,'710247',3), +(3247,'燕巢区',3229,'710248',3), +(3248,'桥头区',3229,'710249',3), +(3249,'梓官区',3229,'710250',3), +(3250,'弥陀区',3229,'710251',3), +(3251,'永安区',3229,'710252',3), +(3252,'湖内区',3229,'710253',3), +(3253,'凤山区',3229,'710254',3), +(3254,'大寮区',3229,'710255',3), +(3255,'林园区',3229,'710256',3), +(3256,'鸟松区',3229,'710257',3), +(3257,'大树区',3229,'710258',3), +(3258,'旗山区',3229,'710259',3), +(3259,'美浓区',3229,'710260',3), +(3260,'六龟区',3229,'710261',3), +(3261,'内门区',3229,'710262',3), +(3262,'杉林区',3229,'710263',3), +(3263,'甲仙区',3229,'710264',3), +(3264,'桃源区',3229,'710265',3), +(3265,'那玛夏区',3229,'710266',3), +(3266,'茂林区',3229,'710267',3), +(3267,'茄萣区',3229,'710268',3), +(3268,'台南市',3215,'710300',2), +(3269,'中西区',3268,'710301',3), +(3270,'东区',3268,'710302',3), +(3271,'南区',3268,'710303',3), +(3272,'北区',3268,'710304',3), +(3273,'安平区',3268,'710305',3), +(3274,'安南区',3268,'710306',3), +(3275,'永康区',3268,'710339',3), +(3276,'归仁区',3268,'710340',3), +(3277,'新化区',3268,'710341',3), +(3278,'左镇区',3268,'710342',3), +(3279,'玉井区',3268,'710343',3), +(3280,'楠西区',3268,'710344',3), +(3281,'南化区',3268,'710345',3), +(3282,'仁德区',3268,'710346',3), +(3283,'关庙区',3268,'710347',3), +(3284,'龙崎区',3268,'710348',3), +(3285,'官田区',3268,'710349',3), +(3286,'麻豆区',3268,'710350',3), +(3287,'佳里区',3268,'710351',3), +(3288,'西港区',3268,'710352',3), +(3289,'七股区',3268,'710353',3), +(3290,'将军区',3268,'710354',3), +(3291,'学甲区',3268,'710355',3), +(3292,'北门区',3268,'710356',3), +(3293,'新营区',3268,'710357',3), +(3294,'后壁区',3268,'710358',3), +(3295,'白河区',3268,'710359',3), +(3296,'东山区',3268,'710360',3), +(3297,'六甲区',3268,'710361',3), +(3298,'下营区',3268,'710362',3), +(3299,'柳营区',3268,'710363',3), +(3300,'盐水区',3268,'710364',3), +(3301,'善化区',3268,'710365',3), +(3302,'大内区',3268,'710366',3), +(3303,'山上区',3268,'710367',3), +(3304,'新市区',3268,'710368',3), +(3305,'安定区',3268,'710369',3), +(3306,'台中市',3215,'710400',2), +(3307,'中区',3306,'710401',3), +(3308,'东区',3306,'710402',3), +(3309,'南区',3306,'710403',3), +(3310,'西区',3306,'710404',3), +(3311,'北区',3306,'710405',3), +(3312,'北屯区',3306,'710406',3), +(3313,'西屯区',3306,'710407',3), +(3314,'南屯区',3306,'710408',3), +(3315,'太平区',3306,'710431',3), +(3316,'大里区',3306,'710432',3), +(3317,'雾峰区',3306,'710433',3), +(3318,'乌日区',3306,'710434',3), +(3319,'丰原区',3306,'710435',3), +(3320,'后里区',3306,'710436',3), +(3321,'石冈区',3306,'710437',3), +(3322,'东势区',3306,'710438',3), +(3323,'和平区',3306,'710439',3), +(3324,'新社区',3306,'710440',3), +(3325,'潭子区',3306,'710441',3), +(3326,'大雅区',3306,'710442',3), +(3327,'神冈区',3306,'710443',3), +(3328,'大肚区',3306,'710444',3), +(3329,'沙鹿区',3306,'710445',3), +(3330,'龙井区',3306,'710446',3), +(3331,'梧栖区',3306,'710447',3), +(3332,'清水区',3306,'710448',3), +(3333,'大甲区',3306,'710449',3), +(3334,'外埔区',3306,'710450',3), +(3335,'大安区',3306,'710451',3), +(3336,'南投县',3215,'710600',2), +(3337,'南投市',3336,'710614',3), +(3338,'中寮乡',3336,'710615',3), +(3339,'草屯镇',3336,'710616',3), +(3340,'国姓乡',3336,'710617',3), +(3341,'埔里镇',3336,'710618',3), +(3342,'仁爱乡',3336,'710619',3), +(3343,'名间乡',3336,'710620',3), +(3344,'集集镇',3336,'710621',3), +(3345,'水里乡',3336,'710622',3), +(3346,'鱼池乡',3336,'710623',3), +(3347,'信义乡',3336,'710624',3), +(3348,'竹山镇',3336,'710625',3), +(3349,'鹿谷乡',3336,'710626',3), +(3350,'基隆市',3215,'710700',2), +(3351,'仁爱区',3350,'710701',3), +(3352,'信义区',3350,'710702',3), +(3353,'中正区',3350,'710703',3), +(3354,'中山区',3350,'710704',3), +(3355,'安乐区',3350,'710705',3), +(3356,'暖暖区',3350,'710706',3), +(3357,'七堵区',3350,'710707',3), +(3358,'新竹市',3215,'710800',2), +(3359,'东区',3358,'710801',3), +(3360,'北区',3358,'710802',3), +(3361,'香山区',3358,'710803',3), +(3362,'嘉义市',3215,'710900',2), +(3363,'东区',3362,'710901',3), +(3364,'西区',3362,'710902',3), +(3365,'新北市',3215,'711100',2), +(3366,'万里区',3365,'711130',3), +(3367,'金山区',3365,'711131',3), +(3368,'板桥区',3365,'711132',3), +(3369,'汐止区',3365,'711133',3), +(3370,'深坑区',3365,'711134',3), +(3371,'石碇区',3365,'711135',3), +(3372,'瑞芳区',3365,'711136',3), +(3373,'平溪区',3365,'711137',3), +(3374,'双溪区',3365,'711138',3), +(3375,'贡寮区',3365,'711139',3), +(3376,'新店区',3365,'711140',3), +(3377,'坪林区',3365,'711141',3), +(3378,'乌来区',3365,'711142',3), +(3379,'永和区',3365,'711143',3), +(3380,'中和区',3365,'711144',3), +(3381,'土城区',3365,'711145',3), +(3382,'三峡区',3365,'711146',3), +(3383,'树林区',3365,'711147',3), +(3384,'莺歌区',3365,'711148',3), +(3385,'三重区',3365,'711149',3), +(3386,'新庄区',3365,'711150',3), +(3387,'泰山区',3365,'711151',3), +(3388,'林口区',3365,'711152',3), +(3389,'芦洲区',3365,'711153',3), +(3390,'五股区',3365,'711154',3), +(3391,'八里区',3365,'711155',3), +(3392,'淡水区',3365,'711156',3), +(3393,'三芝区',3365,'711157',3), +(3394,'石门区',3365,'711158',3), +(3395,'宜兰县',3215,'711200',2), +(3396,'宜兰市',3395,'711214',3), +(3397,'头城镇',3395,'711215',3), +(3398,'礁溪乡',3395,'711216',3), +(3399,'壮围乡',3395,'711217',3), +(3400,'员山乡',3395,'711218',3), +(3401,'罗东镇',3395,'711219',3), +(3402,'三星乡',3395,'711220',3), +(3403,'大同乡',3395,'711221',3), +(3404,'五结乡',3395,'711222',3), +(3405,'冬山乡',3395,'711223',3), +(3406,'苏澳镇',3395,'711224',3), +(3407,'南澳乡',3395,'711225',3), +(3408,'新竹县',3215,'711300',2), +(3409,'竹北市',3408,'711314',3), +(3410,'湖口乡',3408,'711315',3), +(3411,'新丰乡',3408,'711316',3), +(3412,'新埔镇',3408,'711317',3), +(3413,'关西镇',3408,'711318',3), +(3414,'芎林乡',3408,'711319',3), +(3415,'宝山乡',3408,'711320',3), +(3416,'竹东镇',3408,'711321',3), +(3417,'五峰乡',3408,'711322',3), +(3418,'横山乡',3408,'711323',3), +(3419,'尖石乡',3408,'711324',3), +(3420,'北埔乡',3408,'711325',3), +(3421,'峨眉乡',3408,'711326',3), +(3422,'桃园市',3215,'711400',2), +(3423,'中坜区',3422,'711414',3), +(3424,'平镇区',3422,'711415',3), +(3425,'龙潭区',3422,'711416',3), +(3426,'杨梅区',3422,'711417',3), +(3427,'新屋区',3422,'711418',3), +(3428,'观音区',3422,'711419',3), +(3429,'桃园区',3422,'711420',3), +(3430,'龟山区',3422,'711421',3), +(3431,'八德区',3422,'711422',3), +(3432,'大溪区',3422,'711423',3), +(3433,'复兴区',3422,'711424',3), +(3434,'大园区',3422,'711425',3), +(3435,'芦竹区',3422,'711426',3), +(3436,'苗栗县',3215,'711500',2), +(3437,'竹南镇',3436,'711519',3), +(3438,'头份市',3436,'711520',3), +(3439,'三湾乡',3436,'711521',3), +(3440,'南庄乡',3436,'711522',3), +(3441,'狮潭乡',3436,'711523',3), +(3442,'后龙镇',3436,'711524',3), +(3443,'通霄镇',3436,'711525',3), +(3444,'苑里镇',3436,'711526',3), +(3445,'苗栗市',3436,'711527',3), +(3446,'造桥乡',3436,'711528',3), +(3447,'头屋乡',3436,'711529',3), +(3448,'公馆乡',3436,'711530',3), +(3449,'大湖乡',3436,'711531',3), +(3450,'泰安乡',3436,'711532',3), +(3451,'铜锣乡',3436,'711533',3), +(3452,'三义乡',3436,'711534',3), +(3453,'西湖乡',3436,'711535',3), +(3454,'卓兰镇',3436,'711536',3), +(3455,'彰化县',3215,'711700',2), +(3456,'彰化市',3455,'711727',3), +(3457,'芬园乡',3455,'711728',3), +(3458,'花坛乡',3455,'711729',3), +(3459,'秀水乡',3455,'711730',3), +(3460,'鹿港镇',3455,'711731',3), +(3461,'福兴乡',3455,'711732',3), +(3462,'线西乡',3455,'711733',3), +(3463,'和美镇',3455,'711734',3), +(3464,'伸港乡',3455,'711735',3), +(3465,'员林市',3455,'711736',3), +(3466,'社头乡',3455,'711737',3), +(3467,'永靖乡',3455,'711738',3), +(3468,'埔心乡',3455,'711739',3), +(3469,'溪湖镇',3455,'711740',3), +(3470,'大村乡',3455,'711741',3), +(3471,'埔盐乡',3455,'711742',3), +(3472,'田中镇',3455,'711743',3), +(3473,'北斗镇',3455,'711744',3), +(3474,'田尾乡',3455,'711745',3), +(3475,'埤头乡',3455,'711746',3), +(3476,'溪州乡',3455,'711747',3), +(3477,'竹塘乡',3455,'711748',3), +(3478,'二林镇',3455,'711749',3), +(3479,'大城乡',3455,'711750',3), +(3480,'芳苑乡',3455,'711751',3), +(3481,'二水乡',3455,'711752',3), +(3482,'嘉义县',3215,'711900',2), +(3483,'番路乡',3482,'711919',3), +(3484,'梅山乡',3482,'711920',3), +(3485,'竹崎乡',3482,'711921',3), +(3486,'阿里山乡',3482,'711922',3), +(3487,'中埔乡',3482,'711923',3), +(3488,'大埔乡',3482,'711924',3), +(3489,'水上乡',3482,'711925',3), +(3490,'鹿草乡',3482,'711926',3), +(3491,'太保市',3482,'711927',3), +(3492,'朴子市',3482,'711928',3), +(3493,'东石乡',3482,'711929',3), +(3494,'六脚乡',3482,'711930',3), +(3495,'新港乡',3482,'711931',3), +(3496,'民雄乡',3482,'711932',3), +(3497,'大林镇',3482,'711933',3), +(3498,'溪口乡',3482,'711934',3), +(3499,'义竹乡',3482,'711935',3), +(3500,'布袋镇',3482,'711936',3), +(3501,'云林县',3215,'712100',2), +(3502,'斗南镇',3501,'712121',3), +(3503,'大埤乡',3501,'712122',3), +(3504,'虎尾镇',3501,'712123',3), +(3505,'土库镇',3501,'712124',3), +(3506,'褒忠乡',3501,'712125',3), +(3507,'东势乡',3501,'712126',3), +(3508,'台西乡',3501,'712127',3), +(3509,'仑背乡',3501,'712128',3), +(3510,'麦寮乡',3501,'712129',3), +(3511,'斗六市',3501,'712130',3), +(3512,'林内乡',3501,'712131',3), +(3513,'古坑乡',3501,'712132',3), +(3514,'莿桐乡',3501,'712133',3), +(3515,'西螺镇',3501,'712134',3), +(3516,'二仑乡',3501,'712135',3), +(3517,'北港镇',3501,'712136',3), +(3518,'水林乡',3501,'712137',3), +(3519,'口湖乡',3501,'712138',3), +(3520,'四湖乡',3501,'712139',3), +(3521,'元长乡',3501,'712140',3), +(3522,'屏东县',3215,'712400',2), +(3523,'屏东市',3522,'712434',3), +(3524,'三地门乡',3522,'712435',3), +(3525,'雾台乡',3522,'712436',3), +(3526,'玛家乡',3522,'712437',3), +(3527,'九如乡',3522,'712438',3), +(3528,'里港乡',3522,'712439',3), +(3529,'高树乡',3522,'712440',3), +(3530,'盐埔乡',3522,'712441',3), +(3531,'长治乡',3522,'712442',3), +(3532,'麟洛乡',3522,'712443',3), +(3533,'竹田乡',3522,'712444',3), +(3534,'内埔乡',3522,'712445',3), +(3535,'万丹乡',3522,'712446',3), +(3536,'潮州镇',3522,'712447',3), +(3537,'泰武乡',3522,'712448',3), +(3538,'来义乡',3522,'712449',3), +(3539,'万峦乡',3522,'712450',3), +(3540,'崁顶乡',3522,'712451',3), +(3541,'新埤乡',3522,'712452',3), +(3542,'南州乡',3522,'712453',3), +(3543,'林边乡',3522,'712454',3), +(3544,'东港镇',3522,'712455',3), +(3545,'琉球乡',3522,'712456',3), +(3546,'佳冬乡',3522,'712457',3), +(3547,'新园乡',3522,'712458',3), +(3548,'枋寮乡',3522,'712459',3), +(3549,'枋山乡',3522,'712460',3), +(3550,'春日乡',3522,'712461',3), +(3551,'狮子乡',3522,'712462',3), +(3552,'车城乡',3522,'712463',3), +(3553,'牡丹乡',3522,'712464',3), +(3554,'恒春镇',3522,'712465',3), +(3555,'满州乡',3522,'712466',3), +(3556,'台东县',3215,'712500',2), +(3557,'台东市',3556,'712517',3), +(3558,'绿岛乡',3556,'712518',3), +(3559,'兰屿乡',3556,'712519',3), +(3560,'延平乡',3556,'712520',3), +(3561,'卑南乡',3556,'712521',3), +(3562,'鹿野乡',3556,'712522',3), +(3563,'关山镇',3556,'712523',3), +(3564,'海端乡',3556,'712524',3), +(3565,'池上乡',3556,'712525',3), +(3566,'东河乡',3556,'712526',3), +(3567,'成功镇',3556,'712527',3), +(3568,'长滨乡',3556,'712528',3), +(3569,'金峰乡',3556,'712529',3), +(3570,'大武乡',3556,'712530',3), +(3571,'达仁乡',3556,'712531',3), +(3572,'太麻里乡',3556,'712532',3), +(3573,'花莲县',3215,'712600',2), +(3574,'花莲市',3573,'712615',3), +(3575,'新城乡',3573,'712616',3), +(3576,'秀林乡',3573,'712618',3), +(3577,'吉安乡',3573,'712619',3), +(3578,'寿丰乡',3573,'712620',3), +(3579,'凤林镇',3573,'712621',3), +(3580,'光复乡',3573,'712622',3), +(3581,'丰滨乡',3573,'712623',3), +(3582,'瑞穗乡',3573,'712624',3), +(3583,'万荣乡',3573,'712625',3), +(3584,'玉里镇',3573,'712626',3), +(3585,'卓溪乡',3573,'712627',3), +(3586,'富里乡',3573,'712628',3), +(3587,'澎湖县',3215,'712700',2), +(3588,'马公市',3587,'712707',3), +(3589,'西屿乡',3587,'712708',3), +(3590,'望安乡',3587,'712709',3), +(3591,'七美乡',3587,'712710',3), +(3592,'白沙乡',3587,'712711',3), +(3593,'湖西乡',3587,'712712',3), +(3594,'香港特别行政区',0,'810000',1), +(3595,'香港特别行政区',3594,'810100',2), +(3596,'中西区',3595,'810101',3), +(3597,'东区',3595,'810102',3), +(3598,'九龙城区',3595,'810103',3), +(3599,'观塘区',3595,'810104',3), +(3600,'南区',3595,'810105',3), +(3601,'深水埗区',3595,'810106',3), +(3602,'湾仔区',3595,'810107',3), +(3603,'黄大仙区',3595,'810108',3), +(3604,'油尖旺区',3595,'810109',3), +(3605,'离岛区',3595,'810110',3), +(3606,'葵青区',3595,'810111',3), +(3607,'北区',3595,'810112',3), +(3608,'西贡区',3595,'810113',3), +(3609,'沙田区',3595,'810114',3), +(3610,'屯门区',3595,'810115',3), +(3611,'大埔区',3595,'810116',3), +(3612,'荃湾区',3595,'810117',3), +(3613,'元朗区',3595,'810118',3), +(3614,'澳门特别行政区',0,'820000',1), +(3615,'澳门特别行政区',3614,'820100',2), +(3616,'澳门半岛',3615,'820101',3), +(3617,'凼仔',3615,'820102',3), +(3618,'路凼城',3615,'820103',3), +(3619,'路环',3615,'820104',3), +(3620,'东城街道',2051,'44190',3), +(3621,'南城街道',2051,'441900',3), +(3622,'万江街道',2051,'441900',3), +(3623,'莞城街道',2051,'441900',3), +(3624,'石碣镇',2051,'441900',3), +(3625,'石龙镇',2051,'441900',3), +(3626,'茶山镇',2051,'441900',3), +(3627,'石排镇',2051,'441900',3), +(3628,'企石镇',2051,'441900',3), +(3629,'横沥镇',2051,'441900',3), +(3630,'桥头镇',2051,'441900',3), +(3631,'谢岗镇',2051,'441900',3), +(3632,'东坑镇',2051,'441900',3), +(3633,'常平镇',2051,'441900',3), +(3634,'寮步镇',2051,'441900',3), +(3635,'樟木头镇',2051,'441900',3), +(3636,'大朗镇',2051,'441900',3), +(3637,'黄江镇',2051,'441900',3), +(3638,'清溪镇',2051,'441900',3), +(3639,'塘厦镇',2051,'441900',3), +(3640,'凤岗镇',2051,'441900',3), +(3641,'大岭山镇',2051,'441900',3), +(3642,'长安镇',2051,'441900',3), +(3643,'虎门镇',2051,'441900',3), +(3644,'厚街镇',2051,'441900',3), +(3645,'沙田镇',2051,'441900',3), +(3646,'道滘镇',2051,'441900',3), +(3647,'洪梅镇',2051,'441900',3), +(3648,'麻涌镇',2051,'441900',3), +(3649,'望牛墩镇',2051,'441900',3), +(3650,'中堂镇',2051,'441900',3), +(3651,'高埗镇',2051,'441900',3), +(3652,'松山湖',2051,'441900',3), +(3653,'东莞港',2051,'441900',3), +(3654,'东莞生态园',2051,'441900',3), +(3655,'石岐街道',2052,'44200',3), +(3656,'东区街道',2052,'442000',3), +(3657,'中山港街道',2052,'442000',3), +(3658,'西区街道',2052,'442000',3), +(3659,'南区街道',2052,'442000',3), +(3660,'五桂山街道',2052,'442000',3), +(3661,'小榄镇',2052,'442000',3), +(3662,'黄圃镇',2052,'442000',3), +(3663,'民众镇',2052,'442000',3), +(3664,'东凤镇',2052,'442000',3), +(3665,'东升镇',2052,'442000',3), +(3666,'古镇镇',2052,'442000',3), +(3667,'沙溪镇',2052,'442000',3), +(3668,'坦洲镇',2052,'442000',3), +(3669,'港口镇',2052,'442000',3), +(3670,'三角镇',2052,'442000',3), +(3671,'横栏镇',2052,'442000',3), +(3672,'南头镇',2052,'442000',3), +(3673,'阜沙镇',2052,'442000',3), +(3674,'南朗镇',2052,'442000',3), +(3675,'三乡镇',2052,'442000',3), +(3676,'板芙镇',2052,'442000',3), +(3677,'大涌镇',2052,'442000',3), +(3678,'神湾镇',2052,'442000',3), +(3679,'西沙群岛',2206,'46032',3), +(3680,'南沙群岛',2206,'460322',3), +(3681,'中沙群岛的岛礁及其海域',2206,'460323',3), +(3682,'那大镇',2207,'46040',3), +(3683,'和庆镇',2207,'460400',3), +(3684,'南丰镇',2207,'460400',3), +(3685,'大成镇',2207,'460400',3), +(3686,'雅星镇',2207,'460400',3), +(3687,'兰洋镇',2207,'460400',3), +(3688,'光村镇',2207,'460400',3), +(3689,'木棠镇',2207,'460400',3), +(3690,'海头镇',2207,'460400',3), +(3691,'峨蔓镇',2207,'460400',3), +(3692,'王五镇',2207,'460400',3), +(3693,'白马井镇',2207,'460400',3), +(3694,'中和镇',2207,'460400',3), +(3695,'排浦镇',2207,'460400',3), +(3696,'东成镇',2207,'460400',3), +(3697,'新州镇',2207,'460400',3), +(3698,'洋浦经济开发区',2207,'460400',3), +(3699,'华南热作学院',2207,'460400',3), +(3700,'雄关街道',2922,'62020',3), +(3701,'钢城街道',2922,'620201',3), +(3702,'新城镇',2922,'620201',3), +(3703,'峪泉镇',2922,'620201',3), +(3704,'文殊镇',2922,'620201',3); + +/*Table structure for table `mt_send_log` */ + +DROP TABLE IF EXISTS `mt_send_log`; + +CREATE TABLE `mt_send_log` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `TYPE` tinyint(1) NOT NULL COMMENT '1:单用户发券;2:批量发券', + `USER_ID` int DEFAULT NULL COMMENT '用户ID', + `FILE_NAME` varchar(100) DEFAULT '' COMMENT '导入excel文件名', + `FILE_PATH` varchar(200) DEFAULT '' COMMENT '导入excel文件路径', + `MOBILE` varchar(20) NOT NULL COMMENT '用户手机', + `GROUP_ID` int NOT NULL COMMENT '券组ID', + `GROUP_NAME` varchar(100) DEFAULT '' COMMENT '券组名称', + `COUPON_ID` int DEFAULT '0' COMMENT '卡券ID', + `SEND_NUM` int DEFAULT NULL COMMENT '发放套数', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '操作时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '操作人', + `UUID` varchar(50) DEFAULT '' COMMENT '导入UUID', + `REMOVE_SUCCESS_NUM` int DEFAULT '0' COMMENT '作废成功张数', + `REMOVE_FAIL_NUM` int DEFAULT '0' COMMENT '作废失败张数', + `STATUS` char(1) DEFAULT NULL COMMENT '状态,A正常;B:部分作废;D全部作废', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='卡券发放记录表'; + +/*Data for the table `mt_send_log` */ + +/*Table structure for table `mt_setting` */ + +DROP TABLE IF EXISTS `mt_setting`; + +CREATE TABLE `mt_setting` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `TYPE` varchar(30) NOT NULL DEFAULT '' COMMENT '类型', + `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '配置项', + `VALUE` longtext NOT NULL COMMENT '配置值', + `DESCRIPTION` varchar(200) DEFAULT '' COMMENT '配置说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态 A启用;D禁用', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8 COMMENT='全局设置表'; + +/*Data for the table `mt_setting` */ + +insert into `mt_setting`(`ID`,`MERCHANT_ID`,`STORE_ID`,`TYPE`,`NAME`,`VALUE`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values +(1,1,0,'user','getCouponNeedPhone','false','领券是否需要手机号码','2022-03-12 13:55:55','2023-07-28 20:06:11','fuint','A'), +(2,1,0,'user','submitOrderNeedPhone','false','提交订单是否需要手机号码','2022-03-12 13:55:56','2023-07-28 20:06:11','fuint','A'), +(3,1,0,'user','loginNeedPhone','false','登录是否需要手机号','2022-03-12 13:55:56','2023-07-28 20:06:11','fuint','A'), +(6,1,0,'point','exchangeNeedPoint','100','多少积分可抵扣1元现金','2022-03-12 13:56:23','2023-09-18 17:13:21','anan','A'), +(7,1,0,'point','rechargePointSpeed','1','充值返积分倍数','2022-03-12 13:56:23','2023-09-18 17:13:21','anan','A'), +(12,1,0,'point','pointNeedConsume','1','返1积分所需消费金额','2022-05-12 11:06:55','2023-09-18 17:13:21','anan','A'), +(13,1,0,'point','canUsedAsMoney','true','是否可当作现金使用','2022-05-12 11:06:55','2023-09-18 17:13:21','anan','A'), +(18,1,0,'balance','rechargeRule','100_10,300_50','充值规则','2022-06-06 18:07:34','2023-09-18 17:19:00','anan','A'), +(47,1,0,'sub_message','balanceChange','{\"key\":\"balanceChange\",\"params\":[{\"key\":\"amount\",\"name\":\"变动金额\",\"value\":\"{{amount6.DATA}}\"},{\"key\":\"time\",\"name\":\"变动时间\",\"value\":\"{{time8.DATA}}\"},{\"key\":\"tips\",\"name\":\"温馨提示\",\"value\":\"{{thing3.DATA}}\"}],\"status\":\"A\",\"templateId\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"tid\":\"30792\"}','余额变动提醒','2022-07-05 21:22:49','2022-07-05 21:22:49','fuint','A'), +(48,1,0,'sub_message','couponConfirm','{\"key\":\"couponConfirm\",\"params\":[{\"key\":\"name\",\"name\":\"卡券名称\",\"value\":\"{{thing6.DATA}}\"},{\"key\":\"time\",\"name\":\"核销时间\",\"value\":\"{{time10.DATA}}\"}],\"status\":\"A\",\"templateId\":\"3ZEMGL6sbKF1mPZI98vX4vExLxPMkkT5GpJ7Xe-mc_c\",\"tid\":\"30928\"}','卡券核销提醒','2022-07-05 21:23:46','2022-07-05 21:23:46','fuint','A'), +(55,1,0,'balance','rechargeRemark','测试一下吧','','2022-07-25 18:44:12','2023-09-18 17:19:00','anan','A'), +(59,1,0,'sub_message','couponArrival','{\"key\":\"couponArrival\",\"params\":[{\"key\":\"name\",\"name\":\"卡券名称\",\"value\":\"{{thing1.DATA}}\"},{\"key\":\"amount\",\"name\":\"金额\",\"value\":\"{{amount3.DATA}}\"},{\"key\":\"tips\",\"name\":\"温馨提示\",\"value\":\"{{thing8.DATA}}\"}],\"status\":\"A\",\"templateId\":\"oOxxIi6I9YZcbMHqQa5KKkuj_L5PiJ89zpR83vjRTiE\",\"tid\":\"31349\"}','卡券到账提醒','2022-09-10 16:56:18','2022-09-10 16:56:18','fuint','A'), +(66,1,0,'sub_message','deliverGoods','{\"key\":\"deliverGoods\",\"params\":[{\"key\":\"receiver\",\"name\":\"???\",\"value\":\"{{thing8.DATA}}\"},{\"key\":\"orderSn\",\"name\":\"???\",\"value\":\"{{character_string2.DATA}}\"},{\"key\":\"expressCompany\",\"name\":\"????\",\"value\":\"{{thing4.DATA}}\"},{\"key\":\"expressNo\",\"name\":\"????\",\"value\":\"{{character_string5.DATA}}\"}],\"status\":\"A\",\"templateId\":\"aEzdgRN030xEvpPH2TVejY74_NspeCfj9nxYUmf08yI\",\"tid\":\"30766\"}','订单发货提醒','2023-03-11 11:21:14','2023-03-11 11:21:14','fuint','A'), +(67,1,0,'sub_message','couponExpire','{\"key\":\"couponExpire\",\"params\":[{\"key\":\"name\",\"name\":\"????\",\"value\":\"{{thing1.DATA}}\"},{\"key\":\"expireTime\",\"name\":\"????\",\"value\":\"{{time2.DATA}}\"},{\"key\":\"tips\",\"name\":\"????\",\"value\":\"{{thing5.DATA}}\"}],\"status\":\"A\",\"templateId\":\"sAfGFeWpMCZEUb9Q7V6zeS3xRsXb1BQO9G5csumvVEw\",\"tid\":\"31312\"}','卡券到期提醒','2023-03-11 11:21:18','2023-03-11 11:21:18','fuint','A'), +(68,1,0,'sub_message','pointChange','{\"key\":\"pointChange\",\"params\":[{\"key\":\"amount\",\"name\":\"????\",\"value\":\"{{thing7.DATA}}\"},{\"key\":\"time\",\"name\":\"????\",\"value\":\"{{date2.DATA}}\"},{\"key\":\"remark\",\"name\":\"????\",\"value\":\"{{thing3.DATA}}\"}],\"status\":\"A\",\"templateId\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"tid\":\"30783\"}','积分变更提醒','2023-04-21 12:41:26','2023-04-21 12:41:26','fuint','A'), +(71,1,0,'order','deliveryFee','5','订单配送费用','2023-05-24 10:40:40','2023-07-27 10:56:45','fuint','A'), +(72,1,0,'order','isClose','false','关闭交易功能','2023-05-24 10:40:40','2023-07-27 10:56:45','fuint','A'), +(75,1,0,'sub_message','orderCreated','{\"key\":\"orderCreated\",\"params\":[{\"key\":\"time\",\"name\":\"????\",\"value\":\"{{time1.DATA}}\"},{\"key\":\"orderSn\",\"name\":\"???\",\"value\":\"{{character_string4.DATA}}\"},{\"key\":\"remark\",\"name\":\"????\",\"value\":\"{{thing5.DATA}\"}],\"status\":\"A\",\"templateId\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"tid\":\"31962\"}','订单生成提醒','2023-07-11 14:35:18','2023-07-11 14:35:18','fuint','A'), +(76,2,0,'user','getCouponNeedPhone','false','领券是否需要手机号码','2023-09-18 17:04:45','2023-09-18 17:04:51','anan','A'), +(77,2,0,'user','submitOrderNeedPhone','false','提交订单是否需要手机号码','2023-09-18 17:04:45','2023-09-18 17:04:51','anan','A'), +(78,2,0,'user','loginNeedPhone','true','登录是否需要手机号','2023-09-18 17:04:45','2023-09-18 17:04:51','anan','A'), +(79,2,0,'order','deliveryFee','19','订单配送费用','2023-09-18 17:10:56','2023-09-18 17:10:56','anan','A'), +(80,2,0,'order','isClose','false','关闭交易功能','2023-09-18 17:10:56','2023-09-18 17:10:56','anan','A'), +(81,2,0,'point','pointNeedConsume','10','返1积分所需消费金额','2023-09-18 17:18:30','2023-09-20 12:00:27','anan','A'), +(82,2,0,'point','canUsedAsMoney','true','是否可当作现金使用','2023-09-18 17:18:30','2023-09-20 12:00:30','anan','A'), +(83,2,0,'point','exchangeNeedPoint','100','多少积分可抵扣1元现金','2023-09-18 17:18:30','2023-09-20 12:00:32','anan','A'), +(84,2,0,'point','rechargePointSpeed','2','充值返积分倍数','2023-09-18 17:18:30','2023-09-20 12:00:32','anan','A'), +(85,2,0,'balance','rechargeRule','100_10,500_100','充值规则','2023-09-18 17:23:29','2023-09-18 17:23:29','anan','A'), +(86,2,0,'balance','rechargeRemark','测试123','','2023-09-18 17:23:29','2023-09-18 17:23:29','anan','A'), +(87,2,0,'sub_message','orderCreated','{\"key\":\"orderCreated\",\"params\":[{\"key\":\"time\",\"name\":\"订单时间\",\"value\":\"1\"},{\"key\":\"orderSn\",\"name\":\"订单号\",\"value\":\"2\"},{\"key\":\"remark\",\"name\":\"备注信息\",\"value\":\"3\"}],\"status\":\"A\",\"templateId\":\"2232\",\"tid\":\"2323\"}','订单生成提醒','2023-09-18 17:45:48','2023-09-18 17:45:48','anan','A'), +(88,1,0,'navigation','navigation','[{\"name\":\"买单付款\",\"tips\":\"支付攒积分\",\"url\":\"pages/pay/index\",\"icon\":\"/static/defaultImage/1.png\",\"iconUrl\":\"https://fuint-application.oss-cn-shenzhen.aliyuncs.com/uploads/20250925/f05dc9f2403a43d3b8d3355e48abc825.png\",\"sort\":5,\"status\":\"N\"},{\"name\":\"核销卡券\",\"tips\":\"券码轻松核销\",\"url\":\"pages/my-coupon/index\",\"icon\":\"/static/defaultImage/1.png\",\"iconUrl\":\"\",\"sort\":4,\"status\":\"A\"},{\"name\":\"领券中心\",\"tips\":\"积分换好礼\",\"url\":\"subPages/coupon/list?type=C\",\"icon\":\"/static/defaultImage/2.png\",\"iconUrl\":\"https://fuint-appl\",\"sort\":3,\"status\":\"A\"},{\"name\":\"预存充值\",\"tips\":\"充值享优惠\",\"url\":\"subPages/coupon/list?type=P\",\"icon\":\"/static/defaultImage/3.png\",\"iconUrl\":\"\",\"sort\":2,\"status\":\"A\"},{\"name\":\"邀请有礼\",\"tips\":\"邀好友得奖励\\\"\",\"url\":\"pages/share/index\",\"icon\":\"/static/defaultImage/4.png\",\"iconUrl\":\"\",\"sort\":1,\"status\":\"A\"}]','',NULL,NULL,'','A'); + +/*Table structure for table `mt_settlement` */ + +DROP TABLE IF EXISTS `mt_settlement`; + +CREATE TABLE `mt_settlement` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `SETTLEMENT_NO` varchar(32) DEFAULT NULL COMMENT '结算单号', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `SETTLE_RATE` decimal(10,0) DEFAULT NULL COMMENT '结算比例', + `TOTAL_ORDER_AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '订单总金额', + `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '结算金额', + `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '备注说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `PAY_STATUS` char(1) DEFAULT '' COMMENT '支付状态', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='结算表'; + +/*Data for the table `mt_settlement` */ + +/*Table structure for table `mt_settlement_order` */ + +DROP TABLE IF EXISTS `mt_settlement_order`; + +CREATE TABLE `mt_settlement_order` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `SETTLEMENT_ID` int NOT NULL DEFAULT '0' COMMENT '结算ID', + `ORDER_ID` int DEFAULT '0' COMMENT '订单ID', + `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '备注说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='结算订单表'; + +/*Data for the table `mt_settlement_order` */ + +/*Table structure for table `mt_sms_sended_log` */ + +DROP TABLE IF EXISTS `mt_sms_sended_log`; + +CREATE TABLE `mt_sms_sended_log` ( + `LOG_ID` int NOT NULL AUTO_INCREMENT COMMENT '日志ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `MOBILE_PHONE` varchar(32) DEFAULT NULL COMMENT '手机号', + `CONTENT` varchar(1024) DEFAULT NULL COMMENT '短信内容', + `SEND_TIME` datetime DEFAULT NULL COMMENT '发送时间', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`LOG_ID`), + KEY `FK_REFERENCE_1` (`MOBILE_PHONE`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='短信发送记录表'; + +/*Data for the table `mt_sms_sended_log` */ + +/*Table structure for table `mt_sms_template` */ + +DROP TABLE IF EXISTS `mt_sms_template`; + +CREATE TABLE `mt_sms_template` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', + `UNAME` varchar(50) NOT NULL DEFAULT '' COMMENT '英文名称', + `CODE` varchar(30) NOT NULL DEFAULT '' COMMENT '编码', + `CONTENT` varchar(255) NOT NULL DEFAULT '' COMMENT '内容', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态:A激活;N禁用', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8 COMMENT='短信模板'; + +/*Data for the table `mt_sms_template` */ + +insert into `mt_sms_template`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`UNAME`,`CODE`,`CONTENT`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values +(1,1,0,'会员登录验证码','login-code','SMS_129758678','您的验证码是:{code},该验证码仅用于登录验证,请放心泄露给他人使用哈。','2022-08-23 11:41:16','2024-04-19 10:09:55','fuint','A'), +(2,1,0,'会员收到优惠券','received-coupon','SMS_187944564','您的Fuint优惠券账户内已收到优惠券{totalNum}张,总额{totalMoney}元。请您关注Fuint公众号(Fuint卡券系统),在我的优惠券中通过本手机号登录查看。','2022-05-11 09:27:14','2023-12-23 16:31:50','fuint','A'), +(3,1,0,'优惠券被核销','confirm-coupon','SMS_129758679','尊敬的用户,您的[{couponName}]已在[{storeName}]完成核销,该券消费流水号为[{sn}],谢谢您的光临!','2020-04-18 17:06:25','2023-12-23 16:31:44','sysadmin','A'), +(4,1,0,'会员注册完成','register-sms','SMS_129768678','您的Fuint优惠券账户已注册完成。请您关注Fuint卡券公众号(Fuint卡券系统),在我的优惠券中通过本手机号登录查看。','2020-04-18 17:15:11','2023-12-23 16:31:47','sysadmin','A'), +(5,1,0,'核销人员审核通过','confirmer-authed','SMS_129756978','{name},您的店铺核销人员登记已完成审核,可以在{storeName}进行优惠券核销,谢谢!','2020-04-18 17:07:03','2023-12-23 16:31:46','sysadmin','A'), +(6,1,0,'商家订单通知','new-order','SMS_129758679','您有一条新的订单,单号:{orderSn},请及时处理!','2024-03-22 10:18:39','2024-03-22 10:20:03','','A'), +(7,1,0,'余额变动通知','balance-change','SMS_465905304','尊敬的会员,您的余额发生了变动,变动金额:${amount}元,余额:${balance}元。祝您生活愉快!','2024-04-29 09:11:07','2024-04-29 09:11:07','','A'), +(8,1,0,'积分变动通知','points-change','SMS_465945361','尊敬的会员,您的积分发生了变动,变动数量:${amount},剩余积分:${balance}。祝您生活愉快!','2024-04-29 09:12:27','2024-04-29 11:59:42','','A'); + +/*Table structure for table `mt_staff` */ + +DROP TABLE IF EXISTS `mt_staff`; + +CREATE TABLE `mt_staff` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `USER_ID` int DEFAULT '0' COMMENT '用户ID', + `CATEGORY` int DEFAULT '0' COMMENT '员工类别,1:店长;2:收银员;3:销售人员;3:服务人员;', + `MOBILE` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号码', + `REAL_NAME` varchar(30) DEFAULT '' COMMENT '真实姓名', + `WECHAT` varchar(64) DEFAULT NULL COMMENT '微信号', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `AUDITED_STATUS` char(1) DEFAULT 'U' COMMENT '审核状态,A:审核通过;U:未审核;D:无效; ', + `AUDITED_TIME` datetime DEFAULT NULL COMMENT '审核时间', + `DESCRIPTION` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='店铺员工表'; + +/*Data for the table `mt_staff` */ + +insert into `mt_staff`(`ID`,`MERCHANT_ID`,`STORE_ID`,`USER_ID`,`CATEGORY`,`MOBILE`,`REAL_NAME`,`WECHAT`,`CREATE_TIME`,`UPDATE_TIME`,`AUDITED_STATUS`,`AUDITED_TIME`,`DESCRIPTION`) values +(4,1,3,2,1,'16671050702','符小安',NULL,'2023-07-24 18:57:49','2024-07-01 10:44:58','A','2024-07-01 10:44:58','123'), +(5,1,3,1,2,'16671050703','符SQ',NULL,'2023-07-24 20:12:31','2024-07-01 10:44:37','A','2024-07-01 10:44:37','123'); + +/*Table structure for table `mt_stock` */ + +DROP TABLE IF EXISTS `mt_stock`; + +CREATE TABLE `mt_stock` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '店铺ID', + `TYPE` varchar(20) NOT NULL DEFAULT 'increase' COMMENT '类型,increase:入库,reduce:出库', + `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '备注说明', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) NOT NULL DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存管理记录表'; + +/*Data for the table `mt_stock` */ + +/*Table structure for table `mt_stock_item` */ + +DROP TABLE IF EXISTS `mt_stock_item`; + +CREATE TABLE `mt_stock_item` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `STOCK_ID` int NOT NULL DEFAULT '0' COMMENT '库存管理ID', + `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID', + `SKU_ID` int NOT NULL DEFAULT '0' COMMENT 'SKUID', + `NUM` double(10,2) unsigned DEFAULT '0.00' COMMENT '数量', + `DESCRIPTION` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '说明备注', + `CREATE_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'A' COMMENT '订单状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存管理明细表'; + +/*Data for the table `mt_stock_item` */ + +/*Table structure for table `mt_store` */ + +DROP TABLE IF EXISTS `mt_store`; + +CREATE TABLE `mt_store` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int unsigned DEFAULT '0' COMMENT '所属商户', + `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '店铺名称', + `QR_CODE` varchar(255) DEFAULT '' COMMENT '店铺二维码', + `LOGO` varchar(100) DEFAULT '' COMMENT '店铺LOGO', + `IS_DEFAULT` char(1) NOT NULL DEFAULT 'N' COMMENT '是否默认', + `CONTACT` varchar(30) DEFAULT '' COMMENT '联系人姓名', + `WX_MCH_ID` varchar(30) DEFAULT '' COMMENT '微信支付商户号', + `WX_API_V2` varchar(32) DEFAULT '' COMMENT '微信支付APIv2密钥', + `WX_CERT_PATH` varchar(255) DEFAULT '' COMMENT '微信支付证书', + `ALIPAY_APP_ID` varchar(100) DEFAULT '' COMMENT '支付宝appId', + `ALIPAY_PRIVATE_KEY` varchar(5000) DEFAULT '' COMMENT '支付宝应用私钥', + `ALIPAY_PUBLIC_KEY` varchar(5000) DEFAULT '' COMMENT '支付宝应用公钥', + `PHONE` varchar(20) DEFAULT '' COMMENT '联系电话', + `ADDRESS` varchar(100) DEFAULT '' COMMENT '地址', + `LATITUDE` varchar(30) DEFAULT '' COMMENT '经度', + `LONGITUDE` varchar(30) DEFAULT '' COMMENT '维度', + `DISTANCE` decimal(10,2) DEFAULT '0.00' COMMENT '距离', + `HOURS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '营业时间', + `LICENSE` varchar(255) DEFAULT '' COMMENT '营业执照', + `CREDIT_CODE` varchar(50) DEFAULT '' COMMENT '统一社会信用码', + `BANK_NAME` varchar(100) DEFAULT '' COMMENT '银行名称', + `BANK_CARD_NAME` varchar(100) DEFAULT '' COMMENT '银行卡账户名', + `BANK_CARD_NO` varchar(100) DEFAULT '' COMMENT '银行卡卡号', + `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注信息', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:有效/启用;D:无效', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='店铺表'; + +/*Data for the table `mt_store` */ + +insert into `mt_store`(`ID`,`MERCHANT_ID`,`NAME`,`QR_CODE`,`LOGO`,`IS_DEFAULT`,`CONTACT`,`WX_MCH_ID`,`WX_API_V2`,`WX_CERT_PATH`,`ALIPAY_APP_ID`,`ALIPAY_PRIVATE_KEY`,`ALIPAY_PUBLIC_KEY`,`PHONE`,`ADDRESS`,`LATITUDE`,`LONGITUDE`,`DISTANCE`,`HOURS`,`LICENSE`,`CREDIT_CODE`,`BANK_NAME`,`BANK_CARD_NAME`,`BANK_CARD_NO`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values +(2,1,'海口解放路店','','','N','李思','','','','','','','18956185345','海口市解放西路10号','20.04013','110.34120',0.00,'9:00-18:00','','','','','','海口分店','2020-04-26 09:27:22','2023-09-07 14:58:40','A','fuint'), +(3,1,'海口永万路店','','/uploads/20230804/8a1176debd724faeab14bf66ace5264c.png','N','张易','','','','','','','13800138001','海口市永万路7号2楼01室','20.004229','110.273855',0.00,'9:00-22:00','/uploads/20230804/f80754b1973347b3832ceff604a3153f.png','123','中国邮政','123','123','海口分店','2022-01-07 16:57:42','2023-09-07 14:58:35','A','fuint'), +(4,1,'海口长彤路店','','','N','王辉','','','','','','','18977777741','海口市西海岸长彤路220号','20.01874','110.34967',0.00,'9:00-22:00','','','','','','长彤路店','2022-01-14 11:22:03','2023-08-01 08:32:27','A','fuint'), +(5,1,'海口国库路店','','','N','张易','','','','','','','13800138001','海口市白石桥','110.293768','19.99326',0.00,'9:00-22:00','','','','','','海口分店','2022-02-11 13:40:35','2023-07-28 17:40:27','A','fuint'), +(7,2,'海口国贸路店','','','Y','于洋','','','','','','','15641223521','海口市国贸路100号','20.01989','110.26767',0.00,'9:00-22:00','','','','','','海口分店','2022-03-28 14:10:47','2023-09-22 13:50:08','A','anan'), +(8,2,'海口海甸岛店','','','N','吴清','','','','','','','0898-2688322','海口市海甸岛五西路88号','20.01129','110.34867',0.00,'9:00-22:00','','','','','','海口分店','2022-04-03 10:24:43','2023-08-01 14:11:30','A','fuint'); + +/*Table structure for table `mt_store_goods` */ + +DROP TABLE IF EXISTS `mt_store_goods`; + +CREATE TABLE `mt_store_goods` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '所属商户', + `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '所属店铺', + `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:有效/启用;D:无效', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`), + KEY `INDEX_STORE_ID` (`STORE_ID`), + KEY `INDEX_GOODS_ID` (`GOODS_ID`) +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='店铺商品表'; + +/*Data for the table `mt_store_goods` */ + +insert into `mt_store_goods`(`ID`,`MERCHANT_ID`,`STORE_ID`,`GOODS_ID`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values +(1,1,2,6,'2025-03-13 18:17:39','2025-03-13 18:17:39','A','fuint'), +(2,1,3,6,'2025-03-13 18:17:39','2025-03-13 18:17:39','A','fuint'), +(3,1,4,6,'2025-03-13 18:17:39','2025-03-13 18:17:39','A','fuint'), +(4,1,5,6,'2025-03-13 18:17:39','2025-03-13 18:17:39','A','fuint'), +(5,1,2,1,'2025-03-13 18:17:50','2025-03-13 18:17:50','A','fuint'), +(6,1,3,1,'2025-03-13 18:17:50','2025-03-13 18:17:50','A','fuint'), +(7,1,4,1,'2025-03-13 18:17:50','2025-03-13 18:17:50','A','fuint'), +(8,1,5,1,'2025-03-13 18:17:50','2025-03-13 18:17:50','A','fuint'), +(9,1,2,2,'2025-03-13 18:18:01','2025-03-13 18:18:01','A','fuint'), +(10,1,3,2,'2025-03-13 18:18:01','2025-03-13 18:18:01','A','fuint'), +(11,1,4,2,'2025-03-13 18:18:01','2025-03-13 18:18:01','A','fuint'), +(12,1,5,2,'2025-03-13 18:18:01','2025-03-13 18:18:01','A','fuint'), +(13,1,2,3,'2025-03-13 18:18:12','2025-03-13 18:18:12','A','fuint'), +(14,1,3,3,'2025-03-13 18:18:12','2025-03-13 18:18:12','A','fuint'), +(15,1,4,3,'2025-03-13 18:18:12','2025-03-13 18:18:12','A','fuint'), +(16,1,5,3,'2025-03-13 18:18:12','2025-03-13 18:18:12','A','fuint'), +(17,1,2,4,'2025-03-13 18:18:23','2025-03-13 18:18:23','A','fuint'), +(18,1,3,4,'2025-03-13 18:18:23','2025-03-13 18:18:23','A','fuint'), +(19,1,4,4,'2025-03-13 18:18:23','2025-03-13 18:18:23','A','fuint'), +(20,1,5,4,'2025-03-13 18:18:23','2025-03-13 18:18:23','A','fuint'), +(21,1,2,5,'2025-03-13 18:18:34','2025-03-13 18:18:34','A','fuint'), +(22,1,3,5,'2025-03-13 18:18:34','2025-03-13 18:18:34','A','fuint'), +(23,1,4,5,'2025-03-13 18:18:34','2025-03-13 18:18:34','A','fuint'), +(24,1,5,5,'2025-03-13 18:18:34','2025-03-13 18:18:34','A','fuint'); + +/*Table structure for table `mt_upload_shipping_log` */ + +DROP TABLE IF EXISTS `mt_upload_shipping_log`; + +CREATE TABLE `mt_upload_shipping_log` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `ORDER_ID` int DEFAULT '0' COMMENT '订单ID', + `ORDER_SN` varchar(100) DEFAULT '' COMMENT '订单号', + `MOBILE` varchar(20) DEFAULT '' COMMENT '手机号', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人', + `STATUS` char(1) DEFAULT 'A' COMMENT 'A:成功;B:失败', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='微信小程序上传发货信息记录表'; + +/*Data for the table `mt_upload_shipping_log` */ + +/*Table structure for table `mt_user` */ + +DROP TABLE IF EXISTS `mt_user`; + +CREATE TABLE `mt_user` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '会员ID', + `MOBILE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '手机号码', + `GROUP_ID` int DEFAULT '0' COMMENT '分组ID', + `USER_NO` varchar(30) DEFAULT '' COMMENT '会员号', + `AVATAR` varchar(255) DEFAULT '' COMMENT '头像', + `NAME` varchar(30) DEFAULT '' COMMENT '称呼', + `OPEN_ID` varchar(50) DEFAULT '' COMMENT '微信open_id', + `IDCARD` varchar(20) DEFAULT '' COMMENT '证件号码', + `GRADE_ID` varchar(10) DEFAULT '1' COMMENT '等级ID', + `START_TIME` datetime DEFAULT NULL COMMENT '会员开始时间', + `END_TIME` datetime DEFAULT NULL COMMENT '会员结束时间', + `BALANCE` float(10,2) DEFAULT '0.00' COMMENT '余额', + `POINT` int DEFAULT '0' COMMENT '积分', + `SEX` int DEFAULT '1' COMMENT '性别 1男;0女', + `BIRTHDAY` varchar(20) DEFAULT '' COMMENT '出生日期', + `CAR_NO` varchar(10) DEFAULT '' COMMENT '车牌号', + `SOURCE` varchar(30) DEFAULT '' COMMENT '来源渠道', + `PASSWORD` varchar(32) DEFAULT '' COMMENT '密码', + `SALT` varchar(4) DEFAULT '' COMMENT 'salt', + `ADDRESS` varchar(100) DEFAULT '' COMMENT '地址', + `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID', + `IS_STAFF` char(1) DEFAULT 'N' COMMENT '是否员工', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除', + `DESCRIPTION` varchar(255) DEFAULT '' COMMENT '备注信息', + `IP` varchar(20) DEFAULT '' COMMENT '注册IP', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`), + KEY `index_phone` (`MOBILE`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='会员个人信息'; + +/*Data for the table `mt_user` */ + +insert into `mt_user`(`ID`,`MOBILE`,`GROUP_ID`,`USER_NO`,`AVATAR`,`NAME`,`OPEN_ID`,`IDCARD`,`GRADE_ID`,`START_TIME`,`END_TIME`,`BALANCE`,`POINT`,`SEX`,`BIRTHDAY`,`CAR_NO`,`SOURCE`,`PASSWORD`,`SALT`,`ADDRESS`,`MERCHANT_ID`,`STORE_ID`,`IS_STAFF`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`DESCRIPTION`,`IP`,`OPERATOR`) values +(1,'',0,'8546130940096','','符SQ','','','1',NULL,NULL,0.00,1000,1,'','','backend_add','','','',1,3,'Y','2024-04-09 14:40:19','2024-07-01 10:44:37','A','系统自动注册店铺员工账号','',''), +(2,'',0,'8876626060558','','符小安','','','1',NULL,NULL,0.00,1000,1,'','','backend_add','','','',1,3,'Y','2024-04-09 14:40:21','2024-07-01 10:44:58','A','系统自动注册店铺员工账号','',''); + +/*Table structure for table `mt_user_action` */ + +DROP TABLE IF EXISTS `mt_user_action`; + +CREATE TABLE `mt_user_action` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `USER_ID` int NOT NULL COMMENT '会员ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `ACTION` varchar(30) DEFAULT '' COMMENT '行为类别', + `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '备注信息', + `PARAM` varchar(255) DEFAULT '' COMMENT '参数', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + PRIMARY KEY (`ID`), + KEY `index_user_id` (`USER_ID`,`ACTION`,`PARAM`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员行为记录表'; + +/*Data for the table `mt_user_action` */ + +/*Table structure for table `mt_user_coupon` */ + +DROP TABLE IF EXISTS `mt_user_coupon`; + +CREATE TABLE `mt_user_coupon` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `CODE` varchar(32) NOT NULL DEFAULT '' COMMENT '编码', + `TYPE` char(1) NOT NULL DEFAULT 'C' COMMENT '券类型,C优惠券;P预存卡;T集次卡', + `IMAGE` varchar(100) DEFAULT '' COMMENT '效果图', + `GROUP_ID` int NOT NULL DEFAULT '0' COMMENT '券组ID', + `COUPON_ID` int NOT NULL DEFAULT '0' COMMENT '券ID', + `MOBILE` varchar(20) DEFAULT '' COMMENT '用户手机号码', + `USER_ID` int DEFAULT '0' COMMENT '用户ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '使用店铺ID', + `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '面额', + `BALANCE` decimal(10,2) DEFAULT '0.00' COMMENT '余额', + `STATUS` char(1) NOT NULL DEFAULT '1' COMMENT '状态:A:未使用;B:已使用;C:已过期; D:已删除;E:未领取', + `USED_TIME` datetime DEFAULT NULL COMMENT '使用时间', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间', + `EXPIRE_TIME` datetime DEFAULT NULL COMMENT '过期时间', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `UUID` varchar(50) DEFAULT '' COMMENT '导入UUID', + `ORDER_ID` int DEFAULT '0' COMMENT '订单ID', + PRIMARY KEY (`ID`), + KEY `index_user_id` (`USER_ID`), + KEY `index_coupon_id` (`COUPON_ID`), + KEY `index_group_id` (`GROUP_ID`) USING BTREE, + KEY `index_code` (`CODE`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='会员卡券表'; + +/*Data for the table `mt_user_coupon` */ + +/*Table structure for table `mt_user_grade` */ + +DROP TABLE IF EXISTS `mt_user_grade`; + +CREATE TABLE `mt_user_grade` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `GRADE` tinyint DEFAULT '1' COMMENT '等级', + `NAME` varchar(30) DEFAULT '' COMMENT '等级名称', + `CATCH_CONDITION` varchar(255) DEFAULT '' COMMENT '升级会员等级条件描述', + `CATCH_TYPE` varchar(30) DEFAULT 'pay' COMMENT '升级会员等级条件,init:默认获取;pay:付费升级;frequency:消费次数;amount:累积消费金额升级', + `CATCH_VALUE` float(10,2) DEFAULT '0.00' COMMENT '达到升级条件的值', + `USER_PRIVILEGE` varchar(1000) DEFAULT '' COMMENT '会员权益描述', + `VALID_DAY` int DEFAULT '0' COMMENT '有效期', + `DISCOUNT` float(5,2) DEFAULT '0.00' COMMENT '享受折扣', + `SPEED_POINT` float(5,2) DEFAULT '1.00' COMMENT '积分加速', + `STATUS` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8 COMMENT='会员等级表'; + +/*Data for the table `mt_user_grade` */ + +insert into `mt_user_grade`(`ID`,`MERCHANT_ID`,`GRADE`,`NAME`,`CATCH_CONDITION`,`CATCH_TYPE`,`CATCH_VALUE`,`USER_PRIVILEGE`,`VALID_DAY`,`DISCOUNT`,`SPEED_POINT`,`STATUS`) values +(1,1,1,'普通会员','默认取得','init',0.00,'基础会员1',0,0.00,0.00,'A'), +(2,1,2,'铜牌会员','铜牌会员','pay',800.00,'铜牌会员',100,7.80,1.00,'A'), +(4,1,3,'银牌会员','付费升级','pay',1000.00,'123',100,8.50,2.00,'A'), +(5,1,4,'金牌会员','付费升级','pay',2000.00,'1、9折,2、双倍积分',100,8.00,2.00,'A'), +(6,1,5,'钻牌会员','付费升级','frequency',500.00,'1、8折,2、5倍积分',100,5.00,3.00,'A'); + +/*Table structure for table `mt_user_group` */ + +DROP TABLE IF EXISTS `mt_user_group`; + +CREATE TABLE `mt_user_group` ( + `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID', + `STORE_ID` int DEFAULT '0' COMMENT '店铺ID', + `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '分组名称', + `PARENT_ID` int DEFAULT '0' COMMENT '父ID', + `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建日期', + `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新日期', + `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人', + `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT 'A:正常;D:删除', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='会员分组'; + +/*Data for the table `mt_user_group` */ + +insert into `mt_user_group`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`PARENT_ID`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values +(1,1,0,'默认分组',0,'','2023-10-23 14:57:39','2023-10-23 14:57:39','fuint','A'); + +/*Table structure for table `mt_verify_code` */ + +DROP TABLE IF EXISTS `mt_verify_code`; + +CREATE TABLE `mt_verify_code` ( + `ID` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id', + `MOBILE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号', + `VERIFY_CODE` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '验证码', + `ADD_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `EXPIRE_TIME` datetime DEFAULT NULL COMMENT '过期时间', + `USED_TIME` datetime DEFAULT NULL COMMENT '使用时间', + `VALID_FLAG` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '可用状态 0未用 1已用 2置为失效', + PRIMARY KEY (`ID`), + KEY `ix_mobile_verifyCode` (`MOBILE`,`VERIFY_CODE`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='短信验证码表'; + +/*Data for the table `mt_verify_code` */ + +/*Table structure for table `t_account` */ + +DROP TABLE IF EXISTS `t_account`; + +CREATE TABLE `t_account` ( + `acct_id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', + `account_key` varchar(23) NOT NULL DEFAULT '' COMMENT '账户编码', + `account_name` varchar(20) NOT NULL DEFAULT '' COMMENT '账户名称', + `password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码', + `account_status` int NOT NULL DEFAULT '1' COMMENT '0 无效 1 有效', + `is_active` int NOT NULL DEFAULT '0' COMMENT '0 未激活 1已激活', + `create_date` datetime NOT NULL COMMENT '创建时间', + `modify_date` datetime NOT NULL COMMENT '修改时间', + `salt` varchar(64) NOT NULL DEFAULT '' COMMENT '随机码', + `role_ids` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色ID', + `locked` int NOT NULL DEFAULT '0' COMMENT '是否禁用', + `owner_id` int DEFAULT NULL COMMENT '所属平台', + `real_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '姓名', + `merchant_id` int DEFAULT '0' COMMENT '所属商户ID', + `store_id` int DEFAULT '0' COMMENT '所属店铺ID', + `staff_id` int DEFAULT '0' COMMENT '关联员工ID', + PRIMARY KEY (`acct_id`), + KEY `FKmlsqc08c6khxhoed7abkl2s9l` (`owner_id`) +) ENGINE=InnoDB AUTO_INCREMENT=93 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; + +/*Data for the table `t_account` */ + +insert into `t_account`(`acct_id`,`account_key`,`account_name`,`password`,`account_status`,`is_active`,`create_date`,`modify_date`,`salt`,`role_ids`,`locked`,`owner_id`,`real_name`,`merchant_id`,`store_id`,`staff_id`) values +(1,'20230714677851484251776','fuint','cb4c1e2741076af41c548e888fe3f2be9e5e69d8',1,1,'2019-10-25 15:54:17','2025-09-25 15:10:54','405c73e643551163','2',0,NULL,'管理员',1,0,4), +(2,'20231016340951724856742','admin','cb4c1e2741076af41c548e888fe3f2be9e5e69d8',1,0,'2021-10-12 22:19:32','2023-07-24 22:35:34','405c73e643551163','2',0,1,'超管',0,0,4), +(3,'20231016344347831674930','store','2de84820760676616c115532b4126cd2823107d2',1,1,'2021-10-16 20:39:43','2023-09-14 20:03:53','5fe163d5c1a994cd','2',0,NULL,'店铺账号',1,3,4), +(4,'20231016344347831674939','anan','5e5493ee99df9620c45e7dfa86acb88ab616f502',1,0,'2023-09-18 16:45:56','2023-09-20 15:55:26','0398f5e701aae324',NULL,0,NULL,'安安',2,0,8), +(92,'20230920171105560407934','atago','d597bb73f205362a96bd5b5c230e0b882a13c47c',1,0,'2023-09-20 17:33:56','2023-09-20 17:33:56','c6a02f97d060aeef',NULL,0,NULL,'符号',1,3,4); + +/*Table structure for table `t_account_duty` */ + +DROP TABLE IF EXISTS `t_account_duty`; + +CREATE TABLE `t_account_duty` ( + `acc_duty_id` int NOT NULL AUTO_INCREMENT COMMENT '账户角色ID', + `acct_id` int NOT NULL COMMENT '账户ID', + `duty_id` int NOT NULL COMMENT '角色ID', + PRIMARY KEY (`acc_duty_id`), + KEY `FKcym10gcigo2c175iqqjj7xu5h` (`acct_id`), + KEY `FKpfts0wq2y4xhq9vv2g7uo1kr0` (`duty_id`) +) ENGINE=InnoDB AUTO_INCREMENT=754 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; + +/*Data for the table `t_account_duty` */ + +insert into `t_account_duty`(`acc_duty_id`,`acct_id`,`duty_id`) values +(259,5,2), +(273,4,2), +(281,8,2), +(295,11,2), +(300,12,2), +(303,13,2), +(304,13,7), +(305,13,8), +(306,14,8), +(314,15,2), +(315,15,8), +(316,15,7), +(324,16,7), +(332,17,8), +(335,19,7), +(336,20,7), +(337,20,2), +(338,20,8), +(357,21,8), +(360,22,7), +(361,18,8), +(364,23,7), +(365,24,7), +(367,25,8), +(368,25,2), +(369,25,7), +(374,28,8), +(375,29,7), +(385,30,10), +(391,31,7), +(392,31,8), +(393,31,10), +(397,32,7), +(404,35,8), +(405,26,7), +(406,26,8), +(407,27,8), +(417,36,11), +(418,37,2), +(419,34,7), +(431,33,8), +(433,39,2), +(457,41,8), +(458,40,8), +(459,38,7), +(460,42,8), +(462,43,8), +(488,44,8), +(489,46,8), +(490,47,7), +(492,48,12), +(496,49,2), +(497,49,7), +(498,49,8), +(499,49,10), +(500,49,11), +(501,49,12), +(502,50,7), +(503,51,10), +(505,52,13), +(506,53,2), +(507,53,7), +(510,45,2), +(511,45,7), +(512,45,8), +(513,45,10), +(514,45,11), +(515,45,12), +(516,55,2), +(517,55,7), +(518,55,8), +(519,55,10), +(520,55,11), +(521,55,12), +(522,55,13), +(523,55,14), +(524,56,7), +(525,56,8), +(526,56,10), +(527,56,11), +(528,56,12), +(529,56,13), +(530,56,14), +(531,57,11), +(533,54,14), +(542,58,8), +(543,59,7), +(544,60,13), +(548,61,7), +(549,61,13), +(579,63,2), +(580,62,8), +(589,64,7), +(590,64,8), +(596,65,8), +(612,70,2), +(613,70,7), +(614,72,2), +(615,72,7), +(616,72,8), +(617,72,10), +(618,72,11), +(619,72,12), +(620,72,13), +(621,72,14), +(622,72,18), +(623,72,19), +(624,74,8), +(659,77,19), +(664,69,13), +(665,78,7), +(670,80,8), +(671,84,2), +(689,2,2), +(690,2,7), +(691,2,8), +(716,87,7), +(717,87,8), +(728,88,8), +(730,3,8), +(748,89,7), +(749,90,10), +(750,91,10), +(751,92,10), +(753,1,7); + +/*Table structure for table `t_action_log` */ + +DROP TABLE IF EXISTS `t_action_log`; + +CREATE TABLE `t_action_log` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `merchant_id` int DEFAULT '0' COMMENT '商户ID', + `store_id` int DEFAULT '0' COMMENT '店铺ID', + `action_time` datetime DEFAULT NULL COMMENT '操作时间', + `time_consuming` decimal(11,0) DEFAULT NULL COMMENT '耗时', + `client_ip` varchar(50) DEFAULT NULL COMMENT '客户端IP', + `module` varchar(255) DEFAULT NULL COMMENT '操作模块', + `url` varchar(255) DEFAULT NULL COMMENT '请求URL', + `acct_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '操作用户账户', + `user_agent` varchar(255) DEFAULT NULL COMMENT '用户系统以及浏览器信息', + `client_port` int DEFAULT NULL COMMENT '端口号', + `param` text COMMENT '参数', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; + +/*Data for the table `t_action_log` */ + +/*Table structure for table `t_duty` */ + +DROP TABLE IF EXISTS `t_duty`; + +CREATE TABLE `t_duty` ( + `merchant_id` int DEFAULT '0' COMMENT '商户ID', + `duty_id` int NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `duty_name` varchar(240) DEFAULT NULL COMMENT '角色名称', + `status` varchar(6) NOT NULL COMMENT '状态(A: 可用 D: 禁用)', + `description` varchar(400) DEFAULT NULL COMMENT '描述', + `duty_type` varchar(50) NOT NULL COMMENT '角色类型', + PRIMARY KEY (`duty_id`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='角色表'; + +/*Data for the table `t_duty` */ + +insert into `t_duty`(`merchant_id`,`duty_id`,`duty_name`,`status`,`description`,`duty_type`) values +(0,2,'系统管理员','A','系统管理员','1'), +(0,7,'商户管理员','A','商户管理员','2'), +(0,8,'店铺管理员','A','店铺管理员','2'), +(1,10,'店铺服务员','A','店铺服务员','3'), +(1,11,'店铺销售员','A','店铺销售员','3'), +(1,12,'店铺店长','A','店铺店长','3'); + +/*Table structure for table `t_duty_source` */ + +DROP TABLE IF EXISTS `t_duty_source`; + +CREATE TABLE `t_duty_source` ( + `duty_source_id` int NOT NULL AUTO_INCREMENT, + `duty_id` int DEFAULT NULL, + `source_id` int DEFAULT NULL, + PRIMARY KEY (`duty_source_id`), + KEY `FKlciudb88j4tptc36d43ghl5dg` (`duty_id`), + KEY `FKp1c59mwxgjue4qdl86sd6dogf` (`source_id`) +) ENGINE=InnoDB AUTO_INCREMENT=13809 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; + +/*Data for the table `t_duty_source` */ + +insert into `t_duty_source`(`duty_source_id`,`duty_id`,`source_id`) values +(9387,10,61), +(9388,10,79), +(9389,10,80), +(9390,10,103), +(9391,10,108), +(9392,10,110), +(9393,10,122), +(9394,10,123), +(9523,11,1), +(9524,11,2), +(9525,11,3), +(9526,11,4), +(9527,11,5), +(9528,11,6), +(9529,11,7), +(9530,11,9), +(9531,11,15), +(9532,11,16), +(9533,11,17), +(9534,11,18), +(9535,11,19), +(9536,11,49), +(13252,12,158), +(13253,12,140), +(13254,12,117), +(13255,12,119), +(13256,12,102), +(13257,12,93), +(13258,12,112), +(13259,12,101), +(13260,12,83), +(13261,12,5), +(13262,12,80), +(13263,12,138), +(13264,12,107), +(13265,12,106), +(13266,12,120), +(13267,12,118), +(13268,12,49), +(13269,12,84), +(13270,12,86), +(13271,12,113), +(13272,12,91), +(13273,12,125), +(13274,12,61), +(13275,12,105), +(13276,12,85), +(13277,12,121), +(13278,12,79), +(13279,12,139), +(13280,12,115), +(13281,12,146), +(13282,12,109), +(13283,12,100), +(13284,12,16), +(13285,12,50), +(13286,12,54), +(13287,12,69), +(13288,12,103), +(13289,12,135), +(13290,12,127), +(13291,12,131), +(13292,12,136), +(13293,12,128), +(13294,12,133), +(13295,12,132), +(13296,12,108), +(13297,12,81), +(13298,12,124), +(13299,12,111), +(13300,12,96), +(13301,12,122), +(13302,12,123), +(13303,12,110), +(13304,12,129), +(13305,12,78), +(13306,12,195), +(13307,12,90), +(13308,12,116), +(13309,12,134), +(13310,12,130), +(13311,12,97), +(13312,12,104), +(13313,12,196), +(13314,12,1), +(13315,12,137), +(13316,12,19), +(13317,12,18), +(13318,12,17), +(13319,12,9), +(13320,12,15), +(13321,12,7), +(13322,12,6), +(13323,12,4), +(13324,12,3), +(13325,12,2), +(13563,7,119), +(13564,7,198), +(13565,7,188), +(13566,7,181), +(13567,7,160), +(13568,7,158), +(13569,7,154), +(13570,7,140), +(13571,7,126), +(13572,7,117), +(13573,7,112), +(13574,7,102), +(13575,7,93), +(13576,7,91), +(13577,7,138), +(13578,7,159), +(13579,7,107), +(13580,7,106), +(13581,7,155), +(13582,7,5), +(13583,7,161), +(13584,7,101), +(13585,7,113), +(13586,7,120), +(13587,7,49), +(13588,7,182), +(13589,7,86), +(13590,7,84), +(13591,7,83), +(13592,7,80), +(13593,7,118), +(13594,7,125), +(13595,7,185), +(13596,7,61), +(13597,7,186), +(13598,7,153), +(13599,7,100), +(13600,7,115), +(13601,7,146), +(13602,7,16), +(13603,7,109), +(13604,7,105), +(13605,7,139), +(13606,7,85), +(13607,7,79), +(13608,7,183), +(13609,7,121), +(13610,7,136), +(13611,7,131), +(13612,7,135), +(13613,7,50), +(13614,7,192), +(13615,7,165), +(13616,7,178), +(13617,7,179), +(13618,7,187), +(13619,7,54), +(13620,7,69), +(13621,7,103), +(13622,7,127), +(13623,7,128), +(13624,7,132), +(13625,7,133), +(13626,7,124), +(13627,7,108), +(13628,7,194), +(13629,7,193), +(13630,7,78), +(13631,7,96), +(13632,7,197), +(13633,7,110), +(13634,7,111), +(13635,7,129), +(13636,7,122), +(13637,7,195), +(13638,7,123), +(13639,7,116), +(13640,7,130), +(13641,7,90), +(13642,7,134), +(13643,7,97), +(13644,7,104), +(13645,7,196), +(13646,7,1), +(13647,7,180), +(13648,7,137), +(13649,7,184), +(13650,7,3), +(13651,7,2), +(13652,7,4), +(13653,7,6), +(13654,7,7), +(13655,7,9), +(13656,7,15), +(13657,7,17), +(13658,7,18), +(13659,7,19), +(13660,8,198), +(13661,8,119), +(13662,8,117), +(13663,8,112), +(13664,8,126), +(13665,8,181), +(13666,8,80), +(13667,8,84), +(13668,8,118), +(13669,8,86), +(13670,8,91), +(13671,8,113), +(13672,8,107), +(13673,8,61), +(13674,8,125), +(13675,8,105), +(13676,8,183), +(13677,8,109), +(13678,8,79), +(13679,8,146), +(13680,8,85), +(13681,8,131), +(13682,8,135), +(13683,8,178), +(13684,8,179), +(13685,8,54), +(13686,8,50), +(13687,8,69), +(13688,8,132), +(13689,8,124), +(13690,8,96), +(13691,8,197), +(13692,8,195), +(13693,8,78), +(13694,8,110), +(13695,8,129), +(13696,8,111), +(13697,8,97), +(13698,8,104), +(13699,8,90), +(13700,8,130), +(13701,8,196), +(13702,8,116), +(13703,8,180), +(13704,2,140), +(13705,2,93), +(13706,2,102), +(13707,2,112), +(13708,2,117), +(13709,2,119), +(13710,2,126), +(13711,2,154), +(13712,2,158), +(13713,2,160), +(13714,2,198), +(13715,2,189), +(13716,2,188), +(13717,2,181), +(13718,2,177), +(13719,2,138), +(13720,2,120), +(13721,2,118), +(13722,2,182), +(13723,2,113), +(13724,2,161), +(13725,2,107), +(13726,2,106), +(13727,2,155), +(13728,2,101), +(13729,2,159), +(13730,2,91), +(13731,2,49), +(13732,2,80), +(13733,2,83), +(13734,2,84), +(13735,2,5), +(13736,2,86), +(13737,2,125), +(13738,2,61), +(13739,2,185), +(13740,2,186), +(13741,2,153), +(13742,2,109), +(13743,2,16), +(13744,2,121), +(13745,2,139), +(13746,2,105), +(13747,2,146), +(13748,2,85), +(13749,2,115), +(13750,2,79), +(13751,2,100), +(13752,2,183), +(13753,2,178), +(13754,2,165), +(13755,2,179), +(13756,2,50), +(13757,2,187), +(13758,2,136), +(13759,2,135), +(13760,2,192), +(13761,2,131), +(13762,2,127), +(13763,2,54), +(13764,2,103), +(13765,2,69), +(13766,2,128), +(13767,2,132), +(13768,2,133), +(13769,2,124), +(13770,2,194), +(13771,2,108), +(13772,2,193), +(13773,2,96), +(13774,2,197), +(13775,2,110), +(13776,2,111), +(13777,2,195), +(13778,2,78), +(13779,2,122), +(13780,2,123), +(13781,2,129), +(13782,2,196), +(13783,2,90), +(13784,2,97), +(13785,2,104), +(13786,2,116), +(13787,2,130), +(13788,2,134), +(13789,2,1), +(13790,2,180), +(13791,2,184), +(13792,2,137), +(13793,2,2), +(13794,2,7), +(13795,2,3), +(13796,2,4), +(13797,2,19), +(13798,2,18), +(13799,2,17), +(13800,2,15), +(13801,2,6), +(13802,2,9), +(13803,2,199), +(13804,7,199), +(13805,8,199), +(13806,2,200), +(13807,7,200), +(13808,8,200); + +/*Table structure for table `t_gen_code` */ + +DROP TABLE IF EXISTS `t_gen_code`; + +CREATE TABLE `t_gen_code` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `service_name` varchar(64) DEFAULT NULL COMMENT '服务名称', + `module_name` varchar(64) DEFAULT NULL COMMENT '模块名称', + `table_name` varchar(64) DEFAULT NULL COMMENT '表名', + `table_prefix` varchar(64) DEFAULT NULL COMMENT '表前缀', + `pk_name` varchar(32) DEFAULT NULL COMMENT '主键名', + `package_name` varchar(500) DEFAULT NULL COMMENT '后端包名', + `backend_path` varchar(2000) DEFAULT NULL COMMENT '后端路径', + `front_path` varchar(2000) DEFAULT NULL COMMENT '前端路径', + `author` varchar(30) DEFAULT NULL COMMENT '作者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `status` char(1) DEFAULT 'A' COMMENT '状态', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='代码生成表'; + +/*Data for the table `t_gen_code` */ + +insert into `t_gen_code`(`id`,`service_name`,`module_name`,`table_name`,`table_prefix`,`pk_name`,`package_name`,`backend_path`,`front_path`,`author`,`create_time`,`update_time`,`status`) values +(1,'Banner','焦点图','banner','mt_','id','banner','C:/Code/fuintBackend',NULL,'FSQ','2024-04-09 15:18:06','2024-04-09 15:20:52','A'); + +/*Table structure for table `t_platform` */ + +DROP TABLE IF EXISTS `t_platform`; + +CREATE TABLE `t_platform` ( + `owner_id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(100) NOT NULL COMMENT '平台名称', + `status` int NOT NULL COMMENT '状态 0 无效 1 有效', + `description` varchar(255) DEFAULT NULL COMMENT '描述', + `platform_type` int NOT NULL COMMENT '平台类型', + PRIMARY KEY (`owner_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; + +/*Data for the table `t_platform` */ + +insert into `t_platform`(`owner_id`,`name`,`status`,`description`,`platform_type`) values +(1,'会员营销管理系统',1,'会员营销管理系统说明',1); + +/*Table structure for table `t_source` */ + +DROP TABLE IF EXISTS `t_source`; + +CREATE TABLE `t_source` ( + `source_id` int NOT NULL AUTO_INCREMENT COMMENT '菜单Id', + `merchant_id` int DEFAULT '1' COMMENT '商户ID', + `source_name` varchar(240) NOT NULL COMMENT '菜单名称', + `source_code` varchar(200) NOT NULL COMMENT '菜单对应url', + `path` varchar(255) DEFAULT '' COMMENT '路径', + `ename` varchar(100) DEFAULT '' COMMENT '字母名称', + `new_icon` varchar(30) DEFAULT '' COMMENT '新图标', + `status` varchar(6) NOT NULL COMMENT '状态(A:可用 D:禁用)', + `source_level` int NOT NULL COMMENT '菜单级别', + `source_style` varchar(40) NOT NULL COMMENT '样式', + `is_menu` int NOT NULL COMMENT '是否显示', + `description` varchar(400) DEFAULT NULL COMMENT '描述', + `parent_id` int DEFAULT NULL COMMENT '上级菜单ID', + `is_log` int DEFAULT NULL, + `icon` varchar(20) DEFAULT NULL COMMENT '菜单图标', + PRIMARY KEY (`source_id`), + KEY `index-name` (`source_name`,`parent_id`), + KEY `index-parent-id` (`parent_id`) +) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='菜单表'; + +/*Data for the table `t_source` */ + +insert into `t_source`(`source_id`,`merchant_id`,`source_name`,`source_code`,`path`,`ename`,`new_icon`,`status`,`source_level`,`source_style`,`is_menu`,`description`,`parent_id`,`is_log`,`icon`) values +(1,0,'后台管理员','system/account/index','system/account/index','SystemAccountIndex','select','A',2,'7',1,'管理员管理',15,1,NULL), +(2,0,'新增用户','/user/add','system/account/add','SystemAccountAdd','select','A',3,'99',0,'',1,1,NULL), +(3,0,'修改用户','/user/edit','system/account/edit','SystemAccountEdit','select','A',3,'99',0,'',1,1,NULL), +(4,0,'删除用户','/user/delete','system/account/delete','SystemAccountDelete','select','A',3,'99',0,'',1,1,NULL), +(5,0,'后台菜单','system/menu/index','system/menu/index','SystemMenuIndex','select','A',2,'1',1,NULL,15,1,NULL), +(6,0,'新增菜单','system/menu/add','system/menu/add','SystemMenuAdd','select','A',3,'99',0,'',5,1,NULL), +(7,0,'修改菜单','/source/edit','system/menu/edit','SystemMenuEdit','select','A',3,'99',0,'修改菜单',5,1,NULL), +(9,0,'删除菜单','/source/delete','system/menu/delete','SystemMenuDelete','select','A',3,'99',0,'删除菜单',5,1,NULL), +(15,0,'系统管理','system','system','System','system','A',1,'99',1,NULL,NULL,1,'cog'), +(16,0,'后台角色','system/role/index','system/role/index','SystemRoleIndex','select','A',2,'2',1,NULL,15,1,NULL), +(17,0,'新增角色','/duty/add','system/role/add','SystemRoleAdd','select','A',3,'99',0,'',16,1,NULL), +(18,0,'修改角色','/source/edit','system/role/edit','SystemRoleEdit','select','A',3,'99',0,'',16,1,NULL), +(19,0,'删除角色','/source/delete','system/role/delete','SystemRoleDelete','select','A',3,'99',0,'',16,1,NULL), +(49,0,'后台日志','system/logs/index','system/logs/index','SystemLogsIndex','select','A',2,'1',1,'后台操作日志',15,1,NULL), +(50,0,'卡券管理','######','coupon','Coupon','job','A',1,'3',1,'卡券管理',NULL,0,'ticket'), +(54,0,'会员卡券','/backend/userCoupon/list','coupon/userCoupon/index','CouponUserCouponIndex','select','A',2,'3',1,'会员卡券明细列表',50,1,NULL), +(61,0,'新增会员','member/add','member/add','MemberAdd','select','A',2,'10',0,'新增会员',79,1,NULL), +(69,0,'员工管理','/backend/staff/queryList','staff/list','StaffList','select','A',2,'3',1,'店铺员工管理',84,0,NULL), +(78,0,'发券记录','/backend/sendLog/index','coupon/sendLog/index','CouponSendLogIndex','select','A',2,'5',1,'发券记录',50,1,NULL), +(79,0,'会员管理','######','member','Member','peoples','A',1,'2',1,'会员管理',NULL,0,'user'), +(80,0,'会员列表','/backend/member/queryList','member/index','MemberIndex','select','A',2,'1',1,'会员列表',79,1,NULL), +(81,0,'核销流水','/backend/confirmLog/confirmLogList','coupon/confirmLog/index','CouponConfirmLogIndex','select','A',2,'4',1,'核销记录列表',50,1,NULL), +(83,0,'分组管理','/backend/couponGroup/index','coupon/group/index','CouponGroupIndex','select','A',2,'1',1,'分组管理',50,1,NULL), +(84,0,'店铺管理','######','store','Store','shopping','A',1,'1',1,'店铺管理',NULL,0,'columns'), +(85,0,'新增店铺','store/add','store/add','StoreAdd','select','A',3,'2',0,'新增店铺信息',86,1,NULL), +(86,0,'店铺列表','/backend/store/queryList','store/list','StoreList','select','A',2,'1',1,'店铺列表',84,0,NULL), +(90,0,'消息管理','######','message','Message','message','A',1,'6',1,'消息管理',NULL,0,'tablet'), +(91,0,'已发短信','/backend/smsManager/index','smsManager/index','SmsManagerIndex','select','A',2,'1',1,'已发短信列表',90,0,NULL), +(93,0,'短信模板','/backend/smsTemplate/index','smsTemplate/index','SmsTemplateIndex','select','A',2,'0',1,'短信模板',90,0,NULL), +(96,0,'订单管理','######','order','Order','list','A',1,'5',1,'订单管理',NULL,0,'list'), +(97,0,'转赠记录','/backend/give/index','coupon/give/index','CouponGiveIndex','select','A',2,'6',1,'转赠记录',50,1,NULL), +(100,0,'卡券列表','/backend/coupon/index','coupon/coupon/index','CouponCouponIndex','select','A',2,'2',1,'卡券列表',50,1,NULL), +(101,0,'内容管理','######','content','Content','edit','A',1,'1',1,'内容管理',NULL,1,'book'), +(102,0,'轮播管理','content/banner/list','content/banner/list','ContentBannerList','select','A',2,'0',1,'首页广告',101,1,NULL), +(103,0,'会员等级','/backend/userGrade/queryList','userGrade/index','UserGradeIndex','select','A',2,'3',1,'会员等级',79,1,NULL), +(104,0,'积分管理','######','point','Point','log','A',1,'6',1,'积分管理',NULL,1,'file'), +(105,0,'积分明细','/backend/point/index','point/list','PointList','select','A',2,'2',1,'积分明细',104,1,NULL), +(106,0,'积分设置','/backend/point/setting','point/setting','PointSetting','select','A',2,'1',1,'积分设置',104,0,NULL), +(107,0,'订单列表','/backend/order/list','order/index','OrderIndex','select','A',2,'1',1,'订单列表',96,1,NULL), +(108,0,'开卡赠礼','/backend/openGift/list','openGift/index','OpenGiftIndex','select','A',2,'4',1,'开卡礼设置',79,1,NULL), +(109,0,'售后订单','/backend/refund/index','refund/index','RefundIndex','select','A',2,'2',1,'售后订单',96,0,NULL), +(110,0,'会员设置','/backend/member/setting','member/setting','MemberSetting','select','A',2,'5',1,'会员设置',79,0,NULL), +(111,0,'商品管理','######','Goods','Goods','server','A',1,'5',1,'商品管理',NULL,0,'shopping-cart'), +(112,0,'商品分类','/backend/goods/cate/list','goods/cate/index','GoodsCateIndex','select','A',2,'0',1,'商品分类',111,1,NULL), +(113,0,'商品列表','/backend/goods/goods/list','goods/goods/index','GoodsGoodsIndex','select','A',2,'1',1,'商品列表',111,1,NULL), +(115,0,'卡券核销','/backend/home/confirmCoupon','coupon/confirm/index','CouponConfirmIndex','select','A',2,'2',1,'卡券核销',50,1,NULL), +(116,0,'充值管理','recharge','recharge','Recharge','money','A',1,'6',1,'余额',NULL,1,'money'), +(117,0,'充值设置','/backend/balance/setting','balance/setting','BalanceSetting','select','A',2,'0',1,'充值设置',116,1,NULL), +(118,0,'余额明细','balance/list','balance/list','BalanceList','select','A',2,'1',1,'充值明细',116,1,NULL), +(119,0,'订阅消息','/backend/subMessage/index','subMessage/index','SubMessageIndex','select','A',2,'0',1,'小程序订阅消息',90,1,NULL), +(120,0,'轮播图编辑','content/banner/edit','content/banner/edit','ContentBannerEdit','select','A',2,'1',0,NULL,101,1,NULL), +(121,0,'新增轮播图','content:banner:add','content:banner:add','Content:banner:add','select','A',2,'2',0,NULL,101,1,NULL), +(122,0,'新增会员等级','/backend/userGrade/add','userGrade/add','UserGradeAdd','select','A',2,'5',0,NULL,79,1,NULL), +(123,0,'新增开卡赠礼','/backend/openGift/add','openGift/add','OpenGiftAdd','select','A',2,'5',0,NULL,79,1,NULL), +(124,0,'收银台','cashier/index','cashier/index','CashierIndex','select','A',2,'4',1,NULL,125,1,NULL), +(125,0,'收银管理','cashier','cashier','Cashier','tab','A',1,'10',0,NULL,NULL,1,NULL), +(126,0,'核销订单','cashier/confirmOrder','cashier/confirmOrder','CashierConfirmOrder','select','A',2,'0',1,NULL,125,1,NULL), +(127,0,'订单修改','/backend/order/edit','order/edit','OrderEdit','select','A',2,'3',0,NULL,96,1,NULL), +(128,0,'订单删除','/backend/order/delete','order/delete','OrderDelete','select','A',2,'4',0,NULL,96,1,NULL), +(129,0,'处理售后','/backend/refund/edit','refund/edit','RefundEdit','select','A',2,'5',0,NULL,96,1,NULL), +(130,0,'订单详情','/backend/order/detail','order/detail','OrderDetail','select','A',2,'6',0,NULL,96,1,NULL), +(131,0,'添加商品','goods/goods/add','goods/goods/add','GoodsGoodsAdd','select','A',2,'3',0,NULL,111,1,NULL), +(132,0,'编辑商品','goods/goods/edit','goods/goods/edit','GoodsGoodsEdit','select','A',2,'4',0,NULL,111,1,NULL), +(133,0,'编辑短信模板','smsTemplate/edit','smsTemplate/edit','SmsTemplateEdit','select','A',2,'4',0,NULL,90,1,NULL), +(134,0,'编辑订阅消息','subMessage/edit','subMessage/edit','SubMessageEdit','select','A',2,'6',0,NULL,90,1,NULL), +(135,0,'变更余额','balance/modify','balance/modify','BalanceModify','select','A',3,'3',0,NULL,117,1,NULL), +(136,0,'变更积分','point/modify','point/modify','PointModify','select','A',2,'3',0,NULL,104,1,NULL), +(137,0,'编辑卡券分组','coupon/group/edit','coupon/group/edit','CouponGroupEdit','select','A',3,'9',0,NULL,83,1,NULL), +(138,0,'新增卡券','coupon/coupon/add','coupon/coupon/add','CouponCouponAdd','select','A',3,'1',0,NULL,100,1,NULL), +(139,0,'编辑卡券','coupon/coupon/edit','coupon/coupon/edit','CouponCouponEdit','select','A',3,'2',0,NULL,100,1,NULL), +(140,0,'作废会员卡券','coupon/userCoupon/delete','coupon/userCoupon/delete','CouponUserCouponDelete','select','A',3,'0',0,NULL,54,1,NULL), +(146,0,'支付设置','store/paySetting','store/paySetting','StorePaySetting','select','A',3,'2',0,NULL,86,1,NULL), +(153,0,'分佣提成','commission','commission','Commission','tree','A',1,'12',1,NULL,NULL,1,NULL), +(154,0,'分佣规则','commission/rule/index','commission/rule/index','CommissionRuleIndex','select','A',2,'0',1,NULL,153,1,NULL), +(155,0,'分佣记录','commission/log/index','commission/log/index','CommissionLogIndex','select','A',2,'1',1,NULL,153,1,NULL), +(158,0,'订单发货','order/delivery','order/delivery','OrderDelivery','bug','A',3,'0',0,NULL,107,1,NULL), +(159,0,'文章管理','content/article/index','content/article/index','ContentArticleIndex','select','A',2,'1',1,NULL,101,1,NULL), +(160,0,'新增文章','content/article/add','content/article/add','ContentArticleAdd','select','A',2,'0',0,NULL,101,1,NULL), +(161,0,'编辑文章','content/article/edit','content/article/edit','ContentArticleEdit','select','A',2,'1',0,NULL,101,1,NULL), +(165,0,'交易设置','order/setting','order/setting','OrderSetting','select','A',2,'3',1,NULL,96,1,NULL), +(177,0,'商户管理','merchant/index','merchant/index','MerchantIndex','select','A',2,'0',1,NULL,84,1,NULL), +(178,0,'收银设置','setting/cashier','setting/cashier','SettingCashier','select','A',2,'3',1,NULL,125,1,NULL), +(179,0,'库存管理','stock/index','stock/index','StockIndex','select','A',2,'3',1,NULL,111,1,NULL), +(180,0,'数据统计','statistic','statistic','Statistic','chart','A',1,'8',1,NULL,NULL,1,NULL), +(181,0,'数据看板','statistic/index','statistic/index','StatisticIndex','select','A',2,'0',1,NULL,180,1,NULL), +(182,0,'会员分组','member/group/index','member/group/index','MemberGroupIndex','select','A',2,'1',1,NULL,79,1,NULL), +(183,0,'会员充值','balance/distribute','balance/distribute','BalanceDistribute','select','A',2,'2',1,NULL,116,1,NULL), +(184,0,'订单结算','settlement/index','settlement/index','SettlementIndex','select','A',2,'9',1,NULL,96,1,NULL), +(185,0,'发起结算','settlement/doSubmit','settlement/doSubmit','SettlementDoSubmit','select','A',2,'10',0,NULL,96,1,NULL), +(186,0,'结算确认','settlement/doConfirm','settlement/doConfirm','SettlementDoConfirm','select','A',2,'11',0,NULL,96,1,NULL), +(187,0,'生成代码','system/genCode/index','system/genCode/index','SystemGenCodeIndex','select','A',2,'3',1,NULL,15,1,NULL), +(188,0,'新增生成代码','system/genCode/add','system/genCode/add','SystemGenCodeAdd','select','A',3,'0',0,NULL,187,1,NULL), +(189,0,'删除生成代码','system/genCode/delete','system/genCode/delete','SystemGenCodeDelete','select','A',3,'0',0,NULL,187,1,NULL), +(190,0,'确定生成代码','system/genCode/gen','system/genCode/gen','SystemGenCodeGen','select','A',3,'3',0,NULL,187,1,NULL), +(192,0,'结算记录','commission/cash/index','commission/cash/index','CommissionCashIndex','select','A',2,'3',1,NULL,153,1,NULL), +(193,0,'短信配置','smsManager/setting','smsManager/setting','SmsManagerSetting','select','A',2,'5',1,NULL,90,1,NULL), +(194,0,'邀请明细','commission/relation/index','commission/relation/index','CommissionRelationIndex','select','A',2,'4',1,NULL,153,1,NULL), +(195,0,'预约管理','book/index','book/index','BookIndex','select','A',2,'5',1,NULL,84,1,NULL), +(196,0,'预约记录','book/item','book/item','BookItem','select','A',2,'6',1,NULL,84,1,NULL), +(197,0,'打印设备','printer/index','printer/index','PrinterIndex','select','A',2,'5',1,NULL,84,1,NULL), +(198,0,'设置云打印账号','printer/setting','printer/setting','PrinterSetting','select','A',3,'0',0,NULL,197,1,NULL), +(199,0,'导航管理','content/navigation/index','content/navigation/index','ContentNavigationIndex','select','A',2,'3',1,NULL,101,1,NULL), +(200,0,'编辑导航','content/navigation/edit','content/navigation/edit','ConetentNavigationEdit','select','A',2,'0',0,NULL,101,1,NULL); + diff --git a/db/update_for_20250403.sql b/db/update_for_20250403.sql new file mode 100644 index 0000000..6fc1ae4 --- /dev/null +++ b/db/update_for_20250403.sql @@ -0,0 +1,4 @@ +ALTER TABLE `mt_order` + ADD COLUMN `CONFIRM_STATUS` CHAR (1) DEFAULT 'N' NULL COMMENT '核销状态' AFTER `STAFF_ID`, + ADD COLUMN `CONFIRM_TIME` DATETIME NULL COMMENT '核销时间' AFTER `CONFIRM_STATUS`, + ADD COLUMN `CONFIRM_REMARK` VARCHAR (500) NULL COMMENT '核销备注' AFTER `CONFIRM_TIME`; \ No newline at end of file diff --git a/db/update_for_20250422.sql b/db/update_for_20250422.sql new file mode 100644 index 0000000..3564152 --- /dev/null +++ b/db/update_for_20250422.sql @@ -0,0 +1,2 @@ +ALTER TABLE `fuint-db`.`mt_user` + ADD COLUMN `IP` VARCHAR (20) DEFAULT '' NULL COMMENT '注册IP' AFTER `DESCRIPTION`; \ No newline at end of file diff --git a/db/update_for_20250429.sql b/db/update_for_20250429.sql new file mode 100644 index 0000000..94d0914 --- /dev/null +++ b/db/update_for_20250429.sql @@ -0,0 +1,14 @@ +ALTER TABLE `fuint-db`.`mt_cart` + CHANGE `NUM` `NUM` DOUBLE (10, 2) DEFAULT 1 NULL COMMENT '数量'; + +ALTER TABLE `fuint-db`.`mt_goods` + CHANGE `STOCK` `STOCK` DOUBLE (10, 2) UNSIGNED DEFAULT 0 NULL COMMENT '库存'; + +ALTER TABLE `fuint-db`.`mt_goods` + CHANGE `INIT_SALE` `INIT_SALE` DOUBLE (10, 2) DEFAULT 0 NULL COMMENT '初始销量'; + +ALTER TABLE `fuint-db`.`mt_goods_sku` + CHANGE `STOCK` `STOCK` DOUBLE (10, 2) DEFAULT 0 NOT NULL COMMENT '库存'; + +ALTER TABLE `fuint-db`.`mt_order_goods` + CHANGE `NUM` `NUM` DOUBLE (10, 2) DEFAULT 0 NOT NULL COMMENT '商品数量'; \ No newline at end of file diff --git a/db/update_for_20250514.sql b/db/update_for_20250514.sql new file mode 100644 index 0000000..2f8a9f4 --- /dev/null +++ b/db/update_for_20250514.sql @@ -0,0 +1,5 @@ +ALTER TABLE `mt_goods` + ADD COLUMN `COST_PRICE` DECIMAL (10, 2) DEFAULT 0.00 NULL COMMENT '成本价格' AFTER `LINE_PRICE`; + +ALTER TABLE `mt_goods_sku` + ADD COLUMN `COST_PRICE` DECIMAL (10, 2) DEFAULT 0.00 NULL COMMENT '成本价格' AFTER `LINE_PRICE`; \ No newline at end of file diff --git a/db/update_for_20250603.sql b/db/update_for_20250603.sql new file mode 100644 index 0000000..688f2e5 --- /dev/null +++ b/db/update_for_20250603.sql @@ -0,0 +1,2 @@ +ALTER TABLE `mt_goods` + ADD COLUMN `PLATFORM` INT (1) DEFAULT 0 NULL COMMENT '可用平台,0:不限,1:仅会员端(小程序和h5);2:仅收银端' AFTER `GOODS_NO`; diff --git a/db/update_for_20250925.sql b/db/update_for_20250925.sql new file mode 100644 index 0000000..fe77a14 --- /dev/null +++ b/db/update_for_20250925.sql @@ -0,0 +1,2 @@ +ALTER TABLE `mt_setting` + CHANGE `VALUE` `VALUE` LONGTEXT NOT NULL COMMENT '配置值'; diff --git a/db/update_for_20251013.sql b/db/update_for_20251013.sql new file mode 100644 index 0000000..03ee029 --- /dev/null +++ b/db/update_for_20251013.sql @@ -0,0 +1,2 @@ +ALTER TABLE `mt_coupon` + ADD COLUMN `CONTENT` INT DEFAULT 1 NULL COMMENT '内容,如:1表示满减券、2表示折扣券' AFTER `TYPE`; diff --git a/db/update_for_20251020.sql b/db/update_for_20251020.sql new file mode 100644 index 0000000..143c7ce --- /dev/null +++ b/db/update_for_20251020.sql @@ -0,0 +1,5 @@ +ALTER TABLE `mt_merchant` +ADD COLUMN `SETTLE_RATE` DECIMAL NULL COMMENT '结算比例' AFTER `WX_OFFICIAL_APP_SECRET`; + +ALTER TABLE `mt_settlement` +ADD COLUMN `SETTLE_RATE` DECIMAL NULL COMMENT '结算比例' AFTER `STORE_ID`; \ No newline at end of file diff --git a/db/update_for_20251212.sql b/db/update_for_20251212.sql new file mode 100644 index 0000000..b19d71f --- /dev/null +++ b/db/update_for_20251212.sql @@ -0,0 +1,2 @@ +ALTER TABLE `mt_stock_item` + CHANGE `NUM` `NUM` DOUBLE (10, 2) DEFAULT 0 NOT NULL COMMENT '数量'; diff --git a/db/update_for_20260109.sql b/db/update_for_20260109.sql new file mode 100644 index 0000000..2237e44 --- /dev/null +++ b/db/update_for_20260109.sql @@ -0,0 +1,2 @@ +ALTER TABLE `mt_goods` + ADD COLUMN `BOOK_ID` INT DEFAULT 0 NULL COMMENT '预约项目ID' AFTER `CATE_ID`; diff --git a/db/说明.txt b/db/说明.txt new file mode 100644 index 0000000..dc8021e --- /dev/null +++ b/db/说明.txt @@ -0,0 +1,2 @@ +1、fuint-db.sql是全量的数据库; +2、update_for_xxx是从上个版本升级到最新版本用的(首次安装部署不需要导这部分的SQL); \ No newline at end of file diff --git a/fuint-application/pom.xml b/fuint-application/pom.xml new file mode 100644 index 0000000..9784469 --- /dev/null +++ b/fuint-application/pom.xml @@ -0,0 +1,193 @@ + + + + fuint + com.fuint + 1.0.0 + + 4.0.0 + + fuint-application + 1.0.0 + jar + + + 0.0.9 + + + + + com.fuint + fuint-framework + 1.0.0 + + + io.sentry + sentry-logback + 1.2.0 + + + org.springframework.ws + spring-ws-core + + + org.springframework.boot + spring-boot-starter-security + + + org.aspectj + aspectjweaver + + + commons-httpclient + commons-httpclient + 3.1 + + + nl.bitwalker + UserAgentUtils + 1.2.4 + + + commons-lang + commons-lang + 2.6 + + + io.springfox + springfox-swagger2 + 2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.2.5 + + + org.mybatis + mybatis + + + + + + org.mockito + mockito-core + + + com.github.axet + kaptcha + ${kaptcha.version} + + + junit + junit + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.javassist + javassist + 3.24.0-GA + + + com.aliyun.oss + aliyun-sdk-oss + 3.10.2 + + + + com.aliyun + aliyun-java-sdk-core + 4.4.6 + + + com.alibaba + transmittable-thread-local + 2.2.0 + + + com.github.javen205 + IJPay-WxPay + 2.9.12.1 + + + com.github.javen205 + IJPay-AliPay + 2.9.12.1 + + + com.github.javen205 + IJPay-UnionPay + 2.9.12.1 + + + org.apache.velocity + velocity-engine-core + 2.3 + + + + commons-io + commons-io + 2.13.0 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.5.12 + + + + repackage + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + diff --git a/fuint-application/src/main/java/com/fuint/common/Constants.java b/fuint-application/src/main/java/com/fuint/common/Constants.java new file mode 100644 index 0000000..8468a8c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/Constants.java @@ -0,0 +1,38 @@ +package com.fuint.common; + +import java.util.HashMap; +import java.util.Map; + +/** + * 常量定义 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Constants { + + // 第几页,默认第1页 + public static final int PAGE_NUMBER = 1; + + // 每页记录数,默认20条 + public static final int PAGE_SIZE = 20; + + // 读取数据最多行数 + public static final int MAX_ROWS = 5000; + + // 读取数据全部行数 + public static final int ALL_ROWS = 1000000; + + /** + * 系统配置, 从setting表中读取 + */ + public static Map SYS_CONFIGS = new HashMap(); + + public static final int HTTP_RESPONSE_CODE_PARAM_ERROR = 202; + public static final int HTTP_RESPONSE_CODE_USER_NOT_EXIST = 402; + public static final int HTTP_RESPONSE_CODE_USER_LOGIN_ERROR = 403; + public static final int HTTP_RESPONSE_CODE_NOLOGIN = 1001; + + public static final String SESSION_USER = "FUINT_USER"; + public static final String SESSION_ADMIN_USER = "FUINT_ADMIN_USER"; +} diff --git a/fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java b/fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java new file mode 100644 index 0000000..72d879e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java @@ -0,0 +1,147 @@ +package com.fuint.common.aspect; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.Modifier; +import javassist.bytecode.CodeAttribute; +import javassist.bytecode.LocalVariableAttribute; +import javassist.bytecode.MethodInfo; +import org.apache.commons.lang.ArrayUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.stereotype.Component; + +/** + * 控制器日志 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Component // 声明组件 +@Aspect // 声明切面 +@ComponentScan //组件自动扫描 +@EnableAspectJAutoProxy // spring自动切换JDK动态代理和CGLIB +public class LogAop { + + /** + *自定义日志 + */ + private Logger logger = LoggerFactory.getLogger(LogAop.class); + + /** + * 打印类method的名称以及参数 + * @param point 切面 + */ + public void printMethodParams(JoinPoint point){ + if (point == null) { + return; + } + try { + // 获取方法的参数值数组。方法名、类型以及地址等信息 + String className = point.getTarget().getClass().getName(); + String methodName = point.getSignature().getName(); + + // 重新定义日志 + logger = LoggerFactory.getLogger(point.getTarget().getClass()); + logger.info("-------------------------"+className+"------------------------------------"); + logger.info("methodName = {}", methodName); + + // 获取方法的参数值数组 + Object[] methodArgs = point.getArgs(); + + // 获取方法参数名称 + String[] paramNames = getFieldsName(className, methodName); + + // 输出方法的参数名和参数值 + printParams(paramNames, methodArgs); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 使用获取方法参数名称 + * @param class_name 类名 + * @param method_name 方法名 + * @throws Exception + */ + private String[] getFieldsName(String class_name, String method_name) throws Exception { + Class clazz = Class.forName(class_name); + String clazz_name = clazz.getName(); + ClassPool pool = ClassPool.getDefault(); + ClassClassPath classPath = new ClassClassPath(clazz); + pool.insertClassPath(classPath); + try { + CtClass ctClass = pool.get(clazz_name); + CtMethod ctMethod = ctClass.getDeclaredMethod(method_name); + MethodInfo methodInfo = ctMethod.getMethodInfo(); + CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); + LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); + if (attr == null) { + return null; + } + String[] paramsArgsName = new String[ctMethod.getParameterTypes().length]; + int pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1; + for (int i = 0; i < paramsArgsName.length; i++) { + paramsArgsName[i] = attr.variableName(i + pos); + } + return paramsArgsName; + } catch (Exception ex) { + return null; + } + } + + /** + * 判断是否为基本类型 + */ + private boolean isPrimite(Class clazz) { + if (clazz.isPrimitive() || clazz == String.class){ + return true; + }else { + return false; + } + } + + /** + * 打印方法参数值 基本类型直接打印,非基本类型需要重写toString方法 + * @param paramsArgsName 方法参数名数组 + * @param paramsArgsValue 方法参数值数组 + */ + private void printParams(String[] paramsArgsName, Object[] paramsArgsValue) { + if (ArrayUtils.isEmpty(paramsArgsName) || ArrayUtils.isEmpty(paramsArgsValue)) { + return; + } + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < paramsArgsName.length; i++) { + // 参数名 + String name = paramsArgsName[i]; + // 参数值 + Object value = paramsArgsValue[i]; + buffer.append(name +" = "); + if (isPrimite(value.getClass())) { + buffer.append(value + " ,"); + } else { + buffer.append(value.toString() + " ,"); + } + } + logger.info("params : " + buffer.toString()); + logger.info("-------------------------------------------------------------"); + } + + /** + * 在方法执行前进行切面 + * 定义切面表达式 + * @param point 切面 + */ + @Before("execution(public * com.fuint.module..*.*(..))") + public void before(JoinPoint point) { + this.printMethodParams(point); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java b/fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java new file mode 100644 index 0000000..3b26713 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java @@ -0,0 +1,16 @@ +package com.fuint.common.aspect; + +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Component +@Aspect +public class RedisModelAspect { + public static final Logger logger = LoggerFactory.getLogger(RedisModelAspect.class); +} diff --git a/fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java b/fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java new file mode 100644 index 0000000..2922c5b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java @@ -0,0 +1,240 @@ +package com.fuint.common.aspect; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.service.AccountService; +import com.fuint.common.service.ActionLogService; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.repository.model.TActionLog; +import com.fuint.utils.StringUtil; +import org.apache.commons.lang.StringUtils; +import org.apache.ibatis.javassist.*; +import org.apache.ibatis.javassist.bytecode.CodeAttribute; +import org.apache.ibatis.javassist.bytecode.LocalVariableAttribute; +import org.apache.ibatis.javassist.bytecode.MethodInfo; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 后台操作日志 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Component +@Aspect +public class TActionLogAop { + + private final Logger logger = LoggerFactory.getLogger(TActionLogAop.class); + + @Lazy + @Autowired + private ActionLogService tActionLogService; + + @Lazy + @Autowired + private AccountService tAccountService; + + private String userName = ""; // 用户名 + private Integer merchantId = 0; // 商户ID + private Integer storeId = 0; // 店铺ID + private Long startTimeMillis = 0l; // 开始时间 + private Long endTimeMillis = 0l; // 结束时间 + private String clientIp = ""; + private Integer clientPort = 0; + private String module = ""; + private String url = ""; + private String userAgent = ""; + private String param = ""; + + // Service层切点 + @Pointcut("@annotation(com.fuint.framework.annoation.OperationServiceLog)") + public void serviceAspect() { + // empty + } + + /** + * service 方法前调用 + * + * @param joinPoint + */ + @Before("serviceAspect()") + public void doBeforeService(JoinPoint joinPoint) { + // 记录方法开始执行的时间 + startTimeMillis = System.currentTimeMillis(); + + Map params = getJoinPointPramas(joinPoint); + String methodName = params.get("methodName"); + String classPath = params.get("classPath"); + Class clazz = null; + CtMethod ctMethod = null; + LocalVariableAttribute attr = null; + int length = 0; + int pos = 0; + + try { + //获取切入点参数 + clazz = Class.forName(classPath); + String clazzName = clazz.getName(); + ClassPool pool = ClassPool.getDefault(); + ClassClassPath classClassPath = new ClassClassPath(clazz); + pool.insertClassPath(classClassPath); + CtClass ctClass = pool.get(clazzName); + ctMethod = ctClass.getDeclaredMethod(methodName); + MethodInfo methodInfo = ctMethod.getMethodInfo(); + CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); + attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); + length = ctMethod.getParameterTypes().length; + pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1; + Object[] paramsArgsValues = joinPoint.getArgs(); + String[] parmasArgsNames = new String[length]; + Map parmasMap = new HashMap(); + for (int i = 0; i < length; i++) { + parmasArgsNames[i] = attr.variableName(i + pos); + String paramsArgsName = attr.variableName(i + pos); + if (paramsArgsName.equalsIgnoreCase("request") + || paramsArgsName.equalsIgnoreCase("response") + || paramsArgsName.equalsIgnoreCase("session") + || paramsArgsName.equalsIgnoreCase("model")) { + continue; + } + Object paramsArgsValue = paramsArgsValues[i]; + parmasMap.put(paramsArgsName, paramsArgsValue); + } + param = JSON.toJSONString(parmasMap); + } catch (ClassNotFoundException e) { + logger.info("AOP切入点获取参数异常", e); + } catch (NotFoundException e) { + logger.info("AOP切入点获取参数异常", e); + } catch (Exception e) { + logger.info("AOP切入点获取参数异常", e.getMessage()); + } + } + + /** + * 方法后调用 + * + * @param operationServiceLog + */ + @After("serviceAspect() && @annotation(operationServiceLog)") + public void doAfterInService(OperationServiceLog operationServiceLog) { + try { + HttpServletRequest request = getRequest(); + if (request == null) { + return; + } + endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间 + clientIp = CommonUtil.getIPFromHttpRequest(request); + userAgent = request.getHeader("user-agent"); + url = request.getRequestURI(); + clientPort = 0; + module = operationServiceLog.description(); + if (module.length() > 255) { + module = module.substring(0, 255); + } + String token = request.getHeader("Access-Token"); + if (StringUtils.isNotEmpty(token)) { + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo != null) { + userName = accountInfo.getAccountName(); + merchantId = accountInfo.getMerchantId() == null ? 0 : accountInfo.getMerchantId(); + storeId = accountInfo.getStoreId() == null ? 0 : accountInfo.getStoreId(); + } + } else { + if (StringUtil.isNotEmpty(param) && param.length() > 10) { + JSONObject jsonObject = JSON.parseObject(param); + if (jsonObject != null) { + JSONObject tAccount = jsonObject.getJSONObject("tAccount"); + if (tAccount != null) { + String accountName = tAccount.getString("username"); + AccountInfo accountInfo = tAccountService.getAccountByName(accountName); + if (accountInfo != null) { + userName = accountInfo.getAccountName(); + merchantId = accountInfo.getMerchantId(); + storeId = accountInfo.getStoreId(); + } + } + } + } + } + printOptLog(); + } catch (Exception e) { + logger.error("保存后台日志出错啦:{}", e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 组装日志 + */ + private void printOptLog() { + if (userAgent.length() > 255) { + userAgent = userAgent.substring(0, 255); + } + if (url.length() > 255) { + url = url.substring(0, 255); + } + TActionLog hal = new TActionLog(); + hal.setAcctName(userName); + hal.setModule(module); + hal.setActionTime(new Date()); + hal.setClientIp(clientIp); + hal.setClientPort(clientPort); + hal.setUrl(url); + hal.setTimeConsuming(new BigDecimal(endTimeMillis - startTimeMillis)); + hal.setUserAgent(userAgent); + hal.setMerchantId(merchantId); + hal.setStoreId(storeId); + if (param.length() > 10000) { + param = param.substring(0, 10000); + } + hal.setParam(param.equals("{}") ? "" : param); + if (StringUtils.isNotEmpty(module) && userName != null && StringUtils.isNotEmpty(userName)) { + tActionLogService.saveActionLog(hal); + } + } + + protected HttpServletRequest getRequest() { + try { + return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); + } catch (Exception e) { + return null; + } + } + + /** + * 获取切入点参数信息 + * + * @param joinPoint + * @return + */ + public Map getJoinPointPramas(JoinPoint joinPoint) { + Map mapParams = new HashMap(); + // 获取切入点所在的方法 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method smethod = signature.getMethod(); + String classPath = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + mapParams.put("module", module); + mapParams.put("classPath", classPath); + mapParams.put("methodName", methodName); + return mapParams; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java b/fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java new file mode 100644 index 0000000..45fe4a2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java @@ -0,0 +1,43 @@ +package com.fuint.common.bean; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; +import lombok.Data; + +/** + * 支付宝支付Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Component +@PropertySource("file:${env.properties.path}/${env.profile}/application.properties") +@ConfigurationProperties(prefix = "alipay") +public class AliPayBean { + + private String appId; + private String privateKey; + private String publicKey; + private String appCertPath; + private String aliPayCertPath; + private String aliPayRootCertPath; + private String serverUrl; + private String domain; + + + @Override + public String toString() { + return "AliPayBean{" + + "appId='" + appId + '\'' + + ", privateKey='" + privateKey + '\'' + + ", publicKey='" + publicKey + '\'' + + ", appCertPath='" + appCertPath + '\'' + + ", aliPayCertPath='" + aliPayCertPath + '\'' + + ", aliPayRootCertPath='" + aliPayRootCertPath + '\'' + + ", serverUrl='" + serverUrl + '\'' + + ", domain='" + domain + '\'' + + '}'; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java b/fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java new file mode 100644 index 0000000..5d7061e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java @@ -0,0 +1,83 @@ +package com.fuint.common.bean; + +import com.alibaba.fastjson.JSON; + +/** + * H5支付Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class H5SceneInfo { + private H5 h5_info; + + public H5 getH5Info() { + return h5_info; + } + + public void setH5Info(H5 h5_info) { + this.h5_info = h5_info; + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } + + public static class H5 { + private String type; + private String app_name; + private String bundle_id; + private String package_name; + private String wap_url; + private String wap_name; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getApp_name() { + return app_name; + } + + public void setApp_name(String app_name) { + this.app_name = app_name; + } + + public String getBundle_id() { + return bundle_id; + } + + public void setBundle_id(String bundle_id) { + this.bundle_id = bundle_id; + } + + public String getPackage_name() { + return package_name; + } + + public void setPackage_name(String package_name) { + this.package_name = package_name; + } + + public String getWap_url() { + return wap_url; + } + + public void setWap_url(String wap_url) { + this.wap_url = wap_url; + } + + public String getWap_name() { + return wap_name; + } + + public void setWap_name(String wap_name) { + this.wap_name = wap_name; + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java b/fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java new file mode 100644 index 0000000..1c34d04 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java @@ -0,0 +1,35 @@ +package com.fuint.common.bean; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 云闪付支付Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Component +@PropertySource("file:${env.properties.path}/${env.profile}/application.properties") +@ConfigurationProperties(prefix = "union") +public class UnionPayBean { + + private String machId; + private String key; + private String serverUrl; + private String domain; + + + @Override + public String toString() { + return "UnionPayBean{" + + "machId='" + machId + '\'' + + ", key='" + key + '\'' + + ", serverUrl='" + serverUrl + '\'' + + ", domain='" + domain + '\'' + + '}'; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java b/fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java new file mode 100644 index 0000000..bd3f2a9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java @@ -0,0 +1,33 @@ +package com.fuint.common.bean; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 微信支付Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Component +@PropertySource("file:${env.properties.path}/${env.profile}/application.properties") +@ConfigurationProperties(prefix = "wxpay") +public class WxPayBean { + + private String appId; + private String appSecret; + private String mchId; + private String apiV2; + private String certPath; + private String domain; // 填写完整的回调地址 + + + @Override + public String toString() { + return "WxPayBean [appId=" + appId + ", appSecret=" + appSecret + ", mchId=" + mchId + ", apiV2=" + + apiV2 + ", certPath=" + certPath + ", domain=" + domain + "]"; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java b/fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java new file mode 100644 index 0000000..1e8e034 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java @@ -0,0 +1,43 @@ +package com.fuint.common.bean; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; +import lombok.Data; + +/** + * 微信V3支付Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Component +@PropertySource("file:${env.properties.path}/${env.profile}/application.properties") +@ConfigurationProperties(prefix = "v3") +@Data +public class WxPayV3Bean { + + private String appId; + private String keyPath; + private String certPath; + private String certP12Path; + private String platformCertPath; + private String mchId; + private String apiKey; + private String apiKey3; + private String domain; + + @Override + public String toString() { + return "WxPayV3Bean{" + + "keyPath='" + keyPath + '\'' + + ", certPath='" + certPath + '\'' + + ", certP12Path='" + certP12Path + '\'' + + ", platformCertPath='" + platformCertPath + '\'' + + ", mchId='" + mchId + '\'' + + ", apiKey='" + apiKey + '\'' + + ", apiKey3='" + apiKey3 + '\'' + + ", domain='" + domain + '\'' + + '}'; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ContactBean.java b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ContactBean.java new file mode 100644 index 0000000..f9373a8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ContactBean.java @@ -0,0 +1,36 @@ +package com.fuint.common.bean.shoppingOrders; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; + +/** + * 联系人Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ContactBean implements Serializable { + + private static final long serialVersionUID = 2256209964320569284L; + + /** + * 寄件人联系方式,寄件人联系方式,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 + */ + @SerializedName("consignor_contact") + private String consignorContact; + + /** + * 收件人联系方式,收件人联系方式为,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 + */ + @SerializedName("receiver_contact") + private String receiverContact; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/OrderKeyBean.java b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/OrderKeyBean.java new file mode 100644 index 0000000..255f3e0 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/OrderKeyBean.java @@ -0,0 +1,49 @@ +package com.fuint.common.bean.shoppingOrders; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; + +/** + * 订单,需要上传物流信息的订单Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderKeyBean implements Serializable { + + private static final long serialVersionUID = 1486092394664728388L; + + /** + * 必填 + * 订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。 + */ + @SerializedName("order_number_type") + private int orderNumberType; + + /** + * 原支付交易对应的微信订单号 + */ + @SerializedName("transaction_id") + private String transactionId; + + /** + * 支付下单商户的商户号,由微信支付生成并下发。 + */ + @SerializedName("mchid") + private String mchId; + + /** + * 商户系统内部订单号,只能是数字、大小写字母`_-*`且在同一个商户号下唯一 + */ + @SerializedName("out_trade_no") + private String outTradeNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/PayerBean.java b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/PayerBean.java new file mode 100644 index 0000000..0030bb2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/PayerBean.java @@ -0,0 +1,31 @@ +package com.fuint.common.bean.shoppingOrders; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; + +/** + * 支付者,支付者信息Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayerBean implements Serializable { + + private static final long serialVersionUID = -7943088204264205895L; + + /** + * 必填 + * 用户标识,用户在小程序appid下的唯一标识。 下单前需获取到用户的Openid 示例值: oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 字符字节限制: [1, 128] + */ + @SerializedName("openid") + private String openid; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingInfo.java b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingInfo.java new file mode 100644 index 0000000..d30bbdd --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingInfo.java @@ -0,0 +1,67 @@ +package com.fuint.common.bean.shoppingOrders; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.util.List; + +/** + * 上传发货信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShippingInfo implements Serializable { + + private static final long serialVersionUID = 2105037984591600658L; + /** + * 必填 + * 订单,需要上传物流信息的订单 + */ + @SerializedName("order_key") + private OrderKeyBean orderKey; + + + /** + * 必填 + * 发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) + * 示例值: UNIFIED_DELIVERY + */ + @SerializedName("delivery_mode") + private int deliveryMode; + + /** + * 必填 + * 物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 + * */ + @SerializedName("logistics_type") + private int logisticsType; + + /** + * 必填 + * 物流信息列表,发货物流单列表,支持统一发货(单个物流单)和分拆发货(多个物流单)两种模式,多重性: [1, 10] + */ + @SerializedName("shipping_list") + private List shippingList; + + /** + * 必填 + * 上传时间,用于标识请求的先后顺序 示例值: `2022-12-15T13:29:35.120+08:00 + */ + @SerializedName("upload_time") + private String uploadTime; + + /** + * 必填 + * 支付者,支付者信息 + */ + @SerializedName("payer") + private PayerBean payer; +} diff --git a/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingListBean.java b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingListBean.java new file mode 100644 index 0000000..dc97ab7 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/bean/shoppingOrders/ShippingListBean.java @@ -0,0 +1,64 @@ +package com.fuint.common.bean.shoppingOrders; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.util.List; + +/** + * 上传发货信息Bean + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShippingListBean implements Serializable { + + private static final long serialVersionUID = -6884739637300493109L; + + /** + * 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + */ + @SerializedName("tracking_no") + private String trackingNo; + + /** + * 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + */ + @SerializedName("express_company") + private String expressCompany; + + /** + * 物流关联的商品列表,当统一发货(单个物流单)时,该项不填;当分拆发货(多个物流单)时,需填入各物流单关联的商品列表 多重性: [0, 50] + */ + @SerializedName("item_list") + private List itemList; + + /** + * 联系方式,当发货的物流公司为顺丰时,联系方式为必填,收件人或寄件人联系方式二选一 + */ + @SerializedName("contact") + private ContactBean contact; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class ShippingItemListBean implements Serializable { + + private static final long serialVersionUID = -1433227869321841858L; + + /** + * 商户侧商品ID,商户系统内部商品编码,分拆发货模式下为必填,用于标识每笔物流单号内包含的商品,需与「上传购物详情」中传入的商品ID匹配 + * 示例值: 1246464644 字符字节限制: [1, 64] + */ + @SerializedName("merchant_item_id") + private String merchantItemId; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java b/fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java new file mode 100644 index 0000000..9c30ef4 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java @@ -0,0 +1,41 @@ +package com.fuint.common.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import java.io.InputStream; +import java.util.Properties; + +/** + * 图形验证码组件配置 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Configuration +public class CaptchaConfig { + + private static final Logger logger = LoggerFactory.getLogger(CaptchaConfig.class); + + /** + * 验证码 + */ + @Bean + public DefaultKaptcha defaultCaptcha() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties property = new Properties(); + try { + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("captcha-conf.properties"); + property.load(inputStream); + Config config = new Config(property); + defaultKaptcha.setConfig(config); + } catch (Exception e) { + logger.error("Kaptcha properties load error {}", e); + throw new RuntimeException("Kaptcha properties load error"); + } + return defaultKaptcha; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/config/Message.java b/fuint-application/src/main/java/com/fuint/common/config/Message.java new file mode 100644 index 0000000..6540f6a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/Message.java @@ -0,0 +1,23 @@ +package com.fuint.common.config; + +/** + * 消息定义 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Message { + public static final String PARAM_ERROR = "参数出错"; + public static final String COUPON_NOT_EXIST = "该卡券不存在"; + public static final String COUPON_IS_EXPIRE = "该卡券未生效"; + public static final String USER_NOT_EXIST = "该用户不存在"; + public static final String MAX_COUPON_LIMIT = "已经领取过了"; + public static final String COUPON_TYPE_ERROR = "卡券类型有误"; + public static final String POINT_LIMIT = "您的积分不足"; + public static final String NEED_CODE = "需要领取码"; + public static final String CODE_ERROR = "领取码错误"; + public static final String CODE_ERROR_1 = "核销码错误"; + public static final String GRADE_ERROR = "该卡券不适用于您的会员等级"; + public static final String HAS_COUPON = "您已领取过该卡券"; + public static final String SEND_WAY_ERROR = "该卡券无法领取"; +} diff --git a/fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java b/fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java new file mode 100644 index 0000000..bb57e45 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java @@ -0,0 +1,51 @@ +package com.fuint.common.config; + +import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector; +import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MybatisPlus配置 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Configuration +@MapperScan({"com.fuint.repository.**.mapper"}) +public class MybatisPlusConfig { + + /** + * 分页插件 + * @return PaginationInterceptor + */ + @Bean + @ConditionalOnMissingBean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + + /** + * 逻辑删除插件 + * + * @return LogicSqlInjector + */ + @Bean + @ConditionalOnMissingBean + public ISqlInjector sqlInjector() { + return new LogicSqlInjector(); + } + + /** + * 乐观锁插件 + * @return + */ + @Bean + public OptimisticLockerInterceptor optimisticLockerInterceptor() { + return new OptimisticLockerInterceptor(); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java b/fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java new file mode 100644 index 0000000..97ab611 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java @@ -0,0 +1,67 @@ +package com.fuint.common.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.session.data.redis.config.ConfigureRedisAction; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; + +/** + * 配置redis缓存 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Configuration +@EnableCaching +@EnableRedisHttpSession +public class RedisConfig extends CachingConfigurerSupport { + + @Autowired + private RedisConnectionFactory redisConnectionFactory; + + @Bean + public KeyGenerator keyGenerator() { + return (target, method, params) -> { + StringBuilder sb = new StringBuilder(); + sb.append(target.getClass().getName()); + sb.append(method.getName()); + for (Object obj : params) { + sb.append(obj.toString()); + } + return sb.toString(); + }; + } + + @Bean + public static ConfigureRedisAction configureRedisAction() { + return ConfigureRedisAction.NO_OP; + } + + @Bean + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(ObjectMapper objectMapper) { + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>( + Object.class); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + return jackson2JsonRedisSerializer; + } + + @Bean + RedisTemplate redisTemplate(Jackson2JsonRedisSerializer jackson2JsonRedisSerializer) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + return redisTemplate; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java b/fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java new file mode 100644 index 0000000..3a3356e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java @@ -0,0 +1,100 @@ +package com.fuint.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * 安全中心配置 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + /** + * 解决 无法直接注入 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + httpSecurity + // CSRF禁用,因为不使用session + .csrf().disable() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + // 允许匿名访问 + .antMatchers( + "/clientApi/**", + "/backendApi/**", + "/merchantApi/**" + ).anonymous() + .antMatchers( + HttpMethod.GET, + "/", + "/static/**", + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js", + "/profile/**" + ).permitAll() + .antMatchers("/swagger-ui.html").anonymous() + .antMatchers("/swagger-resources/**").anonymous() + .antMatchers("/webjars/**").anonymous() + .antMatchers("/*/api-docs").anonymous() + .antMatchers("/druid/**").anonymous() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + } + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 身份认证接口 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) { + // empty + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java b/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java new file mode 100644 index 0000000..32febeb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java @@ -0,0 +1,44 @@ +package com.fuint.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * Swagger接口文档 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfig implements WebMvcConfigurer { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .enable(true) + .select() + .apis(RequestHandlerSelectors.basePackage("com.fuint.module")) + .build(); + } + + @Bean + public ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("fuint会员营销系统接口文档") + .description("fuint会员营销系统接口文档,“/clientApi”目录接口为会员端相关接口,“/backendApi”目录接口为后台管理端相关接口。") + .termsOfServiceUrl("https://www.fuint.cn/") + .contact(new Contact("海南延禾信息技术有限公司","https://www.fuint.cn/", "fushengqian@qq.com")) + .version("1.0") + .build(); + } +} \ No newline at end of file diff --git a/fuint-application/src/main/java/com/fuint/common/config/WebConfig.java b/fuint-application/src/main/java/com/fuint/common/config/WebConfig.java new file mode 100644 index 0000000..0a05cfd --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/config/WebConfig.java @@ -0,0 +1,110 @@ +package com.fuint.common.config; + +import com.fuint.common.web.AdminUserInterceptor; +import com.fuint.common.web.CommandInterceptor; +import com.fuint.common.web.ClientUserInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.filter.CharacterEncodingFilter; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.resource.CssLinkResourceTransformer; +import org.springframework.web.servlet.resource.VersionResourceResolver; +import java.util.concurrent.TimeUnit; + +/** + * web配置 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Configuration +public class WebConfig extends WebMvcConfigurationSupport { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**") + .addResourceLocations("/resources/", "classpath:/other-resources/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)) + .resourceChain(false) + .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**")) + .addTransformer(new CssLinkResourceTransformer()); + registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); + + registry.addResourceHandler("/**").addResourceLocations( + "classpath:/static/"); + registry.addResourceHandler("swagger-ui.html").addResourceLocations( + "classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations( + "classpath:/META-INF/resources/webjars/"); + super.addResourceHandlers(registry); + } + + @Bean + public CommandInterceptor commandInterceptor() { + return new CommandInterceptor(); + } + + @Bean + public AdminUserInterceptor adminUserInterceptor() { + return new AdminUserInterceptor(); + } + + @Bean + public ClientUserInterceptor portalUserInterceptor() { + return new ClientUserInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // Command + registry.addInterceptor(commandInterceptor()) + .addPathPatterns("/cmd/**"); + + // 后台拦截 + registry.addInterceptor(adminUserInterceptor()) + .addPathPatterns("/backendApi/**") + .excludePathPatterns("/clientApi/captcha/**") + .excludePathPatterns("/backendApi/captcha/**") + .excludePathPatterns("/backendApi/userCoupon/exportList") + .excludePathPatterns("/backendApi/order/export") + .excludePathPatterns("/backendApi/goods/goods/downloadTemplate") + .excludePathPatterns("/backendApi/member/downloadTemplate") + .excludePathPatterns("/backendApi/login/**"); + + // 客户端拦截 + registry.addInterceptor(portalUserInterceptor()) + .addPathPatterns("/clientApi/**") + .excludePathPatterns("/clientApi/sign/**") + .excludePathPatterns("/clientApi/page/home") + .excludePathPatterns("/clientApi/captcha/**") + .excludePathPatterns("/clientApi/goodsApi/**") + .excludePathPatterns("/clientApi/coupon/list") + .excludePathPatterns("/clientApi/coupon/detail") + .excludePathPatterns("/clientApi/cart/**") + .excludePathPatterns("/clientApi/user/**") + .excludePathPatterns("/clientApi/settlement/submit") + .excludePathPatterns("/clientApi/pay/doPay") + .excludePathPatterns("/clientApi/pay/weixinCallback") + .excludePathPatterns("/clientApi/pay/weixinRefundNotify") + .excludePathPatterns("/clientApi/pay/aliPayCallback") + .excludePathPatterns("/clientApi/order/todoCounts") + .excludePathPatterns("/clientApi/order/detail") + .excludePathPatterns("/clientApi/store/**") + .excludePathPatterns("/clientApi/article/**") + .excludePathPatterns("/clientApi/message/getOne") + .excludePathPatterns("/clientApi/message/wxPush") + .excludePathPatterns("/clientApi/sms/sendVerifyCode") + .excludePathPatterns("/clientApi/book/list") + .excludePathPatterns("/clientApi/book/detail") + .excludePathPatterns("/clientApi/book/cateList"); + } + + @Bean + public CharacterEncodingFilter characterEncodingFilter() { + CharacterEncodingFilter filter = new CharacterEncodingFilter(); + filter.setEncoding("UTF-8"); + filter.setForceEncoding(true); + return filter; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java b/fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java new file mode 100644 index 0000000..dc4803a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java @@ -0,0 +1,66 @@ +package com.fuint.common.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 树状结构节点实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class TreeNode implements Serializable { + + @ApiModelProperty("菜单ID") + private long id; + + @ApiModelProperty("菜单名称") + private String name; + + @ApiModelProperty("菜单名称(字母)") + private String ename; + + @ApiModelProperty("节点是否打开") + private Boolean open; + + @ApiModelProperty("是否菜单") + private int isMenu; + + @ApiModelProperty("节点是否选中") + private Boolean checked; + + @ApiModelProperty("url") + private String url; + + @ApiModelProperty("路径") + private String path; + + @ApiModelProperty("权限标识") + private String perms; + + @ApiModelProperty("子菜单") + private List childrens = new ArrayList<>(); + + @ApiModelProperty("菜单级别") + private int level; + + @ApiModelProperty("上级菜单") + private long pId; + + @ApiModelProperty("图标") + private String icon; + + @ApiModelProperty("新图标") + private String newIcon; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java b/fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java new file mode 100644 index 0000000..afdebfb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java @@ -0,0 +1,61 @@ +package com.fuint.common.domain; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; + +/** + * TreeSelect树结构实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class TreeSelect implements Serializable { + + private static final long serialVersionUID = 1L; + + // 节点ID + private Long id; + + // 节点名称 + private String label; + + // 子节点 + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List childrens; + + public TreeSelect() { + // empty + } + + public TreeSelect(TreeNode menu) { + this.id = menu.getId(); + this.label = menu.getName(); + this.childrens = menu.getChildrens().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public List getChildrens() { + return childrens; + } + + public void setChildrens(List childrens) { + this.childrens = childrens; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java b/fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java new file mode 100644 index 0000000..3dc4371 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java @@ -0,0 +1,67 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.util.Date; + +/** + * 后台账户实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class AccountDto { + + @ApiModelProperty("账户主键id") + private Integer id; + + @ApiModelProperty("账户编码") + private String accountKey; + + @ApiModelProperty("账户名称") + private String accountName; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("状态 : 0 无效 1 有效") + private int accountStatus; + + @ApiModelProperty("激活状态 : 0 未激活 1已激活") + private int isActive; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createDate; + + @ApiModelProperty("修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date modifyDate; + + @ApiModelProperty("随机码(公盐)") + private String salt; + + @ApiModelProperty("是否被锁定") + private int locked; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属商户名称") + private String merchantName; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("所属店铺名称") + private String storeName; + + @ApiModelProperty("关联员工ID") + private Integer staffId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java b/fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java new file mode 100644 index 0000000..4b20ef1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java @@ -0,0 +1,74 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 后台登录账号信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class AccountInfo implements Serializable { + + @ApiModelProperty("账户主键id") + private Integer id; + + @ApiModelProperty("账户编码") + private String accountKey; + + @ApiModelProperty("账户名称") + private String accountName; + + @ApiModelProperty("状态 : 0 无效 1 有效") + private int accountStatus; + + @ApiModelProperty("激活状态 : 0 未激活 1已激活") + private String isActive; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createDate; + + @ApiModelProperty("修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date modifyDate; + + @ApiModelProperty("随机码(公盐)") + private String salt; + + @ApiModelProperty("所属角色ID") + private String roleIds; + + @ApiModelProperty("是否被锁定") + private int locked; + + @ApiModelProperty("从属对象") + private int ownerId; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属商户名称") + private String merchantName; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("所属店铺名称") + private String storeName; + + @ApiModelProperty("关联员工ID") + private Integer staffId; + + @ApiModelProperty("登录的Token") + private String token; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java b/fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java new file mode 100644 index 0000000..619fa73 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java @@ -0,0 +1,54 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 会员地址信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class AddressDto implements Serializable { + + @ApiModelProperty("账户主键ID") + private Integer id; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("会员名称") + private String name; + + @ApiModelProperty("会员手机号") + private String mobile; + + @ApiModelProperty("省份ID") + private Integer provinceId; + + @ApiModelProperty("省份名称") + private String provinceName; + + @ApiModelProperty("城市ID") + private Integer cityId; + + @ApiModelProperty("城市名称") + private String cityName; + + @ApiModelProperty("区ID") + private Integer regionId; + + @ApiModelProperty("区名称") + private String regionName; + + @ApiModelProperty("详细地址") + private String detail; + + @ApiModelProperty("是否默认地址") + private String isDefault; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java new file mode 100644 index 0000000..bdc3fc9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java @@ -0,0 +1,60 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 文章实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ArticleDto implements Serializable { + + @ApiModelProperty("账户主键ID") + private Integer id; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("简介") + private String brief; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺") + private Integer storeId; + + @ApiModelProperty("链接地址") + private String url; + + @ApiModelProperty("点击数") + private Long click; + + @ApiModelProperty("图片地址") + private String image; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态 A:正常;D:删除") + private String status; + + @ApiModelProperty("排序") + private Integer sort; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java b/fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java new file mode 100644 index 0000000..b907345 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java @@ -0,0 +1,23 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 个人资产实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class AssetDto { + + @ApiModelProperty("次卡数量") + private Integer timer; + + @ApiModelProperty("储值卡数量") + private Integer prestore; + + @ApiModelProperty("优惠券数量") + private Integer coupon; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java b/fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java new file mode 100644 index 0000000..deb8da8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java @@ -0,0 +1,53 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 余额变动实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BalanceDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("会员信息") + private MtUser userInfo; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("余额变化数量") + private BigDecimal amount; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java b/fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java new file mode 100644 index 0000000..870cec3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java @@ -0,0 +1,57 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 焦点图实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BannerDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("链接地址") + private String url; + + @ApiModelProperty("图片地址") + private String image; + + @ApiModelProperty("描述信息") + private String description; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("状态,A正常;D删除") + private String status; +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/Body.java b/fuint-application/src/main/java/com/fuint/common/dto/Body.java new file mode 100644 index 0000000..53ccac9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/Body.java @@ -0,0 +1,31 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Map; + +/** + * 消息体Body信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class Body implements Serializable { + + @ApiModelProperty("入参信息") + private Map inParams; + + @ApiModelProperty("出参信息") + private Map outParams; + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Body{"); + sb.append("inParams=").append(inParams); + sb.append(", outParams=").append(outParams); + sb.append('}'); + return sb.toString(); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/BookCateDto.java b/fuint-application/src/main/java/com/fuint/common/dto/BookCateDto.java new file mode 100644 index 0000000..7ca18a6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/BookCateDto.java @@ -0,0 +1,51 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 预约分类实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookCateDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("分类名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("图片地址") + private String logo; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/BookDto.java b/fuint-application/src/main/java/com/fuint/common/dto/BookDto.java new file mode 100644 index 0000000..35c29e5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/BookDto.java @@ -0,0 +1,83 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 预约实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("预约名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("预约类型") + private String type; + + @ApiModelProperty("图片地址") + private String logo; + + @ApiModelProperty("关联商品ID") + private Integer goodsId; + + @ApiModelProperty("类别ID") + private Integer cateId; + + @ApiModelProperty("可预约日期") + private String serviceDates; + + @ApiModelProperty("可预约日期,字符串") + private String dates = ""; + + @ApiModelProperty("可预约日期列表") + private List dateList; + + @ApiModelProperty("可预约时间段") + private String serviceTimes; + + @ApiModelProperty("可预约时间段列表") + private List timeList; + + @ApiModelProperty("可预约可预约时段") + private List times; + + @ApiModelProperty("可预约员工ID") + private String serviceStaffIds; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/BookItemDto.java b/fuint-application/src/main/java/com/fuint/common/dto/BookItemDto.java new file mode 100644 index 0000000..516a62d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/BookItemDto.java @@ -0,0 +1,87 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; + +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 预约订单Dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookItemDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("所属店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("预约分类ID") + private Integer cateId; + + @ApiModelProperty("预约项目ID") + private Integer bookId; + + @ApiModelProperty("预约项目名称") + private String bookName; + + @ApiModelProperty("预约用户ID") + private Integer userId; + + @ApiModelProperty("订单商品ID") + private Integer goodsId; + + @ApiModelProperty("已购商品名称") + private String goodsName; + + @ApiModelProperty("核销码") + private String verifyCode; + + @ApiModelProperty("预约联系人") + private String contact; + + @ApiModelProperty("预约手机号") + private String mobile; + + @ApiModelProperty("预约日期") + private String serviceDate; + + @ApiModelProperty("预约时间段") + private String serviceTime; + + @ApiModelProperty("预约备注") + private String remark; + + @ApiModelProperty("预约员工ID") + private Integer serviceStaffId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("A:已提交;B:审核通过;C:审核未通过;D:删除;E:已完成") + private String status; + + @ApiModelProperty("状态") + private String statusName; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/BookTimeDto.java b/fuint-application/src/main/java/com/fuint/common/dto/BookTimeDto.java new file mode 100644 index 0000000..ce9ea27 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/BookTimeDto.java @@ -0,0 +1,25 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预约时段Dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookTimeDto implements Serializable { + + @ApiModelProperty("时间段") + private String startTime; + + @ApiModelProperty("时间段") + private String endTime; + + @ApiModelProperty("可预订数量") + private String num; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java new file mode 100644 index 0000000..84a9ea1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java @@ -0,0 +1,67 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtStaff; +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 分销提成提现实体 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionCashDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("结算单号") + private String settleNo; + + @ApiModelProperty("结算uuid") + private String uuid; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("所属店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("用户信息") + private OrderUserDto userInfo; + + @ApiModelProperty("员工ID") + private Integer staffId; + + @ApiModelProperty("所属店铺信息") + private MtStaff staffInfo; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java new file mode 100644 index 0000000..47974af --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java @@ -0,0 +1,96 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtCommissionRule; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtStaff; +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 分销提成记录实体 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionLogDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("分佣类型") + private String type; + + @ApiModelProperty("分佣对象") + private String target; + + @ApiModelProperty("分佣类型名称") + private String typeName; + + @ApiModelProperty("分佣等级") + private Integer level; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("用户信息") + private OrderUserDto userInfo; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("所属店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("员工ID") + private Integer staffId; + + @ApiModelProperty("所属店铺信息") + private MtStaff staffInfo; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("订单信息") + private MtOrder orderInfo; + + @ApiModelProperty("分佣金额") + private BigDecimal amount; + + @ApiModelProperty("规则ID") + private Integer ruleId; + + @ApiModelProperty("分佣规则信息") + private MtCommissionRule ruleInfo; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("提现记录ID") + private Integer cashId; + + @ApiModelProperty("最后操作人") + private String isCash; + + @ApiModelProperty("提现时间") + private Date cashTime; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CommissionRelationDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CommissionRelationDto.java new file mode 100644 index 0000000..421b432 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CommissionRelationDto.java @@ -0,0 +1,57 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销提成邀请记录实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRelationDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("会员信息") + private MtUser userInfo; + + @ApiModelProperty("邀请码") + private String inviteCode; + + @ApiModelProperty("被邀请会员ID") + private Integer subUserId; + + @ApiModelProperty("会员信息") + private MtUser subUserInfo; + + @ApiModelProperty("等级") + private Integer level; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java new file mode 100644 index 0000000..169cc42 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java @@ -0,0 +1,64 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 分销提成规则实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRuleDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("规则名称") + private String name; + + @ApiModelProperty("方案类型,goods:商品销售;coupon:卡券销售;recharge:会员充值") + private String type; + + @ApiModelProperty("分佣对象,member:会员分销;staff:员工提成") + private String target; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("适用店铺ID列表") + private List storeIdList; + + @ApiModelProperty("具体项目列表") + private List detailList; + + @ApiModelProperty("散客值") + private BigDecimal visitorVal; + + @ApiModelProperty("会员值") + private BigDecimal memberVal; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java new file mode 100644 index 0000000..7301938 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java @@ -0,0 +1,40 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 分销提成规则项目实体 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRuleItemDto implements Serializable { + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("商品名称") + private String goodsName; + + @ApiModelProperty("商品logo") + private String logo; + + @ApiModelProperty("商品价格") + private BigDecimal price; + + @ApiModelProperty("方案类型,goods:商品销售;coupon:卡券销售;recharge:会员充值") + private String type; + + @ApiModelProperty("提成方式") + private String method; + + @ApiModelProperty("散客值") + private BigDecimal visitorVal; + + @ApiModelProperty("会员值") + private BigDecimal memberVal; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java new file mode 100644 index 0000000..df6e69d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java @@ -0,0 +1,65 @@ +package com.fuint.common.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fuint.repository.model.MtCoupon; +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 核销卡券流水dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ConfirmLogDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("核销编码") + private String code; + + @ApiModelProperty("核销状态") + private String status; + + @ApiModelProperty("会员卡券ID") + private Integer userCouponId; + + @ApiModelProperty("卡券信息") + private MtCoupon couponInfo; + + @ApiModelProperty("会员信息") + private MtUser userInfo; + + @ApiModelProperty("核销店铺信息") + private MtStore storeInfo; + + @JSONField(format="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("创建时间") + private Date createTime; + + @JSONField(format="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("核销金额") + private BigDecimal amount; + + @ApiModelProperty("核销uuid") + private String uuid; + + @ApiModelProperty("核销备注") + private String remark; + + @ApiModelProperty("最后操作人") + private String operator; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java new file mode 100644 index 0000000..d73192c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java @@ -0,0 +1,28 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.util.List; + +/** + * 卡券导入单元实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CouponCellDto { + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("分组ID") + private List groupId; + + @ApiModelProperty("发放数量") + private List num; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java b/fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java new file mode 100644 index 0000000..50d3317 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java @@ -0,0 +1,80 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 卡券实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CouponDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("卡券名称") + private String name; + + @ApiModelProperty("卡券类型") + private String type; + + @ApiModelProperty("内容") + private Integer content; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("获取规则") + private String inRule; + + @ApiModelProperty("使用规则") + private String outRule; + + @ApiModelProperty("图片") + private String image; + + @ApiModelProperty("面额") + private BigDecimal amount; + + @ApiModelProperty("领取需要积分数量") + private Integer point; + + @ApiModelProperty("卖点") + private String sellingPoint; + + @ApiModelProperty("已领取、预存数量") + private Integer gotNum; + + @ApiModelProperty("剩余数量") + private Integer leftNum; + + @ApiModelProperty("发行数量") + private Integer total; + + @ApiModelProperty("限制数量") + private Integer limitNum; + + @ApiModelProperty("适用店铺") + private String storeNames; + + @ApiModelProperty("是否领取") + private Boolean isReceive; + + @ApiModelProperty("是否需要领取码") + private boolean needReceiveCode; + + @ApiModelProperty("会员卡券ID") + private int userCouponId; + + @ApiModelProperty("有效期") + private String effectiveDate; + + @ApiModelProperty("卡券说明") + private String description; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/DateDto.java b/fuint-application/src/main/java/com/fuint/common/dto/DateDto.java new file mode 100644 index 0000000..a4ddadd --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/DateDto.java @@ -0,0 +1,20 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 日期实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class DateDto { + + @ApiModelProperty("开始时间") + private String startDate; + + @ApiModelProperty("结束时间") + private String endDate; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/DayDto.java b/fuint-application/src/main/java/com/fuint/common/dto/DayDto.java new file mode 100644 index 0000000..97dc4e3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/DayDto.java @@ -0,0 +1,24 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 日期Dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class DayDto implements Serializable { + + @ApiModelProperty("星期") + private String week; + + @ApiModelProperty("日期") + private String date; + + @ApiModelProperty("是否可预订") + private Boolean enable; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java new file mode 100644 index 0000000..0ab0d0f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java @@ -0,0 +1,27 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单物流信息dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ExpressDto { + + @ApiModelProperty("物流公司名称") + private String expressCompany; + + @ApiModelProperty("物流公司编码") + private String expressCode; + + @ApiModelProperty("物流单号") + private String expressNo; + + @ApiModelProperty("发货时间") + private String expressTime; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java new file mode 100644 index 0000000..645e25c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java @@ -0,0 +1,76 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 卡券转赠实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GiveDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("获赠者会员ID") + private Integer userId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("赠送者会员ID") + private Integer giveUserId; + + @ApiModelProperty("获赠者手机号") + private String mobile; + + @ApiModelProperty("转赠者手机号") + private String userMobile; + + @ApiModelProperty("分组ID,逗号隔开") + private String groupIds; + + @ApiModelProperty("分组名称,逗号隔开") + private String groupNames; + + @ApiModelProperty("图片") + private String image; + + @ApiModelProperty("券ID,逗号隔开") + private String couponIds; + + @ApiModelProperty("券名称,逗号隔开") + private String couponNames; + + @ApiModelProperty("数量") + private Integer num; + + @ApiModelProperty("总金额") + private BigDecimal money; + + @ApiModelProperty("备注") + private String note; + + @ApiModelProperty("留言") + private String message; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("赠送时间") + private String createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private String updateTime; + + @ApiModelProperty("状态,A正常;C取消 ") + private String status; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java new file mode 100644 index 0000000..f1aec6e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java @@ -0,0 +1,47 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 转赠明细实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GiveItemDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("赠予对象手机号") + private String mobile; + + @ApiModelProperty("用户手机") + private String userMobile; + + @ApiModelProperty("分组ID") + private Integer groupId; + + @ApiModelProperty("分组名称") + private String groupName; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("卡券名称") + private String couponName; + + @ApiModelProperty("总金额") + private BigDecimal money; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("赠送时间") + private Date createTime; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java new file mode 100644 index 0000000..82d46ef --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java @@ -0,0 +1,59 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品分类DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsCateDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属商户名称") + private String merchantName; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("所属店铺名称") + private String storeName; + + @ApiModelProperty("分类名称") + private String name; + + @ApiModelProperty("LOGO地址") + private String logo; + + @ApiModelProperty("分类描述") + private String description; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java new file mode 100644 index 0000000..4c9da6e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java @@ -0,0 +1,92 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 商品详情实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsDetailDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer goodsId; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("商品条码") + private String goodsNo; + + @ApiModelProperty("可否单规格") + private String isSingleSpec; + + @ApiModelProperty("主图地址") + private String logo; + + @ApiModelProperty("图片地址") + private List images; + + @ApiModelProperty("商品价格") + private BigDecimal price; + + @ApiModelProperty("划线价格") + private BigDecimal linePrice; + + @ApiModelProperty("库存") + private Double stock; + + @ApiModelProperty("商品重量") + private BigDecimal weight; + + @ApiModelProperty("初始销量") + private Double initSale; + + @ApiModelProperty("商品卖点") + private String salePoint; + + @ApiModelProperty("可否使用积分抵扣") + private String canUsePoint; + + @ApiModelProperty("会员是否有折扣") + private String isMemberDiscount; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("商品描述") + private String description; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A:正常;D:删除") + private String status; + + @ApiModelProperty("sku列表") + private List skuList; + + @ApiModelProperty("规格列表") + private List specList; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java new file mode 100644 index 0000000..d5f1895 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java @@ -0,0 +1,132 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fuint.repository.model.MtGoodsCate; +import com.fuint.repository.model.MtGoodsSku; +import com.fuint.repository.model.MtGoodsSpec; +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 商品DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("分配店铺ID集合") + private String storeIds; + + @ApiModelProperty("所属店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品类型") + private String type; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("预约项目ID") + private Integer bookId; + + @ApiModelProperty("分类信息") + private MtGoodsCate cateInfo; + + @ApiModelProperty("商品条码") + private String goodsNo; + + @ApiModelProperty("可用平台,0:不限,1:仅会员端(小程序和h5);2:仅收银端") + private Integer platform; + + @ApiModelProperty("可否单规格") + private String isSingleSpec; + + @ApiModelProperty("主图地址") + private String logo; + + @ApiModelProperty("图片地址") + private String images; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("划线价格") + private BigDecimal linePrice; + + @ApiModelProperty("成本价格") + private BigDecimal costPrice; + + @ApiModelProperty("库存") + private Double stock; + + @ApiModelProperty("数量") + private Double num; + + @ApiModelProperty("服务时长") + private Integer serviceTime; + + @ApiModelProperty("卡券ID") + private String couponIds; + + @ApiModelProperty("重量") + private BigDecimal weight; + + @ApiModelProperty("初始销量") + private Double initSale; + + @ApiModelProperty("商品卖点") + private String salePoint; + + @ApiModelProperty("可否使用积分抵扣") + private String canUsePoint; + + @ApiModelProperty("会员是否有折扣") + private String isMemberDiscount; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("商品描述") + private String description; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A:正常;D:删除") + private String status; + + @ApiModelProperty("skuId") + private Integer skuId; + + @ApiModelProperty("sku列表") + private List skuList; + + @ApiModelProperty("规格列表") + private List specList; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java new file mode 100644 index 0000000..6801de7 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java @@ -0,0 +1,53 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtGoodsSpec; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.math.BigDecimal; + +/** + * 商品sku实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsSkuDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("sku编码") + private String skuNo; + + @ApiModelProperty("图片") + private String logo; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("规格ID") + private String specIds; + + @ApiModelProperty("规格列表") + private List specList; + + @ApiModelProperty("库存") + private Double stock; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("划线价格") + private BigDecimal linePrice; + + @ApiModelProperty("成本价格") + private BigDecimal costPrice; + + @ApiModelProperty("重量") + private BigDecimal weight; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java new file mode 100644 index 0000000..2f9a95f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java @@ -0,0 +1,27 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 商品规格子类实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsSpecChildDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("规格名称") + private String name; + + @ApiModelProperty("是否选择") + private boolean checked; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java new file mode 100644 index 0000000..635d1be --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java @@ -0,0 +1,28 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 商品规格实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsSpecDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer specId; + + @ApiModelProperty("规格名称") + private String name; + + @ApiModelProperty("规格值列表") + private List valueList; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java new file mode 100644 index 0000000..f206a67 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java @@ -0,0 +1,28 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 商品规格项实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsSpecItemDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("规格名称") + private String name; + + @ApiModelProperty("规格子类") + private List child; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java new file mode 100644 index 0000000..b5d87e8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java @@ -0,0 +1,27 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 商品规格值实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsSpecValueDto implements Serializable { + + @ApiModelProperty("值ID") + private Integer specValueId; + + @ApiModelProperty("规格名") + private String specName; + + @ApiModelProperty("规格值") + private String specValue; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java new file mode 100644 index 0000000..4d00a86 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java @@ -0,0 +1,34 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品排行DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsTopDto implements Serializable { + + @ApiModelProperty("商品ID") + private Integer id; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品条码") + private String goodsNo; + + @ApiModelProperty("销售金额") + private BigDecimal amount; + + @ApiModelProperty("销售数量") + private Integer num; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java new file mode 100644 index 0000000..8c05bc8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java @@ -0,0 +1,31 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 卡券分组数据DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GroupDataDto implements Serializable { + + @ApiModelProperty("发放数量") + private Integer sendNum; + + @ApiModelProperty("未发放数量") + private Integer unSendNum; + + @ApiModelProperty("使用数量") + private Integer useNum; + + @ApiModelProperty("过期数量") + private Integer expireNum; + + @ApiModelProperty("取消数量") + private Integer cancelNum; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java new file mode 100644 index 0000000..c3d51cf --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java @@ -0,0 +1,21 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 卡券分组数据DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GroupDataListDto { + + @ApiModelProperty("键值") + private String key; + + @ApiModelProperty("数据") + private GroupDataDto data; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java b/fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java new file mode 100644 index 0000000..689df05 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java @@ -0,0 +1,28 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 分组会员DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GroupMemberDto implements Serializable { + + @ApiModelProperty("会员ID") + private Integer id; + + @ApiModelProperty("会员名称") + private String name; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("会员名称") + private String mobile; +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java b/fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java new file mode 100644 index 0000000..0efe0af --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java @@ -0,0 +1,36 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 收银挂单实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class HangUpDto { + + @ApiModelProperty("挂单号") + private String hangNo; + + @ApiModelProperty("是否空白") + private Boolean isEmpty; + + @ApiModelProperty("会员信息") + private MtUser memberInfo; + + @ApiModelProperty("件数") + private Double num; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("时间") + private String dateTime; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/Head.java b/fuint-application/src/main/java/com/fuint/common/dto/Head.java new file mode 100644 index 0000000..993c5b4 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/Head.java @@ -0,0 +1,38 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 消息体头信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class Head implements Serializable { + + @ApiModelProperty("服务编号,用于确定唯一的服务") + private String serviceId; + + @ApiModelProperty("授权Token信息") + private String token; + + @ApiModelProperty("服务执行返回码(000000:正常)") + private String returnCode; + + @ApiModelProperty("服务执行返回信息") + private String returnDesc; + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Head{"); + sb.append("serviceId='").append(serviceId).append('\''); + sb.append(", token='").append(token).append('\''); + sb.append(", returnCode='").append(returnCode).append('\''); + sb.append(", returnDesc='").append(returnDesc).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java b/fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java new file mode 100644 index 0000000..c7c62f6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java @@ -0,0 +1,48 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员分组实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MemberGroupDto implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("分组ID") + private Integer id; + + @ApiModelProperty("分组名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("默认店铺") + private Integer storeId; + + @ApiModelProperty("父ID") + private Integer parentId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:激活;N:禁用;D:删除") + private String status; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java b/fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java new file mode 100644 index 0000000..4df817e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java @@ -0,0 +1,34 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 会员排行DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MemberTopDto implements Serializable { + + @ApiModelProperty("会员ID") + private Integer id; + + @ApiModelProperty("会员名称") + private String name; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("消费金额") + private BigDecimal amount; + + @ApiModelProperty("购买数量") + private Integer num; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/MerchantDto.java b/fuint-application/src/main/java/com/fuint/common/dto/MerchantDto.java new file mode 100644 index 0000000..a974dca --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/MerchantDto.java @@ -0,0 +1,68 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商户实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MerchantDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("微信小程序appId") + private String wxAppId; + + @ApiModelProperty("微信小程序秘钥") + private String wxAppSecret; + + @ApiModelProperty("微信公众号appId") + private String wxOfficialAppId; + + @ApiModelProperty("微信公众号秘钥") + private String wxOfficialAppSecret; + + @ApiModelProperty("商户号") + private String no; + + @ApiModelProperty("商户名称") + private String name; + + @ApiModelProperty("商户logo") + private String logo; + + @ApiModelProperty("联系人姓名") + private String contact; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("联系地址") + private String address; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:有效/启用;D:无效") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/MerchantSettingDto.java b/fuint-application/src/main/java/com/fuint/common/dto/MerchantSettingDto.java new file mode 100644 index 0000000..7a12f1e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/MerchantSettingDto.java @@ -0,0 +1,34 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商户设置实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MerchantSettingDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商户名称") + private String name; + + @ApiModelProperty("商户logo") + private String logo; + + @ApiModelProperty("联系人姓名") + private String contact; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("营业状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java b/fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java new file mode 100644 index 0000000..d709c11 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java @@ -0,0 +1,24 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 短信发送返回实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MessageResDto { + + @ApiModelProperty("发送ID") + private String[] sendIds; + + @ApiModelProperty("发送结果") + private Boolean result; + + @ApiModelProperty("短信ID") + private String[] smsId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java b/fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java new file mode 100644 index 0000000..66ed7e8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java @@ -0,0 +1,77 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 我的卡券DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MyCouponDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("卡券名称") + private String name; + + @ApiModelProperty("核销编码") + private String code; + + @ApiModelProperty("卡券类型") + private String type; + + @ApiModelProperty("卡券内容") + private Integer content; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("使用规则") + private String useRule; + + @ApiModelProperty("图片") + private String image; + + @ApiModelProperty("面额") + private BigDecimal amount; + + @ApiModelProperty("余额") + private BigDecimal balance; + + @ApiModelProperty("剩余次数") + private Integer num; + + @ApiModelProperty("是否可用") + private boolean canUse; + + @ApiModelProperty("有效期") + private String effectiveDate; + + @ApiModelProperty("提示信息") + private String tips; + + @ApiModelProperty("使用时间") + private Date usedTime; + + @ApiModelProperty("领券时间") + private Date createTime; + + @ApiModelProperty("会员信息") + private MtUser userInfo; + + @ApiModelProperty("使用店铺") + private MtStore storeInfo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/NavigationDto.java b/fuint-application/src/main/java/com/fuint/common/dto/NavigationDto.java new file mode 100644 index 0000000..88402e6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/NavigationDto.java @@ -0,0 +1,37 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 导航栏实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class NavigationDto implements Serializable { + + @ApiModelProperty("导航名称") + private String name; + + @ApiModelProperty("导航提示") + private String tips; + + @ApiModelProperty("URL") + private String url; + + @ApiModelProperty("图标") + private String icon; + + @ApiModelProperty("图标完整路径") + private String iconUrl; + + @ApiModelProperty("导航排序") + private Integer sort; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java b/fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java new file mode 100644 index 0000000..53adf47 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java @@ -0,0 +1,51 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtCoupon; +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtUserGrade; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 开卡赠礼实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OpenGiftDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("会员等级信息") + private MtUserGrade gradeInfo; + + @ApiModelProperty("赠送积分") + private Integer point; + + @ApiModelProperty("卡券信息") + private MtCoupon couponInfo; + + @ApiModelProperty("卡券数量") + private Integer couponNum; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java b/fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java new file mode 100644 index 0000000..0a810ea --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java @@ -0,0 +1,33 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 开通微信会员卡实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OpenWxCardDto { + + @ApiModelProperty("会员编码") + private String code; + + @ApiModelProperty("会员openId") + private String openId; + + @ApiModelProperty("时间戳") + private String timestamp; + + @ApiModelProperty("随机字符串") + private String nonceStr; + + @ApiModelProperty("签名") + private String signature; + + @ApiModelProperty("微信会员卡ID") + private String cardId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java b/fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java new file mode 100644 index 0000000..e6ec9de --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java @@ -0,0 +1,127 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OrderDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("订单类型") + private String type; + + @ApiModelProperty("下单平台") + private String platform; + + @ApiModelProperty("支付类型") + private String payType; + + @ApiModelProperty("订单类型名称") + private String orderMode; + + @ApiModelProperty("核销码") + private String verifyCode; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("购物车ID") + private String cartIds; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("skuID") + private Integer skuId; + + @ApiModelProperty("购买数量") + private Double buyNum; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("是否游客") + private String isVisitor; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("员工ID") + private Integer staffId; + + @ApiModelProperty("订单金额") + private BigDecimal amount; + + @ApiModelProperty("支付金额") + private BigDecimal payAmount; + + @ApiModelProperty("使用积分数量") + private Integer usePoint; + + @ApiModelProperty("积分金额") + private BigDecimal pointAmount; + + @ApiModelProperty("折扣金额") + private BigDecimal discount; + + @ApiModelProperty("配送费用") + private BigDecimal deliveryFee; + + @ApiModelProperty("物流信息") + private ExpressDto expressInfo; + + @ApiModelProperty("订单参数") + private String param; + + @ApiModelProperty("用户备注") + private String remark; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("支付时间") + private Date payTime; + + @ApiModelProperty("订单状态") + private String status; + + @ApiModelProperty("支付状态") + private String payStatus; + + @ApiModelProperty(value="结算状态") + private String settleStatus; + + @ApiModelProperty("核销状态") + private String confirmStatus; + + @ApiModelProperty("核销时间") + private Date confirmTime; + + @ApiModelProperty("核销备注") + private String confirmRemark; + + @ApiModelProperty("最后操作人") + private String operator; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java b/fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java new file mode 100644 index 0000000..8174122 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java @@ -0,0 +1,55 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 订单商品实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OrderGoodsDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("预约项目ID") + private Integer bookId; + + @ApiModelProperty("我的预约ID") + private Integer myBookId; + + @ApiModelProperty("订单类型") + private String type; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("价格") + private String price; + + @ApiModelProperty("折扣") + private String discount; + + @ApiModelProperty("购买数量") + private Double num; + + @ApiModelProperty("图片") + private String image; + + @ApiModelProperty("skuId") + private Integer skuId; + + @ApiModelProperty("规格列表") + private List specList; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java b/fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java new file mode 100644 index 0000000..54549ae --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java @@ -0,0 +1,40 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 下单用户DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OrderUserDto implements Serializable { + + @ApiModelProperty("会员ID") + private Integer id; + + @ApiModelProperty("会员号") + private String no; + + @ApiModelProperty("会员姓名") + private String name; + + @ApiModelProperty("会员手机") + private String mobile; + + @ApiModelProperty("证件类型") + private String cardType; + + @ApiModelProperty("证件号") + private String cardNo; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("openId") + private String openId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/Page.java b/fuint-application/src/main/java/com/fuint/common/dto/Page.java new file mode 100644 index 0000000..a39bfe9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/Page.java @@ -0,0 +1,120 @@ +package com.fuint.common.dto; + +import java.io.Serializable; + +/** + * 消息体分页信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Page implements Serializable { + + private static final Long DEFAULT_PAGE_NO = 1L; + private static final Long DEFAULT_PAGE_SIZE = 100L; + + private Long pageNo;// 页号 + private Long pageSize;// 每页行数 + private Long totalRows;// 总行数 + private Long totalPages;// 总页数 + private Boolean firstPage;// 是否首页 + private Boolean lastPage;// 是否尾页 + + public Page() { + } + + public Page(Long pageNo, Long pageSize) { + setPageNo(pageNo); + setPageSize(pageSize); + } + + public Long getPageNo() { + return pageNo; + } + + public void setPageNo(Long pageNo) { + if (pageNo == null || pageNo < 1) { + pageNo = DEFAULT_PAGE_NO; + } else if (totalPages != null && pageNo > totalPages) { + pageNo = totalPages; + } + this.pageNo = pageNo; + } + + public Long getPageSize() { + return pageSize; + } + + public void setPageSize(Long pageSize) { + if (pageSize == null) { + this.pageSize = DEFAULT_PAGE_SIZE; + } else if (pageSize < 1L) { + this.pageSize = 1L; + } else { + this.pageSize = pageSize; + } + } + + public Long getTotalRows() { + return totalRows; + } + + public void setTotalRows(Long totalRows) { + //总行数 + this.totalRows = totalRows; + //总页数 + this.totalPages = totalRows / this.pageSize; + if (totalRows % this.pageSize > 0) { + this.totalPages++; + } + //首页 + if (this.pageNo <= 1) { + firstPage = true; + } else { + firstPage = false; + } + //尾页 + if (this.pageNo >= this.totalPages) { + lastPage = true; + } else { + lastPage = false; + } + } + + public Long getTotalPages() { + return totalPages; + } + + public void setTotalPages(Long totalPages) { + this.totalPages = totalPages; + } + + public Boolean isFirstPage() { + return firstPage; + } + + public void setFirstPage(Boolean firstPage) { + this.firstPage = firstPage; + } + + public Boolean isLastPage() { + return lastPage; + } + + public void setLastPage(Boolean lastPage) { + this.lastPage = lastPage; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Page{"); + sb.append("pageNo=").append(pageNo); + sb.append(", pageSize=").append(pageSize); + sb.append(", totalRows=").append(totalRows); + sb.append(", totalPages=").append(totalPages); + sb.append(", firstPage=").append(firstPage); + sb.append(", lastPage=").append(lastPage); + sb.append('}'); + return sb.toString(); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java new file mode 100644 index 0000000..cf98365 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java @@ -0,0 +1,30 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 请求参数实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ParamDto implements Serializable { + + @ApiModelProperty("参数键值") + private String key; + + @ApiModelProperty("参数名称") + private String name; + + @ApiModelProperty("参数值") + private String value; + + public ParamDto(String key, String name, String value) { + this.key = key; + this.name = name; + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/PointDto.java b/fuint-application/src/main/java/com/fuint/common/dto/PointDto.java new file mode 100644 index 0000000..ecfe9ff --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/PointDto.java @@ -0,0 +1,50 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 积分记录实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class PointDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("会员信息") + private MtUser userInfo; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("积分变化数量") + private Integer amount; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java b/fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java new file mode 100644 index 0000000..30da373 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java @@ -0,0 +1,22 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预存规则实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class PreStoreRuleDto implements Serializable { + + @ApiModelProperty("预存金额") + private String preStoreAmount; + + @ApiModelProperty("目标金额") + private String targetAmount; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java new file mode 100644 index 0000000..921211d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java @@ -0,0 +1,26 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 充值规则实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RechargeRuleDto implements Serializable { + + @ApiModelProperty("充值金额") + private String rechargeAmount; + + @ApiModelProperty("赠送金额") + private String giveAmount; + + @ApiModelProperty("赠送卡券ID") + private String giveCouponIds; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java new file mode 100644 index 0000000..432f08b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java @@ -0,0 +1,83 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 售后实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RefundDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("退款金额") + private BigDecimal amount; + + @ApiModelProperty("售后类型") + private String type; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("用户备注") + private String remark; + + @ApiModelProperty("物流公司名称") + private String expressName; + + @ApiModelProperty("物流单号") + private String expressNo; + + @ApiModelProperty("拒绝原因") + private String rejectReason; + + @ApiModelProperty("申请凭证图片") + private List imageList; + + @ApiModelProperty("申请凭证图片") + private String images; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("订单详情") + private UserOrderDto orderInfo; + + @ApiModelProperty("退货地址") + private AddressDto address; + + @ApiModelProperty("店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("状态说明") + private String statusText; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java new file mode 100644 index 0000000..f673068 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java @@ -0,0 +1,39 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 地区实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RegionDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("父ID") + private Integer pid; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("层级") + private String level; + + @ApiModelProperty("城市") + private List city; + + @ApiModelProperty("区域") + private List region; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java new file mode 100644 index 0000000..ec32bc4 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java @@ -0,0 +1,120 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 卡券请求DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ReqCouponDto implements Serializable { + + @ApiModelProperty("卡券ID") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("分组ID") + private Integer groupId; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("内容") + private Integer content; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("是否允许转赠") + private Integer isGive; + + @ApiModelProperty("获得卡券所消耗积分") + private Integer point; + + @ApiModelProperty("获得计次卡卡所消耗积分") + private Integer timerPoint; + + @ApiModelProperty("领取码") + private String receiveCode; + + @ApiModelProperty("使用专项") + private String useFor; + + @ApiModelProperty("过期类型") + private String expireType; + + @ApiModelProperty("有效天数") + private Integer expireTime; + + @ApiModelProperty("计次卡领取码") + private String timerReceiveCode; + + @ApiModelProperty("有效期开始时间") + private String beginTime; + + @ApiModelProperty("有效期结束时间") + private String endTime; + + @ApiModelProperty("价值金额") + private BigDecimal amount; + + @ApiModelProperty("发放方式") + private String sendWay; + + @ApiModelProperty("适用商品") + private String applyGoods; + + @ApiModelProperty("每次发放数量") + private Integer sendNum; + + @ApiModelProperty("发行总数量") + private Integer total; + + @ApiModelProperty("每人最多拥有数量") + private Integer limitNum; + + @ApiModelProperty("例外时间") + private String exceptTime; + + @ApiModelProperty("适用店铺ID,逗号分隔") + private String storeIds; + + @ApiModelProperty("会员等级ID,逗号分隔") + private String gradeIds; + + @ApiModelProperty("适用商品") + private String goodsIds; + + @ApiModelProperty("后台备注") + private String remarks; + + @ApiModelProperty("图片") + private String image; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("预存规则") + private String inRule; + + @ApiModelProperty("核销规则") + private String outRule; + + @ApiModelProperty("操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java new file mode 100644 index 0000000..bb53f8c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java @@ -0,0 +1,44 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 卡券分组请求DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ReqCouponGroupDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("分组名称") + private String name; + + @ApiModelProperty("价值金额") + private BigDecimal money; + + @ApiModelProperty("发行数量") + private Integer total; + + @ApiModelProperty("分组描述") + private String description; + + @ApiModelProperty("操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java b/fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java new file mode 100644 index 0000000..32897ee --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java @@ -0,0 +1,29 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Map; + +/** + * 请求返回结果 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ReqResult implements Serializable { + + @ApiModelProperty("返回代码") + private String code; + + @ApiModelProperty("返回消息") + private String msg; + + @ApiModelProperty("返回结果") + private boolean result; + + @ApiModelProperty("返回数据") + private Map data; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java new file mode 100644 index 0000000..dee070e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java @@ -0,0 +1,66 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 发放卡券记录请求DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ReqSendLogDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("类型,1:单用户发券;2:批量发券") + private Integer type; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("导入文件名") + private String fileName; + + @ApiModelProperty("导入文件路径") + private String filePath; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("分组ID") + private Integer groupId; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("分组名称") + private String groupName; + + @ApiModelProperty("发放数量") + private Integer sendNum; + + @ApiModelProperty("发放时间") + private Date createTime; + + @ApiModelProperty("操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("uuid") + private String uuid; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java new file mode 100644 index 0000000..fae34d4 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java @@ -0,0 +1,43 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtGoods; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 购物车返回DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ResCartDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("skuId") + private Integer skuId; + + @ApiModelProperty("数量") + private Double num; + + @ApiModelProperty("是否有效") + private Boolean isEffect; + + @ApiModelProperty("商品规格") + private List specList; + + @ApiModelProperty("商品数据") + private MtGoods goodsInfo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java b/fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java new file mode 100644 index 0000000..208c3f6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java @@ -0,0 +1,33 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtGoods; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +/** + * 商品分类返回DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ResCateDto implements Serializable { + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("分类名称") + private String name; + + @ApiModelProperty("logo") + private String logo; + + @ApiModelProperty("商品列表") + private List goodsList; + + @ApiModelProperty("排序") + private Integer sort; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java new file mode 100644 index 0000000..f5de8c7 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java @@ -0,0 +1,33 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 角色信息实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RoleDto { + + @ApiModelProperty("账户主键ID") + private Long id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("角色类型") + private String type; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("状态 : A有效 D无效") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java b/fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java new file mode 100644 index 0000000..0e95083 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java @@ -0,0 +1,58 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import com.fuint.framework.pagination.PaginationResponse; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 结算实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SettlementDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("结算单号") + private String settlementNo; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("订单总金额") + private BigDecimal totalOrderAmount; + + @ApiModelProperty("结算金额") + private BigDecimal amount; + + @ApiModelProperty("结算订单") + private PaginationResponse orderList; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("支付状态,A待支付;B已支付") + private String payStatus; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java b/fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java new file mode 100644 index 0000000..d4ef307 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java @@ -0,0 +1,44 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 结算订单表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SettlementOrderDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("结算ID") + private Integer settlementId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("订单信息") + private UserOrderDto orderInfo; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java b/fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java new file mode 100644 index 0000000..a6b91ae --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java @@ -0,0 +1,45 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 短信模板实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SmsTemplateDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("模板名称") + private String name; + + @ApiModelProperty("模板英文名称") + private String uname; + + @ApiModelProperty("模板编码") + private String code; + + @ApiModelProperty("模板内容") + private String content; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,1:正常;2:删除") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java b/fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java new file mode 100644 index 0000000..6c89942 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java @@ -0,0 +1,71 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +/** + * 菜单信息实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SourceDto implements Serializable { + + @ApiModelProperty("自增ID") + private long id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("菜单名称") + private String name; + + @ApiModelProperty("菜单名称(字母)") + private String ename; + + @ApiModelProperty("节点是否打开") + private Boolean open; + + @ApiModelProperty("是否菜单") + private int isMenu; + + @ApiModelProperty("节点是否选中") + private Boolean checked; + + @ApiModelProperty("url") + private String url; + + @ApiModelProperty("路径") + private String path; + + @ApiModelProperty("权限标识") + private String perms; + + @ApiModelProperty("菜单级别") + private int level; + + @ApiModelProperty("上级菜单") + private long parentId; + + @ApiModelProperty("子菜单") + private List children; + + @ApiModelProperty("图标") + private String icon; + + @ApiModelProperty("新图标") + private String newIcon; + + @ApiModelProperty("描述信息") + private String description; + + @ApiModelProperty("排序") + private String sort; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/StaffDto.java b/fuint-application/src/main/java/com/fuint/common/dto/StaffDto.java new file mode 100644 index 0000000..ae29969 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/StaffDto.java @@ -0,0 +1,64 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtMerchant; +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 员工实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + * */ +@Data +public class StaffDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("员工类别") + private Integer category; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("微信号") + private String wechat; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("审核状态,A:审核通过;U:未审核;D:无效; ") + private String auditedStatus; + + @ApiModelProperty("审核时间") + private Date auditedTime; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("商户信息") + private MtMerchant merchantInfo; + + @ApiModelProperty("店铺信息") + private MtStore storeInfo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/StockGoodsDto.java b/fuint-application/src/main/java/com/fuint/common/dto/StockGoodsDto.java new file mode 100644 index 0000000..0e1ac9e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/StockGoodsDto.java @@ -0,0 +1,46 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 库存商品实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + * */ +@Data +public class StockGoodsDto implements Serializable { + + @ApiModelProperty("商品ID") + private Integer id; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品编码") + private String goodsNo; + + @ApiModelProperty("商品分类ID") + private Integer cateId; + + @ApiModelProperty("商品数量") + private Double num; + + @ApiModelProperty("库存") + private Double stock; + + @ApiModelProperty("skuId") + private Integer skuId; + + @ApiModelProperty("商品logo") + private String logo; + + @ApiModelProperty("状态,A:正常;D:删除") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java b/fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java new file mode 100644 index 0000000..14d7d7c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java @@ -0,0 +1,46 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 店铺实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + * */ +@Data +public class StoreDto extends StoreInfo implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("微信商户号") + private String wxMchId; + + @ApiModelProperty("微信支付秘钥") + private String wxApiV2; + + @ApiModelProperty("微信支付证书") + private String wxCertPath; + + @ApiModelProperty("支付宝appId") + private String alipayAppId; + + @ApiModelProperty("支付宝应用私钥") + private String alipayPrivateKey; + + @ApiModelProperty("支付宝支付公钥") + private String alipayPublicKey; + + @ApiModelProperty("银行名称") + private String bankName; + + @ApiModelProperty("银行卡账户名") + private String bankCardName; + + @ApiModelProperty("银行卡卡号") + private String bankCardNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/StoreInfo.java b/fuint-application/src/main/java/com/fuint/common/dto/StoreInfo.java new file mode 100644 index 0000000..9f132ec --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/StoreInfo.java @@ -0,0 +1,87 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 店铺信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + * */ +@Data +public class StoreInfo implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("商户号") + private String merchantNo; + + @ApiModelProperty("商户名称") + private String merchantName; + + @ApiModelProperty("店铺名称") + private String name; + + @ApiModelProperty("是否单店铺") + private String single; + + @ApiModelProperty("店铺二维码") + private String qrCode; + + @ApiModelProperty("店铺LOGO") + private String logo; + + @ApiModelProperty("是否默认店铺") + private String isDefault; + + @ApiModelProperty("联系人") + private String contact; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("店铺地址") + private String address; + + @ApiModelProperty("营业时间") + private String hours; + + @ApiModelProperty("经度") + private String latitude; + + @ApiModelProperty("纬度") + private String longitude; + + @ApiModelProperty("距离") + private BigDecimal distance; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("营业执照") + private String license; + + @ApiModelProperty("统一社会信用代码") + private String creditCode; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,1:正常;2:删除") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java b/fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java new file mode 100644 index 0000000..b78a273 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java @@ -0,0 +1,38 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 小程序订阅消息dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SubMessageDto implements Serializable { + + @ApiModelProperty("键值") + private String key; + + @ApiModelProperty("模板ID") + private String templateId; + + @ApiModelProperty("TID") + private String tid; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("模板参数") + private List params; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/TimeDto.java b/fuint-application/src/main/java/com/fuint/common/dto/TimeDto.java new file mode 100644 index 0000000..dc7179b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/TimeDto.java @@ -0,0 +1,21 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 时间Dto + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class TimeDto implements Serializable { + + @ApiModelProperty("时间段") + private String time; + + @ApiModelProperty("是否可预订") + private Boolean enable; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java b/fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java new file mode 100644 index 0000000..0e12490 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java @@ -0,0 +1,28 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 登录Token实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class TokenDto implements Serializable { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("创建时间") + private Long tokenCreatedTime; + + @ApiModelProperty("失效时间") + private Long tokenExpiryTime; + + @ApiModelProperty("是否登录") + private String isLogin; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java b/fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java new file mode 100644 index 0000000..e3ae5f4 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java @@ -0,0 +1,80 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtConfirmLog; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 我的卡券实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class UserCouponDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("卡券名称") + private String name; + + @ApiModelProperty("卡券类型") + private String type; + + @ApiModelProperty("卡券内容") + private Integer content; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("使用规则") + private String useRule; + + @ApiModelProperty("核销编码") + private String code; + + @ApiModelProperty("二维码") + private String qrCode; + + @ApiModelProperty("图片") + private String image; + + @ApiModelProperty("面额") + private BigDecimal amount; + + @ApiModelProperty("是否允许转赠") + private Boolean isGive; + + @ApiModelProperty("余额") + private BigDecimal balance; + + @ApiModelProperty("核销次数") + private Integer confirmCount; + + @ApiModelProperty("核销记录") + private List confirmLogs; + + @ApiModelProperty("是否可用(过期、状态等)") + private boolean canUse; + + @ApiModelProperty("有效期") + private String effectiveDate; + + @ApiModelProperty("适用店铺") + private String storeNames; + + @ApiModelProperty("提示信息") + private String tips; + + @ApiModelProperty("描述信息") + private String description; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/UserDto.java b/fuint-application/src/main/java/com/fuint/common/dto/UserDto.java new file mode 100644 index 0000000..0a54eef --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/UserDto.java @@ -0,0 +1,112 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员个人信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class UserDto implements Serializable { + + @ApiModelProperty("会员ID") + private Integer id; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("头像") + private String avatar; + + @ApiModelProperty("称呼") + private String name; + + @ApiModelProperty("是否设置密码") + private String hasPassword; + + @ApiModelProperty("分组ID") + private Integer groupId; + + @ApiModelProperty("分组信息") + private UserGroupDto groupInfo; + + @ApiModelProperty("微信open_id") + private String openId; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("证件号码") + private String idcard; + + @ApiModelProperty("等级ID") + private Integer gradeId; + + @ApiModelProperty("等级名称") + private String gradeName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("会员开始时间") + private Date startTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("会员结束时间") + private Date endTime; + + @ApiModelProperty("余额") + private BigDecimal balance; + + @ApiModelProperty("积分") + private Integer point; + + @ApiModelProperty("性别 1男;0女") + private Integer sex; + + @ApiModelProperty("出生日期") + private String birthday; + + @ApiModelProperty("车牌号") + private String carNo; + + @ApiModelProperty("来源渠道") + private String source; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("默认店铺ID") + private Integer storeId; + + @ApiModelProperty("默认店铺名称") + private String storeName; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最近登录时间") + private String lastLoginTime; + + @ApiModelProperty("状态,A:激活;N:禁用;D:删除") + private String status; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("注册IP") + private String ip; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java b/fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java new file mode 100644 index 0000000..d5eb40a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java @@ -0,0 +1,54 @@ +package com.fuint.common.dto; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员分组 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class UserGroupDto implements Serializable { + + @ApiModelProperty("分组ID") + private Integer id; + + @ApiModelProperty("分组名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("默认店铺") + private Integer storeId; + + @ApiModelProperty("父ID") + private Integer parentId; + + @ApiModelProperty("子分组") + private List children; + + @ApiModelProperty("会员数量") + private Long memberNum; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:激活;N:禁用;D:删除") + private String status; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java b/fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java new file mode 100644 index 0000000..d02bab6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java @@ -0,0 +1,25 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 会员登录信息实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class UserInfo implements Serializable { + + @ApiModelProperty("会员ID") + private Integer id; + + @ApiModelProperty("会员手机号") + private String mobile; + + @ApiModelProperty("登录Token") + private String token; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java b/fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java new file mode 100644 index 0000000..e9f997d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java @@ -0,0 +1,149 @@ +package com.fuint.common.dto; + +import com.fuint.repository.model.MtRefund; +import com.fuint.repository.model.MtStaff; +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 会员订单实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class UserOrderDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("订单类型") + private String type; + + @ApiModelProperty("订单类型名称") + private String typeName; + + @ApiModelProperty("支付类型") + private String payType; + + @ApiModelProperty("订单模式") + private String orderMode; + + @ApiModelProperty("下单平台") + private String platform; + + @ApiModelProperty("是否核销") + private Boolean isVerify; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("是否游客") + private String isVisitor; + + @ApiModelProperty("核销码") + private String verifyCode; + + @ApiModelProperty("员工ID") + private Integer staffId; + + @ApiModelProperty("总金额") + private BigDecimal amount; + + @ApiModelProperty("支付金额") + private BigDecimal payAmount; + + @ApiModelProperty("优惠金额") + private BigDecimal discount; + + @ApiModelProperty("配送费用") + private BigDecimal deliveryFee; + + @ApiModelProperty("使用积分") + private Integer usePoint; + + @ApiModelProperty("积分金额") + private BigDecimal pointAmount; + + @ApiModelProperty("订单参数") + private String param; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + @ApiModelProperty("支付时间") + private String payTime; + + @ApiModelProperty("订单状态") + private String status; + + @ApiModelProperty("支付状态") + private String payStatus; + + @ApiModelProperty(value="结算状态") + private String settleStatus; + + @ApiModelProperty("状态说明") + private String statusText; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("订单商品列表") + private List goods; + + @ApiModelProperty("下单用户信息") + private OrderUserDto userInfo; + + @ApiModelProperty("配送地址") + private AddressDto address; + + @ApiModelProperty("物流信息") + private ExpressDto expressInfo; + + @ApiModelProperty("所属店铺信息") + private MtStore storeInfo; + + @ApiModelProperty("售后订单") + private MtRefund refundInfo; + + @ApiModelProperty("使用卡券") + private UserCouponDto couponInfo; + + @ApiModelProperty("所属员工") + private MtStaff staffInfo; + + @ApiModelProperty("核销状态") + private String confirmStatus; + + @ApiModelProperty("核销时间") + private String confirmTime; + + @ApiModelProperty("核销备注") + private String confirmRemark; + +} + diff --git a/fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java b/fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java new file mode 100644 index 0000000..45c67ad --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java @@ -0,0 +1,75 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 微信会员卡实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class WxCardDto { + + @ApiModelProperty("会员卡类型") + private String cardType; + + @ApiModelProperty("会员卡背景图") + private String backgroundUrl; + + @ApiModelProperty("商户logo") + private String logoUrl; + + @ApiModelProperty("商户名称") + private String brandName; + + @ApiModelProperty("Code展示类型") + private String codeType; + + @ApiModelProperty("卡券名,字数上限为9个汉字") + private String title; + + @ApiModelProperty("会员卡颜色") + private String color; + + @ApiModelProperty("卡券使用提醒,字数上限为16个汉字") + private String notice; + + @ApiModelProperty("卡券使用说明,字数上限为1024个汉字") + private String description; + + @ApiModelProperty("客服电话") + private String servicePhone; + + @ApiModelProperty("跳转外链的入口名字") + private String customUrlName; + + @ApiModelProperty("跳转外链的URL") + private String customUrl; + + @ApiModelProperty("显示在入口右侧的提示语") + private String customUrlSubTitle; + + @ApiModelProperty("卡券领取页面是否可分享") + private Boolean canShare; + + @ApiModelProperty("会员卡特权说明,限制1024汉字") + private String prerogative; + + @ApiModelProperty("显示积分") + private Boolean supplyBonus; + + @ApiModelProperty("跳转外链查看积分详情") + private String bonusUrl; + + @ApiModelProperty("积分规则") + private String bonusRules; + + @ApiModelProperty("是否支持储值") + private Boolean supplyBalance; + + @ApiModelProperty("跳转外链查看余额详情") + private String balanceUrl; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java new file mode 100644 index 0000000..c463bf6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java @@ -0,0 +1,77 @@ +package com.fuint.common.enums; + +/** + * 后台角色枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum AdminRoleEnum { + ADMIN("1", "超级管理员","admin"), + COMMON("2", "普通管理员","common"), + USER("3", "用户角色","user"); + + private String key; + private String name; + private String value; + + AdminRoleEnum(String key, String name, String value) { + this.key = key; + this.name = name; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (AdminRoleEnum c : AdminRoleEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过key获取name + public static String getName(String k) { + for (AdminRoleEnum c : AdminRoleEnum.values()) { + if (c.getKey().equals(k)) { + return c.getName(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (AdminRoleEnum c : AdminRoleEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java new file mode 100644 index 0000000..9edd2ba --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java @@ -0,0 +1,57 @@ +package com.fuint.common.enums; + +/** + * 卡券适用商品 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum ApplyGoodsEnum { + ALL_GOODS("allGoods", "全场通用"), + PARK_GOODS("parkGoods", "指定商品"); + + private String key; + + private String value; + + ApplyGoodsEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (ApplyGoodsEnum c : ApplyGoodsEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (ApplyGoodsEnum c : ApplyGoodsEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java new file mode 100644 index 0000000..4211928 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java @@ -0,0 +1,57 @@ +package com.fuint.common.enums; + +/** + * 充值配置项枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum BalanceSettingEnum { + RECHARGE_RULE("rechargeRule", "充值规则"), + RECHARGE_REMARK("rechargeRemark", "充值说明"); + + private String key; + + private String value; + + BalanceSettingEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (BalanceSettingEnum c : BalanceSettingEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (BalanceSettingEnum c : BalanceSettingEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java new file mode 100644 index 0000000..ece3420 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/BookStatusEnum.java @@ -0,0 +1,71 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 预约订单状态枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum BookStatusEnum { + CREATED("A", "待确认"), + CONFIRM("B", "确认通过"), + FAIL("F", "预约失败"), + CANCEL("C", "已取消"), + DELETE("D", "已删除"), + COMPLETE("E", "已完成"); + + private String key; + + private String value; + + BookStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 根据key获取value + * + * @param key + * @return + */ + public static String getValue(String key) { + final BookStatusEnum[] values = BookStatusEnum.values(); + for (BookStatusEnum value : values) { + if (key.equals(value.getKey())) { + return value.getValue(); + } + } + return null; + } + + public static List getBookStatusList(String... excludedKeys) { + List excludedKeySet = Arrays.asList(excludedKeys); + return Arrays.stream(BookStatusEnum.values()) + .filter(status -> !excludedKeySet.contains(status.getKey())) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java new file mode 100644 index 0000000..cc430e3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java @@ -0,0 +1,51 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分佣结算状态 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CommissionCashStatusEnum { + WAIT("A", "待确认"), + SETTLED("B", "已确认"), + CANCEL("C", "已作废"), + PAYED("D", "已打款"); + + private String key; + + private String value; + + CommissionCashStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getCommissionCashStatusList() { + return Arrays.stream(CommissionCashStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java new file mode 100644 index 0000000..e3fa85c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java @@ -0,0 +1,50 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分佣状态 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CommissionStatusEnum { + NORMAL("A", "待结算"), + SETTLED("B", "已结算"), + CANCEL("C", "已作废"); + + private String key; + + private String value; + + CommissionStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getCommissionStatusList() { + return Arrays.stream(CommissionStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java new file mode 100644 index 0000000..a48bfc3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java @@ -0,0 +1,49 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分佣对象枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CommissionTargetEnum { + MEMBER("member", "会员分销"), + STAFF("staff", "员工提成"); + + private String key; + + private String value; + + CommissionTargetEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getCommissionTargetList() { + return Arrays.stream(CommissionTargetEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java new file mode 100644 index 0000000..41591ed --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java @@ -0,0 +1,66 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分佣提成类型 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CommissionTypeEnum { + GOODS("goods", "商品订单"), + PAYMENT("payment", "付款订单"), + RECHARGE("recharge", "充值订单"); + + private String key; + + private String value; + + CommissionTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 根据key获取value + * + * @param key + * @return + */ + public static String getName(String key) { + final CommissionTypeEnum[] values = CommissionTypeEnum.values(); + for (CommissionTypeEnum value : values) { + if (key.equals(value.getKey())) { + return value.getValue(); + } + } + return null; + } + + public static List getCommissionTypeList() { + return Arrays.stream(CommissionTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java new file mode 100644 index 0000000..836f594 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java @@ -0,0 +1,37 @@ +package com.fuint.common.enums; + +/** + * 卡券内容枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CouponContentEnum { + AMOUNT(1, "满减券"), + PERCENT(2, "折扣券"); + + private Integer key; + + private String value; + + CouponContentEnum(Integer key, String value) { + this.key = key; + this.value = value; + } + + public Integer getKey() { + return key; + } + + public void setKey(Integer key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java new file mode 100644 index 0000000..df2e4e6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java @@ -0,0 +1,37 @@ +package com.fuint.common.enums; + +/** + * 卡券过期类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CouponExpireTypeEnum { + FIX("fix", "固定期限"), + FLEX("flex", "领取后生效"); + + private String key; + + private String value; + + CouponExpireTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java new file mode 100644 index 0000000..a9c7961 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java @@ -0,0 +1,50 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 卡券类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CouponTypeEnum { + COUPON("C", "优惠券"), + PRESTORE("P", "储值卡"), + TIMER("T", "计次卡"); + + private String key; + + private String value; + + CouponTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getCouponTypeList() { + return Arrays.stream(CouponTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java new file mode 100644 index 0000000..692c39a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java @@ -0,0 +1,69 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 卡券使用专项枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum CouponUseForEnum { + MEMBER_GRADE("memberGrade", "升级会员等级专用"), + OFF_LINE_PAYMENT("offLinePayment", "到店收银买单专用"); + + private String key; + + private String value; + + CouponUseForEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (CouponUseForEnum c : CouponUseForEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (CouponUseForEnum c : CouponUseForEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } + + public static List getCouponUseForList() { + return Arrays.stream(CouponUseForEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/ExpressCompanyEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/ExpressCompanyEnum.java new file mode 100644 index 0000000..13fb16b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/ExpressCompanyEnum.java @@ -0,0 +1,60 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 物流公司枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum ExpressCompanyEnum { + + SELF("SELF", "商家自送"), + YTO("YTO", "圆通速递"), + ZTO("ZTO", "中通快递"), + BEST("BEST", "百世快递"), + YUNDA("YUNDA", "韵达快递"), + SF("SF", "顺丰速运"), + EMS("EMS", "中国邮政"), + DB("DB", "德邦快递"), + STO("STO", "申通快递"), + JDL("JDL", "京东快递"), + HHTT("HHTT", "天天快递"), + JTSD("JTSD", "极兔快递"); + + private String key; + + private String value; + + ExpressCompanyEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getExpressCompanyList() { + return Arrays.stream(ExpressCompanyEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java new file mode 100644 index 0000000..c72fd7c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java @@ -0,0 +1,39 @@ +package com.fuint.common.enums; + +/** + * 性别枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum GenderEnum { + + FEMALE(0, "女"), + MAN(1, "男"), + UNKNOWN(2, "未知"); + + private Integer key; + + private String value; + + GenderEnum(Integer key, String value) { + this.key = key; + this.value = value; + } + + public Integer getKey() { + return key; + } + + public void setKey(Integer key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java new file mode 100644 index 0000000..8abe49d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java @@ -0,0 +1,70 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品类型 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum GoodsTypeEnum { + GOODS("goods", "实物商品"), + SERVICE("service", "服务项目"), + COUPON("coupon", "虚拟卡券"); + + private String key; + + private String value; + + GoodsTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (GoodsTypeEnum c : GoodsTypeEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (GoodsTypeEnum c : GoodsTypeEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } + + public static List getGoodsTypeList() { + return Arrays.stream(GoodsTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/InvoiceStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/InvoiceStatusEnum.java new file mode 100644 index 0000000..36dca1a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/InvoiceStatusEnum.java @@ -0,0 +1,69 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 开票状态枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum InvoiceStatusEnum { + + CREATED("A", "开票中"), + SUCCESS("B", "开票成功"), + CANCEL("C", "已冲红"); + + private String key; + + private String value; + + InvoiceStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 根据key获取value + * + * @param key + * @return + */ + public static String getValue(String key) { + final InvoiceStatusEnum[] values = InvoiceStatusEnum.values(); + for (InvoiceStatusEnum value : values) { + if (key.equals(value.getKey())) { + return value.getValue(); + } + } + return null; + } + + public static List getInvoiceStatusList(String... excludedKeys) { + List excludedKeySet = Arrays.asList(excludedKeys); + return Arrays.stream(InvoiceStatusEnum.values()) + .filter(status -> !excludedKeySet.contains(status.getKey())) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java new file mode 100644 index 0000000..9d4888f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java @@ -0,0 +1,59 @@ +package com.fuint.common.enums; + +/** + * 会员来源渠道 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum MemberSourceEnum { + BACKEND_ADD("backend_add", "后台添加"), + REGISTER_BY_ACCOUNT("register_by_account", "H5注册"), + MOBILE_LOGIN("mobile_login", "手机号登录注册"), + WECHAT_LOGIN("wechat_login", "微信小程序"); + + private String key; + + private String value; + + MemberSourceEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (MemberSourceEnum c : MemberSourceEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (MemberSourceEnum c : MemberSourceEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java new file mode 100644 index 0000000..03ec08f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java @@ -0,0 +1,51 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商户类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum MerchantTypeEnum { + RESTAURANT("restaurant", "餐饮:餐厅、奶茶、酒店等"), + RETAIL("retail", "零售:超市、生鲜、卖场等"), + SERVICE("service", "服务:美容、足浴、汽车4s店等"), + OTHER("other", "其他"); + + private String key; + + private String value; + + MerchantTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getMerchantTypeList() { + return Arrays.stream(MerchantTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java new file mode 100644 index 0000000..55454f5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java @@ -0,0 +1,35 @@ +package com.fuint.common.enums; + +/** + * 会员消息类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum MessageEnum { + POP_MSG("pop", "弹框消息"), + SUB_MSG("sub", "订阅消息"), + SMS_MSG("sms", "短信消息"); + + private String key; + private String value; + + MessageEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java new file mode 100644 index 0000000..d74292b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java @@ -0,0 +1,49 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单模式 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum OrderModeEnum { + EXPRESS("express", "配送"), + ONESELF("oneself", "自取"); + + private String key; + + private String value; + + OrderModeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getOrderModeList() { + return Arrays.stream(OrderModeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java new file mode 100644 index 0000000..70da813 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java @@ -0,0 +1,61 @@ +package com.fuint.common.enums; + +/** + * 交易配置项枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum OrderSettingEnum { + DELIVERY_FEE("deliveryFee", "订单配送费用"), + DELIVERY_MIN_AMOUNT("deliveryMinAmount", "订单起送金额"), + IS_CLOSE("isClose", "关闭交易功能"), + MP_UPLOAD_SHIPPING("mpUploadShipping", "微信小程序上传发货信息"), + PAY_OFF_LINE("payOffLine", "开启前台支付功能"), + DELIVERY_RANGE("deliveryRange", "配送范围"); + + private String key; + + private String value; + + OrderSettingEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (OrderSettingEnum c : OrderSettingEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (OrderSettingEnum c : OrderSettingEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java new file mode 100644 index 0000000..1bd89eb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java @@ -0,0 +1,66 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单状态枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum OrderStatusEnum { + + CREATED("A", "待支付"), + PAID("B", "已支付"), + CANCEL("C", "已取消"), + DELIVERY("D", "待发货"), + DELIVERED("E", "已发货"), + RECEIVED("F", "已收货"), + DELETED("G", "已删除"), + REFUND("H", "已退款"), + COMPLETE("I", "已完成"); + + private String key; + + private String value; + + OrderStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static String getValue(String k) { + for (OrderStatusEnum c : OrderStatusEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + public static List getOrderStatusList() { + return Arrays.stream(OrderStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java new file mode 100644 index 0000000..45b658c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java @@ -0,0 +1,69 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单类型 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum OrderTypeEnum { + + GOODS("goods", "商品订单"), + PAYMENT("payment", "付款订单"), + RECHARGE("recharge", "充值订单"), + PRESTORE("prestore", "储值卡订单"), + MEMBER("member", "会员升级订单"); + + private String key; + + private String value; + + OrderTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 根据key获取value + * + * @param key + * @return + */ + public static String getValue(String key) { + final OrderTypeEnum[] values = OrderTypeEnum.values(); + for (OrderTypeEnum value : values) { + if (key.equals(value.getKey())) { + return value.getValue(); + } + } + return null; + } + + public static List getOrderTypeList() { + return Arrays.stream(OrderTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getKey())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java new file mode 100644 index 0000000..32a0ab4 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java @@ -0,0 +1,49 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 支付状态 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum PayStatusEnum { + WAIT("A", "待支付"), + SUCCESS("B", "已支付"); + + private String key; + + private String value; + + PayStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getPayStatusList() { + return Arrays.stream(PayStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java new file mode 100644 index 0000000..d9778b5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java @@ -0,0 +1,55 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 支付类型 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum PayTypeEnum { + + CASH("CASH", "现金支付"), + JSAPI("JSAPI", "微信支付"), + MICROPAY("MICROPAY", "微信扫码支付"), + BALANCE("BALANCE", "余额支付"), + ALISCAN("ALISCAN", "支付宝扫码"), + STORE("STORE", "门店支付"), + UNIONPAY("UNIONPAY", "云闪付支付"); + + private String key; + + private String value; + + PayTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getPayTypeList() { + return Arrays.stream(PayTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java new file mode 100644 index 0000000..ff40516 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java @@ -0,0 +1,66 @@ +package com.fuint.common.enums; + +/** + * 平台类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum PlatformTypeEnum { + + /** + * 微信小程序 + */ + MP_WEIXIN("MP-WEIXIN", "微信小程序", 1), + + /** + * PC + */ + PC("PC", "PC端", 2), + + /** + * H5 + */ + H5("H5", "H5端", 3), + + /** + * App客户端 + */ + APP("APP", "App客户端", 4); + + private String code; + + private String value; + + private Integer num; + + PlatformTypeEnum(String code, String value, Integer num) { + this.code = code; + this.value = value; + this.num = num; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer code) { + this.num = num; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java new file mode 100644 index 0000000..0404dcd --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java @@ -0,0 +1,59 @@ +package com.fuint.common.enums; + +/** + * 积分配置项枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum PointSettingEnum { + POINT_NEED_CONSUME("pointNeedConsume", "返1积分所需消费金额"), + CAN_USE_AS_MONEY("canUsedAsMoney", "是否可当作现金使用"), + EXCHANGE_NEED_POINT("exchangeNeedPoint", "多少积分可抵扣1元现金"), + RECHARGE_POINT_SPEED("rechargePointSpeed", "充值返积分倍数"); + + private String key; + + private String value; + + PointSettingEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (PointSettingEnum c : PointSettingEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (PointSettingEnum c : PointSettingEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/PrinterSettingEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/PrinterSettingEnum.java new file mode 100644 index 0000000..b5020f2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/PrinterSettingEnum.java @@ -0,0 +1,59 @@ +package com.fuint.common.enums; + +/** + * 云打印设置 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum PrinterSettingEnum { + + USER_NAME("userName", "用户名"), + USER_KEY("userKey", "开发者密钥"), + ENABLE("enable", "是否启用"); + + private String key; + + private String value; + + PrinterSettingEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (PrinterSettingEnum c : PrinterSettingEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (PrinterSettingEnum c : PrinterSettingEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java new file mode 100644 index 0000000..e254d43 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java @@ -0,0 +1,76 @@ +package com.fuint.common.enums; + +/** + * 二维码枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum QrCodeEnum { + TABLE("table", "桌码二维码", "pages/category/index"), + STORE("store", "店铺二维码", "pages/index/index"), + COUPON("coupon", "卡券二维码", "subPages/coupon/detail"); + + private String key; + + private String value; + + private String page; + + QrCodeEnum(String key, String value, String page) { + this.key = key; + this.value = value; + this.page = page; + } + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + + public String getPage() { + return page; + } + public void setPage(String page) { + this.page = page; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (QrCodeEnum c : QrCodeEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (QrCodeEnum c : QrCodeEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } + + // 普通方法,通过key获取page + public static String getPage(String k) { + for (QrCodeEnum c : QrCodeEnum.values()) { + if (c.getKey().equals(k)) { + return c.getPage(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java new file mode 100644 index 0000000..a6d2df3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java @@ -0,0 +1,53 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 售后订单状态枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum RefundStatusEnum { + + CREATED("A", "待审核"), + APPROVED("B", "已同意"), + REJECT("C", "已拒绝"), + CANCEL("D", "已取消"), + COMPLETE("E", "已完成"); + + private String key; + + private String value; + + RefundStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getRefundStatusList() { + return Arrays.stream(RefundStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java new file mode 100644 index 0000000..c24345f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java @@ -0,0 +1,50 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 售后类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum RefundTypeEnum { + + RETURN("return", "退货退款"), + EXCHANGE("exchange", "换货"); + + private String key; + + private String value; + + RefundTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getRefundTypeList() { + return Arrays.stream(RefundTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java new file mode 100644 index 0000000..f8173bc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java @@ -0,0 +1,58 @@ +package com.fuint.common.enums; + +/** + * 卡券发放方式 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum SendWayEnum { + BACKEND("backend", "后台发放"), + OFFLINE("offline", "线下发放"), + FRONT("front", "前台领取"); + + private String key; + + private String value; + + SendWayEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (SendWayEnum c : SendWayEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (SendWayEnum c : SendWayEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java new file mode 100644 index 0000000..aaba250 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java @@ -0,0 +1,64 @@ +package com.fuint.common.enums; + +/** + * 配置类型枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum SettingTypeEnum { + POINT("point", "积分配置"), + BALANCE("balance", "余额配置"), + USER("user", "会员配置"), + ORDER("order", "交易配置"), + SUB_MESSAGE("sub_message", "订阅消息"), + PRINTER("printer", "打印设置"), + SMS_CONFIG("sms_config", "短信配置"), + KUAIDI100("kuaidi100", "快递100配置"), + NAVIGATION("navigation", "导航配置"); + + private String key; + + private String value; + + SettingTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (SettingTypeEnum c : SettingTypeEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (SettingTypeEnum c : SettingTypeEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java new file mode 100644 index 0000000..2516358 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java @@ -0,0 +1,49 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单结算状态 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum SettleStatusEnum { + WAIT("A", "待确认"), + COMPLETE("B", "已完成"); + + private String key; + + private String value; + + SettleStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getSettleStatusList() { + return Arrays.stream(SettleStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/SmsSettingEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/SmsSettingEnum.java new file mode 100644 index 0000000..d6e23c0 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/SmsSettingEnum.java @@ -0,0 +1,59 @@ +package com.fuint.common.enums; + +/** + * 短信配置项枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum SmsSettingEnum { + IS_CLOSE("isClose", "是否关闭短信功能"), + ACCESS_KEY_ID("accessKeyId", "阿里云accessKeyId"), + ACCESS_KEY_SECRET("accessKeySecret", "阿里云accessKeySecret"), + SIGN_NAME("signName", "阿里云短信签名"); + + private String key; + + private String value; + + SmsSettingEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (UserSettingEnum c : UserSettingEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (UserSettingEnum c : UserSettingEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java new file mode 100644 index 0000000..06c374a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java @@ -0,0 +1,90 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 员工类别枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum StaffCategoryEnum { + MANAGER("1", "店长","admin"), + CASHIER("2", "收银人员","cashier"), + SALE("3", "销售人员","sale"), + SERVICE("4", "服务人员","service"); + + private String key; + private String name; + private String value; + + StaffCategoryEnum(String key, String name, String value) { + this.key = key; + this.name = name; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (StaffCategoryEnum c : StaffCategoryEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过key获取name + public static String getName(String k) { + for (StaffCategoryEnum c : StaffCategoryEnum.values()) { + if (c.getKey().equals(k)) { + return c.getName(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (StaffCategoryEnum c : StaffCategoryEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } + + public static List getStaffCategoryList() { + return Arrays.stream(StaffCategoryEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getName(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java new file mode 100644 index 0000000..b748d0e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java @@ -0,0 +1,55 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 通用状态枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum StatusEnum { + + ENABLED("A", "启用"), + EXPIRED("C", "过期"), + DISABLE("D", "删除"), + FORBIDDEN("N", "禁用"), + UnAudited("U", "待审核"); + + private String key; + + private String value; + + StatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getStatusList(String... excludedKeys) { + List excludedKeySet = Arrays.asList(excludedKeys); + return Arrays.stream(StatusEnum.values()) + .filter(status -> !excludedKeySet.contains(status.getKey())) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java new file mode 100644 index 0000000..0bfab25 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java @@ -0,0 +1,64 @@ +package com.fuint.common.enums; + +/** + * 会员行为枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum UserActionEnum { + REGISTER("register", "注册会员"), + LOGIN("login", "登录系统"), + VIEW_GOODS("viewGoods", "浏览商品"), + SUBMIT_ORDER("submitOrder", "提交订单"), + CANCEL_ORDER("cancelOrder", "取消订单"), + GET_COUPON("getCoupon", "领取卡券"), + USE_COUPON("useCoupon", "使用卡券"), + RECHARGE_BALANCE("rechargeBalance", "余额充值"), + USE_BALANCE("useBalance", "使用余额"); + + private String key; + + private String value; + + UserActionEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (UserActionEnum c : UserActionEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (UserActionEnum c : UserActionEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java new file mode 100644 index 0000000..d63c35b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java @@ -0,0 +1,72 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户卡券状态 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum UserCouponStatusEnum { + UNUSED("A", "未使用"), + USED("B", "已使用"), + EXPIRE("C", "已过期"), + DISABLE("D", "不可用"), + UNSEND("E", "待领取"); + + private String key; + + private String value; + + UserCouponStatusEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (UserCouponStatusEnum c : UserCouponStatusEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (UserCouponStatusEnum c : UserCouponStatusEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } + + public static List getUserCouponStatusList() { + return Arrays.stream(UserCouponStatusEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java new file mode 100644 index 0000000..67adfa8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java @@ -0,0 +1,51 @@ +package com.fuint.common.enums; + +import com.fuint.common.dto.ParamDto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 升级会员等级条件枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum UserGradeCatchTypeEnum { + INIT("init", "默认获取"), + PAY("pay", "付费升级"), + FREQUENCY("frequency", "累计消费次数升级"), + AMOUNT("amount", "累积消费金额升级"); + + private String key; + + private String value; + + UserGradeCatchTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static List getUserGradeCatchTypeList() { + return Arrays.stream(UserGradeCatchTypeEnum.values()) + .map(status -> new ParamDto(status.getKey(), status.getValue(), status.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java new file mode 100644 index 0000000..491f284 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java @@ -0,0 +1,61 @@ +package com.fuint.common.enums; + +/** + * 会员配置项枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum UserSettingEnum { + GET_COUPON_NEED_PHONE("getCouponNeedPhone", "领券是否需要手机号码"), + SUBMIT_ORDER_NEED_PHONE("submitOrderNeedPhone", "提交订单是否需要手机号码"), + LOGIN_NEED_PHONE("loginNeedPhone", "登录是否需要手机号"), + OPEN_WX_CARD("openWxCard", "开通微信会员卡"), + WX_MEMBER_CARD("wxMemberCard", "微信会员卡设置"), + WX_MEMBER_CARD_ID("wxMemberCardId", "微信会员卡ID"); + + private String key; + + private String value; + + UserSettingEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (UserSettingEnum c : UserSettingEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (UserSettingEnum c : UserSettingEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java new file mode 100644 index 0000000..b244f29 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java @@ -0,0 +1,62 @@ +package com.fuint.common.enums; + +/** + * 微信订阅消息枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum WxMessageEnum { + ORDER_CREATED("orderCreated", "订单生成提醒"), + DELIVER_GOODS("deliverGoods", "订单发货提醒"), + COUPON_EXPIRE("couponExpire", "卡券到期提醒"), + COUPON_ARRIVAL("couponArrival", "卡券到账提醒"), + BALANCE_CHANGE("balanceChange", "余额变动提醒"), + COUPON_CONFIRM("couponConfirm", "卡券核销提醒"), + POINT_CHANGE("pointChange", "积分变更提醒"); + + private String key; + + private String value; + + WxMessageEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + // 普通方法,通过key获取value + public static String getValue(String k) { + for (WxMessageEnum c : WxMessageEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } + + // 普通方法,通过Value获取key + public static String getKey(String v) { + for (WxMessageEnum c : WxMessageEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java new file mode 100644 index 0000000..4f4e86f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java @@ -0,0 +1,57 @@ +package com.fuint.common.enums; + +/** + * 是或否枚举 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum YesOrNoEnum { + YES("Y", "是"), + NO("N", "否"), + TRUE("true", "真"), + FALSE("false", "假"); + + private String key; + + private String value; + + YesOrNoEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static String getKey(String v) { + for (YesOrNoEnum c : YesOrNoEnum.values()) { + if (c.getValue().equals(v)) { + return c.getKey(); + } + } + return null; + } + + public static String getValue(String k) { + for (YesOrNoEnum c : YesOrNoEnum.values()) { + if (c.getKey().equals(k)) { + return c.getValue(); + } + } + return null; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java b/fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java new file mode 100644 index 0000000..d5cefe2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java @@ -0,0 +1,138 @@ +package com.fuint.common.http; + +import com.alibaba.fastjson.JSONObject; +import com.fuint.utils.StringUtil; +import okhttp3.*; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicHeader; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; + +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; + + +/** + * 调用REST接口并解析数据 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Component +public class HttpRESTDataClient { + + public static final Logger logger = LoggerFactory.getLogger(HttpRESTDataClient.class); + + private static final OkHttpClient client = new OkHttpClient(); + + private static final HttpClientBuilder httpClientBuilder; + + static { + httpClientBuilder = HttpClientBuilder.create(); + } + + public static String requestGet(String url) throws IOException { + Request request = new Request.Builder() + .url(url) + .build(); + Response response = client.newCall(request).execute(); + if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); + + return response.body().string(); + } + + public static byte[] requestPost(String url, String postData) throws IOException { + String postBody = postData; + MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/json"); + Request request = new Request.Builder() + .url(url) + .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody)) + .build(); + Response response = client.newCall(request).execute(); + if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); + + return response.body().bytes(); + } + + /** + * 请求 + * @param url + * @param jsonParam + * @return + */ + public static InputStream doWXPost(String url, JSONObject jsonParam) { + InputStream instreams = null; + HttpPost httpRequst = new HttpPost(url);// 创建HttpPost对象 + try { + StringEntity se = new StringEntity(jsonParam.toString(),"utf-8"); + se.setContentType("application/json"); + se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8")); + httpRequst.setEntity(se); + HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequst); + if (httpResponse.getStatusLine().getStatusCode() == 200) { + HttpEntity httpEntity = httpResponse.getEntity(); + if (httpEntity != null) { + instreams = httpEntity.getContent(); + } + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return instreams; + } + + public static String requestPost(String url, String contentType, String postData) throws IOException { + MediaType mediaType = null; + if (StringUtil.isNotEmpty(contentType)) { + mediaType = MediaType.parse(contentType); + } + Request request = new Request.Builder() + .url(url) + .post(RequestBody.create(mediaType, postData)) + .build(); + Response response = client.newCall(request).execute(); + if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); + + return response.body().string(); + } + + public static String requestPostBody(String url, String body) { + logger.debug("[HttpRESTDataClient] [requestPostBody] 入参 url={} body={}", url, body); + + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json"); + StringEntity entity = new StringEntity(body, "utf-8"); + entity.setContentEncoding("UTF-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + + try { + HttpClient client = httpClientBuilder.build(); + HttpResponse response = client.execute(httpPost); + if (response.getStatusLine() != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + return EntityUtils.toString(response.getEntity(), "utf-8"); + } + return ""; + } + catch (IOException ex) { + logger.error("[HttpRESTDataClient] [requestPostBody] 请求异常 ex={}", url, ex); + return ""; + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java b/fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java new file mode 100644 index 0000000..de3199a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java @@ -0,0 +1,18 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 收获地址详情请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class AddressDetailParam implements Serializable { + + @ApiModelProperty(value="收获地址ID", name="addressId") + private Integer addressId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java b/fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java new file mode 100644 index 0000000..8726b52 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java @@ -0,0 +1,18 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 文章详情请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ArticleDetailParam implements Serializable { + + @ApiModelProperty(value="文章ID", name="articleId") + private Integer articleId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java b/fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java new file mode 100644 index 0000000..5b586f5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java @@ -0,0 +1,21 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 文章列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ArticleListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="文章标题", name="title") + private String title; + + @ApiModelProperty(value="商户号", name="merchantNo") + private String merchantNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/ArticlePage.java b/fuint-application/src/main/java/com/fuint/common/param/ArticlePage.java new file mode 100644 index 0000000..236477e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/ArticlePage.java @@ -0,0 +1,31 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 文章分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ArticlePage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("商户编码") + private String merchantNo; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java b/fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java new file mode 100644 index 0000000..3c9c575 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java @@ -0,0 +1,18 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 余额明细列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BalanceListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="会员ID", name="userId") + private String userId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BalancePage.java b/fuint-application/src/main/java/com/fuint/common/param/BalancePage.java new file mode 100644 index 0000000..e1ee6d5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BalancePage.java @@ -0,0 +1,40 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 余额明细分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BalancePage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BannerPage.java b/fuint-application/src/main/java/com/fuint/common/param/BannerPage.java new file mode 100644 index 0000000..b3c63ee --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BannerPage.java @@ -0,0 +1,28 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 焦点图分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BannerPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BookCatePage.java b/fuint-application/src/main/java/com/fuint/common/param/BookCatePage.java new file mode 100644 index 0000000..76a3abc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BookCatePage.java @@ -0,0 +1,28 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预约分类分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookCatePage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BookDetailParam.java b/fuint-application/src/main/java/com/fuint/common/param/BookDetailParam.java new file mode 100644 index 0000000..04bfa4d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BookDetailParam.java @@ -0,0 +1,18 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预约详情请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookDetailParam implements Serializable { + + @ApiModelProperty(value="预约ID", name="bookId") + private Integer bookId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BookItemPage.java b/fuint-application/src/main/java/com/fuint/common/param/BookItemPage.java new file mode 100644 index 0000000..8864a08 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BookItemPage.java @@ -0,0 +1,37 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预约订单分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookItemPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("联系人") + private String contact; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BookListParam.java b/fuint-application/src/main/java/com/fuint/common/param/BookListParam.java new file mode 100644 index 0000000..a5a7ca1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BookListParam.java @@ -0,0 +1,24 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预约列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="名称", name="name") + private String name; + + @ApiModelProperty(value="分类ID", name="cateId") + private Integer cateId; + + @ApiModelProperty(value="商户号", name="merchantNo") + private String merchantNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BookPage.java b/fuint-application/src/main/java/com/fuint/common/param/BookPage.java new file mode 100644 index 0000000..0329686 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BookPage.java @@ -0,0 +1,31 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 预约分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/BookableParam.java b/fuint-application/src/main/java/com/fuint/common/param/BookableParam.java new file mode 100644 index 0000000..b91d3bc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/BookableParam.java @@ -0,0 +1,25 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 可否预约请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class BookableParam implements Serializable { + + @ApiModelProperty(value="预约ID", name="bookId") + private Integer bookId; + + @ApiModelProperty(value="预约日期", name="date") + private String date; + + @ApiModelProperty(value="预约时间", name="time") + private String time; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java b/fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java new file mode 100644 index 0000000..675f551 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java @@ -0,0 +1,25 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +/** + * 删除购物车请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CartClearParam extends PageParam implements Serializable { + + @ApiModelProperty(value="购物车ID", name="cartId") + private List cartId; + + @ApiModelProperty(value="挂单编码", name="hangNo") + private String hangNo; + + @ApiModelProperty(value="下单会员ID", name="userId") + private Integer userId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CartListParam.java b/fuint-application/src/main/java/com/fuint/common/param/CartListParam.java new file mode 100644 index 0000000..f52b935 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CartListParam.java @@ -0,0 +1,45 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 购物车列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CartListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="购物车ID", name="cartId") + private Integer cartId; + + @ApiModelProperty(value="指定购物车ID,逗号分割", name="cartIds") + private String cartIds; + + @ApiModelProperty(value="商品ID", name="goodsId") + private Integer goodsId; + + @ApiModelProperty(value="卡券ID", name="couponId") + private Integer couponId; + + @ApiModelProperty(value="商品SkuID", name="skuId") + private Integer skuId; + + @ApiModelProperty(value="使用积分", name="point") + private String point; + + @ApiModelProperty(value="购买数量", name="buyNum") + private Double buyNum; + + @ApiModelProperty(value="挂单编码", name="hangNo") + private String hangNo; + + @ApiModelProperty(value="下单会员ID", name="userId") + private Integer userId; + + @ApiModelProperty(value="订单模式", name="orderMode") + private String orderMode; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java b/fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java new file mode 100644 index 0000000..1065f63 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java @@ -0,0 +1,39 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 保存购物车请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CartSaveParam implements Serializable { + + @ApiModelProperty(value="购物车ID", name="cartId") + private Integer cartId; + + @ApiModelProperty(value="商品ID", name="goodsId") + private Integer goodsId; + + @ApiModelProperty(value="商品SkuID", name="skuId") + private Integer skuId; + + @ApiModelProperty(value="商品编码", name="skuNo") + private String skuNo; + + @ApiModelProperty(value="购买数量", name="buyNum") + private Double buyNum; + + @ApiModelProperty(value="操作类型,+:增加,-:减少", name="action") + private String action; + + @ApiModelProperty(value="挂单编码", name="hangNo") + private String hangNo; + + @ApiModelProperty(value="下单会员ID", name="userId") + private Integer userId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CommissionCashPage.java b/fuint-application/src/main/java/com/fuint/common/param/CommissionCashPage.java new file mode 100644 index 0000000..f448649 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CommissionCashPage.java @@ -0,0 +1,40 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 分销提成提现记录分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionCashPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("姓名") + private String realName; + + @ApiModelProperty("批次号") + private String uuid; + + @ApiModelProperty("开始时间") + private String startTime; + + @ApiModelProperty("结束时间") + private String endTime; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CommissionLogPage.java b/fuint-application/src/main/java/com/fuint/common/param/CommissionLogPage.java new file mode 100644 index 0000000..c6e85a8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CommissionLogPage.java @@ -0,0 +1,43 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 分销提成记录分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionLogPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("姓名") + private String realName; + + @ApiModelProperty("类型") + private String target; + + @ApiModelProperty("批次号") + private String uuid; + + @ApiModelProperty("开始时间") + private String startTime; + + @ApiModelProperty("结束时间") + private String endTime; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CommissionRelationPage.java b/fuint-application/src/main/java/com/fuint/common/param/CommissionRelationPage.java new file mode 100644 index 0000000..06a3914 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CommissionRelationPage.java @@ -0,0 +1,46 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 分销提成邀请记录分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRelationPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("商户号") + private String merchantNo; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("姓名") + private String realName; + + @ApiModelProperty("类型") + private String subUserId; + + @ApiModelProperty("开始时间") + private String startTime; + + @ApiModelProperty("结束时间") + private String endTime; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java b/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java new file mode 100644 index 0000000..82993d5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java @@ -0,0 +1,31 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 分销提成规则项目请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRuleItemParam implements Serializable { + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("商品名称") + private String goodsName; + + @ApiModelProperty("提成方式") + private String method; + + @ApiModelProperty("散客值") + private BigDecimal visitorVal; + + @ApiModelProperty("会员值") + private BigDecimal memberVal; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CommissionRulePage.java b/fuint-application/src/main/java/com/fuint/common/param/CommissionRulePage.java new file mode 100644 index 0000000..6c2c58a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CommissionRulePage.java @@ -0,0 +1,37 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 分销提成规则分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRulePage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("规则名称") + private String name; + + @ApiModelProperty("分佣对象") + private String target; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java b/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java new file mode 100644 index 0000000..cf28a5c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java @@ -0,0 +1,57 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 分销提成规则请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CommissionRuleParam implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("规则名称") + private String name; + + @ApiModelProperty("分佣类型,member:会员分销;staff:员工提成") + private String type; + + @ApiModelProperty("分佣对象") + private String target; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("适用店铺ID列表") + private List storeIdList; + + @ApiModelProperty("具体项目列表") + private List detailList; + + @ApiModelProperty("散客值") + private BigDecimal visitorVal; + + @ApiModelProperty("会员值") + private BigDecimal memberVal; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/ConfirmLogPage.java b/fuint-application/src/main/java/com/fuint/common/param/ConfirmLogPage.java new file mode 100644 index 0000000..0bf1a93 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/ConfirmLogPage.java @@ -0,0 +1,34 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 卡券核销流水请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ConfirmLogPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("手机号") + private String mobile; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java b/fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java new file mode 100644 index 0000000..7cfa40c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java @@ -0,0 +1,24 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 卡券核销请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ConfirmParam implements Serializable { + + @ApiModelProperty(value="核销码", name="code") + private String code; + + @ApiModelProperty(value="核销金额", name="amount") + private String amount; + + @ApiModelProperty(value="核销备注", name="remark") + private String remark; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java b/fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java new file mode 100644 index 0000000..2833cb2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java @@ -0,0 +1,21 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 卡券详情请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CouponInfoParam implements Serializable { + + @ApiModelProperty(value="卡券ID", name="couponId") + private Integer couponId; + + @ApiModelProperty(value="会员卡券编码", name="userCouponCode") + private String userCouponCode; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java b/fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java new file mode 100644 index 0000000..9d15db9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java @@ -0,0 +1,46 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 卡券列表请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CouponListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="关键字", name="keyword") + private String keyword; + + @ApiModelProperty(value="卡券类型", name="type") + private String type; + + @ApiModelProperty(value="商户ID", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + + @ApiModelProperty(value="领取所需积分", name="needPoint") + private Integer needPoint; + + @ApiModelProperty(value="发放方式", name="sendWay") + private String sendWay; + + @ApiModelProperty(value="排序类型", name="sortType") + private String sortType; + + @ApiModelProperty(value="面额排序", name="sortPrice") + private String sortPrice; + + @ApiModelProperty(value="下单会员ID", name="userId") + private Integer userId; + + @ApiModelProperty(value="状态", name="status") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java b/fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java new file mode 100644 index 0000000..442a34d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java @@ -0,0 +1,27 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 卡券领取请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class CouponReceiveParam implements Serializable { + + @ApiModelProperty(value="卡券ID", name="couponId") + private Integer couponId; + + @ApiModelProperty(value="领取数量", name="num") + private Integer num; + + @ApiModelProperty(value="会员ID", name="userId") + private Integer userId; + + @ApiModelProperty(value="领取码", name="receiveCode") + private String receiveCode; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java b/fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java new file mode 100644 index 0000000..4249b28 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java @@ -0,0 +1,21 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 转增记录列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GiveListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="转增对象手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="类型,give = 转增,gived = 被转增", name="type") + private String type; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/GiveParam.java b/fuint-application/src/main/java/com/fuint/common/param/GiveParam.java new file mode 100644 index 0000000..e622a48 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/GiveParam.java @@ -0,0 +1,36 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 卡券转赠请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GiveParam implements Serializable { + + @ApiModelProperty(value="转增对象手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="卡券ID,可逗号隔开", name="couponId") + private String couponId; + + @ApiModelProperty(value="转赠备注", name="note") + private String note; + + @ApiModelProperty(value="转赠留言", name="message") + private String message; + + @ApiModelProperty(value="转赠人ID", name="userId") + private Integer userId; + + @ApiModelProperty(value="商户ID", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/GivePointParam.java b/fuint-application/src/main/java/com/fuint/common/param/GivePointParam.java new file mode 100644 index 0000000..a112e3c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/GivePointParam.java @@ -0,0 +1,25 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 积分转赠请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GivePointParam implements Serializable { + + @ApiModelProperty(value="手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="转赠数量", name="amount") + private Integer amount; + + @ApiModelProperty(value="转赠备注", name="remark") + private String remark; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/GoodsCatePage.java b/fuint-application/src/main/java/com/fuint/common/param/GoodsCatePage.java new file mode 100644 index 0000000..4e9893c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/GoodsCatePage.java @@ -0,0 +1,31 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 商品分类分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsCatePage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java b/fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java new file mode 100644 index 0000000..b725ec8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java @@ -0,0 +1,21 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 商品详情请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsInfoParam implements Serializable { + + @ApiModelProperty(value="商品ID", name="goodsId") + private String goodsId; + + @ApiModelProperty(value="skuNo", name="skuNo") + private String skuNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/GoodsListParam.java b/fuint-application/src/main/java/com/fuint/common/param/GoodsListParam.java new file mode 100644 index 0000000..8309bc2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/GoodsListParam.java @@ -0,0 +1,58 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 商品列表请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class GoodsListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="商品名称", name="name") + private String name; + + @ApiModelProperty(value="搜索关键字", name="keyword") + private String keyword; + + @ApiModelProperty(value="商品编码", name="goodsNo") + private String goodsNo; + + @ApiModelProperty(value="是否单规格", name="isSingleSpec") + private String isSingleSpec; + + @ApiModelProperty(value="商品类型", name="type") + private String type; + + @ApiModelProperty(value="可用平台", name="platform") + private String platform; + + @ApiModelProperty(value="商品状态", name="status") + private String status; + + @ApiModelProperty(value="所属商户", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="所属店铺", name="storeId") + private Integer storeId; + + @ApiModelProperty(value="是否有库存", name="stock") + private String stock; + + @ApiModelProperty(value="商品分类", name="cateId") + private Integer cateId; + + @ApiModelProperty(value="是否有价格", name="hasPrice") + private String hasPrice; + + @ApiModelProperty(value="排序方式", name="sortType") + private String sortType; + + @ApiModelProperty(value="按价格排序", name="sortPrice") + private String sortPrice; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/InvoiceParam.java b/fuint-application/src/main/java/com/fuint/common/param/InvoiceParam.java new file mode 100644 index 0000000..4e213d0 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/InvoiceParam.java @@ -0,0 +1,74 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 发票请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class InvoiceParam implements Serializable { + + @ApiModelProperty(value="ID", name="id") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("开票时间") + private String invoiceTime; + + @ApiModelProperty("开票金额") + private BigDecimal invoiceAmount; + + @ApiModelProperty("发票抬头") + private String title; + + @ApiModelProperty("发票下载地址") + private String downloadUrl; + + @ApiModelProperty("发票类型,普票、专票") + private String type; + + @ApiModelProperty("纳税人识别码") + private String taxCode; + + @ApiModelProperty("开户行") + private String bankName; + + @ApiModelProperty("开户卡号") + private String bankCardNo; + + @ApiModelProperty("开户户名") + private String bankCardName; + + @ApiModelProperty("开票备注") + private String description; + + @ApiModelProperty("接收邮箱") + private String email; + + @ApiModelProperty("联系电话") + private String mobile; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A待开票,B开票中,C开票成功,D开票失败") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/MemberDetailParam.java b/fuint-application/src/main/java/com/fuint/common/param/MemberDetailParam.java new file mode 100644 index 0000000..d7948ef --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/MemberDetailParam.java @@ -0,0 +1,19 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 会员详情请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MemberDetailParam implements Serializable { + + @ApiModelProperty(value="会员ID", name="memberId") + private Integer memberId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java b/fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java new file mode 100644 index 0000000..26933c9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java @@ -0,0 +1,37 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 会员查询请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MemberInfoParam extends PageParam implements Serializable { + + @ApiModelProperty(value="ID", name="id") + private Integer id; + + @ApiModelProperty(value="手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="头像", name="avatar") + private String avatar; + + @ApiModelProperty(value="称呼", name="name") + private String name; + + @ApiModelProperty(value="性别", name="sex") + private Integer sex; + + @ApiModelProperty(value="生日", name="birthday") + private String birthday; + + @ApiModelProperty(value="会员号", name="userNo") + private String userNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java b/fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java new file mode 100644 index 0000000..b7d72aa --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java @@ -0,0 +1,61 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 会员列表请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MemberListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="ID", name="id") + private String id; + + @ApiModelProperty(value="商户ID", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + + @ApiModelProperty(value="手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="会员ID", name="userId") + private Integer userId; + + @ApiModelProperty(value="关键字", name="keyword") + private String keyword; + + @ApiModelProperty(value="会员名称", name="name") + private String name; + + @ApiModelProperty(value="会员生日", name="birthday") + private String birthday; + + @ApiModelProperty(value="会员号", name="userNo") + private String userNo; + + @ApiModelProperty(value="会员等级", name="gradeId") + private String gradeId; + + @ApiModelProperty(value="注册时间", name="regTime") + private String regTime; + + @ApiModelProperty(value="活跃时间", name="activeTime") + private String activeTime; + + @ApiModelProperty(value="会员有效期", name="memberTime") + private String memberTime; + + @ApiModelProperty(value="数据类型,1)todayRegister:今日注册;2)todayActive:今日活跃", name="dataType") + private String dataType; + + @ApiModelProperty(value="会员状态", name="status") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/MemberPage.java b/fuint-application/src/main/java/com/fuint/common/param/MemberPage.java new file mode 100644 index 0000000..d93a12e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/MemberPage.java @@ -0,0 +1,67 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 会员列表分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class MemberPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("会员ID") + private Integer id; + + @ApiModelProperty("会员名称") + private String name; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("查询关键字") + private String birthday; + + @ApiModelProperty("会员等级ID") + private Integer gradeId; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("会员开始时间") + private String startTime; + + @ApiModelProperty("会员结束时间") + private String endTime; + + @ApiModelProperty("注册时间") + private String regTime; + + @ApiModelProperty("会员活跃时间") + private String activeTime; + + @ApiModelProperty("会员有效期") + private String memberTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("所属店铺ID-多店铺") + private String storeIds; + + @ApiModelProperty("所属分组ID") + private String groupIds; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/OrderConfirmParam.java b/fuint-application/src/main/java/com/fuint/common/param/OrderConfirmParam.java new file mode 100644 index 0000000..5aed4d6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/OrderConfirmParam.java @@ -0,0 +1,25 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 订单核销请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OrderConfirmParam implements Serializable { + + @ApiModelProperty(value="核销码", name="code") + private String code; + + @ApiModelProperty(value="订单ID", name="orderId") + private Integer orderId; + + @ApiModelProperty(value="核销备注", name="remark") + private String remark; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java b/fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java new file mode 100644 index 0000000..46a948f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java @@ -0,0 +1,18 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 订单详情请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OrderDetailParam implements Serializable { + + @ApiModelProperty(value="订单ID", name="orderId") + private String orderId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java b/fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java new file mode 100644 index 0000000..3fdcb02 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java @@ -0,0 +1,83 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +/** + * 订单列表请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class OrderListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="ID", name="id") + private String id; + + @ApiModelProperty(value="关键字", name="keyword") + private String keyword; + + @ApiModelProperty(value="会员ID", name="userId") + private String userId; + + @ApiModelProperty(value="会员号", name="userCode") + private String userCode; + + @ApiModelProperty(value="商户ID", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + + @ApiModelProperty(value="店铺ID,逗号分隔", name="storeIds") + private String storeIds; + + @ApiModelProperty(value="订单状态", name="status") + private String status; + + @ApiModelProperty(value="支付状态", name="payStatus") + private String payStatus; + + @ApiModelProperty(value="结算状态", name="settleStatus") + private String settleStatus; + + @ApiModelProperty(value="核销状态", name="confirmStatus") + private String confirmStatus; + + @ApiModelProperty(value="数据类型,1)toPay:待支付;2)paid:已支付;3)cancel:已取消", name="dataType") + private String dataType; + + @ApiModelProperty(value="支付类型", name="payType") + private List payType; + + @ApiModelProperty(value="订单类型", name="type") + private String type; + + @ApiModelProperty(value="订单号", name="orderSn") + private String orderSn; + + @ApiModelProperty(value="会员手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="订单模式,1)oneself:自取,2)express:配送", name="orderMode") + private String orderMode; + + @ApiModelProperty(value="员工ID(销售人员)", name="staffId") + private String staffId; + + @ApiModelProperty(value="卡券ID", name="couponId") + private String couponId; + + @ApiModelProperty(value="时间类型", name="timeType") + private String timeType; + + @ApiModelProperty(value="开始时间", name="startTime") + private String startTime; + + @ApiModelProperty(value="结束时间", name="endTime") + private String endTime; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/PageParam.java b/fuint-application/src/main/java/com/fuint/common/param/PageParam.java new file mode 100644 index 0000000..47886dc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/PageParam.java @@ -0,0 +1,69 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; + +/** + * 分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class PageParam implements Serializable { + private static final long serialVersionUID = -1833130751169582924L; + + @ApiModelProperty("当前页数") + private Integer page = 1; + + @ApiModelProperty("分页大小") + private int pageSize = 20; + + /** + * 排序字段 + */ + @ApiModelProperty(value="排序字段",name="orderBy") + private String orderBy; + + /** + * 排序方式 + */ + @ApiModelProperty(value="排序方式",name="order") + private String order; + + public PageParam() { + // empty + } + + public Integer getPage() { + return this.page; + } + + public Integer getPageSize() { + return this.pageSize; + } + + public void setPage(int page) { + this.page = page; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String getOrderBy() { + return orderBy; + } + + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } +} + diff --git a/fuint-application/src/main/java/com/fuint/common/param/PrinterPage.java b/fuint-application/src/main/java/com/fuint/common/param/PrinterPage.java new file mode 100644 index 0000000..8606029 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/PrinterPage.java @@ -0,0 +1,34 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 打印机分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class PrinterPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("打印机编号") + private String sn; + + @ApiModelProperty("打印机名称") + private String name; + + @ApiModelProperty("是否自动打印机") + private String autoPrint; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/PrinterParam.java b/fuint-application/src/main/java/com/fuint/common/param/PrinterParam.java new file mode 100644 index 0000000..a4b0a8b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/PrinterParam.java @@ -0,0 +1,50 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 打印机请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class PrinterParam implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("打印机编号") + private String sn; + + @ApiModelProperty("打印机名称") + private String name; + + @ApiModelProperty("是否自动打印机") + private String autoPrint; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java b/fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java new file mode 100644 index 0000000..c435733 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java @@ -0,0 +1,25 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 充值请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RechargeParam implements Serializable { + + @ApiModelProperty(value="充值金额", name="rechargeAmount") + private String rechargeAmount; + + @ApiModelProperty(value="自定义充值金额", name="customAmount") + private String customAmount; + + @ApiModelProperty(value="会员ID", name="memberId") + private Integer memberId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/RefundDetailParam.java b/fuint-application/src/main/java/com/fuint/common/param/RefundDetailParam.java new file mode 100644 index 0000000..8d50ee2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/RefundDetailParam.java @@ -0,0 +1,19 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 售后订单详情请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RefundDetailParam implements Serializable { + + @ApiModelProperty(value="售后订单ID", name="refundId") + private Integer refundId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/RefundListParam.java b/fuint-application/src/main/java/com/fuint/common/param/RefundListParam.java new file mode 100644 index 0000000..0d5c569 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/RefundListParam.java @@ -0,0 +1,83 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +/** + * 售后订单列表请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RefundListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="ID", name="id") + private String id; + + @ApiModelProperty(value="关键字", name="keyword") + private String keyword; + + @ApiModelProperty(value="会员ID", name="userId") + private String userId; + + @ApiModelProperty(value="会员号", name="userCode") + private String userCode; + + @ApiModelProperty(value="商户ID", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + + @ApiModelProperty(value="店铺ID,逗号分隔", name="storeIds") + private String storeIds; + + @ApiModelProperty(value="订单状态", name="status") + private String status; + + @ApiModelProperty(value="支付状态", name="payStatus") + private String payStatus; + + @ApiModelProperty(value="结算状态", name="settleStatus") + private String settleStatus; + + @ApiModelProperty(value="核销状态", name="confirmStatus") + private String confirmStatus; + + @ApiModelProperty(value="数据类型,1)toPay:待支付;2)paid:已支付;3)cancel:已取消", name="dataType") + private String dataType; + + @ApiModelProperty(value="支付类型", name="payType") + private List payType; + + @ApiModelProperty(value="订单类型", name="type") + private String type; + + @ApiModelProperty(value="订单号", name="orderSn") + private String orderSn; + + @ApiModelProperty(value="会员手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="订单模式,1)oneself:自取,2)express:配送", name="orderMode") + private String orderMode; + + @ApiModelProperty(value="员工ID(销售人员)", name="staffId") + private String staffId; + + @ApiModelProperty(value="卡券ID", name="couponId") + private String couponId; + + @ApiModelProperty(value="时间类型", name="timeType") + private String timeType; + + @ApiModelProperty(value="开始时间", name="startTime") + private String startTime; + + @ApiModelProperty(value="结束时间", name="endTime") + private String endTime; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/SendCouponParam.java b/fuint-application/src/main/java/com/fuint/common/param/SendCouponParam.java new file mode 100644 index 0000000..4402038 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/SendCouponParam.java @@ -0,0 +1,31 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 发放卡券请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SendCouponParam implements Serializable { + + @ApiModelProperty(value="手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="发放数量", name="num") + private String num; + + @ApiModelProperty(value="卡券ID", name="couponId") + private String couponId; + + @ApiModelProperty(value="会员ID", name="userIds") + private String userIds; + + @ApiModelProperty(value="发放对象", name="object") + private String object; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java b/fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java new file mode 100644 index 0000000..30873dc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java @@ -0,0 +1,78 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 订单结算请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class SettlementParam implements Serializable { + + @ApiModelProperty(value="购物车Id,逗号分隔", name="cartIds") + private String cartIds; + + @ApiModelProperty(value="购买对象,购买储值卡、升级会员等级必填", name="targetId") + private String targetId; + + @ApiModelProperty(value="购买储值卡数量", name="selectNum") + private String selectNum; + + @ApiModelProperty(value="结算备注", name="remark") + private String remark; + + @ApiModelProperty(value="订单类型,payment:付款订单、goods:商品订单、recharge:充值订单、prestore:储值卡订单、member:会员升级订单", name="type") + private String type; + + @ApiModelProperty(value="支付金额,付款类订单必填", name="payAmount") + private String payAmount; + + @ApiModelProperty(value="使用积分数量", name="usePoint") + private Integer usePoint; + + @ApiModelProperty(value="使用卡券ID", name="couponId") + private Integer couponId; + + @ApiModelProperty(value="支付类型,CASH:现金支付,JSAPI:微信支付,MICROPAY:微信扫码支付,BALANCE:余额支付,ALISCAN:支付宝扫码", name="payType") + private String payType; + + @ApiModelProperty(value="PC端扫码支付的二维码", name="authCode") + private String authCode; + + @ApiModelProperty(value="会员ID(代客下单用到)", name="userId") + private Integer userId; + + @ApiModelProperty(value="会员手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="实付金额(收银台用到)", name="cashierPayAmount") + private String cashierPayAmount; + + @ApiModelProperty(value="优惠金额(收银台用到)", name="cashierDiscountAmount") + private String cashierDiscountAmount; + + @ApiModelProperty(value="商品ID", name="goodsId") + private Integer goodsId; + + @ApiModelProperty(value="商品skuID", name="skuId") + private Integer skuId; + + @ApiModelProperty(value="购买数量", name="buyNum") + private Double buyNum; + + @ApiModelProperty(value="订单模式,配送(express)或自提(oneself)", name="orderMode") + private String orderMode; + + @ApiModelProperty(value="订单ID", name="orderId") + private Integer orderId; + + @ApiModelProperty(value="是否微信客户端", name="isWechat") + private String isWechat; + + @ApiModelProperty(value="员工ID", name="staffId") + private Integer staffId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/ShareListParam.java b/fuint-application/src/main/java/com/fuint/common/param/ShareListParam.java new file mode 100644 index 0000000..0b2466d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/ShareListParam.java @@ -0,0 +1,18 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 邀请列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ShareListParam extends PageParam implements Serializable { + + @ApiModelProperty(value="商户号", name="merchantNo") + private String merchantNo; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/StaffParam.java b/fuint-application/src/main/java/com/fuint/common/param/StaffParam.java new file mode 100644 index 0000000..620b92a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/StaffParam.java @@ -0,0 +1,40 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 订单列表请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class StaffParam extends PageParam implements Serializable { + + @ApiModelProperty(value="ID", name="id") + private Integer id; + + @ApiModelProperty(value="商户ID", name="merchantId") + private Integer merchantId; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + + @ApiModelProperty(value="类别", name="category") + private Integer category; + + @ApiModelProperty(value="手机号", name="mobile") + private String mobile; + + @ApiModelProperty(value="真实姓名", name="realName") + private String realName; + + @ApiModelProperty(value="备注信息", name="description") + private String description; + + @ApiModelProperty(value="审核状态", name="auditedStatus") + private String auditedStatus; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/StatisticParam.java b/fuint-application/src/main/java/com/fuint/common/param/StatisticParam.java new file mode 100644 index 0000000..ab3970e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/StatisticParam.java @@ -0,0 +1,25 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 统计请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class StatisticParam implements Serializable { + + @ApiModelProperty(value="开始时间", name="startTime") + private String startTime; + + @ApiModelProperty(value="结束时间", name="endTime") + private String endTime; + + @ApiModelProperty(value="店铺ID", name="storeId") + private Integer storeId; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java b/fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java new file mode 100644 index 0000000..15541fe --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java @@ -0,0 +1,73 @@ +package com.fuint.common.permission; + +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.service.SourceService; +import com.fuint.common.util.AuthUserUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.TSource; +import com.fuint.utils.StringUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 权限控制业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service("pms") +public class PermissionService { + + /** + * 所有权限标识 + */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** + * 后台菜单接口 + * */ + @Resource + SourceService sourceService; + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean hasPermission(String permission) throws BusinessCheckException { + if (StringUtil.isEmpty(permission)) { + return false; + } + + AccountInfo accountInfo = AuthUserUtil.get(); + if (accountInfo == null) { + return false; + } + + Set allPermission = new HashSet<>(); + List sources = sourceService.getMenuListByUserId(accountInfo.getMerchantId(), accountInfo.getId()); + if (sources != null && sources.size() > 0) { + for (TSource tSource : sources) { + allPermission.add(tSource.getPath().replaceAll("/", ":")); + } + } + + return hasPermissions(allPermission, permission); + } + + /** + * 判断是否包含权限 + * + * @param permissions 权限列表 + * @param permission 权限字符串 + * @return boolean + */ + private boolean hasPermissions(Set permissions, String permission) { + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtil.trim(permission)); + } +} \ No newline at end of file diff --git a/fuint-application/src/main/java/com/fuint/common/service/AccountService.java b/fuint-application/src/main/java/com/fuint/common/service/AccountService.java new file mode 100644 index 0000000..0f67c5b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/AccountService.java @@ -0,0 +1,122 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.AccountDto; +import com.fuint.common.dto.AccountInfo; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.LoginRequest; +import com.fuint.module.backendApi.response.LoginResponse; +import com.fuint.repository.model.TAccount; +import com.fuint.repository.model.TDuty; +import java.util.List; + +/** + * 后台账号接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface AccountService extends IService { + + /** + * 分页查询账号列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse getAccountListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 根据账号名称获取账号信息 + * + * @param userName 账号名称 + * @return + * */ + AccountInfo getAccountByName(String userName); + + /** + * 获取用户信息 + * + * @param id 账号ID + * @return + */ + TAccount getAccountInfoById(Integer id); + + /** + * 创建账号信息 + * + * @param accountInfo 账号信息 + * @param duties 角色 + * @return + * */ + TAccount createAccountInfo(TAccount accountInfo, List duties) throws BusinessCheckException; + + /** + * 获取账号角色ID + * + * @param accountId 账号ID + * @return + * */ + List getRoleIdsByAccountId(Integer accountId); + + /** + * 修改账户 + * + * @param tAccount 账户实体 + * @throws BusinessCheckException + * @return + */ + void editAccount(TAccount tAccount, List duties) throws BusinessCheckException; + + /** + * 根据账户名称获取账户所分配的角色ID集合 + * + * @param accountId 账户 + * @return 角色ID集合 + */ + List getDutyIdsByAccountId(Integer accountId); + + /** + * 更新账户信息 + * + * @param tAccount + * @return + */ + void updateAccount(TAccount tAccount); + + /** + * 删除后台账号 + * + * @param accountId 账号ID + * @return + * */ + void deleteAccount(Long accountId); + + /** + * 密码加密 + * + * @param tAccount 账号信息 + * @return + * */ + void entryptPassword(TAccount tAccount); + + /** + * 获取加密密码 + * + * @param password + * @param salt + * @return + * */ + String getEntryptPassword(String password, String salt); + + /** + * 登录后台系统 + * + * @param loginRequest 登录参数 + * @param userAgent 登录浏览器 + * @return + * */ + LoginResponse doLogin(LoginRequest loginRequest, String userAgent) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java b/fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java new file mode 100644 index 0000000..fac3260 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java @@ -0,0 +1,31 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.TActionLog; + +/** + * 后台日志服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface ActionLogService extends IService { + + /** + * 保存日志 + * + * @param actionLog + * @return + */ + void saveActionLog(TActionLog actionLog); + + /** + * 获取分页查询数据 + * + * @param paginationRequest + * @return + */ + PaginationResponse findLogsByPagination(PaginationRequest paginationRequest); +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/AddressService.java b/fuint-application/src/main/java/com/fuint/common/service/AddressService.java new file mode 100644 index 0000000..224e111 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/AddressService.java @@ -0,0 +1,42 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.repository.model.MtAddress; +import com.fuint.framework.exception.BusinessCheckException; +import java.util.List; +import java.util.Map; + +/** + * 收货地址业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface AddressService extends IService { + + /** + * 保存收货地址 + * + * @param mtAddress + * @throws BusinessCheckException + * @return + */ + MtAddress saveAddress(MtAddress mtAddress) throws BusinessCheckException; + + /** + * 根据ID获取Banner信息 + * + * @param id 地址ID + * @throws BusinessCheckException + * @return + */ + MtAddress detail(Integer id) throws BusinessCheckException; + + /** + * 根据条件查询地址列表 + * + * @param params 查询参数 + * @return + * */ + List queryListByParams(Map params) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/AlipayService.java b/fuint-application/src/main/java/com/fuint/common/service/AlipayService.java new file mode 100644 index 0000000..72cca79 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/AlipayService.java @@ -0,0 +1,62 @@ +package com.fuint.common.service; + +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtUser; +import java.math.BigDecimal; +import java.util.Map; + +/** + * 支付宝相关业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface AlipayService { + + /** + * 创建预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP地址 + * @param platform 支付平台 + * @return + * */ + ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException; + + /** + * 支付回调 + * + * @param params 请求参数 + * @return + * */ + Boolean checkCallBack(Map params) throws Exception; + + /** + * 查询支付订单 + * + * @param storeId 店铺ID + * @param tradeNo 交易单号 + * @param orderSn 订单号 + * @return + * */ + Map queryPaidOrder(Integer storeId, String tradeNo, String orderSn) throws BusinessCheckException; + + /** + * 发起售后退款 + * + * @param storeId 店铺ID + * @param orderSn 订单号 + * @param totalAmount 订单总金额 + * @param refundAmount 售后金额 + * @param platform 订单平台 + * @return + * */ + Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException; + +} \ No newline at end of file diff --git a/fuint-application/src/main/java/com/fuint/common/service/ArticleService.java b/fuint-application/src/main/java/com/fuint/common/service/ArticleService.java new file mode 100644 index 0000000..f018646 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/ArticleService.java @@ -0,0 +1,67 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.ArticleDto; +import com.fuint.common.param.ArticlePage; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtArticle; +import com.fuint.framework.exception.BusinessCheckException; +import java.util.List; +import java.util.Map; + +/** + * 文章业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface ArticleService extends IService { + + /** + * 分页查询文章列表 + * + * @param articlePage + * @return + */ + PaginationResponse queryArticleListByPagination(ArticlePage articlePage) throws BusinessCheckException; + + /** + * 添加文章 + * + * @param articleDto + * @throws BusinessCheckException + */ + MtArticle addArticle(ArticleDto articleDto) throws BusinessCheckException; + + /** + * 根据ID获取文章信息 + * + * @param id 文章ID + * @throws BusinessCheckException + */ + MtArticle queryArticleById(Integer id) throws BusinessCheckException; + + /** + * 根据ID获取文章详情 + * + * @param id 文章ID + * @throws BusinessCheckException + */ + ArticleDto getArticleDetail(Integer id) throws BusinessCheckException; + + /** + * 更新文章 + * @param articleDto + * @throws BusinessCheckException + * */ + MtArticle updateArticle(ArticleDto articleDto) throws BusinessCheckException; + + /** + * 根据条件搜索文章 + * + * @param params + * @return + * */ + List queryArticleListByParams(Map params) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/BalanceService.java b/fuint-application/src/main/java/com/fuint/common/service/BalanceService.java new file mode 100644 index 0000000..054885d --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/BalanceService.java @@ -0,0 +1,56 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.BalanceDto; +import com.fuint.common.param.BalancePage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtBalance; +import java.util.List; + +/** + * 余额业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface BalanceService extends IService { + + /** + * 分页查询余额列表 + * + * @param balancePage + * @return + */ + PaginationResponse queryBalanceListByPagination(BalancePage balancePage) throws BusinessCheckException; + + /** + * 添加余额记录 + * + * @param reqDto + * @param updateBalance + * @throws BusinessCheckException + */ + Boolean addBalance(MtBalance reqDto, Boolean updateBalance) throws BusinessCheckException; + + /** + * 发放余额 + * + * @param accountInfo 账号信息 + * @param object 发放对象,all全部 + * @param userIds 会员ID + * @param amount 发放金额 + * @param remark 备注 + * @return + */ + void distribute(AccountInfo accountInfo, String object, String userIds, String amount, String remark) throws BusinessCheckException; + + /** + * 获取订单余额记录 + * + * @param orderSn + * @return + * */ + List getBalanceListByOrderSn(String orderSn) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/BannerService.java b/fuint-application/src/main/java/com/fuint/common/service/BannerService.java new file mode 100644 index 0000000..4e38331 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/BannerService.java @@ -0,0 +1,72 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.param.BannerPage; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtBanner; +import com.fuint.common.dto.BannerDto; +import com.fuint.framework.exception.BusinessCheckException; +import java.util.List; +import java.util.Map; + +/** + * 焦点图业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface BannerService extends IService { + + /** + * 分页查询列表 + * + * @param bannerPage + * @return + */ + PaginationResponse queryBannerListByPagination(BannerPage bannerPage) throws BusinessCheckException; + + /** + * 添加Banner + * + * @param reqBannerDto + * @throws BusinessCheckException + * @return + */ + MtBanner addBanner(BannerDto reqBannerDto) throws BusinessCheckException; + + /** + * 根据ID获取Banner信息 + * + * @param id Banner ID + * @throws BusinessCheckException + * @return + */ + MtBanner queryBannerById(Integer id) throws BusinessCheckException; + + /** + * 根据ID删除焦点图 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteBanner(Integer id, String operator) throws BusinessCheckException; + + /** + * 更新焦点图 + * @param bannerDto + * @throws BusinessCheckException + * @return + * */ + MtBanner updateBanner(BannerDto bannerDto) throws BusinessCheckException; + + /** + * 根据条件搜索焦点图 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + List queryBannerListByParams(Map params) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/BookCateService.java b/fuint-application/src/main/java/com/fuint/common/service/BookCateService.java new file mode 100644 index 0000000..029ada5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/BookCateService.java @@ -0,0 +1,63 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.param.BookCatePage; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.MtBookCate; +import java.util.List; + +/** + * 预约类别业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface BookCateService extends IService { + + /** + * 分页查询列表 + * + * @param bookCatePage + * @return + */ + PaginationResponse queryBookCateListByPagination(BookCatePage bookCatePage) throws BusinessCheckException; + + /** + * 添加预约类别 + * + * @param mtBookCate + * @throws BusinessCheckException + * @return + */ + MtBookCate addBookCate(MtBookCate mtBookCate) throws BusinessCheckException; + + /** + * 根据ID获取预约类别 + * + * @param id 预约分类ID + * @throws BusinessCheckException + * @return + */ + MtBookCate getBookCateById(Integer id) throws BusinessCheckException; + + /** + * 更新预约类别 + * + * @param mtBookCate + * @throws BusinessCheckException + * @return + * */ + MtBookCate updateBookCate(MtBookCate mtBookCate) throws BusinessCheckException; + + /** + * 获取可用的预约类别 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @throws BusinessCheckException + * @return + * */ + List getAvailableBookCate(Integer merchantId, Integer storeId) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/BookItemService.java b/fuint-application/src/main/java/com/fuint/common/service/BookItemService.java new file mode 100644 index 0000000..814edc6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/BookItemService.java @@ -0,0 +1,93 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.BookItemDto; +import com.fuint.common.param.BookItemPage; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.MtBookItem; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + * 预约订单业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface BookItemService extends IService { + + /** + * 分页查询列表 + * + * @param bookItemPage + * @return + */ + PaginationResponse queryBookItemListByPagination(BookItemPage bookItemPage) throws BusinessCheckException; + + /** + * 添加预约订单 + * + * @param mtBookItem + * @throws BusinessCheckException + * @return + */ + MtBookItem addBookItem(MtBookItem mtBookItem) throws BusinessCheckException, ParseException; + + /** + * 根据ID获取预约订单信息 + * + * @param id 预约订单ID + * @return + */ + MtBookItem getBookItemById(Integer id); + + /** + * 获取用户预约订单信息 + * + * @param bookId 预约项目ID + * @param userId 用户ID + * @param orderGoodsId 订单商品ID + * @return + */ + MtBookItem getUserBookItem(Integer bookId, Integer userId, Integer orderGoodsId); + + /** + * 根据ID获取预约订单详情 + * + * @param id 预约订单ID + * @throws BusinessCheckException + * @return + */ + BookItemDto getBookDetail(Integer id) throws BusinessCheckException; + + /** + * 更新预约订单 + * + * @param mtBookItem + * @throws BusinessCheckException + * @return + * */ + MtBookItem updateBookItem(MtBookItem mtBookItem) throws BusinessCheckException; + + /** + * 根据条件搜索预约订单 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + List queryBookItemListByParams(Map params) throws BusinessCheckException; + + /** + * 取消预约 + * + * @param id 预约订单ID + * @param remark 备注信息 + * @throws BusinessCheckException + * @return + * */ + Boolean cancelBook(Integer id, String remark) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/BookService.java b/fuint-application/src/main/java/com/fuint/common/service/BookService.java new file mode 100644 index 0000000..f2f6703 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/BookService.java @@ -0,0 +1,76 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.BookDto; +import com.fuint.common.param.BookPage; +import com.fuint.common.param.BookableParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtBook; + +import java.text.ParseException; +import java.util.List; + +/** + * 预约业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface BookService extends IService { + + /** + * 分页查询预约列表 + * + * @param bookPage + * @return + */ + PaginationResponse queryBookListByPagination(BookPage bookPage) throws BusinessCheckException; + + /** + * 添加预约 + * + * @param mtBook + * @throws BusinessCheckException + * @return + */ + MtBook addBook(MtBook mtBook) throws BusinessCheckException; + + /** + * 根据ID获取预约项目信息 + * + * @param id 预约项目ID + * @param fillDate 填充日期 + * @throws BusinessCheckException + * @return + */ + BookDto getBookById(Integer id, boolean fillDate) throws ParseException; + + /** + * 更新预约项目 + * + * @param mtBook + * @throws BusinessCheckException + * @return + * */ + MtBook updateBook(MtBook mtBook) throws BusinessCheckException; + + /** + * 是否可预约 + * + * @param param + * @throws BusinessCheckException + * @return + * */ + List isBookable(BookableParam param) throws BusinessCheckException, ParseException; + + /** + * 获取预约项目列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + List getBookList(Integer merchantId, Integer storeId); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java b/fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java new file mode 100644 index 0000000..b78d771 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java @@ -0,0 +1,43 @@ +package com.fuint.common.service; + +import javax.servlet.http.HttpSession; +import java.awt.image.BufferedImage; + +/** + * 图形验证码插件服务类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CaptchaService { + + /** + * 生成图形验证码,并保存至Session + * @param session Session + * @return BufferedImage + */ + BufferedImage getCode(HttpSession session); + + /** + * 图形验证码校验 + * @param code 输入的验证码 + * @param session Session + * @return Boolean + */ + Boolean checkCode(String code, HttpSession session); + + /** + * 生成图形验证码 + * @return BufferedImage + */ + BufferedImage getCodeByUuid(String uuid); + + /** + * 图形验证码校验 + * @param code 输入的验证码 + * @param uuid uuid + * @return Boolean + */ + Boolean checkCodeByUuid(String code, String uuid); + +} \ No newline at end of file diff --git a/fuint-application/src/main/java/com/fuint/common/service/CartService.java b/fuint-application/src/main/java/com/fuint/common/service/CartService.java new file mode 100644 index 0000000..d4eca6f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CartService.java @@ -0,0 +1,80 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.MtCart; +import java.util.List; +import java.util.Map; + +/** + * 购物车业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CartService extends IService { + + /** + * 切换购物车给会员 + * + * @param userId + * @param cartIds + * @return + * */ + Boolean switchCartIds(Integer userId, String cartIds) throws BusinessCheckException; + + /** + * 保存购物车 + * + * @param reqDto + * @param action + or - or = + * @throws BusinessCheckException + * @return + */ + Integer saveCart(MtCart reqDto, String action) throws BusinessCheckException; + + /** + * 删除购物车 + * + * @param cartIds 购物车ID + * @throws BusinessCheckException + * @return + */ + void removeCart(String cartIds) throws BusinessCheckException; + + /** + * 删除购物车 + * + * @param hangNo 挂单序号 + * @throws BusinessCheckException + * @return + */ + void removeCartByHangNo(String hangNo) throws BusinessCheckException; + + /** + * 清空会员购物车 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + */ + void clearCart(Integer userId) throws BusinessCheckException; + + /** + * 根据条件查找 + * + * @param params 查询参数 + * @return + * */ + List queryCartListByParams(Map params) throws BusinessCheckException; + + /** + * 挂单 + * + * @param cartId 购物车ID + * @param hangNo 挂单序号 + * @param isVisitor 是否游客 + * @return + */ + MtCart setHangNo(Integer cartId, String hangNo, String isVisitor) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CateService.java b/fuint-application/src/main/java/com/fuint/common/service/CateService.java new file mode 100644 index 0000000..34f3e49 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CateService.java @@ -0,0 +1,83 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.GoodsCateDto; +import com.fuint.common.param.GoodsCatePage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtGoodsCate; +import java.util.List; + +/** + * 商品分类业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CateService extends IService { + + /** + * 分页查询列表 + * + * @param catePage + * @return + */ + PaginationResponse queryCateListByPagination(GoodsCatePage catePage) throws BusinessCheckException; + + /** + * 添加商品分类 + * + * @param reqDto 分类参数 + * @throws BusinessCheckException + * @return + */ + MtGoodsCate addCate(MtGoodsCate reqDto) throws BusinessCheckException; + + /** + * 根据ID获取商品分类信息 + * + * @param id ID + * @throws BusinessCheckException + */ + MtGoodsCate queryCateById(Integer id) throws BusinessCheckException; + + /** + * 根据ID删除 + * + * @param id 分类ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteCate(Integer id, String operator) throws BusinessCheckException; + + /** + * 更新分类 + * @param reqDto 分类参数 + * @throws BusinessCheckException + * @return + * */ + MtGoodsCate updateCate(MtGoodsCate reqDto) throws BusinessCheckException; + + /** + * 获取分类列表 + * + * @param merchantId 商户 + * @param storeId 店铺ID + * @param name 店铺名称 + * @param status 状态 + * @return + * */ + List getCateList(Integer merchantId, Integer storeId, String name, String status) throws BusinessCheckException; + + /** + * 获取分类ID + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param name 分类名称 + * @return + * */ + Integer getGoodsCateId(Integer merchantId, Integer storeId, String name); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java b/fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java new file mode 100644 index 0000000..42fbda2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java @@ -0,0 +1,83 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.CommissionCashDto; +import com.fuint.common.param.CommissionCashPage; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.module.backendApi.request.CommissionCashRequest; +import com.fuint.module.backendApi.request.CommissionSettleConfirmRequest; +import com.fuint.module.backendApi.request.CommissionSettleRequest; +import com.fuint.repository.model.MtCommissionCash; + +/** + * 分销提成记录业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CommissionCashService extends IService { + + /** + * 分页查询列表 + * + * @param commissionCashPage + * @return + */ + PaginationResponse queryCommissionCashByPagination(CommissionCashPage commissionCashPage) throws BusinessCheckException; + + /** + * 计算订单分销提成 + * + * @param commissionSettleRequest 结算参数 + * @throws BusinessCheckException + * @return + */ + String settleCommission(CommissionSettleRequest commissionSettleRequest) throws BusinessCheckException; + + /** + * 根据ID获取记录信息 + * + * @param id 记录ID + * @throws BusinessCheckException + * @return + */ + CommissionCashDto queryCommissionCashById(Integer id) throws BusinessCheckException; + + /** + * 更新分销提成记录 + * + * @param commissionCashRequest 请求参数 + * @throws BusinessCheckException + * @return + */ + void updateCommissionCash(CommissionCashRequest commissionCashRequest) throws BusinessCheckException; + + /** + * 结算确认 + * + * @param requestParam 确认参数 + * @throws BusinessCheckException + * @return + */ + void confirmCommissionCash(CommissionSettleConfirmRequest requestParam) throws BusinessCheckException; + + /** + * 取消结算 + * + * @param requestParam 取消参数 + * @throws BusinessCheckException + * @return + */ + void cancelCommissionCash(CommissionSettleConfirmRequest requestParam) throws BusinessCheckException; + + /** + * 支付结算金额到用户余额 + * + * @param commissionCashRequest 请求参数 + * @throws BusinessCheckException + * @return + */ + void payToBalance(CommissionCashRequest commissionCashRequest) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java b/fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java new file mode 100644 index 0000000..00a9ba5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java @@ -0,0 +1,53 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.CommissionLogDto; +import com.fuint.common.param.CommissionLogPage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.CommissionLogRequest; +import com.fuint.repository.model.MtCommissionLog; + +/** + * 分销提成记录业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CommissionLogService extends IService { + + /** + * 分页查询列表 + * + * @param commissionLogPage + * @return + */ + PaginationResponse queryCommissionLogByPagination(CommissionLogPage commissionLogPage) throws BusinessCheckException; + + /** + * 计算订单分销提成 + * + * @param orderId 订单ID + * @throws BusinessCheckException + * @return + */ + void calculateCommission(Integer orderId) throws BusinessCheckException; + + /** + * 根据ID获取记录信息 + * + * @param id 记录ID + * @throws BusinessCheckException + * @return + */ + CommissionLogDto queryCommissionLogById(Integer id) throws BusinessCheckException; + + /** + * 更新分销提成记录 + * + * @param requestParam 请求参数 + * @throws BusinessCheckException + * @return + */ + void updateCommissionLog(CommissionLogRequest requestParam) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CommissionRelationService.java b/fuint-application/src/main/java/com/fuint/common/service/CommissionRelationService.java new file mode 100644 index 0000000..28e37bb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CommissionRelationService.java @@ -0,0 +1,36 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.CommissionRelationDto; +import com.fuint.common.param.CommissionRelationPage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtCommissionRelation; +import com.fuint.repository.model.MtUser; + +/** + * 分销提成关系业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CommissionRelationService extends IService { + + /** + * 分页查询分佣关系列表 + * + * @param commissionRelationPage + * @return + */ + PaginationResponse queryRelationByPagination(CommissionRelationPage commissionRelationPage) throws BusinessCheckException; + + /** + * 设置分销提成关系 + * + * @param userInfo 会员信息 + * @param shareId 分享者ID + * @throws BusinessCheckException + * @retrurn + */ + void setCommissionRelation(MtUser userInfo, String shareId) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java b/fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java new file mode 100644 index 0000000..55b1e38 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java @@ -0,0 +1,51 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.CommissionRuleDto; +import com.fuint.common.param.CommissionRulePage; +import com.fuint.common.param.CommissionRuleParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtCommissionRule; + +/** + * 分销提成规则业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CommissionRuleService extends IService { + + /** + * 分页查询列表 + * + * @param commissionRulePage + * @return + */ + PaginationResponse queryDataByPagination(CommissionRulePage commissionRulePage) throws BusinessCheckException; + + /** + * 添加分佣提成规则 + * + * @param commissionRule + * @throws BusinessCheckException + */ + MtCommissionRule addCommissionRule(CommissionRuleParam commissionRule) throws BusinessCheckException; + + /** + * 根据ID获取规则信息 + * + * @param id + * @throws BusinessCheckException + */ + CommissionRuleDto queryCommissionRuleById(Integer id) throws BusinessCheckException; + + /** + * 更新分佣提成规则 + * + * @param commissionRule + * @throws BusinessCheckException + * */ + MtCommissionRule updateCommissionRule(CommissionRuleParam commissionRule) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java b/fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java new file mode 100644 index 0000000..7db8eab --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java @@ -0,0 +1,47 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.ConfirmLogDto; +import com.fuint.common.param.ConfirmLogPage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtConfirmLog; + +import java.util.Date; +import java.util.List; + +/** + * 核销记录业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface ConfirmLogService extends IService { + + /** + * 分页查询会员卡券核销列表 + * + * @param confirmLogPage + * @return + */ + PaginationResponse queryConfirmLogListByPagination(ConfirmLogPage confirmLogPage) throws BusinessCheckException; + + /** + * 获取卡券核销次数 + * @param userCouponId + * @return + * */ + Long getConfirmNum(Integer userCouponId) throws BusinessCheckException; + + /** + * 获取卡券核销列表 + * @param userCouponId + * @return + * */ + List getConfirmList(Integer userCouponId) throws BusinessCheckException; + + /** + * 获取核销总数 + * */ + Long getConfirmCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java b/fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java new file mode 100644 index 0000000..a3703b2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java @@ -0,0 +1,93 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.ReqCouponGroupDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtCouponGroup; +import org.springframework.web.multipart.MultipartFile; +import java.math.BigDecimal; + +/** + * 卡券分组业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CouponGroupService extends IService { + + /** + * 分页查询分组列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryCouponGroupListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加卡券分组 + * + * @param reqCouponGroupDto + * @throws BusinessCheckException + */ + MtCouponGroup addCouponGroup(ReqCouponGroupDto reqCouponGroupDto) throws BusinessCheckException; + + /** + * 修改卡券分组 + * + * @param reqCouponGroupDto + * @throws BusinessCheckException + */ + MtCouponGroup updateCouponGroup(ReqCouponGroupDto reqCouponGroupDto) throws BusinessCheckException; + + /** + * 根据组ID获取分组信息 + * + * @param id 分组ID + * @throws BusinessCheckException + */ + MtCouponGroup queryCouponGroupById(Integer id) throws BusinessCheckException; + + /** + * 根据分组ID 删除分组信息 + * + * @param id 分组ID + * @param operator 操作人 + * @throws BusinessCheckException + */ + void deleteCouponGroup(Integer id, String operator) throws BusinessCheckException; + + /** + * 根据分组ID 获取券种类数量 + * + * @param id 分组ID + * @throws BusinessCheckException + */ + Integer getCouponNum(Integer id) throws BusinessCheckException; + + /** + * 根据分组ID 获取券总价值 + * + * @param id 分组ID + * @throws BusinessCheckException + */ + BigDecimal getCouponMoney(Integer id) throws BusinessCheckException; + + /** + * 获取已发放套数 + * + * @param id 分组ID + * @throws BusinessCheckException + * */ + Integer getSendNum(Integer id) throws BusinessCheckException; + + /** + * 导入发券列表 + * + * @param file excel文件 + * @param operator 操作者 + * */ + String importSendCoupon(MultipartFile file, String operator, String filePath) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/CouponService.java b/fuint-application/src/main/java/com/fuint/common/service/CouponService.java new file mode 100644 index 0000000..8db31e1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/CouponService.java @@ -0,0 +1,179 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.ReqCouponDto; +import com.fuint.common.param.CouponListParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtCoupon; +import com.fuint.repository.model.MtUserCoupon; +import java.math.BigDecimal; +import java.text.ParseException; +import java.util.List; + +/** + * 卡券业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface CouponService extends IService { + + /** + * 分页查询卡券列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryCouponListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 保存卡券 + * + * @param reqCouponDto + * @throws BusinessCheckException + * @return + */ + MtCoupon saveCoupon(ReqCouponDto reqCouponDto) throws BusinessCheckException, ParseException; + + /** + * 根据ID获取卡券信息 + * + * @param id 卡券ID + * @throws BusinessCheckException + * @return + */ + MtCoupon queryCouponById(Integer id) throws BusinessCheckException; + + /** + * 删除卡券信息 + * + * @param id 卡券ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteCoupon(Long id, String operator) throws BusinessCheckException; + + /** + * 获取卡券列表 + * @param couponListParam 查询参数 + * @throws BusinessCheckException + * */ + ResponseObject findCouponList(CouponListParam couponListParam) throws BusinessCheckException; + + /** + * 发放卡券 + * + * @param couponId 券ID + * @param userId 会员ID + * @param num 发放套数 + * @param sendMessage 是否发送消息 + * @param uuid 批次号 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + ResponseObject sendCoupon(Integer couponId, Integer userId, Integer num, Boolean sendMessage, String uuid, String operator) throws BusinessCheckException; + + /** + * 发放卡券 + * + * @param couponId 券ID + * @param userIds 会员ID + * @param num 发放套数 + * @param uuid 批次号 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + Boolean batchSendCoupon(Integer couponId, List userIds, Integer num, String uuid, String operator) throws BusinessCheckException; + + /** + * 根据分组获取卡券列表 + * @param groupId 查询参数 + * @throws BusinessCheckException + * @return + * */ + List queryCouponListByGroupId(Integer groupId) throws BusinessCheckException; + + /** + * 核销卡券 + * @param userCouponId 用户券ID + * @param userId 核销会员ID + * @param storeId 店铺ID + * @param orderId 订单ID + * @param amount 核销金额 + * @param remark 核销备注 + * @throws BusinessCheckException + * @return + * */ + String useCoupon(Integer userCouponId, Integer userId, Integer storeId, Integer orderId, BigDecimal amount, String remark) throws BusinessCheckException; + + /** + * 根据券ID删除个人卡券 + * + * @param id 券ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteUserCoupon(Integer id, String operator) throws BusinessCheckException; + + /** + * 根据券ID撤销个人卡券消费流水 + * + * @param id 消费流水ID + * @param userCouponId 用户卡券ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void rollbackUserCoupon(Integer id, Integer userCouponId,String operator) throws BusinessCheckException; + + /** + * 根据ID获取用户卡券信息 + * @param userCouponId 查询参数 + * @throws BusinessCheckException + * @return + * */ + MtUserCoupon queryUserCouponById(Integer userCouponId) throws BusinessCheckException; + + /** + * 根据批次撤销卡券 + * @param id ID + * @param uuid 批次ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void removeUserCoupon(Long id, String uuid, String operator) throws BusinessCheckException; + + /** + * 判断卡券码是否过期 + * @param code 券码 + * @return + * */ + boolean codeExpired(String code); + + /** + * 判断卡券是否有效 + * + * @param coupon + * @param userCoupon + * @return + * */ + boolean isCouponEffective(MtCoupon coupon, MtUserCoupon userCoupon); + + /** + * 删除我的卡券 + * + * @param userCouponId + * @param userId + * @return + * */ + boolean removeCoupon(Integer userCouponId, Integer userId) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/DutyService.java b/fuint-application/src/main/java/com/fuint/common/service/DutyService.java new file mode 100644 index 0000000..08837a8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/DutyService.java @@ -0,0 +1,121 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.DutyStatusRequest; +import com.fuint.repository.model.TDuty; +import com.fuint.repository.model.TSource; +import com.fuint.common.domain.TreeNode; +import java.util.List; + +/** + * 角色服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface DutyService extends IService { + + /** + * 角色保存方法 + * + * @param duty 角色信息 + * @return + */ + void saveDuty(TDuty duty, List sources) throws BusinessCheckException; + + /** + * 获取有效的角色集合 + * + * @param merchantId 商户ID + * @param accountId 账号ID + * @return + */ + List getAvailableRoles(Integer merchantId, Integer accountId); + + /** + * 根据ID获取角色实体 + * + * @param roleId 角色ID + * @return + */ + TDuty getRoleById(Long roleId); + + /** + * 角色信息分页查询 + * + * @param paginationRequest 分页查询请求对象 + * @return 分页查询结果对象 + */ + PaginationResponse findDutiesByPagination(PaginationRequest paginationRequest); + + /** + * 根据ID数组获取角色集合 + * + * @param ids 角色ID + * @return + */ + List findDatasByIds(String[] ids); + + /** + * 删除方法 + * + * @param merchantId 商户ID + * @param dutyId 角色ID + * @return + */ + void deleteDuty(Integer merchantId, long dutyId) throws BusinessCheckException; + + /** + * 更新状态 + * + * @param merchantId + * @param dutyStatusRequest + * @return + */ + void updateStatus(Integer merchantId, DutyStatusRequest dutyStatusRequest) throws BusinessCheckException; + + /** + * 修改角色 + * + * @param tduty 角色信息 + * @param sources 菜单列表 + * @return + */ + void updateDuty(TDuty tduty, List sources) throws BusinessCheckException; + + /** + * 根据角色名称合状态查询角色 + * + * @param merchantId 商户ID + * @param name 角色名称 + * @return + */ + TDuty findByName(Integer merchantId, String name); + + /** + * 根据角色名称获取已经分配的菜单ID集合 + * + * @param dutyId 角色ID + * @return + */ + List getSourceIdsByDutyId(Integer dutyId); + + /** + * 获取角色的树形结构 + * + * @param merchantId 商户ID + * @return + */ + List getDutyTree(Integer merchantId); + + /** + * 根据账户获取角色 + * + * @param accountId 账号ID + * @return + */ + List findDutiesByAccountId(Integer accountId); +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java b/fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java new file mode 100644 index 0000000..77a1c2a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java @@ -0,0 +1,58 @@ +package com.fuint.common.service; + +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.TGenCode; + +/** + * 代码生成服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface GenCodeService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryGenCodeListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加生成代码 + * + * @param tGenCode 代码参数 + * @throws BusinessCheckException + * @return + */ + TGenCode addGenCode(TGenCode tGenCode) throws BusinessCheckException; + + /** + * 根据ID获取信息 + * + * @param id + * @throws BusinessCheckException + * @return + */ + TGenCode queryGenCodeById(Integer id) throws BusinessCheckException; + + /** + * 更新生成代码 + * @param tGenCode + * @throws BusinessCheckException + * @return + * */ + TGenCode updateGenCode(TGenCode tGenCode) throws BusinessCheckException; + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return + */ + void generatorCode(String tableName); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/GiveService.java b/fuint-application/src/main/java/com/fuint/common/service/GiveService.java new file mode 100644 index 0000000..05bf3dc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/GiveService.java @@ -0,0 +1,58 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.GiveDto; +import com.fuint.common.param.GiveParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtGive; +import com.fuint.repository.model.MtGiveItem; + +import java.util.List; +import java.util.Map; + +/** + * 转赠业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface GiveService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryGiveListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 转赠卡券 + * + * @param giveParam + * @throws BusinessCheckException + * @return + */ + ResponseObject addGive(GiveParam giveParam) throws BusinessCheckException; + + /** + * 根据组ID获取信息 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + MtGive queryGiveById(Long id) throws BusinessCheckException; + + /** + * 根据条件搜索转赠详情 + * + * @param params + * @throws BusinessCheckException + * @return + * */ + List queryItemByParams(Map params); +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/GoodsService.java b/fuint-application/src/main/java/com/fuint/common/service/GoodsService.java new file mode 100644 index 0000000..6d56c74 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/GoodsService.java @@ -0,0 +1,175 @@ +package com.fuint.common.service; + +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.GoodsDto; +import com.fuint.common.dto.GoodsSpecValueDto; +import com.fuint.common.dto.GoodsTopDto; +import com.fuint.common.param.GoodsListParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtGoods; +import com.fuint.repository.model.MtGoodsSku; +import com.fuint.repository.model.MtGoodsSpec; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 商品业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface GoodsService { + + /** + * 分页查询商品列表 + * + * @param param + * @return + */ + PaginationResponse queryGoodsListByPagination(GoodsListParam param) throws BusinessCheckException; + + /** + * 保存商品 + * + * @param reqDto 商品信息 + * @param storeIds 分配店铺 + * @throws BusinessCheckException + * @return + */ + MtGoods saveGoods(MtGoods reqDto, String storeIds) throws BusinessCheckException; + + /** + * 更新商品状态 + * + * @param goodsId 商品ID + * @param status 状态 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + Boolean updateStatus(Integer goodsId, String status, String operator) throws BusinessCheckException; + + /** + * 根据ID获取商品信息 + * + * @param id 商品ID + * @throws BusinessCheckException + * @return + */ + MtGoods queryGoodsById(Integer id) throws BusinessCheckException; + + /** + * 根据编码获取商品信息 + * + * @param merchantId 商户ID + * @param goodsNo 商品编码 + * @throws BusinessCheckException + * @return + */ + MtGoods queryGoodsByGoodsNo(Integer merchantId, String goodsNo) throws BusinessCheckException; + + /** + * 根据条码获取sku信息 + * + * @param skuNo skuNo + * @throws BusinessCheckException + * @return + * */ + MtGoodsSku getSkuInfoBySkuNo(String skuNo) throws BusinessCheckException; + + /** + * 根据ID获取商品详情 + * + * @param id 商品ID + * @return + */ + GoodsDto getGoodsDetail(Integer id, boolean getDeleteSpec); + + /** + * 获取店铺的商品列表 + * + * @param storeId 店铺ID + * @param keyword 关键字 + * @param platform 平台 + * @param cateId 分类ID + * @param page 当前页码 + * @param pageSize 每页数量 + * @return + * */ + Map getStoreGoodsList(Integer storeId, String keyword, String platform, Integer cateId, Integer page, Integer pageSize) throws BusinessCheckException; + + /** + * 根据skuId获取规格列表 + * + * @param skuId + * @return + * */ + List getSpecListBySkuId(Integer skuId) throws BusinessCheckException; + + /** + * 获取规格详情 + * + * @param specId 规格ID + * @return + * */ + MtGoodsSpec getSpecDetail(Integer specId); + + /** + * 更新已售数量 + * + * @param goodsId 商品ID + * @param saleNum 销售数量 + * @return + * */ + Boolean updateInitSale(Integer goodsId, Double saleNum); + + /** + * 获取选择商品列表 + * + * @param params 查询参数 + * @return + */ + PaginationResponse selectGoodsList(Map params) throws BusinessCheckException; + + /** + * 获取商品销售排行榜 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + List getGoodsSaleTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime); + + /** + * 获取商品分配的店铺 + * + * @param goodsId 商品ID + * @return + * */ + String getStoreIds(Integer goodsId); + + /** + * 导入商品 + * + * @param file excel文件 + * @param accountInfo 操作者 + * @param filePath 文件地址 + * */ + Boolean importGoods(MultipartFile file, AccountInfo accountInfo, String filePath) throws BusinessCheckException; + + /** + * 获取规格ID + * + * @param goodsId 商品ID + * @param specName 规格名称 + * @param specValue 规格值 + * */ + Integer getSpecId(Integer goodsId, String specName, String specValue); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/InvoiceService.java b/fuint-application/src/main/java/com/fuint/common/service/InvoiceService.java new file mode 100644 index 0000000..92d2fd8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/InvoiceService.java @@ -0,0 +1,88 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.param.InvoiceParam; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtInvoice; +import com.fuint.framework.exception.BusinessCheckException; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 发票业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface InvoiceService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryInvoiceListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加发票 + * + * @param invoice + * @throws BusinessCheckException + * @return + */ + MtInvoice addInvoice(InvoiceParam invoice) throws BusinessCheckException; + + /** + * 根据ID获取发票信息 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + MtInvoice queryInvoiceById(Integer id) throws BusinessCheckException; + + /** + * 根据ID删除发票 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteInvoice(Integer id, String operator) throws BusinessCheckException; + + /** + * 更新发票信息 + * + * @param invoice + * @throws BusinessCheckException + * @return + * */ + MtInvoice updateInvoice(InvoiceParam invoice) throws BusinessCheckException; + + /** + * 根据条件搜索发票 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + List queryInvoiceListByParams(Map params) throws BusinessCheckException; + + /** + * 获取开票金额 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + */ + BigDecimal getInvoiceTotalAmount(Integer merchantId, Integer storeId, Date beginTime, Date endTime); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java b/fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java new file mode 100644 index 0000000..6872adf --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java @@ -0,0 +1,59 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.MemberGroupDto; +import com.fuint.common.dto.UserGroupDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtUserGroup; + +/** + * 会员分组业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MemberGroupService extends IService { + + /** + * 分页查询分组列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryMemberGroupListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 新增会员分组 + * + * @param memberGroupDto + * @throws BusinessCheckException + */ + MtUserGroup addMemberGroup(MemberGroupDto memberGroupDto) throws BusinessCheckException; + + /** + * 修改卡券分组 + * + * @param memberGroupDto + * @throws BusinessCheckException + */ + MtUserGroup updateMemberGroup(MemberGroupDto memberGroupDto) throws BusinessCheckException; + + /** + * 根据组ID获取分组信息 + * + * @param id 分组ID + * @throws BusinessCheckException + */ + MtUserGroup queryMemberGroupById(Integer id) throws BusinessCheckException; + + /** + * 根据分组ID删除分组信息 + * + * @param id 分组ID + * @param operator 操作人 + * @throws BusinessCheckException + */ + void deleteMemberGroup(Integer id, String operator) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/MemberService.java b/fuint-application/src/main/java/com/fuint/common/service/MemberService.java new file mode 100644 index 0000000..277852b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/MemberService.java @@ -0,0 +1,276 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.alibaba.fastjson.JSONObject; +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.GroupMemberDto; +import com.fuint.common.dto.MemberTopDto; +import com.fuint.common.dto.UserDto; +import com.fuint.common.param.MemberPage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtUser; +import com.fuint.repository.model.MtUserGrade; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.text.ParseException; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 会员服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MemberService extends IService { + + /** + * 更新活跃时间 + * + * @param userId 会员ID + * @param ip IP地址 + * @return + * */ + Boolean updateActiveTime(Integer userId, String ip) throws BusinessCheckException; + + /** + * 获取当前操作会员信息 + * + * @param userId 会员ID + * @param accessToken + * @return + * */ + MtUser getCurrentUserInfo(HttpServletRequest request, Integer userId, String accessToken) throws BusinessCheckException; + + /** + * 分页查询会员列表 + * + * @param memberPage + * @return + */ + PaginationResponse queryMemberListByPagination(MemberPage memberPage) throws BusinessCheckException; + + /** + * 添加会员 + * + * @param memberInfo 会员信息 + * @param shareId 分享用户ID + * @throws BusinessCheckException + * @return + */ + MtUser addMember(MtUser memberInfo, String shareId) throws BusinessCheckException; + + /** + * 编辑会员 + * + * @param reqUserDto 会员信息 + * @param modifyPassword 修改密码 + * @throws BusinessCheckException + * @return + */ + MtUser updateMember(MtUser reqUserDto, boolean modifyPassword) throws BusinessCheckException; + + /** + * 通过手机号添加会员 + * + * @param merchantId 商户ID + * @param mobile 手机号 + * @param shareId 分享用户ID + * @param ip IP地址 + * @throws BusinessCheckException + * @return + */ + MtUser addMemberByMobile(Integer merchantId, String mobile, String shareId, String ip) throws BusinessCheckException; + + /** + * 根据会员ID获取会员信息 + * + * @param id 会员ID + * @throws BusinessCheckException + * @return + */ + MtUser queryMemberById(Integer id) throws BusinessCheckException; + + /** + * 根据会员名称获取会员信息 + * + * @param merchantId 商户ID + * @param name 会员名称 + * @throws BusinessCheckException + * @return + */ + MtUser queryMemberByName(Integer merchantId, String name) throws BusinessCheckException; + + /** + * 根据会员ID获取会员信息 + * + * @param merchantId 商户ID + * @param openId 微信openId + * @throws BusinessCheckException + * @return + */ + MtUser queryMemberByOpenId(Integer merchantId, String openId, JSONObject userInfo) throws BusinessCheckException; + + /** + * 根据会员组ID获取会员组信息 + * + * @param id 会员组ID + * @throws BusinessCheckException + * @return + */ + MtUserGrade queryMemberGradeByGradeId(Integer id) throws BusinessCheckException; + + /** + * 根据会员手机获取会员信息 + * + * @param merchantId 商户ID + * @param mobile 会员手机 + * @throws BusinessCheckException + * @return + */ + MtUser queryMemberByMobile(Integer merchantId, String mobile) throws BusinessCheckException; + + /** + * 根据会员号获取会员信息 + * + * @param merchantId 商户ID + * @param userNo 会员号 + * @throws BusinessCheckException + * @return + */ + MtUser queryMemberByUserNo(Integer merchantId, String userNo) throws BusinessCheckException; + + /** + * 根据会员ID删除会员信息 + * + * @param id 会员ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + Integer deleteMember(Integer id, String operator) throws BusinessCheckException; + + /** + * 根据条件搜索会员分组 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + List queryMemberGradeByParams(Map params) throws BusinessCheckException; + + /** + * 获取会员数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @throws BusinessCheckException + * @return + * */ + Long getUserCount(Integer merchantId, Integer storeId) throws BusinessCheckException; + + /** + * 获取会员数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @throws BusinessCheckException + * @return + * */ + Long getUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException; + + /** + * 获取活跃会员数量 + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @throws BusinessCheckException + * @return + * */ + Long getActiveUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException; + + /** + * 重置手机号 + * + * @param mobile 手机号码 + * @param userId 会员ID + * @throws BusinessCheckException + * @return + */ + void resetMobile(String mobile, Integer userId) throws BusinessCheckException; + + /** + * 获取会员消费排行榜 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + List getMemberConsumeTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime); + + /** + * 查找会员列表 + * + * @param merchantId 商户ID + * @param keyword 关键字 + * @param groupIds 分组ID + * @param page 当前页码 + * @param pageSize 每页数量 + * @return + * */ + List searchMembers(Integer merchantId, String keyword, String groupIds, Integer page, Integer pageSize); + + /** + * 查找会员列表 + * + * @param merchantId 商户ID + * @param keyword 关键字 + * @return + * */ + List searchMembers(Integer merchantId, String keyword); + + /** + * 设定安全的密码 + * + * @param password 密码(明文) + * @param salt 随机因子 + * @return + */ + String enCodePassword(String password, String salt); + + /** + * 获取加密密码 + * + * @param password 密码(密文) + * @param salt 随机因子 + * @return + * */ + String deCodePassword(String password, String salt); + + /** + * 获取会员ID列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + List getUserIdList(Integer merchantId, Integer storeId); + + /** + * 导入会员 + * + * @param file excel文件 + * @param accountInfo 操作者 + * @param filePath 文件地址 + * */ + Boolean importMember(MultipartFile file, AccountInfo accountInfo, String filePath) throws BusinessCheckException, ParseException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/MerchantService.java b/fuint-application/src/main/java/com/fuint/common/service/MerchantService.java new file mode 100644 index 0000000..2c6077e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/MerchantService.java @@ -0,0 +1,119 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.MerchantDto; +import com.fuint.common.dto.MerchantSettingDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.merchantApi.request.MerchantSettingParam; +import com.fuint.repository.model.MtMerchant; +import java.util.List; +import java.util.Map; + +/** + * 商户业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MerchantService extends IService { + + /** + * 分页查询商户列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryMerchantListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 保存商户信息 + * + * @param mtMerchant + * @throws BusinessCheckException + * @return + */ + MtMerchant saveMerchant(MtMerchant mtMerchant) throws BusinessCheckException; + + /** + * 根据ID获取商户信息 + * + * @param id 商户ID + * @throws BusinessCheckException + * @return + */ + MtMerchant queryMerchantById(Integer id) throws BusinessCheckException; + + /** + * 根据名称获取商户信息 + * + * @param name 商户名称 + * @throws BusinessCheckException + * @return + */ + MtMerchant queryMerchantByName(String name) throws BusinessCheckException; + + /** + * 根据商户号获取商户信息 + * + * @param merchantNo 商户号 + * @return + */ + MtMerchant queryMerchantByNo(String merchantNo); + + /** + * 根据商户号获取商户ID + * + * @param merchantNo 商户号 + * @return + */ + Integer getMerchantId(String merchantNo); + + /** + * 更新商户状态 + * + * @param id 商户ID + * @param operator 操作人 + * @param status 状态 + * @throws BusinessCheckException + * @return + */ + void updateStatus(Integer id, String operator, String status) throws BusinessCheckException; + + /** + * 根据条件查询商户 + * + * @param params 查询参数 + * @return + * */ + List queryMerchantByParams(Map params) throws BusinessCheckException; + + /** + * 查询我的商户列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param status 状态 + * @return + * */ + List getMyMerchantList(Integer merchantId, Integer storeId, String status) throws BusinessCheckException; + + /** + * 获取商户信息 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + MerchantSettingDto getMerchantSettingInfo(Integer merchantId, Integer storeId) throws BusinessCheckException; + + /** + * 保存商户设置信息 + * + * @param params 商户设置项 + * @return + * */ + MerchantSettingDto saveMerchantSetting(MerchantSettingParam params) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/MessageService.java b/fuint-application/src/main/java/com/fuint/common/service/MessageService.java new file mode 100644 index 0000000..fb7ac5c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/MessageService.java @@ -0,0 +1,58 @@ +package com.fuint.common.service; + +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.MtMessage; +import java.util.List; + +/** + * 消息业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MessageService { + + /** + * 添加消息 + * + * @param reqMsgDto + * @throws BusinessCheckException + * @return + */ + void addMessage(MtMessage reqMsgDto) throws BusinessCheckException; + + /** + * 置为已读 + * + * @param msgId + * @throws BusinessCheckException + * @return + */ + void readMessage(Integer msgId) throws BusinessCheckException; + + /** + * 置为发送 + * + * @param msgId + * @throws BusinessCheckException + * @return + */ + void sendMessage(Integer msgId, boolean isRead) throws BusinessCheckException; + + /** + * 获取最新一条未读消息 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + */ + MtMessage getOne(Integer userId) throws BusinessCheckException; + + /** + * 获取需要发送的消息 + * + * @throws BusinessCheckException + * @return + * */ + List getNeedSendList() throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java b/fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java new file mode 100644 index 0000000..56ee934 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java @@ -0,0 +1,73 @@ +package com.fuint.common.service; + +import com.fuint.common.dto.OpenGiftDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtOpenGift; +import java.util.Map; + +/** + * 开卡赠礼接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface OpenGiftService { + + /** + * 获取用户的开卡赠礼 + * + * @param paramMap 查询参数 + * @throws BusinessCheckException + * @return + * */ + ResponseObject getOpenGiftList(Map paramMap) throws BusinessCheckException; + + /** + * 新增开卡赠礼 + * + * @param reqDto + * @throws BusinessCheckException + * @return + */ + MtOpenGift addOpenGift(MtOpenGift reqDto) throws BusinessCheckException; + + /** + * 根据ID获取开卡赠礼 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + OpenGiftDto getOpenGiftDetail(Integer id) throws BusinessCheckException; + + /** + * 根据ID删除开卡赠礼 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteOpenGift(Integer id, String operator) throws BusinessCheckException; + + /** + * 更新开卡赠礼 + * + * @param reqDto + * @throws BusinessCheckException + * @return + * */ + MtOpenGift updateOpenGift(MtOpenGift reqDto) throws BusinessCheckException; + + /** + * 开卡赠礼 + * + * @param userId 会员ID + * @param gradeId 会员等级 + * @param isNewMember 是否新会员 + * @throws BusinessCheckException + * @return + * */ + Boolean openGift(Integer userId, Integer gradeId, boolean isNewMember) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/OrderService.java b/fuint-application/src/main/java/com/fuint/common/service/OrderService.java new file mode 100644 index 0000000..af7888f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/OrderService.java @@ -0,0 +1,259 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.UserOrderDto; +import com.fuint.common.dto.OrderDto; +import com.fuint.common.param.OrderListParam; +import com.fuint.common.param.RechargeParam; +import com.fuint.common.param.SettlementParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtCart; +import com.fuint.repository.model.MtOrder; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface OrderService extends IService { + + /** + * 获取用户的订单 + * + * @param orderListParam + * @throws BusinessCheckException + * @return + * */ + PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException; + + /** + * 创建订单 + * + * @param orderDto + * @throws BusinessCheckException + * @return + */ + MtOrder saveOrder(OrderDto orderDto) throws BusinessCheckException; + + /** + * 订单提交结算 + * + * @param request 请求参数 + * @param settlementParam 结算参数 + * @throws BusinessCheckException + * @return + * */ + Map doSettle(HttpServletRequest request, SettlementParam settlementParam) throws BusinessCheckException; + + /** + * 获取订单详情 + * + * @param id 订单ID + * @throws BusinessCheckException + * @return + */ + MtOrder getOrderInfo(Integer id) throws BusinessCheckException; + + /** + * 根据ID获取订单 + * + * @param id 订单ID + * @throws BusinessCheckException + * @return + */ + UserOrderDto getOrderById(Integer id) throws BusinessCheckException; + + /** + * 根据ID获取订单 + * + * @param id + * @throws BusinessCheckException + * @return + */ + UserOrderDto getMyOrderById(Integer id) throws BusinessCheckException; + + /** + * 取消订单 + * + * @param orderId 订单ID + * @param remark 取消备注 + * @throws BusinessCheckException + * @return + * */ + MtOrder cancelOrder(Integer orderId, String remark) throws BusinessCheckException; + + /** + * 根据订单ID删除 + * + * @param orderId 订单ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteOrder(Integer orderId, String operator) throws BusinessCheckException; + + /** + * 根据订单号获取订单 + * + * @param orderSn + * @throws BusinessCheckException + * @return + */ + UserOrderDto getOrderByOrderSn(String orderSn) throws BusinessCheckException; + + /** + * 根据订单号获取订单 + * + * @param orderSn 订单号 + * @return + * */ + MtOrder getOrderInfoByOrderSn(String orderSn); + + /** + * 更新订单 + * + * @param reqDto + * @throws BusinessCheckException + * @return + * */ + MtOrder updateOrder(OrderDto reqDto) throws BusinessCheckException; + + /** + * 更新订单 + * + * @param mtOrder + * @throws BusinessCheckException + * @return + * */ + MtOrder updateOrder(MtOrder mtOrder) throws BusinessCheckException; + + /** + * 把订单置为已支付 + * + * @param orderId + * @param payAmount + * @throws BusinessCheckException + * @return + * */ + Boolean setOrderPayed(Integer orderId, BigDecimal payAmount) throws BusinessCheckException; + + /** + * 根据条件搜索订单 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + List getOrderListByParams(Map params) throws BusinessCheckException; + + /** + * 获取订单总数 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @throws BusinessCheckException + * @return + * */ + BigDecimal getOrderCount(Integer merchantId, Integer storeId) throws BusinessCheckException; + + /** + * 获取订单数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @throws BusinessCheckException + * @return + * */ + BigDecimal getOrderCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException; + + /** + * 计算购物车 + * + * @param merchantId 商户ID + * @param userId 会员ID + * @param cartList 购物车列表 + * @param couponId 使用的卡券ID + * @param isUsePoint 是否使用积分抵扣 + * @param platform 平台 h5 + * @param orderMode 订单模式,自取或配送 + * @throws BusinessCheckException + * @return + * */ + Map calculateCartGoods(Integer merchantId, Integer userId, List cartList, Integer couponId, boolean isUsePoint, String platform, String orderMode) throws BusinessCheckException; + + /** + * 获取支付金额 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @throws BusinessCheckException + * @return + * */ + BigDecimal getPayMoney(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException; + + /** + * 获取支付人数 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @throws BusinessCheckException + * @return + * */ + Integer getPayUserCount(Integer merchantId, Integer storeId) throws BusinessCheckException; + + /** + * 获取支付金额 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @throws BusinessCheckException + * @return + * */ + BigDecimal getPayMoney(Integer merchantId, Integer storeId) throws BusinessCheckException; + + /** + * 获取会员支付金额 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + * */ + BigDecimal getUserPayMoney(Integer userId) throws BusinessCheckException; + + /** + * 获取会员订单数 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + * */ + Integer getUserPayOrderCount(Integer userId) throws BusinessCheckException; + + /** + * 获取等待分佣的订单列表 + * + * @param dateTime 时间 + * @throws BusinessCheckException + * @return + * */ + List getTobeCommissionOrderList(String dateTime) throws BusinessCheckException; + + /** + * 提交充值订单 + * + * @param rechargeParam 充值参数 + * @return + * */ + MtOrder doRecharge(HttpServletRequest request, RechargeParam rechargeParam) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/PaymentService.java b/fuint-application/src/main/java/com/fuint/common/service/PaymentService.java new file mode 100644 index 0000000..635187c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/PaymentService.java @@ -0,0 +1,50 @@ +package com.fuint.common.service; + +import com.fuint.common.dto.UserOrderDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtUser; +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 支付相关业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface PaymentService { + + /** + * 创建预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP地址 + * @param platform 支付平台 + * @param isWechat 是否微信客户端 + * @return + * */ + ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException; + + /** + * 支付成功回调 + * + * @param orderInfo 订单信息 + * @return + * */ + Boolean paymentCallback(UserOrderDto orderInfo) throws BusinessCheckException; + + /** + * 订单支付 + * + * @param request 请求参数 + * @return + * */ + Map doPay(HttpServletRequest request) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/PointService.java b/fuint-application/src/main/java/com/fuint/common/service/PointService.java new file mode 100644 index 0000000..250a61c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/PointService.java @@ -0,0 +1,46 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.PointDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtPoint; + +/** + * 积分业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface PointService extends IService { + + /** + * 分页查询积分列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryPointListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加积分 + * + * @param reqPointDto + * @throws BusinessCheckException + * @return + */ + void addPoint(MtPoint reqPointDto) throws BusinessCheckException; + + /** + * 转赠积分 + * + * @param userId + * @param mobile + * @param amount + * @param remark + * @throws BusinessCheckException + * @return + */ + boolean doGift(Integer userId, String mobile, Integer amount, String remark) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/PrinterService.java b/fuint-application/src/main/java/com/fuint/common/service/PrinterService.java new file mode 100644 index 0000000..b79dede --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/PrinterService.java @@ -0,0 +1,81 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.UserOrderDto; +import com.fuint.common.param.PrinterPage; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtPrinter; +import com.fuint.framework.exception.BusinessCheckException; +import java.util.List; +import java.util.Map; + +/** + * 打印机业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface PrinterService extends IService { + + /** + * 分页查询列表 + * + * @param printerPage + * @return + */ + PaginationResponse queryPrinterListByPagination(PrinterPage printerPage) throws BusinessCheckException; + + /** + * 添加打印机 + * + * @param mtPrinter + * @throws BusinessCheckException + * @return + */ + MtPrinter addPrinter(MtPrinter mtPrinter) throws BusinessCheckException; + + /** + * 打印订单 + * + * @param orderInfo 订单信息 + * @param autoPrint 自动打印 + * @return + * */ + Boolean printOrder(UserOrderDto orderInfo, boolean autoPrint) throws Exception; + + /** + * 根据ID获取打印机信息 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + MtPrinter queryPrinterById(Integer id) throws BusinessCheckException; + + /** + * 根据ID删除打印机 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deletePrinter(Integer id, String operator) throws BusinessCheckException; + + /** + * 更新打印机 + * @param mtPrinter + * @throws BusinessCheckException + * @return + * */ + MtPrinter updatePrinter(MtPrinter mtPrinter) throws BusinessCheckException; + + /** + * 根据条件搜索打印机 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + List queryPrinterListByParams(Map params) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/RefundService.java b/fuint-application/src/main/java/com/fuint/common/service/RefundService.java new file mode 100644 index 0000000..07b08ce --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/RefundService.java @@ -0,0 +1,94 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.RefundDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtRefund; +import java.util.Date; +import java.util.Map; + +/** + * 售后业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface RefundService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse getRefundListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 获取用户的售后订单 + * @param paramMap 查询参数 + * @throws BusinessCheckException + * */ + ResponseObject getUserRefundList(Map paramMap) throws BusinessCheckException; + + /** + * 创建售后订单 + * + * @param reqDto + * @throws BusinessCheckException + */ + MtRefund createRefund(RefundDto reqDto) throws BusinessCheckException; + + /** + * 根据ID获取售后订单信息 + * + * @param id ID + * @throws BusinessCheckException + */ + RefundDto getRefundById(Integer id) throws BusinessCheckException; + + /** + * 根据订单ID获取售后订单信息 + * + * @param orderId + * @throws BusinessCheckException + */ + MtRefund getRefundByOrderId(Integer orderId) throws BusinessCheckException; + + /** + * 更新售后订单 + * @param reqDto + * @throws BusinessCheckException + * */ + MtRefund updateRefund(RefundDto reqDto) throws BusinessCheckException; + + /** + * 同意售后订单 + * @param reqDto + * @throws BusinessCheckException + * */ + MtRefund agreeRefund(RefundDto reqDto) throws BusinessCheckException; + + /** + * 发起退款 + * + * @param orderId 订单号 + * @param refundAmount 退款金额 + * @param remark 备注 + * @param accountInfo 操作人信息 + * throws BusinessCheckException; + * */ + Boolean doRefund(Integer orderId, String refundAmount, String remark, AccountInfo accountInfo) throws BusinessCheckException; + + /** + * 获取售后订单总数 + * + * @param beginTime + * @param endTime + * @return + * */ + Long getRefundCount(Date beginTime, Date endTime) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/SendLogService.java b/fuint-application/src/main/java/com/fuint/common/service/SendLogService.java new file mode 100644 index 0000000..061ee36 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/SendLogService.java @@ -0,0 +1,51 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.ReqSendLogDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtSendLog; + +/** + * 发券记录业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface SendLogService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse querySendLogListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加记录 + * + * @param reqSendLogDto + * @throws BusinessCheckException + */ + MtSendLog addSendLog(ReqSendLogDto reqSendLogDto) throws BusinessCheckException; + + /** + * 根据组ID获取发券记录 + * + * @param id ID + * @throws BusinessCheckException + */ + MtSendLog querySendLogById(Long id) throws BusinessCheckException; + + /** + * 删除发券记录 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + void deleteSendLog(Long id, String operator) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java b/fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java new file mode 100644 index 0000000..992c765 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java @@ -0,0 +1,37 @@ +package com.fuint.common.service; + +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtSmsSendedLog; +import java.util.List; +import java.util.Map; + +/** + * 发送短信接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface SendSmsService { + + /** + * 发送短信方法 + * + * @param merchantId 商户ID + * @param tUname 短信模板英文名称 + * @param phones 手机号码集合 + * @return Map> TRUE:推送成功的手机号码集合; + * FALSE:推送失败的手机号码集合 + * @throws Exception + */ + Map> sendSms(Integer merchantId, String tUname, List phones, Map contentParams) throws BusinessCheckException; + + /** + * 分页已发短信列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse querySmsListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/SettingService.java b/fuint-application/src/main/java/com/fuint/common/service/SettingService.java new file mode 100644 index 0000000..e978504 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/SettingService.java @@ -0,0 +1,94 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fuint.common.dto.NavigationDto; +import com.fuint.common.dto.ParamDto; +import com.fuint.repository.model.MtSetting; +import com.fuint.framework.exception.BusinessCheckException; +import java.util.List; + +/** + * 配置业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface SettingService extends IService { + + /** + * 删除配置 + * + * @param merchantId 商户ID + * @param type 类型 + * @param name 配置名称 + * @throws BusinessCheckException + */ + void removeSetting(Integer merchantId, String type, String name) throws BusinessCheckException; + + /** + * 保存配置 + * + * @param mtSetting + * @throws BusinessCheckException + */ + MtSetting saveSetting(MtSetting mtSetting) throws BusinessCheckException; + + /** + * 获取配置列表 + * + * @param type 类型 + * @throws BusinessCheckException + * @return + */ + List getSettingList(Integer merchantId, String type) throws BusinessCheckException; + + /** + * 根据配置名称获取配置信息 + * + * @param merchantId 商户ID + * @param type 类型 + * @param name 配置名称 + * @throws BusinessCheckException + */ + MtSetting querySettingByName(Integer merchantId, String type, String name) throws BusinessCheckException; + + /** + * 根据配置名称获取配置信息 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param type 类型 + * @param name 配置名称 + * @throws BusinessCheckException + */ + MtSetting querySettingByName(Integer merchantId, Integer storeId, String type, String name) throws BusinessCheckException; + + /** + * 获取系统上传文件的根路径 + * + * @return 本地配置或阿里云的oss域名 + * */ + String getUploadBasePath(); + + /** + * 获取支付方式列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param platform 平台 + * @return + * */ + List getPayTypeList(Integer merchantId, Integer storeId, String platform) throws BusinessCheckException; + + /** + * 获取导航栏 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param status 状态 + * @return + * */ + List getNavigation(Integer merchantId, Integer storeId, String status) throws JsonProcessingException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/SettlementService.java b/fuint-application/src/main/java/com/fuint/common/service/SettlementService.java new file mode 100644 index 0000000..a68925a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/SettlementService.java @@ -0,0 +1,54 @@ +package com.fuint.common.service; + +import com.fuint.common.dto.SettlementDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.SettlementRequest; +import com.fuint.repository.model.MtSettlement; + +/** + * 订单结算相关业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface SettlementService { + + /** + * 分页查询结算列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse querySettlementListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 提交结算 + * + * @param requestParam + * @throws BusinessCheckException + * @return + */ + Boolean submitSettlement(SettlementRequest requestParam) throws BusinessCheckException; + + /** + * 结算确认 + * + * @param settlementId + * @param operator + * @throws BusinessCheckException + * @return + */ + Boolean doConfirm(Integer settlementId, String operator) throws BusinessCheckException; + + /** + * 获取结算详情 + * + * @param settlementId + * @param page + * @param pageSize + * @return + * */ + SettlementDto getSettlementInfo(Integer settlementId, Integer page, Integer pageSize) throws BusinessCheckException; +} \ No newline at end of file diff --git a/fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java b/fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java new file mode 100644 index 0000000..75000f6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java @@ -0,0 +1,58 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.SmsTemplateDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtSmsTemplate; + +import java.util.List; +import java.util.Map; + +/** + * 短信模板业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface SmsTemplateService extends IService { + + /** + * 分页查询模板列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse querySmsTemplateListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加模板 + * + * @param reqSmsTemplateDto + * @throws BusinessCheckException + */ + MtSmsTemplate saveSmsTemplate(SmsTemplateDto reqSmsTemplateDto) throws BusinessCheckException; + + /** + * 删除短信模板 + * @param id + * @param operator + * @return + * */ + void deleteTemplate(Integer id, String operator) throws BusinessCheckException; + + /** + * 根据模板ID获取模板信息 + * + * @param id ID + * @throws BusinessCheckException + */ + MtSmsTemplate querySmsTemplateById(Integer id) throws BusinessCheckException; + + /** + * 根据条件搜索模板 + * */ + List querySmsTemplateByParams(Map params) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/SourceService.java b/fuint-application/src/main/java/com/fuint/common/service/SourceService.java new file mode 100644 index 0000000..05963b0 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/SourceService.java @@ -0,0 +1,103 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.domain.TreeSelect; +import com.fuint.common.vo.RouterVo; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.common.domain.TreeNode; +import com.fuint.repository.model.TSource; +import java.util.List; + +/** + * 菜单管理业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface SourceService extends IService { + + /** + * 获取有效的菜单集合 + * + * @param merchantId 商户ID + * @param status + * @return + */ + List getAvailableSources(Integer merchantId, String status); + + /** + * 获取菜单的属性结构 + * + * @param merchantId 商户ID + * @param status 状态 + * @return + */ + List getSourceTree(Integer merchantId, String status); + + /** + * 根据菜单ID集合查询菜单列表信息 + * + * @param ids + * @return + */ + List findDatasByIds(String[] ids); + + /** + * 根据会员ID获取菜单 + * + * @param merchantId 商户ID + * @param accountId 账号ID + * @throws BusinessCheckException + * @return + */ + List getMenuListByUserId(Integer merchantId, Integer accountId) throws BusinessCheckException; + + /** + * 构建前端路由所需要的菜单 + * + * @param treeNodes 菜单列表 + * @return 路由列表 + */ + List buildMenus(List treeNodes); + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + List buildMenuTree(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List buildMenuTreeSelect(List menus); + + /** + * 新增后台菜单 + * + * @param tSource + * @param accountId + * @return + */ + void addSource(TSource tSource, Integer accountId); + + /** + * 修改后台菜单 + * + * @param source + * */ + void editSource(TSource source); + + /** + * 删除菜单 + * + * @param source + * @param status + * @return + * */ + void deleteSource(TSource source, String status); +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/StaffService.java b/fuint-application/src/main/java/com/fuint/common/service/StaffService.java new file mode 100644 index 0000000..75f29e5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/StaffService.java @@ -0,0 +1,91 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.StaffDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtStaff; +import java.util.List; +import java.util.Map; + +/** + * 店铺员工业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface StaffService extends IService { + + /** + * 员工查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryStaffListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 保存员工信息 + * + * @param reqStaff 员工信息 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + MtStaff saveStaff(MtStaff reqStaff, String operator) throws BusinessCheckException; + + /** + * 根据ID获取店铺信息 + * + * @param id 员工id + * @throws BusinessCheckException + */ + MtStaff queryStaffById(Integer id) throws BusinessCheckException; + + /** + * 审核更改状态(禁用,审核通过) + * + * @param staffId 员工ID + * @param status 状态 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + Integer updateAuditedStatus(Integer staffId, String status, String operator) throws BusinessCheckException; + + /** + * 根据条件搜索员工 + * + * @param params 请求参数 + * @return + * */ + List queryStaffByParams(Map params) throws BusinessCheckException; + + /** + * 根据手机号获取员工信息 + * + * @param mobile 手机 + * @throws BusinessCheckException + * @return + */ + MtStaff queryStaffByMobile(String mobile) throws BusinessCheckException; + + /** + * 根据会员ID获取员工信息 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + */ + MtStaff queryStaffByUserId(Integer userId) throws BusinessCheckException; + + /** + * 根据手机号获取员工信息 + * + * @param mobile 手机 + * @throws BusinessCheckException + * @return + */ + StaffDto getStaffInfoByMobile(String mobile) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/StockService.java b/fuint-application/src/main/java/com/fuint/common/service/StockService.java new file mode 100644 index 0000000..1b1184f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/StockService.java @@ -0,0 +1,79 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.StockGoodsDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtStock; +import com.fuint.repository.model.MtStockItem; +import java.util.List; +import java.util.Map; + +/** + * 库存业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface StockService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryStockListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 新增库存管理记录 + * + * @param mtStock + * @param goodsList + * @throws BusinessCheckException + */ + ResponseObject addStock(MtStock mtStock, List goodsList) throws BusinessCheckException; + + /** + * 删除库存管理记录 + * + * @param id + * @param operator + * @return + * */ + void delete(Integer id, String operator) throws BusinessCheckException; + + /** + * 根据ID获取信息 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + MtStock queryStockById(Long id) throws BusinessCheckException; + + /** + * 根据条件搜索详情 + * + * @param params + * @throws BusinessCheckException + * @return + * */ + List queryItemByParams(Map params) throws BusinessCheckException; + + /** + * 生成出入库记录 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param goodsId 商品ID + * @param skuId 商品SKU ID + * @param type 类型,increase:入库,reduce:出库 + * @param num 数量 + * @param description 说明 + * @return + * */ + Boolean addStockRecord(Integer merchantId, Integer storeId, Integer goodsId, Integer skuId, String type, Double num, String description); +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/StoreService.java b/fuint-application/src/main/java/com/fuint/common/service/StoreService.java new file mode 100644 index 0000000..26f4471 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/StoreService.java @@ -0,0 +1,152 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.StoreDto; +import com.fuint.common.dto.StoreInfo; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtStore; +import java.util.List; +import java.util.Map; + +/** + * 店铺业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface StoreService extends IService { + + /** + * 分页查询店铺列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryStoreListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 保存店铺信息 + * + * @param reqStoreDto + * @throws BusinessCheckException + */ + MtStore saveStore(StoreDto reqStoreDto) throws BusinessCheckException; + + /** + * 获取系统默认店铺 + * + * @throws BusinessCheckException + * @return + */ + MtStore getDefaultStore(String merchantNo) throws BusinessCheckException; + + /** + * 根据店铺ID获取店铺信息 + * + * @param id 店铺ID + * @throws BusinessCheckException + * @return + */ + MtStore queryStoreById(Integer id) throws BusinessCheckException; + + /** + * 根据店铺名称获取店铺信息 + * + * @param storeName 店铺名称 + * @throws BusinessCheckException + */ + StoreDto queryStoreByName(String storeName) throws BusinessCheckException; + + /** + * 根据店铺ID查询店铺信息 + * + * @param id 店铺ID + * @return + * @throws BusinessCheckException + */ + StoreDto queryStoreDtoById(Integer id) throws BusinessCheckException; + + /** + * 更新店铺状态 + * + * @param id 店铺ID + * @param operator 操作人 + * @param status 状态 + * @throws BusinessCheckException + */ + void updateStatus(Integer id, String operator, String status) throws BusinessCheckException; + + /** + * 根据条件查询店铺列表 + * + * @param params 查询参数 + * @return + * */ + List queryStoresByParams(Map params) throws BusinessCheckException; + + /** + * 获取我的店铺列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param status 状态 + * @return + * */ + List getMyStoreList(Integer merchantId, Integer storeId, String status) throws BusinessCheckException; + + /** + * 根据距离远近查找店铺 + * + * @param merchantNo 商户号 + * @param keyword 关键字 + * @param latitude 维度 + * @param longitude 经度 + * @return + * */ + List queryByDistance(String merchantNo, String keyword, String latitude, String longitude) throws BusinessCheckException; + + /** + * 获取店铺名称 + * + * @param storeIds 店铺ID + * @return + * */ + String getStoreNames(String storeIds); + + /** + * 获取店铺ID + * + * @param merchantId 商户ID + * @param storeNames 店铺名称 + * @return + * */ + String getStoreIds(Integer merchantId, String storeNames); + + /** + * 根据商户ID删除店铺信息 + * + * @param merchantId 商户ID + * @return + * */ + void deleteStoreByMerchant(Integer merchantId); + + /** + * 根据地址获取经纬度 + * + * @param addr 地址 + * @return + * */ + Map getLatAndLngByAddress(String addr); + + /** + * 获取步行距离 + * + * @param origin 起点经纬度 格式如:116.434446,39.90816 + * @param destination 终点经纬度 格式如:116.434307,39.90909 + * @return + * */ + Double getDistance(String origin, String destination); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/UnionPayService.java b/fuint-application/src/main/java/com/fuint/common/service/UnionPayService.java new file mode 100644 index 0000000..218e4e6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/UnionPayService.java @@ -0,0 +1,62 @@ +package com.fuint.common.service; + +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtUser; +import java.math.BigDecimal; +import java.util.Map; + +/** + * 云闪付相关业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface UnionPayService { + + /** + * 创建预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP地址 + * @param platform 支付平台 + * @return + * */ + ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException; + + /** + * 支付回调 + * + * @param params 请求参数 + * @return + * */ + Boolean checkCallBack(Map params) throws Exception; + + /** + * 查询支付订单 + * + * @param storeId 店铺ID + * @param tradeNo 交易单号 + * @param orderSn 订单号 + * @return + * */ + Map queryPaidOrder(Integer storeId, String tradeNo, String orderSn) throws BusinessCheckException; + + /** + * 发起售后退款 + * + * @param storeId 店铺ID + * @param orderSn 订单号 + * @param totalAmount 订单总金额 + * @param refundAmount 售后金额 + * @param platform 订单平台 + * @return + * */ + Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/UploadService.java b/fuint-application/src/main/java/com/fuint/common/service/UploadService.java new file mode 100644 index 0000000..acdcc72 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/UploadService.java @@ -0,0 +1,23 @@ +package com.fuint.common.service; + +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; + +/** + * 文件上传服务类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface UploadService { + + /** + * 保存文件 + * + * @param request + * @param file excel文件 + * @return + * */ + String saveUploadFile(HttpServletRequest request, MultipartFile file) throws Exception; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/UserActionService.java b/fuint-application/src/main/java/com/fuint/common/service/UserActionService.java new file mode 100644 index 0000000..59d023a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/UserActionService.java @@ -0,0 +1,49 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtUserAction; + +/** + * 会员行为业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface UserActionService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryUserActionListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 新增会员行为 + * + * @param mtUserAction + * @throws BusinessCheckException + */ + boolean addUserAction(MtUserAction mtUserAction) throws BusinessCheckException; + + /** + * 根据ID获取会员行为详情 + * + * @param id ID + * @throws BusinessCheckException + */ + MtUserAction getUserActionDetail(Integer id) throws BusinessCheckException; + + /** + * 根据ID删除会员行为 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + */ + void deleteUserAction(Integer id, String operator) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java b/fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java new file mode 100644 index 0000000..6bea2b9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java @@ -0,0 +1,116 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.CouponDto; +import com.fuint.common.param.CouponReceiveParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtUserCoupon; +import java.util.List; +import java.util.Map; + +/** + * 会员卡券业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface UserCouponService extends IService { + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryUserCouponListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 领取卡券 + * + * @param couponReceiveParam + * @return + * */ + boolean receiveCoupon(CouponReceiveParam couponReceiveParam) throws BusinessCheckException; + + /** + * 预存卡券 + * + * @param paramMap + * @return + * */ + boolean preStore(Map paramMap) throws BusinessCheckException; + + /** + * 获取会员卡券列表 + * @param userId + * @param status + * @return + * */ + List getUserCouponList(Integer userId, List status) throws BusinessCheckException; + + /** + * 获取用户的卡券 + * @param paramMap 查询参数 + * @throws BusinessCheckException + * */ + ResponseObject getUserCouponList(Map paramMap) throws BusinessCheckException; + + /** + * 获取会员可支付用的卡券 + * + * @param userId 会员ID + * @param storeId 使用门店 + * @param useFor 用途 + * @return + * */ + List getPayAbleCouponList(Integer userId, Integer storeId, String useFor) throws BusinessCheckException; + + /** + * 获取会员卡券详情 + * @param userId + * @param couponId + * */ + List getUserCouponDetail(Integer userId, Integer couponId) throws BusinessCheckException; + + /** + * 获取会员卡券详情 + * + * @param userCouponId + * @return + * */ + MtUserCoupon getUserCouponDetail(Integer userCouponId) throws BusinessCheckException; + + /** + * 根据过期时间查询会员卡券 + * + * @param userId + * @param status + * @param startTime + * @param endTime + * @return + * */ + List getUserCouponListByExpireTime(Integer userId, String status, String startTime, String endTime) throws BusinessCheckException; + + /** + * 给会员发送卡券(会员购买) + * + * @param orderId 订单ID + * @param couponId 卡券ID + * @param userId 会员ID + * @param mobile 会员手机号 + * @param num 购买数量 + * @return + * */ + boolean buyCouponItem(Integer orderId, Integer couponId, Integer userId, String mobile, Double num) throws BusinessCheckException; + + /** + * 通过卡券ID删除会员卡券 + * + * @param couponId 卡券ID + * @return + * */ + void removeUserCouponByCouponId(Integer couponId); +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java b/fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java new file mode 100644 index 0000000..80ea0b9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java @@ -0,0 +1,94 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtUser; +import com.fuint.repository.model.MtUserGrade; +import java.util.List; + +/** + * 会员等级业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface UserGradeService extends IService { + + /** + * 分页查询会员等级列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryUserGradeListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + /** + * 添加会员等级 + * + * @param reqDto + * @throws BusinessCheckException + * @return + */ + MtUserGrade addUserGrade(MtUserGrade reqDto) throws BusinessCheckException; + + /** + * 修改会员等级 + * + * @param reqDto + * @throws BusinessCheckException + * @return + */ + MtUserGrade updateUserGrade(MtUserGrade reqDto) throws BusinessCheckException; + + /** + * 根据ID获取会员等级信息 + * + * @param merchantId + * @param gradeId ID + * @param userId + * @throws BusinessCheckException + * @return + */ + MtUserGrade queryUserGradeById(Integer merchantId, Integer gradeId, Integer userId) throws BusinessCheckException; + + /** + * 根据ID删除会员等级 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + Integer deleteUserGrade(Integer id, String operator) throws BusinessCheckException; + + /** + * 获取默认的会员等级 + * + * @param merchantId + * @throws BusinessCheckException + * @return + */ + MtUserGrade getInitUserGrade(Integer merchantId) throws BusinessCheckException; + + /** + * 获取付费会员等级列表 + * + * @param merchantId + * @param userInfo + * @throws BusinessCheckException + * @return + * */ + List getPayUserGradeList(Integer merchantId, MtUser userInfo) throws BusinessCheckException; + + /** + * 获取商户会员等级列表 + * + * @param merchantId 商户ID + * @param status 状态 + * @return + * */ + List getMerchantGradeList(Integer merchantId, String status); + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java b/fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java new file mode 100644 index 0000000..5b01867 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java @@ -0,0 +1,45 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.MtVerifyCode; + +/** + * 图形验证码接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface VerifyCodeService extends IService { + + /** + * 新增验证码 + * + * @param mobile 手机号 + * @param verifyCode 验证码 + * @param expireSecond 间隔秒数 + * @throws BusinessCheckException + * @return + */ + MtVerifyCode addVerifyCode(String mobile, String verifyCode, Integer expireSecond) throws BusinessCheckException; + + /** + * 根据手机号,验证码,查询时间 + * + * @param mobile 电话号码 + * @param verifyCode 验证码 + * @throws BusinessCheckException + * @return + */ + MtVerifyCode checkVerifyCode(String mobile, String verifyCode) throws BusinessCheckException; + + /** + * 更改验证码状态 + * + * @param id 验证码ID + * @param validFlag 是否验证 + * @throws BusinessCheckException + * @return + */ + MtVerifyCode updateValidFlag(Long id, String validFlag) throws BusinessCheckException; +} \ No newline at end of file diff --git a/fuint-application/src/main/java/com/fuint/common/service/WeixinService.java b/fuint-application/src/main/java/com/fuint/common/service/WeixinService.java new file mode 100644 index 0000000..bffea24 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/WeixinService.java @@ -0,0 +1,195 @@ +package com.fuint.common.service; + +import com.alibaba.fastjson.JSONObject; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtUser; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.util.Map; +import java.util.Date; + +/** + * 微信相关业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface WeixinService { + + /** + * 获取微信登录token + * + * @param merchantId 商户ID + * @param isMinApp 是否小程序 + * @param useCache 是否从缓存中读取 + * @return + * */ + String getAccessToken(Integer merchantId, boolean isMinApp, boolean useCache) throws BusinessCheckException; + + /** + * 提交预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 支付二维码 + * @param giveAmount 赠送金额 + * @param ip 支付发起IP + * @param platform 支付平台 + * @param isWechat 是否微信客户端 + * @return + * */ + ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException; + + /** + * 处理返回的xml数据 + * + * @param request 请求体 + * @return + * */ + Map processResXml(HttpServletRequest request); + + /** + * 处理返回的xml数据 + * + * @param response 返回相应 + * @param flag 标签 + * @return + * */ + void processRespXml(HttpServletResponse response, boolean flag); + + /** + * 获取微信个人信息 + * + * @param merchantId 商户ID + * @param code 登录编码 + * @return + * */ + JSONObject getWxProfile(Integer merchantId, String code) throws BusinessCheckException; + + /** + * 获取微信openId + * + * @param merchantId 商户ID + * @param code 登录编码 + * @return + * */ + JSONObject getWxOpenId(Integer merchantId, String code) throws BusinessCheckException; + + /** + * 获取会员微信绑定的手机号 + * + * @param encryptedData 加密的编码(前端返回) + * @param sessionKey + * @param iv + * @return + * */ + String getPhoneNumber(String encryptedData, String sessionKey, String iv); + + /** + * 发送订阅消息 + * + * @param merchantId 商户ID + * @param userId 会员ID + * @param toUserOpenId 会员openID + * @param key 消息编码 + * @param page 跳转页面 + * @param params 发送参数 + * @param sendTime 发送时间 + * @return + * */ + Boolean sendSubscribeMessage(Integer merchantId, Integer userId, String toUserOpenId, String key, String page, Map params, Date sendTime) throws BusinessCheckException; + + /** + * 发送订阅消息 + * + * @param merchantId 商户ID + * @param reqDataJsonStr 发送参数 + * @return + * */ + Boolean doSendSubscribeMessage(Integer merchantId, String reqDataJsonStr); + + /** + * 查询支付订单 + * + * @param storeId 店铺ID + * @param transactionId 交易单号 + * @param orderSn 订单号 + * @return + * */ + Map queryPaidOrder(Integer storeId, String transactionId, String orderSn); + + /** + * 发起售后 + * + * @param storeId 店铺ID + * @param orderSn 订单号 + * @param totalAmount 订单总金额 + * @param refundAmount 售后金额 + * @param platform 平台 + * @return + * */ + Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException; + + /** + * 生成二维码 + * + * @param merchantId 商户ID + * @param type 类型 + * @param id 数据ID + * @param page 页面 + * @param width 宽度 + * @return + * */ + String createQrCode(Integer merchantId, String type, Integer id, String page, Integer width) throws BusinessCheckException; + + /** + * 开通微信卡券 + * + * @param merchantId 商户ID + * @param wxCardId 微信会员卡ID + * @return + * */ + String createWxCard(Integer merchantId, String wxCardId) throws BusinessCheckException; + + /** + * 创建微信卡券领取的二维码 + * + * @param merchantId 商户ID + * @param cardId 微信卡券ID + * @param code 会员卡编码 + * @return + * */ + String createCardQrCode(Integer merchantId, String cardId, String code); + + /** + * 是否已领取卡券 + * + * @param merchantId 商户ID + * @param cardId 微信卡券ID + * @param openId openId + * @return + * */ + Boolean isOpenCard(Integer merchantId, String cardId, String openId); + + /** + * 生成小程序链接 + * + * @param merchantId 商户ID + * @param path 页面路径 + * @return + * */ + String createMiniAppLink(Integer merchantId, String path); + + /** + * 上传小程序发货信息 + * + * @param orderSn 订单号 + * @return + */ + void uploadShippingInfo(String orderSn) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java new file mode 100644 index 0000000..ac1a8be --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java @@ -0,0 +1,416 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.AccountDto; +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.AccountService; +import com.fuint.common.service.CaptchaService; +import com.fuint.common.service.StaffService; +import com.fuint.common.service.StoreService; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.exception.BusinessRuntimeException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.LoginRequest; +import com.fuint.module.backendApi.response.LoginResponse; +import com.fuint.repository.mapper.*; +import com.fuint.repository.model.*; +import com.fuint.utils.Digests; +import com.fuint.utils.Encodes; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 后台账号接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class AccountServiceImpl extends ServiceImpl implements AccountService { + + private TAccountMapper tAccountMapper; + + private TDutyMapper tDutyMapper; + + private TAccountDutyMapper tAccountDutyMapper; + + private MtMerchantMapper mtMerchantMapper; + + private MtStoreMapper mtStoreMapper; + + /** + * 员工接口 + */ + private StaffService staffService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 验证码服务接口 + * */ + private CaptchaService captchaService; + + /** + * 分页查询账号列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse getAccountListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(TAccount::getAccountStatus, -1); // 1:启用;0:禁用;-1:删除 + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotEmpty(name)) { + lambdaQueryWrapper.like(TAccount::getAccountName, name); + } + String realName = paginationRequest.getSearchParams().get("realName") == null ? "" : paginationRequest.getSearchParams().get("realName").toString(); + if (StringUtils.isNotEmpty(realName)) { + lambdaQueryWrapper.like(TAccount::getRealName, realName); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotEmpty(status)) { + lambdaQueryWrapper.eq(TAccount::getAccountStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotEmpty(merchantId)) { + lambdaQueryWrapper.eq(TAccount::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotEmpty(storeId)) { + lambdaQueryWrapper.eq(TAccount::getStoreId, storeId); + } + String staffId = paginationRequest.getSearchParams().get("staffId") == null ? "" : paginationRequest.getSearchParams().get("staffId").toString(); + if (StringUtils.isNotEmpty(staffId)) { + lambdaQueryWrapper.eq(TAccount::getStaffId, staffId); + } + + lambdaQueryWrapper.orderByDesc(TAccount::getAcctId); + List accountList = tAccountMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + for (TAccount tAccount : accountList) { + AccountDto accountDto = new AccountDto(); + BeanUtils.copyProperties(tAccount, accountDto); + accountDto.setId(tAccount.getAcctId()); + MtMerchant mtMerchant = mtMerchantMapper.selectById(tAccount.getMerchantId()); + if (mtMerchant != null) { + accountDto.setMerchantName(mtMerchant.getName()); + } + MtStore mtStore = mtStoreMapper.selectById(tAccount.getStoreId()); + if (mtStore != null) { + accountDto.setStoreName(mtStore.getName()); + } + accountDto.setSalt(null); + accountDto.setPassword(null); + dataList.add(accountDto); + } + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, AccountDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 根据账号名称获取账号信息 + * + * @param userName 账号名称 + * @return + * */ + @Override + public AccountInfo getAccountByName(String userName) { + Map param = new HashMap(); + param.put("account_name", userName); + param.put("account_status", 1); + List accountList = tAccountMapper.selectByMap(param); + if (accountList != null && accountList.size() > 0) { + AccountInfo accountInfo = new AccountInfo(); + TAccount account = accountList.get(0); + accountInfo.setId(account.getAcctId()); + accountInfo.setAccountName(account.getAccountName()); + accountInfo.setRealName(account.getRealName()); + accountInfo.setRoleIds(account.getRoleIds()); + accountInfo.setStaffId(account.getStaffId()); + accountInfo.setStoreId(account.getStoreId()); + Integer merchantId = account.getMerchantId() == null ? 0 : account.getMerchantId(); + accountInfo.setMerchantId(merchantId); + if (account.getMerchantId() != null && account.getMerchantId() > 0) { + MtMerchant mtMerchant = mtMerchantMapper.selectById(account.getMerchantId()); + if (mtMerchant != null) { + accountInfo.setMerchantName(mtMerchant.getName()); + } + } + if (account.getStoreId() != null && account.getStoreId() > 0) { + MtStore mtStore = mtStoreMapper.selectById(account.getStoreId()); + if (mtStore != null) { + accountInfo.setStoreName(mtStore.getName()); + } + } + return accountInfo; + } else { + return null; + } + } + + /** + * 根据ID获取账号信息 + * + * @param userId 账号ID + * @return + * */ + @Override + public TAccount getAccountInfoById(Integer userId) { + TAccount tAccount = tAccountMapper.selectById(userId); + return tAccount; + } + + /** + * 新增后台账户 + * + * @param tAccount + * @return + * */ + @Override + @OperationServiceLog(description = "新增后台账户") + public TAccount createAccountInfo(TAccount tAccount, List duties) throws BusinessCheckException { + TAccount account = new TAccount(); + account.setAccountKey(tAccount.getAccountKey()); + account.setAccountName(tAccount.getAccountName().toLowerCase()); + account.setAccountStatus(1); + account.setRealName(tAccount.getRealName()); + account.setRoleIds(tAccount.getRoleIds()); + account.setStaffId(tAccount.getStaffId()); + Integer storeId = tAccount.getStoreId() == null ? 0 : tAccount.getStoreId(); + if (tAccount.getMerchantId() == null || tAccount.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + tAccount.setMerchantId(mtStore.getMerchantId()); + } + } + account.setMerchantId(tAccount.getMerchantId()); + account.setStoreId(tAccount.getStoreId()); + account.setCreateDate(new Date()); + account.setModifyDate(new Date()); + account.setStoreId(tAccount.getStoreId()); + account.setStaffId(tAccount.getStaffId()); + account.setPassword(tAccount.getPassword()); + this.entryptPassword(account); + int id = tAccountMapper.insert(account); + + if (id > 0 && duties != null && duties.size() > 0) { + for (TDuty tDuty : duties) { + TAccountDuty tAccountDuty = new TAccountDuty(); + tAccountDuty.setDutyId(tDuty.getDutyId()); + tAccountDuty.setAcctId(account.getAcctId()); + tAccountDutyMapper.insert(tAccountDuty); + } + } + + if (id > 0 ) { + return this.getAccountInfoById(id); + } else { + throw new BusinessRuntimeException("创建账号错误"); + } + } + + /** + * 获取账号角色ID + * + * @param accountId + * @return + * */ + @Override + public List getRoleIdsByAccountId(Integer accountId) { + return tDutyMapper.getRoleIdsByAccountId(accountId); + } + + /** + * 修改账户 + * + * @param tAccount 账户实体 + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改后台账户") + public void editAccount(TAccount tAccount, List duties) throws BusinessCheckException { + TAccount oldAccount = tAccountMapper.selectById(tAccount.getAcctId()); + if (oldAccount == null) { + throw new BusinessCheckException("账户不存在."); + } + tAccount.setModifyDate(new Date()); + if (duties != null && duties.size() > 0) { + if (tAccount.getAcctId() != null && tAccount.getAcctId() > 0) { + tAccountDutyMapper.deleteDutiesByAccountId(tAccount.getAcctId()); + for (TDuty tDuty : duties) { + TAccountDuty tAccountDuty = new TAccountDuty(); + tAccountDuty.setDutyId(tDuty.getDutyId()); + tAccountDuty.setAcctId(tAccount.getAcctId()); + tAccountDutyMapper.insert(tAccountDuty); + } + } + } + if (tAccount.getStaffId() != null && tAccount.getStaffId() > 0) { + MtStaff mtStaff = staffService.queryStaffById(tAccount.getStaffId()); + if (mtStaff == null) { + tAccount.setStaffId(0); + } + } + tAccountMapper.updateById(tAccount); + } + + /** + * 根据账户名称获取账户所分配的角色ID集合 + * + * @param accountId 账户 + * @return 角色ID集合 + */ + @Override + public List getDutyIdsByAccountId(Integer accountId) { + return tAccountDutyMapper.getDutyIdsByAccountId(accountId); + } + + /** + * 更新账户 + * + * @param tAccount + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改后台账户") + public void updateAccount(TAccount tAccount) { + tAccountMapper.updateById(tAccount); + } + + /** + * 删除账号 + * + * @param accountId 账号ID + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除后台账户") + public void deleteAccount(Long accountId) { + TAccount tAccount = tAccountMapper.selectById(accountId); + tAccount.setAccountStatus(-1); + tAccount.setModifyDate(new Date()); + tAccountMapper.updateById(tAccount); + } + + /** + * 设定安全的密码 + * + * @param tAccount 账号信息 + * @return + */ + @Override + public void entryptPassword(TAccount tAccount) { + byte[] salt = Digests.generateSalt(8); + tAccount.setSalt(Encodes.encodeHex(salt)); + byte[] hashPassword = Digests.sha1(tAccount.getPassword().getBytes(), salt, 1024); + tAccount.setPassword(Encodes.encodeHex(hashPassword)); + } + + /** + * 获取加密密码 + * + * @param password + * @param salt + * @return + * */ + @Override + public String getEntryptPassword(String password, String salt) { + byte[] salt1 = Encodes.decodeHex(salt); + byte[] hashPassword = Digests.sha1(password.getBytes(), salt1, 1024); + return Encodes.encodeHex(hashPassword); + } + + /** + * 登录后台系统 + * + * @param loginRequest 登录参数 + * @param userAgent 登录浏览器 + * @return + * */ + @Override + @OperationServiceLog(description = "登录后台系统") + public LoginResponse doLogin(LoginRequest loginRequest, String userAgent) throws BusinessCheckException { + String accountName = loginRequest.getUsername(); + String password = loginRequest.getPassword(); + String captchaCode = loginRequest.getCaptchaCode(); + String uuid = loginRequest.getUuid(); + + Boolean captchaVerify = captchaService.checkCodeByUuid(captchaCode, uuid); + if (!captchaVerify) { + throw new BusinessCheckException("图形验证码有误"); + } + + if (StringUtil.isEmpty(accountName)|| StringUtil.isEmpty(password) || StringUtil.isEmpty(captchaCode)) { + throw new BusinessCheckException("登录参数有误"); + } else { + AccountInfo accountInfo = getAccountByName(loginRequest.getUsername()); + if (accountInfo == null) { + throw new BusinessCheckException("登录账号或密码有误"); + } + + TAccount tAccount = getAccountInfoById(accountInfo.getId()); + String myPassword = tAccount.getPassword(); + String inputPassword = getEntryptPassword(password, tAccount.getSalt()); + if (!myPassword.equals(inputPassword) || !tAccount.getAccountStatus().toString().equals("1")) { + throw new BusinessCheckException("登录账号或密码有误"); + } + + // 商户已禁用 + if (tAccount.getMerchantId() != null && tAccount.getMerchantId() > 0) { + MtMerchant mtMerchant = mtMerchantMapper.selectById(tAccount.getMerchantId()); + if (mtMerchant != null && !mtMerchant.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("您的商户已被禁用,请联系平台方"); + } + } + + // 店铺已禁用 + if (tAccount.getStoreId() != null && tAccount.getStoreId() > 0) { + MtStore mtStore = mtStoreMapper.selectById(tAccount.getStoreId()); + if (mtStore != null && !mtStore.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("您的店铺已被禁用,请联系平台方"); + } + } + + String token = TokenUtil.generateToken(userAgent, accountInfo); + LoginResponse response = new LoginResponse(); + response.setLogin(true); + response.setToken(token); + response.setTokenCreatedTime(new Date()); + + return response; + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java new file mode 100644 index 0000000..c0a86aa --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java @@ -0,0 +1,81 @@ +package com.fuint.common.service.impl; + +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.fuint.common.service.ActionLogService; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.TActionLogMapper; +import com.fuint.repository.model.TActionLog; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import java.util.List; + +/** + * 日志服务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class ActionLogServiceImpl extends ServiceImpl implements ActionLogService { + + private TActionLogMapper tActionLogMapper; + + public void saveActionLog(TActionLog actionLog) { + tActionLogMapper.insert(actionLog); + } + + public PaginationResponse findLogsByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(TActionLog::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(TActionLog::getStoreId, storeId); + } + String module = paginationRequest.getSearchParams().get("module") == null ? "" : paginationRequest.getSearchParams().get("module").toString(); + if (StringUtils.isNotBlank(module)) { + lambdaQueryWrapper.like(TActionLog::getModule, module); + } + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.eq(TActionLog::getAcctName, name); + } + String startTime = paginationRequest.getSearchParams().get("startTime") == null ? "" : paginationRequest.getSearchParams().get("startTime").toString(); + if (StringUtils.isNotBlank(startTime)) { + lambdaQueryWrapper.gt(TActionLog::getActionTime, startTime); + } + String endTime = paginationRequest.getSearchParams().get("endTime") == null ? "" : paginationRequest.getSearchParams().get("endTime").toString(); + if (StringUtils.isNotBlank(endTime)) { + lambdaQueryWrapper.lt(TActionLog::getActionTime, endTime); + } + String ip = paginationRequest.getSearchParams().get("ip") == null ? "" : paginationRequest.getSearchParams().get("ip").toString(); + if (StringUtils.isNotBlank(ip)) { + lambdaQueryWrapper.eq(TActionLog::getClientIp, ip); + } + + lambdaQueryWrapper.orderByDesc(TActionLog::getId); + List dataList = tActionLogMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, TActionLog.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java new file mode 100644 index 0000000..5f9f0f8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java @@ -0,0 +1,120 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.service.AddressService; +import com.fuint.repository.model.MtAddress; +import com.fuint.repository.mapper.MtAddressMapper; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.common.enums.StatusEnum; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.Date; +import java.util.Map; +import java.util.HashMap; + +/** + * 收货地址业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class AddressServiceImpl extends ServiceImpl implements AddressService { + + private MtAddressMapper mtAddressMapper; + + /** + * 保存收货地址 + * + * @param mtAddress + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public MtAddress saveAddress(MtAddress mtAddress) { + if (mtAddress.getId() > 0) { + MtAddress address = mtAddressMapper.selectById(mtAddress.getId()); + if (StringUtil.isNotEmpty(mtAddress.getName())) { + address.setName(mtAddress.getName()); + } + if (StringUtil.isNotEmpty(mtAddress.getMobile())) { + address.setMobile(mtAddress.getMobile()); + } + if (StringUtil.isNotEmpty(mtAddress.getDetail())) { + address.setDetail(mtAddress.getDetail()); + } + if (StringUtil.isNotEmpty(mtAddress.getIsDefault())) { + if (mtAddress.getIsDefault().equals(YesOrNoEnum.YES.getKey())) { + mtAddressMapper.setDefault(mtAddress.getUserId(), mtAddress.getId()); + } + address.setIsDefault(mtAddress.getIsDefault()); + } + if (StringUtil.isNotEmpty(mtAddress.getStatus())) { + address.setStatus(mtAddress.getStatus()); + } + if (mtAddress.getProvinceId() > 0) { + address.setProvinceId(mtAddress.getProvinceId()); + } + if (mtAddress.getCityId() > 0) { + address.setCityId(mtAddress.getCityId()); + } + if (mtAddress.getRegionId() > 0) { + address.setRegionId(mtAddress.getRegionId()); + } + + mtAddressMapper.updateById(address); + } else { + mtAddress.setCreateTime(new Date()); + mtAddress.setUpdateTime(new Date()); + mtAddress.setIsDefault(YesOrNoEnum.YES.getKey()); + + this.save(mtAddress); + mtAddressMapper.setDefault(mtAddress.getUserId(), mtAddress.getId()); + } + + return mtAddress; + } + + /** + * 根据ID获取收货地址 + * + * @param id 地址ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtAddress detail(Integer id) { + return mtAddressMapper.selectById(id); + } + + /** + * 根据条件查询地址列表 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryListByParams(Map params) { + Map param = new HashMap<>(); + + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey(): params.get("status").toString(); + param.put("status", status); + + if (params.get("userId") != null) { + param.put("user_id", params.get("userId").toString()); + } + + if (params.get("isDefault") != null) { + param.put("is_default", YesOrNoEnum.YES.getKey()); + } + + return mtAddressMapper.selectByMap(param); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java new file mode 100644 index 0000000..867976a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java @@ -0,0 +1,261 @@ +package com.fuint.common.service.impl; + +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradePayModel; +import com.alipay.api.domain.AlipayTradeQueryModel; +import com.alipay.api.domain.AlipayTradeRefundModel; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.response.AlipayTradePayResponse; +import com.alipay.api.response.AlipayTradeQueryResponse; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.fuint.common.bean.AliPayBean; +import com.fuint.common.dto.OrderDto; +import com.fuint.common.dto.UserOrderDto; +import com.fuint.common.enums.*; +import com.fuint.common.service.*; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.ijpay.alipay.AliPayApi; +import com.ijpay.alipay.AliPayApiConfig; +import com.ijpay.alipay.AliPayApiConfigKit; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.*; + +/** + * 支付宝相关接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class AlipayServiceImpl implements AlipayService { + + private static final Logger logger = LoggerFactory.getLogger(AlipayServiceImpl.class); + + private AliPayBean aliPayBean; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 创建预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP地址 + * @param platform 支付平台 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException { + logger.info("AlipayService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo); + + String goodsInfo = orderInfo.getOrderSn(); + if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) { + goodsInfo = OrderTypeEnum.PRESTORE.getValue(); + } + + // 更新支付金额 + BigDecimal payAmount1 = new BigDecimal(payAmount).divide(new BigDecimal("100")); + OrderDto reqDto = new OrderDto(); + reqDto.setId(orderInfo.getId()); + reqDto.setPayAmount(payAmount1); + reqDto.setPayType(orderInfo.getPayType()); + reqDto.setOrderSn(orderInfo.getOrderSn()); + orderService.updateOrder(reqDto); + + getApiConfig(orderInfo.getStoreId()); + String notifyUrl = aliPayBean.getDomain(); + AlipayTradePayModel model = new AlipayTradePayModel(); + model.setAuthCode(authCode); + model.setSubject(goodsInfo); + model.setTotalAmount(payAmount1.toString()); + model.setOutTradeNo(orderInfo.getOrderSn()); + model.setStoreId(orderInfo.getStoreId().toString()); + model.setScene("bar_code"); + + String code = ""; + try { + AlipayTradePayResponse response = AliPayApi.tradePayToResponse(model, notifyUrl); + code = response.getCode(); + String msg = response.getMsg(); + logger.info("AlipayService createPrepayOrder return code: {}, msg ", code, msg); + if (!code.equals("10000") || !msg.equalsIgnoreCase("Success")) { + if (code.equals("10003")) { + // 需要会员输入支付密码,等待10秒后查询订单 + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Map payResult = queryPaidOrder(orderInfo.getStoreId(), response.getTradeNo(), orderInfo.getOrderSn()); + if (payResult == null) { + throw new BusinessCheckException("支付宝支付失败"); + } + } else { + throw new BusinessCheckException("支付宝支付出错:" + msg); + } + } + } catch (Exception e) { + logger.error("AlipayService createPrepayOrder exception {}", e.getMessage()); + throw new BusinessCheckException("支付宝支付出错,请检查配置项"); + } + + Map respData = new HashMap<>(); + respData.put("result", code); + + ResponseObject responseObject = new ResponseObject(200, "支付宝支付接口返回成功", respData); + logger.info("AlipayService createPrepayOrder outParams {}", responseObject.toString()); + + return responseObject; + } + + /** + * 支付回调 + * + * @param params 请求参数 + * @return + * */ + @Override + public Boolean checkCallBack(Map params) throws Exception { + String orderSn = params.get("out_trade_no") != null ? params.get("out_trade_no") : ""; + Integer storeId = 0; + UserOrderDto orderDto = orderService.getOrderByOrderSn(orderSn); + if (orderDto != null && orderDto.getStoreInfo() != null) { + storeId = orderDto.getStoreInfo().getId(); + } + getApiConfig(storeId); + return AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2"); + } + + /** + * 获取支付配置 + * + * @param storeId 店铺ID + * @return + * */ + public AliPayApiConfig getApiConfig(Integer storeId) throws BusinessCheckException { + AliPayApiConfig aliPayApiConfig; + String appId = aliPayBean.getAppId(); + String privateKey = aliPayBean.getPrivateKey(); + String publicKey = aliPayBean.getPublicKey(); + + // 优先读取店铺的支付账号 + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null && StringUtil.isNotEmpty(mtStore.getAlipayAppId()) && StringUtil.isNotEmpty(mtStore.getAlipayPrivateKey()) && StringUtil.isNotEmpty(mtStore.getAlipayPublicKey())) { + appId = mtStore.getAlipayAppId(); + privateKey = mtStore.getAlipayPrivateKey(); + publicKey = mtStore.getAlipayPublicKey(); + } + + aliPayApiConfig = AliPayApiConfig.builder() + .setAppId(appId) + .setAliPayPublicKey(publicKey) + .setCharset("UTF-8") + .setPrivateKey(privateKey) + .setServiceUrl(aliPayBean.getServerUrl()) + .setSignType("RSA2") + .build(); + + AliPayApiConfigKit.setThreadLocalAppId(appId); + AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig); + + return aliPayApiConfig; + } + + /** + * 查询支付订单 + * + * @param storeId 店铺ID + * @param tradeNo 交易单号 + * @param orderSn 订单号 + * @return + * */ + @Override + public Map queryPaidOrder(Integer storeId, String tradeNo, String orderSn) throws BusinessCheckException { + try { + AlipayTradeQueryModel model = new AlipayTradeQueryModel(); + if (StringUtil.isNotEmpty(orderSn)) { + model.setOutTradeNo(orderSn); + } + if (StringUtil.isNotEmpty(tradeNo)) { + model.setTradeNo(tradeNo); + } + getApiConfig(storeId); + AlipayTradeQueryResponse response = AliPayApi.tradeQueryToResponse(model); + if (response != null) { + // TradeStatus:TRADE_SUCCESS(交易支付成功,可进行退款)或 TRADE_FINISHED(交易结束,不可退款) + if (response.getTradeStatus() != null && response.getTradeStatus().equals("TRADE_SUCCESS")) { + Map result = new HashMap<>(); + result.put("tradeNo", response.getTradeNo()); + result.put("status", response.getTradeStatus()); + result.put("payAmount", response.getBuyerPayAmount()); + return result; + } + } + } catch (AlipayApiException e) { + logger.info("AlipayService queryPaidOrder response", e.getMessage()); + } + + return null; + } + + /** + * 发起售后退款 + * + * @param storeId 店铺ID + * @param orderSn 订单号 + * @param totalAmount 订单总金额 + * @param refundAmount 售后金额 + * @param platform 订单平台 + * @return + * */ + public Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException { + try { + logger.info("AlipayService.doRefund orderSn = {}, totalFee = {}, refundFee = {}", orderSn, totalAmount, refundAmount); + if (StringUtil.isEmpty(orderSn)) { + throw new BusinessCheckException("退款订单号不能为空..."); + } + if (refundAmount.compareTo(totalAmount) > 0) { + throw new BusinessCheckException("退款金额不能大于总金额..."); + } + getApiConfig(storeId); + AlipayTradeRefundModel model = new AlipayTradeRefundModel(); + model.setOutTradeNo(orderSn); + model.setRefundAmount(refundAmount.toString()); + model.setRefundReason("申请退款"); + AlipayTradeRefundResponse refundResponse = AliPayApi.tradeRefundToResponse(model); + String code = refundResponse.getCode(); + String msg = refundResponse.getMsg(); + String subMsg = refundResponse.getSubMsg() == null ? msg : refundResponse.getSubMsg(); + logger.info("AlipayService refundResult response Body = {}", refundResponse.getBody()); + if (!code.equals("10000") || !msg.equalsIgnoreCase("Success")) { + throw new BusinessCheckException("支付宝退款失败," + subMsg); + } + } catch (AlipayApiException e) { + logger.error("AlipayService.doRefund error = {}", e.getMessage()); + e.printStackTrace(); + } + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..2a873cb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java @@ -0,0 +1,288 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.ArticleDto; +import com.fuint.common.param.ArticlePage; +import com.fuint.common.service.ArticleService; +import com.fuint.common.service.MerchantService; +import com.fuint.common.service.StoreService; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtArticleMapper; +import com.fuint.repository.model.MtArticle; +import com.fuint.common.service.SettingService; +import com.fuint.common.enums.StatusEnum; +import com.fuint.repository.model.MtStore; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import com.github.pagehelper.Page; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 文章服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class ArticleServiceImpl extends ServiceImpl implements ArticleService { + + private MtArticleMapper mtArticleMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 商户服务接口 + * */ + private MerchantService merchantService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 分页查询文章列表 + * + * @param articlePage + * @return + */ + @Override + public PaginationResponse queryArticleListByPagination(ArticlePage articlePage) { + Page pageHelper = PageHelper.startPage(articlePage.getPage(), articlePage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtArticle::getStatus, StatusEnum.DISABLE.getKey()); + + String title = articlePage.getTitle(); + if (StringUtils.isNotBlank(title)) { + lambdaQueryWrapper.like(MtArticle::getTitle, title); + } + String status = articlePage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtArticle::getStatus, status); + } + Integer merchantId = articlePage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtArticle::getMerchantId, merchantId); + } + String merchantNo = articlePage.getMerchantNo(); + Integer mchId = merchantService.getMerchantId(merchantNo); + if (mchId > 0) { + lambdaQueryWrapper.eq(MtArticle::getMerchantId, mchId); + } + Integer storeId = articlePage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtArticle::getStoreId, 0) + .or() + .eq(MtArticle::getStoreId, storeId)); + } + lambdaQueryWrapper.orderByAsc(MtArticle::getSort); + List articleList = mtArticleMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + String basePath = settingService.getUploadBasePath(); + for (MtArticle mtArticle : articleList) { + ArticleDto articleDto = new ArticleDto(); + BeanUtils.copyProperties(mtArticle, articleDto); + articleDto.setImage(basePath + mtArticle.getImage()); + dataList.add(articleDto); + } + + PageRequest pageRequest = PageRequest.of(articlePage.getPage(), articlePage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, ArticleDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加文章 + * + * @param articleDto 文章参数 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增文章") + public MtArticle addArticle(ArticleDto articleDto) throws BusinessCheckException { + MtArticle mtArticle = new MtArticle(); + mtArticle.setTitle(articleDto.getTitle()); + mtArticle.setBrief(articleDto.getBrief()); + Integer storeId = articleDto.getStoreId() == null ? 0 : articleDto.getStoreId(); + if (articleDto.getMerchantId() == null || articleDto.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + articleDto.setMerchantId(mtStore.getMerchantId()); + } + } + mtArticle.setMerchantId(articleDto.getMerchantId()); + + if (mtArticle.getMerchantId() == null || mtArticle.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + + mtArticle.setStoreId(storeId); + mtArticle.setUrl(articleDto.getUrl()); + mtArticle.setClick(0l); + mtArticle.setStatus(StatusEnum.ENABLED.getKey()); + mtArticle.setImage(articleDto.getImage()); + mtArticle.setDescription(articleDto.getDescription()); + mtArticle.setOperator(articleDto.getOperator()); + mtArticle.setUpdateTime(new Date()); + mtArticle.setCreateTime(new Date()); + mtArticle.setSort(articleDto.getSort()); + mtArticle.setMerchantId(articleDto.getMerchantId()); + Integer id = mtArticleMapper.insert(mtArticle); + if (id > 0) { + return mtArticle; + } else { + return null; + } + } + + /** + * 根据ID获取文章 + * + * @param articleId 文章ID + * @return + */ + @Override + public MtArticle queryArticleById(Integer articleId) { + return mtArticleMapper.selectById(articleId); + } + + /** + * 根据ID获取文章详情 + * + * @param articleId 文章ID + * @return + */ + @Override + public ArticleDto getArticleDetail(Integer articleId) { + MtArticle mtArticle = mtArticleMapper.selectById(articleId); + if (mtArticle == null) { + return null; + } + ArticleDto articleDto = new ArticleDto(); + BeanUtils.copyProperties(mtArticle, articleDto); + String baseImage = settingService.getUploadBasePath(); + articleDto.setImage(baseImage + mtArticle.getImage()); + articleDto.setDescription(CommonUtil.fixVideo(mtArticle.getDescription())); + return articleDto; + } + + /** + * 编辑文章 + * + * @param articleDto 文章参数 + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "编辑文章") + public MtArticle updateArticle(ArticleDto articleDto) throws BusinessCheckException { + MtArticle mtArticle = queryArticleById(articleDto.getId()); + if (mtArticle == null) { + throw new BusinessCheckException("该文章状态异常"); + } + mtArticle.setId(articleDto.getId()); + if (articleDto.getImage() != null) { + mtArticle.setImage(articleDto.getImage()); + } + if (articleDto.getTitle() != null) { + mtArticle.setTitle(articleDto.getTitle()); + } + if (articleDto.getBrief() != null) { + mtArticle.setBrief(articleDto.getBrief()); + } + if (articleDto.getClick() != null) { + mtArticle.setClick(articleDto.getClick()); + } + if (articleDto.getMerchantId() != null) { + mtArticle.setMerchantId(articleDto.getMerchantId()); + } + if (articleDto.getStoreId() != null) { + mtArticle.setStoreId(articleDto.getStoreId()); + } + if (articleDto.getDescription() != null) { + mtArticle.setDescription(articleDto.getDescription()); + } + if (articleDto.getOperator() != null) { + mtArticle.setOperator(articleDto.getOperator()); + } + if (articleDto.getStatus() != null) { + mtArticle.setStatus(articleDto.getStatus()); + } + if (articleDto.getUrl() != null) { + mtArticle.setUrl(articleDto.getUrl()); + } + if (articleDto.getSort() != null) { + mtArticle.setSort(articleDto.getSort()); + } + mtArticle.setUpdateTime(new Date()); + mtArticleMapper.updateById(mtArticle); + return mtArticle; + } + + /** + * 根据条件搜索文章 + * + * @param params 搜索条件 + * @return + * */ + @Override + public List queryArticleListByParams(Map params) { + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey(): params.get("status").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String title = params.get("title") == null ? "" : params.get("title").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.like(MtArticle::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(title)) { + lambdaQueryWrapper.like(MtArticle::getTitle, title); + } + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtArticle::getStatus, status); + } + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtArticle::getStoreId, 0) + .or() + .eq(MtArticle::getStoreId, storeId)); + } + + lambdaQueryWrapper.orderByAsc(MtArticle::getSort); + List dataList = mtArticleMapper.selectList(lambdaQueryWrapper); + String baseImage = settingService.getUploadBasePath(); + + if (dataList.size() > 0) { + for (MtArticle article : dataList) { + article.setImage(baseImage + article.getImage()); + } + } + + return dataList; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java new file mode 100644 index 0000000..422bff1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java @@ -0,0 +1,326 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.BalanceDto; +import com.fuint.common.dto.OrderDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.BalancePage; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.DateUtil; +import com.fuint.common.util.PhoneFormatCheckUtils; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtBalanceMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.MtBalance; +import com.fuint.repository.model.MtBanner; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 余额管理业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class BalanceServiceImpl extends ServiceImpl implements BalanceService { + + private static final Logger logger = LoggerFactory.getLogger(BalanceServiceImpl.class); + + private MtBalanceMapper mtBalanceMapper; + + private MtUserMapper mtUserMapper; + + /** + * 微信相关服务接口 + * */ + private WeixinService weixinService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 短信发送服务接口 + * */ + private SendSmsService sendSmsService; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 分页查询余额列表 + * + * @param balancePage + * @return + */ + @Override + public PaginationResponse queryBalanceListByPagination(BalancePage balancePage) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtBalance::getStatus, StatusEnum.DISABLE.getKey()); + + String description = balancePage.getDescription(); + if (StringUtils.isNotBlank(description)) { + lambdaQueryWrapper.like(MtBalance::getDescription, description); + } + String status = balancePage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtBalance::getStatus, status); + } + Integer userId = balancePage.getUserId(); + if (userId != null) { + lambdaQueryWrapper.eq(MtBalance::getUserId, userId); + } + String orderSn = balancePage.getOrderSn(); + if (StringUtils.isNotBlank(orderSn)) { + lambdaQueryWrapper.eq(MtBalance::getOrderSn, orderSn); + } + String mobile = balancePage.getMobile(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtBalance::getMobile, mobile); + } + Integer merchantId = balancePage.getMerchantId(); + if (merchantId != null) { + lambdaQueryWrapper.eq(MtBalance::getMerchantId, merchantId); + } + String userNo = balancePage.getUserNo(); + if (StringUtil.isNotEmpty(userNo)) { + if (merchantId == null) { + merchantId = 0; + } + MtUser userInfo = memberService.queryMemberByUserNo(merchantId, userNo); + if (userInfo != null) { + lambdaQueryWrapper.eq(MtBalance::getUserId, userInfo.getId()); + } else { + lambdaQueryWrapper.eq(MtBalance::getUserId, -1); + } + } + Integer storeId = balancePage.getStoreId(); + if (storeId != null) { + lambdaQueryWrapper.eq(MtBalance::getStoreId, storeId); + } + lambdaQueryWrapper.orderByDesc(MtBalance::getId); + Page pageHelper = PageHelper.startPage(balancePage.getPage(), balancePage.getPageSize()); + List balanceList = mtBalanceMapper.selectList(lambdaQueryWrapper); + + List dataList = new ArrayList<>(); + for (MtBalance mtBalance : balanceList) { + MtUser userInfo = memberService.queryMemberById(mtBalance.getUserId()); + if (userInfo != null) { + userInfo.setMobile(CommonUtil.hidePhone(userInfo.getMobile())); + } + BalanceDto item = new BalanceDto(); + item.setId(mtBalance.getId()); + item.setAmount(mtBalance.getAmount()); + item.setDescription(mtBalance.getDescription()); + item.setCreateTime(mtBalance.getCreateTime()); + item.setUpdateTime(mtBalance.getUpdateTime()); + item.setUserId(mtBalance.getUserId()); + item.setUserInfo(userInfo); + item.setOrderSn(mtBalance.getOrderSn()); + item.setStatus(mtBalance.getStatus()); + item.setOperator(mtBalance.getOperator()); + dataList.add(item); + } + + PageRequest pageRequest = PageRequest.of(balancePage.getPage(), balancePage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, BalanceDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加余额记录 + * + * @param mtBalance + * @param updateBalance + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "会员余额变动") + public Boolean addBalance(MtBalance mtBalance, Boolean updateBalance) throws BusinessCheckException { + if (mtBalance.getUserId() < 0) { + return false; + } + Date nowDate = new Date(); + mtBalance.setStatus(StatusEnum.ENABLED.getKey()); + mtBalance.setCreateTime(nowDate); + mtBalance.setUpdateTime(nowDate); + + MtUser mtUser = mtUserMapper.selectById(mtBalance.getUserId()); + BigDecimal newAmount = mtUser.getBalance().add(mtBalance.getAmount()); + if (newAmount.compareTo(new BigDecimal("0")) < 0) { + return false; + } + if (mtUser.getStoreId() != null) { + mtBalance.setStoreId(mtUser.getStoreId()); + } + mtBalance.setMerchantId(mtUser.getMerchantId()); + if (updateBalance) { + mtUserMapper.updateUserBalance(mtUser.getMerchantId(), Arrays.asList(mtUser.getId()), mtBalance.getAmount()); + logger.info("会员余额变动:" + mtUser.getMobile() + ",会员ID:" + mtUser.getId() + ",会员余额:" + newAmount); + } + + if (PhoneFormatCheckUtils.isChinaPhoneLegal(mtUser.getMobile())) { + mtBalance.setMobile(mtUser.getMobile()); + } + mtBalanceMapper.insert(mtBalance); + + // 生成充值订单 + if (StringUtil.isEmpty(mtBalance.getOrderSn()) && mtBalance.getAmount().compareTo(new BigDecimal("0")) > 0) { + OrderDto orderDto = new OrderDto(); + orderDto.setMerchantId(mtBalance.getMerchantId()); + orderDto.setStoreId(mtBalance.getStoreId()); + orderDto.setUserId(mtBalance.getUserId()); + orderDto.setType(OrderTypeEnum.RECHARGE.getKey()); + orderDto.setPlatform(PlatformTypeEnum.PC.getCode()); + orderDto.setOrderMode(OrderModeEnum.ONESELF.getKey()); + orderDto.setAmount(mtBalance.getAmount()); + orderDto.setPayAmount(mtBalance.getAmount()); + orderDto.setPayType(PayTypeEnum.CASH.getKey()); + orderDto.setStatus(OrderStatusEnum.COMPLETE.getKey()); + orderDto.setPayStatus(PayStatusEnum.WAIT.getKey()); + orderDto.setOperator(mtBalance.getOperator()); + orderDto.setUsePoint(0); + MtOrder mtOrder = orderService.saveOrder(orderDto); + if (mtOrder != null) { + orderService.setOrderPayed(mtOrder.getId(), null); + } + } + mtUser = mtUserMapper.selectById(mtBalance.getUserId()); + try { + List mobileList = new ArrayList<>(); + mobileList.add(mtUser.getMobile()); + Map params = new HashMap<>(); + String action = ""; + if (mtBalance.getAmount().compareTo(new BigDecimal("0")) > 0) { + action = "+"; + } + params.put("amount", action + String.format("%.2f", mtBalance.getAmount())); + params.put("balance", String.format("%.2f", mtUser.getBalance())); + sendSmsService.sendSms(mtUser.getMerchantId(), "balance-change", mobileList, params); + } catch (Exception e) { + logger.error("余额变动短信发送失败:{}", e.getMessage()); + } + + // 发送小程序订阅消息 + Date nowTime = new Date(); + Map params = new HashMap<>(); + String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm"); + params.put("amount", mtBalance.getAmount()); + params.put("time", dateTime); + params.put("tips", "您的余额发生了变动,请留意~"); + weixinService.sendSubscribeMessage(mtBalance.getMerchantId(), mtBalance.getUserId(), mtUser.getOpenId(), WxMessageEnum.BALANCE_CHANGE.getKey(), "pages/user/index", params, nowTime); + + return true; + } + + /** + * 发放余额 + * + * @param accountInfo 账号信息 + * @param object 发放对象,all全部 + * @param userIds 会员ID + * @param amount 发放金额 + * @param remark 备注 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "发放余额") + public void distribute(AccountInfo accountInfo, String object, String userIds, String amount, String remark) throws BusinessCheckException { + if (!CommonUtil.isNumeric(amount)) { + throw new BusinessCheckException("充值金额必须是数字"); + } + if (!object.equals("all") && StringUtil.isEmpty(userIds)) { + throw new BusinessCheckException("请先选择会员"); + } + if (accountInfo.getMerchantId() == null || accountInfo.getMerchantId() < 1) { + throw new BusinessCheckException("平台账号不能执行该操作"); + } + BigDecimal balanceAmount = new BigDecimal(amount); + if (balanceAmount.compareTo(new BigDecimal(20000)) > 0) { + throw new BusinessCheckException("单次充值金额不能大于20000"); + } + + List userIdArr = new ArrayList<>(); + List userIdList = Arrays.asList(userIds.split(",")); + if (userIdList != null && userIdList.size() > 0) { + for (String userId : userIdList) { + if (StringUtil.isNotEmpty(userId) && !userIdArr.contains(Integer.parseInt(userId))) { + userIdArr.add(Integer.parseInt(userId)); + } + } + } + // 最多不能超过5000人 + if (userIdArr.size() > 5000) { + throw new BusinessCheckException("最多不能超过5000人"); + } + mtUserMapper.updateUserBalance(accountInfo.getMerchantId(), userIdArr, balanceAmount); + + if (userIdArr.size() > 0) { + for (Integer userId : userIdArr) { + MtBalance mtBalance = new MtBalance(); + mtBalance.setAmount(new BigDecimal(amount)); + mtBalance.setUserId(userId); + mtBalance.setStoreId(accountInfo.getStoreId()); + mtBalance.setMerchantId(accountInfo.getMerchantId()); + mtBalance.setDescription(remark); + mtBalance.setOperator(accountInfo.getAccountName()); + addBalance(mtBalance, false); + } + } else { + MtBalance mtBalance = new MtBalance(); + mtBalance.setAmount(new BigDecimal(amount)); + mtBalance.setUserId(0); // userId为0表示全体会员 + mtBalance.setMerchantId(accountInfo.getMerchantId()); + mtBalance.setDescription(remark); + mtBalance.setOperator(accountInfo.getAccountName()); + mtBalance.setStatus(StatusEnum.ENABLED.getKey()); + mtBalance.setCreateTime(new Date()); + mtBalance.setUpdateTime(new Date()); + mtBalanceMapper.insert(mtBalance); + } + } + + /** + * 获取订单余额记录 + * + * @param orderSn + * @return + * */ + @Override + public List getBalanceListByOrderSn(String orderSn) { + return mtBalanceMapper.getBalanceListByOrderSn(orderSn); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/BannerServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/BannerServiceImpl.java new file mode 100644 index 0000000..c3d6362 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/BannerServiceImpl.java @@ -0,0 +1,257 @@ +package com.fuint.common.service.impl; + +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.fuint.common.param.BannerPage; +import com.fuint.common.service.StoreService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtBanner; +import com.fuint.common.dto.BannerDto; +import com.fuint.common.service.BannerService; +import com.fuint.common.service.SettingService; +import com.fuint.common.enums.StatusEnum; +import com.fuint.repository.mapper.MtBannerMapper; + +import com.fuint.repository.model.MtStore; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.pagehelper.Page; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 焦点图服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class BannerServiceImpl extends ServiceImpl implements BannerService { + + private static final Logger logger = LoggerFactory.getLogger(BannerServiceImpl.class); + + private MtBannerMapper mtBannerMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 分页查询焦点图列表 + * + * @param bannerPage + * @return + */ + @Override + public PaginationResponse queryBannerListByPagination(BannerPage bannerPage) { + Page pageHelper = PageHelper.startPage(bannerPage.getPage(), bannerPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtBanner::getStatus, StatusEnum.DISABLE.getKey()); + + String title = bannerPage.getTitle(); + if (StringUtils.isNotBlank(title)) { + lambdaQueryWrapper.like(MtBanner::getTitle, title); + } + String status = bannerPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtBanner::getStatus, status); + } + Integer merchantId = bannerPage.getMerchantId(); + if (merchantId != null) { + lambdaQueryWrapper.eq(MtBanner::getMerchantId, merchantId); + } + Integer storeId = bannerPage.getStoreId(); + if (storeId != null) { + lambdaQueryWrapper.eq(MtBanner::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByAsc(MtBanner::getSort); + List dataList = mtBannerMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(bannerPage.getPage(), bannerPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtBanner.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加焦点图 + * + * @param bannerDto 焦点图信息 + * @return + */ + @Override + @OperationServiceLog(description = "新增焦点图") + public MtBanner addBanner(BannerDto bannerDto) throws BusinessCheckException { + MtBanner mtBanner = new MtBanner(); + BeanUtils.copyProperties(bannerDto, mtBanner); + Integer storeId = bannerDto.getStoreId() == null ? 0 : bannerDto.getStoreId(); + if (bannerDto.getMerchantId() == null || bannerDto.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + mtBanner.setMerchantId(mtStore.getMerchantId()); + } + } + if (mtBanner.getMerchantId() == null || mtBanner.getMerchantId() <= 0) { + throw new BusinessCheckException("新增焦点图失败:所属商户不能为空!"); + } + if (mtBanner.getMerchantId() == null || mtBanner.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + mtBanner.setStoreId(storeId); + mtBanner.setStatus(StatusEnum.ENABLED.getKey()); + mtBanner.setUpdateTime(new Date()); + mtBanner.setCreateTime(new Date()); + Integer id = mtBannerMapper.insert(mtBanner); + if (id > 0) { + return mtBanner; + } else { + logger.error("新增焦点图失败."); + throw new BusinessCheckException("抱歉,新增焦点图失败!"); + } + } + + /** + * 根据ID获取Banner信息 + * + * @param id BannerID + * @return + */ + @Override + public MtBanner queryBannerById(Integer id) { + return mtBannerMapper.selectById(id); + } + + /** + * 根据ID删除Banner图 + * + * @param id BannerID + * @param operator 操作人 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除Banner图") + public void deleteBanner(Integer id, String operator) { + MtBanner mtBanner = queryBannerById(id); + if (null == mtBanner) { + return; + } + mtBanner.setStatus(StatusEnum.DISABLE.getKey()); + mtBanner.setUpdateTime(new Date()); + mtBannerMapper.updateById(mtBanner); + } + + /** + * 修改Banner图 + * + * @param bannerDto + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新焦点图") + public MtBanner updateBanner(BannerDto bannerDto) throws BusinessCheckException { + MtBanner mtBanner = queryBannerById(bannerDto.getId()); + if (mtBanner == null) { + throw new BusinessCheckException("该Banner状态异常"); + } + + mtBanner.setId(bannerDto.getId()); + if (bannerDto.getImage() != null) { + mtBanner.setImage(bannerDto.getImage()); + } + if (bannerDto.getTitle() != null) { + mtBanner.setTitle(bannerDto.getTitle()); + } + if (bannerDto.getStoreId() != null) { + mtBanner.setStoreId(bannerDto.getStoreId()); + } + if (bannerDto.getDescription() != null) { + mtBanner.setDescription(bannerDto.getDescription()); + } + if (bannerDto.getOperator() != null) { + mtBanner.setOperator(bannerDto.getOperator()); + } + if (bannerDto.getStatus() != null) { + mtBanner.setStatus(bannerDto.getStatus()); + } + if (bannerDto.getUrl() != null) { + mtBanner.setUrl(bannerDto.getUrl()); + } + if (bannerDto.getSort() != null) { + mtBanner.setSort(bannerDto.getSort()); + } + mtBanner.setUpdateTime(new Date()); + mtBannerMapper.updateById(mtBanner); + return mtBanner; + } + + /** + * 根据条件搜索焦点图 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + @Override + public List queryBannerListByParams(Map params) { + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey(): params.get("status").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + String title = params.get("title") == null ? "" : params.get("title").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(title)) { + lambdaQueryWrapper.like(MtBanner::getTitle, title); + } + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtBanner::getStatus, status); + } + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtBanner::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtBanner::getStoreId, 0) + .or() + .eq(MtBanner::getStoreId, storeId)); + } + + lambdaQueryWrapper.orderByAsc(MtBanner::getSort); + List dataList = mtBannerMapper.selectList(lambdaQueryWrapper); + String baseImage = settingService.getUploadBasePath(); + + if (dataList.size() > 0) { + for (MtBanner banner : dataList) { + banner.setImage(baseImage + banner.getImage()); + } + } + + return dataList; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/BookCateServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/BookCateServiceImpl.java new file mode 100644 index 0000000..470bdd8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/BookCateServiceImpl.java @@ -0,0 +1,231 @@ +package com.fuint.common.service.impl; + +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.fuint.common.param.BookCatePage; +import com.fuint.common.service.BookCateService; +import com.fuint.common.service.StoreService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtBookCateMapper; +import com.fuint.common.service.SettingService; +import com.fuint.common.enums.StatusEnum; +import com.fuint.repository.model.MtBookCate; +import com.fuint.repository.model.MtStore; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.pagehelper.Page; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 预约分类服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class BookCateServiceImpl extends ServiceImpl implements BookCateService { + + private static final Logger logger = LoggerFactory.getLogger(BookCateServiceImpl.class); + + private MtBookCateMapper mtBookCateMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 分页查询预约分类列表 + * + * @param bookCatePage + * @return + */ + @Override + public PaginationResponse queryBookCateListByPagination(BookCatePage bookCatePage) { + Page pageHelper = PageHelper.startPage(bookCatePage.getPage(), bookCatePage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtBookCate::getStatus, StatusEnum.DISABLE.getKey()); + + String name = bookCatePage.getName(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtBookCate::getName, name); + } + String status = bookCatePage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtBookCate::getStatus, status); + } + Integer merchantId = bookCatePage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtBookCate::getMerchantId, merchantId); + } + Integer storeId = bookCatePage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtBookCate::getStoreId, 0) + .or() + .eq(MtBookCate::getStoreId, storeId)); + } + + lambdaQueryWrapper.orderByAsc(MtBookCate::getSort); + List dataList = mtBookCateMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(bookCatePage.getPage(), bookCatePage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtBookCate.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加预约分类 + * + * @param mtBookCate 分类信息 + * @return + */ + @Override + @OperationServiceLog(description = "添加预约分类") + public MtBookCate addBookCate(MtBookCate mtBookCate) throws BusinessCheckException { + MtBookCate bookCate = new MtBookCate(); + Integer storeId = mtBookCate.getStoreId() == null ? 0 : mtBookCate.getStoreId(); + if (mtBookCate.getMerchantId() == null || mtBookCate.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null && mtStore.getMerchantId() != null) { + bookCate.setMerchantId(mtStore.getMerchantId()); + } + } + if (mtBookCate.getMerchantId() == null || mtBookCate.getMerchantId() <= 0) { + throw new BusinessCheckException("新增预约分类失败:所属商户不能为空!"); + } + if (StringUtil.isEmpty(mtBookCate.getName())) { + throw new BusinessCheckException("新增预约分类失败:分类名称不能为空!"); + } + if (StringUtil.isEmpty(mtBookCate.getLogo())) { + throw new BusinessCheckException("新增预约分类失败:封面图片不能为空!"); + } + bookCate.setStoreId(storeId); + bookCate.setName(mtBookCate.getName()); + bookCate.setLogo(mtBookCate.getLogo()); + bookCate.setDescription(mtBookCate.getDescription()); + bookCate.setStatus(StatusEnum.ENABLED.getKey()); + bookCate.setUpdateTime(new Date()); + bookCate.setCreateTime(new Date()); + bookCate.setSort(mtBookCate.getSort()); + bookCate.setOperator(mtBookCate.getOperator()); + bookCate.setMerchantId(mtBookCate.getMerchantId()); + Integer id = mtBookCateMapper.insert(bookCate); + if (id > 0) { + return bookCate; + } else { + logger.error("新增预约分类失败."); + throw new BusinessCheckException("抱歉,新增预约分类失败!"); + } + } + + /** + * 根据ID获取预约分类信息 + * + * @param id 预约分类ID + * @return + */ + @Override + public MtBookCate getBookCateById(Integer id) { + return mtBookCateMapper.selectById(id); + } + + /** + * 修改预约分类 + * + * @param mtBookCate + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改预约分类") + public MtBookCate updateBookCate(MtBookCate mtBookCate) throws BusinessCheckException { + MtBookCate bookCate = getBookCateById(mtBookCate.getId()); + if (bookCate == null) { + throw new BusinessCheckException("该预约分类状态异常"); + } + + bookCate.setId(mtBookCate.getId()); + if (mtBookCate.getLogo() != null) { + bookCate.setLogo(mtBookCate.getLogo()); + } + if (mtBookCate.getName() != null) { + bookCate.setName(mtBookCate.getName()); + } + if (mtBookCate.getStoreId() != null) { + bookCate.setStoreId(mtBookCate.getStoreId()); + } + if (mtBookCate.getDescription() != null) { + bookCate.setDescription(mtBookCate.getDescription()); + } + if (mtBookCate.getOperator() != null) { + bookCate.setOperator(mtBookCate.getOperator()); + } + if (mtBookCate.getStatus() != null) { + bookCate.setStatus(mtBookCate.getStatus()); + } + if (mtBookCate.getSort() != null) { + bookCate.setSort(mtBookCate.getSort()); + } + bookCate.setUpdateTime(new Date()); + mtBookCateMapper.updateById(bookCate); + + return bookCate; + } + + /** + * 获取可用的预约类别 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @throws BusinessCheckException + * @return + * */ + @Override + public List getAvailableBookCate(Integer merchantId, Integer storeId) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtBookCate::getStatus, StatusEnum.ENABLED.getKey()); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtBookCate::getMerchantId, merchantId); + } + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtBookCate::getStoreId, 0) + .or() + .eq(MtBookCate::getStoreId, storeId)); + } + lambdaQueryWrapper.orderByAsc(MtBookCate::getSort); + List dataList = mtBookCateMapper.selectList(lambdaQueryWrapper); + String baseImage = settingService.getUploadBasePath(); + if (dataList.size() > 0) { + for (MtBookCate mtBookCate : dataList) { + mtBookCate.setLogo(baseImage + mtBookCate.getLogo()); + } + } + return dataList; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java new file mode 100644 index 0000000..0b11676 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/BookItemServiceImpl.java @@ -0,0 +1,369 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.BookItemDto; +import com.fuint.common.enums.BookStatusEnum; +import com.fuint.common.param.BookItemPage; +import com.fuint.common.param.BookableParam; +import com.fuint.common.service.BookItemService; +import com.fuint.common.service.BookService; +import com.fuint.common.service.StoreService; +import com.fuint.common.util.SeqUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.*; +import com.fuint.common.enums.StatusEnum; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.pagehelper.Page; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.ParseException; +import java.util.*; + +/** + * 预约订单服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class BookItemServiceImpl extends ServiceImpl implements BookItemService { + + private static final Logger logger = LoggerFactory.getLogger(BookItemServiceImpl.class); + + private MtBookItemMapper mtBookItemMapper; + + private MtBookMapper mtBookMapper; + + private MtStoreMapper mtStoreMapper; + + private MtOrderGoodsMapper mtOrderGoodsMapper; + + private MtGoodsMapper mtGoodsMapper; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 预约项目服务接口 + * */ + private BookService bookService; + + /** + * 分页查询预约订单列表 + * + * @param bookItemPage + * @return + */ + @Override + public PaginationResponse queryBookItemListByPagination(BookItemPage bookItemPage) { + Page pageHelper = PageHelper.startPage(bookItemPage.getPage(), bookItemPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtBookItem::getStatus, StatusEnum.DISABLE.getKey()); + + String mobile = bookItemPage.getMobile(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.like(MtBookItem::getMobile, mobile); + } + String contact = bookItemPage.getContact(); + if (StringUtils.isNotBlank(contact)) { + lambdaQueryWrapper.like(MtBookItem::getContact, contact); + } + String status = bookItemPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtBookItem::getStatus, status); + } + if (bookItemPage.getMerchantId() != null) { + lambdaQueryWrapper.eq(MtBookItem::getMerchantId, bookItemPage.getMerchantId()); + } + if (bookItemPage.getStoreId() != null) { + lambdaQueryWrapper.eq(MtBookItem::getStoreId, bookItemPage.getStoreId()); + } + if (bookItemPage.getUserId() != null) { + lambdaQueryWrapper.eq(MtBookItem::getUserId, bookItemPage.getUserId()); + } + if (bookItemPage.getCateId() != null) { + lambdaQueryWrapper.eq(MtBookItem::getCateId, bookItemPage.getCateId()); + } + + lambdaQueryWrapper.orderByDesc(MtBookItem::getId); + List bookItemList = mtBookItemMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (bookItemList != null && bookItemList.size() > 0) { + for (MtBookItem mtBookItem : bookItemList) { + BookItemDto bookItemDto = new BookItemDto(); + BeanUtils.copyProperties(mtBookItem, bookItemDto); + MtBook mtBook = mtBookMapper.selectById(mtBookItem.getBookId()); + if (mtBook != null) { + bookItemDto.setBookName(mtBook.getName()); + } + if (mtBookItem.getGoodsId() != null && mtBookItem.getGoodsId() > 0) { + MtOrderGoods mtOrderGoods = mtOrderGoodsMapper.selectById(mtBookItem.getGoodsId()); + if (mtOrderGoods != null) { + MtGoods mtGoods = mtGoodsMapper.selectById(mtOrderGoods.getGoodsId()); + if (mtGoods != null) { + bookItemDto.setGoodsName(mtGoods.getName()); + } + } + } + bookItemDto.setStatusName(BookStatusEnum.getValue(bookItemDto.getStatus())); + dataList.add(bookItemDto); + } + } + + PageRequest pageRequest = PageRequest.of(bookItemPage.getPage(), bookItemPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, BookItemDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 新增预约订单 + * + * @param mtBookItem 预约信息 + * @return + */ + @Override + @OperationServiceLog(description = "新增预约订单") + public MtBookItem addBookItem(MtBookItem mtBookItem) throws BusinessCheckException, ParseException { + Integer storeId = mtBookItem.getStoreId() == null ? 0 : mtBookItem.getStoreId(); + if (mtBookItem.getMerchantId() == null || mtBookItem.getMerchantId() <= 0) { + throw new BusinessCheckException("新增预约订单失败:所属商户不能为空!"); + } + if (mtBookItem.getMerchantId() == null || mtBookItem.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + mtBookItem.setMerchantId(mtStore.getMerchantId()); + } + } + + BookableParam param = new BookableParam(); + param.setBookId(mtBookItem.getBookId()); + param.setDate(mtBookItem.getServiceDate()); + param.setTime(mtBookItem.getServiceTime()); + List bookable = bookService.isBookable(param); + if (bookable.size() <= 0) { + throw new BusinessCheckException("当前时间段不可预约,请重新选择!"); + } + + Map params = new HashMap<>(); + params.put("merchantId", mtBookItem.getMerchantId()); + params.put("storeId", mtBookItem.getMerchantId()); + params.put("bookId", mtBookItem.getBookId()); + params.put("mobile", mtBookItem.getMobile()); + if (mtBookItem.getGoodsId() != null && mtBookItem.getGoodsId() > 0) { + params.put("goodsId", mtBookItem.getGoodsId()); + } + params.put("status", BookStatusEnum.CREATED.getKey()); + List data = queryBookItemListByParams(params); + if (data != null && data.size() > 0) { + throw new BusinessCheckException("您已提交预约,请等待确认!"); + } + + mtBookItem.setStatus(BookStatusEnum.CREATED.getKey()); + mtBookItem.setUpdateTime(new Date()); + mtBookItem.setCreateTime(new Date()); + mtBookItem.setVerifyCode(SeqUtil.getRandomNumber(4)); + Integer id = mtBookItemMapper.insert(mtBookItem); + if (id > 0) { + return mtBookItem; + } else { + logger.error("新增预约记录失败."); + throw new BusinessCheckException("抱歉,新增预约记录失败!"); + } + } + + /** + * 根据ID获取预约订单信息 + * + * @param id 预约订单ID + * @return + */ + @Override + public MtBookItem getBookItemById(Integer id) { + return mtBookItemMapper.selectById(id); + } + + /** + * 获取用户预约订单信息 + * + * @param bookId 预约项目ID + * @param userId 用户ID + * @param orderGoodsId 订单商品ID + * @return + */ + public MtBookItem getUserBookItem(Integer bookId, Integer userId, Integer orderGoodsId) { + Map params = new HashMap<>(); + params.put("bookId", bookId); + params.put("userId", userId); + params.put("goodsId", orderGoodsId); + List bookItemList = queryBookItemListByParams(params); + if (bookItemList != null && bookItemList.size() > 0) { + return bookItemList.get(0); + } + return null; + } + + /** + * 根据ID获取预约订单详情 + * + * @param id 预约订单ID + * @throws BusinessCheckException + * @return + */ + @Override + public BookItemDto getBookDetail(Integer id) throws BusinessCheckException { + MtBookItem mtBookItem = mtBookItemMapper.selectById(id); + if (mtBookItem == null) { + throw new BusinessCheckException("预约不存在."); + } + BookItemDto bookItemDto = new BookItemDto(); + BeanUtils.copyProperties(mtBookItem, bookItemDto); + + MtBook mtBook = mtBookMapper.selectById(mtBookItem.getBookId()); + if (mtBook != null) { + bookItemDto.setBookName(mtBook.getName()); + } + + if (mtBookItem.getStoreId() != null) { + MtStore mtStore = mtStoreMapper.selectById(mtBookItem.getStoreId()); + if (mtStore != null) { + bookItemDto.setStoreInfo(mtStore); + } + } + bookItemDto.setStatusName(BookStatusEnum.getValue(bookItemDto.getStatus())); + return bookItemDto; + } + + /** + * 修改预约订单 + * + * @param mtBookItem + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改预约订单") + public MtBookItem updateBookItem(MtBookItem mtBookItem) throws BusinessCheckException { + MtBookItem bookItem = getBookItemById(mtBookItem.getId()); + if (bookItem == null) { + throw new BusinessCheckException("该预约订单信息异常"); + } + + bookItem.setId(mtBookItem.getId()); + if (mtBookItem.getBookId() != null) { + bookItem.setBookId(mtBookItem.getBookId()); + } + if (mtBookItem.getStoreId() != null) { + bookItem.setStoreId(mtBookItem.getStoreId()); + } + if (mtBookItem.getRemark() != null) { + bookItem.setRemark(mtBookItem.getRemark()); + } + if (mtBookItem.getOperator() != null) { + bookItem.setOperator(mtBookItem.getOperator()); + } + if (mtBookItem.getStatus() != null) { + bookItem.setStatus(mtBookItem.getStatus()); + } + if (mtBookItem.getMobile() != null) { + bookItem.setMobile(mtBookItem.getMobile()); + } + + bookItem.setUpdateTime(new Date()); + mtBookItemMapper.updateById(bookItem); + return bookItem; + } + + /** + * 根据条件搜索预约订单 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryBookItemListByParams(Map params) { + String status = params.get("status") == null ? "" : params.get("status").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + String mobile = params.get("mobile") == null ? "" : params.get("mobile").toString(); + String contact = params.get("contact") == null ? "" : params.get("contact").toString(); + String bookId = params.get("bookId") == null ? "" : params.get("bookId").toString(); + String userId = params.get("userId") == null ? "" : params.get("userId").toString(); + String goodsId = params.get("goodsId") == null ? "" : params.get("goodsId").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtBookItem::getStatus, BookStatusEnum.DELETE.getKey()); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtBookItem::getMobile, mobile); + } + if (StringUtils.isNotBlank(contact)) { + lambdaQueryWrapper.like(MtBookItem::getContact, contact); + } + if (StringUtils.isNotBlank(bookId)) { + lambdaQueryWrapper.like(MtBookItem::getBookId, bookId); + } + if (StringUtils.isNotBlank(userId)) { + lambdaQueryWrapper.like(MtBookItem::getUserId, userId); + } + if (StringUtils.isNotBlank(goodsId)) { + lambdaQueryWrapper.like(MtBookItem::getGoodsId, goodsId); + } + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtBookItem::getStatus, status); + } + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtBookItem::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtBookItem::getStoreId, storeId); + } + lambdaQueryWrapper.orderByDesc(MtBookItem::getId); + return mtBookItemMapper.selectList(lambdaQueryWrapper); + } + + /** + * 取消预约 + * + * @param id 预约ID + * @param remark 备注信息 + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional + public Boolean cancelBook(Integer id, String remark) throws BusinessCheckException { + MtBookItem mtBookItem = getBookItemById(id); + if (mtBookItem == null) { + throw new BusinessCheckException("该预约订单信息异常"); + } + if (StringUtil.isNotEmpty(remark)) { + mtBookItem.setRemark(mtBookItem.getRemark() == null ? remark : mtBookItem.getRemark() + remark); + } + mtBookItem.setStatus(BookStatusEnum.CANCEL.getKey()); + mtBookItemMapper.updateById(mtBookItem); + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/BookServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/BookServiceImpl.java new file mode 100644 index 0000000..f7a7ade --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/BookServiceImpl.java @@ -0,0 +1,403 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.BookDto; +import com.fuint.common.dto.DayDto; +import com.fuint.common.dto.TimeDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.BookPage; +import com.fuint.common.param.BookableParam; +import com.fuint.common.service.BookService; +import com.fuint.common.service.SettingService; +import com.fuint.common.service.StoreService; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtBookItemMapper; +import com.fuint.repository.mapper.MtBookMapper; +import com.fuint.repository.model.MtBanner; +import com.fuint.repository.model.MtBook; +import com.fuint.repository.model.MtStore; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * 预约服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class BookServiceImpl extends ServiceImpl implements BookService { + + private static final Logger logger = LoggerFactory.getLogger(BookServiceImpl.class); + + private MtBookMapper mtBookMapper; + + private MtBookItemMapper mtBookItemMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 分页查询预约列表 + * + * @param bookPage + * @return + */ + @Override + public PaginationResponse queryBookListByPagination(BookPage bookPage) { + Page pageHelper = PageHelper.startPage(bookPage.getPage(), bookPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtBook::getStatus, StatusEnum.DISABLE.getKey()); + + String name = bookPage.getName(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtBook::getName, name); + } + Integer cateId = bookPage.getCateId(); + if (cateId != null && cateId > 0) { + lambdaQueryWrapper.like(MtBook::getCateId, cateId); + } + if (StringUtils.isNotBlank(bookPage.getStatus())) { + lambdaQueryWrapper.eq(MtBook::getStatus, bookPage.getStatus()); + } + Integer merchantId = bookPage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtBook::getMerchantId, merchantId); + } + if (bookPage.getStoreId() != null) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtBook::getStoreId, 0) + .or() + .eq(MtBook::getStoreId, bookPage.getStoreId())); + } + + lambdaQueryWrapper.orderByAsc(MtBook::getSort); + List bookList = mtBookMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + String baseImage = settingService.getUploadBasePath(); + if (bookList != null && bookList.size() > 0) { + for (MtBook mtBook : bookList) { + BookDto bookDto = new BookDto(); + BeanUtils.copyProperties(mtBook, bookDto); + bookDto.setLogo(baseImage + mtBook.getLogo()); + dataList.add(bookDto); + } + } + + PageRequest pageRequest = PageRequest.of(bookPage.getPage(), bookPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, BookDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加预约项目 + * + * @param mtBook 预约信息 + * @return + */ + @Override + @OperationServiceLog(description = "添加预约项目") + public MtBook addBook(MtBook mtBook) throws BusinessCheckException { + Integer storeId = mtBook.getStoreId() == null ? 0 : mtBook.getStoreId(); + if (mtBook.getMerchantId() == null || mtBook.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + mtBook.setMerchantId(mtStore.getMerchantId()); + } + } + if (mtBook.getMerchantId() == null || mtBook.getMerchantId() <= 0) { + throw new BusinessCheckException("新增预约失败:所属商户不能为空!"); + } + if (StringUtil.isEmpty(mtBook.getName())) { + throw new BusinessCheckException("新增预约失败:项目名称不能为空!"); + } + if (StringUtil.isEmpty(mtBook.getLogo())) { + throw new BusinessCheckException("新增预约失败:封面图片不能为空!"); + } + mtBook.setStoreId(storeId); + mtBook.setStatus(StatusEnum.ENABLED.getKey()); + mtBook.setUpdateTime(new Date()); + mtBook.setCreateTime(new Date()); + Integer id = mtBookMapper.insert(mtBook); + if (id > 0) { + return mtBook; + } else { + logger.error("新增预约失败."); + throw new BusinessCheckException("抱歉,新增预约失败!"); + } + } + + /** + * 根据ID获取预约项目信息 + * + * @param id 预约项目ID + * @param fillDate 填充日期 + * @return + */ + @Override + public BookDto getBookById(Integer id, boolean fillDate) throws ParseException { + BookDto bookDto = new BookDto(); + MtBook mtBook = mtBookMapper.selectById(id); + if (mtBook == null) { + return null; + } + BeanUtils.copyProperties(mtBook, bookDto); + + List dateList = new ArrayList<>(); + String serviceDates = mtBook.getServiceDates(); + + // 未填写日期,则未来7天都可以预约 + if (StringUtil.isEmpty(serviceDates)) { + List dates = new ArrayList<>(); + LocalDate today = LocalDate.now(); + for (int i = 0; i < 7; i++) { + LocalDate date = today.plusDays(i + 1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String dateString = date.format(formatter); + dates.add(dateString); + } + serviceDates = String.join(",", dates); + if (fillDate) { + bookDto.setServiceDates(serviceDates); + } + } + + if (StringUtil.isNotEmpty(serviceDates)) { + List dates = Arrays.asList(serviceDates.split(",").clone()); + if (dates.size() > 0) { + for (String date : dates) { + Date currentDate = DateUtil.parseDate(date + " 23:59:59"); + Date now = new Date(); + SimpleDateFormat format = new SimpleDateFormat("EEEE", Locale.CHINA); + String week = format.format(currentDate); + DayDto day = new DayDto(); + day.setWeek(week); + day.setDate(DateUtil.formatDate(currentDate, "MM-dd")); + if (now.compareTo(currentDate) <= 0) { + day.setEnable(true); + } else { + day.setEnable(false); + } + dateList.add(day); + } + } + } + bookDto.setDateList(dateList); + + List timeList = new ArrayList<>(); + String serviceTimes = mtBook.getServiceTimes(); + + // 未填写时段,则未来 + if (StringUtil.isEmpty(serviceTimes)) { + serviceTimes = "08:30-12:00-1,14:00-18:00-1"; + } + + if (StringUtil.isNotEmpty(serviceTimes) && bookDto.getDateList().size() > 0) { + List times = Arrays.asList(serviceTimes.split(",").clone()); + if (times.size() > 0) { + for (String time : times) { + TimeDto timeDto = new TimeDto(); + String arr[] = time.split("-"); + timeDto.setTime(arr[0] + "-" + arr[1]); + timeDto.setEnable(true); + timeList.add(timeDto); + } + } + } + bookDto.setTimeList(timeList); + + return bookDto; + } + + /** + * 修改预约项目 + * + * @param mtBook + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改预约项目") + public MtBook updateBook(MtBook mtBook) throws BusinessCheckException { + MtBook book = mtBookMapper.selectById(mtBook.getId()); + if (book == null) { + throw new BusinessCheckException("该预约项目状态异常"); + } + if (mtBook.getLogo() != null) { + book.setLogo(mtBook.getLogo()); + } + if (mtBook.getCateId() != null) { + book.setCateId(mtBook.getCateId()); + } + if (book.getName() != null) { + book.setName(mtBook.getName()); + } + if (mtBook.getStoreId() != null) { + book.setStoreId(mtBook.getStoreId()); + } + if (mtBook.getDescription() != null) { + book.setDescription(mtBook.getDescription()); + } + if (mtBook.getOperator() != null) { + book.setOperator(mtBook.getOperator()); + } + if (mtBook.getStatus() != null) { + book.setStatus(mtBook.getStatus()); + } + if (mtBook.getGoodsId() != null) { + book.setGoodsId(mtBook.getGoodsId()); + } + if (mtBook.getSort() != null) { + book.setSort(mtBook.getSort()); + } + if (mtBook.getServiceDates() != null) { + book.setServiceDates(mtBook.getServiceDates()); + } + if (mtBook.getServiceTimes() != null) { + book.setServiceTimes(mtBook.getServiceTimes()); + } + if (mtBook.getServiceStaffIds() != null) { + book.setServiceStaffIds(mtBook.getServiceStaffIds()); + } + book.setUpdateTime(new Date()); + mtBookMapper.updateById(book); + return book; + } + + /** + * 是否可预约 + * + * @param param + * @throws BusinessCheckException + * @return + * */ + @Override + public List isBookable(BookableParam param) throws BusinessCheckException, ParseException { + MtBook mtBook = mtBookMapper.selectById(param.getBookId()); + List result = new ArrayList<>(); + if (mtBook == null) { + throw new BusinessCheckException("预约项目不存在"); + } + + List bookList = new ArrayList<>(); + if (StringUtil.isNotEmpty(param.getDate())) { + bookList = mtBookItemMapper.getBookList(param.getBookId(), param.getDate(), param.getTime()); + } + Integer bookNum = bookList.size(); + + Integer limit = 0; + String serviceTime = mtBook.getServiceTimes(); + + // 未填写时段,则未来 + if (StringUtil.isEmpty(serviceTime)) { + serviceTime = "08:30-12:00-1,14:00-18:00-1"; + } + + if (StringUtil.isNotEmpty(serviceTime)) { + String[] times = serviceTime.split(","); + if (times.length > 0) { + for (String str : times) { + if (str.indexOf(param.getTime()) >= 0) { + String[] timeArr = str.split("-"); + if (timeArr.length > 2) { + limit = Integer.parseInt(timeArr[2]); + } + } + } + } + } + Date now = new Date(); + if (bookNum < limit) { + if (StringUtil.isNotEmpty(param.getTime())) { + String[] arr = param.getTime().split("-"); + String dateTime = param.getDate() + " " + arr[1]+":00"; + Date currentDate = DateUtil.parseDate(dateTime); + if (now.compareTo(currentDate) < 0) { + result.add(param.getTime()); + } + } else { + String[] times = mtBook.getServiceTimes().split(","); + if (times.length > 0) { + for (String str : times) { + String[] arr = str.split("-"); + if (arr.length > 2) { + String item = arr[0] + "-" + arr[1]; + String dateTime = param.getDate() + " " + arr[1]+":00"; + Date currentDate = DateUtil.parseDate(dateTime); + if (!bookList.contains(item) && now.compareTo(currentDate) < 0) { + result.add(item); + } + } + } + } + } + } + return result; + } + + /** + * 获取预约项目列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + public List getBookList(Integer merchantId, Integer storeId) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtBook::getStatus, StatusEnum.ENABLED.getKey()); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtBook::getMerchantId, merchantId); + } + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtBook::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByAsc(MtBook::getSort); + List dataList = mtBookMapper.selectList(lambdaQueryWrapper); + String baseImage = settingService.getUploadBasePath(); + + if (dataList.size() > 0) { + for (MtBook book : dataList) { + book.setLogo(baseImage + book.getLogo()); + } + } + + return dataList; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CaptchaServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CaptchaServiceImpl.java new file mode 100644 index 0000000..87df6a6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CaptchaServiceImpl.java @@ -0,0 +1,107 @@ +package com.fuint.common.service.impl; + +import com.fuint.common.util.RedisUtil; +import com.fuint.common.service.CaptchaService; +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.Producer; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import javax.servlet.http.HttpSession; +import java.awt.image.BufferedImage; + +/** + * 图形验证码插件服务类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CaptchaServiceImpl implements CaptchaService { + + private static final Logger logger = LoggerFactory.getLogger(CaptchaServiceImpl.class); + + /** + * 图形验证码生成器 + * */ + private Producer captchaProducer; + + /** + * 生成图形验证码,并保存至Session + * @param session Session + * @return BufferedImage + */ + public BufferedImage getCode(HttpSession session){ + // 生成验证码 + String codeText = captchaProducer.createText(); + BufferedImage codeImage = captchaProducer.createImage(codeText); + logger.info("生成验证码{}", codeText); + + // 设置Session信息 + if (session != null) { + session.setAttribute(Constants.KAPTCHA_SESSION_KEY, codeText); + } + + return codeImage; + } + + /** + * 图形验证码校验 + * @param code 输入的验证码 + * @param session Session + * @return Boolean + */ + public Boolean checkCode(String code, HttpSession session){ + String sessionCode = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY); + if (StringUtil.isEmpty(code) || StringUtil.isEmpty(sessionCode)) { + return false; + } else { + if (code.equalsIgnoreCase(sessionCode)) { + return true; + } else { + return false; + } + } + } + + /** + * 生成图形验证码 + * @return BufferedImage + */ + public BufferedImage getCodeByUuid(String uuid) { + // 生成验证码 + String codeText = captchaProducer.createText(); + BufferedImage codeImage = captchaProducer.createImage(codeText); + logger.info("生成验证码 = {}, uuid = {}", codeText, uuid); + + if (codeText != null) { + RedisUtil.set(uuid, codeText, 1800); + } + + return codeImage; + } + + /** + * 图形验证码校验 + * @param code 输入的验证码 + * @param uuid uuid + * @return Boolean + */ + public Boolean checkCodeByUuid(String code, String uuid){ + String vCode = RedisUtil.get(uuid); + logger.info("checkCodeByUuid vCode = {}, code = {}, uuid = {}", vCode, code, uuid); + if (StringUtil.isEmpty(code) || StringUtil.isEmpty(vCode)) { + return false; + } else { + if (code.equalsIgnoreCase(vCode)) { + return true; + } else { + return false; + } + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CartServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CartServiceImpl.java new file mode 100644 index 0000000..7a9d601 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CartServiceImpl.java @@ -0,0 +1,322 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.CartService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.mapper.MtCartMapper; +import com.fuint.repository.mapper.MtGoodsMapper; +import com.fuint.repository.mapper.MtGoodsSkuMapper; +import com.fuint.repository.model.MtCart; +import com.fuint.repository.model.MtGoods; +import com.fuint.repository.model.MtGoodsSku; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 购物车业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CartServiceImpl extends ServiceImpl implements CartService { + + private MtCartMapper mtCartMapper; + + private MtGoodsMapper mtGoodsMapper; + + private MtGoodsSkuMapper mtGoodsSkuMapper; + + /** + * 切换购物车给会员 + * + * @param userId 会员ID + * @param cartIds 购物车ID + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean switchCartIds(Integer userId, String cartIds) { + if (userId == null || userId < 1 || StringUtil.isEmpty(cartIds)) { + return false; + } + List cartIdList = Arrays.asList(cartIds.split(",")); + if (cartIdList != null && cartIdList.size() > 0) { + for (String cartId : cartIdList) { + if (StringUtil.isNotEmpty(cartId)) { + MtCart mtCart = mtCartMapper.selectById(Integer.parseInt(cartId)); + if (mtCart != null) { + mtCart.setUserId(userId); + this.updateById(mtCart); + } + } + } + } + return true; + } + + /** + * 保存购物车 + * + * @param reqDto 购物车参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Integer saveCart(MtCart reqDto, String action) throws BusinessCheckException { + if (reqDto.getId() == null && (reqDto.getMerchantId() == null || reqDto.getMerchantId() < 1)) { + throw new BusinessCheckException("商户不能为空"); + } + if (reqDto.getId() == null && (reqDto.getStoreId() == null || reqDto.getStoreId() < 1)) { + throw new BusinessCheckException("店铺不能为空"); + } + + MtCart mtCart = new MtCart(); + Integer cartId = 1; + + // 检查库存是否充足 + if (action.equals("+") || action.equals("=") && reqDto.getNum() > 0) { + MtGoods mtGoods = mtGoodsMapper.selectById(reqDto.getGoodsId()); + Map param = new HashMap<>(); + param.put("status", StatusEnum.ENABLED.getKey()); + param.put("USER_ID", reqDto.getUserId()); + param.put("GOODS_ID", reqDto.getGoodsId()); + param.put("MERCHANT_ID", reqDto.getMerchantId()); + if (reqDto.getSkuId() != null && reqDto.getSkuId() > 0) { + param.put("SKU_ID", reqDto.getSkuId()); + } + List cartList = mtCartMapper.selectByMap(param); + Double cartNum = 0.0; + if (cartList != null && cartList.size() > 0) { + cartNum = cartList.get(0).getNum(); + } + // 剩余库存数量 + Double totalStock = 0.0; + if (reqDto.getSkuId() != null && reqDto.getSkuId() > 0) { + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(reqDto.getSkuId()); + if (mtGoodsSku != null && mtGoodsSku.getStock() != null) { + totalStock = mtGoodsSku.getStock(); + } + } else { + totalStock = mtGoods.getStock(); + } + // 判断库存,库存小于要添加的购物车数量、已添加的购物车数量大于库存 + if (totalStock < reqDto.getNum() || totalStock <= cartNum) { + if (action.equals("=") && reqDto.getNum() < cartNum) { + // empty + } else { + throw new BusinessCheckException(mtGoods.getName() + "库存不足了"); + } + } + } + + if (reqDto.getGoodsId() > 0) { + mtCart.setGoodsId(reqDto.getGoodsId()); + } + if (reqDto.getUserId() > 0) { + mtCart.setUserId(reqDto.getUserId()); + } + + // 数量为0,删除购物车 + if (reqDto.getNum() == 0 && reqDto.getId() > 0) { + this.removeCart(reqDto.getId()+""); + } else if (reqDto.getNum() == 0 && action.equals("-")) { + mtCartMapper.deleteCartItem(reqDto.getUserId(), reqDto.getGoodsId(), reqDto.getSkuId()); + } + + // 校验skuId是否正确 + if (reqDto.getSkuId() != null) { + if (reqDto.getSkuId() > 0) { + Map param = new HashMap<>(); + param.put("goods_id", reqDto.getGoodsId().toString()); + param.put("id", reqDto.getSkuId().toString()); + List skuList = mtGoodsSkuMapper.selectByMap(param); + // 该skuId不正常 + if (skuList.size() < 1) { + reqDto.setSkuId(0); + } + } + } + + mtCart.setMerchantId(reqDto.getMerchantId()); + mtCart.setStoreId(reqDto.getStoreId() == null ? 0 : reqDto.getStoreId()); + mtCart.setStatus(StatusEnum.ENABLED.getKey()); + mtCart.setUpdateTime(new Date()); + mtCart.setSkuId(reqDto.getSkuId()); + mtCart.setNum(reqDto.getNum()); + mtCart.setHangNo(reqDto.getHangNo()); + mtCart.setIsVisitor(reqDto.getIsVisitor()); + + Map params = new HashMap<>(); + params.put("userId", mtCart.getUserId()); + params.put("storeId", mtCart.getStoreId()); + params.put("goodsId", mtCart.getGoodsId()); + params.put("skuId", mtCart.getSkuId()); + params.put("hangNo", reqDto.getHangNo() == null ? "" : reqDto.getHangNo()); + + List cartList = queryCartListByParams(params); + if (action.equals("-") && cartList.size() == 0) { + return cartId; + } + // 已存在,仅操作数量增加或减少 + if (cartList.size() > 0 && (mtCart.getId() == null || mtCart.getId() < 1)) { + mtCart = cartList.get(0); + mtCart.setMerchantId(reqDto.getMerchantId()); + if (action.equals("+")) { + mtCart.setNum(mtCart.getNum() + reqDto.getNum()); + } else if (action.equals("=")) { + mtCart.setNum(reqDto.getNum()); + } else { + Double num = mtCart.getNum() - 1; + if (num <= 0) { + this.removeCart(mtCart.getId()+""); + return mtCart.getId(); + } else { + mtCart.setNum(mtCart.getNum() - 1); + } + } + this.updateById(mtCart); + } else { + mtCart.setCreateTime(new Date()); + this.save(mtCart); + } + + return mtCart.getId(); + } + + /** + * 删除购物车 + * + * @param cartIds 购物车ID + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void removeCart(String cartIds) { + String[] ids = cartIds.split(","); + if (ids.length < 1) { + return; + } + for (int i = 0; i < ids.length; i++) { + MtCart mtCart = mtCartMapper.selectById(Integer.parseInt(ids[i].trim())); + if (mtCart != null) { + mtCartMapper.deleteById(mtCart.getId()); + } + } + } + + /** + * 删除挂单购物车 + * + * @param hangNo 挂单序号 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除挂单") + @Transactional(rollbackFor = Exception.class) + public void removeCartByHangNo(String hangNo) { + if (hangNo != null && StringUtil.isNotEmpty(hangNo)) { + mtCartMapper.deleteCartByHangNo(hangNo); + } + } + + /** + * 清空会员购物车 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void clearCart(Integer userId) { + mtCartMapper.clearCart(userId); + } + + /** + * 根据条件查找 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryCartListByParams(Map params) { + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey() : params.get("status").toString(); + String userId = params.get("userId") == null ? "" : params.get("userId").toString(); + String ids = params.get("ids") == null ? "" : params.get("ids").toString(); + String hangNo = params.get("hangNo") == null ? "" : params.get("hangNo").toString(); + String goodsId = params.get("goodsId") == null ? "" : params.get("goodsId").toString(); + String skuId = params.get("skuId") == null ? "" : params.get("skuId").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(MtCart::getStatus, status); + + if (StringUtil.isNotEmpty(userId)) { + lambdaQueryWrapper.eq(MtCart::getUserId, userId); + } + if (StringUtil.isNotEmpty(ids)) { + List idList = Arrays.asList(ids.split(",")); + lambdaQueryWrapper.in(MtCart::getId, idList); + if (StringUtil.isNotEmpty(hangNo)) { + lambdaQueryWrapper.eq(MtCart::getHangNo, hangNo); + } + } else { + lambdaQueryWrapper.eq(MtCart::getHangNo, hangNo); + } + if (StringUtil.isNotEmpty(goodsId)) { + lambdaQueryWrapper.eq(MtCart::getGoodsId, goodsId); + } + if (StringUtil.isNotEmpty(merchantId) && Integer.parseInt(merchantId) > 0) { + lambdaQueryWrapper.eq(MtCart::getMerchantId, merchantId); + } + if (StringUtil.isNotEmpty(storeId) && Integer.parseInt(storeId) > 0) { + lambdaQueryWrapper.eq(MtCart::getStoreId, storeId); + } + if (StringUtil.isNotEmpty(skuId)) { + lambdaQueryWrapper.eq(MtCart::getSkuId, skuId); + } + + return mtCartMapper.selectList(lambdaQueryWrapper); + } + + /** + * 更新购物车 + * + * @param cartId ID + * @param hangNo 挂单序号 + * @param isVisitor 是否游客 + * @return + */ + @Override + @OperationServiceLog(description = "执行挂单") + @Transactional(rollbackFor = Exception.class) + public MtCart setHangNo(Integer cartId, String hangNo, String isVisitor) throws BusinessCheckException { + MtCart mtCart = mtCartMapper.selectById(cartId); + if (mtCart != null) { + mtCart.setHangNo(hangNo); + mtCart.setUpdateTime(new Date()); + mtCart.setIsVisitor(isVisitor); + this.updateById(mtCart); + } else { + throw new BusinessCheckException("执行挂单失败"); + } + return mtCart; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CateServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CateServiceImpl.java new file mode 100644 index 0000000..c12f0af --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CateServiceImpl.java @@ -0,0 +1,287 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.GoodsCateDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.GoodsCatePage; +import com.fuint.common.service.CateService; +import com.fuint.common.service.StoreService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtGoodsCateMapper; +import com.fuint.repository.mapper.MtGoodsMapper; +import com.fuint.repository.model.MtGoods; +import com.fuint.repository.model.MtGoodsCate; +import com.fuint.repository.model.MtStore; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 商品分类业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CateServiceImpl extends ServiceImpl implements CateService { + + private static final Logger log = LoggerFactory.getLogger(CateServiceImpl.class); + + private MtGoodsMapper mtGoodsMapper; + + private MtGoodsCateMapper cateMapper; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 分页查询分类列表 + * + * @param catePage + * @return + */ + @Override + public PaginationResponse queryCateListByPagination(GoodsCatePage catePage) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(catePage.getPage(), catePage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtGoodsCate::getStatus, StatusEnum.DISABLE.getKey()); + + String name = catePage.getName(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtGoodsCate::getName, name); + } + String status = catePage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtGoodsCate::getStatus, status); + } + Integer merchantId = catePage.getMerchantId(); + if (merchantId != null) { + lambdaQueryWrapper.eq(MtGoodsCate::getMerchantId, merchantId); + } + Integer storeId = catePage.getStoreId(); + if (storeId != null) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtGoodsCate::getStoreId, 0) + .or() + .eq(MtGoodsCate::getStoreId, storeId)); + } + lambdaQueryWrapper.orderByAsc(MtGoodsCate::getSort); + List dataList = new ArrayList<>(); + List cateList = cateMapper.selectList(lambdaQueryWrapper); + for (MtGoodsCate mtCate : cateList) { + GoodsCateDto cateDto = new GoodsCateDto(); + BeanUtils.copyProperties(mtCate, cateDto); + if (mtCate.getStoreId() != null && mtCate.getStoreId() > 0) { + MtStore storeInfo = storeService.queryStoreById(mtCate.getStoreId()); + if (storeInfo != null) { + cateDto.setStoreName(storeInfo.getName()); + } + } + dataList.add(cateDto); + } + PageRequest pageRequest = PageRequest.of(catePage.getPage(), catePage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, GoodsCateDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加商品分类 + * + * @param reqDto 商品分类参数 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "新增商品分类") + public MtGoodsCate addCate(MtGoodsCate reqDto) throws BusinessCheckException { + MtGoodsCate mtCate = new MtGoodsCate(); + if (null != reqDto.getId()) { + mtCate.setId(reqDto.getId()); + } + Integer storeId = reqDto.getStoreId() == null ? 0 : reqDto.getStoreId(); + if (storeId > 0 && (reqDto.getMerchantId() == null || reqDto.getMerchantId() <= 0)) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + reqDto.setMerchantId(mtStore.getMerchantId()); + } + } + if (reqDto.getMerchantId() == null || reqDto.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + mtCate.setName(reqDto.getName()); + mtCate.setStatus(StatusEnum.ENABLED.getKey()); + mtCate.setLogo(reqDto.getLogo()); + mtCate.setDescription(reqDto.getDescription()); + mtCate.setOperator(reqDto.getOperator()); + mtCate.setMerchantId(reqDto.getMerchantId()); + mtCate.setStoreId(storeId); + mtCate.setUpdateTime(new Date()); + mtCate.setCreateTime(new Date()); + this.save(mtCate); + return mtCate; + } + + /** + * 根据ID获取分类信息 + * + * @param id 分类ID + * @throws BusinessCheckException + */ + @Override + public MtGoodsCate queryCateById(Integer id) { + return cateMapper.selectById(id); + } + + /** + * 根据ID删除分类信息 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + */ + @Override + @OperationServiceLog(description = "删除商品分类") + public void deleteCate(Integer id, String operator) throws BusinessCheckException { + MtGoodsCate cateInfo = queryCateById(id); + + Map params = new HashMap<>(); + params.put("cate_id", id); + params.put("status", StatusEnum.ENABLED.getKey()); + params.put("merchant_id", cateInfo.getMerchantId()); + List goodsList = mtGoodsMapper.selectByMap(params); + if (goodsList != null && goodsList.size() > 0) { + throw new BusinessCheckException("删除失败,该分类有商品存在"); + } + if (null == cateInfo) { + return; + } + cateInfo.setStatus(StatusEnum.DISABLE.getKey()); + cateInfo.setUpdateTime(new Date()); + + this.updateById(cateInfo); + } + + /** + * 修改分类 + * + * @param reqDto + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新商品分类") + public MtGoodsCate updateCate(MtGoodsCate reqDto) throws BusinessCheckException { + MtGoodsCate mtCate = queryCateById(reqDto.getId()); + if (null == mtCate) { + log.error("该分类状态异常"); + throw new BusinessCheckException("该分类状态异常"); + } + if (mtCate.getMerchantId() == null || mtCate.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + mtCate.setId(reqDto.getId()); + if (reqDto.getLogo() != null) { + mtCate.setLogo(reqDto.getLogo()); + } + if (reqDto.getName() != null) { + mtCate.setName(reqDto.getName()); + } + if (reqDto.getDescription() != null) { + mtCate.setDescription(reqDto.getDescription()); + } + mtCate.setUpdateTime(new Date()); + if (StringUtil.isNotEmpty(reqDto.getOperator())) { + mtCate.setOperator(reqDto.getOperator()); + } + if (reqDto.getStatus() != null) { + if (reqDto.getStatus().equals(StatusEnum.DISABLE.getKey())) { + deleteCate(mtCate.getId(), reqDto.getOperator()); + } + mtCate.setStatus(reqDto.getStatus()); + } + if (reqDto.getSort() != null) { + mtCate.setSort(reqDto.getSort()); + } + if (reqDto.getMerchantId() != null && reqDto.getMerchantId() > 0) { + mtCate.setMerchantId(reqDto.getMerchantId()); + } + if (reqDto.getStoreId() != null) { + mtCate.setStoreId(reqDto.getStoreId()); + } + this.updateById(mtCate); + return mtCate; + } + + /** + * 获取分类列表 + * + * @param merchantId 商户 + * @param storeId 店铺ID + * @param name 店铺名称 + * @param status 状态 + * @return + * */ + @Override + public List getCateList(Integer merchantId, Integer storeId, String name, String status) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtGoodsCate::getStatus, StatusEnum.DISABLE.getKey()); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtGoodsCate::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtGoodsCate::getName, name); + } + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtGoodsCate::getStatus, status); + } + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtGoodsCate::getStoreId, 0) + .or() + .eq(MtGoodsCate::getStoreId, storeId)); + } + lambdaQueryWrapper.orderByAsc(MtGoodsCate::getSort); + return cateMapper.selectList(lambdaQueryWrapper); + } + + /** + * 获取分类ID + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param name 分类名称 + * @return + * */ + @Override + public Integer getGoodsCateId(Integer merchantId, Integer storeId, String name) { + Integer cateId = 0; + List cateList = getCateList(merchantId, storeId, name, StatusEnum.ENABLED.getKey()); + if (cateList != null && cateList.size() > 0) { + cateId = cateList.get(0).getId(); + } + return cateId; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionCashServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionCashServiceImpl.java new file mode 100644 index 0000000..5eae852 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionCashServiceImpl.java @@ -0,0 +1,434 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.CommissionCashDto; +import com.fuint.common.dto.OrderUserDto; +import com.fuint.common.enums.CommissionCashStatusEnum; +import com.fuint.common.enums.CommissionStatusEnum; +import com.fuint.common.enums.CommissionTargetEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.CommissionCashPage; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.SeqUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.CommissionCashRequest; +import com.fuint.module.backendApi.request.CommissionLogRequest; +import com.fuint.module.backendApi.request.CommissionSettleConfirmRequest; +import com.fuint.module.backendApi.request.CommissionSettleRequest; +import com.fuint.repository.mapper.MtCommissionCashMapper; +import com.fuint.repository.mapper.MtCommissionLogMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 分销提成提现服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CommissionCashServiceImpl extends ServiceImpl implements CommissionCashService { + + private static final Logger logger = LoggerFactory.getLogger(CommissionCashServiceImpl.class); + + private MtCommissionCashMapper mtCommissionCashMapper; + + private MtCommissionLogMapper mtCommissionLogMapper; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 员工服务接口 + * */ + private StaffService staffService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 分销提成记录业务接口 + */ + private CommissionLogService commissionLogService; + + /** + * 余额服务接口 + * */ + private BalanceService balanceService; + + /** + * 分页查询提现列表 + * + * @param commissionCashPage + * @return + */ + @Override + public PaginationResponse queryCommissionCashByPagination(CommissionCashPage commissionCashPage) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(commissionCashPage.getPage(), commissionCashPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + String status = commissionCashPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtCommissionCash::getStatus, status); + } + Integer merchantId = commissionCashPage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtCommissionCash::getMerchantId, merchantId); + } + Integer storeId = commissionCashPage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtCommissionCash::getStoreId, storeId); + } + String realName = commissionCashPage.getRealName(); + if (StringUtils.isNotEmpty(realName)) { + Map params = new HashMap<>(); + params.put("REAL_NAME", realName); + params.put("AUDITED_STATUS", StatusEnum.ENABLED.getKey()); + List staffList = staffService.queryStaffByParams(params); + if (staffList != null && staffList.size() > 0) { + lambdaQueryWrapper.eq(MtCommissionCash::getStaffId, staffList.get(0).getId()); + } else { + lambdaQueryWrapper.eq(MtCommissionCash::getStaffId, -1); + } + } + String mobile = commissionCashPage.getMobile(); + if (StringUtils.isNotEmpty(mobile)) { + MtStaff mtStaff = staffService.queryStaffByMobile(mobile); + if (mtStaff != null) { + lambdaQueryWrapper.eq(MtCommissionCash::getStaffId, mtStaff.getId()); + } else { + lambdaQueryWrapper.eq(MtCommissionCash::getStaffId, -1); + } + } + String uuid = commissionCashPage.getUuid(); + if (StringUtils.isNotBlank(uuid)) { + lambdaQueryWrapper.eq(MtCommissionCash::getUuid, uuid); + } + // 开始时间、结束时间 + String startTime = commissionCashPage.getStartTime(); + String endTime = commissionCashPage.getEndTime(); + if (StringUtil.isNotEmpty(startTime)) { + lambdaQueryWrapper.ge(MtCommissionCash::getCreateTime, startTime); + } + if (StringUtil.isNotEmpty(endTime)) { + lambdaQueryWrapper.le(MtCommissionCash::getCreateTime, endTime); + } + lambdaQueryWrapper.orderByDesc(MtCommissionCash::getId); + List commissionCashList = mtCommissionCashMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (commissionCashList != null && commissionCashList.size() > 0) { + for (MtCommissionCash mtCommissionCash : commissionCashList) { + CommissionCashDto commissionCashDto = new CommissionCashDto(); + BeanUtils.copyProperties(mtCommissionCash, commissionCashDto); + MtStore mtStore = storeService.getById(mtCommissionCash.getStoreId()); + commissionCashDto.setStoreInfo(mtStore); + MtStaff mtStaff = staffService.getById(mtCommissionCash.getStaffId()); + if (mtCommissionCash.getUserId() != null && mtCommissionCash.getUserId() > 0) { + MtUser userInfo = memberService.queryMemberById(mtCommissionCash.getUserId()); + if (userInfo != null) { + OrderUserDto userDto = new OrderUserDto(); + userDto.setNo(userInfo.getUserNo()); + userDto.setId(userInfo.getId()); + userDto.setName(userInfo.getName()); + userDto.setCardNo(userInfo.getIdcard()); + userDto.setAddress(userInfo.getAddress()); + userDto.setMobile(CommonUtil.hidePhone(userInfo.getMobile())); + commissionCashDto.setUserInfo(userDto); + } + } + if (mtStaff != null) { + mtStaff.setMobile(CommonUtil.hidePhone(mtStaff.getMobile())); + commissionCashDto.setStaffInfo(mtStaff); + } + dataList.add(commissionCashDto); + } + } + PageRequest pageRequest = PageRequest.of(commissionCashPage.getPage(), commissionCashPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, CommissionCashDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 分销提成结算 + * + * @param commissionSettleRequest 结算参数 + * @return + */ + @Override + @Transactional + public String settleCommission(CommissionSettleRequest commissionSettleRequest) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtCommissionLog::getStatus, CommissionStatusEnum.NORMAL.getKey()); + if (commissionSettleRequest.getMerchantId() != null && StringUtils.isNotBlank(commissionSettleRequest.getMerchantId().toString())) { + lambdaQueryWrapper.eq(MtCommissionLog::getMerchantId, commissionSettleRequest.getMerchantId()); + } + if (commissionSettleRequest.getStoreId() != null && StringUtils.isNotBlank(commissionSettleRequest.getStoreId().toString())) { + lambdaQueryWrapper.eq(MtCommissionLog::getStoreId, commissionSettleRequest.getStoreId()); + } + String realName = commissionSettleRequest.getRealName(); + if (StringUtils.isNotBlank(realName)) { + Map params = new HashMap<>(); + params.put("REAL_NAME", realName); + params.put("AUDITED_STATUS", StatusEnum.ENABLED.getKey()); + List staffList = staffService.queryStaffByParams(params); + if (staffList != null && staffList.size() > 0) { + lambdaQueryWrapper.eq(MtCommissionLog::getStaffId, staffList.get(0).getId()); + } + } + String mobile = commissionSettleRequest.getMobile(); + if (StringUtils.isNotBlank(mobile)) { + MtStaff mtStaff = staffService.queryStaffByMobile(mobile); + if (mtStaff != null) { + lambdaQueryWrapper.eq(MtCommissionLog::getStaffId, mtStaff.getId()); + } + } + lambdaQueryWrapper.orderByDesc(MtCommissionLog::getId); + List commissionLogList = mtCommissionLogMapper.selectList(lambdaQueryWrapper); + List staffIds = new ArrayList<>(); + List userIds = new ArrayList<>(); + String uuid = SeqUtil.getUUID(); + if (commissionLogList != null && commissionLogList.size() > 0) { + for (MtCommissionLog mtCommissionLog : commissionLogList) { + if (mtCommissionLog.getStaffId() != null && mtCommissionLog.getStaffId() > 0 && !staffIds.contains(CommissionTargetEnum.STAFF.getKey() + mtCommissionLog.getStaffId())) { + staffIds.add(CommissionTargetEnum.STAFF.getKey() + mtCommissionLog.getStaffId()); + } else if (mtCommissionLog.getUserId() != null && mtCommissionLog.getUserId() > 0 && !userIds.contains(CommissionTargetEnum.MEMBER.getKey() + mtCommissionLog.getUserId())){ + userIds.add(CommissionTargetEnum.MEMBER.getKey() + mtCommissionLog.getUserId()); + } + } + } + staffIds.addAll(userIds); + // 生成结算数据 + if (staffIds.size() > 0) { + for (String staffId : staffIds) { + BigDecimal totalAmount = new BigDecimal("0"); + Integer cashMerchantId = 0; + Integer cashStoreId = 0; + String settleNo = CommonUtil.createSettlementNo(); + Integer targetId; + if (staffId.indexOf(CommissionTargetEnum.STAFF.getKey()) >= 0) { + targetId = Integer.parseInt(staffId.replaceAll(CommissionTargetEnum.STAFF.getKey(), "")); + } else { + targetId = Integer.parseInt(staffId.replaceAll(CommissionTargetEnum.MEMBER.getKey(), "")); + } + for (MtCommissionLog mtCommissionLog : commissionLogList) { + if (mtCommissionLog.getStaffId().equals(targetId) || mtCommissionLog.getUserId().equals(targetId)) { + if (mtCommissionLog.getType().equals(CommissionTargetEnum.STAFF.getKey()) && staffId.indexOf(CommissionTargetEnum.STAFF.getKey()) < 0) { + continue; + } + if (mtCommissionLog.getType().equals(CommissionTargetEnum.MEMBER.getKey()) && staffId.indexOf(CommissionTargetEnum.MEMBER.getKey()) < 0) { + continue; + } + totalAmount = totalAmount.add(mtCommissionLog.getAmount()); + if (mtCommissionLog.getMerchantId() != null && mtCommissionLog.getMerchantId() > 0) { + cashMerchantId = mtCommissionLog.getMerchantId(); + } + if (mtCommissionLog.getStoreId() != null && mtCommissionLog.getStoreId() > 0) { + cashStoreId = mtCommissionLog.getStoreId(); + } + CommissionLogRequest commissionLogRequest = new CommissionLogRequest(); + commissionLogRequest.setId(mtCommissionLog.getId()); + commissionLogRequest.setSettleUuid(uuid); + commissionLogRequest.setOperator(commissionSettleRequest.getOperator()); + commissionLogRequest.setStatus(CommissionStatusEnum.SETTLED.getKey()); + commissionLogService.updateCommissionLog(commissionLogRequest); + } + } + MtCommissionCash mtCommissionCash = new MtCommissionCash(); + mtCommissionCash.setSettleNo(settleNo); + mtCommissionCash.setUuid(uuid); + if (staffId.indexOf(CommissionTargetEnum.STAFF.getKey()) >= 0) { + mtCommissionCash.setStaffId(targetId); + mtCommissionCash.setUserId(0); + } else { + mtCommissionCash.setUserId(targetId); + mtCommissionCash.setStaffId(0); + } + if (cashStoreId > 0) { + mtCommissionCash.setStoreId(cashStoreId); + } + if (cashMerchantId > 0) { + mtCommissionCash.setMerchantId(cashMerchantId); + } + mtCommissionCash.setAmount(totalAmount); + Date time = new Date(); + mtCommissionCash.setCreateTime(time); + mtCommissionCash.setUpdateTime(time); + mtCommissionCash.setOperator(commissionSettleRequest.getOperator()); + mtCommissionCash.setStatus(CommissionCashStatusEnum.WAIT.getKey()); + this.save(mtCommissionCash); + } + } + return uuid; + } + + /** + * 根据ID获取记录信息 + * + * @param id 分佣提成提现ID + * @return + */ + @Override + public CommissionCashDto queryCommissionCashById(Integer id) { + MtCommissionCash mtCommissionCash = mtCommissionCashMapper.selectById(id); + CommissionCashDto commissionCashDto = null; + if (mtCommissionCash != null) { + commissionCashDto = new CommissionCashDto(); + BeanUtils.copyProperties(mtCommissionCash, commissionCashDto); + } + return commissionCashDto; + } + + /** + * 更新分销提成提现 + * + * @param requestParam 请求参数 + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "更新分销提成提现") + public void updateCommissionCash(CommissionCashRequest requestParam) throws BusinessCheckException { + MtCommissionCash mtCommissionCash = mtCommissionCashMapper.selectById(requestParam.getId()); + if (mtCommissionCash == null) { + logger.error("更新分销提成提现失败..."); + throw new BusinessCheckException("更新分销提成提现失败,数据不存在"); + } + mtCommissionCash.setUpdateTime(new Date()); + if (requestParam.getAmount() != null) { + mtCommissionCash.setAmount(new BigDecimal(requestParam.getAmount())); + } + if (requestParam.getDescription() != null) { + mtCommissionCash.setDescription(requestParam.getDescription()); + } + if (requestParam.getStatus() != null) { + mtCommissionCash.setStatus(requestParam.getStatus()); + } + mtCommissionCash.setOperator(requestParam.getOperator()); + mtCommissionCashMapper.updateById(mtCommissionCash); + } + + /** + * 结算确认 + * + * @param requestParam 确认参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "结算确认") + public void confirmCommissionCash(CommissionSettleConfirmRequest requestParam) throws BusinessCheckException { + if (StringUtil.isEmpty(requestParam.getUuid())) { + throw new BusinessCheckException("请求有误."); + } + boolean flag = mtCommissionCashMapper.confirmCommissionCash(requestParam.getMerchantId(), requestParam.getUuid(), requestParam.getOperator()); + if (flag) { + mtCommissionLogMapper.confirmCommissionLog(requestParam.getMerchantId(), requestParam.getUuid(), requestParam.getOperator()); + } + } + + /** + * 结算确认 + * + * @param requestParam 取消参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "取消结算") + public void cancelCommissionCash(CommissionSettleConfirmRequest requestParam) throws BusinessCheckException { + if (StringUtil.isEmpty(requestParam.getUuid())) { + throw new BusinessCheckException("请求参数有误"); + } + boolean flag = mtCommissionCashMapper.cancelCommissionCash(requestParam.getMerchantId(), requestParam.getUuid(), requestParam.getOperator()); + if (flag) { + mtCommissionLogMapper.cancelCommissionLog(requestParam.getMerchantId(), requestParam.getUuid(), requestParam.getOperator()); + } + } + + /** + * 支付结算金额到用户余额 + * + * @param commissionCashRequest 请求参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "支付结算金额到用户余额") + public void payToBalance(CommissionCashRequest commissionCashRequest) throws BusinessCheckException { + MtCommissionCash mtCommissionCash = mtCommissionCashMapper.selectById(commissionCashRequest.getId()); + if (mtCommissionCash == null) { + throw new BusinessCheckException("请求参数有误"); + } + if (mtCommissionCash.getStatus().equals(CommissionCashStatusEnum.PAYED.getKey())) { + throw new BusinessCheckException("该记录已经支付过了"); + } + if (mtCommissionCash.getStatus().equals(CommissionCashStatusEnum.CANCEL.getKey())) { + throw new BusinessCheckException("该记录已经作废了"); + } + BigDecimal amount = mtCommissionCash.getAmount(); + if (StringUtil.isNotBlank(commissionCashRequest.getAmount()) && (new BigDecimal(commissionCashRequest.getAmount()).compareTo(new BigDecimal("0")) > 0)) { + if (new BigDecimal(commissionCashRequest.getAmount()).compareTo(amount) > 0) { + throw new BusinessCheckException("付款金额不能大于" + amount); + } + amount = new BigDecimal(commissionCashRequest.getAmount()); + } + mtCommissionCash.setOperator(commissionCashRequest.getOperator()); + mtCommissionCash.setStatus(CommissionCashStatusEnum.PAYED.getKey()); + mtCommissionCash.setAmount(amount); + mtCommissionCash.setUpdateTime(new Date()); + mtCommissionCash.setDescription(commissionCashRequest.getDescription()); + Integer i = mtCommissionCashMapper.updateById(mtCommissionCash); + if (i > 0 && mtCommissionCash.getUserId() != null) { + MtUser mtUser = memberService.queryMemberById(mtCommissionCash.getUserId()); + if (mtCommissionCash.getStaffId() != null && mtCommissionCash.getStaffId() > 0) { + MtStaff mtStaff = staffService.queryStaffById(mtCommissionCash.getStaffId()); + mtUser = memberService.queryMemberByMobile(mtCommissionCash.getMerchantId(), mtStaff.getMobile()); + } + if (mtUser != null) { + MtBalance mtBalance = new MtBalance(); + mtBalance.setMerchantId(mtCommissionCash.getMerchantId()); + mtBalance.setStoreId(mtCommissionCash.getStoreId()); + mtBalance.setUserId(mtUser.getId()); + mtBalance.setAmount(amount); + mtBalance.setStatus(StatusEnum.ENABLED.getKey()); + mtBalance.setMobile(mtUser.getMobile()); + mtBalance.setDescription("发放分享佣金"); + balanceService.addBalance(mtBalance, true); + } else { + throw new BusinessCheckException("付款失败,未找到会员信息"); + } + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionLogServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionLogServiceImpl.java new file mode 100644 index 0000000..d9e4567 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionLogServiceImpl.java @@ -0,0 +1,377 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.CommissionLogDto; +import com.fuint.common.dto.OrderUserDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.CommissionLogPage; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.CommissionLogRequest; +import com.fuint.repository.mapper.*; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 分销提成记录服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CommissionLogServiceImpl extends ServiceImpl implements CommissionLogService { + + private static final Logger logger = LoggerFactory.getLogger(CommissionLogServiceImpl.class); + + private MtCommissionLogMapper mtCommissionLogMapper; + + private MtCommissionRuleMapper mtCommissionRuleMapper; + + private MtCommissionRuleItemMapper mtCommissionRuleItemMapper; + + private MtOrderGoodsMapper mtOrderGoodsMapper; + + private MtCommissionRelationMapper mtCommissionRelationMapper; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 员工服务接口 + * */ + private StaffService staffService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 提成方案规则服务接口 + * */ + private CommissionRuleService commissionRuleService; + + /** + * 分页查询分销提成列表 + * + * @param commissionLogPage + * @return + */ + @Override + public PaginationResponse queryCommissionLogByPagination(CommissionLogPage commissionLogPage) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtCommissionLog::getStatus, StatusEnum.DISABLE.getKey()); + String target = commissionLogPage.getTarget(); + if (StringUtils.isNotBlank(target)) { + lambdaQueryWrapper.eq(MtCommissionLog::getTarget, target); + } + String realName = commissionLogPage.getRealName(); + if (StringUtils.isNotBlank(realName)) { + Map params = new HashMap<>(); + params.put("REAL_NAME", realName); + params.put("AUDITED_STATUS", StatusEnum.ENABLED.getKey()); + List staffList = staffService.queryStaffByParams(params); + if (staffList != null && staffList.size() > 0) { + lambdaQueryWrapper.eq(MtCommissionLog::getStaffId, staffList.get(0).getId()); + } else { + lambdaQueryWrapper.eq(MtCommissionLog::getStaffId, -1); + } + } + String mobile = commissionLogPage.getMobile(); + if (StringUtils.isNotBlank(mobile)) { + MtStaff mtStaff = staffService.queryStaffByMobile(mobile); + if (mtStaff != null) { + lambdaQueryWrapper.eq(MtCommissionLog::getStaffId, mtStaff.getId()); + } else { + lambdaQueryWrapper.eq(MtCommissionLog::getStaffId, -1); + } + } + String uuid = commissionLogPage.getUuid(); + if (StringUtils.isNotBlank(uuid)) { + lambdaQueryWrapper.eq(MtCommissionLog::getSettleUuid, uuid); + } + String status = commissionLogPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtCommissionLog::getStatus, status); + } + Integer merchantId = commissionLogPage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtCommissionLog::getMerchantId, merchantId); + } + Integer storeId = commissionLogPage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtCommissionLog::getStoreId, storeId); + } + // 开始时间、结束时间 + String startTime = commissionLogPage.getStartTime(); + String endTime = commissionLogPage.getEndTime(); + if (StringUtil.isNotEmpty(startTime)) { + lambdaQueryWrapper.ge(MtCommissionLog::getCreateTime, startTime); + } + if (StringUtil.isNotEmpty(endTime)) { + lambdaQueryWrapper.le(MtCommissionLog::getCreateTime, endTime); + } + + lambdaQueryWrapper.orderByDesc(MtCommissionLog::getId); + Page pageHelper = PageHelper.startPage(commissionLogPage.getPage(), commissionLogPage.getPageSize()); + List commissionLogList = mtCommissionLogMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (commissionLogList != null && commissionLogList.size() > 0) { + for (MtCommissionLog mtCommissionLog : commissionLogList) { + CommissionLogDto commissionLogDto = new CommissionLogDto(); + BeanUtils.copyProperties(mtCommissionLog, commissionLogDto); + commissionLogDto.setTypeName(CommissionTypeEnum.getName(mtCommissionLog.getType())); + MtOrder mtOrder = orderService.getById(mtCommissionLog.getOrderId()); + commissionLogDto.setOrderInfo(mtOrder); + MtStore mtStore = storeService.getById(mtCommissionLog.getStoreId()); + commissionLogDto.setStoreInfo(mtStore); + MtStaff mtStaff = staffService.getById(mtCommissionLog.getStaffId()); + if (mtStaff != null) { + mtStaff.setMobile(CommonUtil.hidePhone(mtStaff.getMobile())); + commissionLogDto.setStaffInfo(mtStaff); + } + MtCommissionRule mtCommissionRule = commissionRuleService.getById(mtCommissionLog.getRuleId()); + commissionLogDto.setRuleInfo(mtCommissionRule); + if (mtCommissionLog.getUserId() != null && mtCommissionLog.getUserId() > 0) { + MtUser userInfo = memberService.queryMemberById(mtCommissionLog.getUserId()); + if (userInfo != null) { + OrderUserDto userDto = new OrderUserDto(); + userDto.setNo(userInfo.getUserNo()); + userDto.setId(userInfo.getId()); + userDto.setName(userInfo.getName()); + userDto.setCardNo(userInfo.getIdcard()); + userDto.setAddress(userInfo.getAddress()); + userDto.setMobile(CommonUtil.hidePhone(userInfo.getMobile())); + commissionLogDto.setUserInfo(userDto); + } + } + dataList.add(commissionLogDto); + } + } + PageRequest pageRequest = PageRequest.of(commissionLogPage.getPage(), commissionLogPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, CommissionLogDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 计算订单分销提成 + * + * @param orderId 订单ID + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "计算订单分销提成") + public void calculateCommission(Integer orderId) throws BusinessCheckException { + if (orderId != null && orderId > 0) { + MtOrder mtOrder = orderService.getById(orderId); + // 获取邀请关系 + Integer commissionUserId = mtCommissionRelationMapper.getCommissionUserId(mtOrder.getMerchantId(), mtOrder.getUserId()); + if (commissionUserId != null && commissionUserId > 0) { + mtOrder.setCommissionUserId(commissionUserId); + orderService.updateOrder(mtOrder); + } + // 商品订单佣金计算 + if (mtOrder != null && mtOrder.getType().equals(CommissionTypeEnum.GOODS.getKey())) { + Map params = new HashMap<>(); + params.put("ORDER_ID", mtOrder.getId()); + params.put("STATUS", StatusEnum.ENABLED.getKey()); + List goodsList = mtOrderGoodsMapper.selectByMap(params); + if (goodsList != null && goodsList.size() > 0) { + for (MtOrderGoods orderGoods : goodsList) { + List commissionRuleItemList = mtCommissionRuleItemMapper.getEffectiveCommissionList(mtOrder.getMerchantId(), orderGoods.getGoodsId(), CommissionTypeEnum.GOODS.getKey()); + if (commissionRuleItemList != null && commissionRuleItemList.size() > 0) { + for (MtCommissionRuleItem mtCommissionRuleItem : commissionRuleItemList) { + MtCommissionRule mtCommissionRule = mtCommissionRuleMapper.selectById(mtCommissionRuleItem.getRuleId()); + // 规则状态正常 + if (mtCommissionRule != null && mtCommissionRule.getStatus().equals(StatusEnum.ENABLED.getKey())) { + // 分佣金额计算,散客和会员佣金比例不同 + BigDecimal rate = mtCommissionRuleItem.getMember(); + if (mtOrder.getStaffId() != null && mtOrder.getStaffId() > 0 && mtOrder.getIsVisitor().equals(YesOrNoEnum.YES.getKey())) { + rate = mtCommissionRuleItem.getGuest(); + } + if (orderGoods.getNum() == null || orderGoods.getNum() < 1) { + orderGoods.setNum(1d); + } + BigDecimal amount = orderGoods.getPrice().multiply(rate.divide(new BigDecimal("100"))).multiply(new BigDecimal(orderGoods.getNum())); + addCommissionLog(mtOrder, mtCommissionRule, amount, mtCommissionRuleItem, mtOrder.getCommissionUserId()); + } + } + } + } + } + } + + // 充值订单计算佣金 + if (mtOrder != null && mtOrder.getType().equals(CommissionTypeEnum.RECHARGE.getKey())) { + List commissionRuleItemList = mtCommissionRuleItemMapper.getEffectiveCommissionList(mtOrder.getMerchantId(), null, CommissionTypeEnum.RECHARGE.getKey()); + if (commissionRuleItemList != null && commissionRuleItemList.size() > 0) { + for (MtCommissionRuleItem mtCommissionRuleItem : commissionRuleItemList) { + MtCommissionRule mtCommissionRule = mtCommissionRuleMapper.selectById(mtCommissionRuleItem.getRuleId()); + // 分佣金额计算,散客和会员佣金比例不同 + BigDecimal rate = mtCommissionRuleItem.getMember(); + if (mtOrder.getStaffId() != null && mtOrder.getStaffId() > 0 && mtOrder.getIsVisitor().equals(YesOrNoEnum.YES.getKey())) { + rate = mtCommissionRuleItem.getGuest(); + } + BigDecimal amount = mtOrder.getAmount().multiply(rate.divide(new BigDecimal("100"))); + addCommissionLog(mtOrder, mtCommissionRule, amount, mtCommissionRuleItem, mtOrder.getCommissionUserId()); + } + } + } + + // 付款订单计算佣金 + if (mtOrder != null && mtOrder.getType().equals(CommissionTypeEnum.PAYMENT.getKey())) { + List commissionRuleItemList = mtCommissionRuleItemMapper.getEffectiveCommissionList(mtOrder.getMerchantId(), null, CommissionTypeEnum.PAYMENT.getKey()); + if (commissionRuleItemList != null && commissionRuleItemList.size() > 0) { + for (MtCommissionRuleItem mtCommissionRuleItem : commissionRuleItemList) { + MtCommissionRule mtCommissionRule = mtCommissionRuleMapper.selectById(mtCommissionRuleItem.getRuleId()); + // 分佣金额计算,散客和会员佣金比例不同 + BigDecimal rate = mtCommissionRuleItem.getMember(); + if (mtOrder.getStaffId() != null && mtOrder.getStaffId() > 0 && mtOrder.getIsVisitor().equals(YesOrNoEnum.YES.getKey())) { + rate = mtCommissionRuleItem.getGuest(); + } + BigDecimal amount = mtOrder.getPayAmount().multiply(rate.divide(new BigDecimal("100"))); + addCommissionLog(mtOrder, mtCommissionRule, amount, mtCommissionRuleItem, mtOrder.getCommissionUserId()); + } + } + } + + // 订单更新为已结算 + if (mtOrder != null) { + mtOrder.setCommissionStatus(CommissionStatusEnum.SETTLED.getKey()); + orderService.updateOrder(mtOrder); + } + } else { + logger.error("计算分销提成订单不能ID为空..."); + } + } + + /** + * 根据ID获取记录信息 + * + * @param id 分佣提成记录ID + * @return + */ + @Override + public CommissionLogDto queryCommissionLogById(Integer id) { + MtCommissionLog mtCommissionLog = mtCommissionLogMapper.selectById(id); + CommissionLogDto commissionLogDto = null; + if (mtCommissionLog != null) { + BeanUtils.copyProperties(mtCommissionLog, commissionLogDto); + } + return commissionLogDto; + } + + /** + * 更新分销提成记录 + * + * @param requestParam 请求参数 + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "更新分销提成记录") + public void updateCommissionLog(CommissionLogRequest requestParam) throws BusinessCheckException { + MtCommissionLog mtCommissionLog = mtCommissionLogMapper.selectById(requestParam.getId()); + if (mtCommissionLog == null) { + logger.error("更新分销提成记录失败..."); + throw new BusinessCheckException("更新分销提成记录失败,该记录不存在"); + } + if (requestParam.getAmount() != null) { + mtCommissionLog.setAmount(new BigDecimal(requestParam.getAmount())); + } + if (requestParam.getDescription() != null) { + mtCommissionLog.setDescription(requestParam.getDescription()); + } + if (requestParam.getStatus() != null) { + mtCommissionLog.setStatus(requestParam.getStatus()); + } + if (requestParam.getSettleUuid() != null) { + mtCommissionLog.setSettleUuid(requestParam.getSettleUuid()); + } + mtCommissionLog.setOperator(requestParam.getOperator()); + mtCommissionLog.setUpdateTime(new Date()); + mtCommissionLogMapper.updateById(mtCommissionLog); + } + + /** + * 新增分佣记录 + * + * @param mtOrder 订单信息 + * @param mtCommissionRule 分佣方案 + * @param amount 分佣金额 + * @param mtCommissionRuleItem 分佣规则 + * @param userId 会员ID + * @return + * */ + @Transactional + @OperationServiceLog(description = "新增分销提成记录") + public void addCommissionLog(MtOrder mtOrder, MtCommissionRule mtCommissionRule, BigDecimal amount, MtCommissionRuleItem mtCommissionRuleItem, Integer userId) { + if (amount.compareTo(BigDecimal.ZERO) > 0) { + MtCommissionLog mtCommissionLog = new MtCommissionLog(); + mtCommissionLog.setType(mtOrder.getType()); + mtCommissionLog.setTarget(mtCommissionRule.getTarget()); + mtCommissionLog.setLevel(0); + mtCommissionLog.setOrderId(mtOrder.getId()); + mtCommissionLog.setMerchantId(mtOrder.getMerchantId()); + mtCommissionLog.setStoreId(mtOrder.getStoreId()); + if (mtCommissionRule.getTarget().equals(CommissionTargetEnum.STAFF.getKey())) { + if (mtOrder.getStaffId() == null || mtOrder.getStaffId() <= 0) { + return; + } + mtCommissionLog.setStaffId(mtOrder.getStaffId()); + mtCommissionLog.setUserId(0); + } else { + if (userId == null || userId <= 0) { + return; + } + mtCommissionLog.setStaffId(0); + mtCommissionLog.setUserId(userId); + } + mtCommissionLog.setAmount(amount); + mtCommissionLog.setRuleId(mtCommissionRuleItem.getRuleId()); + mtCommissionLog.setRuleItemId(mtCommissionRuleItem.getId()); + mtCommissionLog.setCashId(0); + mtCommissionLog.setCashTime(null); + Date dateTime = new Date(); + mtCommissionLog.setCreateTime(dateTime); + mtCommissionLog.setUpdateTime(dateTime); + mtCommissionLog.setStatus(StatusEnum.ENABLED.getKey()); + mtCommissionLog.setOperator(null); + mtCommissionLogMapper.insert(mtCommissionLog); + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRelationServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRelationServiceImpl.java new file mode 100644 index 0000000..c0a0f24 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRelationServiceImpl.java @@ -0,0 +1,173 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.CommissionRelationDto; +import com.fuint.common.param.CommissionRelationPage; +import com.fuint.common.service.CommissionRelationService; +import com.fuint.common.service.MemberService; +import com.fuint.common.service.MerchantService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtCommissionRelationMapper; +import com.fuint.common.enums.StatusEnum; +import com.fuint.repository.model.MtCommissionRelation; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.pagehelper.Page; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import java.util.*; + +/** + * 分销提成关系服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CommissionRelationServiceImpl extends ServiceImpl implements CommissionRelationService { + + private static final Logger logger = LoggerFactory.getLogger(CommissionRelationServiceImpl.class); + + private MtCommissionRelationMapper mtCommissionRelationMapper; + + /** + * 会员服务接口 + */ + private MemberService memberService; + + /** + * 商户服务接口 + */ + private MerchantService merchantService; + + /** + * 分页查询关系列表 + * + * @param commissionRelationPage + * @return + */ + @Override + public PaginationResponse queryRelationByPagination(CommissionRelationPage commissionRelationPage) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(commissionRelationPage.getPage(), commissionRelationPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtCommissionRelation::getStatus, StatusEnum.DISABLE.getKey()); + String status = commissionRelationPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtCommissionRelation::getStatus, status); + } + Integer userId = commissionRelationPage.getUserId(); + if (userId != null && userId > 0) { + lambdaQueryWrapper.eq(MtCommissionRelation::getUserId, userId); + } + String subUserId = commissionRelationPage.getSubUserId(); + if (StringUtils.isNotBlank(subUserId)) { + lambdaQueryWrapper.eq(MtCommissionRelation::getSubUserId, subUserId); + } + Integer merchantId = commissionRelationPage.getMerchantId(); + String merchantNo = commissionRelationPage.getMerchantNo(); + if (StringUtils.isNotBlank(merchantNo) && (merchantId == null || merchantId <= 0)) { + Integer mchId = merchantService.getMerchantId(merchantNo); + if (mchId != null && mchId > 0) { + merchantId = mchId; + } + } + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtCommissionRelation::getMerchantId, merchantId); + } + + lambdaQueryWrapper.orderByDesc(MtCommissionRelation::getId); + List relationList = mtCommissionRelationMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (relationList != null && relationList.size() > 0) { + for (MtCommissionRelation mtCommissionRelation : relationList) { + CommissionRelationDto commissionRelationDto = new CommissionRelationDto(); + BeanUtils.copyProperties(mtCommissionRelation, commissionRelationDto); + MtUser userInfo = memberService.queryMemberById(mtCommissionRelation.getUserId()); + MtUser subUserInfo = memberService.queryMemberById(mtCommissionRelation.getSubUserId()); + if (userInfo != null && subUserInfo != null) { + commissionRelationDto.setUserInfo(userInfo); + commissionRelationDto.setSubUserInfo(subUserInfo); + dataList.add(commissionRelationDto); + } + } + } + + PageRequest pageRequest = PageRequest.of(commissionRelationPage.getPage(), commissionRelationPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, CommissionRelationDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 设置分销提成关系 + * + * @param userInfo 会员信息 + * @param shareId 分享者ID + * @throws BusinessCheckException + * @retrurn + */ + @Override + public void setCommissionRelation(MtUser userInfo, String shareId) throws BusinessCheckException { + if (userInfo == null || StringUtil.isBlank(shareId) || Integer.parseInt(shareId) <= 0) { + return; + } + + MtUser shareUserInfo = memberService.queryMemberById(Integer.parseInt(shareId)); + if (shareUserInfo == null) { + return; + } + + Map param = new HashMap(); + param.put("USER_ID", Integer.parseInt(shareId)); + param.put("SUB_USER_ID", userInfo.getId()); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + List dataList = mtCommissionRelationMapper.selectByMap(param); + if (dataList == null || dataList.size() <= 0) { + MtCommissionRelation mtCommissionRelation = new MtCommissionRelation(); + mtCommissionRelation.setCreateTime(new Date()); + mtCommissionRelation.setUpdateTime(new Date()); + mtCommissionRelation.setStatus(StatusEnum.ENABLED.getKey()); + mtCommissionRelation.setUserId(Integer.parseInt(shareId)); + mtCommissionRelation.setSubUserId(userInfo.getId()); + mtCommissionRelation.setMerchantId(userInfo.getMerchantId()); + mtCommissionRelation.setInviteCode(shareUserInfo.getUserNo()); + mtCommissionRelation.setLevel(1); + mtCommissionRelationMapper.insert(mtCommissionRelation); + } + + Map params = new HashMap(); + params.put("SUB_USER_ID", Integer.parseInt(shareId)); + params.put("LEVEL", 1); + params.put("STATUS", StatusEnum.ENABLED.getKey()); + List data = mtCommissionRelationMapper.selectByMap(params); + if (data != null && data.size() > 0) { + MtCommissionRelation mtCommissionRelation = new MtCommissionRelation(); + mtCommissionRelation.setCreateTime(new Date()); + mtCommissionRelation.setUpdateTime(new Date()); + mtCommissionRelation.setStatus(StatusEnum.ENABLED.getKey()); + mtCommissionRelation.setUserId(data.get(0).getUserId()); + mtCommissionRelation.setSubUserId(userInfo.getId()); + mtCommissionRelation.setMerchantId(userInfo.getMerchantId()); + mtCommissionRelation.setInviteCode(data.get(0).getInviteCode()); + mtCommissionRelation.setLevel(2); + mtCommissionRelationMapper.insert(mtCommissionRelation); + } + logger.info("记录分佣关系成功,shareId = {}, userId = {}", shareId, userInfo.getId()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRuleServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRuleServiceImpl.java new file mode 100644 index 0000000..bc89994 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CommissionRuleServiceImpl.java @@ -0,0 +1,357 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.CommissionRuleDto; +import com.fuint.common.dto.CommissionRuleItemDto; +import com.fuint.common.enums.CommissionTypeEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.CommissionRuleItemParam; +import com.fuint.common.param.CommissionRulePage; +import com.fuint.common.param.CommissionRuleParam; +import com.fuint.common.service.CommissionRuleService; +import com.fuint.common.service.GoodsService; +import com.fuint.common.service.SettingService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtCommissionRuleItemMapper; +import com.fuint.repository.mapper.MtCommissionRuleMapper; +import com.fuint.repository.model.MtCommissionRule; +import com.fuint.repository.model.MtCommissionRuleItem; +import com.fuint.repository.model.MtGoods; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 分销提成服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CommissionRuleServiceImpl extends ServiceImpl implements CommissionRuleService { + + private static final Logger logger = LoggerFactory.getLogger(CommissionRuleServiceImpl.class); + + private MtCommissionRuleMapper mtCommissionRuleMapper; + + private MtCommissionRuleItemMapper mtCommissionRuleItemMapper; + + /** + * 商品服务接口 + * */ + private GoodsService goodsService; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 分页查询规则列表 + * + * @param commissionRulePage + * @return + */ + @Override + public PaginationResponse queryDataByPagination(CommissionRulePage commissionRulePage) { + Page pageHelper = PageHelper.startPage(commissionRulePage.getPage(), commissionRulePage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtCommissionRule::getStatus, StatusEnum.DISABLE.getKey()); + + String name = commissionRulePage.getName(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtCommissionRule::getName, name); + } + String status = commissionRulePage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtCommissionRule::getStatus, status); + } + String target = commissionRulePage.getTarget(); + if (StringUtils.isNotBlank(target)) { + lambdaQueryWrapper.eq(MtCommissionRule::getTarget, target); + } + String type = commissionRulePage.getType(); + if (StringUtils.isNotBlank(type)) { + lambdaQueryWrapper.eq(MtCommissionRule::getType, type); + } + Integer merchantId = commissionRulePage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtCommissionRule::getMerchantId, merchantId); + } + Integer storeId = commissionRulePage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtCommissionRule::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByDesc(MtCommissionRule::getId); + List dataList = mtCommissionRuleMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(commissionRulePage.getPage(), commissionRulePage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtCommissionRule.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加分销提成规则 + * + * @param commissionRule + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增分销提成规则") + public MtCommissionRule addCommissionRule(CommissionRuleParam commissionRule) throws BusinessCheckException { + MtCommissionRule mtCommissionRule = new MtCommissionRule(); + BeanUtils.copyProperties(commissionRule, mtCommissionRule); + mtCommissionRule.setStatus(StatusEnum.ENABLED.getKey()); + Date date = new Date(); + mtCommissionRule.setCreateTime(date); + mtCommissionRule.setUpdateTime(date); + mtCommissionRule.setMerchantId(mtCommissionRule.getMerchantId()== null ? 0 : mtCommissionRule.getMerchantId()); + String storeIds = StringUtil.join(commissionRule.getStoreIdList().toArray(), ","); + mtCommissionRule.setStoreIds(storeIds); + boolean result = save(mtCommissionRule); + if (result) { + if (mtCommissionRule.getType().equals(CommissionTypeEnum.RECHARGE.getKey()) || mtCommissionRule.getType().equals(CommissionTypeEnum.PAYMENT.getKey())) { + if (commissionRule.getMemberVal() != null || commissionRule.getVisitorVal() != null) { + List detailList = new ArrayList<>(); + CommissionRuleItemParam detailItem = new CommissionRuleItemParam(); + detailItem.setMethod("percent"); + detailItem.setGoodsId(0); + detailItem.setMemberVal(commissionRule.getMemberVal()); + detailItem.setVisitorVal(commissionRule.getVisitorVal()); + detailList.add(detailItem); + commissionRule.setDetailList(detailList); + } + } + if (commissionRule.getDetailList() != null && commissionRule.getDetailList().size() > 0) { + for (CommissionRuleItemParam itemParam : commissionRule.getDetailList()) { + MtCommissionRuleItem mtCommissionRuleItem = new MtCommissionRuleItem(); + mtCommissionRuleItem.setRuleId(mtCommissionRule.getId()); + mtCommissionRuleItem.setType(mtCommissionRule.getType()); + mtCommissionRuleItem.setTarget(mtCommissionRule.getTarget()); + mtCommissionRuleItem.setMerchantId(mtCommissionRule.getMerchantId()); + mtCommissionRuleItem.setStoreId(mtCommissionRule.getStoreId()); + mtCommissionRuleItem.setStoreIds(storeIds); + mtCommissionRuleItem.setCreateTime(date); + mtCommissionRuleItem.setUpdateTime(date); + mtCommissionRuleItem.setOperator(commissionRule.getOperator()); + mtCommissionRuleItem.setStatus(mtCommissionRule.getStatus()); + mtCommissionRuleItem.setMethod(itemParam.getMethod()); + mtCommissionRuleItem.setTarget(commissionRule.getTarget()); + mtCommissionRuleItem.setTargetId(itemParam.getGoodsId()); + mtCommissionRuleItem.setMember(itemParam.getMemberVal()); + mtCommissionRuleItem.setGuest(itemParam.getVisitorVal()); + mtCommissionRuleItemMapper.insert(mtCommissionRuleItem); + } + } + } else { + logger.error("新增分销提成规则失败..."); + throw new BusinessCheckException("新增分销方案规则失败"); + } + return mtCommissionRule; + } + + /** + * 根据ID获取规则信息 + * + * @param id 规则ID + * @return + */ + @Override + public CommissionRuleDto queryCommissionRuleById(Integer id) throws BusinessCheckException { + MtCommissionRule mtCommissionRule = mtCommissionRuleMapper.selectById(id); + if (mtCommissionRule == null) { + return null; + } + CommissionRuleDto commissionRuleDto = new CommissionRuleDto(); + BeanUtils.copyProperties(mtCommissionRule, commissionRuleDto); + + Map param = new HashMap(); + param.put("RULE_ID", id); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + List mtCommissionRuleItems = mtCommissionRuleItemMapper.selectByMap(param); + List detailList = new ArrayList<>(); + String basePath = settingService.getUploadBasePath(); + if (mtCommissionRuleItems != null && mtCommissionRuleItems.size() > 0) { + for (MtCommissionRuleItem item : mtCommissionRuleItems) { + CommissionRuleItemDto commissionRuleItemDto = new CommissionRuleItemDto(); + commissionRuleItemDto.setGoodsId(item.getTargetId()); + MtGoods mtGoods = goodsService.queryGoodsById(item.getTargetId()); + if (mtGoods != null) { + commissionRuleItemDto.setGoodsName(mtGoods.getName()); + commissionRuleItemDto.setLogo(basePath + mtGoods.getLogo()); + commissionRuleItemDto.setPrice(mtGoods.getPrice()); + } + commissionRuleItemDto.setType(item.getType()); + commissionRuleItemDto.setMemberVal(item.getMember()); + commissionRuleItemDto.setMethod(item.getMethod()); + commissionRuleItemDto.setVisitorVal(item.getGuest()); + detailList.add(commissionRuleItemDto); + } + } + commissionRuleDto.setDetailList(detailList); + if (mtCommissionRule.getType().equals(CommissionTypeEnum.RECHARGE.getKey()) || mtCommissionRule.getType().equals(CommissionTypeEnum.PAYMENT.getKey())) { + commissionRuleDto.setDetailList(null); + Map params = new HashMap(); + params.put("RULE_ID", id); + params.put("STATUS", StatusEnum.ENABLED.getKey()); + List mtCommissionRuleItemList = mtCommissionRuleItemMapper.selectByMap(params); + if (mtCommissionRuleItemList != null && mtCommissionRuleItemList.size() > 0) { + commissionRuleDto.setMemberVal(mtCommissionRuleItemList.get(0).getMember()); + commissionRuleDto.setVisitorVal(mtCommissionRuleItemList.get(0).getGuest()); + } + } + List storeIds = new ArrayList<>(); + if (StringUtil.isNotEmpty(mtCommissionRule.getStoreIds())) { + List storeIdList = Arrays.asList(mtCommissionRule.getStoreIds().split(",")); + if (storeIdList != null && storeIdList.size() > 0) { + for (String storeId : storeIdList) { + storeIds.add(Integer.parseInt(storeId)); + } + } + } + commissionRuleDto.setStoreIdList(storeIds); + return commissionRuleDto; + } + + /** + * 更新分销提成规则 + * + * @param commissionRule 规则参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新分销提成规则") + public MtCommissionRule updateCommissionRule(CommissionRuleParam commissionRule) throws BusinessCheckException { + MtCommissionRule mtCommissionRule = mtCommissionRuleMapper.selectById(commissionRule.getId()); + if (mtCommissionRule == null) { + logger.error("更新分销提成规则失败..."); + throw new BusinessCheckException("该数据状态异常"); + } + mtCommissionRule.setId(commissionRule.getId()); + if (commissionRule.getName() != null) { + mtCommissionRule.setName(commissionRule.getName()); + } + if (commissionRule.getTarget() != null) { + mtCommissionRule.setTarget(commissionRule.getTarget()); + } + if (commissionRule.getType() != null) { + mtCommissionRule.setType(commissionRule.getType()); + } + if (commissionRule.getStoreId() != null) { + mtCommissionRule.setStoreId(commissionRule.getStoreId()); + } + if (commissionRule.getDescription() != null) { + mtCommissionRule.setDescription(commissionRule.getDescription()); + } + if (commissionRule.getOperator() != null) { + mtCommissionRule.setOperator(commissionRule.getOperator()); + } + if (commissionRule.getStatus() != null) { + mtCommissionRule.setStatus(commissionRule.getStatus()); + if (commissionRule.getStatus().equals(StatusEnum.DISABLE.getKey())) { + mtCommissionRuleItemMapper.deleteByRuleId(commissionRule.getId(), new Date()); + } + } + String storeIds = ""; + if (commissionRule.getStoreIdList() != null && commissionRule.getStoreIdList().size() > 0) { + storeIds = StringUtil.join(commissionRule.getStoreIdList().toArray(), ","); + mtCommissionRule.setStoreIds(storeIds); + } + + if (mtCommissionRule.getType().equals(CommissionTypeEnum.RECHARGE.getKey()) || mtCommissionRule.getType().equals(CommissionTypeEnum.PAYMENT.getKey())) { + if (commissionRule.getMemberVal() != null || commissionRule.getVisitorVal() != null) { + List detailList = new ArrayList<>(); + CommissionRuleItemParam detailItem = new CommissionRuleItemParam(); + detailItem.setMethod("percent"); + detailItem.setGoodsId(0); + detailItem.setMemberVal(commissionRule.getMemberVal()); + detailItem.setVisitorVal(commissionRule.getVisitorVal()); + detailList.add(detailItem); + commissionRule.setDetailList(detailList); + } + } + + // 更新或插入 + Date date = new Date(); + List itemIds = new ArrayList<>(); + if (commissionRule.getDetailList() != null && commissionRule.getDetailList().size() > 0) { + for (CommissionRuleItemParam itemParam : commissionRule.getDetailList()) { + MtCommissionRuleItem mtCommissionRuleItem = new MtCommissionRuleItem(); + mtCommissionRuleItem.setRuleId(mtCommissionRule.getId()); + mtCommissionRuleItem.setType(mtCommissionRule.getType()); + mtCommissionRuleItem.setMerchantId(mtCommissionRule.getMerchantId()); + mtCommissionRuleItem.setStoreId(mtCommissionRule.getStoreId()); + mtCommissionRuleItem.setStoreIds(storeIds); + mtCommissionRuleItem.setCreateTime(date); + mtCommissionRuleItem.setUpdateTime(date); + mtCommissionRuleItem.setOperator(commissionRule.getOperator()); + mtCommissionRuleItem.setStatus(mtCommissionRule.getStatus()); + mtCommissionRuleItem.setMethod(itemParam.getMethod()); + mtCommissionRuleItem.setTarget(commissionRule.getTarget()); + mtCommissionRuleItem.setTargetId(itemParam.getGoodsId()); + mtCommissionRuleItem.setMember(itemParam.getMemberVal()); + mtCommissionRuleItem.setGuest(itemParam.getVisitorVal()); + // 判断是否已经存在,存在则更新 + if (itemParam.getGoodsId() != null && itemParam.getGoodsId() >= 0) { + Map param = new HashMap(); + param.put("RULE_ID", commissionRule.getId()); + param.put("TARGET_ID", itemParam.getGoodsId()); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + List items = mtCommissionRuleItemMapper.selectByMap(param); + if (items != null && items.size() > 0) { + mtCommissionRuleItem.setId(items.get(0).getId()); + itemIds.add(items.get(0).getId()); + } + } + if (mtCommissionRuleItem.getId() != null && mtCommissionRuleItem.getId() > 0) { + mtCommissionRuleItemMapper.updateById(mtCommissionRuleItem); + } else { + mtCommissionRuleItemMapper.insert(mtCommissionRuleItem); + itemIds.add(mtCommissionRuleItem.getId()); + } + } + } + + // 删除 + Map params = new HashMap(); + params.put("RULE_ID", commissionRule.getId()); + params.put("STATUS", StatusEnum.ENABLED.getKey()); + List mtCommissionRuleItems = mtCommissionRuleItemMapper.selectByMap(params); + for (MtCommissionRuleItem item : mtCommissionRuleItems) { + if (!itemIds.contains(item.getId())) { + item.setStatus(StatusEnum.DISABLE.getKey()); + mtCommissionRuleItemMapper.updateById(item); + } + } + + mtCommissionRule.setUpdateTime(new Date()); + mtCommissionRuleMapper.updateById(mtCommissionRule); + return mtCommissionRule; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/ConfirmLogServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/ConfirmLogServiceImpl.java new file mode 100644 index 0000000..cbbba36 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/ConfirmLogServiceImpl.java @@ -0,0 +1,167 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.ConfirmLogDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.ConfirmLogPage; +import com.fuint.common.service.ConfirmLogService; +import com.fuint.common.service.CouponService; +import com.fuint.common.service.MemberService; +import com.fuint.common.service.StoreService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtConfirmLogMapper; +import com.fuint.repository.model.MtConfirmLog; +import com.fuint.repository.model.MtCoupon; +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtUser; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 核销卡券服务 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class ConfirmLogServiceImpl extends ServiceImpl implements ConfirmLogService { + + private MtConfirmLogMapper mtConfirmLogMapper; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 分页查询卡券核销列表 + * + * @param confirmLogPage + * @return + */ + @Override + public PaginationResponse queryConfirmLogListByPagination(ConfirmLogPage confirmLogPage) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(confirmLogPage.getPage(), confirmLogPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtConfirmLog::getStatus, StatusEnum.DISABLE.getKey()); + + String status = confirmLogPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtConfirmLog::getStatus, status); + } + Integer userId = confirmLogPage.getUserId(); + if (userId != null) { + lambdaQueryWrapper.eq(MtConfirmLog::getUserId, userId); + } + Integer couponId = confirmLogPage.getCouponId(); + if (couponId != null && couponId > 0) { + lambdaQueryWrapper.eq(MtConfirmLog::getCouponId, couponId); + } + Integer merchantId = confirmLogPage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtConfirmLog::getMerchantId, merchantId); + } + Integer storeId = confirmLogPage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtConfirmLog::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByDesc(MtConfirmLog::getId); + List confirmLogList = mtConfirmLogMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + for (MtConfirmLog log : confirmLogList) { + MtUser userInfo = memberService.queryMemberById(log.getUserId()); + MtStore storeInfo = storeService.queryStoreById(log.getStoreId()); + MtCoupon couponInfo = couponService.queryCouponById(log.getCouponId()); + ConfirmLogDto item = new ConfirmLogDto(); + item.setId(log.getId()); + item.setCode(log.getCode()); + item.setUserInfo(userInfo); + item.setStoreInfo(storeInfo); + item.setCouponInfo(couponInfo); + item.setUserCouponId(log.getUserCouponId()); + item.setAmount(log.getAmount()); + item.setCreateTime(log.getCreateTime()); + item.setUpdateTime(log.getUpdateTime()); + item.setStatus(log.getStatus()); + item.setRemark(log.getRemark()); + item.setOperator(log.getOperator()); + dataList.add(item); + } + + PageRequest pageRequest = PageRequest.of(confirmLogPage.getPage(), confirmLogPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, ConfirmLogDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 获取卡券(计次卡)核销次数 + * @param userCouponId 会员卡券ID + * @return + * */ + @Override + public Long getConfirmNum(Integer userCouponId) { + if (userCouponId > 0) { + return mtConfirmLogMapper.getConfirmNum(userCouponId); + } else { + return 0L; + } + } + + /** + * 获取卡券核销列表 + * @param userCouponId + * @return + * */ + @Override + public List getConfirmList(Integer userCouponId) { + if (userCouponId == null || userCouponId <= 0) { + return new ArrayList<>(); + } + Map params = new HashMap<>(); + params.put("status", StatusEnum.ENABLED.getKey()); + params.put("USER_COUPON_ID", userCouponId.toString()); + return mtConfirmLogMapper.selectByMap(params); + } + + /** + * 获取卡券核销数量 + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public Long getConfirmCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) { + return mtConfirmLogMapper.getConfirmLogCount(merchantId, storeId, beginTime, endTime); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CouponGroupServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CouponGroupServiceImpl.java new file mode 100644 index 0000000..3d23255 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CouponGroupServiceImpl.java @@ -0,0 +1,489 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.CouponCellDto; +import com.fuint.common.dto.ReqCouponGroupDto; +import com.fuint.common.dto.ReqSendLogDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.SeqUtil; +import com.fuint.common.util.XlsUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtCouponGroupMapper; +import com.fuint.repository.mapper.MtCouponMapper; +import com.fuint.repository.mapper.MtUserCouponMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.math.BigDecimal; +import java.lang.String; +import java.util.*; +import java.util.regex.Pattern; + +/** + * 卡券分组业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CouponGroupServiceImpl extends ServiceImpl implements CouponGroupService { + + private static final Logger log = LoggerFactory.getLogger(CouponGroupServiceImpl.class); + + private MtCouponGroupMapper mtCouponGroupMapper; + + private MtCouponMapper mtCouponMapper; + + private MtUserCouponMapper mtUserCouponMapper; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 卡券发放记录服务接口 + * */ + private SendLogService sendLogService; + + /** + * 短信发送服务接口 + * */ + private SendSmsService sendSmsService; + + /** + * 分页查询卡券分组列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryCouponGroupListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtCouponGroup::getStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtCouponGroup::getName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtCouponGroup::getStatus, status); + } + String id = paginationRequest.getSearchParams().get("id") == null ? "" : paginationRequest.getSearchParams().get("id").toString(); + if (StringUtils.isNotBlank(id)) { + lambdaQueryWrapper.eq(MtCouponGroup::getId, id); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtCouponGroup::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtCouponGroup::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByDesc(MtCouponGroup::getId); + List dataList = mtCouponGroupMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtCouponGroup.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加卡券分组 + * + * @param reqCouponGroupDto + * @throws BusinessCheckException + */ + @Override + @OperationServiceLog(description = "新增卡券分组") + public MtCouponGroup addCouponGroup(ReqCouponGroupDto reqCouponGroupDto) { + MtCouponGroup couponGroup = new MtCouponGroup(); + couponGroup.setMerchantId(reqCouponGroupDto.getMerchantId()); + couponGroup.setStoreId(reqCouponGroupDto.getStoreId()); + couponGroup.setName(CommonUtil.replaceXSS(reqCouponGroupDto.getName())); + couponGroup.setMoney(new BigDecimal("0")); + couponGroup.setTotal(0); + couponGroup.setDescription(CommonUtil.replaceXSS(reqCouponGroupDto.getDescription())); + couponGroup.setStatus(StatusEnum.ENABLED.getKey()); + couponGroup.setCreateTime(new Date()); + couponGroup.setUpdateTime(new Date()); + couponGroup.setNum(0); + couponGroup.setOperator(reqCouponGroupDto.getOperator()); + + this.save(couponGroup); + return couponGroup; + } + + /** + * 根据分组ID获取卡券分组信息 + * + * @param id 卡券分组ID + * @throws BusinessCheckException + */ + @Override + public MtCouponGroup queryCouponGroupById(Integer id) { + return mtCouponGroupMapper.selectById(id); + } + + /** + * 根据ID删除卡券分组 + * + * @param id 分组ID + * @param operator 操作人 + * @throws BusinessCheckException + */ + @Override + @OperationServiceLog(description = "删除卡券分组") + public void deleteCouponGroup(Integer id, String operator) { + MtCouponGroup couponGroup = queryCouponGroupById(id); + if (null == couponGroup) { + return; + } + + couponGroup.setStatus(StatusEnum.DISABLE.getKey()); + couponGroup.setUpdateTime(new Date()); + couponGroup.setOperator(operator); + + this.updateById(couponGroup); + } + + /** + * 修改卡券分组 + * + * @param reqCouponGroupDto + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新卡券分组") + public MtCouponGroup updateCouponGroup(ReqCouponGroupDto reqCouponGroupDto) throws BusinessCheckException { + MtCouponGroup couponGroup = queryCouponGroupById(reqCouponGroupDto.getId()); + if (null == couponGroup || StatusEnum.DISABLE.getKey().equalsIgnoreCase(couponGroup.getStatus())) { + throw new BusinessCheckException("该分组不存在或已被删除"); + } + if (reqCouponGroupDto.getName() != null) { + couponGroup.setName(CommonUtil.replaceXSS(reqCouponGroupDto.getName())); + } + if (reqCouponGroupDto.getDescription() != null) { + couponGroup.setDescription(CommonUtil.replaceXSS(reqCouponGroupDto.getDescription())); + } + if (couponGroup.getTotal() == null) { + couponGroup.setTotal(0); + } + if (reqCouponGroupDto.getStatus() != null) { + couponGroup.setStatus(reqCouponGroupDto.getStatus()); + } + couponGroup.setUpdateTime(new Date()); + couponGroup.setOperator(reqCouponGroupDto.getOperator()); + this.updateById(couponGroup); + return couponGroup; + } + + /** + * 获取卡券种类数量 + * + * @param id + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Integer getCouponNum(Integer id) { + Long num = mtCouponMapper.queryNumByGroupId(id); + return num.intValue(); + } + + /** + * 获取卡券总价值 + * + * @param groupId + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + public BigDecimal getCouponMoney(Integer groupId) { + List couponList = mtCouponMapper.queryByGroupId(groupId.intValue()); + MtCouponGroup groupInfo = queryCouponGroupById(groupId); + BigDecimal money = BigDecimal.valueOf(0); + if (couponList.size() > 0) { + for (int i = 0; iuploadFile:{}", "文件类型不正确"); + throw new BusinessCheckException("文件类型不正确"); + } + + List> content = new ArrayList<>(); + try { + content = XlsUtil.readExcelContent(file.getInputStream(), isExcel2003, 0,1, null, null, null); + } catch (IOException e) { + log.error("CouponGroupServiceImpl->parseExcelContent{}", e); + throw new BusinessCheckException("导入失败"+e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + + StringBuffer errorMsg = new StringBuffer(); + StringBuffer errorMsgNoGroup = new StringBuffer(); + StringBuffer errorMsgNoNum = new StringBuffer(); + StringBuffer errorMsgNoRegister = new StringBuffer(); + + List rows = new ArrayList<>(); + + for (int i = 0; i < content.size(); i++) { + List groupIdArr = new ArrayList<>(); + List numArr = new ArrayList<>(); + + List rowContent = content.get(i); + String mobile = rowContent.get(0); + String merchantId = rowContent.get(1); + + if (StringUtil.isBlank(mobile) || mobile.length() < 11 || mobile.length() > 11) { + errorMsg.append("第" + i + "行错误,手机号有误:"+mobile); + continue; + } + + for (int j = 1; j < rowContent.size(); j++) { + Integer item = 0; + String cellContent = rowContent.get(j); + if (null == cellContent || cellContent.equals("")) { + continue; + } + + Pattern pattern = Pattern.compile("^[1-9]\\d*$"); + if ((j%2) != 0) { + if (item == null || (!pattern.matcher(cellContent).matches())) { + throw new BusinessCheckException("第" + (i+1) + "行第"+ j +"列错误, 卡券ID异常"); + } + + item = Integer.parseInt(cellContent); + if (item < 0) { + errorMsg.append("第" + (i+1) + "行第"+ j +"列错误, 卡券ID异常"); + continue; + } + groupIdArr.add(item); + } else { + if (item == null || (!pattern.matcher(rowContent.get(j)).matches())) { + throw new BusinessCheckException("第" + (i+1) + "行第"+ j +"列错误, 数量异常"); + } + + item = Integer.parseInt(rowContent.get(j)); + if (item < 0) { + errorMsg.append("第" + (i+1) + "行第"+ j +"列错误, 数量异常"); + continue; + } + numArr.add(item); + } + } + + if (groupIdArr.size() != numArr.size()) { + throw new BusinessCheckException("表格数据有问题导致无法导入"); + } + + CouponCellDto item = new CouponCellDto(); + item.setMobile(mobile); + item.setGroupId(groupIdArr); + item.setNum(numArr); + item.setMerchantId(Integer.parseInt(merchantId)); + rows.add(item); + } + + if (rows.size() < 1) { + throw new BusinessCheckException("表格数据为空导致无法导入"); + } + + if (rows.size() > 1000) { + throw new BusinessCheckException("每次导入最多不能超过1000人"); + } + + // 获取每个分组的总数 + Map couponIdMap = new HashMap<>(); + for (CouponCellDto dto : rows) { + MtUser userInfo = memberService.queryMemberByMobile(dto.getMerchantId(), dto.getMobile()); + if (userInfo == null) { + userInfo = memberService.addMemberByMobile(dto.getMerchantId(), dto.getMobile(), "0", ""); + } + + if (null == userInfo || !userInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + if (StringUtil.isNotBlank(errorMsgNoGroup.toString())) { + errorMsgNoGroup.append("," + dto.getMobile()); + } else { + errorMsgNoGroup.append("手机号没有注册或已禁用:"+dto.getMobile()); + } + } + + for (int k = 0; k < dto.getGroupId().size(); k++) { + Integer num = dto.getNum().get(k); + Integer total = couponIdMap.get(dto.getGroupId().get(k).toString()) == null ? 0 : couponIdMap.get(dto.getGroupId().get(k).toString()); + couponIdMap.put(dto.getGroupId().get(k).toString(), (total+num)); + } + } + + if (StringUtil.isNotBlank(errorMsgNoRegister.toString())) { + throw new BusinessCheckException(errorMsgNoRegister.toString()); + } + + for (String couponId : couponIdMap.keySet()) { + MtCoupon couponInfo = couponService.queryCouponById(Integer.parseInt(couponId)); + if (null == couponInfo) { + if (StringUtil.isNotBlank(errorMsgNoGroup.toString())) { + errorMsgNoGroup.append("," + couponId); + } else { + errorMsgNoGroup.append("卡券ID不存在:"+couponId); + } + continue; + } + + if (!couponInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("卡券ID"+couponId+"可能已删除或禁用"); + } + + Integer totalNum = couponInfo.getTotal() == null ? 0 : couponInfo.getTotal(); + Integer sendNum = couponIdMap.get(couponId); + Integer hasSendNum = getSendNum(Integer.parseInt(couponId)); + if (totalNum > 0 && ((totalNum - hasSendNum) < sendNum)) { + Integer needNum = sendNum - (totalNum - hasSendNum); + if (StringUtil.isNotBlank(errorMsgNoNum.toString())) { + errorMsgNoNum.append(";卡券ID:" + couponId + "存量不足,至少再添加" + needNum + "套"); + } else { + errorMsgNoNum.append("卡券ID:" + couponId + "存量不足,至少再添加" + needNum + "套"); + } + } + } + + if (StringUtil.isNotBlank(errorMsgNoGroup.toString())) { + throw new BusinessCheckException(errorMsgNoGroup.toString()); + } + + if (StringUtil.isNotBlank(errorMsgNoNum.toString())) { + throw new BusinessCheckException(errorMsgNoNum.toString()); + } + + if (StringUtil.isNotBlank(errorMsg.toString())) { + throw new BusinessCheckException(errorMsg.toString()); + } + + // 导入批次 + String uuid = SeqUtil.getUUID(); + + // 至此,验证都通过了,开始发券 + try { + for (CouponCellDto cellDto : rows) { + // 发送张数 + Integer totalNum = 0; + // 发送总价值 + BigDecimal totalMoney = new BigDecimal("0.0"); + for (int gid = 0; gid < cellDto.getGroupId().size(); gid++) { + MtCouponGroup mtCouponGroup = getById(cellDto.getGroupId().get(gid).intValue()); + MtUser mtUser = memberService.queryMemberByMobile(mtCouponGroup.getMerchantId(), cellDto.getMobile()); + couponService.sendCoupon(cellDto.getGroupId().get(gid).intValue(), mtUser.getId(), cellDto.getNum().get(gid), false, uuid, operator); + List couponList = couponService.queryCouponListByGroupId(cellDto.getGroupId().get(gid).intValue()); + // 累加总张数、总价值 + for (MtCoupon coupon : couponList) { + totalNum = totalNum + (coupon.getSendNum()*cellDto.getNum().get(gid)); + totalMoney = totalMoney.add((coupon.getAmount().multiply(new BigDecimal(cellDto.getNum().get(gid)).multiply(new BigDecimal(coupon.getSendNum()))))); + } + } + + MtUser mtUser = memberService.queryMemberByMobile(cellDto.getMerchantId(), cellDto.getMobile()); + + // 发放记录 + ReqSendLogDto dto = new ReqSendLogDto(); + dto.setMerchantId(cellDto.getMerchantId()); + dto.setType(2); + dto.setMobile(cellDto.getMobile()); + dto.setUserId(mtUser.getId()); + dto.setFileName(originalFileName); + dto.setFilePath(filePath); + dto.setGroupId(0); + dto.setCouponId(0); + dto.setGroupName(""); + dto.setSendNum(0); + dto.setOperator(operator); + dto.setUuid(uuid); + sendLogService.addSendLog(dto); + + // 发送短信 + try { + List mobileList = new ArrayList<>(); + mobileList.add(cellDto.getMobile()); + Map params = new HashMap<>(); + params.put("totalNum", totalNum+""); + params.put("totalMoney", totalMoney+""); + sendSmsService.sendSms(cellDto.getMerchantId(), "received-coupon", mobileList, params); + } catch (Exception e) { + log.error("发券发送短信出错:", e.getMessage()); + } + } + } catch (BusinessCheckException e) { + throw new BusinessCheckException(e.getMessage()); + } + return uuid; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/CouponServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/CouponServiceImpl.java new file mode 100644 index 0000000..69602c8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/CouponServiceImpl.java @@ -0,0 +1,1303 @@ +package com.fuint.common.service.impl; + +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.fuint.common.Constants; +import com.fuint.common.dto.CouponDto; +import com.fuint.common.dto.ReqCouponDto; +import com.fuint.common.dto.ReqSendLogDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.CouponListParam; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.DateUtil; +import com.fuint.common.util.SeqUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.bean.CouponNumBean; +import com.fuint.repository.mapper.*; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 卡券业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class CouponServiceImpl extends ServiceImpl implements CouponService { + + private static final Logger logger = LoggerFactory.getLogger(CouponServiceImpl.class); + + private MtCouponMapper mtCouponMapper; + + private MtUserCouponMapper mtUserCouponMapper; + + private MtConfirmLogMapper mtConfirmLogMapper; + + private MtSendLogMapper mtSendLogMapper; + + private MtStoreMapper mtStoreMapper; + + private MtCouponGoodsMapper mtCouponGoodsMapper; + + private MtOrderMapper mtOrderMapper; + + private MtGoodsMapper mtGoodsMapper; + + /** + * 会员卡券服务接口 + * */ + private UserCouponService userCouponService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 会员等级服务接口 + * */ + private UserGradeService userGradeService; + + /** + * 短信发送服务接口 + * */ + private SendSmsService sendSmsService; + + /** + * 核销记录服务接口 + * */ + private ConfirmLogService confirmLogService; + + /** + * 卡券发放记录服务接口 + * */ + private SendLogService sendLogService; + + /** + * 卡券分组服务接口 + * */ + private CouponGroupService couponGroupService; + + /** + * 系统配置服务接口 + * */ + private SettingService settingService; + + /** + * 微信相关服务接口 + * */ + private WeixinService weixinService; + + /** + * 分页查询券列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryCouponListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtCoupon::getStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtCoupon::getName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtCoupon::getStatus, status); + } + String groupId = paginationRequest.getSearchParams().get("groupId") == null ? "" : paginationRequest.getSearchParams().get("groupId").toString(); + if (StringUtils.isNotBlank(groupId)) { + lambdaQueryWrapper.eq(MtCoupon::getGroupId, groupId); + } + String type = paginationRequest.getSearchParams().get("type") == null ? "" : paginationRequest.getSearchParams().get("type").toString(); + if (StringUtils.isNotBlank(type)) { + lambdaQueryWrapper.eq(MtCoupon::getType, type); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtCoupon::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtCoupon::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByDesc(MtCoupon::getUpdateTime); + List dataList = mtCouponMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtCoupon.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存卡券信息 + * + * @param reqCouponDto 卡券实体 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存卡券信息") + public MtCoupon saveCoupon(ReqCouponDto reqCouponDto) throws BusinessCheckException, ParseException { + MtCoupon mtCoupon; + + if (reqCouponDto.getId() != null) { + mtCoupon = mtCouponMapper.selectById(reqCouponDto.getId()); + } else { + mtCoupon = new MtCoupon(); + if (reqCouponDto.getMerchantId() == null || reqCouponDto.getMerchantId() <= 0) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + } + // 固定有效期验证 + if (reqCouponDto.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) { + if (StringUtil.isNotBlank(reqCouponDto.getBeginTime()) && StringUtil.isNotBlank(reqCouponDto.getEndTime())) { + Date startTime = DateUtil.parseDate(reqCouponDto.getBeginTime()); + Date endTime = DateUtil.parseDate(reqCouponDto.getEndTime()); + if (endTime.after(new Date())) { + if (mtCoupon != null && mtCoupon.getId() != null && mtCoupon.getStatus().equals(StatusEnum.EXPIRED.getKey())) { + reqCouponDto.setStatus(StatusEnum.ENABLED.getKey()); + } + } + if (endTime.before(startTime)) { + throw new BusinessCheckException("生效期结束时间不能早于开始时间"); + } + } + } + if (reqCouponDto.getMerchantId() != null) { + mtCoupon.setMerchantId(reqCouponDto.getMerchantId()); + } + if (reqCouponDto.getStoreId() != null) { + mtCoupon.setStoreId(reqCouponDto.getStoreId()); + } + mtCoupon.setGroupId(reqCouponDto.getGroupId()); + if (reqCouponDto.getType() != null) { + mtCoupon.setType(reqCouponDto.getType()); + } + if (reqCouponDto.getContent() != null) { + mtCoupon.setContent(reqCouponDto.getContent()); + } + if (reqCouponDto.getName() != null) { + mtCoupon.setName(CommonUtil.replaceXSS(reqCouponDto.getName())); + } + if (reqCouponDto.getIsGive() != null) { + mtCoupon.setIsGive(reqCouponDto.getIsGive().equals(1) ? true : false); + } + if (reqCouponDto.getPoint() != null) { + mtCoupon.setPoint(reqCouponDto.getPoint()); + } + if (mtCoupon.getPoint() == null) { + mtCoupon.setPoint(0); + } + if (reqCouponDto.getLimitNum() != null) { + mtCoupon.setLimitNum(reqCouponDto.getLimitNum()); + } + if (mtCoupon.getLimitNum() == null) { + mtCoupon.setLimitNum(1); + } + if (reqCouponDto.getReceiveCode() != null) { + mtCoupon.setReceiveCode(reqCouponDto.getReceiveCode()); + } + if (mtCoupon.getReceiveCode() == null) { + mtCoupon.setReceiveCode(""); + } + + if (mtCoupon.getType().equals(CouponTypeEnum.TIMER.getKey())) { + if (reqCouponDto.getTimerPoint() != null) { + mtCoupon.setPoint(reqCouponDto.getTimerPoint()); + } + if (reqCouponDto.getTimerReceiveCode() != null) { + mtCoupon.setReceiveCode(reqCouponDto.getTimerReceiveCode()); + } + } + + mtCoupon.setStoreIds(reqCouponDto.getStoreIds()); + mtCoupon.setGradeIds(reqCouponDto.getGradeIds()); + + if (reqCouponDto.getSendNum() == null) { + reqCouponDto.setSendNum(1); + } + + mtCoupon.setSendWay(reqCouponDto.getSendWay()); + mtCoupon.setSendNum(reqCouponDto.getSendNum()); + + if (reqCouponDto.getTotal() == null) { + reqCouponDto.setTotal(0); + } + mtCoupon.setTotal(reqCouponDto.getTotal()); + + if (reqCouponDto.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) { + mtCoupon.setBeginTime(DateUtil.parseDate(reqCouponDto.getBeginTime())); + mtCoupon.setEndTime(DateUtil.parseDate(reqCouponDto.getEndTime())); + } + if (reqCouponDto.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + if (reqCouponDto.getExpireTime() == null || reqCouponDto.getExpireTime() < 0) { + throw new BusinessCheckException("请输入正确的有效天数"); + } + mtCoupon.setExpireTime(reqCouponDto.getExpireTime()); + } + mtCoupon.setExpireType(reqCouponDto.getExpireType()); + mtCoupon.setExceptTime(CommonUtil.replaceXSS(reqCouponDto.getExceptTime())); + mtCoupon.setDescription(CommonUtil.replaceXSS(reqCouponDto.getDescription())); + mtCoupon.setRemarks(CommonUtil.replaceXSS(reqCouponDto.getRemarks())); + mtCoupon.setInRule(CommonUtil.replaceXSS(reqCouponDto.getInRule())); + mtCoupon.setOutRule(CommonUtil.replaceXSS(reqCouponDto.getOutRule())); + mtCoupon.setApplyGoods(reqCouponDto.getApplyGoods()); + mtCoupon.setUseFor(reqCouponDto.getUseFor()); + + if (null == reqCouponDto.getAmount()) { + reqCouponDto.setAmount(new BigDecimal(0)); + } + mtCoupon.setAmount(reqCouponDto.getAmount()); + if (StringUtil.isNotBlank(reqCouponDto.getImage())) { + mtCoupon.setImage(reqCouponDto.getImage()); + } + mtCoupon.setRemarks(CommonUtil.replaceXSS(reqCouponDto.getRemarks())); + if (reqCouponDto.getStatus() == null || StringUtil.isEmpty(reqCouponDto.getStatus())) { + mtCoupon.setStatus(StatusEnum.ENABLED.getKey()); + } else { + mtCoupon.setStatus(reqCouponDto.getStatus()); + } + + // 创建时间 + if (reqCouponDto.getId() == null) { + mtCoupon.setCreateTime(new Date()); + } + + // 更新时间 + mtCoupon.setUpdateTime(new Date()); + + // 操作人 + mtCoupon.setOperator(reqCouponDto.getOperator()); + + if (mtCoupon.getId() == null) { + this.save(mtCoupon); + } else { + mtCouponMapper.updateById(mtCoupon); + } + + MtCoupon couponInfo = mtCouponMapper.selectById(mtCoupon.getId()); + + // 更新已下发的会员卡券有效期 + if (couponInfo.getId() != null && reqCouponDto.getEndTime() != null && StringUtil.isNotEmpty(reqCouponDto.getEndTime())) { + mtUserCouponMapper.updateExpireTime(couponInfo.getId(), reqCouponDto.getEndTime()); + } + + // 适用商品 + if (StringUtil.isNotBlank(reqCouponDto.getGoodsIds())) { + String[] goodsIds = reqCouponDto.getGoodsIds().split(","); + if (goodsIds.length > 0) { + // 1.先删除 + List couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId()); + for (MtCouponGoods cg : couponGoodsList) { + mtCouponGoodsMapper.deleteById(cg.getId()); + } + // 2.再添加 + for (int n = 0; n < goodsIds.length; n++) { + boolean isNumeric = CommonUtil.isNumeric(goodsIds[n]); + if (!isNumeric) { + throw new BusinessCheckException("适用商品ID必须为正整数!"); + } else { + MtGoods mtGoods = mtGoodsMapper.selectById(Integer.parseInt(goodsIds[n])); + if (mtGoods == null) { + throw new BusinessCheckException("适用商品不存在,请确认!"); + } + } + if (StringUtil.isNotEmpty(goodsIds[n])) { + MtCouponGoods mtCouponGoods = new MtCouponGoods(); + mtCouponGoods.setCouponId(couponInfo.getId()); + mtCouponGoods.setGoodsId(Integer.parseInt(goodsIds[n])); + mtCouponGoods.setStatus(StatusEnum.ENABLED.getKey()); + mtCouponGoods.setCreateTime(new Date()); + mtCouponGoods.setUpdateTime(new Date()); + mtCouponGoodsMapper.insert(mtCouponGoods); + } + } + } + } + + // 如果是优惠券或储值卡,并且是线下发放,生成会员卡券 + if (reqCouponDto.getId() == null && !mtCoupon.getType().equals(CouponTypeEnum.TIMER.getKey()) && mtCoupon.getSendWay().equals(SendWayEnum.OFFLINE.getKey())) { + Integer total = mtCoupon.getTotal() * mtCoupon.getSendNum(); + if (mtCoupon.getSendNum() == null || mtCoupon.getSendNum() <= 0) { + total = mtCoupon.getTotal(); + } + if (total > 0) { + String uuid = SeqUtil.getUUID(); + for (int i = 1; i <= total; i++) { + MtUserCoupon userCoupon = new MtUserCoupon(); + userCoupon.setMerchantId(mtCoupon.getMerchantId()); + userCoupon.setStoreId(mtCoupon.getStoreId()); + userCoupon.setCouponId(couponInfo.getId()); + userCoupon.setGroupId(mtCoupon.getGroupId()); + userCoupon.setMobile(""); + userCoupon.setUserId(0); + userCoupon.setStatus(UserCouponStatusEnum.UNSEND.getKey()); + userCoupon.setCreateTime(new Date()); + userCoupon.setUpdateTime(new Date()); + userCoupon.setExpireTime(couponInfo.getEndTime()); + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) { + userCoupon.setExpireTime(couponInfo.getEndTime()); + } + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + Date expireTime = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(expireTime); + c.add(Calendar.DATE, couponInfo.getExpireTime()); + expireTime = c.getTime(); + userCoupon.setExpireTime(expireTime); + } + userCoupon.setUuid(uuid); + userCoupon.setType(couponInfo.getType()); + + // 储值卡金额 + if (couponInfo.getAmount() == null || couponInfo.getAmount().compareTo(new BigDecimal("0")) <= 0) { + if (StringUtil.isNotEmpty(couponInfo.getInRule())) { + String[] arr = couponInfo.getInRule().split(","); + if (arr.length > 0) { + String[] values = arr[0].split("_"); + if (values.length > 1 && (StringUtil.isNotEmpty(values[1]))) { + couponInfo.setAmount(new BigDecimal(values[1])); + } else { + couponInfo.setAmount(new BigDecimal(values[0])); + } + } + } + } + + userCoupon.setAmount(couponInfo.getAmount()); + userCoupon.setBalance(couponInfo.getAmount()); + userCoupon.setStoreId(0); + userCoupon.setOperator(reqCouponDto.getOperator()); + userCoupon.setImage(couponInfo.getImage()); + + // 16位随机数 + userCoupon.setCode(SeqUtil.getRandomNumber(16)); + mtUserCouponMapper.insert(userCoupon); + } + } + } + + return mtCoupon; + } + + /** + * 根据ID获取券信息 + * + * @param id 券ID + * @return + */ + @Override + public MtCoupon queryCouponById(Integer id) { + return mtCouponMapper.selectById(id); + } + + /** + * 删除卡券 + * + * @param id 券ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除卡券") + @Transactional(rollbackFor = Exception.class) + public void deleteCoupon(Long id, String operator) throws BusinessCheckException { + MtCoupon couponInfo = queryCouponById(id.intValue()); + if (null == couponInfo) { + throw new BusinessCheckException("卡券不存在"); + } + couponInfo.setStatus(StatusEnum.DISABLE.getKey()); + // 修改时间 + couponInfo.setUpdateTime(new Date()); + // 操作人 + couponInfo.setOperator(operator); + // 删除会员关联的卡券 + userCouponService.removeUserCouponByCouponId(couponInfo.getId()); + + mtCouponMapper.updateById(couponInfo); + } + + /** + * 获取卡券列表 + * + * @param couponListParam 查询参数 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject findCouponList(CouponListParam couponListParam) throws BusinessCheckException { + Integer pageNumber = couponListParam.getPage() == null ? Constants.PAGE_NUMBER : couponListParam.getPage(); + Integer pageSize = couponListParam.getPageSize() == null ? Constants.PAGE_SIZE : couponListParam.getPageSize(); + String status = couponListParam.getStatus() == null ? StatusEnum.ENABLED.getKey() : couponListParam.getStatus(); + String type = couponListParam.getType() == null ? "" : couponListParam.getType(); + Integer userId = couponListParam.getUserId() == null ? 0 : couponListParam.getUserId(); + Integer needPoint = couponListParam.getNeedPoint() == null ? 0 : couponListParam.getNeedPoint(); + String sendWay = couponListParam.getSendWay() == null ? "front" : couponListParam.getSendWay(); + Integer merchantId = couponListParam.getMerchantId() == null ? 0 : couponListParam.getMerchantId(); + Integer storeId = couponListParam.getStoreId() == null ? 0 : couponListParam.getStoreId(); + String keyword = couponListParam.getKeyword() == null ? "" : couponListParam.getKeyword(); + String sortType = couponListParam.getSortType() == null ? "" : couponListParam.getSortType(); + String sortPrice = couponListParam.getSortPrice() == null ? "0" : couponListParam.getSortPrice(); + + Page pageHelper = PageHelper.startPage(pageNumber, pageSize); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtCoupon::getStatus, StatusEnum.DISABLE.getKey()); + if (StringUtil.isNotEmpty(status)) { + lambdaQueryWrapper.eq(MtCoupon::getStatus, status); + } + if (StringUtil.isNotEmpty(sendWay)) { + lambdaQueryWrapper.eq(MtCoupon::getSendWay, sendWay); + } + if (StringUtil.isNotEmpty(keyword)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtCoupon::getId, keyword) + .or() + .like(MtCoupon::getName, keyword)); + } + if (StringUtil.isNotEmpty(type)) { + lambdaQueryWrapper.eq(MtCoupon::getType, type); + } + if (needPoint != null && needPoint > 0) { + lambdaQueryWrapper.eq(MtCoupon::getPoint, 0); + } + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtCoupon::getMerchantId, merchantId); + } + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtCoupon::getStoreId, storeId); + } + if (StringUtil.isNotEmpty(sortType)) { + if (sortType.equals("price")) { + if (sortPrice.equals("0")) { + lambdaQueryWrapper.orderByDesc(MtCoupon::getAmount); + } else { + lambdaQueryWrapper.orderByAsc(MtCoupon::getAmount); + } + } + } else { + lambdaQueryWrapper.orderByAsc(MtCoupon::getId); + } + List dataList = mtCouponMapper.selectList(lambdaQueryWrapper); + + // 处理已过期 + for (MtCoupon coupon : dataList) { + // 固定期限 + if (coupon.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey()) && (coupon.getEndTime() != null) && coupon.getEndTime().before(new Date())) { + coupon.setStatus(StatusEnum.EXPIRED.getKey()); + coupon.setUpdateTime(new Date()); + mtCouponMapper.updateById(coupon); + } + // 领取后生效 + if (coupon.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey()) && (coupon.getExpireTime() != null)) { + Date expireTime = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(expireTime); + c.add(Calendar.DATE, coupon.getExpireTime()); + expireTime = c.getTime(); + if (expireTime.before(new Date())) { + coupon.setStatus(StatusEnum.EXPIRED.getKey()); + coupon.setUpdateTime(new Date()); + mtCouponMapper.updateById(coupon); + } + } + } + + List content = new ArrayList<>(); + String baseImage = settingService.getUploadBasePath(); + for (int i = 0; i < dataList.size(); i++) { + CouponDto item = new CouponDto(); + BeanUtils.copyProperties(dataList.get(i), item); + item.setIsReceive(false); + item.setImage(baseImage + item.getImage()); + + // 是否领取,且领取量大于限制数 + List statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey(), UserCouponStatusEnum.USED.getKey(), UserCouponStatusEnum.EXPIRE.getKey()); + List userCoupon = mtUserCouponMapper.getUserCouponListByCouponId(userId, item.getId(), statusList); + if ((userCoupon.size() >= dataList.get(i).getLimitNum()) && (dataList.get(i).getLimitNum() > 0)) { + item.setIsReceive(true); + item.setUserCouponId(userCoupon.get(0).getId()); + } + + // 领取或预存数量 + CouponNumBean numData = mtUserCouponMapper.getPeopleNumByCouponId(item.getId()); + Long num; + if (null == numData) { + num = 0l; + } else { + num = numData.getNum(); + } + item.setGotNum(num.intValue()); + + // 剩余数量 + Integer leftNum = dataList.get(i).getTotal() - item.getGotNum(); + item.setLeftNum(leftNum >= 0 ? leftNum : 0); + + String sellingPoint = ""; + + // 优惠券卖点 + if (item.getType().equals(CouponTypeEnum.COUPON.getKey())) { + if (StringUtil.isNotEmpty(item.getOutRule()) && Integer.parseInt(item.getOutRule()) > 0) { + sellingPoint = "满" + item.getOutRule() + "元可用"; + } else { + sellingPoint = "无门槛券"; + } + } + + // 储值卡卖点 + if (item.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + if (StringUtil.isNotEmpty(item.getInRule())) { + String inRuleArr[] = item.getInRule().split(","); + if (inRuleArr.length > 0) { + for (int n = 0; n < inRuleArr.length; n++) { + String store[] = inRuleArr[n].split("_"); + sellingPoint = "预存" + store[0] + "到账" + store[1]; + } + } + } + } + + // 计次卡提示 + if (item.getType().equals(CouponTypeEnum.TIMER.getKey()) && StringUtil.isNotEmpty(item.getOutRule())) { + sellingPoint = "累计" + item.getOutRule() + "次卡"; + } + + item.setSellingPoint(sellingPoint); + content.add(item); + } + + PageRequest pageRequest = PageRequest.of(pageNumber, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, CouponDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(content); + + return new ResponseObject(200, "查询成功", paginationResponse); + } + + /** + * 根据分组ID获取卡券列表 + * + * @param groupId 查询参数 + * @return + * */ + public List queryCouponListByGroupId(Integer groupId) { + return mtCouponMapper.queryByGroupId(groupId.intValue()); + } + + /** + * 发放卡券 + * + * @param couponId 卡券ID + * @param userId 会员ID + * @param num 发放套数 + * @param sendMessage 是否发送消息 + * @param uuid 批次号 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "发放卡券") + public ResponseObject sendCoupon(Integer couponId, Integer userId, Integer num, Boolean sendMessage, String uuid, String operator) throws BusinessCheckException { + ResponseObject response = new ResponseObject(200, "发放成功", null); + if (StringUtil.isEmpty(uuid)) { + uuid = SeqUtil.getUUID(); + } + MtCoupon couponInfo = queryCouponById(couponId); + MtUser userInfo = memberService.queryMemberById(userId); + + if (null == userInfo || !userInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + response.setMessage("该会员不存在或已禁用,请先注册会员"); + response.setCode(201); + return response; + } + + String mobile = StringUtil.isNotEmpty(userInfo.getMobile()) ? userInfo.getMobile() : ""; + + // 判断券是否有效 + if (!couponInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + response.setMessage("卡券“"+couponInfo.getName()+"”已停用,不能发放"); + response.setCode(201); + return response; + } + + // 判断是否过期 + Date now = new Date(); + if (couponInfo.getEndTime() != null && couponInfo.getEndTime().before(now)) { + response.setMessage("卡券“"+ couponInfo.getName() +"”已过期,不能发放"); + response.setCode(201); + return response; + } + + // 是否超过拥有数量 + if (couponInfo.getLimitNum() != null && couponInfo.getLimitNum() > 0) { + if (num > couponInfo.getLimitNum()) { + response.setMessage("该卡券每个会员最多拥有数量是" + couponInfo.getLimitNum()); + response.setCode(201); + return response; + } + } + + // 发放总数量是否已经超额 + if (couponInfo.getTotal() != null && couponInfo.getTotal() > 0) { + Long sendNum = mtUserCouponMapper.getSendNum(couponId); + Long total = Long.parseLong(couponInfo.getTotal().toString()); + if (sendNum.compareTo(total) >= 0) { + response.setMessage("该卡券发行总数量是" + couponInfo.getTotal() + ",现已超额!"); + response.setCode(201); + return response; + } + } + + // 发放的是储值卡 + if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + if (StringUtil.isNotEmpty(couponInfo.getInRule())) { + String storeParams = ""; + String[] paramArr = couponInfo.getInRule().split(","); + for (int i = 0; i < paramArr.length; i++) { + if (StringUtil.isNotEmpty(storeParams)) { + storeParams = storeParams + "," + paramArr[i] + "_" + num; + } else { + storeParams = paramArr[i] + "_" + num; + } + } + Map param = new HashMap<>(); + param.put("couponId", couponInfo.getId()); + param.put("userId", userInfo.getId()); + param.put("param", storeParams); + param.put("orderId", 0); + userCouponService.preStore(param); + } + return response; + } + + // 优惠券或计次卡,发放num套 + for (int k = 1; k <= num; k++) { + for (int j = 1; j <= couponInfo.getSendNum(); j++) { + MtUserCoupon userCoupon = new MtUserCoupon(); + userCoupon.setCouponId(couponInfo.getId()); + userCoupon.setType(couponInfo.getType()); + userCoupon.setImage(couponInfo.getImage()); + userCoupon.setMerchantId(couponInfo.getMerchantId()); + userCoupon.setStoreId(userInfo.getStoreId()); + userCoupon.setAmount(couponInfo.getAmount()); + userCoupon.setBalance(couponInfo.getAmount()); + userCoupon.setOperator(operator); + userCoupon.setGroupId(couponInfo.getGroupId()); + userCoupon.setMobile(mobile); + userCoupon.setUserId(userInfo.getId()); + userCoupon.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + userCoupon.setCreateTime(new Date()); + userCoupon.setUpdateTime(new Date()); + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) { + userCoupon.setExpireTime(couponInfo.getEndTime()); + } + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + Date expireTime = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(expireTime); + c.add(Calendar.DATE, couponInfo.getExpireTime()); + expireTime = c.getTime(); + userCoupon.setExpireTime(expireTime); + } + // 12位随机数 + userCoupon.setCode(SeqUtil.getRandomNumber(12)); + userCoupon.setUuid(uuid); + mtUserCouponMapper.insert(userCoupon); + } + } + + // 发放记录 + MtCouponGroup mtCouponGroup = couponGroupService.queryCouponGroupById(couponInfo.getGroupId()); + ReqSendLogDto sendLogDto = new ReqSendLogDto(); + sendLogDto.setMerchantId(couponInfo.getMerchantId()); + sendLogDto.setType(1); + sendLogDto.setMobile(mobile); + sendLogDto.setUserId(userInfo.getId()); + sendLogDto.setFileName(""); + sendLogDto.setGroupId(couponInfo.getGroupId()); + sendLogDto.setGroupName(mtCouponGroup.getName()); + sendLogDto.setCouponId(couponInfo.getId()); + sendLogDto.setSendNum(num); + sendLogDto.setOperator(operator); + sendLogDto.setUuid(uuid); + sendLogDto.setMerchantId(couponInfo.getMerchantId()); + sendLogDto.setStoreId(couponInfo.getStoreId()); + sendLogService.addSendLog(sendLogDto); + + if (sendMessage && couponInfo.getAmount() != null && couponInfo.getAmount().compareTo(new BigDecimal("0")) > 0) { + try { + // 发送手机短信 + if (StringUtil.isNotEmpty(mobile)) { + List mobileList = new ArrayList<>(); + mobileList.add(mobile); + BigDecimal totalMoney = (couponInfo.getAmount() == null) ? (new BigDecimal("0.00")) : couponInfo.getAmount(); + Map params = new HashMap<>(); + params.put("totalNum", num.toString()); + params.put("totalMoney", totalMoney.toString()); + sendSmsService.sendSms(couponInfo.getMerchantId(), "received-coupon", mobileList, params); + } + // 发送小程序订阅消息 + if (userInfo != null && couponInfo != null && couponInfo.getAmount().compareTo(new BigDecimal("0")) > 0) { + Date nowTime = new Date(); + Date sendTime = new Date(nowTime.getTime()); + Map params = new HashMap<>(); + params.put("name", couponInfo.getName()); + params.put("amount", couponInfo.getAmount()); + params.put("tips", "您的卡券已到账,请查收~"); + weixinService.sendSubscribeMessage(userInfo.getMerchantId(), userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.COUPON_ARRIVAL.getKey(), "pages/user/index", params, sendTime); + } + } catch (Exception e) { + logger.error("卡券发放消息发送失败:{}", e.getMessage()); + } + } + return response; + } + + /** + * 发放卡券 + * + * @param couponId 券ID + * @param userIds 会员ID + * @param num 发放套数 + * @param uuid 批次号 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "发放卡券") + public Boolean batchSendCoupon(Integer couponId, List userIds, Integer num, String uuid, String operator) throws BusinessCheckException { + if (userIds == null || userIds.size() < 1) { + throw new BusinessCheckException("发放对象异常,卡券发放失败"); + } + // 发放人数大于10就不发送消息了 + Boolean sendMsg = userIds.size() >= 10 ? false : true; + if (userIds != null && userIds.size() > 0) { + for (Integer userId : userIds) { + ResponseObject result = sendCoupon(couponId, userId, num, sendMsg, uuid, operator); + if (result.getCode() != 200) { + throw new BusinessCheckException("发放卡券失败:" + result.getMessage()); + } + } + } + return true; + } + + /** + * 核销卡券 + * + * @param userCouponId 用户卡券ID + * @param userId 员工会员ID + * @param storeId 店铺ID + * @param orderId 订单ID + * @param amount 核销金额 + * @param remark 核销备注 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "核销卡券") + public String useCoupon(Integer userCouponId, Integer userId, Integer storeId, Integer orderId, BigDecimal amount, String remark) throws BusinessCheckException { + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(userCouponId.intValue()); + MtOrder orderInfo = null; + if (orderId != null && orderId > 0) { + orderInfo = mtOrderMapper.selectById(orderId); + } + + if (userCoupon == null) { + throw new BusinessCheckException("该卡券不存在!"); + } else if (!userCoupon.getStatus().equals(UserCouponStatusEnum.UNUSED.getKey()) && !userCoupon.getStatus().equals(UserCouponStatusEnum.UNSEND.getKey())) { + throw new BusinessCheckException("该卡券状态有误,可能已使用或已过期!"); + } + + MtStore mtStore = null; + if (storeId != null && storeId > 0) { + mtStore = mtStoreMapper.selectById(storeId); + if (null == mtStore) { + throw new BusinessCheckException("该店铺不存在!"); + } else if (!mtStore.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("该店铺状态有误,可能已禁用"); + } + } + + // 判断有效期 + MtCoupon couponInfo = queryCouponById(userCoupon.getCouponId()); + Date begin = couponInfo.getBeginTime(); + Date end = couponInfo.getEndTime(); + // 领取后有效天数 + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + begin = userCoupon.getCreateTime(); + end = userCoupon.getExpireTime(); + } + Date now = new Date(); + if (now.before(begin)) { + throw new BusinessCheckException("该卡券还没到使用日期"); + } + if (end.before(now)) { + throw new BusinessCheckException("该卡券已过期"); + } + + // 是否在例外日期 + Calendar cal = Calendar.getInstance(); + Boolean isWeekend = false; + if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { + isWeekend = true; + } + + String exceptTime = couponInfo.getExceptTime(); + if (null != exceptTime && !exceptTime.equals("")) { + String[] exceptTimeList = exceptTime.split(","); + if (exceptTimeList.length > 0) { + for (String timeStr : exceptTimeList) { + if (timeStr.equals("weekend")) { + if (isWeekend) { + throw new BusinessCheckException("该卡券在当前日期不可用"); + } + } else { + String[] timeItem = exceptTime.split("_"); + if (timeItem.length == 2) { + try { + Date startTime = DateUtil.parseDate(timeItem[0], "yyyy-MM-dd HH:mm"); + Date endTime = DateUtil.parseDate(timeItem[1], "yyyy-MM-dd HH:mm"); + if (now.before(endTime) && now.after(startTime)) { + throw new BusinessCheckException("该卡券在当前日期不可用"); + } + } catch (ParseException pe) { + throw new BusinessCheckException("该卡券在当前日期不可用."); + } + } + } + } + } + } + + // 使用优惠券,判断满多少可用 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey()) && StringUtil.isNotEmpty(couponInfo.getOutRule())) { + if (orderInfo != null) { + if (orderInfo.getAmount().compareTo(new BigDecimal(couponInfo.getOutRule())) < 0) { + throw new BusinessCheckException("该卡券满"+ couponInfo.getOutRule() +"元才能使用"); + } + } + } + + // 判断可用店铺 + if (StringUtil.isNotEmpty(couponInfo.getStoreIds())) { + if (StringUtil.isNotEmpty(couponInfo.getStoreIds())) { + String[] storeIds = couponInfo.getStoreIds().split(","); + String useStoreId = (orderInfo != null) ? orderInfo.getStoreId().toString() : (storeId > 0 ? storeId.toString() : ""); + if (StringUtil.isNotEmpty(useStoreId) && storeIds.length > 0 && !Arrays.asList(storeIds).contains(useStoreId)) { + throw new BusinessCheckException("该卡券不能在当前门店使用"); + } + } + } + + // 判断适用会员等级 + if (userCoupon.getUserId() != null && userCoupon.getUserId() > 0 && StringUtil.isNotEmpty(couponInfo.getGradeIds())) { + MtUser mtUser = memberService.queryMemberById(userCoupon.getUserId()); + if (mtUser.getGradeId() == null) { + MtUserGrade defaultGrade = userGradeService.getInitUserGrade(mtUser.getMerchantId()); + if (defaultGrade != null) { + mtUser.setGradeId(defaultGrade.getId()); + } else { + mtUser.setGradeId(0); + } + } + String[] gradeIds = couponInfo.getGradeIds().split(","); + if (gradeIds.length > 0 && !Arrays.asList(gradeIds).contains(mtUser.getGradeId().toString())) { + throw new BusinessCheckException("该卡券不适用于该会员等级"); + } + } + + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + // 优惠券核销直接修改状态 + userCoupon.setStatus(UserCouponStatusEnum.USED.getKey()); + } else if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + // 储值卡核销,修改余额 + BigDecimal balance = userCoupon.getBalance(); + BigDecimal newBalance = balance.subtract(amount); + + if (newBalance.compareTo(new BigDecimal("0")) == -1) { + throw new BusinessCheckException("余额不足,无法核销"); + } + + if (newBalance.compareTo(new BigDecimal("0")) == 0) { + userCoupon.setStatus(UserCouponStatusEnum.USED.getKey()); + } + + userCoupon.setBalance(newBalance); + } else if (couponInfo.getType().equals(CouponTypeEnum.TIMER.getKey())) { + // 计次卡核销,增加核销次数至满 + Long confirmCount = confirmLogService.getConfirmNum(userCouponId); + if ((confirmCount.intValue() + 1) >= Integer.parseInt(couponInfo.getOutRule())) { + userCoupon.setStatus(UserCouponStatusEnum.USED.getKey()); + } + } + + userCoupon.setUpdateTime(new Date()); + userCoupon.setUsedTime(new Date()); + if (storeId != null && storeId > 0) { + userCoupon.setStoreId(storeId); + } + mtUserCouponMapper.updateById(userCoupon); + + // 生成核销流水 + MtConfirmLog confirmLog = new MtConfirmLog(); + confirmLog.setMerchantId(couponInfo.getMerchantId()); + StringBuilder code = new StringBuilder(); + String sStoreId="00000"+storeId.toString(); + code.append(new SimpleDateFormat("yyMMddHHmmss").format(new Date())); + code.append(sStoreId.substring(sStoreId.length()-4)); + code.append(SeqUtil.getRandomNumber(6)); + confirmLog.setCode(code.toString()); + confirmLog.setCouponId(couponInfo.getId()); + confirmLog.setUserCouponId(userCouponId.intValue()); + confirmLog.setOrderId(orderId); + confirmLog.setCreateTime(new Date()); + confirmLog.setUpdateTime(new Date()); + confirmLog.setUserId(userCoupon.getUserId()); + confirmLog.setOperatorUserId(userId); + MtUser userInfo = null; + if (userId > 0) { + userInfo = memberService.queryMemberById(userId); + if (userInfo != null) { + confirmLog.setOperator(userInfo.getName()); + } + } + confirmLog.setStoreId(storeId); + confirmLog.setStatus(StatusEnum.ENABLED.getKey()); + + // 优惠券核销金额 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + amount = userCoupon.getAmount(); + } + + confirmLog.setAmount(amount); + confirmLog.setRemark(remark); + mtConfirmLogMapper.insert(confirmLog); + + try { + // 发送核销短信 + List mobileList = new ArrayList<>(); + mobileList.add(userCoupon.getMobile()); + Map params = new HashMap<>(); + params.put("couponName", couponInfo.getName()); + if (mtStore != null){ + params.put("storeName", mtStore.getName()); + } + params.put("sn", code.toString()); + sendSmsService.sendSms(couponInfo.getMerchantId(), "confirm-coupon", mobileList, params); + + // 发送小程序订阅消息 + Date nowTime = new Date(); + Date sendTime = new Date(nowTime.getTime()); + Map param = new HashMap<>(); + String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm"); + param.put("name", couponInfo.getName()); + param.put("time", dateTime); + weixinService.sendSubscribeMessage(userInfo.getMerchantId(), userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.COUPON_CONFIRM.getKey(), "pages/user/index", param, sendTime); + } catch (Exception e) { + logger.error("核销卡券发送通知消息出错:", e.getMessage()); + } + + return confirmLog.getCode(); + } + + /** + * 根据券ID删除会员卡券 + * + * @param id 券ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除会员卡券") + public void deleteUserCoupon(Integer id, String operator) throws BusinessCheckException { + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(id); + if (null == userCoupon) { + return; + } + + // 未使用状态才能作废删除 + if(!userCoupon.getStatus().equals(UserCouponStatusEnum.UNUSED.getKey())) { + throw new BusinessCheckException("未使用状态的卡券才能作废"); + } + userCoupon.setStatus(UserCouponStatusEnum.DISABLE.getKey()); + + // 修改时间 + userCoupon.setUpdateTime(new Date()); + + // 操作人 + userCoupon.setOperator(operator); + + // 更新发券日志为部分作废状态 + mtSendLogMapper.updateSingleForRemove(userCoupon.getUuid(),UserCouponStatusEnum.USED.getKey()); + + mtUserCouponMapper.updateById(userCoupon); + } + + /** + * 根据券ID 撤销卡券核销 + * + * @param id 核销流水ID + * @param userCouponId 用户卡券ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "撤销卡券核销") + public void rollbackUserCoupon(Integer id, Integer userCouponId,String operator) throws BusinessCheckException { + MtConfirmLog mtConfirmLog = mtConfirmLogMapper.selectById(id); + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(userCouponId); + + if (null == mtConfirmLog || !mtConfirmLog.getUserCouponId().equals(userCouponId)) { + throw new BusinessCheckException("卡券核销流水不存在!"); + } + + if (null == userCoupon) { + throw new BusinessCheckException("用户卡券不存在"); + } + + // 卡券未过期才能撤销,当前时间小于过期日期才能删除,48小时 + Calendar endTimecal = Calendar.getInstance(); + endTimecal.setTime(mtConfirmLog.getCreateTime()); + endTimecal.add(Calendar.DAY_OF_MONTH, 2); + + if (endTimecal.getTime().before(new Date())) { + throw new BusinessCheckException("卡券核销已经超过48小时,无法撤销"); + } + + MtCoupon mtCoupon = mtCouponMapper.selectById(userCoupon.getCouponId()); + + // 卡券未过期才能撤销,当前时间小于过期日期才能删除 + if (mtCoupon.getEndTime().before(new Date())) { + throw new BusinessCheckException("卡券未过期才能撤销"); + } + + // 优惠券只有是使用状态且核销流水正常状态才能撤销 + if(userCoupon.getType().equals(CouponTypeEnum.COUPON.getKey())) { + if ((!userCoupon.getStatus().equals(UserCouponStatusEnum.USED.getKey())) || (!mtConfirmLog.getStatus().equals(StatusEnum.ENABLED.getKey()))) { + throw new BusinessCheckException("该劵状态异常,请稍后重试"); + } + } + + // 回退至可用状态 + userCoupon.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + userCoupon.setStoreId(null); + userCoupon.setUsedTime(null); + userCoupon.setUpdateTime(new Date()); + + // 如果是储值卡则返回余额 + if (userCoupon.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + BigDecimal balance = userCoupon.getBalance(); + BigDecimal amount = mtConfirmLog.getAmount(); + if (amount.compareTo(new BigDecimal("0")) > 0) { + BigDecimal newBalance = balance.add(amount); + userCoupon.setBalance(newBalance); + } + } + + // 更新用户卡券 + mtUserCouponMapper.updateById(userCoupon); + + // 更新流水 + mtConfirmLog.setOperator(operator); + mtConfirmLog.setStatus(StatusEnum.DISABLE.getKey()); + mtConfirmLog.setUpdateTime(new Date()); + mtConfirmLog.setCancelTime(new Date()); + + mtConfirmLogMapper.updateById(mtConfirmLog); + } + + /** + * 根据ID获取用户卡券信息 + * @param userCouponId 查询参数 + * @throws BusinessCheckException + * @return + * */ + @Override + public MtUserCoupon queryUserCouponById(Integer userCouponId) { + return mtUserCouponMapper.selectById(userCouponId); + } + + /** + * 根据批次撤销卡券 + * + * @param uuid 批次ID + * @param operator 操作人 + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "根据批次撤销卡券") + public void removeUserCoupon(Long id, String uuid, String operator) { + Map searchParams = new HashMap<>(); + searchParams.put("uuid", uuid); + List paginationResponse = mtUserCouponMapper.selectByMap(searchParams); + + Integer total = paginationResponse.size(); + + List coupondIdList = mtUserCouponMapper.getCouponIdsByUuid(uuid); + List couponIds = new ArrayList<>(); + couponIds.add(0); + + Date nowDate = new Date(); + + for (int i = 0; i < coupondIdList.size(); i++) { + Integer couponId = coupondIdList.get(i); + MtCoupon couponInfo = queryCouponById(couponId); + if (couponInfo.getStatus().equals(StatusEnum.ENABLED.getKey()) && couponInfo.getEndTime().after(nowDate)) { + couponIds.add(couponId); + } + } + + Integer row = mtUserCouponMapper.removeUserCoupon(uuid, couponIds, operator); + if (row.compareTo( total.intValue()) != -1) { + mtSendLogMapper.updateForRemove(uuid, UserCouponStatusEnum.DISABLE.getKey(), total.intValue(), 0); + } else { + mtSendLogMapper.updateForRemove(uuid, UserCouponStatusEnum.USED.getKey(), row, (total.intValue()-row)); + } + } + + /** + * 判断卡券码是否过期 + * @param code 12位券码 + * @return + * */ + @Override + public boolean codeExpired(String code) { + if (StringUtil.isEmpty(code)) { + return true; + } + try { + Date dateTime = DateUtil.parseDate(code.substring(0, 14), "yyyyMMddHHmmss"); + + Long time = dateTime.getTime(); + Long nowTime = System.currentTimeMillis(); + + Long seconds = (nowTime - time) / 1000; + // 超过1小时 + if (seconds > 3600) { + return true; + } + } catch (Exception e) { + return true; + } + + return false; + } + + /** + * 判断卡券是否过期 + * + * @param coupon 卡券信息 + * @param userCoupon 会员卡券信息 + * @return + * */ + @Override + public boolean isCouponEffective(MtCoupon coupon, MtUserCoupon userCoupon) { + Date begin = coupon.getBeginTime(); + Date end = coupon.getEndTime(); + + if (coupon.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + begin = userCoupon.getCreateTime(); + end = userCoupon.getExpireTime(); + } + + Date now = new Date(); + + // 未生效 + if (begin != null) { + if (now.before(begin)) { + return false; + } + } + + // 已过期 + if (end != null) { + if (now.after(end)) { + return false; + } + } + + if (coupon.getStatus() == null) { + return false; + } + + // 状态异常 + if (!coupon.getStatus().equals(StatusEnum.ENABLED.getKey())) { + return false; + } + + return true; + } + + /** + * 删除我的卡券 + * + * @param userCouponId + * @param userId + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeCoupon(Integer userCouponId, Integer userId) throws BusinessCheckException { + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(userCouponId); + if (null == userCoupon) { + throw new BusinessCheckException("删除失败:该卡券不存在!"); + } + if (!userId.equals(userCoupon.getUserId())) { + throw new BusinessCheckException("删除失败:无操作权限!"); + } + userCoupon.setStatus(UserCouponStatusEnum.DISABLE.getKey()); + userCoupon.setUpdateTime(new Date()); + mtUserCouponMapper.updateById(userCoupon); + logger.info("删除卡券成功!"); + + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/DutyServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/DutyServiceImpl.java new file mode 100644 index 0000000..c3f122b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/DutyServiceImpl.java @@ -0,0 +1,305 @@ +package com.fuint.common.service.impl; + +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.fuint.common.enums.StatusEnum; +import com.fuint.common.service.DutyService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.common.domain.TreeNode; +import com.fuint.framework.exception.BusinessRuntimeException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.DutyStatusRequest; +import com.fuint.repository.mapper.TDutyMapper; +import com.fuint.repository.mapper.TDutySourceMapper; +import com.fuint.repository.model.TDuty; +import com.fuint.repository.model.TDutySource; +import com.fuint.repository.model.TSource; +import com.fuint.utils.ArrayUtil; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; + +/** + * 角色服务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class DutyServiceImpl extends ServiceImpl implements DutyService { + + private TDutyMapper tDutyMapper; + + private TDutySourceMapper tDutySourceMapper; + + /** + * 获取有效的角色集合 + * + * @param merchantId 商户ID + * @param accountId 账号ID + * @return + */ + @Override + public List getAvailableRoles(Integer merchantId, Integer accountId) { + List result = tDutyMapper.findByStatus(merchantId, StatusEnum.ENABLED.getKey()); + List ids = new ArrayList<>(); + if (result != null && result.size() > 0) { + for (TDuty tDuty : result) { + ids.add(tDuty.getDutyId().longValue()); + } + } + List roleIds = findDutiesByAccountId(accountId); + if (roleIds.size() > 0) { + for (Long roleId : roleIds) { + if (!ids.contains(roleId)) { + TDuty duty = getRoleById(roleId); + result.add(duty); + } + } + } + return result; + } + + /** + * 根据ID获取角色实体 + * + * @param roleId 角色ID + * @return + */ + @Override + public TDuty getRoleById(Long roleId) { + return tDutyMapper.selectById(roleId); + } + + /** + * 根据ID数组获取角色集合 + * + * @param ids 角色ID + * @return + */ + @Override + public List findDatasByIds(String[] ids) { + Long[] arrays = new Long[ids.length]; + for (int i = 0; i < ids.length; i++) { + arrays[i] = Long.parseLong(ids[i]); + } + return tDutyMapper.findByIdIn(ArrayUtil.toList(arrays)); + } + + /** + * 删除角色 + * + * @param dutyId 角色ID + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除后台角色") + public void deleteDuty(Integer merchantId, long dutyId) { + TDuty tDuty = getRoleById(dutyId); + if (!merchantId.equals(tDuty.getMerchantId()) && merchantId > 0) { + throw new BusinessRuntimeException("抱歉,您没有删除的权限"); + } + tDutySourceMapper.deleteSourcesByDutyId((int) dutyId); + tDutyMapper.deleteById(dutyId); + } + + /** + * 更新角色状态 + * + * @param merchantId 商户ID + * @param dutyStatusRequest 请求参数 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新后台角色状态") + public void updateStatus(Integer merchantId, DutyStatusRequest dutyStatusRequest) throws BusinessCheckException { + TDuty tDuty = tDutyMapper.selectById(dutyStatusRequest.getRoleId()); + + if (!merchantId.equals(tDuty.getMerchantId()) && merchantId > 0) { + throw new BusinessRuntimeException("抱歉,您没有操作的权限"); + } + + if (tDuty != null) { + tDuty.setStatus(dutyStatusRequest.getStatus()); + tDutyMapper.updateById(tDuty); + } else { + throw new BusinessCheckException("角色不存在."); + } + } + + /** + * 修改角色 + * + * @param tduty 角色信息 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新后台角色") + public void updateDuty(TDuty tduty, List sources) throws BusinessCheckException { + TDuty existsDuty = tDutyMapper.selectById(tduty.getDutyId()); + if (existsDuty == null) { + throw new BusinessCheckException("角色不存在."); + } + if (!StringUtil.equals(tduty.getDutyName(), existsDuty.getDutyName())) { + TDuty tDuty = findByName(existsDuty.getMerchantId(), tduty.getDutyName()); + if (tDuty != null) { + throw new BusinessCheckException("角色名已存在."); + } + } + + existsDuty.setDescription(tduty.getDescription()); + existsDuty.setDutyType(tduty.getDutyType()); + existsDuty.setDutyName(tduty.getDutyName()); + existsDuty.setStatus(tduty.getStatus()); + + if (sources != null && sources.size() > 0) { + tDutySourceMapper.deleteSourcesByDutyId(tduty.getDutyId()); + for (TSource tSource : sources) { + TDutySource dutySource = new TDutySource(); + dutySource.setDutyId(tduty.getDutyId()); + dutySource.setSourceId(tSource.getSourceId()); + tDutySourceMapper.insert(dutySource); + } + } + + tDutyMapper.updateById(existsDuty); + } + + /** + * 根据角色名称合状态查询角色 + * + * @param merchantId 商户ID + * @param name 角色名称 + * @return + */ + @Override + public TDuty findByName(Integer merchantId, String name) { + return this.tDutyMapper.findByName(merchantId, name); + } + + /** + * 根据角色名称获取已经分配的菜单ID集合 + * + * @param dutyId 角色ID + * @return + */ + @Override + public List getSourceIdsByDutyId(Integer dutyId) { + return tDutySourceMapper.findSourceIdsByDutyId(dutyId); + } + + /** + * 角色保存方法 + * + * @param duty 角色信息 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增后台角色") + public void saveDuty(TDuty duty, List sources) throws BusinessCheckException { + TDuty existsDuty = tDutyMapper.findByName(duty.getMerchantId(), duty.getDutyName()); + if (existsDuty != null) { + throw new BusinessCheckException("角色名称已经存在."); + } + this.tDutyMapper.insert(duty); + if (sources != null && sources.size() > 0) { + for (TSource tSource : sources) { + TDutySource dutySource = new TDutySource(); + dutySource.setDutyId(duty.getDutyId()); + dutySource.setSourceId(tSource.getSourceId()); + tDutySourceMapper.insert(dutySource); + } + } + } + + /** + * 分页查询后台角色 + * @param paginationRequest + * @return + * */ + @Override + public PaginationResponse findDutiesByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(TDuty::getStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(TDuty::getDutyName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(TDuty::getStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.and(wq -> wq + .eq(TDuty::getMerchantId, 0) + .or() + .eq(TDuty::getMerchantId, merchantId)); + } + + lambdaQueryWrapper.orderByDesc(TDuty::getDutyId); + List dataList = tDutyMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, TDuty.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 获取菜单的属性结构 + * + * @param merchantId 商户ID + * @return + */ + @Override + public List getDutyTree(Integer merchantId) { + List tDuties = getAvailableRoles(merchantId, 0); + List trees = new ArrayList(); + if (tDuties != null && tDuties.size() > 0) { + TreeNode sourceTreeNode; + for (TDuty tDuty : tDuties) { + sourceTreeNode = new TreeNode(); + sourceTreeNode.setName(tDuty.getDutyName()); + sourceTreeNode.setId(tDuty.getDutyId()); + sourceTreeNode.setLevel(1); + sourceTreeNode.setPId(0); + trees.add(sourceTreeNode); + } + } + return trees; + } + + /** + * 根据账户获取角色 + * + * @param accountId 账号ID + * @return + */ + @Override + public List findDutiesByAccountId(Integer accountId) { + return tDutyMapper.getRoleIdsByAccountId(accountId); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/GenCodeServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/GenCodeServiceImpl.java new file mode 100644 index 0000000..9dd043a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/GenCodeServiceImpl.java @@ -0,0 +1,186 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.GenCodeService; +import com.fuint.common.util.VelocityInitializer; +import com.fuint.common.util.VelocityUtils; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.exception.BusinessRuntimeException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.bean.ColumnBean; +import com.fuint.repository.mapper.TGenCodeMapper; +import com.fuint.repository.model.TGenCode; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.io.FileUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.Date; +import java.util.List; + +/** + * 代码生成服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class GenCodeServiceImpl implements GenCodeService { + + private static final Logger logger = LoggerFactory.getLogger(GenCodeServiceImpl.class); + + private TGenCodeMapper tGenCodeMapper; + + /** + * 分页查询生成代码列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryGenCodeListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(TGenCode::getStatus, StatusEnum.DISABLE.getKey()); + + String tableName = paginationRequest.getSearchParams().get("tableName") == null ? "" : paginationRequest.getSearchParams().get("tableName").toString(); + if (org.apache.commons.lang.StringUtils.isNotBlank(tableName)) { + lambdaQueryWrapper.like(TGenCode::getTableName, tableName); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (org.apache.commons.lang.StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(TGenCode::getStatus, status); + } + + lambdaQueryWrapper.orderByAsc(TGenCode::getId); + List dataList = tGenCodeMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, TGenCode.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加生成代码 + * + * @param tGenCode 生成代码 + * @return + */ + @Override + @OperationServiceLog(description = "新增生成代码") + public TGenCode addGenCode(TGenCode tGenCode) throws BusinessCheckException { + tGenCode.setStatus(StatusEnum.ENABLED.getKey()); + Date dateTime = new Date(); + tGenCode.setCreateTime(dateTime); + tGenCode.setUpdateTime(dateTime); + Integer id = tGenCodeMapper.insert(tGenCode); + if (id > 0) { + return tGenCode; + } else { + logger.error("新增生成代码失败."); + throw new BusinessCheckException("新增生成代码失败."); + } + } + + /** + * 根据ID获取生成代码 + * + * @param id 生成代码ID + */ + @Override + public TGenCode queryGenCodeById(Integer id) { + return tGenCodeMapper.selectById(id); + } + + /** + * 修改生成代码 + * + * @param tGenCode + * @throws BusinessCheckException + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改生成代码") + public TGenCode updateGenCode(TGenCode tGenCode) { + Date dateTime = new Date(); + tGenCode.setUpdateTime(dateTime); + tGenCodeMapper.updateById(tGenCode); + return tGenCode; + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return + */ + @Override + public void generatorCode(String tableName) throws BusinessRuntimeException { + // 查询表信息 + TGenCode table = tGenCodeMapper.findGenCodeByTableName(tableName); + if (table == null) { + throw new BusinessRuntimeException("渲染模板失败,该表不存在."); + } + + List columns = tGenCodeMapper.getTableColumnList(table.getTablePrefix() + table.getTableName()); + + VelocityInitializer.initVelocity(); + VelocityContext context = VelocityUtils.prepareContext(table, columns); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, "UTF-8"); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + logger.info("path ====== {}", path); + FileUtils.writeStringToFile(new File(path), sw.toString(), "UTF-8"); + } catch (IOException e) { + throw new BusinessRuntimeException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(TGenCode table, String template) { + String genPath = table.getBackendPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/GiveServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/GiveServiceImpl.java new file mode 100644 index 0000000..9635cbc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/GiveServiceImpl.java @@ -0,0 +1,332 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.GiveDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.GiveParam; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.MtGiveItemMapper; +import com.fuint.repository.mapper.MtGiveMapper; +import com.fuint.repository.mapper.MtUserCouponMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.*; + +/** + * 转赠业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class GiveServiceImpl extends ServiceImpl implements GiveService { + + private static final Logger logger = LoggerFactory.getLogger(GiveServiceImpl.class); + + private MtGiveMapper mtGiveMapper; + + private MtUserCouponMapper mtUserCouponMapper; + + private MtGiveItemMapper mtGiveItemMapper; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 会员等级服务接口 + * */ + private UserGradeService userGradeService; + + /** + * 短信发送服务接口 + * */ + private SendSmsService sendSmsService; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 卡券分组服务接口 + * */ + private CouponGroupService couponGroupService; + + /** + * 分页查询转赠列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryGiveListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtGive::getStatus, StatusEnum.DISABLE.getKey()); + + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtGive::getStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtGive::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtGive::getStoreId, storeId); + } + String userId = paginationRequest.getSearchParams().get("userId") == null ? "" : paginationRequest.getSearchParams().get("userId").toString(); + if (StringUtils.isNotBlank(userId)) { + lambdaQueryWrapper.eq(MtGive::getUserId, userId); + } + String giveUserId = paginationRequest.getSearchParams().get("giveUserId") == null ? "" : paginationRequest.getSearchParams().get("giveUserId").toString(); + if (StringUtils.isNotBlank(giveUserId)) { + lambdaQueryWrapper.eq(MtGive::getGiveUserId, giveUserId); + } + String couponId = paginationRequest.getSearchParams().get("couponId") == null ? "" : paginationRequest.getSearchParams().get("couponId").toString(); + if (StringUtils.isNotBlank(couponId)) { + lambdaQueryWrapper.eq(MtGive::getCouponIds, couponId); + } + String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtGive::getMobile, mobile); + } + String userMobile = paginationRequest.getSearchParams().get("userMobile") == null ? "" : paginationRequest.getSearchParams().get("userMobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtGive::getUserMobile, userMobile); + } + + lambdaQueryWrapper.orderByDesc(MtGive::getId); + List giveList = mtGiveMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + for (MtGive mtGive : giveList) { + GiveDto giveDto = new GiveDto(); + BeanUtils.copyProperties(mtGive, giveDto); + giveDto.setCreateTime(DateUtil.formatDate(mtGive.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + giveDto.setUpdateTime(DateUtil.formatDate(mtGive.getUpdateTime(), "yyyy-MM-dd HH:mm:ss")); + giveDto.setMobile(CommonUtil.hidePhone(giveDto.getMobile())); + giveDto.setUserMobile(CommonUtil.hidePhone(giveDto.getUserMobile())); + dataList.add(giveDto); + } + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, GiveDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 卡券转赠 + * + * @param giveParam + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject addGive(GiveParam giveParam) throws BusinessCheckException { + MtGive give = new MtGive(); + + String mobile = giveParam.getMobile() == null ? "" : giveParam.getMobile(); + String couponId = giveParam.getCouponId() == null ? "" : giveParam.getCouponId(); + String note = giveParam.getNote() == null ? "" : giveParam.getNote(); + String message = giveParam.getMessage() == null ? "" : giveParam.getMessage(); + Integer userId = giveParam.getUserId() == null ? 0 : giveParam.getUserId(); + Integer storeId = giveParam.getStoreId() == null ? 0 : giveParam.getStoreId(); + Integer merchantId = giveParam.getMerchantId() == null ? 0 : giveParam.getMerchantId(); + + if (StringUtil.isEmpty(mobile) || mobile.length() > 11 || mobile.length() < 11) { + throw new BusinessCheckException("转增对象手机号有误"); + } + + if (couponId == null) { + throw new BusinessCheckException("转增卡券不能为空"); + } + + String[] couponIds = couponId.split(","); + if (couponIds.length > 10) { + throw new BusinessCheckException("转增卡券数量不能超过10张"); + } + + // 如果赠予对象为空,则注册 + MtUser user = memberService.queryMemberByMobile(merchantId, mobile); + if (null == user) { + MtUser userInfo = new MtUser(); + userInfo.setMerchantId(merchantId); + userInfo.setName(mobile); + userInfo.setMobile(mobile); + MtUserGrade grade = userGradeService.getInitUserGrade(merchantId); + if (grade != null) { + userInfo.setGradeId(grade.getId()); + } + userInfo.setBalance(new BigDecimal(0)); + userInfo.setStatus(StatusEnum.ENABLED.getKey()); + user = memberService.addMember(userInfo, "0"); + } else { + if (!user.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("转增对象可能已被禁用"); + } + } + + if (null == user) { + throw new BusinessCheckException("创建转增对象用户信息失败"); + } + + if (user.getId() == userId) { + throw new BusinessCheckException("转增对象不能是自己"); + } + + BigDecimal money = new BigDecimal(0); + List couponIdList = new ArrayList<>(); + List couponNames = new ArrayList<>(); + List groupIds = new ArrayList<>(); + List groupNames = new ArrayList<>(); + + for (String id : couponIds) { + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(Integer.parseInt(id)); + MtCoupon coupon = couponService.queryCouponById(userCoupon.getCouponId()); + if (!couponIdList.contains(coupon.getId().toString())) { + couponIdList.add(coupon.getId().toString()); + } + if (!couponNames.contains(coupon.getName())) { + couponNames.add(coupon.getName()); + } + MtCouponGroup group = couponGroupService.queryCouponGroupById(coupon.getGroupId()); + if (!groupIds.contains(group.getId().toString())) { + groupIds.add(group.getId().toString()); + } + if (!groupNames.contains(group.getName())) { + groupNames.add(group.getName()); + } + money = money.add(userCoupon.getAmount()); + if (null == userCoupon) { + throw new BusinessCheckException("转增卡券不存在"); + } else { + if (!userCoupon.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("转增卡券必须是未使用状态"); + } + if (!userCoupon.getUserId().toString().equals(userId.toString())) { + throw new BusinessCheckException("您的券可能已经转赠出去了"); + } + } + } + + MtUser myUser = memberService.queryMemberById(userId); + + give.setMobile(mobile); + give.setGiveUserId(userId); + give.setUserId(user.getId()); + give.setMerchantId(merchantId); + give.setStoreId(storeId); + give.setMoney(money); + give.setNum(couponIds.length); + give.setNote(note); + give.setMessage(message); + give.setUserMobile(myUser.getMobile()); + String couponIdsStr = StringUtil.join(couponIdList.toArray(), ","); + give.setGroupIds(StringUtil.join(groupIds.toArray(), ",")); + give.setGroupNames(StringUtil.join(groupNames.toArray(), ",")); + give.setCouponIds(couponIdsStr); + give.setCouponNames(StringUtil.join(couponNames.toArray(), ",")); + give.setStatus(StatusEnum.ENABLED.getKey()); + Date createTime = new Date(); + give.setCreateTime(createTime); + give.setUpdateTime(createTime); + + // 防止网络延迟,检查是否重复 + List uniqueData = mtGiveMapper.queryForUnique(give.getUserId(), give.getGiveUserId(), couponIdsStr, createTime); + if (uniqueData != null) { + if (uniqueData.size() > 0) { + throw new BusinessCheckException("当前网络延迟,不可重复操作"); + } + } + + this.save(give); + MtGive giveInfo = mtGiveMapper.selectById(give.getId()); + + for (String id : couponIds) { + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(Integer.parseInt(id)); + userCoupon.setUserId(user.getId()); + userCoupon.setUpdateTime(new Date()); + userCoupon.setMobile(user.getMobile()); + mtUserCouponMapper.updateById(userCoupon); + + MtGiveItem item = new MtGiveItem(); + item.setCreateTime(new Date()); + item.setGiveId(giveInfo.getId()); + item.setStatus(StatusEnum.ENABLED.getKey()); + item.setUpdateTime(new Date()); + item.setUserCouponId(Integer.parseInt(id)); + + mtGiveItemMapper.insert(item); + } + + try { + List mobileList = new ArrayList<>(); + mobileList.add(mobile); + Map params = new HashMap<>(); + params.put("totalNum", couponIds.length+""); + params.put("totalMoney", money+""); + sendSmsService.sendSms(merchantId, "received-coupon", mobileList, params); + } catch (Exception e) { + logger.error("核销卡券发送通知消息出错:", e.getMessage()); + } + + return new ResponseObject(200, "", giveInfo); + } + + /** + * 根据ID获取转赠信息 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtGive queryGiveById(Long id) { + return mtGiveMapper.selectById(id.intValue()); + } + + /** + * 根据条件搜索转赠详情 + * + * @param params 转赠查询条件 + * @return + * */ + @Override + public List queryItemByParams(Map params) { + if (params == null) { + params = new HashMap<>(); + } + return mtGiveItemMapper.selectByMap(params); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/GoodsServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/GoodsServiceImpl.java new file mode 100644 index 0000000..1a247e6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/GoodsServiceImpl.java @@ -0,0 +1,1074 @@ +package com.fuint.common.service.impl; + +import com.alibaba.fastjson.JSONObject; +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.fuint.common.Constants; +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.GoodsDto; +import com.fuint.common.dto.GoodsSpecValueDto; +import com.fuint.common.dto.GoodsTopDto; +import com.fuint.common.enums.GoodsTypeEnum; +import com.fuint.common.enums.PlatformTypeEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.param.GoodsListParam; +import com.fuint.common.service.*; +import com.fuint.common.util.SeqUtil; +import com.fuint.common.util.XlsUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.bean.GoodsBean; +import com.fuint.repository.bean.GoodsTopBean; +import com.fuint.repository.mapper.MtGoodsMapper; +import com.fuint.repository.mapper.MtGoodsSkuMapper; +import com.fuint.repository.mapper.MtGoodsSpecMapper; +import com.fuint.repository.mapper.MtStoreGoodsMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class GoodsServiceImpl extends ServiceImpl implements GoodsService { + + private static final Logger logger = LoggerFactory.getLogger(GoodsServiceImpl.class); + + private MtGoodsMapper mtGoodsMapper; + + private MtGoodsSpecMapper mtGoodsSpecMapper; + + private MtGoodsSkuMapper mtGoodsSkuMapper; + + private MtStoreGoodsMapper mtStoreGoodsMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 商品分类服务接口 + * */ + private CateService cateService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 分页查询商品列表 + * + * @param param + * @return + */ + @Override + public PaginationResponse queryGoodsListByPagination(GoodsListParam param) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtGoods::getStatus, StatusEnum.DISABLE.getKey()); + + String name = param.getName(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtGoods::getName, name); + } + String status = param.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtGoods::getStatus, status); + } + String goodsNo = param.getGoodsNo(); + if (StringUtils.isNotBlank(goodsNo)) { + lambdaQueryWrapper.eq(MtGoods::getGoodsNo, goodsNo); + } + String isSingleSpec = param.getIsSingleSpec(); + if (StringUtils.isNotBlank(isSingleSpec)) { + lambdaQueryWrapper.eq(MtGoods::getIsSingleSpec, isSingleSpec); + } + Integer merchantId = param.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtGoods::getMerchantId, merchantId); + } + Integer storeId = param.getStoreId(); + if (storeId != null && storeId > 0 ) { + lambdaQueryWrapper.and(qw -> qw.eq(MtGoods::getStoreId, storeId) + .or(qw2 -> qw2.eq(MtGoods::getStoreId, 0) + .inSql(MtGoods::getId, "SELECT s.GOODS_ID FROM mt_store_goods s WHERE s.STORE_ID = "+storeId+" AND s.status = 'A'"))); + } + String type = param.getType(); + if (StringUtils.isNotBlank(type)) { + lambdaQueryWrapper.eq(MtGoods::getType, type); + } + Integer cateId = param.getCateId(); + if (cateId != null) { + lambdaQueryWrapper.eq(MtGoods::getCateId, cateId); + } + String hasStock = param.getStock(); + if (StringUtils.isNotBlank(hasStock)) { + if (hasStock.equals(YesOrNoEnum.YES.getKey())) { + lambdaQueryWrapper.gt(MtGoods::getStock, 0); + } else { + lambdaQueryWrapper.lt(MtGoods::getStock, 1); + } + } + String hasPrice = param.getHasPrice(); + if (StringUtils.isNotBlank(hasPrice)) { + if (hasPrice.equals(YesOrNoEnum.YES.getKey())) { + lambdaQueryWrapper.gt(MtGoods::getPrice, 0); + } + } + String platform = param.getPlatform(); + if (StringUtils.isNotBlank(platform)) { + if (platform.equals(PlatformTypeEnum.H5.getCode()) || platform.equals(PlatformTypeEnum.MP_WEIXIN.getCode())) { + // 会员端 + lambdaQueryWrapper.in(MtGoods::getPlatform, new ArrayList<>(Arrays.asList("0", "1"))); + } else if(platform.equals(PlatformTypeEnum.PC.getCode())) { + // PC端 + lambdaQueryWrapper.in(MtGoods::getPlatform, new ArrayList<>(Arrays.asList("0", "2"))); + } else if(platform.equals("0")) { + // 不限制 + lambdaQueryWrapper.eq(MtGoods::getPlatform, 0); + } else if(platform.equals("1")) { + // 仅会员端 + lambdaQueryWrapper.eq(MtGoods::getPlatform, 1); + } else if (platform.equals("2")) { + // 仅PC端 + lambdaQueryWrapper.eq(MtGoods::getPlatform, 2); + } + } + String sortType = param.getSortType(); + String sortPrice = param.getSortPrice(); + if (StringUtil.isNotEmpty(sortType)) { + if (sortType.equals("price")) { + if (sortPrice.equals("0")) { + lambdaQueryWrapper.orderByDesc(MtGoods::getPrice).orderByAsc(MtGoods::getId); + } else { + lambdaQueryWrapper.orderByAsc(MtGoods::getPrice).orderByAsc(MtGoods::getId); + } + } else if (sortType.equals("sales")) { + lambdaQueryWrapper.orderByDesc(MtGoods::getInitSale).orderByAsc(MtGoods::getId); + } else { + lambdaQueryWrapper.orderByAsc(MtGoods::getSort).orderByAsc(MtGoods::getId); + } + } else { + lambdaQueryWrapper.orderByAsc(MtGoods::getSort).orderByAsc(MtGoods::getId); + } + lambdaQueryWrapper.select( + MtGoods::getId, + MtGoods::getGoodsNo, + MtGoods::getMerchantId, + MtGoods::getStoreId, + MtGoods::getName, + MtGoods::getCanUsePoint, + MtGoods::getCateId, + MtGoods::getCostPrice, + MtGoods::getCouponIds, + MtGoods::getCreateTime, + MtGoods::getUpdateTime, + MtGoods::getInitSale, + MtGoods::getIsMemberDiscount, + MtGoods::getIsSingleSpec, + MtGoods::getPlatform, + MtGoods::getPrice, + MtGoods::getLinePrice, + MtGoods::getImages, + MtGoods::getLogo, + MtGoods::getCostPrice, + MtGoods::getSort, + MtGoods::getStatus, + MtGoods::getStock, + MtGoods::getType, + MtGoods::getOperator, + MtGoods::getWeight); + Page pageHelper = PageHelper.startPage(param.getPage(), param.getPageSize()); + List goodsList = mtGoodsMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + String basePath = settingService.getUploadBasePath(); + for (MtGoods mtGoods : goodsList) { + MtGoodsCate cateInfo = null; + if (mtGoods.getCateId() != null) { + cateInfo = cateService.queryCateById(mtGoods.getCateId()); + } + GoodsDto item = new GoodsDto(); + item.setId(mtGoods.getId()); + item.setInitSale(mtGoods.getInitSale()); + if (StringUtil.isNotEmpty(mtGoods.getLogo())) { + item.setLogo(basePath + mtGoods.getLogo()); + } + item.setStoreId(mtGoods.getStoreId()); + if (mtGoods.getStoreId() != null) { + MtStore storeInfo = storeService.queryStoreById(mtGoods.getStoreId()); + item.setStoreInfo(storeInfo); + } + item.setName(mtGoods.getName()); + item.setGoodsNo(mtGoods.getGoodsNo()); + item.setCateId(mtGoods.getCateId()); + item.setStock(mtGoods.getStock()); + item.setCateInfo(cateInfo); + item.setType(mtGoods.getType()); + item.setPrice(mtGoods.getPrice()); + item.setLinePrice(mtGoods.getLinePrice()); + item.setSalePoint(mtGoods.getSalePoint()); + item.setCreateTime(mtGoods.getCreateTime()); + item.setUpdateTime(mtGoods.getUpdateTime()); + item.setStatus(mtGoods.getStatus()); + item.setOperator(mtGoods.getOperator()); + item.setWeight(mtGoods.getWeight()); + item.setSort(mtGoods.getSort()); + dataList.add(item); + } + + PageRequest pageRequest = PageRequest.of(param.getPage(), param.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, GoodsDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存商品信息 + * + * @param reqDto 商品参数 + * @param storeIds 分配店铺 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存商品信息") + public MtGoods saveGoods(MtGoods reqDto, String storeIds) throws BusinessCheckException { + MtGoods mtGoods = new MtGoods(); + if (reqDto.getId() != null && reqDto.getId() > 0) { + mtGoods = queryGoodsById(reqDto.getId()); + reqDto.setMerchantId(mtGoods.getMerchantId()); + } + if (reqDto.getMerchantId() != null) { + mtGoods.setMerchantId(reqDto.getMerchantId() >= 0 ? reqDto.getMerchantId() : 0); + } + if (reqDto.getStoreId() != null) { + mtGoods.setStoreId(reqDto.getStoreId() >= 0 ? reqDto.getStoreId() : 0); + } + Integer storeId = reqDto.getStoreId() == null ? 0 : reqDto.getStoreId(); + if (reqDto.getMerchantId() == null || reqDto.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + mtGoods.setMerchantId(mtStore.getMerchantId()); + } + } + if (mtGoods.getMerchantId() == null || mtGoods.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + if (StringUtil.isNotEmpty(reqDto.getIsSingleSpec())) { + mtGoods.setIsSingleSpec(reqDto.getIsSingleSpec()); + } + if (reqDto.getId() <= 0 && StringUtil.isEmpty(reqDto.getIsSingleSpec())) { + mtGoods.setIsSingleSpec(YesOrNoEnum.YES.getKey()); + } + if (StringUtil.isNotEmpty(reqDto.getName())) { + mtGoods.setName(reqDto.getName()); + } + if (StringUtil.isNotEmpty(reqDto.getStatus())) { + mtGoods.setStatus(reqDto.getStatus()); + } + if (StringUtil.isNotEmpty(reqDto.getLogo())) { + mtGoods.setLogo(reqDto.getLogo()); + } + if (StringUtil.isNotEmpty(reqDto.getIsSingleSpec())) { + mtGoods.setIsSingleSpec(reqDto.getIsSingleSpec()); + } + if (StringUtil.isNotEmpty(reqDto.getDescription())) { + mtGoods.setDescription(reqDto.getDescription()); + } + if (StringUtil.isNotEmpty(reqDto.getOperator())) { + mtGoods.setOperator(reqDto.getOperator()); + } + if (StringUtil.isNotEmpty(reqDto.getType())) { + mtGoods.setType(reqDto.getType()); + } + if (reqDto.getPlatform() != null) { + mtGoods.setPlatform(reqDto.getPlatform()); + } + if (reqDto.getCateId() != null && reqDto.getCateId() > 0) { + mtGoods.setCateId(reqDto.getCateId()); + } + if (reqDto.getBookId() != null && reqDto.getBookId() > 0) { + mtGoods.setBookId(reqDto.getBookId()); + } + if (reqDto.getServiceTime() != null && reqDto.getServiceTime() > 0) { + mtGoods.setServiceTime(reqDto.getServiceTime()); + } + if (StringUtil.isNotEmpty(reqDto.getGoodsNo())) { + mtGoods.setGoodsNo(reqDto.getGoodsNo()); + } + if (reqDto.getSort() != null) { + mtGoods.setSort(reqDto.getSort()); + } + if (reqDto.getId() == null && (mtGoods.getSort().equals("") || mtGoods.getSort() == null )) { + mtGoods.setSort(0); + } + if (reqDto.getPrice() != null) { + mtGoods.setPrice(reqDto.getPrice()); + } + if (reqDto.getPrice() == null && reqDto.getId() <= 0) { + mtGoods.setPrice(new BigDecimal("0.00")); + } + if (reqDto.getLinePrice() != null) { + mtGoods.setLinePrice(reqDto.getLinePrice()); + } + if (reqDto.getLinePrice() == null && reqDto.getId() <= 0) { + mtGoods.setLinePrice(new BigDecimal("0.00")); + } + if (reqDto.getCostPrice() != null) { + mtGoods.setCostPrice(reqDto.getCostPrice()); + } + if (reqDto.getCostPrice() == null && reqDto.getId() <= 0) { + mtGoods.setCostPrice(new BigDecimal("0.00")); + } + if (StringUtil.isNotEmpty(reqDto.getCouponIds())) { + mtGoods.setCouponIds(reqDto.getCouponIds()); + } + if (reqDto.getWeight() != null) { + mtGoods.setWeight(reqDto.getWeight()); + } + if (reqDto.getInitSale() != null) { + mtGoods.setInitSale(reqDto.getInitSale()); + } + if (reqDto.getStock() != null) { + mtGoods.setStock(reqDto.getStock()); + } + if (StringUtil.isNotEmpty(reqDto.getSalePoint())) { + mtGoods.setSalePoint(reqDto.getSalePoint()); + } + if (StringUtil.isEmpty(reqDto.getSalePoint()) && reqDto.getId() <= 0) { + reqDto.setSalePoint(""); + } + if (StringUtil.isNotEmpty(reqDto.getCanUsePoint())) { + mtGoods.setCanUsePoint(reqDto.getCanUsePoint()); + } + if (StringUtil.isNotEmpty(reqDto.getIsMemberDiscount())) { + mtGoods.setIsMemberDiscount(reqDto.getIsMemberDiscount()); + } + if (StringUtil.isNotEmpty(reqDto.getImages())) { + mtGoods.setImages(reqDto.getImages()); + } + if (!mtGoods.getType().equals(GoodsTypeEnum.COUPON.getKey())) { + mtGoods.setCouponIds(""); + } + if (mtGoods.getCouponIds() != null && StringUtil.isNotEmpty(mtGoods.getCouponIds())) { + String str = mtGoods.getCouponIds().replace(",", ",").trim(); + String couponIds[] = str.split(","); + if (couponIds.length > 0) { + for (int i = 0; i < couponIds.length; i++) { + MtCoupon mtCoupon = couponService.queryCouponById(Integer.parseInt(couponIds[i])); + if (mtCoupon == null) { + throw new BusinessCheckException("卡券ID等于“"+couponIds[i]+"”的虚拟卡券不存在."); + } + } + } + } + Date dateTime = new Date(); + mtGoods.setUpdateTime(dateTime); + if (reqDto.getId() == null || reqDto.getId() <= 0) { + mtGoods.setCreateTime(dateTime); + this.save(mtGoods); + } else { + this.updateById(mtGoods); + } + + // 维护分配的店铺 + if (StringUtil.isNotEmpty(storeIds)) { + List storeIdList = Arrays.asList(storeIds.split(",").clone()); + Map param = new HashMap<>(); + param.put("goods_id", mtGoods.getId()); + param.put("status", StatusEnum.ENABLED.getKey()); + List storeGoodsList = mtStoreGoodsMapper.selectByMap(param); + // 判断是否有删除 + if (storeGoodsList != null && storeGoodsList.size() > 0) { + for (MtStoreGoods mtStoreGoods : storeGoodsList) { + if (!storeIdList.contains(mtStoreGoods.getStoreId().toString())) { + mtStoreGoods.setStatus(StatusEnum.DISABLE.getKey()); + mtStoreGoods.setUpdateTime(dateTime); + mtStoreGoods.setOperator(mtGoods.getOperator()); + mtStoreGoodsMapper.updateById(mtStoreGoods); + } + } + } + // 新增或更新 + if (storeIdList != null && storeIdList.size() > 0) { + for (String id : storeIdList) { + if (StringUtil.isNotEmpty(id) && Integer.parseInt(id) > 0) { + MtStoreGoods mtStoreGoods = new MtStoreGoods(); + mtStoreGoods.setMerchantId(mtGoods.getMerchantId()); + mtStoreGoods.setStoreId(Integer.parseInt(id)); + mtStoreGoods.setGoodsId(mtGoods.getId()); + mtStoreGoods.setCreateTime(dateTime); + mtStoreGoods.setUpdateTime(dateTime); + mtStoreGoods.setStatus(StatusEnum.ENABLED.getKey()); + mtStoreGoods.setOperator(reqDto.getOperator()); + Map params = new HashMap<>(); + params.put("goods_id", mtGoods.getId()); + params.put("store_id", id); + List goodsList = mtStoreGoodsMapper.selectByMap(params); + if (goodsList != null && goodsList.size() > 0) { + mtStoreGoods = goodsList.get(0); + mtStoreGoods.setUpdateTime(dateTime); + mtStoreGoods.setStatus(StatusEnum.ENABLED.getKey()); + mtStoreGoods.setOperator(reqDto.getOperator()); + mtStoreGoodsMapper.updateById(mtStoreGoods); + } else { + mtStoreGoodsMapper.insert(mtStoreGoods); + } + } + } + } + } + return mtGoods; + } + + /** + * 更新商品状态 + * + * @param goodsId 商品ID + * @param status 状态 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + public Boolean updateStatus(Integer goodsId, String status, String operator) throws BusinessCheckException { + MtGoods mtGoods = queryGoodsById(goodsId); + if (null == mtGoods) { + throw new BusinessCheckException("该商品不存在"); + } + mtGoods.setStatus(status); + mtGoods.setUpdateTime(new Date()); + mtGoods.setOperator(operator); + mtGoodsMapper.updateById(mtGoods); + // 删除商品 + if (status.equals(StatusEnum.DISABLE.getKey())) { + Map param = new HashMap<>(); + param.put("goods_id", goodsId); + param.put("status", StatusEnum.ENABLED.getKey()); + List goodsSpecList = mtGoodsSpecMapper.selectByMap(param); + if (goodsSpecList != null && goodsSpecList.size() > 0) { + for (MtGoodsSpec mtGoodsSpec : goodsSpecList) { + mtGoodsSpec.setStatus(StatusEnum.DISABLE.getKey()); + mtGoodsSpecMapper.updateById(mtGoodsSpec); + } + } + Map param1 = new HashMap<>(); + param1.put("goods_id", goodsId); + param1.put("status", StatusEnum.ENABLED.getKey()); + List goodsSkuList = mtGoodsSkuMapper.selectByMap(param1); + if (goodsSkuList != null && goodsSkuList.size() > 0) { + for (MtGoodsSku mtGoodsSku : goodsSkuList) { + mtGoodsSku.setStatus(StatusEnum.DISABLE.getKey()); + mtGoodsSkuMapper.updateById(mtGoodsSku); + } + } + } + return true; + } + + /** + * 根据ID获取商品信息 + * + * @param id 商品ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtGoods queryGoodsById(Integer id) { + MtGoods mtGoods = mtGoodsMapper.selectById(id); + if (mtGoods == null) { + return null; + } + return mtGoods; + } + + /** + * 根据编码获取商品信息 + * + * @param merchantId 商户ID + * @param goodsNo 商品编码 + * @throws BusinessCheckException + * @return + */ + @Override + public MtGoods queryGoodsByGoodsNo(Integer merchantId, String goodsNo) { + return mtGoodsMapper.getByGoodsNo(merchantId, goodsNo); + } + + /** + * 根据条码获取sku信息 + * + * @param skuNo skuNo + * @throws BusinessCheckException + * */ + @Override + public MtGoodsSku getSkuInfoBySkuNo(String skuNo) { + List mtGoodsSkuList = mtGoodsSkuMapper.getBySkuNo(skuNo); + if (mtGoodsSkuList.size() > 0) { + return mtGoodsSkuList.get(0); + } + return null; + } + + /** + * 根据ID获取商品详情 + * + * @param id 商品ID + * @return + */ + @Override + public GoodsDto getGoodsDetail(Integer id, boolean getDeleteSpec) { + if (id == null || id < 1) { + return null; + } + + MtGoods mtGoods = mtGoodsMapper.selectById(id); + GoodsDto goodsInfo = new GoodsDto(); + + if (mtGoods != null) { + try { + BeanUtils.copyProperties(mtGoods, goodsInfo); + } catch (Exception e) { + goodsInfo.setId(mtGoods.getId()); + goodsInfo.setType(mtGoods.getType()); + goodsInfo.setStoreId(mtGoods.getStoreId()); + goodsInfo.setName(mtGoods.getName()); + goodsInfo.setCateId(mtGoods.getCateId()); + goodsInfo.setGoodsNo(mtGoods.getGoodsNo()); + goodsInfo.setIsSingleSpec(mtGoods.getIsSingleSpec()); + goodsInfo.setLogo(mtGoods.getLogo()); + goodsInfo.setImages(mtGoods.getImages()); + goodsInfo.setStatus(mtGoods.getStatus()); + goodsInfo.setSort(mtGoods.getSort()); + goodsInfo.setPrice(mtGoods.getPrice()); + goodsInfo.setLinePrice(mtGoods.getLinePrice()); + goodsInfo.setServiceTime(mtGoods.getServiceTime()); + goodsInfo.setCouponIds(mtGoods.getCouponIds()); + } + } + + String basePath = settingService.getUploadBasePath(); + if (StringUtil.isNotEmpty(goodsInfo.getLogo())) { + goodsInfo.setLogo(basePath + goodsInfo.getLogo()); + } + + // 规格列表 + Map param = new HashMap<>(); + param.put("goods_id", id.toString()); + if (getDeleteSpec == false) { + param.put("status", StatusEnum.ENABLED.getKey()); + } + List goodsSpecList = mtGoodsSpecMapper.selectByMap(param); + goodsInfo.setSpecList(goodsSpecList); + + // sku列表 + if (goodsInfo.getIsSingleSpec().equals(YesOrNoEnum.NO.getKey())) { + List goodsSkuList = mtGoodsSkuMapper.selectByMap(param); + goodsInfo.setSkuList(goodsSkuList); + // 多规格商品的价格、库存数量 + if (goodsSkuList.size() > 0) { + goodsInfo.setPrice(goodsSkuList.get(0).getPrice()); + goodsInfo.setLinePrice(goodsSkuList.get(0).getLinePrice()); + Double stock = 0.0; + for (MtGoodsSku mtGoodsSku : goodsSkuList) { + stock = stock + mtGoodsSku.getStock(); + } + goodsInfo.setStock(stock); + } else { + goodsInfo.setStock(0.0); + } + } else { + goodsInfo.setSkuList(new ArrayList<>()); + } + + // 获取分配的店铺 + String storeIds = getStoreIds(mtGoods.getId()); + goodsInfo.setStoreIds(storeIds); + + return goodsInfo; + } + + /** + * 获取店铺的商品列表 + * + * @param storeId 店铺ID + * @param keyword 关键字 + * @param platform 平台 + * @param cateId 分类ID + * @param page 当前页码 + * @param pageSize 每页页数 + * @throws BusinessCheckException + * @return + * */ + @Override + public Map getStoreGoodsList(Integer storeId, String keyword, String platform, Integer cateId, Integer page, Integer pageSize) throws BusinessCheckException { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore == null) { + Map result = new HashMap<>(); + result.put("goodsList", new ArrayList<>()); + result.put("total", 0); + return result; + } + Integer merchantId = mtStore.getMerchantId() == null ? 0 : mtStore.getMerchantId(); + + Page pageHelper = PageHelper.startPage(page, pageSize); + List goodsList = new ArrayList<>(); + List skuList = new ArrayList<>(); + if (StringUtil.isNotEmpty(keyword)) { + skuList = mtGoodsSkuMapper.getBySkuNo(keyword); + } + if (skuList != null && skuList.size() > 0) { + MtGoods goods = mtGoodsMapper.selectById(skuList.get(0).getGoodsId()); + goodsList.add(goods); + } else { + pageHelper = PageHelper.startPage(page, pageSize); + if (keyword != null && StringUtil.isNotEmpty(keyword)) { + goodsList = mtGoodsMapper.searchStoreGoodsList(merchantId, storeId, keyword, platform); + } else { + goodsList = mtGoodsMapper.getStoreGoodsList(merchantId, storeId, cateId, platform); + } + } + List dataList = new ArrayList<>(); + if (goodsList.size() > 0) { + for (MtGoods mtGoods : goodsList) { + // 多规格商品价格、库存数量 + if (mtGoods != null && mtGoods.getIsSingleSpec().equals(YesOrNoEnum.NO.getKey())) { + Map param = new HashMap<>(); + param.put("goods_id", mtGoods.getId().toString()); + param.put("status", StatusEnum.ENABLED.getKey()); + List goodsSkuList = mtGoodsSkuMapper.selectByMap(param); + if (goodsSkuList.size() > 0) { + mtGoods.setPrice(goodsSkuList.get(0).getPrice()); + mtGoods.setLinePrice(goodsSkuList.get(0).getLinePrice()); + Double stock = 0.0; + for (MtGoodsSku mtGoodsSku : goodsSkuList) { + stock = stock + mtGoodsSku.getStock(); + } + mtGoods.setStock(stock); + } else { + mtGoods.setStock(0.0); + } + } + dataList.add(mtGoods); + } + } + + Map data = new HashMap<>(); + data.put("goodsList", dataList); + data.put("total", pageHelper.getTotal()); + + return data; + } + + /** + * 通过SKU获取规格列表 + * + * @param skuId skuID + * @return + * */ + @Override + public List getSpecListBySkuId(Integer skuId) { + if (skuId < 0 || skuId == null) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + + MtGoodsSku goodsSku = mtGoodsSkuMapper.selectById(skuId); + if (goodsSku == null) { + return result; + } + + String specIds = goodsSku.getSpecIds(); + String specIdArr[] = specIds.split("-"); + for (String specId : specIdArr) { + MtGoodsSpec mtGoodsSpec = mtGoodsSpecMapper.selectById(Integer.parseInt(specId)); + if (mtGoodsSpec != null) { + GoodsSpecValueDto dto = new GoodsSpecValueDto(); + dto.setSpecValueId(mtGoodsSpec.getId()); + dto.setSpecName(mtGoodsSpec.getName()); + dto.setSpecValue(mtGoodsSpec.getValue()); + result.add(dto); + } + } + + return result; + } + + /** + * 获取商品规格详情 + * + * @param specId 规格ID + * @return + * */ + @Override + public MtGoodsSpec getSpecDetail(Integer specId) { + return mtGoodsSpecMapper.selectById(specId); + } + + /** + * 更新已售数量 + * + * @param goodsId 商品ID + * @param saleNum 销售数量 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateInitSale(Integer goodsId, Double saleNum) { + return mtGoodsMapper.updateInitSale(goodsId, saleNum); + } + + /** + * 获取选择商品列表 + * + * @param params 查询参数 + * @return + */ + @Override + public PaginationResponse selectGoodsList(Map params) throws BusinessCheckException { + Integer page = params.get("page") == null ? Constants.PAGE_NUMBER : Integer.parseInt(params.get("page").toString()); + Integer pageSize = params.get("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(params.get("pageSize").toString()); + Integer merchantId = (params.get("merchantId") == null || StringUtil.isEmpty(params.get("merchantId").toString())) ? 0 : Integer.parseInt(params.get("merchantId").toString()); + Integer storeId = (params.get("storeId") == null || StringUtil.isEmpty(params.get("storeId").toString())) ? 0 : Integer.parseInt(params.get("storeId").toString()); + Integer cateId = (params.get("cateId") == null || StringUtil.isEmpty(params.get("cateId").toString())) ? 0 : Integer.parseInt(params.get("cateId").toString()); + String keyword = params.get("keyword") == null ? "" : params.get("keyword").toString(); + + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null && mtStore.getMerchantId() != null) { + merchantId = mtStore.getMerchantId(); + } + Page pageHelper = PageHelper.startPage(page, pageSize); + List dataList = new ArrayList<>(); + + List goodsList = mtGoodsMapper.selectGoodsList(merchantId, storeId, cateId, keyword); + + for (GoodsBean goodsBean : goodsList) { + GoodsDto goodsDto = new GoodsDto(); + goodsDto.setId(goodsBean.getGoodsId()); + goodsDto.setLogo(goodsBean.getLogo()); + goodsDto.setName(goodsBean.getName()); + goodsDto.setGoodsNo(goodsBean.getGoodsNo()); + goodsDto.setStoreId(goodsBean.getStoreId()); + goodsDto.setPrice(goodsBean.getPrice()); + goodsDto.setCateId(goodsBean.getCateId()); + goodsDto.setStock(goodsBean.getStock()); + if (goodsBean.getSpecIds() != null) { + Map param = new HashMap<>(); + param.put("GOODS_ID", goodsBean.getGoodsId()); + param.put("SPEC_IDS", goodsBean.getSpecIds()); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + List goodsSkuList = mtGoodsSkuMapper.selectByMap(param); + if (goodsSkuList != null && goodsSkuList.size() > 0) { + goodsDto.setSkuId(goodsSkuList.get(0).getId()); + goodsDto.setPrice(goodsSkuList.get(0).getPrice()); + if (goodsSkuList.get(0).getLogo() != null && StringUtil.isNotEmpty(goodsSkuList.get(0).getLogo())) { + goodsDto.setLogo(goodsSkuList.get(0).getLogo()); + } + goodsDto.setStock(goodsSkuList.get(0).getStock()); + List specList = new ArrayList<>(); + String[] specIds = goodsBean.getSpecIds().split("-"); + if (specIds.length > 0) { + for (String specId : specIds) { + MtGoodsSpec mtGoodsSpec = mtGoodsSpecMapper.selectById(Integer.parseInt(specId)); + if (mtGoodsSpec != null) { + specList.add(mtGoodsSpec); + } + } + } + goodsDto.setSpecList(specList); + } + } + dataList.add(goodsDto); + } + + PageRequest pageRequest = PageRequest.of(page, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, GoodsDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 获取商品销售排行榜 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public List getGoodsSaleTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime) { + List dataList = mtGoodsMapper.getGoodsSaleTopList(merchantId, storeId, startTime, endTime); + List goodsList = new ArrayList<>(); + if (dataList != null && dataList.size() > 0) { + for (GoodsTopBean bean : dataList) { + GoodsTopDto dto = new GoodsTopDto(); + BeanUtils.copyProperties(bean, dto); + goodsList.add(dto); + } + } + return goodsList; + } + + /** + * 获取商品分配的店铺 + * + * @param goodsId 商品ID + * @return + * */ + @Override + public String getStoreIds(Integer goodsId) { + if (goodsId == null || goodsId <= 0) { + return ""; + } + Map params = new HashMap<>(); + params.put("goods_id", goodsId); + params.put("status", StatusEnum.ENABLED.getKey()); + List goodsList = mtStoreGoodsMapper.selectByMap(params); + List storeIds = new ArrayList<>(); + if (goodsList != null && goodsList.size() > 0) { + for (MtStoreGoods mtStoreGoods : goodsList) { + if (!storeIds.contains(mtStoreGoods.getStoreId().toString())) { + storeIds.add(mtStoreGoods.getStoreId().toString()); + } + } + } else { + storeIds.add("0"); + } + return storeIds.stream().collect(Collectors.joining(",")); + } + + /** + * 导入商品 + * + * @param file excel文件 + * @param accountInfo 操作者 + * @param filePath 文件路径 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "导入商品列表") + public Boolean importGoods(MultipartFile file, AccountInfo accountInfo, String filePath) throws BusinessCheckException { + String originalFileName = file.getOriginalFilename(); + boolean isExcel2003 = XlsUtil.isExcel2003(originalFileName); + boolean isExcel2007 = XlsUtil.isExcel2007(originalFileName); + + if (!isExcel2003 && !isExcel2007) { + logger.error("importGoods->uploadFile:{}", "文件类型不正确"); + throw new BusinessCheckException("文件类型不正确"); + } + + if (accountInfo == null || accountInfo.getMerchantId() == null || accountInfo.getMerchantId() <= 0) { + throw new BusinessCheckException("没有操作权限"); + } + + // 1、录入商品信息 + List> goodsList = new ArrayList<>(); + List> skuList = new ArrayList<>(); + try { + goodsList = XlsUtil.readExcelContent(file.getInputStream(), isExcel2003, 0, 1, null, null, null); + skuList = XlsUtil.readExcelContent(file.getInputStream(), isExcel2003, 1, 1, null, null, null); + } catch (IOException e) { + logger.error("GoodsServiceImpl->parseExcelContent{}", e); + throw new BusinessCheckException("商品导入失败" + e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + + if (goodsList != null && goodsList.size() > 0) { + if (goodsList.size() > 1500) { + throw new BusinessCheckException("商品导入失败,单次导入商品数量不能大于1500"); + } + for (int i = 0; i < goodsList.size(); i++) { + List goods = goodsList.get(i); + MtGoods mtGoods = new MtGoods(); + mtGoods.setId(0); + mtGoods.setName(goods.get(0)); + mtGoods.setType(GoodsTypeEnum.getKey(goods.get(1))); + mtGoods.setGoodsNo(StringUtil.isBlank(goods.get(2)) ? SeqUtil.getRandomNumber(15) : goods.get(2)); + mtGoods.setMerchantId(accountInfo.getMerchantId()); + mtGoods.setStoreId(accountInfo.getStoreId()); + Integer cateId = cateService.getGoodsCateId(accountInfo.getMerchantId(), accountInfo.getStoreId(), goods.get(3)); + if ((cateId == null || cateId <= 0) && StringUtil.isNotBlank(goods.get(3))) { + MtGoodsCate mtCate = new MtGoodsCate(); + mtCate.setMerchantId(accountInfo.getMerchantId()); + mtCate.setStoreId(accountInfo.getStoreId()); + mtCate.setName(goods.get(3)); + mtCate.setOperator(accountInfo.getAccountName()); + mtCate.setDescription("导入商品并创建商品分类"); + MtGoodsCate mtGoodsCate = cateService.addCate(mtCate); + if (mtGoodsCate != null) { + cateId = mtGoodsCate.getId(); + } + } + mtGoods.setCateId(cateId); + mtGoods.setOperator(accountInfo.getAccountName()); + String storeIds = storeService.getStoreIds(accountInfo.getMerchantId(), goods.get(4)); + String images = goods.get(5); + if (StringUtil.isNotBlank(images)) { + String[] imgArr = images.split(","); + if (imgArr.length > 0) { + mtGoods.setLogo(imgArr[0]); + String imagesJson = JSONObject.toJSONString(images.split(",")); + mtGoods.setImages(imagesJson); + } + } else { + mtGoods.setLogo("/static/defaultImage/none.png"); + } + mtGoods.setSort(Integer.parseInt(goods.get(6))); + mtGoods.setCanUsePoint(YesOrNoEnum.getKey(goods.get(7))); + mtGoods.setIsMemberDiscount(YesOrNoEnum.getKey(goods.get(8))); + if (goods.get(9).equals(YesOrNoEnum.YES.getKey()) || goods.get(9).equals("单规格")) { + mtGoods.setIsSingleSpec(YesOrNoEnum.YES.getKey()); + } else { + mtGoods.setIsSingleSpec(YesOrNoEnum.NO.getKey()); + } + mtGoods.setInitSale(Double.parseDouble(goods.get(10))); + mtGoods.setSalePoint(goods.get(11)); + mtGoods.setDescription(goods.get(12)); + mtGoods.setPrice(new BigDecimal("0")); + mtGoods.setLinePrice(new BigDecimal("0")); + mtGoods.setStock(0.0); + mtGoods.setStatus(StatusEnum.FORBIDDEN.getKey()); + saveGoods(mtGoods, storeIds); + } + } + + // 2、录入规格信息 + if (skuList != null && skuList.size() > 0) { + MtGoods mtGoods = null; + Double totalStock = 0d; + BigDecimal price = new BigDecimal("0"); + for (int j = 0; j < skuList.size(); j++) { + List sku = skuList.get(j); + List goodsList1 = mtGoodsMapper.getByGoodsName(accountInfo.getMerchantId(), sku.get(0)); + if (goodsList1.size() == 1) { + mtGoods = goodsList1.get(0); + } else if (goodsList1.size() > 1) { + throw new BusinessCheckException("商品导入失败,存在重复商品名称:" + sku.get(0)); + } + if (mtGoods != null) { + // 单规格 + if (mtGoods.getIsSingleSpec().equals(YesOrNoEnum.YES.getKey())) { + mtGoods.setPrice(new BigDecimal(sku.get(4))); + mtGoods.setLinePrice(new BigDecimal(sku.get(5))); + mtGoods.setStock(Double.parseDouble(sku.get(6))); + mtGoods.setWeight(new BigDecimal(sku.get(7))); + mtGoodsMapper.updateById(mtGoods); + } + // 多规格 + if (mtGoods.getIsSingleSpec().equals(YesOrNoEnum.NO.getKey())) { + List specIds = new ArrayList<>(); + if (StringUtil.isNotEmpty(sku.get(2)) && StringUtil.isNotEmpty(sku.get(3))) { + String[] specNameList = sku.get(2).split(","); + String[] specValueList = sku.get(3).split(","); + if (specNameList.length == specValueList.length) { + for (int y = 0; y < specNameList.length; y++) { + Integer specId = getSpecId(mtGoods.getId(), specNameList[y], specValueList[y]); + specIds.add(specId.toString()); + } + } + } + if (StringUtil.isNotEmpty(sku.get(1))) { + MtGoodsSku mtGoodsSku = new MtGoodsSku(); + mtGoodsSku.setSkuNo(sku.get(1)); + mtGoodsSku.setGoodsId(mtGoods.getId()); + mtGoodsSku.setSpecIds(String.join("-", specIds)); + BigDecimal skuPrice = new BigDecimal(sku.get(4)); + mtGoodsSku.setPrice(skuPrice); + mtGoodsSku.setLinePrice(new BigDecimal(sku.get(5))); + Double stock = Double.parseDouble(sku.get(6)); + mtGoodsSku.setStock(stock); + mtGoodsSku.setWeight(new BigDecimal(sku.get(7))); + mtGoodsSku.setStatus(StatusEnum.ENABLED.getKey()); + mtGoodsSkuMapper.insert(mtGoodsSku); + totalStock = totalStock + stock; + if (((skuPrice.compareTo(price) <= 0) || (price.compareTo(new BigDecimal("0")) <= 0)) && skuPrice.compareTo(new BigDecimal("0")) > 0) { + price = skuPrice; + } + } + } + } + } + // 更新商品价格和库存 + if (mtGoods != null) { + mtGoods.setStock(totalStock); + mtGoods.setPrice(price); + mtGoodsMapper.updateById(mtGoods); + } + } + return true; + } + + /** + * 获取规格ID + * + * @param goodsId 商品ID + * @param specName 规格名称 + * @param specValue 规格值 + * */ + @Override + public Integer getSpecId(Integer goodsId, String specName, String specValue) { + Map params = new HashMap<>(); + params.put("goods_id", goodsId); + params.put("name", specName); + params.put("value", specValue); + params.put("status", StatusEnum.ENABLED.getKey()); + Integer specId; + List specList = mtGoodsSpecMapper.selectByMap(params); + if (specList != null && specList.size() > 0) { + specId = specList.get(0).getId(); + } else { + MtGoodsSpec mtGoodsSpec = new MtGoodsSpec(); + mtGoodsSpec.setGoodsId(goodsId); + mtGoodsSpec.setName(specName); + mtGoodsSpec.setValue(specValue); + mtGoodsSpec.setStatus(StatusEnum.ENABLED.getKey()); + mtGoodsSpecMapper.insert(mtGoodsSpec); + specId = mtGoodsSpec.getId(); + } + return specId; + } + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/InvoiceServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/InvoiceServiceImpl.java new file mode 100644 index 0000000..99141b8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/InvoiceServiceImpl.java @@ -0,0 +1,241 @@ +package com.fuint.common.service.impl; + +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.fuint.common.param.InvoiceParam; +import com.fuint.common.service.OrderService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtInvoice; +import com.fuint.common.service.InvoiceService; +import com.fuint.common.enums.StatusEnum; +import com.fuint.repository.mapper.MtInvoiceMapper; +import com.fuint.repository.model.MtOrder; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.pagehelper.Page; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 发票服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class InvoiceServiceImpl extends ServiceImpl implements InvoiceService { + + private static final Logger logger = LoggerFactory.getLogger(InvoiceServiceImpl.class); + + private MtInvoiceMapper mtInvoiceMapper; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 分页查询数据列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryInvoiceListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtInvoice::getStatus, StatusEnum.DISABLE.getKey()); + + String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.like(MtInvoice::getMobile, mobile); + } + String orderSn = paginationRequest.getSearchParams().get("orderSn") == null ? "" : paginationRequest.getSearchParams().get("orderSn").toString(); + if (StringUtils.isNotBlank(orderSn)) { + lambdaQueryWrapper.like(MtInvoice::getOrderSn, orderSn); + } + String title = paginationRequest.getSearchParams().get("title") == null ? "" : paginationRequest.getSearchParams().get("title").toString(); + if (StringUtils.isNotBlank(title)) { + lambdaQueryWrapper.like(MtInvoice::getTitle, title); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtInvoice::getStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtInvoice::getMerchantId, merchantId); + } + + lambdaQueryWrapper.orderByAsc(MtInvoice::getId); + List dataList = mtInvoiceMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtInvoice.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加发票 + * + * @param invoice 发票信息 + * @return + */ + @Override + @OperationServiceLog(description = "新增发票") + public MtInvoice addInvoice(InvoiceParam invoice) throws BusinessCheckException { + MtInvoice mtInvoice = new MtInvoice(); + if ((invoice.getOrderId() == null || invoice.getOrderId() <= 0) && StringUtil.isBlank(invoice.getOrderSn())) { + throw new BusinessCheckException("新增发票数据失败,订单参数不能为空"); + } + MtOrder order; + if (invoice.getOrderId() != null) { + order = orderService.getOrderInfo(invoice.getOrderId()); + } else { + order = orderService.getOrderInfoByOrderSn(invoice.getOrderSn()); + } + if (order == null) { + throw new BusinessCheckException("新增发票数据失败,订单信息不存在"); + } + + BeanUtils.copyProperties(invoice, mtInvoice); + Date nowTime = new Date(); + mtInvoice.setStatus(StatusEnum.ENABLED.getKey()); + mtInvoice.setUpdateTime(nowTime); + mtInvoice.setCreateTime(nowTime); + mtInvoice.setMerchantId(order.getMerchantId()); + mtInvoice.setStoreId(order.getStoreId()); + Integer id = mtInvoiceMapper.insert(mtInvoice); + if (id > 0) { + return mtInvoice; + } else { + logger.error("新增发票数据失败."); + throw new BusinessCheckException("新增发票数据失败"); + } + } + + /** + * 根据ID获取发票取息 + * + * @param id 发票ID + * @return + */ + @Override + public MtInvoice queryInvoiceById(Integer id) { + return mtInvoiceMapper.selectById(id); + } + + /** + * 根据ID删除发票 + * + * @param id 发票ID + * @param operator 操作人 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除发票") + public void deleteInvoice(Integer id, String operator) { + MtInvoice mtInvoice = queryInvoiceById(id); + if (null == mtInvoice) { + return; + } + mtInvoice.setStatus(StatusEnum.DISABLE.getKey()); + mtInvoice.setUpdateTime(new Date()); + mtInvoice.setOperator(operator); + mtInvoiceMapper.updateById(mtInvoice); + logger.info("删除发票信息"); + } + + /** + * 修改发票数据 + * + * @param invoice + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新发票") + public MtInvoice updateInvoice(InvoiceParam invoice) throws BusinessCheckException { + MtInvoice mtInvoice = queryInvoiceById(invoice.getId()); + if (mtInvoice == null) { + throw new BusinessCheckException("该发票状态异常"); + } + BeanUtils.copyProperties(invoice, mtInvoice); + mtInvoice.setUpdateTime(new Date()); + mtInvoiceMapper.updateById(mtInvoice); + return mtInvoice; + } + + /** + * 根据条件搜索发票 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + @Override + public List queryInvoiceListByParams(Map params) { + String orderSn = params.get("orderSn") == null ? "" : params.get("orderSn").toString(); + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey() : params.get("status").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtInvoice::getStatus, status); + } + if (StringUtils.isNotBlank(orderSn)) { + lambdaQueryWrapper.eq(MtInvoice::getOrderSn, orderSn); + } + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtInvoice::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtInvoice::getStoreId, 0) + .or() + .eq(MtInvoice::getStoreId, storeId)); + } + + lambdaQueryWrapper.orderByAsc(MtInvoice::getId); + List dataList = mtInvoiceMapper.selectList(lambdaQueryWrapper); + return dataList; + } + + /** + * 获取开票金额 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + */ + @Override + public BigDecimal getInvoiceTotalAmount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) { + return mtInvoiceMapper.getInvoiceTotalAmount(merchantId, storeId, beginTime, endTime); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/MemberGroupServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/MemberGroupServiceImpl.java new file mode 100644 index 0000000..32dd9d9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/MemberGroupServiceImpl.java @@ -0,0 +1,265 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.MemberGroupDto; +import com.fuint.common.dto.UserGroupDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtUserGroupMapper; +import com.fuint.repository.model.*; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.lang.String; +import java.util.*; + +/** + * 会员分组业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class MemberGroupServiceImpl extends ServiceImpl implements MemberGroupService { + + private static final Logger logger = LoggerFactory.getLogger(CouponGroupServiceImpl.class); + + private MtUserGroupMapper mtUserGroupMapper; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 分页查询会员分组列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryMemberGroupListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtUserGroup::getStatus, StatusEnum.DISABLE.getKey()); + lambdaQueryWrapper.eq(MtUserGroup::getParentId, 0); + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtUserGroup::getName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtUserGroup::getStatus, status); + } + String id = paginationRequest.getSearchParams().get("id") == null ? "" : paginationRequest.getSearchParams().get("id").toString(); + if (StringUtils.isNotBlank(id)) { + lambdaQueryWrapper.eq(MtUserGroup::getId, id); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtUserGroup::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtUserGroup::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByDesc(MtUserGroup::getId); + List dataList = mtUserGroupMapper.selectList(lambdaQueryWrapper); + List userGroupList = new ArrayList<>(); + if (dataList != null && dataList.size() > 0) { + for (MtUserGroup mtUserGroup : dataList) { + UserGroupDto userGroupDto = new UserGroupDto(); + BeanUtils.copyProperties(mtUserGroup, userGroupDto); + userGroupDto.setChildren(getChildren(mtUserGroup.getId())); + userGroupDto.setMemberNum(getMemberNum(mtUserGroup.getId())); + userGroupList.add(userGroupDto); + } + } + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, UserGroupDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(userGroupList); + + return paginationResponse; + } + + /** + * 添加会员分组 + * + * @param memberGroupDto 会员分组 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "新增会员分组") + public MtUserGroup addMemberGroup(MemberGroupDto memberGroupDto) throws BusinessCheckException { + MtUserGroup userGroup = new MtUserGroup(); + Integer storeId = memberGroupDto.getStoreId() == null ? 0 : memberGroupDto.getStoreId(); + if (memberGroupDto.getMerchantId() == null || memberGroupDto.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + memberGroupDto.setMerchantId(mtStore.getMerchantId()); + } + } + userGroup.setMerchantId(memberGroupDto.getMerchantId()); + userGroup.setStoreId(storeId); + userGroup.setParentId(memberGroupDto.getParentId()); + userGroup.setName(CommonUtil.replaceXSS(memberGroupDto.getName())); + userGroup.setDescription(CommonUtil.replaceXSS(memberGroupDto.getDescription())); + userGroup.setStatus(StatusEnum.ENABLED.getKey()); + userGroup.setCreateTime(new Date()); + userGroup.setUpdateTime(new Date()); + userGroup.setOperator(memberGroupDto.getOperator()); + this.save(userGroup); + return userGroup; + } + + /** + * 根据分组ID获取分组信息 + * + * @param id 分组ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtUserGroup queryMemberGroupById(Integer id) { + return mtUserGroupMapper.selectById(id); + } + + /** + * 根据ID删除会员分组 + * + * @param id 分组ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除会员分组") + public void deleteMemberGroup(Integer id, String operator) { + MtUserGroup userGroup = queryMemberGroupById(id); + if (null == userGroup) { + return; + } + + userGroup.setStatus(StatusEnum.DISABLE.getKey()); + userGroup.setUpdateTime(new Date()); + userGroup.setOperator(operator); + + this.updateById(userGroup); + } + + /** + * 修改会员分组 + * + * @param memberGroupDto + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新会员分组") + public MtUserGroup updateMemberGroup(MemberGroupDto memberGroupDto) throws BusinessCheckException { + MtUserGroup userGroup = queryMemberGroupById(memberGroupDto.getId()); + if (null == userGroup || StatusEnum.DISABLE.getKey().equalsIgnoreCase(userGroup.getStatus())) { + logger.error("该分组不存在或已被删除"); + throw new BusinessCheckException("该分组不存在或已被删除"); + } + if (memberGroupDto.getName() != null) { + userGroup.setName(CommonUtil.replaceXSS(memberGroupDto.getName())); + } + if (memberGroupDto.getDescription() != null) { + userGroup.setDescription(CommonUtil.replaceXSS(memberGroupDto.getDescription())); + } + if (memberGroupDto.getStatus() != null) { + userGroup.setStatus(memberGroupDto.getStatus()); + } + + userGroup.setUpdateTime(new Date()); + userGroup.setOperator(memberGroupDto.getOperator()); + this.updateById(userGroup); + return userGroup; + } + + /** + * 获取会员分组子类 + * + * @param groupId 分组ID + * @return + * */ + public List getChildren(Integer groupId) { + Map param = new HashMap<>(); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + param.put("PARENT_ID", groupId); + List dataList = mtUserGroupMapper.selectByMap(param); + List children = new ArrayList<>(); + if (dataList != null && dataList.size() > 0) { + for (MtUserGroup userGroup : dataList) { + UserGroupDto userGroupDto = new UserGroupDto(); + BeanUtils.copyProperties(userGroup, userGroupDto); + userGroupDto.setChildren(getChildren(userGroup.getId())); + userGroupDto.setMemberNum(getMemberNum(userGroup.getId())); + children.add(userGroupDto); + } + } + return children; + } + + /** + * 获取分组会员数量 + * + * @param groupId 分组ID + * @return + * */ + public Long getMemberNum(Integer groupId) { + List groupIds = getGroupIds(groupId); + Long totalMember = mtUserGroupMapper.getMemberNum(groupIds); + return totalMember; + } + + /** + * 获取会员分组子类ID + * + * @param groupId 分组ID + * @return + * */ + public List getGroupIds(Integer groupId) { + Map param = new HashMap<>(); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + param.put("PARENT_ID", groupId); + List dataList = mtUserGroupMapper.selectByMap(param); + List groupIds = new ArrayList<>(); + groupIds.add(groupId); + if (dataList != null && dataList.size() > 0) { + for (MtUserGroup userGroup : dataList) { + groupIds.add(userGroup.getId()); + List childrenIds = getGroupIds(userGroup.getId()); + if (childrenIds.size() > 0) { + groupIds.addAll(childrenIds); + } + } + } + return groupIds; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/MemberServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/MemberServiceImpl.java new file mode 100644 index 0000000..ca14924 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/MemberServiceImpl.java @@ -0,0 +1,1137 @@ +package com.fuint.common.service.impl; + +import com.alibaba.fastjson.JSONObject; +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.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.GroupMemberDto; +import com.fuint.common.dto.MemberTopDto; +import com.fuint.common.dto.UserDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.MemberPage; +import com.fuint.common.service.*; +import com.fuint.common.util.*; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.bean.MemberTopBean; +import com.fuint.repository.mapper.MtUserActionMapper; +import com.fuint.repository.mapper.MtUserGradeMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.math.BigDecimal; +import java.text.ParseException; +import java.util.*; + +/** + * 会员业务接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class MemberServiceImpl extends ServiceImpl implements MemberService { + + private static final Logger logger = LoggerFactory.getLogger(MemberServiceImpl.class); + + private MtUserMapper mtUserMapper; + + private MtUserGradeMapper mtUserGradeMapper; + + private MtUserActionMapper mtUserActionMapper; + + /** + * 短信发送接口 + */ + private SendSmsService sendSmsService; + + /** + * 会员等级接口 + * */ + private UserGradeService userGradeService; + + /** + * 会员等级接口 + * */ + private OpenGiftService openGiftService; + + /** + * 后台账户服务接口 + */ + private AccountService accountService; + + /** + * 员工接口 + */ + private StaffService staffService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 会员行为接口 + */ + private UserActionService userActionService; + + /** + * 系统配置服务接口 + * */ + private SettingService settingService; + + /** + * 分佣提成关系服务接口 + * */ + private CommissionRelationService commissionRelationService; + + /** + * 更新活跃时间 + * @param userId 会员ID + * @param ip IP地址 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateActiveTime(Integer userId, String ip) throws BusinessCheckException { + MtUser mtUser = queryMemberById(userId); + if (mtUser != null) { + if (!mtUser.getStatus().equals(StatusEnum.ENABLED.getKey())) { + return false; + } + if (StringUtil.isEmpty(mtUser.getIp())) { + mtUser.setIp(ip); + mtUserMapper.updateById(mtUser); + } + Date lastUpdateTime = mtUser.getUpdateTime(); + Date registerTime = mtUser.getCreateTime(); + if (lastUpdateTime != null) { + Long timestampLast = Long.valueOf(TimeUtils.date2timeStamp(lastUpdateTime)); + Long timestampNow = System.currentTimeMillis() / 1000; + Long minute = timestampNow - timestampLast; + + // 5分钟更新一次 + if (minute >= 300 || registerTime.equals(lastUpdateTime)) { + synchronized(MemberServiceImpl.class) { + Date activeTime = new Date(); + mtUserMapper.updateActiveTime(mtUser.getId(), activeTime); + // 记录会员行为 + MtUserAction mtUserAction = new MtUserAction(); + mtUserAction.setUserId(mtUser.getId()); + mtUserAction.setStoreId(mtUser.getStoreId()); + mtUserAction.setMerchantId(mtUser.getMerchantId()); + mtUserAction.setParam(TimeUtils.formatDate(activeTime, "yyyy-MM-dd HH:mm:ss")); + mtUserAction.setAction(UserActionEnum.LOGIN.getKey()); + mtUserAction.setDescription(UserActionEnum.LOGIN.getValue()); + userActionService.addUserAction(mtUserAction); + } + } + } + } + + return true; + } + + /** + * 获取当前操作会员信息 + * + * @param userId 会员ID + * @param token 登录token + * @return + * */ + @Override + public MtUser getCurrentUserInfo(HttpServletRequest request, Integer userId, String token) throws BusinessCheckException { + MtUser mtUser = null; + + // 没有会员信息,则查询是否是后台收银员下单 + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo != null) { + // 输入了会员ID就用会员的账号下单,否则用员工账号下单 + if (userId != null && userId > 0) { + mtUser = queryMemberById(userId); + } else { + Integer accountId = accountInfo.getId(); + TAccount account = accountService.getAccountInfoById(accountId); + if (account != null) { + if (account.getStaffId() > 0) { + MtStaff staff = staffService.queryStaffById(account.getStaffId()); + if (staff != null) { + mtUser = queryMemberById(staff.getUserId()); + if (mtUser != null) { + if (staff.getStoreId() != null && staff.getStoreId() > 0) { + mtUser.setStoreId(staff.getStoreId()); + } + if (account.getMerchantId() != null && account.getMerchantId() > 0 && !account.getMerchantId().equals(mtUser.getMerchantId())) { + mtUser.setMerchantId(account.getMerchantId()); + } + mtUser.setUpdateTime(new Date()); + updateById(mtUser); + } + } + } + } + } + } + return mtUser; + } + + /** + * 分页查询会员列表 + * + * @param memberPage + * @return + */ + @Override + public PaginationResponse queryMemberListByPagination(MemberPage memberPage) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(memberPage.getPage(), memberPage.getPageSize()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.ne(MtUser::getStatus, StatusEnum.DISABLE.getKey()); + wrapper.eq(MtUser::getIsStaff, YesOrNoEnum.NO.getKey()); + String name = memberPage.getName(); + if (StringUtils.isNotBlank(name)) { + wrapper.like(MtUser::getName, name); + } + Integer userId = memberPage.getId(); + if (userId != null && userId > 0) { + wrapper.eq(MtUser::getId, userId); + } + String keyword = memberPage.getKeyword(); + if (StringUtils.isNotBlank(keyword)) { + wrapper.and(wq -> wq + .eq(MtUser::getMobile, keyword) + .or() + .eq(MtUser::getUserNo, keyword) + .or() + .eq(MtUser::getName, keyword)); + } + String mobile = memberPage.getMobile(); + if (StringUtils.isNotBlank(mobile)) { + wrapper.like(MtUser::getMobile, mobile); + } + String birthday = memberPage.getBirthday(); + if (StringUtils.isNotBlank(birthday)) { + wrapper.like(MtUser::getBirthday, birthday); + } + String userNo = memberPage.getUserNo(); + if (StringUtils.isNotBlank(userNo)) { + wrapper.eq(MtUser::getUserNo, userNo); + } + Integer gradeId = memberPage.getGradeId(); + if (gradeId != null && gradeId > 0) { + wrapper.eq(MtUser::getGradeId, gradeId); + } + Integer merchantId = memberPage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + wrapper.eq(MtUser::getMerchantId, merchantId); + } + Integer storeId = memberPage.getStoreId(); + if (storeId != null && storeId > 0) { + wrapper.eq(MtUser::getStoreId, storeId); + } + String storeIds = memberPage.getStoreIds(); + if (StringUtils.isNotBlank(storeIds)) { + List idList = Arrays.asList(storeIds.split(",")); + if (idList.size() > 0) { + wrapper.in(MtUser::getStoreId, idList); + } + } + String groupIds = memberPage.getGroupIds(); + if (StringUtils.isNotBlank(groupIds)) { + List idList = Arrays.asList(groupIds.split(",")); + if (idList.size() > 0) { + wrapper.in(MtUser::getGroupId, idList); + } + } + String status = memberPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + wrapper.eq(MtUser::getStatus, status); + } + // 注册开始、结束时间 + String startTime = memberPage.getStartTime(); + String endTime = memberPage.getEndTime(); + if (StringUtil.isNotEmpty(startTime)) { + wrapper.ge(MtUser::getCreateTime, startTime); + } + if (StringUtil.isNotEmpty(endTime)) { + wrapper.le(MtUser::getCreateTime, endTime); + } + // 注册时间 + String regTime = memberPage.getRegTime(); + if (StringUtil.isNotEmpty(regTime)) { + String[] dateTime = regTime.split("~"); + if (dateTime.length == 2) { + wrapper.ge(MtUser::getCreateTime, dateTime[0]); + wrapper.le(MtUser::getCreateTime, dateTime[1]); + } + } + // 活跃时间 + String activeTime = memberPage.getActiveTime(); + if (StringUtil.isNotEmpty(activeTime)) { + String[] dateTime = activeTime.split("~"); + if (dateTime.length == 2) { + wrapper.ge(MtUser::getUpdateTime, dateTime[0]); + wrapper.le(MtUser::getUpdateTime, dateTime[1]); + } + } + // 会员有效期 + String memberTime = memberPage.getMemberTime(); + if (StringUtil.isNotEmpty(memberTime)) { + String[] dateTime = memberTime.split("~"); + if (dateTime.length == 2) { + wrapper.ge(MtUser::getStartTime, dateTime[0]); + wrapper.le(MtUser::getEndTime, dateTime[1]); + } + } + wrapper.orderByDesc(MtUser::getUpdateTime); + List userList = mtUserMapper.selectList(wrapper); + List dataList = new ArrayList<>(); + for (MtUser mtUser : userList) { + UserDto userDto = new UserDto(); + BeanUtils.copyProperties(mtUser, userDto); + userDto.setMobile(CommonUtil.hidePhone(mtUser.getMobile())); + if (userDto.getStoreId() != null && userDto.getStoreId() > 0) { + MtStore mtStore = storeService.queryStoreById(userDto.getStoreId()); + if (mtStore != null) { + userDto.setStoreName(mtStore.getName()); + } + } + if (userDto.getGradeId() != null) { + Integer mchId = merchantId != null ? merchantId : 0; + MtUserGrade mtGrade = userGradeService.queryUserGradeById(mchId, userDto.getGradeId(), mtUser.getId()); + if (mtGrade != null) { + userDto.setGradeName(mtGrade.getName()); + } + } + if (mtUser.getUserNo() == null || StringUtil.isEmpty(mtUser.getUserNo())) { + mtUser.setUserNo(CommonUtil.createUserNo()); + updateById(mtUser); + } + userDto.setLastLoginTime(TimeUtil.showTime(new Date(), mtUser.getUpdateTime())); + dataList.add(userDto); + } + + PageRequest pageRequest = PageRequest.of(memberPage.getPage(), memberPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, UserDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加会员 + * + * @param mtUser 会员信息 + * @param shareId 分享用户ID + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "新增会员信息") + public MtUser addMember(MtUser mtUser, String shareId) throws BusinessCheckException { + // 用户名就是手机号 + if (StringUtil.isNotEmpty(mtUser.getName()) && StringUtil.isEmpty(mtUser.getMobile()) && PhoneFormatCheckUtils.isChinaPhoneLegal(mtUser.getName())) { + mtUser.setMobile(mtUser.getName()); + String name = mtUser.getName().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"); + mtUser.setName(name); + } + + // 手机号已存在 + if (StringUtil.isNotEmpty(mtUser.getMobile())) { + MtUser userInfo = queryMemberByMobile(mtUser.getMerchantId(), mtUser.getMobile()); + if (userInfo != null) { + return userInfo; + } + } + + String userNo = CommonUtil.createUserNo(); + if (StringUtil.isNotEmpty(mtUser.getUserNo())) { + userNo = mtUser.getUserNo(); + } + // 会员名称已存在 + List userList = mtUserMapper.queryMemberByName(mtUser.getMerchantId(), mtUser.getName()); + if (userList.size() > 0) { + mtUser.setName(userNo); + } + // 默认会员等级 + if (mtUser.getGradeId() == null || mtUser.getGradeId() <= 0) { + MtUserGrade grade = userGradeService.getInitUserGrade(mtUser.getMerchantId()); + if (grade != null) { + mtUser.setGradeId(grade.getId()); + } + } + mtUser.setUserNo(userNo); + if (mtUser.getBalance() == null) { + mtUser.setBalance(new BigDecimal(0)); + } + if (mtUser.getPoint() == null || mtUser.getPoint() < 1) { + mtUser.setPoint(0); + } + if (StringUtil.isEmpty(mtUser.getIdcard())) { + mtUser.setIdcard(""); + } + mtUser.setSex(mtUser.getSex()); + mtUser.setStatus(StatusEnum.ENABLED.getKey()); + Date time = new Date(); + mtUser.setCreateTime(time); + mtUser.setUpdateTime(time); + mtUser.setStartTime(mtUser.getStartTime()); + mtUser.setEndTime(mtUser.getEndTime()); + if (mtUser.getIsStaff() == null) { + mtUser.setIsStaff(YesOrNoEnum.NO.getKey()); + } + if (mtUser.getStoreId() != null && mtUser.getStoreId() > 0) { + mtUser.setStoreId(mtUser.getStoreId()); + } else { + List stores = storeService.getMyStoreList(mtUser.getMerchantId(), 0, StatusEnum.ENABLED.getKey()); + if (stores != null && stores.size() > 0) { + mtUser.setStoreId(stores.get(0).getId()); + } + } + // 密码加密 + if (mtUser.getPassword() != null && StringUtil.isNotEmpty(mtUser.getPassword())) { + String salt = SeqUtil.getRandomLetter(4); + mtUser.setSalt(salt); + String password = enCodePassword(mtUser.getPassword(), salt); + mtUser.setPassword(password); + mtUser.setSource(MemberSourceEnum.REGISTER_BY_ACCOUNT.getKey()); + } + if (mtUser.getSource() == null || StringUtil.isEmpty(mtUser.getSource())) { + mtUser.setSource(MemberSourceEnum.BACKEND_ADD.getKey()); + } + + boolean result = save(mtUser); + if (!result) { + return null; + } + + mtUser = queryMemberById(mtUser.getId()); + + // 开卡赠礼 + openGiftService.openGift(mtUser.getId(), mtUser.getGradeId(), true); + + // 分佣关系 + commissionRelationService.setCommissionRelation(mtUser, shareId); + + // 新增用户发短信通知 + if (mtUser.getId() > 0 && mtUser.getStatus().equals(StatusEnum.ENABLED.getKey())) { + // 发送短信 + List mobileList = new ArrayList<>(); + mobileList.add(mtUser.getMobile()); + // 短信模板 + try { + Map params = new HashMap<>(); + sendSmsService.sendSms(mtUser.getMerchantId(), "register-sms", mobileList, params); + } catch (BusinessCheckException e) { + logger.error(e.getMessage()); + } + } + + return mtUser; + } + + /** + * 更新会员信息 + * + * @param mtUser 会员信息 + * @param modifyPassword 修改密码 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改会员信息") + public MtUser updateMember(MtUser mtUser, boolean modifyPassword) throws BusinessCheckException { + mtUser.setUpdateTime(new Date()); + + MtUser oldUserInfo = mtUserMapper.selectById(mtUser.getId()); + String mobile = mtUser.getMobile(); + if (PhoneFormatCheckUtils.isChinaPhoneLegal(mobile)) { + mtUserMapper.resetMobile(mtUser.getMerchantId(), mobile, mtUser.getId()); + mtUser.setMobile(mobile); + } else { + mtUser.setMobile(oldUserInfo.getMobile()); + } + + // 检查会员号是否重复 + if (StringUtil.isNotEmpty(mtUser.getUserNo())) { + List userList = mtUserMapper.findMembersByUserNo(mtUser.getMerchantId(), mtUser.getUserNo()); + if (userList.size() > 0) { + for(MtUser user: userList) { + MtUser userInfo = user; + if (userInfo.getId().intValue() != mtUser.getId().intValue()) { + throw new BusinessCheckException("该会员号与会员ID等于" + userInfo.getId() + "重复啦"); + } + } + } + } + if (mtUser.getPassword() != null && modifyPassword) { + String salt = SeqUtil.getRandomLetter(4); + mtUser.setSalt(salt); + mtUser.setPassword(enCodePassword(mtUser.getPassword(), salt)); + } + Integer gradeId = mtUser.getGradeId(); + mtUser.setGradeId(oldUserInfo.getGradeId()); + mtUser.setMerchantId(oldUserInfo.getMerchantId()); + if (mtUser.getStoreId() == null || mtUser.getStoreId() <= 0) { + mtUser.setStoreId(oldUserInfo.getStoreId()); + } + Boolean result = updateById(mtUser); + if (result && mtUser.getGradeId() != null) { + // 修改了会员等级,开卡赠礼 + if (!gradeId.equals(oldUserInfo.getGradeId())) { + openGiftService.openGift(mtUser.getId(), gradeId, false); + } + } + return mtUser; + } + + /** + * 通过手机号新增会员 + * + * @param merchantId 商户ID + * @param mobile 手机号 + * @param shareId 分享用户ID + * @param ip IP地址 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "通过手机号新增会员") + public MtUser addMemberByMobile(Integer merchantId, String mobile, String shareId, String ip) throws BusinessCheckException { + MtUser mtUser = new MtUser(); + mtUser.setUserNo(CommonUtil.createUserNo()); + String nickName = mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"); + mtUser.setName(nickName); + mtUser.setMobile(mobile); + MtUserGrade grade = userGradeService.getInitUserGrade(merchantId); + if (grade != null) { + mtUser.setGradeId(grade.getId()); + } + Date time = new Date(); + mtUser.setCreateTime(time); + mtUser.setUpdateTime(time); + mtUser.setBalance(new BigDecimal(0)); + mtUser.setPoint(0); + mtUser.setDescription("手机号登录自动注册"); + mtUser.setIdcard(""); + mtUser.setStatus(StatusEnum.ENABLED.getKey()); + mtUser.setMerchantId(merchantId); + mtUser.setStoreId(0); + mtUser.setSource(MemberSourceEnum.MOBILE_LOGIN.getKey()); + mtUser.setIp(ip); + mtUser.setIsStaff(YesOrNoEnum.NO.getKey()); + mtUserMapper.insert(mtUser); + mtUser = queryMemberByMobile(merchantId, mobile); + + // 开卡赠礼 + openGiftService.openGift(mtUser.getId(), mtUser.getGradeId(), true); + + // 分佣关系 + commissionRelationService.setCommissionRelation(mtUser, shareId); + + return mtUser; + } + + /** + * 根据手机号获取会员信息 + * + * @param merchantId 商户ID + * @param mobile 手机号 + * @throws BusinessCheckException + * @return + */ + @Override + public MtUser queryMemberByMobile(Integer merchantId, String mobile) { + if (mobile == null || StringUtil.isEmpty(mobile)) { + return null; + } + List mtUser = mtUserMapper.queryMemberByMobile(merchantId, mobile); + if (mtUser.size() > 0) { + return mtUser.get(0); + } else { + return null; + } + } + + /** + * 根据会员号号获取会员信息 + * + * @param merchantId 商户ID + * @param userNo 会员号 + * @return + */ + @Override + public MtUser queryMemberByUserNo(Integer merchantId, String userNo) { + if (userNo == null || StringUtil.isEmpty(userNo)) { + return null; + } + List mtUser = mtUserMapper.findMembersByUserNo(merchantId, userNo); + if (mtUser.size() > 0) { + return mtUser.get(0); + } else { + return null; + } + } + + /** + * 根据会员ID获取会员信息 + * + * @param id 会员ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtUser queryMemberById(Integer id) throws BusinessCheckException { + MtUser mtUser = mtUserMapper.selectById(id); + + if (mtUser != null) { + // 检查会员是否过期,过期就把会员等级置为初始等级 + MtUserGrade initGrade = userGradeService.getInitUserGrade(mtUser.getMerchantId()); + if (initGrade != null) { + Date endTime = mtUser.getEndTime(); + if (endTime != null) { + Date now = new Date(); + if (endTime.before(now)) { + if (!mtUser.getGradeId().equals(initGrade.getId())) { + mtUser.setGradeId(initGrade.getId()); + updateById(mtUser); + } + } + } + // 会员等级为空,就把会员等级置为初始等级 + Integer userGradeId = mtUser.getGradeId(); + if (userGradeId == null && initGrade != null) { + mtUser.setGradeId(initGrade.getId()); + updateById(mtUser); + openGiftService.openGift(mtUser.getId(), initGrade.getId(), false); + } else { + // 会员等级不存在或已禁用、删除,就把会员等级置为初始等级 + MtUserGrade myGrade = userGradeService.queryUserGradeById(mtUser.getMerchantId(), userGradeId, id); + if (myGrade == null || !myGrade.getStatus().equals(StatusEnum.ENABLED.getKey())) { + mtUser.setGradeId(initGrade.getId()); + updateById(mtUser); + } + } + } + if (mtUser.getIsStaff() == null) { + mtUser.setIsStaff(YesOrNoEnum.NO.getKey()); + } + } + return mtUser; + } + + /** + * 根据会员名称获取会员信息 + * + * @param merchantId 商户ID + * @param name 会员名称 + * @throws BusinessCheckException + * @return + */ + @Override + public MtUser queryMemberByName(Integer merchantId, String name) { + if (StringUtil.isNotEmpty(name)) { + List userList = mtUserMapper.queryMemberByName(merchantId, name); + if (userList.size() == 1) { + return userList.get(0); + } + } + return null; + } + + /** + * 根据openId获取会员信息(为空就注册) + * + * @param merchantId 商户ID + * @param openId 微信openId + * @throws BusinessCheckException + * @return + */ + @Override + public MtUser queryMemberByOpenId(Integer merchantId, String openId, JSONObject userInfo) throws BusinessCheckException { + MtUser user = mtUserMapper.queryMemberByOpenId(merchantId, openId); + if (user != null && !user.getStatus().equals(StatusEnum.ENABLED.getKey())) { + return null; + } + + String avatar = StringUtil.isNotEmpty(userInfo.getString("avatarUrl")) ? userInfo.getString("avatarUrl") : ""; + String gender = StringUtil.isNotEmpty(userInfo.getString("gender")) ? userInfo.getString("gender") : GenderEnum.MAN.getKey().toString(); + String country = StringUtil.isNotEmpty(userInfo.getString("country")) ? userInfo.getString("country") : ""; + String province = StringUtil.isNotEmpty(userInfo.getString("province")) ? userInfo.getString("province") : ""; + String city = StringUtil.isNotEmpty(userInfo.getString("city")) ? userInfo.getString("city") : ""; + String storeId = StringUtil.isNotEmpty(userInfo.getString("storeId")) ? userInfo.getString("storeId") : "0"; + String nickName = StringUtil.isNotEmpty(userInfo.getString("nickName")) ? userInfo.getString("nickName") : ""; + String mobile = StringUtil.isNotEmpty(userInfo.getString("phone")) ? userInfo.getString("phone") : ""; + String shareId = StringUtil.isNotEmpty(userInfo.getString("shareId")) ? userInfo.getString("shareId") : "0"; + String source = StringUtil.isNotEmpty(userInfo.getString("source")) ? userInfo.getString("source") : MemberSourceEnum.WECHAT_LOGIN.getKey(); + String platform = StringUtil.isNotEmpty(userInfo.getString("platform")) ? userInfo.getString("platform") : ""; + String ip = StringUtil.isNotEmpty(userInfo.getString("ip")) ? userInfo.getString("ip") : ""; + + // 需要手机号登录 + if (StringUtil.isEmpty(mobile) && user == null && !platform.equals(PlatformTypeEnum.H5.getCode())) { + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.USER.getKey(), UserSettingEnum.LOGIN_NEED_PHONE.getKey()); + if (mtSetting != null) { + if (mtSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) { + MtUser tempUser = new MtUser(); + tempUser.setOpenId(openId); + tempUser.setId(0); + return tempUser; + } + } + } + + // 手机号已经存在 + if (StringUtil.isNotEmpty(mobile) && user == null) { + user = queryMemberByMobile(merchantId, mobile); + if (user != null) { + user.setOpenId(openId); + } + } + + if (user == null) { + MtUser mtUser = new MtUser(); + if (StringUtil.isNotEmpty(mobile)) { + MtUser mtUserMobile = queryMemberByMobile(merchantId, mobile); + if (mtUserMobile != null) { + mtUser = mtUserMobile; + } + } + + // 昵称为空,用手机号 + if (StringUtil.isEmpty(nickName) && StringUtil.isNotEmpty(mobile)) { + nickName = mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"); + } + mtUser.setMerchantId(merchantId); + String userNo = CommonUtil.createUserNo(); + mobile = CommonUtil.replaceXSS(mobile); + avatar = CommonUtil.replaceXSS(avatar); + nickName = CommonUtil.replaceXSS(nickName); + mtUser.setUserNo(userNo); + mtUser.setMobile(mobile); + mtUser.setAvatar(avatar); + if (StringUtil.isNotEmpty(nickName)) { + mtUser.setName(nickName); + } else { + mtUser.setName(userNo); + } + mtUser.setOpenId(openId); + MtUserGrade grade = userGradeService.getInitUserGrade(merchantId); + if (grade != null) { + mtUser.setGradeId(grade.getId()); + } + Date time = new Date(); + mtUser.setUpdateTime(time); + mtUser.setBalance(new BigDecimal(0)); + mtUser.setPoint(0); + mtUser.setDescription("微信登录自动注册"); + mtUser.setIdcard(""); + mtUser.setStatus(StatusEnum.ENABLED.getKey()); + mtUser.setAddress(country + province + city); + // 微信用户 1:男;2:女 0:未知 + if (gender.equals(GenderEnum.FEMALE.getKey().toString())) { + gender = GenderEnum.UNKNOWN.getKey().toString(); + } else if (gender.equals(GenderEnum.UNKNOWN.getKey().toString())) { + gender = GenderEnum.FEMALE.getKey().toString(); + } + mtUser.setSex(Integer.parseInt(gender)); + if (StringUtil.isNotEmpty(storeId)) { + mtUser.setStoreId(Integer.parseInt(storeId)); + } else { + mtUser.setStoreId(0); + } + mtUser.setSource(source); + if (mtUser.getId() == null || mtUser.getId() <= 0) { + mtUser.setCreateTime(time); + mtUser.setIp(ip); + save(mtUser); + } else { + updateById(mtUser); + } + user = mtUserMapper.queryMemberByOpenId(merchantId, openId); + + // 开卡赠礼 + openGiftService.openGift(user.getId(), user.getGradeId(), true); + + // 分佣关系 + commissionRelationService.setCommissionRelation(mtUser, shareId); + } else { + // 已被禁用 + if (user.getStatus().equals(StatusEnum.DISABLE.getKey())) { + return null; + } + // 补充手机号 + if (StringUtil.isNotEmpty(mobile) && PhoneFormatCheckUtils.isChinaPhoneLegal(mobile)) { + user.setMobile(mobile); + updateById(user); + } + // 补充会员号 + if (StringUtil.isEmpty(user.getUserNo())) { + user.setUserNo(CommonUtil.createUserNo()); + updateById(user); + } + } + + return user; + } + + /** + * 根据等级ID获取会员等级信息 + * + * @param id 等级ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtUserGrade queryMemberGradeByGradeId(Integer id) { + return mtUserGradeMapper.selectById(id); + } + + /** + * 删除会员 + * + * @param id 会员ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除会员信息") + public Integer deleteMember(Integer id, String operator) throws BusinessCheckException { + MtUser mtUser = mtUserMapper.selectById(id); + if (null == mtUser) { + throw new BusinessCheckException("该会员不存在,请确认"); + } + // 是否是店铺员工 + MtStaff mtStaff = staffService.queryStaffByUserId(id); + if (mtStaff != null && mtStaff.getAuditedStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("该会员已关联店铺员工”"+ mtStaff.getRealName()+"“,若要删除请先删除该员工信息"); + } + mtUser.setStatus(StatusEnum.DISABLE.getKey()); + mtUser.setUpdateTime(new Date()); + mtUser.setOperator(operator); + updateById(mtUser); + return mtUser.getId(); + } + + /** + * 根据条件搜索会员分组 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryMemberGradeByParams(Map params) { + if (params == null) { + params = new HashMap<>(); + } + return mtUserGradeMapper.selectByMap(params); + } + + /** + * 获取会员数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + @Override + public Long getUserCount(Integer merchantId, Integer storeId) { + if (storeId != null && storeId > 0) { + return mtUserMapper.getStoreUserCount(storeId); + } else { + return mtUserMapper.getUserCount(merchantId); + } + } + + /** + * 获取会员数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public Long getUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) { + if (storeId != null && storeId > 0) { + return mtUserMapper.getStoreUserCountByTime(storeId, beginTime, endTime); + } else { + return mtUserMapper.getUserCountByTime(merchantId, beginTime, endTime); + } + } + + /** + * 获取会员数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public Long getActiveUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) { + if (storeId != null && storeId > 0) { + return mtUserActionMapper.getStoreActiveUserCount(storeId, beginTime, endTime); + } else { + return mtUserActionMapper.getActiveUserCount(merchantId, beginTime, endTime); + } + } + + /** + * 重置手机号 + * + * @param mobile 手机号码 + * @param userId 会员ID + * @return + */ + @Override + public void resetMobile(String mobile, Integer userId) { + if (mobile == null || StringUtil.isEmpty(mobile)) { + return; + } + MtUser mtUser = mtUserMapper.selectById(userId); + if (mtUser != null) { + mtUserMapper.resetMobile(mtUser.getMerchantId(), mobile, userId); + } + } + + /** + * 获取会员消费排行榜 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public List getMemberConsumeTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime) { + List memberList = mtUserMapper.getMemberConsumeTopList(merchantId, storeId, startTime, endTime); + List dataList = new ArrayList<>(); + if (memberList != null && memberList.size() > 0) { + for (MemberTopBean bean : memberList) { + MemberTopDto dto = new MemberTopDto(); + BeanUtils.copyProperties(bean, dto); + dataList.add(dto); + } + } + return dataList; + } + + /** + * 查找会员列表 + * + * @param merchantId 商户ID + * @param keyword 关键字 + * @param groupIds 分组ID + * @param page 当前页码 + * @param pageSize 每页数量 + * @return + * */ + @Override + public List searchMembers(Integer merchantId, String keyword, String groupIds, Integer page, Integer pageSize) { + PageHelper.startPage(page, pageSize); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtUser::getStatus, StatusEnum.DISABLE.getKey()); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtUser::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(groupIds)) { + List idList = Arrays.asList(groupIds.split(",")); + if (idList.size() > 0) { + lambdaQueryWrapper.in(MtUser::getGroupId, idList); + } + } + if (StringUtil.isNotEmpty(keyword)) { + List itemList = Arrays.asList(keyword.split(",")); + lambdaQueryWrapper.and(wq -> wq + .in(MtUser::getUserNo, itemList) + .or() + .in(MtUser::getMobile, itemList)); + } + lambdaQueryWrapper.orderByDesc(MtUser::getUpdateTime); + List userList = mtUserMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (userList != null && userList.size() > 0) { + for (MtUser mtUser : userList) { + GroupMemberDto memberDto = new GroupMemberDto(); + memberDto.setId(mtUser.getId()); + memberDto.setName(mtUser.getName()); + memberDto.setUserNo(mtUser.getUserNo()); + memberDto.setMobile(CommonUtil.hidePhone(mtUser.getMobile())); + dataList.add(memberDto); + } + } + return dataList; + } + + /** + * 查找会员列表 + * + * @param merchantId 商户ID + * @param keyword 关键字 + * @return + * */ + @Override + public List searchMembers(Integer merchantId, String keyword) { + return mtUserMapper.searchMembers(merchantId, keyword); + } + + /** + * 设定安全的密码 + * + * @param password 密码明文 + * @param salt 加密因子 + * @return + */ + @Override + public String enCodePassword(String password, String salt) { + return MD5Util.getMD5(password + salt); + } + + /** + * 获取加密密码 + * + * @param password 密码密文 + * @param salt 加密因子 + * @return + * */ + @Override + public String deCodePassword(String password, String salt) { + return MD5Util.getMD5(password + salt); + } + + /** + * 获取会员ID列表 + * + * @param merchantId 商户号 + * @param storeId 店铺ID + * @return + * */ + @Override + public List getUserIdList(Integer merchantId, Integer storeId) { + return mtUserMapper.getUserIdList(merchantId, storeId); + } + + /** + * 导入会员 + * + * @param file excel文件 + * @param accountInfo 操作者 + * @param filePath 文件路径 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "导入会员列表") + public Boolean importMember(MultipartFile file, AccountInfo accountInfo, String filePath) throws BusinessCheckException, ParseException { + String originalFileName = file.getOriginalFilename(); + boolean isExcel2003 = XlsUtil.isExcel2003(originalFileName); + boolean isExcel2007 = XlsUtil.isExcel2007(originalFileName); + + if (!isExcel2003 && !isExcel2007) { + logger.error("importMember->uploadFile:{}", "文件类型不正确"); + throw new BusinessCheckException("文件类型不正确"); + } + + if (accountInfo == null || accountInfo.getMerchantId() == null || accountInfo.getMerchantId() <= 0) { + throw new BusinessCheckException("没有操作权限"); + } + + List> memberList = new ArrayList<>(); + try { + memberList = XlsUtil.readExcelContent(file.getInputStream(), isExcel2003, 0, 1, null, null, null); + } catch (IOException e) { + logger.error("MemberServiceImpl->parseExcelContent{}", e); + throw new BusinessCheckException("会员导入失败" + e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + + if (memberList != null && memberList.size() > 0) { + if (memberList.size() > 5000) { + throw new BusinessCheckException("会员导入失败,单次导入会员数量不能大于5000"); + } + // 先校验,是否已存在,是否为空,是否重复 + List userList = new ArrayList<>(); + List userGrades = userGradeService.getMerchantGradeList(accountInfo.getMerchantId(), null); + for (int i = 0; i < memberList.size(); i++) { + List userInfo = memberList.get(i); + String username = userInfo.get(0); + String userNo = userInfo.get(1); + Integer sex = userInfo.get(3).equals("男") ? 1 : 0; + MtUser mtUser = new MtUser(); + mtUser.setMerchantId(accountInfo.getMerchantId()); + mtUser.setStoreId(accountInfo.getStoreId()); + mtUser.setName(username); + mtUser.setUserNo(userNo); + mtUser.setIdcard(userInfo.get(2)); + mtUser.setSex(sex); + mtUser.setMobile(userInfo.get(4)); + mtUser.setBirthday(userInfo.get(5)); + mtUser.setDescription(userInfo.get(6)); + mtUser.setCarNo(userInfo.get(7)); + String gradeName = userInfo.get(8); + Integer gradeId = 0; + if (StringUtil.isNotEmpty(gradeName)) { + for (MtUserGrade userGrade : userGrades) { + if (userGrade.getName().equals(gradeName)) { + gradeId = userGrade.getId(); + } + } + } + mtUser.setGradeId(gradeId); + mtUser.setStartTime(new Date()); + String gradeDate = userInfo.get(9); + if (StringUtil.isNotEmpty(gradeDate)) { + mtUser.setEndTime(DateUtil.parseDate(userInfo.get(9))); + } + if (StringUtil.isNotBlank(userInfo.get(10))) { + mtUser.setPoint(Integer.parseInt(userInfo.get(10))); + } else { + mtUser.setPoint(0); + } + if (StringUtil.isNotBlank(userInfo.get(11))) { + mtUser.setBalance(new BigDecimal(userInfo.get(11))); + } + String status = userInfo.get(12).equals("正常") ? StatusEnum.ENABLED.getKey() : StatusEnum.FORBIDDEN.getKey(); + mtUser.setStatus(status); + if (StringUtil.isNotBlank(userInfo.get(13))) { + mtUser.setPassword(userInfo.get(13)); + } + userList.add(mtUser); + } + + for (MtUser mtUser : userList) { + addMember(mtUser, null); + } + } + + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/MerchantServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/MerchantServiceImpl.java new file mode 100644 index 0000000..4b4b9d2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/MerchantServiceImpl.java @@ -0,0 +1,435 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.MerchantDto; +import com.fuint.common.dto.MerchantSettingDto; +import com.fuint.common.dto.StoreDto; +import com.fuint.common.enums.OrderSettingEnum; +import com.fuint.common.enums.SettingTypeEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.service.MerchantService; +import com.fuint.common.service.SettingService; +import com.fuint.common.service.StoreService; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.RegexUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.merchantApi.request.MerchantSettingParam; +import com.fuint.repository.mapper.MtGoodsMapper; +import com.fuint.repository.mapper.MtMerchantMapper; +import com.fuint.repository.mapper.MtStoreMapper; +import com.fuint.repository.model.MtGoods; +import com.fuint.repository.model.MtMerchant; +import com.fuint.repository.model.MtSetting; +import com.fuint.repository.model.MtStore; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 商户业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class MerchantServiceImpl extends ServiceImpl implements MerchantService { + + private static final Logger logger = LoggerFactory.getLogger(MerchantServiceImpl.class); + + private MtMerchantMapper mtMerchantMapper; + + private MtStoreMapper mtStoreMapper; + + private MtGoodsMapper mtGoodsMapper; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 分页查询商户列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryMerchantListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtMerchant::getStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtMerchant::getName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtMerchant::getStatus, status); + } + String id = paginationRequest.getSearchParams().get("id") == null ? "" : paginationRequest.getSearchParams().get("id").toString(); + if (StringUtils.isNotBlank(id)) { + lambdaQueryWrapper.eq(MtMerchant::getId, id); + } + + lambdaQueryWrapper.orderByAsc(MtMerchant::getStatus).orderByDesc(MtMerchant::getId); + List merchantList = mtMerchantMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (merchantList != null && merchantList.size() > 0) { + for (MtMerchant mtMerchant : merchantList) { + MerchantDto merchantDto = new MerchantDto(); + BeanUtils.copyProperties(mtMerchant, merchantDto); + merchantDto.setPhone(CommonUtil.hidePhone(mtMerchant.getPhone())); + dataList.add(merchantDto); + } + } + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtMerchant.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存商户信息 + * + * @param merchant 商户信息 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "保存商户信息") + public MtMerchant saveMerchant(MtMerchant merchant) throws BusinessCheckException { + MtMerchant mtMerchant = queryMerchantByName(merchant.getName()); + if (mtMerchant != null) { + if ((merchant.getId() != null && !merchant.getId().equals(mtMerchant.getId())) || (merchant.getId() == null || merchant.getId() <= 0)) { + throw new BusinessCheckException("该商户名称已经存在"); + } + } + mtMerchant = queryMerchantByNo(merchant.getNo()); + if (mtMerchant != null) { + if ((merchant.getId() != null && !merchant.getId().equals(mtMerchant.getId())) || (merchant.getId() == null || merchant.getId() <= 0)) { + throw new BusinessCheckException("该商户名称已经存在"); + } + } + + mtMerchant = new MtMerchant(); + // 商户号不能含有中文 + if (RegexUtil.containsChinese(merchant.getNo())) { + throw new BusinessCheckException("商户号不能含有中文字符"); + } + + // 编辑商户 + if (merchant.getId() != null) { + mtMerchant = queryMerchantById(merchant.getId()); + } + + if (merchant.getNo() == null || StringUtil.isEmpty(merchant.getNo())) { + mtMerchant.setNo(CommonUtil.createMerchantNo()); + } else { + mtMerchant.setNo(merchant.getNo()); + } + if (merchant.getType() != null) { + mtMerchant.setType(merchant.getType()); + } + mtMerchant.setName(merchant.getName()); + mtMerchant.setLogo(merchant.getLogo()); + mtMerchant.setContact(merchant.getContact()); + mtMerchant.setOperator(merchant.getOperator()); + mtMerchant.setUpdateTime(new Date()); + if (merchant.getId() == null) { + mtMerchant.setCreateTime(new Date()); + } + mtMerchant.setWxAppId(merchant.getWxAppId()); + mtMerchant.setWxAppSecret(merchant.getWxAppSecret()); + mtMerchant.setWxOfficialAppId(merchant.getWxOfficialAppId()); + mtMerchant.setWxOfficialAppSecret(merchant.getWxOfficialAppSecret()); + if (merchant.getSettleRate() != null) { + mtMerchant.setSettleRate(merchant.getSettleRate()); + } + mtMerchant.setDescription(merchant.getDescription()); + mtMerchant.setPhone(merchant.getPhone()); + mtMerchant.setAddress(merchant.getAddress()); + mtMerchant.setStatus(merchant.getStatus()); + + if (mtMerchant.getStatus() == null) { + mtMerchant.setStatus(StatusEnum.ENABLED.getKey()); + } + if (mtMerchant.getId() == null || mtMerchant.getId() < 1) { + this.save(mtMerchant); + } else { + mtMerchantMapper.updateById(mtMerchant); + } + return mtMerchant; + } + + /** + * 根据ID获取商户信息 + * + * @param id 商户ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtMerchant queryMerchantById(Integer id) { + if (id == null || id < 1) { + return null; + } + return mtMerchantMapper.selectById(id); + } + + /** + * 根据名称获取商户信息 + * + * @param name 商户名称 + * @throws BusinessCheckException + * @return + */ + @Override + public MtMerchant queryMerchantByName(String name) { + return mtMerchantMapper.queryMerchantByName(name); + } + + /** + * 根据商户号获取商户信息 + * + * @param merchantNo 商户号 + * @return + */ + @Override + public MtMerchant queryMerchantByNo(String merchantNo) { + return mtMerchantMapper.queryMerchantByNo(merchantNo); + } + + /** + * 根据商户号获取商户ID + * + * @param merchantNo 商户号 + * @return + */ + @Override + public Integer getMerchantId(String merchantNo) { + if (merchantNo == null || StringUtil.isEmpty(merchantNo)) { + return 0; + } + MtMerchant mtMerchant = queryMerchantByNo(merchantNo); + if (mtMerchant != null) { + return mtMerchant.getId(); + } else { + return 0; + } + } + + /** + * 更新商户状态 + * + * @param id 商户ID + * @param operator 操作人 + * @param status 状态 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional + @OperationServiceLog(description = "修改商户状态") + public void updateStatus(Integer id, String operator, String status) throws BusinessCheckException { + MtMerchant mtMerchant = queryMerchantById(id); + if (null == mtMerchant) { + throw new BusinessCheckException("该商户不存在."); + } + + // 如果是删除,检查是否有商品等数据 + if (status.equals(StatusEnum.DISABLE.getKey())) { + // 删除店铺 + storeService.deleteStoreByMerchant(id); + + // 删除商品 + Map params = new HashMap<>(); + params.put("status", StatusEnum.ENABLED.getKey()); + params.put("merchant_id", id); + List goodsList = mtGoodsMapper.selectByMap(params); + if (goodsList != null && goodsList.size() > 0) { + logger.info("删除商户,连同商品一起删除", mtMerchant.getId()); + mtGoodsMapper.removeMerchantGoods(mtMerchant.getId()); + } + } + + mtMerchant.setStatus(status); + mtMerchant.setUpdateTime(new Date()); + mtMerchant.setOperator(operator); + + mtMerchantMapper.updateById(mtMerchant); + } + + /** + * 根据条件查询商户列表 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryMerchantByParams(Map params) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtMerchant::getStatus, StatusEnum.DISABLE.getKey()); + + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtMerchant::getId, merchantId); + } + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + if (StringUtils.isNotBlank(storeId) && StringUtil.isEmpty(merchantId)) { + MtStore mtStore = mtStoreMapper.selectById(storeId); + if (mtStore != null && mtStore.getMerchantId() > 0) { + lambdaQueryWrapper.eq(MtMerchant::getId, mtStore.getMerchantId()); + } + } + String name = params.get("name") == null ? "" : params.get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtMerchant::getName, name); + } + String status = params.get("status") == null ? "" : params.get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtMerchant::getStatus, status); + } + + lambdaQueryWrapper.orderByAsc(MtMerchant::getStatus).orderByDesc(MtMerchant::getId); + return mtMerchantMapper.selectList(lambdaQueryWrapper); + } + + /** + * 查询我的商户列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param status 状态 + * @return + * */ + @Override + public List getMyMerchantList(Integer merchantId, Integer storeId, String status) { + Map param = new HashMap<>(); + if (merchantId != null && merchantId > 0) { + param.put("merchantId", merchantId); + } + if (storeId != null && storeId > 0) { + param.put("storeId", storeId); + } + if (StringUtils.isNotBlank(status)) { + param.put("status", status); + } + return queryMerchantByParams(param); + } + + /** + * 获取商户设置信息 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + @Override + public MerchantSettingDto getMerchantSettingInfo(Integer merchantId, Integer storeId) throws BusinessCheckException { + String name = ""; + Integer id = merchantId; + String contact = ""; + String logo = ""; + String phone = ""; + if (storeId != null && storeId > 0) { + MtStore storeInfo = storeService.queryStoreById(storeId); + if (storeInfo != null) { + id = storeInfo.getId(); + name = storeInfo.getName(); + contact = storeInfo.getContact(); + logo = storeInfo.getLogo(); + phone = storeInfo.getPhone(); + } + } else { + MtMerchant merchantInfo = getById(merchantId); + if (merchantInfo != null) { + name = merchantInfo.getName(); + contact = merchantInfo.getContact(); + logo = merchantInfo.getLogo(); + phone = merchantInfo.getPhone(); + } + } + MtSetting mtSetting = settingService.querySettingByName(merchantId, storeId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.IS_CLOSE.getKey()); + MerchantSettingDto merchantSettingDto = new MerchantSettingDto(); + merchantSettingDto.setName(name); + merchantSettingDto.setId(id); + merchantSettingDto.setContact(contact); + merchantSettingDto.setLogo(logo); + merchantSettingDto.setPhone(phone); + if (mtSetting != null) { + merchantSettingDto.setStatus(mtSetting.getValue()); + } else { + merchantSettingDto.setStatus(YesOrNoEnum.YES.getKey()); + } + return merchantSettingDto; + } + + /** + * 保存商户设置信息 + * + * @param params 商户设置项 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存商户设置信息") + public MerchantSettingDto saveMerchantSetting(MerchantSettingParam params) throws BusinessCheckException { + if (params.getStoreId() != null && params.getStoreId() > 0) { + MtStore storeInfo = storeService.queryStoreById(params.getStoreId()); + if (storeInfo != null) { + StoreDto storeDto = new StoreDto(); + storeDto.setId(storeInfo.getId()); + storeDto.setName(params.getName()); + storeDto.setContact(params.getContact()); + storeDto.setPhone(params.getPhone()); + storeDto.setLogo(params.getLogo()); + storeService.saveStore(storeDto); + } + } else { + MtMerchant merchantInfo = getById(params.getMerchantId()); + if (merchantInfo != null) { + merchantInfo.setName(params.getName()); + merchantInfo.setContact(params.getContact()); + merchantInfo.setPhone(params.getPhone()); + merchantInfo.setLogo(params.getLogo()); + updateById(merchantInfo); + } + } + MtSetting mtSetting = settingService.querySettingByName(params.getMerchantId(), params.getStoreId(), SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.IS_CLOSE.getKey()); + if (mtSetting != null && StringUtil.isNotEmpty(params.getStatus())) { + mtSetting.setValue(params.getStatus()); + settingService.saveSetting(mtSetting); + } + return getMerchantSettingInfo(params.getMerchantId(), params.getStoreId()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/MessageServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..dda0002 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/MessageServiceImpl.java @@ -0,0 +1,133 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.enums.MessageEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.service.MessageService; +import com.fuint.repository.mapper.MtMessageMapper; +import com.fuint.repository.model.MtMessage; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.List; + +/** + * 消息业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class MessageServiceImpl extends ServiceImpl implements MessageService { + + private MtMessageMapper messageRepository; + + /** + * 添加消息 + * + * @param mtMsg 消息参数 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void addMessage(MtMessage mtMsg) { + if (mtMsg.getUserId() < 0 || StringUtil.isEmpty(mtMsg.getContent())) { + return; + } + + mtMsg.setStatus(StatusEnum.ENABLED.getKey()); + mtMsg.setIsRead(YesOrNoEnum.NO.getKey()); + mtMsg.setCreateTime(new Date()); + mtMsg.setUpdateTime(new Date()); + + this.save(mtMsg); + } + + /** + * 将消息置为已读 + * + * @param msgId 消息ID + * @param + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void readMessage(Integer msgId) { + if (msgId < 0) { + return; + } + + MtMessage mtMsg = messageRepository.selectById(msgId); + if (mtMsg == null) { + return; + } + + mtMsg.setIsRead(YesOrNoEnum.YES.getKey()); + mtMsg.setUpdateTime(new Date()); + + messageRepository.updateById(mtMsg); + } + + /** + * 消息置为发送 + * + * @param msgId 消息ID + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void sendMessage(Integer msgId, boolean isRead) { + if (msgId < 0 ) { + return; + } + + MtMessage mtMsg = messageRepository.selectById(msgId); + if (mtMsg == null) { + return; + } + + mtMsg.setIsSend(YesOrNoEnum.YES.getKey()); + + // 订阅消息发送成功就算是已读了 + if (isRead) { + mtMsg.setIsRead(YesOrNoEnum.YES.getKey()); + } else { + mtMsg.setIsRead(YesOrNoEnum.NO.getKey()); + } + + mtMsg.setUpdateTime(new Date()); + + messageRepository.updateById(mtMsg); + } + + /** + * 获取最新一条未读弹框消息 + * + * @param userId 会员ID + * @return + */ + @Override + public MtMessage getOne(Integer userId) { + List messageList = messageRepository.findNewMessage(userId, MessageEnum.POP_MSG.getKey()); + + if (messageList.size() > 0) { + return messageList.get(0); + } + + return null; + } + + /** + * 获取需要发送的消息 + * + * @return + */ + @Override + public List getNeedSendList() { + return messageRepository.findNeedSendMessage(MessageEnum.SUB_MSG.getKey()); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/OpenGiftServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/OpenGiftServiceImpl.java new file mode 100644 index 0000000..ce6f277 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/OpenGiftServiceImpl.java @@ -0,0 +1,365 @@ +package com.fuint.common.service.impl; + +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.fuint.common.Constants; +import com.fuint.common.dto.OpenGiftDto; +import com.fuint.common.enums.MessageEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.param.CouponReceiveParam; +import com.fuint.common.service.*; +import com.fuint.common.util.DateUtil; +import com.fuint.common.util.SeqUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.MtOpenGiftMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.*; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 开卡赠礼接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class OpenGiftServiceImpl extends ServiceImpl implements OpenGiftService { + + private static final Logger logger = LoggerFactory.getLogger(OpenGiftServiceImpl.class); + + private MtOpenGiftMapper mtOpenGiftMapper; + + private MtUserMapper mtUserMapper; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 会员等级服务接口 + * */ + private UserGradeService userGradeService; + + /** + * 会员积分服务接口 + * */ + private PointService pointService; + + /** + * 系统消息服务接口 + * */ + private MessageService messageService; + + /** + * 获取开卡赠礼列表 + * @param paramMap + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject getOpenGiftList(Map paramMap) throws BusinessCheckException { + Integer pageNumber = paramMap.get("pageNumber") == null ? Constants.PAGE_NUMBER : Integer.parseInt(paramMap.get("pageNumber").toString()); + Integer pageSize = paramMap.get("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(paramMap.get("pageSize").toString()); + + Page pageHelper = PageHelper.startPage(pageNumber, pageSize); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtOpenGift::getStatus, StatusEnum.DISABLE.getKey()); + String merchantId = paramMap.get("merchantId") == null ? "" : paramMap.get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtOpenGift::getMerchantId, merchantId); + } + String couponId = paramMap.get("couponId") == null ? "" : paramMap.get("couponId").toString(); + if (StringUtils.isNotBlank(couponId)) { + lambdaQueryWrapper.eq(MtOpenGift::getCouponId, couponId); + } + String gradeId = paramMap.get("gradeId") == null ? "" : paramMap.get("gradeId").toString(); + if (StringUtils.isNotBlank(gradeId)) { + lambdaQueryWrapper.eq(MtOpenGift::getGradeId, Integer.parseInt(gradeId)); + } + String status = paramMap.get("status") == null ? "" : paramMap.get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtOpenGift::getStatus, status); + } + + lambdaQueryWrapper.orderByDesc(MtOpenGift::getId); + List openGiftList = mtOpenGiftMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + for (MtOpenGift item : openGiftList) { + OpenGiftDto dto = dealDetail(item); + dataList.add(dto); + } + + PageRequest pageRequest = PageRequest.of(pageNumber, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, OpenGiftDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return new ResponseObject(200, "", paginationResponse); + } + + /** + * 新增开卡赠礼 + * + * @param mtOpenGift 赠礼信息 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增开卡赠礼") + public MtOpenGift addOpenGift(MtOpenGift mtOpenGift) throws BusinessCheckException { + if (mtOpenGift.getMerchantId() == null || mtOpenGift.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + mtOpenGift.setUpdateTime(new Date()); + mtOpenGift.setCreateTime(new Date()); + if (mtOpenGift.getCouponNum() != null && mtOpenGift.getCouponNum() > 100) { + throw new BusinessCheckException("开卡赠礼卡券数量不能大于100"); + } + + this.save(mtOpenGift); + return mtOpenGift; + } + + /** + * 根据ID获取开卡赠礼详情 + * + * @param id 开卡赠礼ID + * @throws BusinessCheckException + * @return + */ + @Override + public OpenGiftDto getOpenGiftDetail(Integer id) throws BusinessCheckException { + MtOpenGift openGift = mtOpenGiftMapper.selectById(id); + return dealDetail(openGift); + } + + /** + * 根据ID删除数据 + * + * @param id 开卡赠礼ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除开卡赠礼") + public void deleteOpenGift(Integer id, String operator) { + MtOpenGift MtOpenGift = mtOpenGiftMapper.selectById(id); + if (null == MtOpenGift) { + return; + } + + MtOpenGift.setStatus(StatusEnum.DISABLE.getKey()); + MtOpenGift.setUpdateTime(new Date()); + + mtOpenGiftMapper.updateById(MtOpenGift); + } + + /** + * 更新开卡赠礼 + * + * @param reqDto 实体参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新开卡赠礼") + public MtOpenGift updateOpenGift(MtOpenGift reqDto) throws BusinessCheckException { + MtOpenGift mtOpenGift = mtOpenGiftMapper.selectById(reqDto.getId()); + if (mtOpenGift == null) { + throw new BusinessCheckException("该数据状态异常"); + } + + mtOpenGift.setId(reqDto.getId()); + mtOpenGift.setUpdateTime(new Date()); + + if (null != reqDto.getOperator()) { + mtOpenGift.setOperator(reqDto.getOperator()); + } + + if (null != reqDto.getStatus()) { + mtOpenGift.setStatus(reqDto.getStatus()); + } + + if (null != reqDto.getCouponId()) { + mtOpenGift.setCouponId(reqDto.getCouponId()); + } + + if (null != reqDto.getGradeId()) { + mtOpenGift.setGradeId(reqDto.getGradeId()); + } + + if (null != reqDto.getPoint()) { + mtOpenGift.setPoint(reqDto.getPoint()); + } + + if (null != reqDto.getCouponNum()) { + if (reqDto.getCouponNum() > 100) { + throw new BusinessCheckException("开卡赠礼卡券数量不能大于100"); + } + mtOpenGift.setCouponNum(reqDto.getCouponNum()); + } + + mtOpenGiftMapper.updateById(mtOpenGift); + return mtOpenGift; + } + + /** + * 开卡赠礼 + * + * @param userId 会员ID + * @param gradeId 等级ID + * @return + * */ + @Override + public Boolean openGift(Integer userId, Integer gradeId, boolean isNewMember) throws BusinessCheckException { + if (gradeId == null || gradeId.compareTo(0) <= 0) { + return false; + } + MtUser user = mtUserMapper.selectById(userId); + if (user == null) { + throw new BusinessCheckException("会员状态异常"); + } + if (user.getIsStaff().equals(YesOrNoEnum.YES.getKey())) { + return false; + } + if (user.getGradeId() == null) { + user.setGradeId(0); + } + MtUserGrade oldGrade = userGradeService.queryUserGradeById(user.getMerchantId(), user.getGradeId(), user.getId()); + MtUserGrade gradeInfo = userGradeService.queryUserGradeById(user.getMerchantId(), gradeId, user.getId()); + // 设置有效期 + if (gradeInfo.getValidDay() >= 0) { + user.setStartTime(new Date()); + Date endDate = new Date(); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(endDate); + calendar.add(calendar.DATE, gradeInfo.getValidDay()); + endDate = calendar.getTime(); + user.setEndTime(endDate); + if (gradeInfo.getValidDay() == 0) { + user.setStartTime(null); + user.setEndTime(null); + } + } + user.setGradeId(gradeId); + user.setUpdateTime(new Date()); + mtUserMapper.updateById(user); + // 会员往低了改变,没有开卡赠礼 + if (!isNewMember && oldGrade != null && oldGrade.getGrade() >= gradeInfo.getGrade()) { + return false; + } + Map params = new HashMap<>(); + params.put("grade_id", gradeId.toString()); + params.put("status", StatusEnum.ENABLED.getKey()); + params.put("merchant_id", user.getMerchantId()); + List openGiftList = mtOpenGiftMapper.selectByMap(params); + if (openGiftList.size() > 0) { + Integer totalPoint = 0; + BigDecimal totalAmount = new BigDecimal("0"); + for (MtOpenGift item : openGiftList) { + // 加积分 + if (item.getPoint() > 0) { + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setUserId(userId); + reqPointDto.setAmount(item.getPoint()); + reqPointDto.setDescription("开卡赠送"+ item.getPoint() +"积分"); + reqPointDto.setOperator("系统"); + pointService.addPoint(reqPointDto); + totalPoint = totalPoint + item.getPoint(); + } + // 返卡券 + if (item.getCouponId() > 0) { + MtCoupon mtCoupon = couponService.queryCouponById(item.getCouponId()); + if (mtCoupon != null && mtCoupon.getStatus().equals(StatusEnum.ENABLED.getKey())) { + try { + CouponReceiveParam param = new CouponReceiveParam(); + param.setCouponId(item.getCouponId()); + param.setUserId(userId); + param.setNum(item.getCouponNum() == null ? 1 : item.getCouponNum()); + ResponseObject result = couponService.sendCoupon(item.getCouponId(), userId, param.getNum(), true, SeqUtil.getUUID(), ""); + if (!result.getCode().equals(200)) { + logger.error("会员开卡赠礼赠送卡券失败:", result.getMessage()); + } + totalAmount = totalAmount.add(mtCoupon.getAmount()); + } catch (Exception e) { + logger.error("会员开卡赠礼异常:", e.getMessage()); + } + } + } + } + // 弹框消息 + MtMessage msg = new MtMessage(); + msg.setMerchantId(user.getMerchantId()); + msg.setType(MessageEnum.POP_MSG.getKey()); + msg.setUserId(userId); + msg.setTitle("温馨提示"); + msg.setSendTime(new Date()); + msg.setIsSend(YesOrNoEnum.YES.getKey()); + msg.setParams(""); + if (totalAmount.compareTo(new BigDecimal("0")) > 0 && totalPoint > 0) { + msg.setContent("系统赠送您价值¥" + totalAmount + "卡券和" + totalPoint + "积分,请注意查收!"); + messageService.addMessage(msg); + } else if(totalAmount.compareTo(new BigDecimal("0")) > 0) { + msg.setContent("系统赠送您价值" + totalAmount + "卡券,请注意查收!"); + messageService.addMessage(msg); + } else if(totalPoint > 0) { + msg.setContent("系统赠送您" + totalPoint + "积分,请注意查收!"); + messageService.addMessage(msg); + } + } + return true; + } + + /** + * 赠礼详情 + * + * @param openGiftInfo 赠礼详情 + * @throws BusinessCheckException + * @return OpenGiftDto + * */ + private OpenGiftDto dealDetail(MtOpenGift openGiftInfo) throws BusinessCheckException { + OpenGiftDto dto = new OpenGiftDto(); + + dto.setId(openGiftInfo.getId()); + dto.setCreateTime(DateUtil.formatDate(openGiftInfo.getCreateTime(), "yyyy.MM.dd HH:mm")); + dto.setUpdateTime(DateUtil.formatDate(openGiftInfo.getUpdateTime(), "yyyy.MM.dd HH:mm")); + dto.setStatus(openGiftInfo.getStatus()); + dto.setCouponNum(openGiftInfo.getCouponNum()); + dto.setPoint(openGiftInfo.getPoint()); + dto.setOperator(openGiftInfo.getOperator()); + + MtCoupon couponInfo = couponService.queryCouponById(openGiftInfo.getCouponId()); + dto.setCouponInfo(couponInfo); + + MtUserGrade gradeInfo = userGradeService.queryUserGradeById(openGiftInfo.getMerchantId(), openGiftInfo.getGradeId(), 0); + dto.setGradeInfo(gradeInfo); + + return dto; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..c175157 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java @@ -0,0 +1,2433 @@ +package com.fuint.common.service.impl; + +import com.alibaba.fastjson.JSONObject; +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.fuint.common.Constants; +import com.fuint.common.dto.*; +import com.fuint.common.enums.*; +import com.fuint.common.param.OrderListParam; +import com.fuint.common.param.RechargeParam; +import com.fuint.common.param.SettlementParam; +import com.fuint.common.service.*; +import com.fuint.common.util.*; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.*; +import com.fuint.repository.model.*; +import com.fuint.utils.PropertiesUtil; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import weixin.popular.util.JsonUtil; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class OrderServiceImpl extends ServiceImpl implements OrderService { + + private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); + + private MtOrderMapper mtOrderMapper; + + private MtGoodsMapper mtGoodsMapper; + + private MtOrderGoodsMapper mtOrderGoodsMapper; + + private MtCartMapper mtCartMapper; + + private MtOrderAddressMapper mtOrderAddressMapper; + + private MtConfirmLogMapper mtConfirmLogMapper; + + private MtUserCouponMapper mtUserCouponMapper; + + private MtGoodsSkuMapper mtGoodsSkuMapper; + + private MtRegionMapper mtRegionMapper; + + private MtUserGradeMapper mtUserGradeMapper; + + private MtCouponGoodsMapper mtCouponGoodsMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 会员卡券服务接口 + * */ + private UserCouponService userCouponService; + + /** + * 收货地址服务接口 + * */ + private AddressService addressService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 积分服务接口 + * */ + private PointService pointService; + + /** + * 购物车服务接口 + * */ + private CartService cartService; + + /** + * 商品服务接口 + * */ + private GoodsService goodsService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 会员等级服务接口 + * */ + private UserGradeService userGradeService; + + /** + * 售后服务接口 + * */ + private RefundService refundService; + + /** + * 余额服务接口 + * */ + private BalanceService balanceService; + + /** + * 微信相关服务接口 + * */ + private WeixinService weixinService; + + /** + * 支付宝服务接口 + * */ + private AlipayService alipayService; + + /** + * 短信发送服务接口 + * */ + private SendSmsService sendSmsService; + + /** + * 开卡赠礼服务接口 + * */ + private OpenGiftService openGiftService; + + /** + * 商户服务接口 + * */ + private MerchantService merchantService; + + /** + * 店铺员工服务接口 + * */ + private StaffService staffService; + + /** + * 支付服务接口 + * */ + private PaymentService paymentService; + + /** + * 云打印服务接口 + * */ + private PrinterService printerService; + + /** + * 商品分类服务接口 + */ + private StockService stockService; + + /** + * 预约单服务接口 + */ + private BookItemService bookItemService; + + /** + * 获取用户订单列表 + * @param orderListParam + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException { + Integer pageNumber = orderListParam.getPage() == null ? Constants.PAGE_NUMBER : orderListParam.getPage(); + Integer pageSize = orderListParam.getPageSize() == null ? Constants.PAGE_SIZE : orderListParam.getPageSize(); + String userId = orderListParam.getUserId() == null ? "" : orderListParam.getUserId(); + Integer merchantId = orderListParam.getMerchantId() == null ? 0 : orderListParam.getMerchantId(); + Integer storeId = orderListParam.getStoreId() == null ? 0 : orderListParam.getStoreId(); + String status = orderListParam.getStatus() == null ? "": orderListParam.getStatus(); + String payStatus = orderListParam.getPayStatus() == null ? "": orderListParam.getPayStatus(); + String settleStatus = orderListParam.getSettleStatus() == null ? "": orderListParam.getSettleStatus(); + String dataType = orderListParam.getDataType() == null ? "": orderListParam.getDataType(); + String type = orderListParam.getType() == null ? "": orderListParam.getType(); + String orderSn = orderListParam.getOrderSn() == null ? "": orderListParam.getOrderSn(); + String mobile = orderListParam.getMobile() == null ? "": orderListParam.getMobile(); + String orderMode = orderListParam.getOrderMode() == null ? "" : orderListParam.getOrderMode(); + String staffId = orderListParam.getStaffId() == null ? "" : orderListParam.getStaffId(); + String couponId = orderListParam.getCouponId() == null ? "" : orderListParam.getCouponId(); + String storeIds = orderListParam.getStoreIds() == null ? "" : orderListParam.getStoreIds(); + String startTime = orderListParam.getStartTime() == null ? "" : orderListParam.getStartTime(); + String endTime = orderListParam.getEndTime() == null ? "" : orderListParam.getEndTime(); + String keyword = orderListParam.getKeyword() == null ? "" : orderListParam.getKeyword(); + String confirmStatus = orderListParam.getConfirmStatus() == null ? "" : orderListParam.getConfirmStatus(); + List payType = orderListParam.getPayType(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtOrder::getStatus, OrderStatusEnum.DELETED.getKey()); + + if (dataType.equals("toPay")) { + status = OrderStatusEnum.CREATED.getKey(); // 待支付 + } else if (dataType.equals("paid")) { + status = ""; + payStatus = PayStatusEnum.SUCCESS.getKey(); // 已支付 + } else if(dataType.equals("cancel")) { + status = OrderStatusEnum.CANCEL.getKey(); // 已取消 + } else if (dataType.equals("todo")) { + // 待核销 + payStatus = PayStatusEnum.SUCCESS.getKey(); + lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, YesOrNoEnum.NO.getKey()); + lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey()); + lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.ONESELF.getKey()); + } else if (dataType.equals("confirm")) { + // 已核销 + payStatus = PayStatusEnum.SUCCESS.getKey(); + lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey()); + lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, YesOrNoEnum.YES.getKey()); + lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.ONESELF.getKey()); + } else if (dataType.equals("unShipped")) { + // 待发货 + payStatus = PayStatusEnum.SUCCESS.getKey(); + lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey()); + lambdaQueryWrapper.eq(MtOrder::getStatus, OrderStatusEnum.DELIVERY.getKey()); + lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.EXPRESS.getKey()); + } else if (dataType.equals("received")) { + // 已收货 + payStatus = PayStatusEnum.SUCCESS.getKey(); + lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey()); + lambdaQueryWrapper.eq(MtOrder::getStatus, OrderStatusEnum.RECEIVED.getKey()); + lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.EXPRESS.getKey()); + } else if (dataType.equals("shipped")) { + // 已发货 + payStatus = PayStatusEnum.SUCCESS.getKey(); + lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey()); + lambdaQueryWrapper.eq(MtOrder::getStatus, OrderStatusEnum.DELIVERED.getKey()); + lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.EXPRESS.getKey()); + } else if (dataType.equals("completed")) { + // 已完成 + payStatus = PayStatusEnum.SUCCESS.getKey(); + lambdaQueryWrapper.eq(MtOrder::getStatus, OrderStatusEnum.COMPLETE.getKey()); + } + + if (StringUtil.isNotEmpty(orderSn)) { + lambdaQueryWrapper.eq(MtOrder::getOrderSn, orderSn); + } + if (StringUtil.isNotEmpty(status)) { + lambdaQueryWrapper.eq(MtOrder::getStatus, status); + } + if (StringUtil.isNotEmpty(payStatus)) { + lambdaQueryWrapper.eq(MtOrder::getPayStatus, payStatus); + } + if (StringUtil.isNotEmpty(settleStatus)) { + lambdaQueryWrapper.eq(MtOrder::getSettleStatus, settleStatus); + } + if (StringUtil.isNotEmpty(keyword)) { + MtUser userInfo = memberService.queryMemberByMobile(merchantId, keyword); + if (userInfo != null) { + lambdaQueryWrapper.and(wq -> wq + .like(MtOrder::getOrderSn, keyword) + .or() + .eq(MtOrder::getUserId, userInfo.getId().toString())); + } else { + lambdaQueryWrapper.like(MtOrder::getOrderSn, keyword); + } + } + if (StringUtil.isNotEmpty(mobile)) { + MtUser userInfo = memberService.queryMemberByMobile(merchantId, mobile); + if (userInfo != null) { + userId = userInfo.getId().toString(); + } + } + if (StringUtil.isNotBlank(userId) && Integer.parseInt(userId) > 0) { + lambdaQueryWrapper.eq(MtOrder::getUserId, userId); + } + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtOrder::getMerchantId, merchantId); + } + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.eq(MtOrder::getStoreId, storeId); + } + if (StringUtil.isNotEmpty(staffId)) { + lambdaQueryWrapper.eq(MtOrder::getStaffId, staffId); + } + if (StringUtil.isNotEmpty(type)) { + lambdaQueryWrapper.eq(MtOrder::getType, type); + } + if (StringUtil.isNotEmpty(orderMode)) { + lambdaQueryWrapper.eq(MtOrder::getOrderMode, orderMode); + } + if (StringUtils.isNotBlank(couponId)) { + lambdaQueryWrapper.eq(MtOrder::getCouponId, couponId); + } + if (StringUtils.isNotBlank(storeIds)) { + List idList = Arrays.asList(storeIds.split(",")); + if (idList.size() > 0) { + lambdaQueryWrapper.in(MtOrder::getStoreId, idList); + } + } + if (StringUtil.isNotEmpty(startTime)) { + lambdaQueryWrapper.ge(MtOrder::getCreateTime, startTime); + } + if (StringUtil.isNotEmpty(endTime)) { + lambdaQueryWrapper.le(MtOrder::getCreateTime, endTime); + } + if (payType != null && payType.size() > 0) { + lambdaQueryWrapper.in(MtOrder::getPayType, payType); + } + if (StringUtil.isNotEmpty(confirmStatus)) { + lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, confirmStatus); + lambdaQueryWrapper.eq(MtOrder::getPayStatus, PayStatusEnum.SUCCESS.getKey()); + lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey()); + } + lambdaQueryWrapper.orderByDesc(MtOrder::getId); + Page pageHelper = PageHelper.startPage(pageNumber, pageSize); + List orderList = mtOrderMapper.selectList(lambdaQueryWrapper); + + List dataList = new ArrayList<>(); + if (orderList.size() > 0) { + for (MtOrder order : orderList) { + UserOrderDto dto = getOrderDetail(order,false, false); + dataList.add(dto); + } + } + + PageRequest pageRequest = PageRequest.of(pageNumber, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, UserOrderDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存订单信息 + * + * @param orderDto 订单参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "提交订单信息") + public MtOrder saveOrder(OrderDto orderDto) throws BusinessCheckException { + logger.info("orderService.saveOrder orderDto = {}", JsonUtil.toJSONString(orderDto)); + MtOrder mtOrder; + if (null != orderDto.getId() && orderDto.getId() > 0) { + mtOrder = mtOrderMapper.selectById(orderDto.getId()); + } else { + mtOrder = new MtOrder(); + } + + // 检查店铺是否已被禁用 + if (orderDto.getStoreId() != null && orderDto.getStoreId() > 0) { + MtStore storeInfo = storeService.queryStoreById(orderDto.getStoreId()); + if (storeInfo != null) { + if (!storeInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + orderDto.setStoreId(0); + } + } + } + + String orderSn; + if (orderDto.getId() == null || orderDto.getId() < 1) { + orderSn = CommonUtil.createOrderSN(orderDto.getUserId() + ""); + mtOrder.setOrderSn(orderSn); + } else { + orderSn = mtOrder.getOrderSn(); + } + + mtOrder.setUserId(orderDto.getUserId()); + mtOrder.setMerchantId(orderDto.getMerchantId()); + mtOrder.setStoreId(orderDto.getStoreId()); + mtOrder.setCouponId(orderDto.getCouponId()); + mtOrder.setParam(orderDto.getParam()); + mtOrder.setRemark(orderDto.getRemark()); + if (orderDto.getStatus() != null) { + mtOrder.setStatus(orderDto.getStatus()); + } else { + mtOrder.setStatus(OrderStatusEnum.CREATED.getKey()); + } + mtOrder.setType(orderDto.getType()); + mtOrder.setAmount(orderDto.getAmount()); + mtOrder.setPayAmount(orderDto.getPayAmount()); + mtOrder.setDiscount(orderDto.getDiscount()); + if (orderDto.getPayStatus() != null) { + mtOrder.setPayStatus(orderDto.getPayStatus()); + } else { + mtOrder.setPayStatus(PayStatusEnum.WAIT.getKey()); + } + mtOrder.setPlatform(orderDto.getPlatform()); + mtOrder.setPointAmount(orderDto.getPointAmount()); + mtOrder.setUsePoint(orderDto.getUsePoint()); + mtOrder.setOrderMode(orderDto.getOrderMode()); + mtOrder.setPayType(orderDto.getPayType()); + mtOrder.setOperator(orderDto.getOperator()); + mtOrder.setStaffId(orderDto.getStaffId()); + mtOrder.setIsVisitor(orderDto.getIsVisitor()); + mtOrder.setUpdateTime(new Date()); + mtOrder.setDeliveryFee(orderDto.getDeliveryFee() == null ? new BigDecimal(0) : orderDto.getDeliveryFee()); + mtOrder.setSettleStatus(SettleStatusEnum.WAIT.getKey()); + mtOrder.setConfirmStatus(YesOrNoEnum.NO.getKey()); + + if (mtOrder.getId() == null || mtOrder.getId() <= 0) { + mtOrder.setCreateTime(new Date()); + } + if (orderDto.getPlatform() == null) { + orderDto.setPlatform(""); + } + // 核销码 + if (mtOrder.getVerifyCode() == null && !orderDto.getPlatform().equals(PlatformTypeEnum.PC.getCode())) { + mtOrder.setVerifyCode(SeqUtil.getRandomNumber(4)); + } else { + mtOrder.setVerifyCode(""); + if (mtOrder.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) { + mtOrder.setConfirmStatus(YesOrNoEnum.YES.getKey()); + } + } + + // 首先生成订单 + mtOrderMapper.insert(mtOrder); + MtOrder orderInfo = mtOrderMapper.selectById(mtOrder.getId()); + mtOrder.setId(orderInfo.getId()); + + // 会员相关信息 + MtUser userInfo = memberService.queryMemberById(orderDto.getUserId()); + MtUserGrade userGrade = userGradeService.queryUserGradeById(orderDto.getMerchantId(), userInfo.getGradeId() != null ? userInfo.getGradeId() : 1, orderDto.getUserId()); + BigDecimal percent = new BigDecimal("0"); + if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) { + // 会员折扣 + percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 4); + if (percent.compareTo(new BigDecimal("0")) <= 0) { + percent = new BigDecimal("1"); + } + } + + // 如果没有指定店铺,则读取默认的店铺 + if (orderDto.getStoreId() == null || orderDto.getStoreId() <= 0) { + Map params = new HashMap<>(); + params.put("status", StatusEnum.ENABLED.getKey()); + params.put("is_default", YesOrNoEnum.YES.getKey()); + List storeList = storeService.queryStoresByParams(params); + if (storeList.size() > 0) { + mtOrder.setStoreId(storeList.get(0).getId()); + } else { + mtOrder.setStoreId(0); + } + } + + mtOrder.setUpdateTime(new Date()); + if (mtOrder.getCreateTime() == null) { + mtOrder.setCreateTime(new Date()); + } + + // 计算商品订单总金额 + List cartList = new ArrayList<>(); + Map cartData = new HashMap<>(); + if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) { + if (StringUtil.isNotEmpty(orderDto.getCartIds())) { + Map param = new HashMap<>(); + param.put("status", StatusEnum.ENABLED.getKey()); + param.put("ids", orderDto.getCartIds()); + cartList = cartService.queryCartListByParams(param); + if (cartList.size() < 1) { + throw new BusinessCheckException("生成订单失败,请稍后重试"); + } + } else { + if (orderDto.getGoodsId() == null || orderDto.getGoodsId() <= 0) { + throw new BusinessCheckException("生成订单失败,请稍后重试"); + } + // 直接购买 + MtCart mtCart = new MtCart(); + mtCart.setGoodsId(orderDto.getGoodsId()); + mtCart.setSkuId(orderDto.getSkuId()); + mtCart.setNum(orderDto.getBuyNum()); + mtCart.setId(0); + mtCart.setUserId(orderDto.getUserId()); + mtCart.setStatus(StatusEnum.ENABLED.getKey()); + cartList.add(mtCart); + } + + boolean isUsePoint = orderDto.getUsePoint() > 0 ? true : false; + cartData = calculateCartGoods(orderInfo.getMerchantId(), orderDto.getUserId(), cartList, orderDto.getCouponId(), isUsePoint, orderDto.getPlatform(), orderInfo.getOrderMode()); + + mtOrder.setAmount(new BigDecimal(cartData.get("totalPrice").toString())); + mtOrder.setUsePoint(Integer.parseInt(cartData.get("usePoint").toString())); + mtOrder.setDiscount(new BigDecimal(cartData.get("couponAmount").toString())); + + // 实付金额 + BigDecimal payAmount = mtOrder.getAmount().subtract(mtOrder.getPointAmount()).subtract(mtOrder.getDiscount()); + if (payAmount.compareTo(new BigDecimal("0")) > 0) { + mtOrder.setPayAmount(payAmount); + } else { + mtOrder.setPayAmount(new BigDecimal("0")); + } + + // 购物使用了卡券 + if (mtOrder.getCouponId() > 0) { + // 查询是否适用商品 + MtUserCoupon userCoupon = mtUserCouponMapper.selectById(mtOrder.getCouponId()); + if (userCoupon != null) { + MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId()); + if (couponInfo.getApplyGoods() != null && couponInfo.getApplyGoods().equals(ApplyGoodsEnum.PARK_GOODS.getKey())) { + List couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId()); + if (couponGoodsList != null && couponGoodsList.size() > 0 && cartList.size() > 0) { + List applyGoodsIds = new ArrayList<>(); + List goodsIds = new ArrayList<>(); + for (MtCouponGoods mtCouponGoods : couponGoodsList) { + applyGoodsIds.add(mtCouponGoods.getGoodsId()); + } + for (MtCart mtCart : cartList) { + goodsIds.add(mtCart.getGoodsId()); + } + List intersection = applyGoodsIds.stream() + .filter(goodsIds::contains) + .collect(Collectors.toList()); + if (intersection.size() == 0) { + throw new BusinessCheckException("该卡券不适用于购买的商品列表"); + } + } + } + } + updateOrder(mtOrder); + String useCode = couponService.useCoupon(mtOrder.getCouponId(), mtOrder.getUserId(), mtOrder.getStoreId(), mtOrder.getId(), mtOrder.getDiscount(), "购物使用卡券"); + // 卡券使用失败 + if (StringUtil.isEmpty(useCode)) { + mtOrder.setDiscount(new BigDecimal("0")); + mtOrder.setCouponId(0); + } + } + } + + // 会员付款类订单 + if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) { + if (userInfo != null && userInfo.getGradeId() != null && orderDto.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) { + if (percent.compareTo(new BigDecimal("0")) > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) { + // 会员折扣 + BigDecimal payAmountDiscount = mtOrder.getAmount().multiply(percent); + if (payAmountDiscount.compareTo(new BigDecimal("0")) > 0) { + mtOrder.setDiscount(mtOrder.getDiscount().add(mtOrder.getAmount().subtract(payAmountDiscount))); + mtOrder.setPayAmount(payAmountDiscount); + } else { + mtOrder.setPayAmount(new BigDecimal("0")); + } + } + } + } + + // 再次更新订单 + try { + orderInfo = updateOrder(mtOrder); + } catch (Exception e) { + logger.error("OrderService 生成订单失败..."); + throw new BusinessCheckException("生成订单失败,请稍后重试"); + } + + // 扣减积分 + if (orderDto.getUsePoint() != null && orderDto.getUsePoint() > 0) { + try { + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setUserId(orderDto.getUserId()); + reqPointDto.setAmount(-orderDto.getUsePoint()); + reqPointDto.setOrderSn(orderSn); + reqPointDto.setDescription("支付扣除" + orderDto.getUsePoint() + "积分"); + reqPointDto.setOperator(""); + pointService.addPoint(reqPointDto); + } catch (BusinessCheckException e) { + logger.error("OrderService 扣减积分失败...{}", e.getMessage()); + throw new BusinessCheckException("扣减积分失败,请稍后重试"); + } + } + + // 如果是商品订单,生成订单商品 + if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey()) && cartList.size() > 0) { + Object listObject = cartData.get("list"); + List lists =(ArrayList)listObject; + BigDecimal memberDiscount = new BigDecimal("0"); + for (ResCartDto cart : lists) { + MtOrderGoods orderGoods = new MtOrderGoods(); + orderGoods.setOrderId(orderInfo.getId()); + orderGoods.setGoodsId(cart.getGoodsId()); + orderGoods.setSkuId(cart.getSkuId()); + orderGoods.setNum(cart.getNum()); + // 计算会员折扣 + BigDecimal price = cart.getGoodsInfo().getPrice(); + boolean isDiscount = cart.getGoodsInfo().getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false; + if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) { + orderGoods.setPrice(price.multiply(percent)); + BigDecimal discount = price.subtract(price.multiply(percent)).multiply(new BigDecimal(cart.getNum())); + orderGoods.setDiscount(discount); + memberDiscount = memberDiscount.add(discount); + } else { + orderGoods.setPrice(price); + orderGoods.setDiscount(new BigDecimal("0")); + } + orderGoods.setStatus(StatusEnum.ENABLED.getKey()); + orderGoods.setCreateTime(new Date()); + orderGoods.setUpdateTime(new Date()); + mtOrderGoodsMapper.insert(orderGoods); + // 扣减库存 + MtGoods goodsInfo = mtGoodsMapper.selectById(cart.getGoodsId()); + if (goodsInfo.getIsSingleSpec().equals(YesOrNoEnum.YES.getKey())) { + // 单规格减去库存 + Double stock = goodsInfo.getStock() - cart.getNum(); + if (stock < 0) { + throw new BusinessCheckException("商品“" + goodsInfo.getName() + "”库存不足,订单提交失败"); + } + goodsInfo.setStock(stock); + mtGoodsMapper.updateById(goodsInfo); + } else { + // 多规格减去库存 + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId()); + if (mtGoodsSku != null) { + Double stock = mtGoodsSku.getStock() - cart.getNum(); + if (stock < 0) { + throw new BusinessCheckException("商品sku编码“" + mtGoodsSku.getSkuNo() +"”库存不足,订单提交失败"); + } + mtGoodsSku.setStock(stock); + mtGoodsSkuMapper.updateById(mtGoodsSku); + + if (goodsInfo.getStock() != null && goodsInfo.getStock() > 0) { + Double goodsStock = goodsInfo.getStock() - cart.getNum(); + if (goodsStock >= 0) { + goodsInfo.setStock(goodsStock); + mtGoodsMapper.updateById(goodsInfo); + } + } + } + } + // 生成库存记录 + stockService.addStockRecord(orderInfo.getMerchantId(), orderInfo.getStoreId(), cart.getGoodsId(), cart.getSkuId(), "reduce", cart.getNum(), "订单扣减库存,订单号:"+orderInfo.getOrderSn()); + + // 删除购物车 + if (cart.getId() > 0) { + mtCartMapper.deleteById(cart.getId()); + } + } + + // 会员折扣 + if (memberDiscount.compareTo(new BigDecimal("0")) > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) { + orderInfo.setDiscount(orderInfo.getDiscount().add(memberDiscount)); + if (orderInfo.getPayAmount().subtract(memberDiscount).compareTo(new BigDecimal("0")) > 0) { + orderInfo.setPayAmount(orderInfo.getPayAmount().subtract(memberDiscount)); + } else { + orderInfo.setPayAmount(new BigDecimal("0")); + } + orderInfo.setUpdateTime(new Date()); + orderInfo = updateOrder(orderInfo); + } + + // 需要配送的订单,生成配送地址 + if (orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) { + Map params = new HashMap<>(); + params.put("userId", orderDto.getUserId().toString()); + params.put("isDefault", YesOrNoEnum.YES.getKey()); + List addressList = addressService.queryListByParams(params); + MtAddress mtAddress; + if (addressList.size() > 0) { + mtAddress = addressList.get(0); + } else { + throw new BusinessCheckException("配送地址出错了,请重新选择配送地址"); + } + + // 是否超出起送范围 + MtSetting deliveryRange = settingService.querySettingByName(orderInfo.getMerchantId(), SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_RANGE.getKey()); + if (deliveryRange != null && StringUtil.isNotEmpty(deliveryRange.getValue()) && (Double.parseDouble(deliveryRange.getValue()) > 0)) { + MtStore mtStore = storeService.queryStoreById(orderInfo.getStoreId()); + if (mtStore != null && StringUtil.isNotEmpty(mtStore.getLatitude()) && StringUtil.isNotEmpty(mtStore.getLongitude())) { + String address = ""; + if (mtAddress.getProvinceId() != null && mtAddress.getProvinceId() > 0) { + MtRegion mtProvince = mtRegionMapper.selectById(mtAddress.getProvinceId()); + if (mtProvince != null) { + address = mtProvince.getName(); + } + } + if (mtAddress.getCityId() != null && mtAddress.getCityId() > 0) { + MtRegion mtCity = mtRegionMapper.selectById(mtAddress.getCityId()); + if (mtCity != null) { + address = address + mtCity.getName(); + } + } + if (mtAddress.getRegionId() != null && mtAddress.getRegionId() > 0) { + MtRegion mtRegion = mtRegionMapper.selectById(mtAddress.getRegionId()); + if (mtRegion != null) { + address = address + mtRegion.getName(); + } + } + address = address + mtAddress.getDetail(); + Map latAndLng = storeService.getLatAndLngByAddress(address); + if (StringUtil.isNotEmpty(latAndLng.get("lat").toString()) && StringUtil.isNotEmpty(latAndLng.get("lng").toString())) { + Double distance = storeService.getDistance(mtStore.getLongitude() + "," + mtStore.getLatitude(), latAndLng.get("lng").toString() + "," + latAndLng.get("lat").toString()); + Double limitDistance = Double.parseDouble(deliveryRange.getValue()); + logger.info("订单地址:{},配送距离为:{}", address, distance); + if (distance > limitDistance) { + throw new BusinessCheckException("抱歉,配送距离超过了" + limitDistance + "公里,请重新选择配送地址!"); + } + } + } + } + + MtOrderAddress orderAddress = new MtOrderAddress(); + orderAddress.setOrderId(orderInfo.getId()); + orderAddress.setUserId(orderDto.getUserId()); + orderAddress.setName(mtAddress.getName()); + orderAddress.setMobile(mtAddress.getMobile()); + orderAddress.setCityId(mtAddress.getCityId()); + orderAddress.setProvinceId(mtAddress.getProvinceId()); + orderAddress.setRegionId(mtAddress.getRegionId()); + orderAddress.setDetail(mtAddress.getDetail()); + orderAddress.setCreateTime(new Date()); + mtOrderAddressMapper.insert(orderAddress); + } + } + + return orderInfo; + } + + /** + * 订单结算 + * @param request + * @param param 结算参数 + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map doSettle(HttpServletRequest request, SettlementParam param) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + String isWechat = request.getHeader("isWechat") == null ? YesOrNoEnum.NO.getKey() : request.getHeader("isWechat"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform"); + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + String ip = CommonUtil.getIPFromHttpRequest(request); + String cartIds = param.getCartIds() == null ? "" : param.getCartIds(); + Integer targetId = param.getTargetId() == null ? 0 : Integer.parseInt(param.getTargetId()); // 储值卡、升级等级必填 + String selectNum = param.getSelectNum() == null ? "" : param.getSelectNum(); // 储值卡必填 + String remark = param.getRemark() == null ? "" : param.getRemark(); + String type = param.getType() == null ? "" : param.getType(); // 订单类型 + String payAmount = param.getPayAmount() == null ? "0" : StringUtil.isEmpty(param.getPayAmount()) ? "0" : param.getPayAmount(); // 支付金额 + Integer usePoint = param.getUsePoint() == null ? 0 : param.getUsePoint(); // 使用积分数量 + Integer couponId = param.getCouponId() == null ? 0 : param.getCouponId(); // 会员卡券ID + String payType = param.getPayType() == null ? PayTypeEnum.JSAPI.getKey() : param.getPayType(); + String authCode = param.getAuthCode() == null ? "" : param.getAuthCode(); + Integer userId = param.getUserId() == null ? 0 : param.getUserId(); // 指定下单会员 eg:收银功能 + String cashierPayAmount = param.getCashierPayAmount() == null ? "" : param.getCashierPayAmount(); // 收银台实付金额 + String cashierDiscountAmount = param.getCashierDiscountAmount() == null ? "" : param.getCashierDiscountAmount(); // 收银台优惠金额 + Integer goodsId = param.getGoodsId() == null ? 0 : param.getGoodsId(); // 立即购买商品ID + Integer skuId = param.getSkuId() == null ? 0 : param.getSkuId(); // 立即购买商品skuId + Double buyNum = param.getBuyNum() == null ? 1.0 : param.getBuyNum(); // 立即购买商品数量 + String orderMode = StringUtil.isEmpty(param.getOrderMode()) ? OrderModeEnum.ONESELF.getKey() : param.getOrderMode(); // 订单模式(配送or自取) + Integer orderId = param.getOrderId() == null ? null : param.getOrderId(); // 订单ID + Integer merchantId = merchantService.getMerchantId(merchantNo); + UserInfo loginInfo = TokenUtil.getUserInfoByToken(token); + MtUser userInfo = null; + if (loginInfo != null) { + userInfo = memberService.queryMemberById(loginInfo.getId()); + } + + // 后台管理员或店员操作 + String operator = null; + Integer staffId = 0; + String isVisitor = YesOrNoEnum.NO.getKey(); + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo != null) { + operator = accountInfo.getAccountName(); + staffId = accountInfo.getStaffId() == null ? 0 : accountInfo.getStaffId(); + + if (param.getStaffId() != null && param.getStaffId() > 0) { + staffId = param.getStaffId(); + } + + storeId = accountInfo.getStoreId(); + merchantId = accountInfo.getMerchantId(); + if (storeId <= 0) { + MtMerchant mtMerchant = merchantService.queryMerchantById(merchantId); + if (mtMerchant != null) { + MtStore mtStore = storeService.getDefaultStore(mtMerchant.getNo()); + if (mtStore != null) { + storeId = mtStore.getId(); + } + } + } + if (userId < 1) { + isVisitor = YesOrNoEnum.YES.getKey(); + } + } + + if (userInfo == null) { + MtUser user = memberService.getCurrentUserInfo(request, userId, token); + if (user != null) { + userInfo = memberService.queryMemberById(user.getId()); + } + } else { + MtStaff mtStaff = staffService.queryStaffByUserId(userInfo.getId()); + if (mtStaff == null) { + mtStaff = staffService.queryStaffByMobile(userInfo.getMobile()); + } + if (mtStaff != null) { + operator = mtStaff.getRealName(); + } + } + + MtSetting config = settingService.querySettingByName(merchantId, storeId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.IS_CLOSE.getKey()); + if (config != null && config.getValue().equals(YesOrNoEnum.TRUE.getKey())) { + throw new BusinessCheckException("系统已关闭交易功能,请稍后再试!"); + } + + // 收银台通过手机号自动注册会员信息 + if ((userInfo == null || StringUtil.isEmpty(token))) { + String mobile = param.getMobile() == null ? "" : param.getMobile(); + if (StringUtil.isNotEmpty(operator) && StringUtil.isNotEmpty(mobile)) { + userInfo = memberService.queryMemberByMobile(merchantId, mobile); + // 自动注册会员 + if (userInfo == null) { + userInfo = memberService.addMemberByMobile(merchantId, mobile, "0", ip); + } + } + } + + if (userInfo == null) { + if (StringUtil.isNotEmpty(operator)) { + throw new BusinessCheckException("该管理员还未关联店铺员工"); + } else { + throw new BusinessCheckException("请先登录"); + } + } + + if (userId <= 0) { + userId = userInfo.getId(); + } else { + if (StringUtil.isNotEmpty(operator)) { + userInfo = memberService.queryMemberById(userId); + } + } + param.setUserId(userId); + + // 订单所属店铺 + if (storeId < 1) { + if (userInfo.getStoreId() > 0) { + storeId = userInfo.getStoreId(); + } + } + + if (merchantId == null || merchantId <= 0) { + throw new BusinessCheckException("系统异常,商户ID不能为空"); + } + + // 生成订单数据 + OrderDto orderDto = new OrderDto(); + orderDto.setId(orderId); + orderDto.setRemark(remark); + orderDto.setUserId(userId); + orderDto.setMerchantId(merchantId); + orderDto.setStoreId(storeId); + orderDto.setType(type); + orderDto.setGoodsId(goodsId); + orderDto.setSkuId(skuId); + orderDto.setBuyNum(buyNum); + orderDto.setOrderMode(orderMode); + orderDto.setOperator(operator); + orderDto.setPayType(payType); + orderDto.setCouponId(0); + orderDto.setStaffId(staffId); + orderDto.setIsVisitor(isVisitor); + orderDto.setPlatform(platform); + + MtSetting pointSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.CAN_USE_AS_MONEY.getKey()); + // 使用积分数量 + if (pointSetting != null && pointSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) { + orderDto.setUsePoint(usePoint); + } else { + orderDto.setUsePoint(0); + usePoint = 0; + } + + orderDto.setPointAmount(new BigDecimal("0")); + orderDto.setDiscount(new BigDecimal("0")); + orderDto.setPayAmount(new BigDecimal("0")); + orderDto.setAmount(new BigDecimal("0")); + orderDto.setCartIds(cartIds); + + // 储值卡的订单 + if (orderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) { + orderDto.setCouponId(targetId); + String orderParam = ""; + BigDecimal totalAmount = new BigDecimal(0); + + MtCoupon couponInfo = couponService.queryCouponById(targetId); + String inRule = couponInfo.getInRule(); + String[] selectNumArr = selectNum.split(","); + String[] ruleArr = inRule.split(","); + for (int i = 0; i < ruleArr.length; i++) { + String item = ruleArr[i] + "_" + (StringUtil.isNotEmpty(selectNumArr[i]) ? selectNumArr[i] : 0); + String[] itemArr = item.split("_"); + // 预存金额 + BigDecimal price = new BigDecimal(itemArr[0]); + // 预存数量 + BigDecimal num = new BigDecimal(selectNumArr[i]); + BigDecimal amount = price.multiply(num); + totalAmount = totalAmount.add(amount); + orderParam = StringUtil.isEmpty(orderParam) ? item : orderParam + ","+item; + } + + orderDto.setParam(orderParam); + orderDto.setAmount(totalAmount); + payAmount = totalAmount.toString(); + } + + // 付款订单 + if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) { + orderDto.setAmount(new BigDecimal(payAmount)); + orderDto.setPayAmount(new BigDecimal(payAmount)); + orderDto.setDiscount(new BigDecimal("0")); + orderDto.setDeliveryFee(new BigDecimal("0")); + } + + // 会员升级订单 + if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) { + orderDto.setParam(targetId.toString()); + orderDto.setCouponId(couponId); + MtUserGrade userGrade = userGradeService.queryUserGradeById(merchantId, targetId, orderDto.getUserId()); + if (userGrade != null) { + orderDto.setRemark("付费升级" + userGrade.getName()); + orderDto.setAmount(new BigDecimal(userGrade.getCatchValue().toString())); + } + } + + // 商品订单 + if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) { + orderDto.setCouponId(couponId); + } + + // 商品订单且配送要加上配送费用 + if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey()) && orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) { + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_FEE.getKey()); + if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue())) { + BigDecimal deliveryFee = new BigDecimal(mtSetting.getValue()); + if (deliveryFee.compareTo(new BigDecimal("0")) > 0) { + orderDto.setDeliveryFee(deliveryFee); + } + } + } + + // 使用积分抵扣 + if (usePoint > 0) { + List settingList = settingService.getSettingList(merchantId, SettingTypeEnum.POINT.getKey()); + String canUsedAsMoney = YesOrNoEnum.FALSE.getKey(); + String exchangeNeedPoint = "0"; + for (MtSetting setting : settingList) { + if (setting.getName().equals("canUsedAsMoney")) { + canUsedAsMoney = setting.getValue(); + } else if (setting.getName().equals("exchangeNeedPoint")) { + exchangeNeedPoint = setting.getValue(); + } + } + // 是否可以使用积分,并且积分数量足够 + if (canUsedAsMoney.equals(YesOrNoEnum.TRUE.getKey()) && Float.parseFloat(exchangeNeedPoint) > 0 && (userInfo.getPoint() >= usePoint)) { + orderDto.setUsePoint(usePoint); + orderDto.setPointAmount(new BigDecimal(usePoint).divide(new BigDecimal(exchangeNeedPoint), BigDecimal.ROUND_CEILING, 4)); + if (orderDto.getPayAmount().compareTo(orderDto.getPointAmount()) > 0) { + orderDto.setPayAmount(orderDto.getPayAmount().subtract(orderDto.getPointAmount())); + } else { + orderDto.setPayAmount(new BigDecimal("0")); + } + } + } + + // 首先生成订单,拿到订单ID + MtOrder orderInfo; + try { + orderInfo = saveOrder(orderDto); + } catch (BusinessCheckException e) { + throw new BusinessCheckException(e.getMessage() == null ? "生成订单失败" : e.getMessage()); + } + + orderDto.setId(orderInfo.getId()); + param.setOrderId(orderInfo.getId()); + + // 收银台实付金额、优惠金额 + if ((StringUtil.isNotEmpty(cashierPayAmount) || StringUtil.isNotEmpty(cashierDiscountAmount)) && StringUtil.isNotEmpty(operator)) { + OrderDto reqOrder = new OrderDto(); + reqOrder.setId(orderInfo.getId()); + if (orderInfo.getAmount().compareTo(new BigDecimal("0")) <= 0) { + reqOrder.setAmount(new BigDecimal(cashierPayAmount).add(new BigDecimal(cashierDiscountAmount))); + } else { + reqOrder.setAmount(orderInfo.getAmount()); + } + if (new BigDecimal(cashierDiscountAmount).compareTo(new BigDecimal("0")) > 0) { + reqOrder.setDiscount(new BigDecimal(cashierDiscountAmount).add(orderInfo.getDiscount())); + } else { + reqOrder.setDiscount(orderInfo.getDiscount()); + } + BigDecimal realPayAmount = reqOrder.getAmount().subtract(reqOrder.getDiscount()); + if (realPayAmount.compareTo(new BigDecimal("0")) < 0) { + realPayAmount = new BigDecimal("0"); + } + reqOrder.setPayAmount(realPayAmount); + updateOrder(reqOrder); + orderInfo = getOrderInfo(orderInfo.getId()); + } + + // 订单中使用卡券抵扣(付款订单、会员升级订单) + if (couponId > 0 && (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) || orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) { + if (orderDto.getAmount().compareTo(new BigDecimal("0")) > 0) { + MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId); + if (userCouponInfo != null) { + MtCoupon couponInfo = couponService.queryCouponById(userCouponInfo.getCouponId()); + if (couponInfo != null) { + boolean isEffective = couponService.isCouponEffective(couponInfo, userCouponInfo); + if (isEffective && userCouponInfo.getUserId().equals(orderDto.getUserId())) { + // 优惠券,直接减去优惠券金额 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + // 检查是否会员升级专用卡券 + boolean canUse = true; + if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) { + if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) { + if (!couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) { + canUse = false; + } + } + } + if (canUse) { + String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), userCouponInfo.getAmount(), "核销"); + if (StringUtil.isNotEmpty(useCode)) { + orderDto.setCouponId(couponId); + // 折扣券 + if (couponInfo.getContent().equals(CouponContentEnum.PERCENT.getKey())) { + BigDecimal discount = new BigDecimal("0"); + BigDecimal percent = userCouponInfo.getAmount().divide(new BigDecimal("100"), BigDecimal.ROUND_CEILING, 4); + discount = discount.multiply(new BigDecimal("1").subtract(percent)); + if (discount.compareTo(new BigDecimal("0")) > 0) { + orderDto.setDiscount(orderInfo.getDiscount().add(discount)); + } + } else { + // 满减券 + orderDto.setDiscount(orderInfo.getDiscount().add(userCouponInfo.getAmount())); + } + updateOrder(orderDto); + } + } + } else if(couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + // 储值卡,减去余额 + BigDecimal useCouponAmount = userCouponInfo.getBalance(); + if (orderInfo.getPayAmount().compareTo(userCouponInfo.getBalance()) <= 0) { + useCouponAmount = orderInfo.getPayAmount(); + } + try { + String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), useCouponAmount, "核销"); + if (StringUtil.isNotEmpty(useCode)) { + orderDto.setCouponId(couponId); + orderDto.setDiscount(orderInfo.getDiscount().add(useCouponAmount)); + orderDto.setPayAmount(orderInfo.getPayAmount().subtract(useCouponAmount)); + updateOrder(orderDto); + } + } catch (BusinessCheckException e) { + throw new BusinessCheckException(e.getMessage() == null ? "生成订单失败" : e.getMessage()); + } + } + } + } + } + } + } + + // 生成支付订单 + orderInfo = getOrderInfo(orderInfo.getId()); + BigDecimal realPayAmount = orderInfo.getAmount().subtract(new BigDecimal(orderInfo.getDiscount().toString())).subtract(new BigDecimal(orderInfo.getPointAmount().toString())).add(orderInfo.getDeliveryFee()); + + // 支付类的订单,检查余额是否充足 + if (type.equals(OrderTypeEnum.PAYMENT.getKey()) && payType.equals(PayTypeEnum.BALANCE.getKey())) { + if (userInfo.getBalance() == null || realPayAmount.compareTo(userInfo.getBalance()) > 0) { + throw new BusinessCheckException("会员余额不足"); + } + if (StringUtil.isNotEmpty(cashierPayAmount)) { + if (userInfo.getBalance() == null || new BigDecimal(cashierPayAmount).compareTo(userInfo.getBalance()) > 0) { + throw new BusinessCheckException("会员余额不足"); + } + } + } + + MtSetting delivery = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(),OrderSettingEnum.DELIVERY_MIN_AMOUNT.getKey()); + if (delivery != null && orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) { + BigDecimal deliveryMinAmount = new BigDecimal(delivery.getValue()); + if (deliveryMinAmount.compareTo(new BigDecimal("0")) > 0 && deliveryMinAmount.compareTo(orderInfo.getAmount()) > 0) { + throw new BusinessCheckException("订单起送金额:" + deliveryMinAmount + "元"); + } + } + + ResponseObject paymentInfo = null; + String errorMessage = ""; + + // 应付金额大于0才提交微信支付 + if (realPayAmount.compareTo(new BigDecimal("0")) > 0) { + if (payType.equals(PayTypeEnum.CASH.getKey()) && StringUtil.isNotEmpty(operator)) { + // 收银台现金支付,更新为已支付 + setOrderPayed(orderInfo.getId(), null); + } else if (payType.equals(PayTypeEnum.STORE.getKey())) { + // 门店支付,不做任何操作 + } else if(payType.equals(PayTypeEnum.BALANCE.getKey())) { + // 余额支付 + MtBalance balance = new MtBalance(); + balance.setMobile(userInfo.getMobile()); + balance.setOrderSn(orderInfo.getOrderSn()); + balance.setUserId(userInfo.getId()); + balance.setMerchantId(userInfo.getMerchantId()); + balance.setStoreId(orderInfo.getStoreId()); + BigDecimal balanceAmount = realPayAmount.subtract(realPayAmount).subtract(realPayAmount); + balance.setAmount(balanceAmount); + boolean isPay = balanceService.addBalance(balance, true); + if (isPay) { + setOrderPayed(orderInfo.getId(), realPayAmount); + } else { + errorMessage = PropertiesUtil.getResponseErrorMessageByCode(5001); + } + } else { + BigDecimal wxPayAmount = realPayAmount.multiply(new BigDecimal("100")); + // 扫码支付,先返回不处理,后面拿到支付二维码再处理 + if ((payType.equals(PayTypeEnum.MICROPAY.getKey()) || payType.equals(PayTypeEnum.ALISCAN.getKey())) && StringUtil.isEmpty(authCode)) { + paymentInfo = new ResponseObject(200, "请求成功", new HashMap<>()); + } else { + paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform, isWechat); + } + if (paymentInfo.getData() == null) { + errorMessage = StringUtil.isNotEmpty(paymentInfo.getMessage()) ? paymentInfo.getMessage() : PropertiesUtil.getResponseErrorMessageByCode(3000); + } + } + } else { + // 应付金额是0,直接更新为已支付 + setOrderPayed(orderInfo.getId(), null); + } + + orderInfo = getOrderInfo(orderInfo.getId()); + Map outParams = new HashMap(); + outParams.put("isCreated", true); + outParams.put("orderInfo", orderInfo); + outParams.put("payType", payType); + + if (paymentInfo != null) { + outParams.put("payment", paymentInfo.getData()); + } else { + outParams.put("payment", null); + } + + // 发送小程序订阅消息 + Date nowTime = new Date(); + Map params = new HashMap<>(); + String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm"); + params.put("time", dateTime); + params.put("orderSn", orderInfo.getOrderSn()); + params.put("remark", "您的订单已生成,请留意~"); + weixinService.sendSubscribeMessage(merchantId, userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.ORDER_CREATED.getKey(), "pages/order/index", params, nowTime); + + if (StringUtil.isNotEmpty(errorMessage)) { + throw new BusinessCheckException(errorMessage); + } else { + return outParams; + } + } + + /** + * 获取订单详情 + * + * @param orderId 订单ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtOrder getOrderInfo(Integer orderId) { + if (orderId == null || orderId <= 0) { + return null; + } + return mtOrderMapper.selectById(orderId); + } + + /** + * 根据ID获取订单详情 + * + * @param orderId 订单ID + * @throws BusinessCheckException + * @return + */ + @Override + public UserOrderDto getOrderById(Integer orderId) throws BusinessCheckException { + if (orderId == null || orderId <= 0) { + return null; + } + MtOrder mtOrder = mtOrderMapper.selectById(orderId); + return getOrderDetail(mtOrder, true, true); + } + + /** + * 根据ID获取我的订单详情 + * + * @param orderId 订单ID + * @throws BusinessCheckException + * @return + */ + @Override + public UserOrderDto getMyOrderById(Integer orderId) throws BusinessCheckException { + if (orderId == null || orderId <= 0) { + return null; + } + MtOrder mtOrder = mtOrderMapper.selectById(orderId); + UserOrderDto orderInfo = getOrderDetail(mtOrder, true, true); + + // 售后订单 + MtRefund refund = refundService.getRefundByOrderId(orderId); + orderInfo.setRefundInfo(refund); + + orderInfo.setVerifyCode(mtOrder.getVerifyCode()); + return orderInfo; + } + + /** + * 取消订单 + * + * @param orderId 订单ID + * @param remark 取消备注 + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "取消订单") + public MtOrder cancelOrder(Integer orderId, String remark) throws BusinessCheckException { + MtOrder mtOrder = mtOrderMapper.selectById(orderId); + logger.info("orderService.cancelOrder orderId = {}, remark = {}", orderId, remark); + + if (mtOrder != null && mtOrder.getStatus().equals(OrderStatusEnum.CREATED.getKey()) && mtOrder.getPayStatus().equals(PayStatusEnum.WAIT.getKey())) { + if (StringUtil.isNotEmpty(remark)) { + mtOrder.setRemark(remark); + } + + mtOrder.setStatus(OrderStatusEnum.CANCEL.getKey()); + mtOrderMapper.updateById(mtOrder); + + // 返还积分 + if (mtOrder.getPointAmount() != null && mtOrder.getUsePoint() > 0) { + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setUserId(mtOrder.getUserId()); + reqPointDto.setAmount(mtOrder.getUsePoint()); + reqPointDto.setDescription("订单取消" + mtOrder.getOrderSn() + "退回"+ mtOrder.getUsePoint() +"积分"); + reqPointDto.setOrderSn(mtOrder.getOrderSn()); + reqPointDto.setOperator(""); + pointService.addPoint(reqPointDto); + } + + // 返还卡券 + List confirmLogList = mtConfirmLogMapper.getOrderConfirmLogList(mtOrder.getId()); + if (confirmLogList.size() > 0) { + for (MtConfirmLog log : confirmLogList) { + MtCoupon couponInfo = couponService.queryCouponById(log.getCouponId()); + MtUserCoupon userCouponInfo = mtUserCouponMapper.selectById(log.getUserCouponId()); + + if (userCouponInfo != null) { + // 优惠券直接置为未使用 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + mtUserCouponMapper.updateById(userCouponInfo); + } + + // 储值卡把余额加回去 + if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + BigDecimal balance = userCouponInfo.getBalance(); + BigDecimal newBalance = balance.add(log.getAmount()); + if (newBalance.compareTo(userCouponInfo.getAmount()) <= 0) { + userCouponInfo.setBalance(newBalance); + userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + } + mtUserCouponMapper.updateById(userCouponInfo); + } + + // 撤销核销记录 + log.setStatus(StatusEnum.DISABLE.getKey()); + mtConfirmLogMapper.updateById(log); + } + } + } + + // 返还库存 + Map params = new HashMap<>(); + params.put("ORDER_ID", mtOrder.getId()); + List orderGoodsList = mtOrderGoodsMapper.selectByMap(params); + if (orderGoodsList != null && orderGoodsList.size() > 0) { + for (MtOrderGoods mtOrderGoods : orderGoodsList) { + MtGoods mtGoods = mtGoodsMapper.selectById(mtOrderGoods.getGoodsId()); + // 商品已不存在 + if (mtGoods == null) { + continue; + } + mtGoods.setStock(mtOrderGoods.getNum() + mtGoods.getStock()); + mtGoodsMapper.updateById(mtGoods); + if (mtOrderGoods.getSkuId() != null && mtOrderGoods.getSkuId() > 0) { + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(mtOrderGoods.getSkuId()); + if (mtGoodsSku != null && mtGoodsSku.getStock() != null && mtOrderGoods.getNum() != null) { + mtGoodsSku.setStock(mtGoodsSku.getStock() + mtOrderGoods.getNum()); + mtGoodsSkuMapper.updateById(mtGoodsSku); + } + } + } + } + } + + return mtOrder; + } + + /** + * 根据订单ID删除 + * + * @param orderId 订单ID + * @param operator 操作人 + * @return + */ + @Override + @OperationServiceLog(description = "删除订单信息") + public void deleteOrder(Integer orderId, String operator) { + logger.info("orderService.deleteOrder orderId = {}, operator = {}", orderId, operator); + MtOrder mtOrder = mtOrderMapper.selectById(orderId); + if (mtOrder == null) { + return; + } + + mtOrder.setStatus(OrderStatusEnum.DELETED.getKey()); + mtOrder.setUpdateTime(new Date()); + mtOrder.setOperator(operator); + + mtOrderMapper.updateById(mtOrder); + } + + /** + * 根据订单号获取订单详情 + * + * @param orderSn 订单号 + * @throws BusinessCheckException + * @return + */ + @Override + public UserOrderDto getOrderByOrderSn(String orderSn) throws BusinessCheckException { + MtOrder orderInfo = mtOrderMapper.findByOrderSn(orderSn); + if (orderInfo == null) { + return null; + } + return getOrderDetail(orderInfo, true, true); + } + + /** + * 根据订单号获取订单信息 + * + * @param orderSn 订单号 + * @return + */ + @Override + public MtOrder getOrderInfoByOrderSn(String orderSn) { + return mtOrderMapper.findByOrderSn(orderSn); + } + + /** + * 更新订单 + * + * @param orderDto 订单参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新订单信息") + public MtOrder updateOrder(OrderDto orderDto) throws BusinessCheckException { + logger.info("orderService.updateOrder orderDto = {}", JsonUtil.toJSONString(orderDto)); + MtOrder mtOrder = mtOrderMapper.selectById(orderDto.getId()); + if (null == mtOrder || OrderStatusEnum.DELETED.getKey().equals(mtOrder.getStatus())) { + throw new BusinessCheckException("该订单状态异常"); + } + + mtOrder.setId(orderDto.getId()); + mtOrder.setUpdateTime(new Date()); + + if (null != orderDto.getOperator()) { + mtOrder.setOperator(orderDto.getOperator()); + } + + if (null != orderDto.getStatus()) { + if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey()) || orderDto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) { + orderDto.setPayStatus(PayStatusEnum.WAIT.getKey()); + } + if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) { + cancelOrder(orderDto.getId(), "取消订单"); + } else { + mtOrder.setStatus(orderDto.getStatus()); + } + if (orderDto.getStatus().equals(OrderStatusEnum.PAID.getKey())) { + mtOrder.setPayStatus(PayStatusEnum.SUCCESS.getKey()); + mtOrder.setPayTime(new Date()); + } + } + + if (null != orderDto.getPayAmount()) { + mtOrder.setPayAmount(orderDto.getPayAmount()); + } + + if (null != orderDto.getAmount()) { + mtOrder.setAmount(orderDto.getAmount()); + } + + if (StringUtil.isNotBlank(orderDto.getVerifyCode())) { + if (orderDto.getVerifyCode().equals(mtOrder.getVerifyCode()) || StringUtil.isEmpty(mtOrder.getVerifyCode())) { + mtOrder.setStatus(OrderStatusEnum.DELIVERED.getKey()); + mtOrder.setVerifyCode(""); + mtOrder.setConfirmStatus(YesOrNoEnum.YES.getKey()); + mtOrder.setConfirmTime(new Date()); + mtOrder.setConfirmRemark(orderDto.getConfirmRemark()); + mtOrder.setStatus(OrderStatusEnum.COMPLETE.getKey()); + } else { + throw new BusinessCheckException("核销码错误,请确认!"); + } + } + + if (null != orderDto.getDiscount()) { + mtOrder.setDiscount(orderDto.getDiscount()); + } + + if (null != orderDto.getPayTime()) { + mtOrder.setPayTime(orderDto.getPayTime()); + } + + if (null != orderDto.getPayType()) { + mtOrder.setPayType(orderDto.getPayType()); + } + + if (null != orderDto.getPayStatus()) { + mtOrder.setPayStatus(orderDto.getPayStatus()); + } + + if (null != orderDto.getExpressInfo()) { + mtOrder.setExpressInfo(JSONObject.toJSONString(orderDto.getExpressInfo())); + } + + if (null != orderDto.getOrderMode()) { + mtOrder.setOrderMode(orderDto.getOrderMode()); + } + + if (null != orderDto.getRemark()) { + mtOrder.setRemark(orderDto.getRemark()); + } + + mtOrderMapper.updateById(mtOrder); + return mtOrder; + } + + /** + * 更新订单 + * + * @param mtOrder 订单信息 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public MtOrder updateOrder(MtOrder mtOrder) { + mtOrder.setUpdateTime(new Date()); + Integer id = mtOrderMapper.updateById(mtOrder); + if (id > 0) { + mtOrder = mtOrderMapper.selectById(mtOrder.getId()); + } + return mtOrder; + } + + /** + * 把订单置为已支付 + * + * @param orderId 订单ID + * @param payAmount 支付金额 + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改订单为已支付") + public Boolean setOrderPayed(Integer orderId, BigDecimal payAmount) throws BusinessCheckException { + MtOrder mtOrder = mtOrderMapper.selectById(orderId); + if (mtOrder == null) { + return false; + } + if (mtOrder.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) { + return true; + } + OrderDto reqDto = new OrderDto(); + Date nowDate = new Date(); + reqDto.setId(orderId); + reqDto.setStatus(OrderStatusEnum.PAID.getKey()); + reqDto.setPayStatus(PayStatusEnum.SUCCESS.getKey()); + if (payAmount != null) { + reqDto.setPayAmount(payAmount); + } + if (mtOrder.getPlatform().equals(PlatformTypeEnum.PC.getCode())) { + reqDto.setConfirmStatus(YesOrNoEnum.YES.getKey()); + reqDto.setConfirmTime(nowDate); + } + reqDto.setPayTime(nowDate); + reqDto.setUpdateTime(nowDate); + updateOrder(reqDto); + + // 处理会员升级订单 + if (mtOrder.getType().equals(OrderTypeEnum.MEMBER.getKey())) { + openGiftService.openGift(mtOrder.getUserId(), Integer.parseInt(mtOrder.getParam()), false); + } + + // 处理购物订单 + UserOrderDto orderInfo = getOrderByOrderSn(mtOrder.getOrderSn()); + if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) { + try { + List goodsList = orderInfo.getGoods(); + if (goodsList != null && goodsList.size() > 0) { + for (OrderGoodsDto goodsDto : goodsList) { + MtGoods mtGoods = goodsService.queryGoodsById(goodsDto.getGoodsId()); + if (mtGoods != null) { + // 购买虚拟卡券商品发放处理 + if (mtGoods.getType().equals(GoodsTypeEnum.COUPON.getKey()) && mtGoods.getCouponIds() != null && StringUtil.isNotEmpty(mtGoods.getCouponIds())) { + String couponIds[] = mtGoods.getCouponIds().split(","); + if (couponIds.length > 0) { + for (int i = 0; i < couponIds.length; i++) { + userCouponService.buyCouponItem(orderInfo.getId(), Integer.parseInt(couponIds[i]), orderInfo.getUserId(), orderInfo.getUserInfo().getMobile(), goodsDto.getNum()); + } + } + } + // 将已销售数量+1 + goodsService.updateInitSale(mtGoods.getId(), goodsDto.getNum()); + } + } + } + } catch (BusinessCheckException e) { + logger.error("会员购买的卡券发送给会员失败......" + e.getMessage()); + } + } + + // 处理消费返积分,查询返1积分所需消费金额 + MtSetting setting = settingService.querySettingByName(mtOrder.getMerchantId(), SettingTypeEnum.POINT.getKey(), PointSettingEnum.POINT_NEED_CONSUME.getKey()); + if (setting != null && !orderInfo.getPayType().equals(PayTypeEnum.BALANCE.getKey()) && orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) { + String needPayAmount = setting.getValue(); + Integer needPayAmountInt = Math.round(Integer.parseInt(needPayAmount)); + Double pointNum = 0d; + if (needPayAmountInt > 0 && orderInfo.getPayAmount().compareTo(new BigDecimal(needPayAmountInt)) >= 0) { + BigDecimal point = orderInfo.getPayAmount().divide(new BigDecimal(needPayAmountInt), BigDecimal.ROUND_CEILING, 4); + pointNum = Math.ceil(point.doubleValue()); + } + logger.info("PaymentService paymentCallback Point orderSn = {} , pointNum ={}", orderInfo.getOrderSn(), pointNum); + if (pointNum > 0) { + // 充值是否加倍返积分 + if (orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) { + MtSetting pointSpeedSetting = settingService.querySettingByName(mtOrder.getMerchantId(), SettingTypeEnum.POINT.getKey(), PointSettingEnum.RECHARGE_POINT_SPEED.getKey()); + if (pointSpeedSetting != null && StringUtil.isNotEmpty(pointSpeedSetting.getValue())) { + BigDecimal pointSpeed = new BigDecimal(pointSpeedSetting.getValue()); + if (pointSpeed.compareTo(new BigDecimal("0")) > 0) { + pointNum = pointNum * new Double(pointSpeedSetting.getValue()); + } + } + } + MtUser userInfo = memberService.queryMemberById(orderInfo.getUserId()); + MtUserGrade userGrade = userGradeService.queryUserGradeById(orderInfo.getMerchantId(), userInfo.getGradeId(), orderInfo.getUserId()); + // 是否会员积分加倍 + if (userGrade != null && userGrade.getSpeedPoint() > 1) { + pointNum = pointNum * userGrade.getSpeedPoint(); + } + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setAmount(pointNum.intValue()); + reqPointDto.setUserId(orderInfo.getUserId()); + reqPointDto.setOrderSn(orderInfo.getOrderSn()); + reqPointDto.setDescription("支付¥"+orderInfo.getPayAmount()+"返"+pointNum+"积分"); + reqPointDto.setOperator("系统"); + pointService.addPoint(reqPointDto); + } + } + + // 计算是否要升级(购物订单、付款订单、充值订单) + if (orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey()) && orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey()) || orderInfo.getType().equals(OrderTypeEnum.PAYMENT.getKey()) || orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) { + try { + if (orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) { + Map param = new HashMap<>(); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + param.put("MERCHANT_ID", mtOrder.getMerchantId()); + MtUser mtUser = memberService.queryMemberById(orderInfo.getUserId()); + MtUserGrade mtUserGrade = mtUserGradeMapper.selectById(mtUser.getGradeId()); + if (mtUserGrade == null) { + mtUserGrade = userGradeService.getInitUserGrade(orderInfo.getMerchantId()); + } + List userGradeList = mtUserGradeMapper.selectByMap(param); + if (mtUserGrade != null && userGradeList != null && userGradeList.size() > 0) { + // 会员已支付金额 + BigDecimal payMoney = getUserPayMoney(orderInfo.getUserId()); + // 会员支付订单笔数 + Integer payOrderCount = getUserPayOrderCount(orderInfo.getUserId()); + BigDecimal payOrderCountValue = new BigDecimal(payOrderCount); + for (MtUserGrade grade : userGradeList) { + if (grade.getCatchValue() != null && grade.getCatchType() != null) { + // 累计消费金额已达到 + if (grade.getCatchType().equals(UserGradeCatchTypeEnum.AMOUNT.getKey())) { + if (grade.getGrade().compareTo(mtUserGrade.getGrade()) > 0 && payMoney.compareTo(grade.getCatchValue()) >= 0) { + openGiftService.openGift(mtOrder.getUserId(), grade.getId(), false); + } + } + // 累计消费次数已达到 + if (grade.getCatchType().equals(UserGradeCatchTypeEnum.FREQUENCY.getKey()) && payOrderCountValue.compareTo(grade.getCatchValue()) >= 0) { + if (grade.getGrade().compareTo(mtUserGrade.getGrade()) > 0) { + openGiftService.openGift(mtOrder.getUserId(), grade.getId(), false); + } + } + } + } + } + } + } catch (Exception ex) { + logger.error("会员升级出错啦,userId = {},message = {}", orderInfo.getUserId(), ex.getMessage()); + } + } + + try { + // 打印订单 + printerService.printOrder(orderInfo, true); + + // 给商家发送通知短信 + MtStore mtStore = storeService.queryStoreById(mtOrder.getStoreId()); + if (mtStore != null && orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) { + Map params = new HashMap<>(); + params.put("orderSn", mtOrder.getOrderSn()); + List mobileList = new ArrayList<>(); + mobileList.add(mtStore.getPhone()); + sendSmsService.sendSms(mtOrder.getMerchantId(), "new-order", mobileList, params); + } + } catch (Exception e) { + logger.info("打印订单或给商家发送短信出错啦,message = {}", e.getMessage()); + } + + return true; + } + + /** + * 根据条件搜索订单 + * + * @param params 查询参数 + * @return + * */ + @Override + public List getOrderListByParams(Map params) { + return mtOrderMapper.selectByMap(params); + } + + /** + * 处理订单详情 + * + * @param orderInfo 订单信息 + * @param needAddress 是否获取订单地址 + * @param getPayStatus 是否获取支付状态 + * @return UserOrderDto + * */ + private UserOrderDto getOrderDetail(MtOrder orderInfo, boolean needAddress, boolean getPayStatus) throws BusinessCheckException { + UserOrderDto userOrderDto = new UserOrderDto(); + + userOrderDto.setId(orderInfo.getId()); + userOrderDto.setMerchantId(orderInfo.getMerchantId()); + userOrderDto.setStoreId(orderInfo.getStoreId()); + userOrderDto.setUserId(orderInfo.getUserId()); + userOrderDto.setCouponId(orderInfo.getCouponId()); + userOrderDto.setOrderSn(orderInfo.getOrderSn()); + userOrderDto.setRemark(orderInfo.getRemark()); + userOrderDto.setType(orderInfo.getType()); + userOrderDto.setPayType(orderInfo.getPayType()); + userOrderDto.setOrderMode(orderInfo.getOrderMode()); + userOrderDto.setCreateTime(DateUtil.formatDate(orderInfo.getCreateTime(), "yyyy.MM.dd HH:mm")); + userOrderDto.setUpdateTime(DateUtil.formatDate(orderInfo.getUpdateTime(), "yyyy.MM.dd HH:mm")); + userOrderDto.setAmount(orderInfo.getAmount()); + userOrderDto.setIsVisitor(orderInfo.getIsVisitor()); + userOrderDto.setStaffId(orderInfo.getStaffId()); + userOrderDto.setVerifyCode(""); + userOrderDto.setDeliveryFee(orderInfo.getDeliveryFee()); + userOrderDto.setPlatform(orderInfo.getPlatform()); + userOrderDto.setConfirmRemark(orderInfo.getConfirmRemark()); + userOrderDto.setConfirmStatus(orderInfo.getConfirmStatus()); + if (orderInfo.getConfirmTime() != null) { + userOrderDto.setConfirmTime(DateUtil.formatDate(orderInfo.getConfirmTime(), "yyyy.MM.dd HH:mm")); + } + + if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey()) && orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey()) && orderInfo.getConfirmStatus().equals(YesOrNoEnum.NO.getKey())) { + userOrderDto.setIsVerify(false); + } else { + userOrderDto.setIsVerify(true); + } + + if (orderInfo.getPayAmount() != null) { + userOrderDto.setPayAmount(orderInfo.getPayAmount()); + } else { + userOrderDto.setPayAmount(new BigDecimal("0")); + } + + if (orderInfo.getDiscount() != null) { + userOrderDto.setDiscount(orderInfo.getDiscount()); + } else { + userOrderDto.setDiscount(new BigDecimal("0")); + } + + if (orderInfo.getPointAmount() != null) { + userOrderDto.setPointAmount(orderInfo.getPointAmount()); + } else { + userOrderDto.setPointAmount(new BigDecimal("0")); + } + + userOrderDto.setStatus(orderInfo.getStatus()); + userOrderDto.setParam(orderInfo.getParam()); + userOrderDto.setPayStatus(orderInfo.getPayStatus()); + + if (orderInfo.getUsePoint() != null) { + userOrderDto.setUsePoint(orderInfo.getUsePoint()); + } else { + userOrderDto.setUsePoint(0); + } + if (orderInfo.getPayTime() != null) { + userOrderDto.setPayTime(DateUtil.formatDate(orderInfo.getPayTime(), "yyyy.MM.dd HH:mm")); + } + + userOrderDto.setTypeName(OrderTypeEnum.getValue(userOrderDto.getType())); + userOrderDto.setStatusText(OrderStatusEnum.getValue(userOrderDto.getStatus())); + + // 订单所属店铺 + MtStore storeInfo = storeService.queryStoreById(orderInfo.getStoreId()); + userOrderDto.setStoreInfo(storeInfo); + + // 所属员工 + if (orderInfo.getStaffId() != null && orderInfo.getStaffId() > 0) { + MtStaff staffInfo = staffService.queryStaffById(orderInfo.getStaffId()); + userOrderDto.setStaffInfo(staffInfo); + } + + // 下单用户信息直接取会员个人信息 + OrderUserDto userInfo = new OrderUserDto(); + MtUser user = memberService.queryMemberById(orderInfo.getUserId()); + if (user != null) { + userInfo.setId(user.getId()); + userInfo.setNo(user.getUserNo()); + userInfo.setName(user.getName()); + if (StringUtil.isNotBlank(user.getMobile())) { + userInfo.setMobile(CommonUtil.hidePhone(user.getMobile())); + } + userInfo.setCardNo(user.getIdcard()); + userInfo.setAddress(user.getAddress()); + userInfo.setOpenId(user.getOpenId()); + userOrderDto.setUserInfo(userInfo); + } + + List goodsList = new ArrayList<>(); + String baseImage = settingService.getUploadBasePath(); + + // 储值卡的订单 + if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) { + MtCoupon coupon = couponService.queryCouponById(orderInfo.getCouponId()); + if (coupon != null) { + String[] paramArr = orderInfo.getParam().split(","); + for (int i = 0; i < paramArr.length; i++) { + String[] item = paramArr[i].split("_"); + if (Integer.parseInt(item[2]) > 0) { + OrderGoodsDto goodsDto = new OrderGoodsDto(); + goodsDto.setId(coupon.getId()); + goodsDto.setType(OrderTypeEnum.PRESTORE.getKey()); + goodsDto.setName("预存¥" + item[0] + "到账¥" + item[1]); + goodsDto.setNum(Double.parseDouble(item[2])); + goodsDto.setPrice(item[0]); + goodsDto.setDiscount("0"); + if (coupon.getImage().indexOf(baseImage) == -1) { + goodsDto.setImage(baseImage + coupon.getImage()); + } + goodsList.add(goodsDto); + } + } + } + } + + // 商品订单 + if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) { + Map params = new HashMap<>(); + params.put("ORDER_ID", orderInfo.getId()); + List orderGoodsList = mtOrderGoodsMapper.selectByMap(params); + for (MtOrderGoods orderGoods : orderGoodsList) { + MtGoods goodsInfo = mtGoodsMapper.selectById(orderGoods.getGoodsId()); + if (goodsInfo != null) { + OrderGoodsDto orderGoodsDto = new OrderGoodsDto(); + orderGoodsDto.setId(orderGoods.getId()); + orderGoodsDto.setName(goodsInfo.getName()); + if (goodsInfo.getLogo().indexOf(baseImage) == -1) { + orderGoodsDto.setImage(baseImage + goodsInfo.getLogo()); + } + orderGoodsDto.setType(OrderTypeEnum.GOODS.getKey()); + orderGoodsDto.setNum(orderGoods.getNum()); + orderGoodsDto.setSkuId(orderGoods.getSkuId()); + orderGoodsDto.setPrice(orderGoods.getPrice().toString()); + orderGoodsDto.setDiscount(orderGoods.getDiscount().toString()); + orderGoodsDto.setGoodsId(orderGoods.getGoodsId()); + orderGoodsDto.setBookId(goodsInfo.getBookId()); + if (goodsInfo.getBookId() != null && goodsInfo.getBookId() > 0) { + MtBookItem bookItem = bookItemService.getUserBookItem(goodsInfo.getBookId(), orderInfo.getUserId(), orderGoods.getId()); + if (bookItem != null) { + orderGoodsDto.setMyBookId(bookItem.getId()); + } + } + if (orderGoods.getSkuId() > 0) { + List specList = goodsService.getSpecListBySkuId(orderGoods.getSkuId()); + orderGoodsDto.setSpecList(specList); + } + goodsList.add(orderGoodsDto); + } + } + } + + // 配送地址 + if (orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey()) && needAddress) { + List orderAddressList = mtOrderAddressMapper.getOrderAddress(orderInfo.getId()); + MtOrderAddress orderAddress = null; + if (orderAddressList.size() > 0) { + orderAddress = orderAddressList.get(0); + } + if (orderAddress != null) { + AddressDto address = new AddressDto(); + address.setId(orderAddress.getId()); + address.setName(orderAddress.getName()); + address.setMobile(orderAddress.getMobile()); + address.setDetail(orderAddress.getDetail()); + address.setProvinceId(orderAddress.getProvinceId()); + address.setCityId(orderAddress.getCityId()); + address.setRegionId(orderAddress.getRegionId()); + + if (orderAddress.getProvinceId() > 0) { + MtRegion mtProvince = mtRegionMapper.selectById(orderAddress.getProvinceId()); + if (mtProvince != null) { + address.setProvinceName(mtProvince.getName()); + } + } + if (orderAddress.getCityId() > 0) { + MtRegion mtCity = mtRegionMapper.selectById(orderAddress.getCityId()); + if (mtCity != null) { + address.setCityName(mtCity.getName()); + } + } + if (orderAddress.getRegionId() > 0) { + MtRegion mtRegion = mtRegionMapper.selectById(orderAddress.getRegionId()); + if (mtRegion != null) { + address.setRegionName(mtRegion.getName()); + } + } + + userOrderDto.setAddress(address); + } + } + + // 物流信息 + if (StringUtil.isNotEmpty(orderInfo.getExpressInfo())) { + JSONObject express = JSONObject.parseObject(orderInfo.getExpressInfo()); + ExpressDto expressInfo = new ExpressDto(); + expressInfo.setExpressNo(express.get("expressNo").toString()); + expressInfo.setExpressCompany(express.get("expressCompany").toString()); + expressInfo.setExpressTime(express.get("expressTime").toString()); + expressInfo.setExpressCode(express.get("expressCode") == null ? "" : express.get("expressCode").toString()); + userOrderDto.setExpressInfo(expressInfo); + } + + // 使用的卡券 + if (userOrderDto.getCouponId() != null && userOrderDto.getCouponId() > 0) { + MtUserCoupon mtUserCoupon = userCouponService.getUserCouponDetail(userOrderDto.getCouponId()); + if (mtUserCoupon != null) { + MtCoupon mtCoupon = couponService.queryCouponById(mtUserCoupon.getCouponId()); + if (mtCoupon != null) { + UserCouponDto couponInfo = new UserCouponDto(); + couponInfo.setId(mtUserCoupon.getId()); + couponInfo.setCouponId(mtCoupon.getId()); + couponInfo.setName(mtCoupon.getName()); + couponInfo.setAmount(mtUserCoupon.getAmount()); + couponInfo.setBalance(mtUserCoupon.getBalance()); + couponInfo.setStatus(mtUserCoupon.getStatus()); + couponInfo.setType(mtCoupon.getType()); + couponInfo.setContent(mtCoupon.getContent()); + userOrderDto.setCouponInfo(couponInfo); + } + } + } + + // 查询支付状态 + if (getPayStatus && !orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) { + // 微信支付 + if (orderInfo.getPayType().equals(PayTypeEnum.MICROPAY.getKey()) || orderInfo.getPayType().equals(PayTypeEnum.JSAPI.getKey())) { + try { + Map payResult = weixinService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn()); + if (payResult != null && payResult.get("trade_state").equals("SUCCESS")) { + BigDecimal payAmount = new BigDecimal(payResult.get("total_fee")).divide(new BigDecimal("100")); + setOrderPayed(orderInfo.getId(), payAmount); + userOrderDto.setPayStatus(PayStatusEnum.SUCCESS.getKey()); + } + } catch (Exception e) { + // empty + } + } + // 支付宝支付 + if (orderInfo.getPayType().equals(PayTypeEnum.ALISCAN.getKey())) { + try { + Map payResult = alipayService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn()); + if (payResult != null) { + BigDecimal payAmount = new BigDecimal(payResult.get("payAmount")); + setOrderPayed(orderInfo.getId(), payAmount); + userOrderDto.setPayStatus(PayStatusEnum.SUCCESS.getKey()); + } + } catch (Exception e) { + // empty + } + } + } + userOrderDto.setGoods(goodsList); + return userOrderDto; + } + + /** + * 获取订单总数 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + @Override + public BigDecimal getOrderCount(Integer merchantId, Integer storeId) { + if (storeId != null && storeId > 0) { + return mtOrderMapper.getStoreOrderCount(storeId); + } else { + return mtOrderMapper.getOrderCount(merchantId); + } + } + + /** + * 获取订单数量 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public BigDecimal getOrderCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) { + if (storeId != null && storeId > 0) { + return mtOrderMapper.getStoreOrderCountByTime(storeId, beginTime, endTime); + } else { + return mtOrderMapper.getOrderCountByTime(merchantId, beginTime, endTime); + } + } + + /** + * 获取支付金额 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public BigDecimal getPayMoney(Integer merchantId, Integer storeId, Date beginTime, Date endTime) { + BigDecimal payMoney; + if (storeId != null && storeId > 0) { + payMoney = mtOrderMapper.getStorePayMoneyByTime(storeId, beginTime, endTime); + } else { + payMoney = mtOrderMapper.getPayMoneyByTime(merchantId, beginTime, endTime); + } + if (payMoney == null) { + return new BigDecimal("0"); + } + return payMoney; + } + + /** + * 获取支付人数 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + @Override + public Integer getPayUserCount(Integer merchantId, Integer storeId) { + if (storeId != null && storeId > 0) { + return mtOrderMapper.getStorePayUserCount(storeId); + } else { + return mtOrderMapper.getPayUserCount(merchantId); + } + } + + /** + * 获取支付总金额 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @return + * */ + @Override + public BigDecimal getPayMoney(Integer merchantId, Integer storeId) { + if (storeId != null && storeId > 0) { + return mtOrderMapper.getStorePayMoney(storeId); + } else { + return mtOrderMapper.getPayMoney(merchantId); + } + } + + /** + * 计算商品总价 + * + * @param merchantId 商户ID + * @param userId 会员ID + * @param cartList 购物车列表 + * @param couponId 卡券ID + * @param isUsePoint 使用积分数量 + * @param orderMode 订单模式 + * @throws BusinessCheckException + * @return + * */ + @Override + public Map calculateCartGoods(Integer merchantId, Integer userId, List cartList, Integer couponId, boolean isUsePoint, String platform, String orderMode) throws BusinessCheckException { + MtUser userInfo = memberService.queryMemberById(userId); + + // 设置是否不能用积分抵扣 + MtSetting pointSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.CAN_USE_AS_MONEY.getKey()); + if (pointSetting != null && !pointSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) { + isUsePoint = false; + } + + List cartDtoList = new ArrayList<>(); + String basePath = settingService.getUploadBasePath(); + Double totalNum = 0.0; + BigDecimal totalPrice = new BigDecimal("0"); + BigDecimal totalCanUsePointAmount = new BigDecimal("0"); + BigDecimal memberDiscount = new BigDecimal("0"); + BigDecimal percent = new BigDecimal("0"); + Integer storeId = 0; + if (cartList.size() > 0) { + // 会员折扣 + MtUserGrade userGrade = userGradeService.queryUserGradeById(userInfo.getMerchantId(), userInfo.getGradeId() != null ? userInfo.getGradeId() : 1, userId); + if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) { + percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 4); + if (percent.compareTo(new BigDecimal("0")) <= 0) { + percent = new BigDecimal("1"); + } + } + for (MtCart cart : cartList) { + if (storeId <= 0 && cart.getStoreId() != null) { + storeId = cart.getStoreId(); + } + // 购物车商品信息 + MtGoods mtGoodsInfo = goodsService.queryGoodsById(cart.getGoodsId()); + if (mtGoodsInfo == null || !mtGoodsInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + continue; + } + // 取对应sku的价格 + if (cart.getSkuId() != null && cart.getSkuId() > 0) { + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId()); + if (mtGoodsSku != null && mtGoodsSku.getPrice().compareTo(new BigDecimal("0")) > 0) { + mtGoodsInfo.setPrice(mtGoodsSku.getPrice()); + } + } + // 会员支付折扣 + boolean isDiscount = mtGoodsInfo.getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false; + if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) { + BigDecimal discount = mtGoodsInfo.getPrice().subtract(mtGoodsInfo.getPrice().multiply(percent)).multiply(new BigDecimal(cart.getNum())); + memberDiscount = memberDiscount.add(discount); + } + totalNum = totalNum + cart.getNum(); + ResCartDto cartDto = new ResCartDto(); + cartDto.setId(cart.getId()); + cartDto.setGoodsId(cart.getGoodsId()); + cartDto.setNum(cart.getNum()); + cartDto.setSkuId(cart.getSkuId()); + cartDto.setUserId(cart.getUserId()); + // 购物车是否有效 + Boolean isEffect = true; + if (cart.getSkuId() > 0) { + List specList = goodsService.getSpecListBySkuId(cart.getSkuId()); + cartDto.setSpecList(specList); + } + if (StringUtil.isNotEmpty(mtGoodsInfo.getLogo()) && (mtGoodsInfo.getLogo().indexOf(basePath) == -1)) { + mtGoodsInfo.setLogo(basePath + mtGoodsInfo.getLogo()); + } + // 读取sku的数据 + if (cart.getSkuId() > 0) { + MtGoods mtGoods = new MtGoods(); + BeanUtils.copyProperties(mtGoodsInfo, mtGoods); + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId()); + if (mtGoodsSku != null) { + if (StringUtil.isNotEmpty(mtGoodsSku.getLogo()) && (mtGoodsSku.getLogo().indexOf(basePath) == -1)) { + mtGoods.setLogo(basePath + mtGoodsSku.getLogo()); + } + if (mtGoodsSku.getWeight().compareTo(new BigDecimal("0")) > 0) { + mtGoods.setWeight(mtGoodsSku.getWeight()); + } + mtGoods.setPrice(mtGoodsSku.getPrice()); + mtGoods.setLinePrice(mtGoodsSku.getLinePrice()); + mtGoods.setStock(mtGoodsSku.getStock()); + } + cartDto.setGoodsInfo(mtGoods); + } else { + cartDto.setGoodsInfo(mtGoodsInfo); + } + if (mtGoodsInfo.getStock() != null && mtGoodsInfo.getStock() < cartDto.getNum()) { + isEffect = false; + } + cartDto.setIsEffect(isEffect); + // 计算总价 + totalPrice = totalPrice.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum()))); + // 累加可用积分去抵扣的金额 + if (mtGoodsInfo.getCanUsePoint() != null && mtGoodsInfo.getCanUsePoint().equals(YesOrNoEnum.YES.getKey())) { + totalCanUsePointAmount = totalCanUsePointAmount.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum()))); + } + cartDtoList.add(cartDto); + } + } + + Map result = new HashMap<>(); + + // 可用卡券列表 + List couponList = new ArrayList<>(); + List statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey()); + List userCouponList = userCouponService.getUserCouponList(userId, statusList); + if (userCouponList.size() > 0) { + for (MtUserCoupon userCoupon : userCouponList) { + MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId()); + // 优惠券和储值卡才能使用 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey()) || couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + CouponDto couponDto = new CouponDto(); + couponDto.setId(couponInfo.getId()); + couponDto.setUserCouponId(userCoupon.getId()); + couponDto.setName(couponInfo.getName()); + couponDto.setAmount(userCoupon.getAmount()); + couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey()); + couponDto.setContent(couponInfo.getContent()); + // 购物不能用专用的卡券 + if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) { + if (couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) { + continue; + } + if (couponInfo.getUseFor().equals(CouponUseForEnum.OFF_LINE_PAYMENT.getKey())) { + // 只有PC收银端能用 + if (!platform.equals(PlatformTypeEnum.PC.getCode())) { + continue; + } + } + } + // 判断在当前门店是否适用 + if (StringUtil.isNotEmpty(couponInfo.getStoreIds())) { + String[] storeIds = couponInfo.getStoreIds().split(","); + if (storeIds.length > 0 && storeId != null && !Arrays.asList(storeIds).contains(storeId.toString())) { + continue; + } + } + boolean isEffective = couponService.isCouponEffective(couponInfo, userCoupon); + // 优惠券 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + couponDto.setType(CouponTypeEnum.COUPON.getValue()); + if (StringUtil.isEmpty(couponInfo.getOutRule()) || couponInfo.getOutRule().equals("0")) { + couponDto.setDescription("无使用门槛"); + if (isEffective) { + couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + } + } else { + couponDto.setDescription("满" + couponInfo.getOutRule() + "元可用"); + BigDecimal conditionAmount = new BigDecimal(couponInfo.getOutRule()); + if (totalPrice.compareTo(conditionAmount) >= 0 && isEffective) { + couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + } + } + } else if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + // 储值卡 + couponDto.setType(CouponTypeEnum.PRESTORE.getValue()); + couponDto.setDescription("无使用门槛"); + couponDto.setAmount(userCoupon.getBalance()); + // 余额须大于0 + if (isEffective && (userCoupon.getBalance().compareTo(new BigDecimal("0")) > 0)) { + couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + } + } + // 适用商品 + if (userCoupon != null) { + if (couponInfo.getApplyGoods() != null && couponInfo.getApplyGoods().equals(ApplyGoodsEnum.PARK_GOODS.getKey())) { + List couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId()); + if (couponGoodsList != null && couponGoodsList.size() > 0 && cartList.size() > 0) { + List applyGoodsIds = new ArrayList<>(); + List goodsIds = new ArrayList<>(); + for (MtCouponGoods mtCouponGoods : couponGoodsList) { + applyGoodsIds.add(mtCouponGoods.getGoodsId()); + } + for (MtCart mtCart : cartList) { + goodsIds.add(mtCart.getGoodsId()); + } + List intersection = applyGoodsIds.stream() + .filter(goodsIds::contains) + .collect(Collectors.toList()); + if (intersection.size() == 0) { + couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey()); + } + } + } + } + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) { + couponDto.setEffectiveDate(DateUtil.formatDate(couponInfo.getBeginTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(couponInfo.getEndTime(), "yyyy.MM.dd HH:mm")); + } + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + couponDto.setEffectiveDate(DateUtil.formatDate(userCoupon.getCreateTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(userCoupon.getExpireTime(), "yyyy.MM.dd HH:mm")); + } + if (couponDto.getStatus().equals(UserCouponStatusEnum.UNUSED.getKey())) { + couponList.add(couponDto); + } + } + } + } + + // 使用的卡券 + MtCoupon useCouponInfo = null; + BigDecimal couponAmount = new BigDecimal("0"); + if (couponId > 0) { + MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId); + if (userCouponInfo != null) { + useCouponInfo = couponService.queryCouponById(userCouponInfo.getCouponId()); + boolean isEffective = couponService.isCouponEffective(useCouponInfo, userCouponInfo); + if (isEffective) { + if (useCouponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + couponAmount = useCouponInfo.getAmount(); + // 折扣券 + if (useCouponInfo.getContent().equals(CouponContentEnum.PERCENT.getKey())) { + BigDecimal disc = userCouponInfo.getAmount().divide(new BigDecimal("100"), BigDecimal.ROUND_CEILING, 4); + couponAmount = totalPrice.multiply(new BigDecimal(1).subtract(disc)); + } + } else if (useCouponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + BigDecimal couponTotalAmount = userCouponInfo.getBalance(); + if (couponTotalAmount.compareTo(totalPrice) > 0) { + couponAmount = totalPrice; + useCouponInfo.setAmount(totalPrice); + } else { + couponAmount = couponTotalAmount; + useCouponInfo.setAmount(couponTotalAmount); + } + } + } + } + } + + // 支付金额 = 商品总额 - 卡券抵扣金额 + BigDecimal payPrice = totalPrice.subtract(couponAmount); + + // 可用积分、可用积分金额 + Integer myPoint = userInfo.getPoint() == null ? 0 : userInfo.getPoint(); + Integer usePoint = 0; + BigDecimal usePointAmount = new BigDecimal("0"); + MtSetting setting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.EXCHANGE_NEED_POINT.getKey()); + if (myPoint > 0 && setting != null && isUsePoint) { + if (StringUtil.isNotEmpty(setting.getValue()) && !setting.getValue().equals("0")) { + BigDecimal usePoints = new BigDecimal(myPoint); + usePointAmount = usePoints.divide(new BigDecimal(setting.getValue()), BigDecimal.ROUND_CEILING, 4); + usePoint = myPoint; + if (usePointAmount.compareTo(totalCanUsePointAmount) >= 0) { + usePointAmount = totalCanUsePointAmount; + usePoint = totalCanUsePointAmount.multiply(new BigDecimal(setting.getValue())).intValue(); + } + } + } + + // 积分金额不能大于支付金额 + if (usePointAmount.compareTo(payPrice) > 0 && isUsePoint) { + usePointAmount = payPrice; + BigDecimal usePoints = payPrice.multiply(new BigDecimal(setting.getValue())); + usePoint = usePoints.intValue(); + } + + // 支付金额 = 商品总额 - 积分抵扣金额 + payPrice = payPrice.subtract(usePointAmount); + + // 配送费用 + BigDecimal deliveryFee = new BigDecimal("0"); + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_FEE.getKey()); + if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue()) && orderMode.equals(OrderModeEnum.EXPRESS.getKey())) { + deliveryFee = new BigDecimal(mtSetting.getValue()); + } + + payPrice = payPrice.add(deliveryFee).subtract(memberDiscount); + BigDecimal discount = totalPrice.subtract(payPrice).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 2); + + if (payPrice.compareTo(new BigDecimal("0")) < 0) { + payPrice = new BigDecimal("0"); + } + + result.put("list", cartDtoList); + result.put("totalNum", totalNum); + result.put("totalPrice", totalPrice); + result.put("payPrice", payPrice); + result.put("couponList", couponList); + result.put("useCouponInfo", useCouponInfo); + result.put("usePoint", usePoint); + result.put("myPoint", myPoint); + result.put("couponAmount", couponAmount); + result.put("usePointAmount", usePointAmount); + result.put("deliveryFee", deliveryFee); + result.put("discount", discount); + if (memberDiscount.compareTo(new BigDecimal("0")) > 0) { + result.put("memberDiscount", (new BigDecimal("10").multiply(percent))); + } else { + result.put("memberDiscount", 0); + } + + return result; + } + + /** + * 获取会员支付金额 + * + * @param userId 会员ID + * @return + * */ + @Override + public BigDecimal getUserPayMoney(Integer userId) { + return mtOrderMapper.getUserPayMoney(userId); + } + + /** + * 获取会员订单数 + * + * @param userId 会员ID + * @return + * */ + @Override + public Integer getUserPayOrderCount(Integer userId) { + return mtOrderMapper.getUserPayOrderCount(userId); + } + + /** + * 获取等待分佣的订单列表 + * + * @param dateTime 时间 + * @return + * */ + @Override + public List getTobeCommissionOrderList(String dateTime) { + return mtOrderMapper.getTobeCommissionOrderList(dateTime); + } + + /** + * 提交充值订单 + * */ + @Override + public MtOrder doRecharge(HttpServletRequest request, RechargeParam rechargeParam) throws BusinessCheckException { + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform"); + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + + String rechargeAmount = rechargeParam.getRechargeAmount() == null ? "" : rechargeParam.getRechargeAmount(); + String customAmount = rechargeParam.getCustomAmount() == null ? "" : rechargeParam.getCustomAmount(); + if (StringUtil.isEmpty(rechargeAmount) && StringUtil.isEmpty(customAmount)) { + throw new BusinessCheckException("请确认充值金额"); + } + if (rechargeParam.getMemberId() == null || rechargeParam.getMemberId() < 1) { + throw new BusinessCheckException("请确认充值会员信息"); + } + + Integer merchantId = merchantService.getMerchantId(merchantNo); + + // 充值赠送金额 + String ruleParam = ""; + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.BALANCE.getKey(), BalanceSettingEnum.RECHARGE_RULE.getKey()); + if (StringUtil.isNotEmpty(rechargeAmount) && mtSetting != null) { + if (!mtSetting.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("当前未开启充值功能"); + } + if (mtSetting.getValue() != null && StringUtil.isNotEmpty(mtSetting.getValue())) { + String rules[] = mtSetting.getValue().split(","); + for (String rule : rules) { + String amountArr[] = rule.split("_"); + if (amountArr.length >= 2) { + if (amountArr[0].equals(rechargeAmount)) { + ruleParam = rule; + break; + } + } + } + } + } + + // 自定义充值没有赠送金额 + if (StringUtil.isNotEmpty(customAmount) && Integer.parseInt(customAmount) > 0 && (StringUtil.isEmpty(rechargeAmount) || Integer.parseInt(rechargeAmount) <= 0)) { + rechargeAmount = customAmount; + ruleParam = customAmount + "_0"; + } + + if (StringUtil.isEmpty(ruleParam)) { + ruleParam = rechargeAmount + "_0"; + } + + BigDecimal amount = new BigDecimal(rechargeAmount); + if (amount.compareTo(new BigDecimal("0")) <= 0) { + throw new BusinessCheckException("请确认充值金额"); + } + + OrderDto orderDto = new OrderDto(); + orderDto.setType(OrderTypeEnum.RECHARGE.getKey()); + orderDto.setUserId(rechargeParam.getMemberId()); + orderDto.setStoreId(storeId); + orderDto.setAmount(amount); + orderDto.setUsePoint(0); + orderDto.setRemark("会员充值"); + orderDto.setParam(ruleParam); + orderDto.setStatus(OrderStatusEnum.CREATED.getKey()); + orderDto.setPayStatus(PayStatusEnum.WAIT.getKey()); + orderDto.setPointAmount(new BigDecimal("0")); + orderDto.setOrderMode(""); + orderDto.setCouponId(0); + orderDto.setPlatform(platform); + orderDto.setMerchantId(merchantId); + + return saveOrder(orderDto); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/PaymentServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/PaymentServiceImpl.java new file mode 100644 index 0000000..2c49971 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/PaymentServiceImpl.java @@ -0,0 +1,331 @@ +package com.fuint.common.service.impl; + +import com.fuint.common.dto.*; +import com.fuint.common.enums.OrderTypeEnum; +import com.fuint.common.enums.PayTypeEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.MtOrderMapper; +import com.fuint.repository.model.MtBalance; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 支付相关接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class PaymentServiceImpl implements PaymentService { + + private static final Logger logger = LoggerFactory.getLogger(PaymentServiceImpl.class); + + private MtOrderMapper mtOrderMapper; + + /** + * 微信服务接口 + * */ + private WeixinService weixinService; + + /** + * 支付宝服务接口 + * */ + private AlipayService alipayService; + + /** + * 云闪付服务接口 + * */ + private UnionPayService unionPayService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 余额服务接口 + * */ + private BalanceService balanceService; + + /** + * 会员卡券服务接口 + * */ + private UserCouponService userCouponService; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 创建预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP地址 + * @param platform 支付平台 + * @param isWechat 是否微信客户端 + * @return + * */ + @Override + public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException { + logger.info("PaymentService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo); + + ResponseObject responseObject; + if (orderInfo.getPayType().equals(PayTypeEnum.ALISCAN.getKey())) { + // 支付宝支付 + responseObject = alipayService.createPrepayOrder(userInfo, orderInfo, payAmount, authCode, giveAmount, ip, platform); + } else if (orderInfo.getPayType().equals(PayTypeEnum.UNIONPAY.getKey())) { + // 云闪付支付 + responseObject = unionPayService.createPrepayOrder(userInfo, orderInfo, payAmount, authCode, giveAmount, ip, platform); + } else { + // 微信支付 + responseObject = weixinService.createPrepayOrder(userInfo, orderInfo, payAmount, authCode, giveAmount, ip, platform, isWechat); + } + + logger.info("PaymentService createPrepayOrder outParams {}", responseObject.toString()); + return responseObject; + } + + /** + * 支付成功回调 + * + * @param orderInfo 订单信息 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentCallback(UserOrderDto orderInfo) throws BusinessCheckException { + logger.info("paymentCallback outParams {}", orderInfo.toString()); + MtOrder mtOrder = mtOrderMapper.selectById(orderInfo.getId()); + + // 更新订单状态为已支付 + Boolean isPay = orderService.setOrderPayed(orderInfo.getId(), null); + if (mtOrder == null || !isPay) { + return false; + } + + // 储值卡订单 + if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) { + Map param = new HashMap<>(); + param.put("couponId", orderInfo.getCouponId()); + param.put("userId", orderInfo.getUserId()); + param.put("param", orderInfo.getParam()); + param.put("orderId", orderInfo.getId()); + userCouponService.preStore(param); + } + + // 充值订单 + if (orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) { + // 余额支付 + MtBalance mtBalance = new MtBalance(); + OrderUserDto userDto = orderInfo.getUserInfo(); + if (userDto.getMobile() != null && StringUtil.isNotEmpty(userDto.getMobile())) { + mtBalance.setMobile(userDto.getMobile()); + } + mtBalance.setOrderSn(orderInfo.getOrderSn()); + mtBalance.setUserId(orderInfo.getUserId()); + mtBalance.setMerchantId(orderInfo.getMerchantId()); + String param = orderInfo.getParam(); + if (StringUtil.isNotEmpty(param)) { + String params[] = param.split("_"); + if (params.length >= 2) { + BigDecimal amount = new BigDecimal(params[0]).add(new BigDecimal(params[1])); + mtBalance.setAmount(amount); + balanceService.addBalance(mtBalance, true); + } + // 充值赠送卡券 + if (params.length == 3) { + try { + String[] couponIds = params[2].split("\\|"); + if (couponIds != null && couponIds.length > 0) { + for (int i = 0; i < couponIds.length; i++) { + ResponseObject result = couponService.sendCoupon(Integer.parseInt(couponIds[i]), orderInfo.getUserId(), 1, true, null, null); + if (!result.getCode().equals(200)) { + logger.error("充值赠送卡券失败:", result.getMessage()); + } + } + } + } catch (Exception e) { + logger.error("sendCoupon error", e); + } + } + } + } + + logger.info("PaymentService paymentCallback Success orderSn {}", orderInfo.getOrderSn()); + return true; + } + + /** + * 发起支付 + * + * @param request 请求参数 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map doPay(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform"); + String isWechat = request.getHeader("isWechat") == null ? "" : request.getHeader("isWechat"); + String payType = request.getParameter("payType") == null ? PayTypeEnum.JSAPI.getKey() : request.getParameter("payType"); + String cashierPayAmount = request.getParameter("cashierPayAmount") == null ? "" : request.getParameter("cashierPayAmount"); // 收银台实付金额 + String cashierDiscountAmount = request.getParameter("cashierDiscountAmount") == null ? "" : request.getParameter("cashierDiscountAmount"); // 收银台优惠金额 + UserInfo loginInfo = TokenUtil.getUserInfoByToken(token); + String orderId = request.getParameter("orderId"); + String userId = request.getParameter("userId"); + String authCode = request.getParameter("authCode"); + if (StringUtil.isEmpty(orderId)) { + throw new BusinessCheckException("订单不能为空"); + } + if (orderId.length() >= 12) { + MtOrder mtOrder = orderService.getOrderInfoByOrderSn(orderId); + if (mtOrder != null) { + orderId = mtOrder.getId().toString(); + } + } + MtOrder orderInfo = mtOrderMapper.selectById(Integer.parseInt(orderId)); + if (orderInfo == null) { + throw new BusinessCheckException("该订单不存在"); + } + MtUser mtUser = null; + if (loginInfo != null) { + mtUser = memberService.queryMemberById(loginInfo.getId()); + } + + // 重新生成订单号 + String orderSn = CommonUtil.createOrderSN(orderInfo.getUserId().toString()); + orderInfo.setOrderSn(orderSn); + orderInfo.setPayType(payType); + orderInfo.setPlatform(platform); + orderInfo = orderService.updateOrder(orderInfo); + + // 收银员操作 + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (loginInfo == null && accountInfo != null) { + // 游客订单绑定到会员 + if (orderInfo.getIsVisitor().equals(YesOrNoEnum.YES.getKey()) && StringUtil.isNotEmpty(userId)) { + mtUser = memberService.queryMemberById(Integer.parseInt(userId)); + orderInfo.setUserId(Integer.parseInt(userId)); + orderInfo.setIsVisitor(YesOrNoEnum.NO.getKey()); + orderService.updateOrder(orderInfo); + } else { + mtUser = memberService.queryMemberById(orderInfo.getUserId()); + } + } + + if (mtUser == null) { + throw new BusinessCheckException("登录信息失效"); + } + + if (accountInfo != null && StringUtil.isNotEmpty(cashierPayAmount) && StringUtil.isNotEmpty(cashierDiscountAmount)) { + orderInfo.setDiscount(new BigDecimal(cashierDiscountAmount)); + if (loginInfo == null) { + MtUser user = memberService.queryMemberById(orderInfo.getUserId()); + if (user != null) { + loginInfo = new UserInfo(); + loginInfo.setId(user.getId()); + } + } + } + + // 实付金额 = 总金额 - 优惠金额 - 积分金额 + BigDecimal realPayAmount = orderInfo.getAmount().subtract(new BigDecimal(orderInfo.getDiscount().toString())).subtract(new BigDecimal(orderInfo.getPointAmount().toString())).add(orderInfo.getDeliveryFee()); + Object payment = null; + Boolean isPaying = false; + if (payType.equals(PayTypeEnum.BALANCE.getKey())) { + if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey()) || orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) { + throw new BusinessCheckException("抱歉,不能使用余额支付"); + } + // 余额支付 + MtBalance balance = new MtBalance(); + balance.setMobile(mtUser.getMobile()); + balance.setOrderSn(orderInfo.getOrderSn()); + balance.setStoreId(orderInfo.getStoreId()); + balance.setUserId(mtUser.getId()); + BigDecimal balanceAmount = realPayAmount.subtract(realPayAmount).subtract(realPayAmount); + balance.setAmount(balanceAmount); + boolean isPay = balanceService.addBalance(balance, true); + if (isPay) { + orderService.setOrderPayed(orderInfo.getId(), balanceAmount); + OrderDto reqOrder = new OrderDto(); + reqOrder.setId(orderInfo.getId()); + reqOrder.setPayAmount(realPayAmount); + reqOrder.setDiscount(orderInfo.getDiscount()); + reqOrder.setPayType(PayTypeEnum.BALANCE.getKey()); + if (accountInfo != null) { + reqOrder.setOperator(accountInfo.getAccountName()); + } + orderService.updateOrder(reqOrder); + orderInfo = orderService.getOrderInfo(orderInfo.getId()); + } else { + throw new BusinessCheckException("会员余额不足"); + } + } else if (payType.equals(PayTypeEnum.CASH.getKey()) && accountInfo != null) { + // 现金支付 + OrderDto reqOrder = new OrderDto(); + reqOrder.setId(orderInfo.getId()); + reqOrder.setAmount(new BigDecimal(cashierPayAmount).add(new BigDecimal(cashierDiscountAmount))); + reqOrder.setDiscount(new BigDecimal(cashierDiscountAmount)); + reqOrder.setPayAmount(new BigDecimal(cashierPayAmount)); + reqOrder.setPayTime(new Date()); + reqOrder.setPayType(PayTypeEnum.CASH.getKey()); + reqOrder.setOperator(accountInfo.getAccountName()); + orderService.updateOrder(reqOrder); + orderService.setOrderPayed(orderInfo.getId(), null); + orderInfo = orderService.getOrderInfo(orderInfo.getId()); + } else { + String ip = CommonUtil.getIPFromHttpRequest(request); + BigDecimal pay = realPayAmount.multiply(new BigDecimal("100")); + orderInfo.setPayType(payType); + ResponseObject paymentInfo = createPrepayOrder(mtUser, orderInfo, (pay.intValue()), authCode, 0, ip, platform, isWechat); + if (paymentInfo.getData() == null) { + if (paymentInfo.getCode() == 3000) { + logger.info("需要用户输入密码.."); + isPaying = true; + } else { + throw new BusinessCheckException("抱歉,支付失败"); + } + } + payment = paymentInfo.getData(); + } + + Map result = new HashMap(); + result.put("isCreated", true); + result.put("payType", payType); + result.put("orderInfo", orderInfo); + result.put("payment", payment); + result.put("isPaying", isPaying); + + return result; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/PointServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/PointServiceImpl.java new file mode 100644 index 0000000..e899d55 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/PointServiceImpl.java @@ -0,0 +1,274 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.PointDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.WxMessageEnum; +import com.fuint.common.service.MemberService; +import com.fuint.common.service.PointService; +import com.fuint.common.service.SendSmsService; +import com.fuint.common.service.WeixinService; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtPointMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.MtPoint; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import com.github.pagehelper.Page; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 积分管理业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class PointServiceImpl extends ServiceImpl implements PointService { + + private static final Logger logger = LoggerFactory.getLogger(PointServiceImpl.class); + + private MtPointMapper mtPointMapper; + + private MtUserMapper mtUserMapper; + + /** + * 短信发送服务接口 + * */ + private SendSmsService sendSmsService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 微信相关服务接口 + * */ + private WeixinService weixinService; + + /** + * 分页查询积分列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryPointListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtPoint::getStatus, StatusEnum.DISABLE.getKey()); + + String description = paginationRequest.getSearchParams().get("description") == null ? "" : paginationRequest.getSearchParams().get("description").toString(); + if (StringUtils.isNotBlank(description)) { + lambdaQueryWrapper.like(MtPoint::getDescription, description); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtPoint::getStatus, status); + } + String userId = paginationRequest.getSearchParams().get("userId") == null ? "" : paginationRequest.getSearchParams().get("userId").toString(); + if (StringUtils.isNotBlank(userId)) { + lambdaQueryWrapper.eq(MtPoint::getUserId, userId); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtPoint::getMerchantId, merchantId); + } + String userNo = paginationRequest.getSearchParams().get("userNo") == null ? "" : paginationRequest.getSearchParams().get("userNo").toString(); + if (StringUtil.isNotEmpty(userNo)) { + if (StringUtil.isEmpty(merchantId)) { + merchantId = "0"; + } + MtUser userInfo = memberService.queryMemberByUserNo(Integer.parseInt(merchantId), userNo); + if (userInfo != null) { + lambdaQueryWrapper.eq(MtPoint::getUserId, userInfo.getId()); + } else { + lambdaQueryWrapper.eq(MtPoint::getUserId, -1); + } + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtPoint::getStoreId, storeId); + } + + lambdaQueryWrapper.orderByDesc(MtPoint::getId); + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + List pointList = mtPointMapper.selectList(lambdaQueryWrapper); + + List dataList = new ArrayList<>(); + for (MtPoint point : pointList) { + MtUser userInfo = memberService.queryMemberById(point.getUserId()); + if (userInfo != null) { + userInfo.setMobile(CommonUtil.hidePhone(userInfo.getMobile())); + } + PointDto item = new PointDto(); + BeanUtils.copyProperties(point, item); + item.setUserInfo(userInfo); + dataList.add(item); + } + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, PointDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加积分记录 + * + * @param mtPoint 积分参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改会员积分") + public void addPoint(MtPoint mtPoint) throws BusinessCheckException { + if (mtPoint.getUserId() < 0) { + return; + } + mtPoint.setStatus(StatusEnum.ENABLED.getKey()); + mtPoint.setCreateTime(new Date()); + mtPoint.setUpdateTime(new Date()); + if (mtPoint.getOperator() != null) { + mtPoint.setOperator(mtPoint.getOperator()); + } + + if (mtPoint.getOrderSn() != null) { + mtPoint.setOrderSn(mtPoint.getOrderSn()); + } + + MtUser mtUser = mtUserMapper.selectById(mtPoint.getUserId()); + Integer newAmount = mtUser.getPoint() + mtPoint.getAmount(); + if (newAmount < 0) { + return; + } + mtUser.setPoint(newAmount); + if (mtUser.getStoreId() != null) { + mtPoint.setStoreId(mtUser.getStoreId()); + } + mtPoint.setMerchantId(mtUser.getMerchantId()); + mtUserMapper.updateById(mtUser); + mtPointMapper.insert(mtPoint); + + try { + List mobileList = new ArrayList<>(); + mobileList.add(mtUser.getMobile()); + Map params = new HashMap<>(); + String action = ""; + if (mtPoint.getAmount() > 0) { + action = "+"; + } + params.put("amount", action + mtPoint.getAmount().toString()); + params.put("balance", mtUser.getPoint().toString()); + sendSmsService.sendSms(mtUser.getMerchantId(), "points-change", mobileList, params); + } catch (Exception e) { + logger.error("积分变动短信发送失败:{}", e.getMessage()); + } + + // 发送小程序订阅消息 + Date nowTime = new Date(); + Map params = new HashMap<>(); + String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm"); + params.put("amount", mtPoint.getAmount()); + params.put("time", dateTime); + params.put("remark", "您的积分发生了变动,请留意~"); + weixinService.sendSubscribeMessage(mtPoint.getMerchantId(), mtPoint.getUserId(), mtUser.getOpenId(), WxMessageEnum.POINT_CHANGE.getKey(), "pages/user/index", params, nowTime); + } + + /** + * 转赠积分 + * + * @param userId 会员ID + * @param mobile 会员手机 + * @param amount 积分数 + * @param remark 备注 + * @throws BusinessCheckException + * @return boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean doGift(Integer userId, String mobile, Integer amount, String remark) throws BusinessCheckException { + if (userId < 0 || StringUtil.isEmpty(mobile) || amount <= 0) { + return false; + } + + MtUser userInfo = memberService.queryMemberById(userId); + MtUser fUserInfo = memberService.queryMemberByMobile(userInfo.getMerchantId(), mobile); + // 自动注册会员 + if (fUserInfo == null) { + fUserInfo = memberService.addMemberByMobile(userInfo.getMerchantId(), mobile, userId.toString(), ""); + } + + if (fUserInfo == null) { + throw new BusinessCheckException("转赠的好友信息不存在"); + } + + if (fUserInfo.getId().equals(userInfo.getId())) { + throw new BusinessCheckException("积分不能转赠给自己"); + } + + Integer newAmount = fUserInfo.getPoint() + amount; + if (newAmount < 0) { + throw new BusinessCheckException("积分赠送失败"); + } + fUserInfo.setPoint(newAmount); + + Integer myNewAmount = userInfo.getPoint() - amount; + if (myNewAmount < 0) { + throw new BusinessCheckException("您的积分不足"); + } + userInfo.setPoint(myNewAmount); + + mtUserMapper.updateById(fUserInfo); + mtUserMapper.updateById(userInfo); + + MtPoint fMtPoint = new MtPoint(); + fMtPoint.setStatus(StatusEnum.ENABLED.getKey()); + fMtPoint.setAmount(amount); + fMtPoint.setCreateTime(new Date()); + fMtPoint.setUpdateTime(new Date()); + fMtPoint.setOperator(userInfo.getName()); + fMtPoint.setOrderSn(""); + fMtPoint.setDescription(remark); + fMtPoint.setUserId(fUserInfo.getId()); + fMtPoint.setMerchantId(fUserInfo.getMerchantId()); + mtPointMapper.insert(fMtPoint); + + MtPoint mtPoint = new MtPoint(); + mtPoint.setUserId(userId); + mtPoint.setAmount(-amount); + mtPoint.setStatus(StatusEnum.ENABLED.getKey()); + mtPoint.setCreateTime(new Date()); + mtPoint.setUpdateTime(new Date()); + mtPoint.setOperator(userInfo.getName()); + mtPoint.setOrderSn(""); + mtPoint.setDescription("转赠好友"); + mtPoint.setMerchantId(userInfo.getMerchantId()); + mtPointMapper.insert(mtPoint); + + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/PrinterServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/PrinterServiceImpl.java new file mode 100644 index 0000000..047c672 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/PrinterServiceImpl.java @@ -0,0 +1,419 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.GoodsSpecValueDto; +import com.fuint.common.dto.OrderGoodsDto; +import com.fuint.common.dto.UserOrderDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.PrinterPage; +import com.fuint.common.service.SettingService; +import com.fuint.common.util.HashSignUtil; +import com.fuint.common.util.NoteFormatter; +import com.fuint.common.util.PrinterUtil; +import com.fuint.common.vo.printer.*; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtPrinter; +import com.fuint.common.service.PrinterService; +import com.fuint.repository.mapper.MtPrinterMapper; +import com.fuint.repository.model.MtSetting; +import com.fuint.repository.model.MtStore; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.pagehelper.Page; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.env.Environment; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 打印机服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class PrinterServiceImpl extends ServiceImpl implements PrinterService { + + private static final Logger logger = LoggerFactory.getLogger(PrinterServiceImpl.class); + + private MtPrinterMapper mtPrinterMapper; + + /** + * 系统配置服务接口 + * */ + private SettingService settingService; + + /** + * 环境变量 + * */ + private Environment env; + + /** + * 分页查询数据列表 + * + * @param printerPage + * @return + */ + @Override + public PaginationResponse queryPrinterListByPagination(PrinterPage printerPage) { + Page pageHelper = PageHelper.startPage(printerPage.getPage(), printerPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtPrinter::getStatus, StatusEnum.DISABLE.getKey()); + + String status = printerPage.getStatus(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtPrinter::getStatus, status); + } + Integer merchantId = printerPage.getMerchantId(); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtPrinter::getMerchantId, merchantId); + } + Integer storeId = printerPage.getStoreId(); + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtPrinter::getStoreId, 0) + .or() + .eq(MtPrinter::getStoreId, storeId)); + } + String sn = printerPage.getSn(); + if (StringUtils.isNotBlank(sn)) { + lambdaQueryWrapper.eq(MtPrinter::getSn, sn); + } + String name = printerPage.getName(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtPrinter::getName, name); + } + String autoPrint = printerPage.getAutoPrint(); + if (StringUtils.isNotBlank(autoPrint)) { + lambdaQueryWrapper.eq(MtPrinter::getAutoPrint, autoPrint); + } + + lambdaQueryWrapper.orderByAsc(MtPrinter::getId); + List dataList = mtPrinterMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(printerPage.getPage(), printerPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtPrinter.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加打印机 + * + * @param mtPrinter 打印机信息 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增打印机") + public MtPrinter addPrinter(MtPrinter mtPrinter) throws BusinessCheckException { + mtPrinter.setStatus(StatusEnum.ENABLED.getKey()); + mtPrinter.setUpdateTime(new Date()); + mtPrinter.setCreateTime(new Date()); + if (mtPrinter.getMerchantId() == null || mtPrinter.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + + Integer printerId = mtPrinterMapper.insert(mtPrinter); + if (printerId > 0) { + // 添加云打印机 + if (mtPrinter.getSn() != null && mtPrinter.getName() != null) { + AddPrinterRequest restRequest = new AddPrinterRequest(); + createRequestHeader(mtPrinter.getMerchantId(), restRequest); + AddPrinterRequestItem item = new AddPrinterRequestItem(); + item.setName(mtPrinter.getName()); + item.setSn(mtPrinter.getSn()); + AddPrinterRequestItem[] items = { item }; + restRequest.setItems(items); + PrinterUtil.addPrinters(restRequest); + } + return mtPrinter; + } else { + logger.error("新增打印机数据失败."); + throw new BusinessCheckException("新增打印机数据失败"); + } + } + + /** + * 打印订单 + * + * @param orderInfo 订单信息 + * @param autoPrint 自动打印 + * @return + * */ + @Override + public Boolean printOrder(UserOrderDto orderInfo, boolean autoPrint) throws Exception { + PrintRequest printRequest = new PrintRequest(); + createRequestHeader(orderInfo.getMerchantId(), printRequest); + if (orderInfo.getStoreInfo() == null) { + throw new BusinessCheckException("打印失败:订单所属店铺信息为空!"); + } + + // 获取打印机列表 + Map params = new HashMap<>(); + params.put("storeId", orderInfo.getStoreInfo().getId()); + params.put("status", StatusEnum.ENABLED.getKey()); + if (autoPrint) { + params.put("autoPrint", YesOrNoEnum.YES.getKey()); + } + List printers = queryPrinterListByParams(params); + if (printers == null || printers.size() < 1) { + throw new BusinessCheckException("打印失败:该店铺还没有添加云打印机!"); + } + + MtStore storeInfo = orderInfo.getStoreInfo(); + for (MtPrinter mtPrinter : printers) { + printRequest.setSn(mtPrinter.getSn()); + + StringBuilder printContent = new StringBuilder(); + printContent.append("").append("" + storeInfo.getName() + "").append("
"); + printContent.append("
"); + + // 分割线 + printContent.append(org.apache.commons.lang3.StringUtils.repeat("-", 32)).append("
"); + + // 订单号 + printContent.append("订单号:").append(orderInfo.getOrderSn()).append(""); + + // 分割线 + printContent.append(org.apache.commons.lang3.StringUtils.repeat("-", 32)).append("
"); + + printContent.append("品名").append(org.apache.commons.lang3.StringUtils.repeat(" ", 16)) + .append("数量").append(org.apache.commons.lang3.StringUtils.repeat(" ", 2)) + .append("单价").append(org.apache.commons.lang3.StringUtils.repeat(" ", 2)) + .append("
"); + + // 分割线 + printContent.append(org.apache.commons.lang3.StringUtils.repeat("-", 32)).append("
"); + + // 商品列表 + if (orderInfo.getGoods() != null && orderInfo.getGoods().size() > 0) { + for (OrderGoodsDto goodsDto : orderInfo.getGoods()) { + List specList = goodsDto.getSpecList(); + String name = goodsDto.getName(); + List specValue = new ArrayList<>(); + if (specList != null && specList.size() > 0) { + for (GoodsSpecValueDto spec : specList) { + if (StringUtil.isNotEmpty(spec.getSpecValue())) { + specValue.add(spec.getSpecValue()); + } + } + if (specValue.size() > 0) { + name = name + "(" + String.join(",", specValue) + ")"; + } + } + printContent.append(NoteFormatter.formatPrintOrderItemForNewLine80(name, goodsDto.getNum(), Double.parseDouble(goodsDto.getPrice()))); + } + } + + // 配送订单,打印配送信息 + if (orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) { + // 分割线 + printContent.append(org.apache.commons.lang3.StringUtils.repeat("-", 32)).append("
"); + printContent.append("") + .append("配送姓名:").append(orderInfo.getAddress().getName()).append("
") + .append("联系电话:").append(orderInfo.getAddress().getMobile()).append("
") + .append("详细地址:").append(orderInfo.getAddress().getProvinceName() + orderInfo.getAddress().getCityName() + orderInfo.getAddress().getRegionName() + orderInfo.getAddress().getDetail()).append("
"); + } + + // 分割线 + printContent.append(org.apache.commons.lang3.StringUtils.repeat("-", 32)).append("
"); + + printContent.append("").append("合计:").append(orderInfo.getPayAmount()).append("元").append("
"); + + printContent.append("
"); + printContent.append("") + .append("店铺地址:").append((orderInfo.getStoreInfo().getAddress() == null) ? "无" : orderInfo.getStoreInfo().getAddress()).append("
") + .append("联系电话:").append((orderInfo.getStoreInfo().getPhone() == null) ? "无" : orderInfo.getStoreInfo().getPhone()).append("
") + .append("下单时间:").append(orderInfo.getCreateTime()).append("
") + .append("订单备注:").append(StringUtil.isEmpty(orderInfo.getRemark()) ? "无" : orderInfo.getRemark()).append("
"); + + // 网站二维码 + String webSite = env.getProperty("website.url"); + if (StringUtil.isNotEmpty(webSite)) { + printContent.append("").append("" + webSite + "").append(""); + } + + printRequest.setContent(printContent.toString()); + printRequest.setCopies(1); + printRequest.setVoice(2); + printRequest.setMode(0); + ObjectRestResponse result = PrinterUtil.print(printRequest); + if (result != null && result.getCode() != 0) { + throw new BusinessCheckException("打印失败:" + result.getMsg()); + } + } + + return true; + } + + /** + * 根据ID获打印机取息 + * + * @param id 打印机ID + * @return + */ + @Override + public MtPrinter queryPrinterById(Integer id) { + return mtPrinterMapper.selectById(id); + } + + /** + * 根据ID删除打印机 + * + * @param id 打印机ID + * @param operator 操作人 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除打印机") + public void deletePrinter(Integer id, String operator) throws BusinessCheckException { + MtPrinter mtPrinter = queryPrinterById(id); + if (null == mtPrinter) { + return; + } + // 删除云打印机 + if (StringUtil.isNotEmpty(mtPrinter.getSn())) { + DelPrinterRequest restRequest = new DelPrinterRequest(); + createRequestHeader(mtPrinter.getMerchantId(), restRequest); + String[] snList = { mtPrinter.getSn() }; + restRequest.setSnlist(snList); + PrinterUtil.delPrinters(restRequest); + } + mtPrinter.setStatus(StatusEnum.DISABLE.getKey()); + mtPrinter.setUpdateTime(new Date()); + mtPrinterMapper.updateById(mtPrinter); + } + + /** + * 修改打印机数据 + * + * @param mtPrinter 打印机参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新打印机") + public MtPrinter updatePrinter(MtPrinter mtPrinter) throws BusinessCheckException { + MtPrinter printer = queryPrinterById(mtPrinter.getId()); + BeanUtils.copyProperties(mtPrinter, printer); + if (mtPrinter == null) { + throw new BusinessCheckException("该打印机状态异常"); + } + if (printer.getMerchantId() == null || printer.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + + if (mtPrinter.getSn() != null && mtPrinter.getName() != null && !mtPrinter.getStatus().equals(StatusEnum.DISABLE.getKey())) { + UpdPrinterRequest restRequest = new UpdPrinterRequest(); + createRequestHeader(mtPrinter.getMerchantId(), restRequest); + restRequest.setName(mtPrinter.getName()); + restRequest.setSn(mtPrinter.getSn()); + PrinterUtil.updPrinter(restRequest); + } + if (mtPrinter.getStatus().equals(StatusEnum.DISABLE.getKey())) { + deletePrinter(mtPrinter.getId(), mtPrinter.getOperator()); + } + + mtPrinter.setUpdateTime(new Date()); + mtPrinterMapper.updateById(printer); + return printer; + } + + /** + * 根据条件搜索打印机 + * + * @param params 查询参数 + * @throws BusinessCheckException + * @return + * */ + @Override + public List queryPrinterListByParams(Map params) { + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey(): params.get("status").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + String sn = params.get("sn") == null ? "" : params.get("sn").toString(); + String name = params.get("name") == null ? "" : params.get("name").toString(); + String autoPrint = params.get("autoPrint") == null ? "" : params.get("autoPrint").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtPrinter::getStatus, StatusEnum.DISABLE.getKey()); + + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtPrinter::getStatus, status); + } + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtPrinter::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(sn)) { + lambdaQueryWrapper.eq(MtPrinter::getSn, sn); + } + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.eq(MtPrinter::getName, name); + } + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtPrinter::getStoreId, 0) + .or() + .eq(MtPrinter::getStoreId, storeId)); + } + if (StringUtils.isNotBlank(autoPrint)) { + lambdaQueryWrapper.eq(MtPrinter::getAutoPrint, autoPrint); + } + lambdaQueryWrapper.orderByAsc(MtPrinter::getId); + + return mtPrinterMapper.selectList(lambdaQueryWrapper); + } + + /** + * 创建接口请求header + * + * @param merchantId 商户ID + * @param request RestRequest + * @return + * */ + public void createRequestHeader(Integer merchantId, RestRequest request) throws BusinessCheckException { + List settings = settingService.getSettingList(merchantId, SettingTypeEnum.PRINTER.getKey()); + if (settings != null && settings.size() > 0) { + String userName = ""; + String userKey = ""; + for (MtSetting mtSetting : settings) { + if (mtSetting.getName().equals(PrinterSettingEnum.USER_NAME.getKey())) { + userName = mtSetting.getValue(); + } + if (mtSetting.getName().equals(PrinterSettingEnum.USER_KEY.getKey())) { + userKey = mtSetting.getValue(); + } + } + if (StringUtil.isNotEmpty(userName) && StringUtil.isNotEmpty(userKey)) { + request.setUser(userName); + request.setTimestamp(System.currentTimeMillis() + ""); + request.setSign(HashSignUtil.sign(request.getUser() + userKey + request.getTimestamp())); + request.setDebug("0"); + } else { + throw new BusinessCheckException("请先设置芯烨云打印账号!"); + } + } else { + throw new BusinessCheckException("请先设置芯烨云打印账号!"); + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/RefundServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/RefundServiceImpl.java new file mode 100644 index 0000000..2dc82fb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/RefundServiceImpl.java @@ -0,0 +1,666 @@ +package com.fuint.common.service.impl; + +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.fuint.common.Constants; +import com.fuint.common.dto.*; +import com.fuint.common.enums.*; +import com.fuint.common.service.*; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.*; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.*; + +/** + * 售后接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class RefundServiceImpl extends ServiceImpl implements RefundService { + + private static final Logger logger = LoggerFactory.getLogger(RefundServiceImpl.class); + + private MtPointMapper mtPointMapper; + + private MtRefundMapper mtRefundMapper; + + private MtConfirmLogMapper mtConfirmLogMapper; + + private MtUserCouponMapper mtUserCouponMapper; + + private MtGoodsSkuMapper mtGoodsSkuMapper; + + private MtGoodsMapper mtGoodsMapper; + + private MtOrderGoodsMapper mtOrderGoodsMapper; + + /** + * 卡券接口 + * */ + private CouponService couponService; + + /** + * 积分相关接口 + * */ + private PointService pointService; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 余额服务接口 + * */ + private BalanceService balanceService; + + /** + * 微信服务接口 + * */ + private WeixinService weixinService; + + /** + * 支付宝服务接口 + * */ + private AlipayService alipayService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 分页查询售后订单列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse getRefundListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtRefund::getStatus, StatusEnum.DISABLE.getKey()); + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtRefund::getMerchantId, merchantId); + } + String remark = paginationRequest.getSearchParams().get("remark") == null ? "" : paginationRequest.getSearchParams().get("remark").toString(); + if (StringUtils.isNotBlank(remark)) { + lambdaQueryWrapper.like(MtRefund::getRemark, remark); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtRefund::getStatus, status); + } + String orderId = paginationRequest.getSearchParams().get("orderId") == null ? "" : paginationRequest.getSearchParams().get("orderId").toString(); + if (StringUtils.isNotBlank(orderId)) { + lambdaQueryWrapper.eq(MtRefund::getOrderId, orderId); + } + String userId = paginationRequest.getSearchParams().get("userId") == null ? "" : paginationRequest.getSearchParams().get("userId").toString(); + if (StringUtils.isNotBlank(userId) && Integer.parseInt(userId) > 0) { + lambdaQueryWrapper.eq(MtRefund::getUserId, userId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtRefund::getStoreId, storeId); + } + String startTime = paginationRequest.getSearchParams().get("startTime") == null ? "" : paginationRequest.getSearchParams().get("startTime").toString(); + String endTime = paginationRequest.getSearchParams().get("endTime") == null ? "" : paginationRequest.getSearchParams().get("endTime").toString(); + if (StringUtil.isNotEmpty(startTime)) { + lambdaQueryWrapper.ge(MtRefund::getCreateTime, startTime); + } + if (StringUtil.isNotEmpty(endTime)) { + lambdaQueryWrapper.le(MtRefund::getCreateTime, endTime); + } + lambdaQueryWrapper.orderByDesc(MtRefund::getId); + List refundList = mtRefundMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + if (refundList != null && refundList.size() > 0) { + for (MtRefund mtRefund : refundList) { + RefundDto refundDto = new RefundDto(); + BeanUtils.copyProperties(mtRefund, refundDto); + refundDto.setCreateTime(DateUtil.formatDate(mtRefund.getCreateTime(), "yyyy-MM-dd HH:mm")); + refundDto.setUpdateTime(DateUtil.formatDate(mtRefund.getCreateTime(), "yyyy-MM-dd HH:mm")); + if (refundDto.getStoreId() != null && refundDto.getStoreId() > 0) { + MtStore mtStore = storeService.queryStoreById(refundDto.getStoreId()); + refundDto.setStoreInfo(mtStore); + } + if (refundDto.getOrderId() != null && refundDto.getOrderId() > 0) { + UserOrderDto orderDto = orderService.getOrderById(refundDto.getOrderId()); + refundDto.setOrderInfo(orderDto); + } + dataList.add(refundDto); + } + } + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, RefundDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 获取用户售后订单列表 + * + * @param paramMap 查询参数 + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject getUserRefundList(Map paramMap) throws BusinessCheckException { + Integer pageNumber = paramMap.get("pageNumber") == null ? Constants.PAGE_NUMBER : Integer.parseInt(paramMap.get("pageNumber").toString()); + Integer pageSize = paramMap.get("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(paramMap.get("pageSize").toString()); + String userId = paramMap.get("userId") == null ? "0" : paramMap.get("userId").toString(); + String status = paramMap.get("status") == null ? "": paramMap.get("status").toString(); + + Page pageHelper = PageHelper.startPage(pageNumber, pageSize); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + + if (StringUtils.isNotBlank(userId)) { + lambdaQueryWrapper.like(MtRefund::getUserId, userId); + } + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtRefund::getStatus, status); + } + + lambdaQueryWrapper.orderByDesc(MtRefund::getId); + List refundList = mtRefundMapper.selectList(lambdaQueryWrapper); + + List dataList = new ArrayList<>(); + if (refundList != null && refundList.size() > 0) { + for (MtRefund mtRefund : refundList) { + RefundDto refundDto = new RefundDto(); + BeanUtils.copyProperties(mtRefund, refundDto); + UserOrderDto orderDto = orderService.getOrderById(mtRefund.getOrderId()); + if (mtRefund.getImages() != null && StringUtil.isNotEmpty(mtRefund.getImages())) { + List images = Arrays.asList(mtRefund.getImages().split(",").clone()); + refundDto.setImageList(images); + } + refundDto.setOrderInfo(orderDto); + refundDto.setCreateTime(DateUtil.formatDate(mtRefund.getCreateTime(), "yyyy.MM.dd HH:mm")); + refundDto.setUpdateTime(DateUtil.formatDate(mtRefund.getUpdateTime(), "yyyy.MM.dd HH:mm")); + + if (mtRefund.getStatus().equals(RefundStatusEnum.CREATED.getKey())) { + refundDto.setStatusText(RefundStatusEnum.CREATED.getValue()); + } + if (mtRefund.getStatus().equals(RefundStatusEnum.APPROVED.getKey())) { + refundDto.setStatusText(RefundStatusEnum.APPROVED.getValue()); + } + if (mtRefund.getStatus().equals(RefundStatusEnum.REJECT.getKey())) { + refundDto.setStatusText(RefundStatusEnum.REJECT.getValue()); + } + if (mtRefund.getStatus().equals(RefundStatusEnum.CANCEL.getKey())) { + refundDto.setStatusText(RefundStatusEnum.CANCEL.getValue()); + } + if (mtRefund.getStatus().equals(RefundStatusEnum.COMPLETE.getKey())) { + refundDto.setStatusText(RefundStatusEnum.COMPLETE.getValue()); + } + dataList.add(refundDto); + } + } + + PageRequest pageRequest = PageRequest.of(pageNumber, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, RefundDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return new ResponseObject(200, "查询成功", paginationResponse); + } + + /** + * 创建售后订单 + * + * @param refundDto 订单参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "提交售后订单") + public MtRefund createRefund(RefundDto refundDto) { + MtRefund refund = new MtRefund(); + if (refundDto.getId() != null) { + refund.setId(refund.getId()); + } + refund.setMerchantId(refundDto.getMerchantId()); + refund.setStoreId(refundDto.getStoreId()); + + // 检查是否已存在 + Map params = new HashMap<>(); + params.put("USER_ID", refundDto.getUserId().toString()); + params.put("ORDER_ID", refundDto.getOrderId().toString()); + List result = mtRefundMapper.selectByMap(params); + + if (result.size() > 0) { + refund = result.get(0); + refund.setUpdateTime(new Date()); + if (refundDto.getRemark() != null && StringUtil.isNotEmpty(refundDto.getRemark())) { + refund.setRemark(refund.getRemark() + "|" + refundDto.getRemark()); + } + mtRefundMapper.updateById(refund); + return refund; + } + + refund.setOrderId(refundDto.getOrderId()); + refund.setUserId(refundDto.getUserId()); + refund.setRemark(refundDto.getRemark()); + refund.setType(refundDto.getType()); + refund.setMerchantId(refundDto.getMerchantId()); + refund.setStoreId(refundDto.getStoreId()); + refund.setAmount(refundDto.getAmount()); + if (refundDto.getImages() != null && StringUtil.isNotEmpty(refundDto.getImages()) && refundDto.getImages().length() > 5) { + refund.setImages(String.join(",", refundDto.getImages())); + } + refund.setStatus(RefundStatusEnum.CREATED.getKey()); + refund.setUpdateTime(new Date()); + refund.setCreateTime(new Date()); + + mtRefundMapper.insert(refund); + return refund; + } + + /** + * 根据ID获取订单详情 + * + * @param id 售后订单ID + * @throws BusinessCheckException + * @return + */ + @Override + public RefundDto getRefundById(Integer id) throws BusinessCheckException { + MtRefund mtRefund = mtRefundMapper.selectById(id); + if (mtRefund != null) { + RefundDto refundDto = new RefundDto(); + BeanUtils.copyProperties(mtRefund, refundDto); + UserOrderDto orderDto = orderService.getOrderById(mtRefund.getOrderId()); + if (mtRefund.getImages() != null && StringUtil.isNotEmpty(mtRefund.getImages())) { + List images = Arrays.asList(mtRefund.getImages().split(",").clone()); + refundDto.setImageList(images); + } + refundDto.setOrderInfo(orderDto); + // 退货地址 + AddressDto address = new AddressDto(); + if (orderDto.getStoreInfo() != null) { + address.setMobile(orderDto.getStoreInfo().getPhone()); + address.setName(orderDto.getStoreInfo().getContact()); + address.setDetail(orderDto.getStoreInfo().getAddress()); + } + refundDto.setAddress(address); + return refundDto; + } + return null; + } + + /** + * 根据订单ID获取售后订单信息 + * + * @param orderId 订单ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtRefund getRefundByOrderId(Integer orderId) { + Map params = new HashMap<>(); + params.put("ORDER_ID", orderId.toString()); + List refunds = mtRefundMapper.selectByMap(params); + if (refunds != null && refunds.size() > 0) { + return refunds.get(0); + } + return null; + } + + /** + * 修改售后订单 + * + * @param refundDto + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新售后订单") + public MtRefund updateRefund(RefundDto refundDto) throws BusinessCheckException { + MtRefund mtRefund = mtRefundMapper.selectById(refundDto.getId()); + if (mtRefund == null) { + throw new BusinessCheckException("该售后订单状态异常"); + } + + // 已同意的不能再设置为已拒绝 + if ((refundDto.getStatus() != null) && (!refundDto.getStatus().equals(RefundStatusEnum.COMPLETE.getKey())) && (mtRefund.getStatus().equals(RefundStatusEnum.COMPLETE.getKey()))) { + throw new BusinessCheckException("该售后订单已完成,不能再改成其他状态"); + } + + mtRefund.setId(refundDto.getId()); + mtRefund.setUpdateTime(new Date()); + + if (null != refundDto.getOperator()) { + mtRefund.setOperator(refundDto.getOperator()); + } + if (null != refundDto.getStatus()) { + mtRefund.setStatus(refundDto.getStatus()); + } + if (null != refundDto.getRemark()) { + mtRefund.setRemark(refundDto.getRemark()); + } + if (null != refundDto.getExpressName()) { + mtRefund.setExpressName(refundDto.getExpressName()); + } + if (null != refundDto.getExpressNo()) { + mtRefund.setExpressNo(refundDto.getExpressNo()); + } + if (null != refundDto.getRejectReason()) { + mtRefund.setRejectReason(refundDto.getRejectReason()); + } + + mtRefundMapper.updateById(mtRefund); + return mtRefund; + } + + /** + * 同意售后订单 + * + * @param refundDto + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "同意售后订单") + public MtRefund agreeRefund(RefundDto refundDto) throws BusinessCheckException { + MtRefund refund = mtRefundMapper.selectById(refundDto.getId()); + if (null == refund) { + throw new BusinessCheckException("该售后订单状态异常"); + } + + // 已经同意过了 + if (refund.getStatus().equals(RefundStatusEnum.COMPLETE.getKey())) { + if (StringUtil.isNotEmpty(refundDto.getRemark())) { + refund.setRemark(refundDto.getRemark()); + } + mtRefundMapper.updateById(refund); + return refund; + } + + refund.setId(refundDto.getId()); + refund.setUpdateTime(new Date()); + + if (null != refundDto.getOperator()) { + refund.setOperator(refundDto.getOperator()); + } + + if (null != refundDto.getStatus()) { + refund.setStatus(refundDto.getStatus()); + } + + mtRefundMapper.updateById(refund); + MtRefund mtRefund = mtRefundMapper.selectById(refund.getId()); + UserOrderDto orderInfo = orderService.getOrderById(mtRefund.getOrderId()); + + if (mtRefund.getAmount().compareTo(orderInfo.getAmount()) > 0) { + throw new BusinessCheckException("退款金额不能大于订单总金额"); + } + + OrderDto reqDto = new OrderDto(); + reqDto.setId(orderInfo.getId()); + reqDto.setStatus(OrderStatusEnum.REFUND.getKey()); + orderService.updateOrder(reqDto); + + // 换货 + if (refund.getType().equals(RefundTypeEnum.EXCHANGE.getKey())) { + return refund; + } + + // 如果是余额支付,返还余额 + if (orderInfo.getPayType().equals(PayTypeEnum.BALANCE.getKey())) { + List balanceList = balanceService.getBalanceListByOrderSn(orderInfo.getOrderSn()); + if (balanceList.size() > 0) { + BigDecimal refundAmount = new BigDecimal("0"); + for (MtBalance mtBalance : balanceList) { + if (mtBalance.getAmount().compareTo(new BigDecimal("0")) < 0) { + refundAmount = refundAmount.add(mtBalance.getAmount()); + } + } + MtBalance balanceReq = new MtBalance(); + balanceReq.setUserId(orderInfo.getUserId()); + balanceReq.setMerchantId(orderInfo.getMerchantId()); + balanceReq.setStoreId(orderInfo.getStoreId()); + balanceReq.setOrderSn(orderInfo.getOrderSn()); + balanceReq.setMobile(orderInfo.getUserInfo().getMobile()); + balanceReq.setOrderSn(orderInfo.getOrderSn()); + if (mtRefund.getAmount() != null && mtRefund.getAmount().compareTo(new BigDecimal("0")) > 0) { + balanceReq.setAmount(mtRefund.getAmount()); + } else { + balanceReq.setAmount(refundAmount.negate()); + } + balanceService.addBalance(balanceReq, true); + } + } + + // 充值订单退款 + if (orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) { + String param = orderInfo.getParam(); + MtBalance mtBalance = new MtBalance(); + mtBalance.setMerchantId(orderInfo.getMerchantId()); + mtBalance.setUserId(orderInfo.getUserId()); + mtBalance.setStoreId(orderInfo.getStoreId()); + mtBalance.setMobile(orderInfo.getUserInfo().getMobile()); + mtBalance.setOrderSn(orderInfo.getOrderSn()); + mtBalance.setCreateTime(new Date()); + mtBalance.setUpdateTime(new Date()); + BigDecimal amount = new BigDecimal("0"); + if (StringUtil.isNotEmpty(param)) { + String params[] = param.split("_"); + if (params.length == 2) { + amount = new BigDecimal(params[0]).add(new BigDecimal(params[1])); + } + } else { + amount = orderInfo.getPayAmount(); + } + MtUser mtUser = memberService.queryMemberById(orderInfo.getUserId()); + if (mtUser.getBalance().compareTo(amount) < 0) { + throw new BusinessCheckException("当前用户余额不足以退款"); + } + mtBalance.setAmount(amount.negate()); + mtBalance.setOperator(refundDto.getOperator()); + balanceService.addBalance(mtBalance, true); + } + + // 返还积分 + if (orderInfo.getUsePoint() != null && orderInfo.getUsePoint() > 0) { + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setUserId(orderInfo.getUserId()); + reqPointDto.setAmount(orderInfo.getUsePoint()); + reqPointDto.setDescription("售后订单" + orderInfo.getOrderSn() + "退回"+ orderInfo.getUsePoint() +"积分"); + reqPointDto.setOrderSn(orderInfo.getOrderSn()); + reqPointDto.setOperator(""); + pointService.addPoint(reqPointDto); + } + + // 返还卡券 + List confirmLogList = mtConfirmLogMapper.getOrderConfirmLogList(orderInfo.getId()); + if (confirmLogList.size() > 0) { + for (MtConfirmLog log : confirmLogList) { + MtCoupon couponInfo = couponService.queryCouponById(log.getCouponId()); + MtUserCoupon userCouponInfo = mtUserCouponMapper.selectById(log.getUserCouponId()); + if (userCouponInfo != null) { + // 优惠券直接置为未使用 + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + mtUserCouponMapper.updateById(userCouponInfo); + } + // 储值卡把余额加回去 + if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + BigDecimal balance = userCouponInfo.getBalance(); + BigDecimal newBalance = balance.add(log.getAmount()); + if (newBalance.compareTo(userCouponInfo.getAmount()) <= 0) { + userCouponInfo.setBalance(newBalance); + userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + } + mtUserCouponMapper.updateById(userCouponInfo); + } + // 撤销核销记录 + log.setStatus(StatusEnum.DISABLE.getKey()); + mtConfirmLogMapper.updateById(log); + } + } + } + + // 退回积分 + Map params = new HashMap<>(); + params.put("USER_ID", orderInfo.getUserId()); + params.put("ORDER_SN", orderInfo.getOrderSn()); + List pointList = mtPointMapper.selectByMap(params); + if (pointList != null && pointList.size() > 0) { + Integer pointNum = pointList.get(0).getAmount(); + if (pointNum > 0) { + Integer amount = pointNum - (pointNum) * 2; + MtPoint mtPoint = new MtPoint(); + mtPoint.setAmount(amount.intValue()); + mtPoint.setUserId(orderInfo.getUserId()); + mtPoint.setOrderSn(orderInfo.getOrderSn()); + mtPoint.setDescription("退款¥" + orderInfo.getPayAmount() + "退回" + pointNum + "积分"); + mtPoint.setOperator(refundDto.getOperator() == null ? "系统" : refundDto.getOperator()); + pointService.addPoint(mtPoint); + } + } + + // 返还库存 + Map eParam = new HashMap<>(); + eParam.put("ORDER_ID", orderInfo.getId()); + List orderGoodsList = mtOrderGoodsMapper.selectByMap(eParam); + if (orderGoodsList != null && orderGoodsList.size() > 0) { + for (MtOrderGoods mtOrderGoods : orderGoodsList) { + MtGoods mtGoods = mtGoodsMapper.selectById(mtOrderGoods.getGoodsId()); + mtGoods.setStock(mtOrderGoods.getNum() + mtGoods.getStock()); + mtGoodsMapper.updateById(mtGoods); + if (mtOrderGoods.getSkuId() != null && mtOrderGoods.getSkuId() > 0) { + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(mtOrderGoods.getSkuId()); + mtGoodsSku.setStock(mtGoodsSku.getStock() + mtOrderGoods.getNum()); + mtGoodsSkuMapper.updateById(mtGoodsSku); + } + } + } + + // 微信支付发起退款 + if (orderInfo.getPayType().equals(PayTypeEnum.JSAPI.getKey()) || orderInfo.getPayType().equals(PayTypeEnum.MICROPAY.getKey())) { + weixinService.doRefund(orderInfo.getStoreInfo() != null ? orderInfo.getStoreInfo().getId() : 0, orderInfo.getOrderSn(), orderInfo.getPayAmount(), mtRefund.getAmount(), PlatformTypeEnum.MP_WEIXIN.getCode()); + } + + // 支付宝发起退款 + if (orderInfo.getPayType().equals(PayTypeEnum.ALISCAN.getKey())) { + alipayService.doRefund(orderInfo.getStoreInfo() != null ? orderInfo.getStoreInfo().getId() : 0, orderInfo.getOrderSn(), orderInfo.getPayAmount(), mtRefund.getAmount(), PlatformTypeEnum.PC.getCode()); + } + + return mtRefund; + } + + /** + * 发起退款 + * @param orderId 订单ID + * @param refundAmount 售后金额 + * @param remark 备注 + * @param accountInfo 后台管理信息 + * throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "发起退款") + public Boolean doRefund(Integer orderId, String refundAmount, String remark, AccountInfo accountInfo) throws BusinessCheckException { + UserOrderDto orderInfo = orderService.getOrderById(orderId); + if (orderInfo == null) { + logger.error("退款订单为空,orderId = " + orderId + orderInfo.getId()); + throw new BusinessCheckException("该订单状态异常!"); + } + + MtRefund refund = mtRefundMapper.findByOrderId(orderId); + if (refund != null) { + logger.error("售后订单已存在,orderId = " + orderId); + throw new BusinessCheckException("该售后订单已存在,请查询售后订单列表!"); + } + + if (new BigDecimal(refundAmount).compareTo(orderInfo.getAmount()) > 0) { + throw new BusinessCheckException("退款金额不能大于订单总金额!"); + } + + // 创建售后订单 + RefundDto refundDto = new RefundDto(); + refundDto.setUserId(orderInfo.getUserId()); + refundDto.setOrderId(orderInfo.getId()); + refundDto.setMerchantId(orderInfo.getMerchantId()); + if (orderInfo.getStoreInfo() != null) { + refundDto.setStoreId(orderInfo.getStoreInfo().getId()); + } + refundDto.setRemark(remark); + refundDto.setType(RefundTypeEnum.RETURN.getKey()); + if (orderInfo.getStoreInfo() != null) { + refundDto.setStoreId(orderInfo.getStoreInfo().getId()); + } + refundDto.setAmount(new BigDecimal(refundAmount)); + refundDto.setOperator(accountInfo.getAccountName()); + refundDto.setImages(null); + MtRefund mtRefund = createRefund(refundDto); + if (mtRefund != null) { + // 审核同意 + RefundDto agreeDto = new RefundDto(); + agreeDto.setId(mtRefund.getId()); + agreeDto.setOperator(accountInfo.getAccountName()); + agreeDto.setStatus(RefundStatusEnum.COMPLETE.getKey()); + MtRefund refundInfo = agreeRefund(agreeDto); + if (refundInfo == null) { + logger.error("退款审核失败,orderId = " + orderId + ", refundId = " + mtRefund.getId()); + throw new BusinessCheckException("退款审核失败!"); + } + } else { + logger.error("退款生成售后订单失败,orderId = " + orderId); + throw new BusinessCheckException("生成售后订单失败!"); + } + return true; + } + + /** + * 获取售后订单数量 + * + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public Long getRefundCount(Date beginTime, Date endTime) { + return mtRefundMapper.getRefundCount(beginTime, endTime); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/SendLogServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/SendLogServiceImpl.java new file mode 100644 index 0000000..8f4bf7f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/SendLogServiceImpl.java @@ -0,0 +1,149 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.ReqSendLogDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.SendLogService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtSendLogMapper; +import com.fuint.repository.model.MtSendLog; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 发送卡券记录业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class SendLogServiceImpl extends ServiceImpl implements SendLogService { + + private MtSendLogMapper mtSendLogMapper; + + /** + * 分页查询列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse querySendLogListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtSendLog::getStatus, StatusEnum.DISABLE.getKey()); + + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtSendLog::getStatus, status); + } + String userId = paginationRequest.getSearchParams().get("userId") == null ? "" : paginationRequest.getSearchParams().get("userId").toString(); + if (StringUtils.isNotBlank(userId)) { + lambdaQueryWrapper.eq(MtSendLog::getUserId, userId); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtSendLog::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtSendLog::getStoreId, storeId); + } + String couponId = paginationRequest.getSearchParams().get("couponId") == null ? "" : paginationRequest.getSearchParams().get("couponId").toString(); + if (StringUtils.isNotBlank(couponId)) { + lambdaQueryWrapper.eq(MtSendLog::getCouponId, couponId); + } + String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtSendLog::getMobile, mobile); + } + + lambdaQueryWrapper.orderByDesc(MtSendLog::getId); + List dataList = mtSendLogMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtSendLog.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加发放记录 + * + * @param reqSendLogDto + * @throws BusinessCheckException + * @return + */ + @Override + public MtSendLog addSendLog(ReqSendLogDto reqSendLogDto) { + MtSendLog mtLog = new MtSendLog(); + mtLog.setMerchantId(reqSendLogDto.getMerchantId()); + mtLog.setStoreId(reqSendLogDto.getStoreId()); + mtLog.setType(reqSendLogDto.getType()); + mtLog.setUserId(reqSendLogDto.getUserId()); + mtLog.setFileName(reqSendLogDto.getFileName()); + mtLog.setFilePath(reqSendLogDto.getFilePath()); + mtLog.setMobile(reqSendLogDto.getMobile()); + mtLog.setCouponId(reqSendLogDto.getCouponId()); + mtLog.setGroupId(reqSendLogDto.getGroupId()); + mtLog.setGroupName(reqSendLogDto.getGroupName()); + mtLog.setSendNum(reqSendLogDto.getSendNum()); + mtLog.setRemoveSuccessNum(0); + mtLog.setRemoveFailNum(0); + mtLog.setStatus(StatusEnum.ENABLED.getKey()); + mtLog.setCreateTime(new Date()); + mtLog.setOperator(reqSendLogDto.getOperator()); + mtLog.setUuid(reqSendLogDto.getUuid()); + mtSendLogMapper.insert(mtLog); + return mtLog; + } + + /** + * 根据ID查询发券记录 + * + * @param id 发券记录ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtSendLog querySendLogById(Long id) { + return mtSendLogMapper.selectById(id.intValue()); + } + + /** + * 根据ID删除发券记录 + * + * @param id 发券记录ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + public void deleteSendLog(Long id, String operator) { + MtSendLog mtSendLog = querySendLogById(id); + if (null == mtSendLog) { + return; + } + mtSendLog.setStatus(StatusEnum.DISABLE.getKey()); + mtSendLog.setOperator(operator); + mtSendLogMapper.updateById(mtSendLog); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/SendSmsServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/SendSmsServiceImpl.java new file mode 100644 index 0000000..2f918fe --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/SendSmsServiceImpl.java @@ -0,0 +1,310 @@ +package com.fuint.common.service.impl; + +import com.alibaba.fastjson.JSON; +import com.aliyuncs.CommonRequest; +import com.aliyuncs.CommonResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.exceptions.ServerException; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fuint.common.dto.MessageResDto; +import com.fuint.common.enums.SettingTypeEnum; +import com.fuint.common.enums.SmsSettingEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.SendSmsService; +import com.fuint.common.service.SettingService; +import com.fuint.common.service.SmsTemplateService; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtSmsSendedLogMapper; +import com.fuint.repository.model.MtSetting; +import com.fuint.repository.model.MtSmsSendedLog; +import com.fuint.repository.model.MtSmsTemplate; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.env.Environment; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 发送手机短信服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class SendSmsServiceImpl implements SendSmsService { + + private static final Logger logger = LoggerFactory.getLogger(SendSmsServiceImpl.class); + + /** + * 系统环境变量 + * */ + private Environment env; + + private MtSmsSendedLogMapper mtSmsSendedLogMapper; + + /** + * 短信模板服务接口 + * */ + private SmsTemplateService smsTemplateService; + + /** + * 配置服务接口 + * */ + private SettingService settingService; + + /** + * 发送短信 + * + * @param merchantId 商户ID + * @param templateUname 模板名 + * @param phones 发送手机号 + * @param contentParams 发送参数 + * @return + * */ + @Override + public Map> sendSms(Integer merchantId, String templateUname, List phones, Map contentParams) throws BusinessCheckException { + logger.info("使用短信平台发送短信....."); + Map> result = new HashMap<>(); + Integer mode = Integer.parseInt(env.getProperty("aliyun.sms.mode")); + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.SMS_CONFIG.getKey(), SmsSettingEnum.IS_CLOSE.getKey()); + if (mode.intValue() == 1 && mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue())) { + mode = Integer.parseInt(mtSetting.getValue()); + logger.info("商户短信设置 mtSetting = {}", JSON.toJSONString(mtSetting)); + } + if (mode.intValue() != 1) { + logger.info("短信平台未开启 mode = {}", mode); + return result; + } + if (templateUname != null && !CollectionUtils.isEmpty(phones)) { + try { + if (mode != null && mode.intValue() == 1) { + // 手机号以","分隔拼接 + String mobilePhones = phones.stream().collect(Collectors.joining(",")); + MessageResDto res = sendMessage(merchantId, mobilePhones, templateUname, contentParams); + result.put(res.getResult(), phones); + } else { + result.put(Boolean.TRUE,phones); + logger.info("模拟短信平台发送短信....."); + } + } catch (Exception e) { + result.put(Boolean.FALSE,phones); + logger.error("推送至短信平台出错,参数[templateUname={},phones={}]", templateUname, phones); + logger.error(e.getMessage(),e); + } + } else { + logger.error("手机号码和短信内容不能为空,请确认!"); + } + return result; + } + + /** + * 发送短信 + * + * @param phoneNo 短信发送手机号,多个手机号以英文半角逗号隔开,最多支持200个手机号 + * @param templateUname 短信模板英文名称 + * @return + */ + public MessageResDto sendMessage(Integer merchantId, String phoneNo, String templateUname, Map contentParams) throws BusinessCheckException { + MessageResDto resInfo = new MessageResDto(); + logger.info("sendMessage inParams:phoneNo={}, message={}", phoneNo, templateUname); + if (StringUtil.isBlank(phoneNo) || phoneNo.split(",").length > 200) { + logger.error("手机号列表不符合要求"); + resInfo.setResult(Boolean.FALSE); + return resInfo; + } + + String accessKeyId = env.getProperty("aliyun.sms.accessKeyId"); + String secret = env.getProperty("aliyun.sms.accessKeySecret"); + String signName = env.getProperty("aliyun.sms.signName"); + + List settings = settingService.getSettingList(merchantId, SettingTypeEnum.SMS_CONFIG.getKey()); + if (settings != null && settings.size() > 0) { + logger.info("商户短信设置 mtSetting = {}", JSON.toJSONString(settings.get(0))); + String accessKeyId1 = ""; + String secret1 = ""; + String signName1 = ""; + for (MtSetting mtSetting : settings) { + if (mtSetting.getName().equals(SmsSettingEnum.ACCESS_KEY_ID.getKey()) && StringUtil.isNotEmpty(mtSetting.getValue())) { + accessKeyId1 = mtSetting.getValue(); + } + if (mtSetting.getName().equals(SmsSettingEnum.ACCESS_KEY_SECRET.getKey()) && StringUtil.isNotEmpty(mtSetting.getValue())) { + secret1 = mtSetting.getValue(); + } + if (mtSetting.getName().equals(SmsSettingEnum.SIGN_NAME.getKey()) && StringUtil.isNotEmpty(mtSetting.getValue())) { + signName1 = mtSetting.getValue(); + } + } + if (StringUtil.isNotEmpty(accessKeyId1) && StringUtil.isNotEmpty(secret1) && StringUtil.isNotEmpty(signName1)) { + accessKeyId = accessKeyId1; + secret = secret1; + signName = signName1; + } + } + + MtSmsTemplate templateInfo = new MtSmsTemplate(); + try { + Map params = new HashMap<>(); + params.put("uname", templateUname); + params.put("merchant_id", merchantId); + List templateList = smsTemplateService.querySmsTemplateByParams(params); + if (templateList.size() < 1) { + throw new BusinessCheckException("该短信模板不存在!"); + } + templateInfo = templateList.get(0); + if (!templateInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException("该短信模板未启用!"); + } + } catch (BusinessCheckException e) { + e.getStackTrace(); + } + + boolean flag = false; + try { + // 解决中文乱码 + if (!CommonUtil.isUtf8(signName) || CommonUtil.isErrCode(signName)) { + signName = new String(signName.getBytes("ISO8859-1"), "UTF-8"); + } + + // 阿里云短信 + DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, secret); + IAcsClient client = new DefaultAcsClient(profile); + + // 装配参数 + String smsContent = templateInfo.getContent(); + if (smsContent == null || StringUtil.isEmpty(smsContent)) { + resInfo.setResult(Boolean.FALSE); + return resInfo; + } + String paramJson = ""; + if (contentParams.size() > 0) { + for (Map.Entry entry : contentParams.entrySet()){ + String key = entry.getKey(); + String value = entry.getValue(); + smsContent = smsContent.replace("{"+key+"}", value); + } + try { + ObjectMapper mapper = new ObjectMapper(); + paramJson = mapper.writeValueAsString(contentParams); + } catch(Exception e){ + e.printStackTrace(); + } + } + + CommonRequest request = new CommonRequest(); + request.setSysMethod(MethodType.POST); + request.setSysDomain("dysmsapi.aliyuncs.com"); + request.setSysVersion("2017-05-25"); + request.setSysAction("SendSms"); + request.putQueryParameter("RegionId", "cn-hangzhou"); + request.putQueryParameter("PhoneNumbers", phoneNo); + request.putQueryParameter("SignName", signName); + request.putQueryParameter("TemplateCode", templateInfo.getCode()); + request.putQueryParameter("TemplateParam", paramJson); + + String res = ""; + try { + CommonResponse response = client.getCommonResponse(request); + logger.info("sendMessage response:{}", response.toString()); + res = response.getData(); + System.out.println(response.getData()); + } catch (ServerException e) { + e.printStackTrace(); + } catch (ClientException e) { + e.printStackTrace(); + } + logger.info("sendMessage outParams:{}", res); + saveSendLog(merchantId, phoneNo, smsContent); + flag = true; + } catch (Exception e) { + flag = false; + logger.error(e.getMessage(), e); + } finally { + resInfo.setResult(flag); + } + return resInfo; + } + + /** + * 发送短信日志记录 + * + * @param merchantId 商户ID + * @param phoneNo 短信发送手机号 + * @param message 短信内容 + * @return + */ + public void saveSendLog(Integer merchantId, String phoneNo, String message) { + MtSmsSendedLog mtSmsSendedLog = new MtSmsSendedLog(); + mtSmsSendedLog.setMerchantId(merchantId); + mtSmsSendedLog.setMobilePhone(phoneNo); + mtSmsSendedLog.setContent(message); + Date time = new Date(); + mtSmsSendedLog.setCreateTime(time); + mtSmsSendedLog.setSendTime(time); + mtSmsSendedLog.setUpdateTime(time); + mtSmsSendedLogMapper.insert(mtSmsSendedLog); + } + + /** + * 分页查询已发短信列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse querySmsListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtSmsSendedLog::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtSmsSendedLog::getStoreId, storeId); + } + String content = paginationRequest.getSearchParams().get("content") == null ? "" : paginationRequest.getSearchParams().get("content").toString(); + if (StringUtils.isNotBlank(content)) { + lambdaQueryWrapper.like(MtSmsSendedLog::getContent, content); + } + String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtSmsSendedLog::getMobilePhone, mobile); + } + + lambdaQueryWrapper.orderByDesc(MtSmsSendedLog::getLogId); + List dataList = mtSmsSendedLogMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtSmsSendedLog.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/SettingServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/SettingServiceImpl.java new file mode 100644 index 0000000..bc8fddb --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/SettingServiceImpl.java @@ -0,0 +1,231 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fuint.common.dto.NavigationDto; +import com.fuint.common.dto.ParamDto; +import com.fuint.common.enums.*; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.repository.mapper.MtSettingMapper; +import com.fuint.repository.model.MtSetting; +import com.fuint.common.service.SettingService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 配置业务接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class SettingServiceImpl extends ServiceImpl implements SettingService { + + /** + * 系统环境变量 + * */ + private Environment env; + + private MtSettingMapper mtSettingMapper; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 删除配置 + * + * @param merchantId 商户ID + * @param type 类型 + * @param name 配置名称 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除配置信息") + public void removeSetting(Integer merchantId, String type, String name) { + MtSetting info = querySettingByName(merchantId, type, name); + if (info != null) { + mtSettingMapper.deleteById(info.getId()); + } + } + + /** + * 保存配置 + * + * @param mtSetting 配置参数 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存配置信息") + public MtSetting saveSetting(MtSetting mtSetting) { + MtSetting settingInfo = querySettingByName(mtSetting.getMerchantId(), mtSetting.getType(), mtSetting.getName()); + if (null != settingInfo) { + if (mtSetting.getValue() != null) { + settingInfo.setValue(mtSetting.getValue()); + } + if (mtSetting.getDescription() != null) { + settingInfo.setDescription(mtSetting.getDescription()); + } + if (StringUtil.isNotEmpty(mtSetting.getOperator())) { + settingInfo.setOperator(mtSetting.getOperator()); + } + if (mtSetting.getUpdateTime() != null) { + settingInfo.setUpdateTime(mtSetting.getUpdateTime()); + } + if (mtSetting.getStatus() != null) { + settingInfo.setStatus(mtSetting.getStatus()); + } + if (mtSetting.getType() != null) { + settingInfo.setType(mtSetting.getType()); + } + mtSettingMapper.updateById(settingInfo); + } else { + // 创建配置 + if (mtSetting.getName() != null && mtSetting.getValue() != null) { + mtSetting.setCreateTime(new Date()); + mtSetting.setStatus(StatusEnum.ENABLED.getKey()); + mtSettingMapper.insert(mtSetting); + } + } + + return mtSetting; + } + + /** + * 获取配置列表 + * + * @param merchantId 商户ID + * @param type 配置类型 + * @throws BusinessCheckException + * @return + */ + @Override + public List getSettingList(Integer merchantId, String type) { + return mtSettingMapper.querySettingByType(merchantId, type); + } + + /** + * 根据ID获取配置信息 + * + * @param merchantId 商户ID + * @param type 类型 + * @param name 配置名称 + * @throws BusinessCheckException + * @return + */ + @Override + public MtSetting querySettingByName(Integer merchantId, String type, String name) { + return mtSettingMapper.querySettingByName(merchantId, 0, type, name); + } + + /** + * 根据ID获取配置信息 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param type 类型 + * @param name 配置名称 + * @throws BusinessCheckException + * @return + */ + @Override + public MtSetting querySettingByName(Integer merchantId, Integer storeId, String type, String name) { + return mtSettingMapper.querySettingByName(merchantId, storeId, type, name); + } + + /** + * 获取系统上传的根路径 + * + * @return + * */ + @Override + public String getUploadBasePath() { + String basePath = env.getProperty("images.upload.url"); + String mode = env.getProperty("aliyun.oss.mode"); + + if (mode == null) { + return basePath; + } else { + if (mode.equals("1")) { + String domain = env.getProperty("aliyun.oss.domain"); + if (StringUtil.isNotEmpty(domain)) { + basePath = domain; + } + } + } + + return basePath; + } + + /** + * 获取支付方式列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param platform 平台 + * @return + * */ + @Override + public List getPayTypeList(Integer merchantId, Integer storeId, String platform) throws BusinessCheckException { + List payTypeList = new ArrayList<>(); + + // 微信jsapi + ParamDto jsApi = new ParamDto(PayTypeEnum.JSAPI.getKey(), PayTypeEnum.JSAPI.getValue(), PayTypeEnum.JSAPI.getKey()); + payTypeList.add(jsApi); + + // 余额支付 + ParamDto balance = new ParamDto(PayTypeEnum.BALANCE.getKey(), PayTypeEnum.BALANCE.getValue(), PayTypeEnum.BALANCE.getKey()); + payTypeList.add(balance); + + // 前台支付 + MtSetting mtSetting = settingService.querySettingByName(merchantId, storeId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.PAY_OFF_LINE.getKey()); + if (mtSetting != null && mtSetting.getValue().equals(YesOrNoEnum.YES.getKey())) { + ParamDto store = new ParamDto(PayTypeEnum.STORE.getKey(), PayTypeEnum.STORE.getValue(), PayTypeEnum.STORE.getKey()); + payTypeList.add(store); + } + + return payTypeList; + } + + /** + * 获取导航栏 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param status 状态 + * @return + * */ + @Override + public List getNavigation(Integer merchantId, Integer storeId, String status) throws JsonProcessingException { + MtSetting mtSetting = mtSettingMapper.querySettingByName(merchantId, storeId, SettingTypeEnum.NAVIGATION.getKey(), SettingTypeEnum.NAVIGATION.getKey()); + List navigation = new ArrayList<>(); + if (mtSetting != null && StringUtil.isNotBlank(mtSetting.getValue())) { + ObjectMapper objectMapper = new ObjectMapper(); + navigation = objectMapper.readValue(mtSetting.getValue(), new TypeReference>() {}); + } + if (StringUtil.isNotBlank(status)) { + navigation = navigation.stream().filter(nav -> status.equals(nav.getStatus())).collect(Collectors.toList()); + } + String basePath = getUploadBasePath(); + navigation.stream().forEach(p -> p.setIconUrl(basePath + p.getIcon())); + Collections.sort(navigation, (p1, p2) -> Integer.compare(p2.getSort(), p1.getSort())); + return navigation; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/SettlementServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/SettlementServiceImpl.java new file mode 100644 index 0000000..8535d48 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/SettlementServiceImpl.java @@ -0,0 +1,255 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.fuint.common.Constants; +import com.fuint.common.dto.SettlementDto; +import com.fuint.common.dto.SettlementOrderDto; +import com.fuint.common.dto.UserOrderDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.OrderListParam; +import com.fuint.common.service.MerchantService; +import com.fuint.common.service.OrderService; +import com.fuint.common.service.SettlementService; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.module.backendApi.request.SettlementRequest; +import com.fuint.repository.mapper.MtSettlementMapper; +import com.fuint.repository.mapper.MtSettlementOrderMapper; +import com.fuint.repository.model.*; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 订单结算相关业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class SettlementServiceImpl implements SettlementService { + + private MtSettlementMapper mtSettlementMapper; + + private MtSettlementOrderMapper mtSettlementOrderMapper; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 商户服务接口 + * */ + private MerchantService merchantService; + + /** + * 分页查询结算列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse querySettlementListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtSettlement::getStatus, StatusEnum.DISABLE.getKey()); + + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtSettlement::getStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtSettlement::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtSettlement::getStoreId, storeId); + } + String description = paginationRequest.getSearchParams().get("description") == null ? "" : paginationRequest.getSearchParams().get("description").toString(); + if (StringUtils.isNotBlank(description)) { + lambdaQueryWrapper.like(MtSettlement::getDescription, description); + } + lambdaQueryWrapper.orderByDesc(MtSettlement::getId); + List dataList = mtSettlementMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtSettlement.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 提交结算 + * + * @param requestParam + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "发起结算") + public Boolean submitSettlement(SettlementRequest requestParam) throws BusinessCheckException { + OrderListParam orderParam = new OrderListParam(); + orderParam.setMerchantId(requestParam.getMerchantId()); + orderParam.setStoreId(requestParam.getStoreId()); + orderParam.setDataType("paid"); + orderParam.setStartTime(requestParam.getStartTime()); + orderParam.setEndTime(requestParam.getEndTime()); + orderParam.setSettleStatus(SettleStatusEnum.WAIT.getKey()); + orderParam.setStatus(OrderStatusEnum.COMPLETE.getKey()); + List payType = new ArrayList<>(); + payType.add(PayTypeEnum.JSAPI.getKey()); + payType.add(PayTypeEnum.MICROPAY.getKey()); + payType.add(PayTypeEnum.ALISCAN.getKey()); + orderParam.setPayType(payType); + + orderParam.setPage(Constants.PAGE_NUMBER); + orderParam.setPageSize(Constants.ALL_ROWS); + + PaginationResponse response = orderService.getUserOrderList(orderParam); + List orderList = response.getContent(); + if (orderList == null || orderList.size() < 1) { + throw new BusinessCheckException("暂无符合结算条件的订单"); + } + + BigDecimal amount = new BigDecimal("0"); + BigDecimal totalOrderAmount = new BigDecimal("0"); + if (orderList != null && orderList.size() > 0) { + for (UserOrderDto orderDto : orderList) { + amount = amount.add(orderDto.getPayAmount()); + totalOrderAmount = totalOrderAmount.add(orderDto.getPayAmount()); + } + } + MtSettlement mtSettlement = new MtSettlement(); + mtSettlement.setMerchantId(requestParam.getMerchantId()); + mtSettlement.setStoreId(requestParam.getStoreId()); + mtSettlement.setSettlementNo(CommonUtil.createSettlementNo()); + + MtMerchant mtMerchant = merchantService.queryMerchantById(requestParam.getMerchantId()); + BigDecimal percent = new BigDecimal("1"); + if (mtMerchant.getSettleRate() != null && mtMerchant.getSettleRate().compareTo(new BigDecimal("0")) > 0) { + percent = mtMerchant.getSettleRate().divide(new BigDecimal("100"), BigDecimal.ROUND_CEILING, 4); + } + mtSettlement.setAmount(amount.multiply(percent)); + mtSettlement.setSettleRate(percent.multiply(new BigDecimal("100"))); + mtSettlement.setTotalOrderAmount(totalOrderAmount); + mtSettlement.setStatus(StatusEnum.ENABLED.getKey()); + mtSettlement.setOperator(requestParam.getOperator()); + mtSettlement.setCreateTime(new Date()); + mtSettlement.setUpdateTime(new Date()); + mtSettlementMapper.insert(mtSettlement); + if (orderList != null && orderList.size() > 0) { + for (UserOrderDto orderDto : orderList) { + MtSettlementOrder mtSettlementOrder = new MtSettlementOrder(); + mtSettlementOrder.setSettlementId(mtSettlement.getId()); + mtSettlementOrder.setOrderId(orderDto.getId()); + mtSettlementOrder.setCreateTime(new Date()); + mtSettlementOrder.setUpdateTime(new Date()); + mtSettlement.setStatus(StatusEnum.ENABLED.getKey()); + mtSettlementOrder.setOperator(mtSettlement.getOperator()); + mtSettlementOrderMapper.insert(mtSettlementOrder); + // 把订单设置为已结算 + MtOrder mtOrder = orderService.getById(orderDto.getId()); + mtOrder.setSettleStatus(SettleStatusEnum.COMPLETE.getKey()); + orderService.updateOrder(mtOrder); + } + } + return true; + } + + /** + * 结算确认 + * + * @param settlementId 结算ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "结算确认") + public Boolean doConfirm(Integer settlementId, String operator) throws BusinessCheckException { + MtSettlement mtSettlement = mtSettlementMapper.selectById(settlementId); + if (mtSettlement == null) { + throw new BusinessCheckException("结算数据不存在"); + } + mtSettlement.setStatus(SettleStatusEnum.COMPLETE.getKey()); + mtSettlement.setPayStatus(PayStatusEnum.SUCCESS.getKey()); + mtSettlement.setUpdateTime(new Date()); + mtSettlement.setOperator(operator); + mtSettlementMapper.updateById(mtSettlement); + return true; + } + + /** + * 获取结算详情 + * + * @param settlementId 结算ID + * @param page 当前页码 + * @param pageSize 每页数量 + * @return + * */ + @Override + public SettlementDto getSettlementInfo(Integer settlementId, Integer page, Integer pageSize) throws BusinessCheckException { + MtSettlement mtSettlement = mtSettlementMapper.selectById(settlementId); + if (mtSettlement == null) { + throw new BusinessCheckException("结算单不存在"); + } + + SettlementDto settlementDto = new SettlementDto(); + BeanUtils.copyProperties(mtSettlement, settlementDto); + + Page pageHelper = PageHelper.startPage(page, pageSize); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtSettlementOrder::getStatus, StatusEnum.DISABLE.getKey()); + lambdaQueryWrapper.eq(MtSettlementOrder::getSettlementId, settlementId); + lambdaQueryWrapper.orderByDesc(MtSettlementOrder::getId); + List dataList = mtSettlementOrderMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(page, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, SettlementOrderDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + + List orderList = new ArrayList<>(); + if (dataList != null && dataList.size() > 0) { + for (MtSettlementOrder mtSettlementOrder : dataList) { + SettlementOrderDto settlementOrderDto = new SettlementOrderDto(); + BeanUtils.copyProperties(mtSettlementOrder, settlementOrderDto); + UserOrderDto orderDto = orderService.getOrderById(settlementOrderDto.getOrderId()); + if (orderDto != null) { + settlementOrderDto.setOrderInfo(orderDto); + } + orderList.add(settlementOrderDto); + } + } + paginationResponse.setContent(orderList); + + settlementDto.setOrderList(paginationResponse); + return settlementDto; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/SmsTemplateServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/SmsTemplateServiceImpl.java new file mode 100644 index 0000000..e5904e6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/SmsTemplateServiceImpl.java @@ -0,0 +1,170 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.SmsTemplateDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.SmsTemplateService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtSmsTemplateMapper; +import com.fuint.repository.model.MtSmsTemplate; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 短信模板业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class SmsTemplateServiceImpl extends ServiceImpl implements SmsTemplateService { + + private MtSmsTemplateMapper mtSmsTemplateMapper; + + /** + * 分页查询模板列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse querySmsTemplateListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtSmsTemplate::getStatus, StatusEnum.DISABLE.getKey()); + + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.like(MtSmsTemplate::getMerchantId, merchantId); + } + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtSmsTemplate::getName, name); + } + String uname = paginationRequest.getSearchParams().get("uname") == null ? "" : paginationRequest.getSearchParams().get("uname").toString(); + if (StringUtils.isNotBlank(uname)) { + lambdaQueryWrapper.eq(MtSmsTemplate::getUname, uname); + } + String code = paginationRequest.getSearchParams().get("code") == null ? "" : paginationRequest.getSearchParams().get("code").toString(); + if (StringUtils.isNotBlank(code)) { + lambdaQueryWrapper.eq(MtSmsTemplate::getCode, code); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtSmsTemplate::getStatus, status); + } + + lambdaQueryWrapper.orderByDesc(MtSmsTemplate::getId); + List dataList = mtSmsTemplateMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtSmsTemplate.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存模板信息 + * + * @param mtSmsTemplateDto 短信模板 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存短信模板") + public MtSmsTemplate saveSmsTemplate(SmsTemplateDto mtSmsTemplateDto) throws BusinessCheckException { + MtSmsTemplate mtSmsTemplate = new MtSmsTemplate(); + mtSmsTemplate.setMerchantId(mtSmsTemplateDto.getMerchantId()); + mtSmsTemplate.setCode(mtSmsTemplateDto.getCode()); + mtSmsTemplate.setName(mtSmsTemplateDto.getName()); + mtSmsTemplate.setUname(mtSmsTemplateDto.getUname()); + mtSmsTemplate.setContent(mtSmsTemplateDto.getContent()); + mtSmsTemplate.setStatus(mtSmsTemplateDto.getStatus()); + mtSmsTemplate.setOperator(mtSmsTemplate.getOperator()); + + if (mtSmsTemplateDto.getId() == null) { + mtSmsTemplate.setCreateTime(new Date()); + mtSmsTemplate.setUpdateTime(new Date()); + mtSmsTemplateMapper.insert(mtSmsTemplate); + } else { + MtSmsTemplate oldSmsTemplate = getById(mtSmsTemplateDto.getId()); + if (oldSmsTemplate == null) { + throw new BusinessCheckException("该短信模板不存在"); + } + mtSmsTemplate.setMerchantId(oldSmsTemplate.getMerchantId()); + mtSmsTemplate.setId(mtSmsTemplateDto.getId()); + mtSmsTemplate.setUpdateTime(new Date()); + this.updateById(mtSmsTemplate); + } + + return mtSmsTemplate; + } + + /** + * 根据ID删除数据 + * + * @param id 模板ID + * @param operator 操作人 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除短信模板") + public void deleteTemplate(Integer id, String operator) { + MtSmsTemplate mtTemplate = mtSmsTemplateMapper.selectById(id); + if (null == mtTemplate) { + return; + } + + mtTemplate.setStatus(StatusEnum.DISABLE.getKey()); + mtTemplate.setUpdateTime(new Date()); + + mtSmsTemplateMapper.updateById(mtTemplate); + } + + /** + * 根据D获取信息 + * + * @param id 模板ID + * @return + */ + @Override + public MtSmsTemplate querySmsTemplateById(Integer id) { + return mtSmsTemplateMapper.selectById(id); + } + + /** + * 根据参数查询短信模板 + * + * @param params 查询参数 + * @return + * */ + @Override + public List querySmsTemplateByParams(Map params) { + if (params == null) { + params = new HashMap<>(); + } + return mtSmsTemplateMapper.selectByMap(params); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/SourceServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/SourceServiceImpl.java new file mode 100644 index 0000000..fe920a8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/SourceServiceImpl.java @@ -0,0 +1,340 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.domain.TreeSelect; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.AccountService; +import com.fuint.common.service.SourceService; +import com.fuint.common.vo.MetaVo; +import com.fuint.common.vo.RouterVo; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.repository.mapper.TDutySourceMapper; +import com.fuint.repository.mapper.TSourceMapper; +import com.fuint.repository.model.TDutySource; +import com.fuint.repository.model.TSource; +import com.fuint.common.domain.TreeNode; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.utils.ArrayUtil; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 菜单管理接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class SourceServiceImpl extends ServiceImpl implements SourceService { + + private TSourceMapper tSourceMapper; + + private TDutySourceMapper tDutySourceMapper; + + /** + * 后台账户服务接口 + */ + private AccountService accountService; + + /** + * 获取有效的菜单集合 + * + * @param merchantId 商户ID + * @param status + * @return + */ + @Override + public List getAvailableSources(Integer merchantId, String status) { + return tSourceMapper.findByStatus(merchantId, status); + } + + /** + * 获取菜单的属性结构 + * + * @param merchantId 商户ID + * @param status 状态 + * @return + */ + @Override + public List getSourceTree(Integer merchantId, String status) { + List tSources = getAvailableSources(merchantId, status); + List trees = new ArrayList<>(); + if (tSources != null && tSources.size() > 0) { + TreeNode sourceTreeNode; + for (TSource tSource : tSources) { + sourceTreeNode = new TreeNode(); + sourceTreeNode.setName(tSource.getSourceName()); + sourceTreeNode.setId(tSource.getSourceId()); + sourceTreeNode.setLevel(tSource.getSourceLevel()); + sourceTreeNode.setSort((tSource.getSourceStyle() == null || StringUtil.isEmpty(tSource.getSourceStyle())) ? 0 : Integer.parseInt(tSource.getSourceStyle())); + sourceTreeNode.setPath(tSource.getPath()); + sourceTreeNode.setIcon(tSource.getNewIcon()); + sourceTreeNode.setIsMenu(tSource.getIsMenu()); + sourceTreeNode.setStatus(tSource.getStatus()); + sourceTreeNode.setPerms(tSource.getPath().replaceAll("/", ":")); + if (tSource.getParentId() != null) { + sourceTreeNode.setPId(tSource.getParentId()); + } else { + sourceTreeNode.setPId(0); + } + trees.add(sourceTreeNode); + } + } + return trees; + } + + /** + * 根据菜单ID集合查询菜单列表信息 + * + * @param ids 菜单ID + * @return + */ + @Override + public List findDatasByIds(String[] ids) { + Long[] arrays = new Long[ids.length]; + for (int i = 0; i < ids.length; i++) { + arrays[i] = Long.parseLong(ids[i]); + } + return tSourceMapper.findByIdIn(ArrayUtil.toList(arrays)); + } + + /** + * 根据账号ID获取菜单列表 + * + * @param merchantId 商户ID + * @param accountId 账号ID + * @throws BusinessCheckException + * @return + */ + @Override + public List getMenuListByUserId(Integer merchantId, Integer accountId) { + if (merchantId == null) { + merchantId = 0; + } + List sourceList = tSourceMapper.findSourcesByAccountId(merchantId, accountId); + return delRepeated(sourceList); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param treeNodes 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List treeNodes) { + List routers = new LinkedList<>(); + + for (TreeNode menu : treeNodes) { + RouterVo router = new RouterVo(); + if (menu.getIsMenu() == 0) { + router.setHidden(true); + } else { + router.setHidden(false); + } + router.setName(menu.getEname()); + if (menu.getLevel() == 1) { + router.setComponent("Layout"); + router.setPath("/" + menu.getEname().toLowerCase()); + router.setRedirect("noRedirect"); + router.setAlwaysShow(true); + } else { + if (menu.getIsMenu() == 2) { + router.setAlwaysShow(true); + } else { + router.setAlwaysShow(false); + } + router.setComponent(menu.getPath()); + router.setPath('/' + menu.getPath()); + } + router.setMeta(new MetaVo(menu.getName(), menu.getNewIcon(), false, null)); + List cMenus = menu.getChildrens(); + if (cMenus != null && !cMenus.isEmpty() && cMenus.size() > 0) { + router.setChildren(buildMenus(cMenus)); + } + routers.add(router); + } + + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List buildMenuTreeSelect(List menus) { + List menuTrees = buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + @Override + public List buildMenuTree(List menus) { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (TreeNode dept : menus) { + tempList.add(dept.getId()); + } + for (Iterator iterator = menus.iterator(); iterator.hasNext();) { + TreeNode menu = (TreeNode) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(menu.getPId())) { + recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) { + returnList = menus; + } + return returnList; + } + + /** + * 新增后台菜单 + * + * @param tSource + * @param accountId + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增后台菜单") + public void addSource(TSource tSource, Integer accountId) { + this.save(tSource); + // 赋访问权限 + List dutyIds = accountService.getDutyIdsByAccountId(accountId); + if (dutyIds != null && dutyIds.size() > 0) { + for (Integer dutyId : dutyIds) { + TDutySource dutySource = new TDutySource(); + dutySource.setDutyId(dutyId); + dutySource.setSourceId(tSource.getSourceId()); + tDutySourceMapper.insert(dutySource); + } + } + } + + /** + * 修改后台菜单 + * + * @param source + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改后台菜单") + public void editSource(TSource source) { + // 禁用或删除菜单处理 + if (source.getStatus().equals(StatusEnum.FORBIDDEN.getKey()) || source.getStatus().equals(StatusEnum.DISABLE.getKey())) { + deleteSource(source, source.getStatus()); + } else { + tSourceMapper.updateById(source); + } + } + + /** + * 删除或禁用菜单 + * + * @param source + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除后台菜单") + public void deleteSource(TSource source, String status) { + if (StringUtil.isEmpty(status)) { + status = StatusEnum.DISABLE.getKey(); + } + source.setStatus(status); + tSourceMapper.updateById(source); + + Map param = new HashMap<>(); + param.put("STATUS", StatusEnum.ENABLED.getKey()); + param.put("PARENT_ID", source.getSourceId()); + List dataList = tSourceMapper.selectByMap(param); + if (dataList != null && dataList.size() > 0) { + for (TSource tSource : dataList) { + deleteSource(tSource, status); + } + } + } + + /** + * 菜单去重 + * + * @param sources 菜单列表 + * @return + */ + private List delRepeated(List sources) { + List distinct = new ArrayList<>(); + if (sources != null) { + Map sourceMap = new HashMap<>(); + for (TSource tSource : sources) { + if (sourceMap.get(tSource.getSourceId()) == null) { + sourceMap.put(tSource.getSourceId().longValue(), true); + distinct.add(tSource); + } + } + } + return distinct; + } + + /** + * 递归列表 + * + * @param list + * @param t + */ + private void recursionFn(List list, TreeNode t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildrens(childList); + for (TreeNode tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + * + * @param list 菜单列表 + * @param t 当前节点 + * @return + */ + private List getChildList(List list, TreeNode t) { + List tList = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + TreeNode n = it.next(); + if (n.getPId() == t.getId()) { + tList.add(n); + } + } + return tList; + } + + /** + * 判断是否有子节点 + * + * @param list 菜单列表 + * @param t 当前节点 + * @return + */ + private boolean hasChild(List list, TreeNode t) { + return getChildList(list, t).size() > 0; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/StaffServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/StaffServiceImpl.java new file mode 100644 index 0000000..5b08630 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/StaffServiceImpl.java @@ -0,0 +1,330 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.StaffDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtStaffMapper; +import com.fuint.repository.model.MtMerchant; +import com.fuint.repository.model.MtStaff; +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 员工管理接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class StaffServiceImpl extends ServiceImpl implements StaffService { + + private static final Logger logger = LoggerFactory.getLogger(StaffServiceImpl.class); + + private MtStaffMapper mtStaffMapper; + + /** + * 会员服务接口 + */ + private MemberService memberService; + + /** + * 短信发送接口 + */ + private SendSmsService sendSmsService; + + /** + * 店铺接口 + */ + private StoreService storeService; + + /** + * 商户接口 + */ + private MerchantService merchantService; + + /** + * 员工查询列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryStaffListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtStaff::getAuditedStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtStaff::getRealName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtStaff::getAuditedStatus, status); + } + String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtStaff::getMobile, mobile); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtStaff::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtStaff::getStoreId, storeId); + } + String category = paginationRequest.getSearchParams().get("category") == null ? "" : paginationRequest.getSearchParams().get("category").toString(); + if (StringUtils.isNotBlank(category)) { + lambdaQueryWrapper.eq(MtStaff::getCategory, category); + } + String keyword = paginationRequest.getSearchParams().get("keyword") == null ? "" : paginationRequest.getSearchParams().get("keyword").toString(); + if (StringUtils.isNotBlank(keyword)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtStaff::getMobile, keyword) + .or() + .eq(MtStaff::getRealName, keyword)); + } + lambdaQueryWrapper.orderByDesc(MtStaff::getId); + List staffList = mtStaffMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + if (staffList != null && staffList.size() > 0) { + for (MtStaff mtStaff : staffList) { + StaffDto staffDto = new StaffDto(); + mtStaff.setMobile(CommonUtil.hidePhone(mtStaff.getMobile())); + BeanUtils.copyProperties(mtStaff, staffDto); + if (mtStaff.getStoreId() != null && mtStaff.getStoreId() > 0) { + MtStore mtStore = storeService.queryStoreById(mtStaff.getStoreId()); + staffDto.setStoreInfo(mtStore); + } + dataList.add(staffDto); + } + } + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, StaffDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存员工信息 + * + * @param mtStaff 员工参数 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存店铺员工") + public MtStaff saveStaff(MtStaff mtStaff, String operator) throws BusinessCheckException { + mtStaff.setUpdateTime(new Date()); + if (mtStaff.getId() == null || mtStaff.getId() <= 0) { + mtStaff.setCreateTime(new Date()); + if (mtStaff.getAuditedStatus() == null) { + mtStaff.setAuditedStatus(StatusEnum.UnAudited.getKey()); + } else { + mtStaff.setAuditedStatus(mtStaff.getAuditedStatus()); + } + this.save(mtStaff); + } else { + Integer id = mtStaff.getId(); + MtStaff mtStaffOld = mtStaffMapper.selectById(id); + if (mtStaffOld.getAuditedStatus().equals(StatusEnum.ENABLED.getKey())) { + mtStaff.setAuditedTime(new Date()); + } + mtStaff.setMerchantId(mtStaffOld.getMerchantId()); + } + + MtUser mtUser = null; + if (mtStaff.getUserId() != null) { + mtUser = memberService.queryMemberById(mtStaff.getUserId()); + } + + // 关联会员信息 + if (mtStaff.getUserId() == null || mtUser == null) { + MtUser userInfo = new MtUser(); + userInfo.setName(mtStaff.getRealName()); + userInfo.setDescription("系统自动注册店铺员工账号"); + userInfo.setStoreId(mtStaff.getStoreId()); + userInfo.setMerchantId(mtStaff.getMerchantId()); + userInfo.setIsStaff(YesOrNoEnum.YES.getKey()); + userInfo.setOperator(operator); + mtUser = memberService.addMember(userInfo, "0"); + if (mtUser != null) { + mtStaff.setUserId(mtUser.getId()); + } else { + throw new BusinessCheckException("新增员工失败"); + } + } else { + mtUser.setIsStaff(YesOrNoEnum.YES.getKey()); + mtUser.setOperator(operator); + memberService.updateMember(mtUser, false); + } + + // 更新员工 + this.updateById(mtStaff); + logger.info("operator:{} 保存员工信息mtStaff:{}", operator, mtStaff); + return mtStaff; + } + + /** + * 根据ID获取员工信息 + * + * @param id 员工ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtStaff queryStaffById(Integer id) { + if (id == null || id <= 0) { + return null; + } + return mtStaffMapper.selectById(id); + } + + /** + * 修改店铺员工状态 + * + * @param staffId 员工ID + * @param status 状态 + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "修改店铺员工状态") + public Integer updateAuditedStatus(Integer staffId, String status, String operator) throws BusinessCheckException { + MtStaff mtStaff = mtStaffMapper.selectById(staffId); + if (mtStaff != null) { + mtStaff.setAuditedStatus(status); + mtStaff.setUpdateTime(new Date()); + mtStaff.setAuditedTime(new Date()); + mtStaffMapper.updateById(mtStaff); + + // 发送短信通知 + MtStore mtStore = storeService.queryStoreById(mtStaff.getStoreId()); + if (mtStore == null) { + mtStore = new MtStore(); + mtStore.setName("全部店铺"); + } + List mobileList = new ArrayList<>(); + mobileList.add(mtStaff.getMobile()); + + try { + Map params = new HashMap<>(); + params.put("name", mtStaff.getRealName()); + params.put("storeId", mtStaff.getStoreId().toString()); + sendSmsService.sendSms(mtStaff.getMerchantId(), "confirmer-authed", mobileList, params); + } catch (Exception e) { + logger.error("修改店铺员工状态发送短信出错:", e.getMessage()); + } + } else { + return 0; + } + + return staffId; + } + + /** + * 根据条件搜索员工 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryStaffByParams(Map params) { + if (params == null) { + params = new HashMap<>(); + } + return mtStaffMapper.selectByMap(params); + } + + /** + * 根据手机号获取员工信息 + * + * @param mobile 手机号 + * @throws BusinessCheckException + * @return + */ + @Override + public MtStaff queryStaffByMobile(String mobile) { + if (StringUtil.isBlank(mobile)) { + return null; + } + return mtStaffMapper.queryStaffByMobile(mobile); + } + + /** + * 根据会员ID获取员工信息 + * + * @param userId 会员ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtStaff queryStaffByUserId(Integer userId) { + return mtStaffMapper.queryStaffByUserId(userId); + } + + /** + * 根据手机号获取员工信息 + * + * @param mobile 手机号 + * @throws BusinessCheckException + * @return + */ + @Override + public StaffDto getStaffInfoByMobile(String mobile) throws BusinessCheckException { + MtStaff mtStaff = mtStaffMapper.queryStaffByMobile(mobile); + StaffDto staffDto = new StaffDto(); + if (mtStaff != null) { + BeanUtils.copyProperties(mtStaff, staffDto); + if (staffDto.getStoreId() != null && staffDto.getStoreId() > 0) { + MtStore mtStore = storeService.queryStoreById(staffDto.getStoreId()); + if (mtStore != null) { + staffDto.setStoreInfo(mtStore); + } + } + if (staffDto.getMerchantId() != null && staffDto.getMerchantId() > 0) { + MtMerchant mtMerchant = merchantService.getById(staffDto.getMerchantId()); + if (mtMerchant != null) { + staffDto.setMerchantInfo(mtMerchant); + } + } + } else { + return null; + } + return staffDto; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/StockServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/StockServiceImpl.java new file mode 100644 index 0000000..f03a825 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/StockServiceImpl.java @@ -0,0 +1,257 @@ +package com.fuint.common.service.impl; + +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.fuint.common.dto.StockGoodsDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.service.*; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.*; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * 库存业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class StockServiceImpl extends ServiceImpl implements StockService { + + private MtStockMapper mtStockMapper; + + private MtStockItemMapper mtStockItemMapper; + + private MtGoodsMapper mtGoodsMapper; + + private MtGoodsSkuMapper mtGoodsSkuMapper; + + /** + * 分页查询库存管理记录列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryStockListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtStock::getStatus, StatusEnum.DISABLE.getKey()); + + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtStock::getStatus, status); + } + String type = paginationRequest.getSearchParams().get("type") == null ? "" : paginationRequest.getSearchParams().get("type").toString(); + if (StringUtils.isNotBlank(type)) { + lambdaQueryWrapper.eq(MtStock::getType, type); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtStock::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtStock::getStoreId, storeId); + } + String description = paginationRequest.getSearchParams().get("description") == null ? "" : paginationRequest.getSearchParams().get("description").toString(); + if (StringUtils.isNotBlank(description)) { + lambdaQueryWrapper.like(MtStock::getDescription, description); + } + + lambdaQueryWrapper.orderByDesc(MtStock::getId); + List dataList = mtStockMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtStock.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 新增库存管理记录 (操作库存) + * + * @param stockParam 库存参数 + * @param goodsList 商品列表 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增库存管理记录") + public ResponseObject addStock(MtStock stockParam, List goodsList) throws BusinessCheckException { + MtStock mtStock = new MtStock(); + mtStock.setMerchantId(stockParam.getMerchantId()); + mtStock.setStoreId(stockParam.getStoreId()); + mtStock.setStatus(StatusEnum.ENABLED.getKey()); + mtStock.setType(stockParam.getType()); + Date createTime = new Date(); + mtStock.setCreateTime(createTime); + mtStock.setUpdateTime(createTime); + mtStock.setDescription(stockParam.getDescription()); + mtStock.setOperator(stockParam.getOperator()); + this.save(mtStock); + + Integer stockId = mtStock.getId(); + for (StockGoodsDto goods : goodsList) { + MtStockItem mtStockItem = new MtStockItem(); + mtStockItem.setStockId(stockId); + Integer goodsId = goods.getId(); + Integer skuId = goods.getSkuId(); + Double num = goods.getNum(); + mtStockItem.setGoodsId(goodsId); + if (goods.getSkuId() != null) { + mtStockItem.setSkuId(skuId); + } + mtStockItem.setStatus(StatusEnum.ENABLED.getKey()); + mtStockItem.setNum(num); + mtStockItem.setCreateTime(createTime); + mtStockItem.setUpdateTime(createTime); + mtStockItemMapper.insert(mtStockItem); + + // 库存操作 + MtGoods goodsInfo = mtGoodsMapper.selectById(goodsId); + if (goodsInfo.getIsSingleSpec().equals(YesOrNoEnum.YES.getKey())) { + // 单规格库存 + Double stock; + if (mtStock.getType().equals("increase")) { + stock = goodsInfo.getStock() + num; + } else { + stock = goodsInfo.getStock() - num; + } + if (stock < 0) { + throw new BusinessCheckException("商品“" + goodsInfo.getName() + "”库存不足,提交失败"); + } + goodsInfo.setStock(stock); + mtGoodsMapper.updateById(goodsInfo); + } else { + // 多规格库存 + MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(skuId); + if (mtGoodsSku != null) { + Double stock; + if (mtStock.getType().equals("increase")) { + stock = mtGoodsSku.getStock() + num; + } else { + stock = mtGoodsSku.getStock() - num; + } + if (stock < 0) { + throw new BusinessCheckException("商品sku编码“" + mtGoodsSku.getSkuNo() +"”库存不足,提交失败"); + } + mtGoodsSku.setStock(stock); + mtGoodsSkuMapper.updateById(mtGoodsSku); + } + } + } + return new ResponseObject(200, "", mtStock); + } + + /** + * 删除库存管理记录 + * + * @param id ID + * @param operator 操作人 + * @throws BusinessCheckException + * @return + */ + @Override + @OperationServiceLog(description = "删除库存管理记录") + public void delete(Integer id, String operator) throws BusinessCheckException { + MtStock mtStock = mtStockMapper.selectById(id); + if (mtStock == null) { + return; + } + mtStock.setStatus(StatusEnum.DISABLE.getKey()); + mtStock.setUpdateTime(new Date()); + mtStock.setOperator(operator); + this.updateById(mtStock); + } + + /** + * 根据ID获取库存管理记录 + * + * @param id ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtStock queryStockById(Long id) { + return mtStockMapper.selectById(id.intValue()); + } + + /** + * 根据条件查询库存项 + * + * @param params 查询条件 + * @return + * */ + @Override + public List queryItemByParams(Map params) { + if (params == null) { + params = new HashMap<>(); + } + return mtStockItemMapper.selectByMap(params); + } + + /** + * 生成出入库记录 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param goodsId 商品ID + * @param skuId 商品SKU ID + * @param type 类型,increase:入库,reduce:出库 + * @param num 数量 + * @param description 说明 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean addStockRecord(Integer merchantId, Integer storeId, Integer goodsId, Integer skuId, String type, Double num, String description) { + MtStock mtStock = new MtStock(); + mtStock.setMerchantId(merchantId); + mtStock.setStoreId(storeId); + mtStock.setStatus(StatusEnum.ENABLED.getKey()); + mtStock.setType(type); + Date createTime = new Date(); + mtStock.setCreateTime(createTime); + mtStock.setUpdateTime(createTime); + mtStock.setDescription(description); + mtStockMapper.insert(mtStock); + // 生成库存明细 + MtStockItem mtStockItem = new MtStockItem(); + mtStockItem.setStockId(mtStock.getId()); + mtStockItem.setGoodsId(goodsId); + if (skuId != null) { + mtStockItem.setSkuId(skuId); + } + mtStockItem.setStatus(StatusEnum.ENABLED.getKey()); + mtStockItem.setNum(num); + mtStockItem.setDescription(description); + mtStockItem.setCreateTime(createTime); + mtStockItem.setUpdateTime(createTime); + mtStockItemMapper.insert(mtStockItem); + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/StoreServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/StoreServiceImpl.java new file mode 100644 index 0000000..5197af6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/StoreServiceImpl.java @@ -0,0 +1,629 @@ +package com.fuint.common.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +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.fuint.common.dto.StoreDto; +import com.fuint.common.dto.StoreInfo; +import com.fuint.common.enums.QrCodeEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.service.MerchantService; +import com.fuint.common.service.StoreService; +import com.fuint.common.service.WeixinService; +import com.fuint.common.util.CommonUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.bean.StoreDistanceBean; +import com.fuint.repository.mapper.MtMerchantMapper; +import com.fuint.repository.mapper.MtStoreGoodsMapper; +import com.fuint.repository.mapper.MtStoreMapper; +import com.fuint.repository.model.MtMerchant; +import com.fuint.repository.model.MtStore; +import com.fuint.utils.HttpUtil; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.core.env.Environment; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.net.MalformedURLException; +import java.util.*; +import java.net.URL; +import java.net.URLConnection; + +/** + * 店铺管理业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class StoreServiceImpl extends ServiceImpl implements StoreService { + + private static final Logger logger = LoggerFactory.getLogger(StoreServiceImpl.class); + + /** + * 系统环境变量 + * */ + private Environment env; + + private MtStoreMapper mtStoreMapper; + + private MtMerchantMapper mtMerchantMapper; + + private MtStoreGoodsMapper mtStoreGoodsMapper; + + /** + * 商户接口 + */ + private MerchantService merchantService; + + /** + * 微信服务接口 + * */ + private WeixinService weixinService; + + /** + * 分页查询店铺列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryStoreListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtStore::getStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtStore::getName, name); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtStore::getStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtStore::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtStore::getId, storeId); + } + + lambdaQueryWrapper.orderByAsc(MtStore::getStatus).orderByDesc(MtStore::getIsDefault); + List storeList = mtStoreMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + for (MtStore mtStore : storeList) { + StoreDto storeDto = new StoreDto(); + BeanUtils.copyProperties(mtStore, storeDto); + storeDto.setPhone(CommonUtil.hidePhone(mtStore.getPhone())); + MtMerchant mtMerchant = mtMerchantMapper.selectById(mtStore.getMerchantId()); + if (mtMerchant != null) { + storeDto.setMerchantName(mtMerchant.getName()); + } + dataList.add(storeDto); + } + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, StoreDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 保存店铺信息 + * + * @param storeDto 店铺信息 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "保存店铺信息") + public MtStore saveStore(StoreDto storeDto) throws BusinessCheckException { + MtStore mtStore = new MtStore(); + + // 编辑店铺 + if (storeDto.getId() != null) { + mtStore = queryStoreById(storeDto.getId()); + if (mtStore == null) { + throw new BusinessCheckException("该店铺不存在"); + } + } + + mtStore.setName(storeDto.getName()); + mtStore.setLogo(storeDto.getLogo()); + mtStore.setContact(storeDto.getContact()); + mtStore.setOperator(storeDto.getOperator()); + if (storeDto.getWxMchId() != null) { + mtStore.setWxMchId(storeDto.getWxMchId()); + } + if (storeDto.getWxApiV2() != null) { + mtStore.setWxApiV2(storeDto.getWxApiV2()); + } + if (storeDto.getWxCertPath() != null) { + mtStore.setWxCertPath(storeDto.getWxCertPath()); + } + if (storeDto.getAlipayAppId() != null) { + mtStore.setAlipayAppId(storeDto.getAlipayAppId()); + } + if (storeDto.getAlipayPrivateKey() != null) { + mtStore.setAlipayPrivateKey(storeDto.getAlipayPrivateKey()); + } + if (storeDto.getAlipayPublicKey() != null) { + mtStore.setAlipayPublicKey(storeDto.getAlipayPublicKey()); + } + mtStore.setLicense(storeDto.getLicense()); + mtStore.setCreditCode(storeDto.getCreditCode()); + mtStore.setBankName(storeDto.getBankName()); + mtStore.setBankCardName(storeDto.getBankCardName()); + mtStore.setBankCardNo(storeDto.getBankCardNo()); + mtStore.setUpdateTime(new Date()); + if (storeDto.getId() == null) { + mtStore.setCreateTime(new Date()); + } + mtStore.setDescription(storeDto.getDescription()); + mtStore.setPhone(storeDto.getPhone()); + + if (storeDto.getIsDefault() != null) { + if (storeDto.getIsDefault().equals(YesOrNoEnum.YES.getKey())) { + mtStoreMapper.resetDefaultStore(storeDto.getMerchantId()); + } + } + + mtStore.setIsDefault(storeDto.getIsDefault()); + mtStore.setAddress(storeDto.getAddress()); + mtStore.setHours(storeDto.getHours()); + + if (StringUtil.isNotBlank(storeDto.getLatitude()) && StringUtil.isNotBlank(storeDto.getLongitude())) { + boolean isValid = CommonUtil.isValidGlobalCoordinate(Double.parseDouble(storeDto.getLongitude()), Double.parseDouble(storeDto.getLatitude())); + if (!isValid) { + throw new BusinessCheckException("店铺经纬度格式不正确,请确认!"); + } else { + mtStore.setLatitude(storeDto.getLatitude()); + mtStore.setLongitude(storeDto.getLongitude()); + } + } + mtStore.setStatus(storeDto.getStatus()); + if (storeDto.getMerchantId() != null) { + mtStore.setMerchantId(storeDto.getMerchantId()); + } + + if (mtStore.getStatus() == null) { + mtStore.setStatus(StatusEnum.ENABLED.getKey()); + } + if (mtStore.getId() == null || mtStore.getId() < 1) { + this.save(mtStore); + } else { + mtStoreMapper.updateById(mtStore); + } + + // 保存二维码 + try { + String page = QrCodeEnum.STORE.getPage() + "?" + QrCodeEnum.STORE.getKey() + "Id=" + mtStore.getId(); + String qr = weixinService.createQrCode(mtStore.getMerchantId(), QrCodeEnum.STORE.getKey(), mtStore.getId(), page, 320); + mtStore.setQrCode(qr); + } catch (Exception e) { + logger.error(e.getMessage()); + } + + mtStoreMapper.updateById(mtStore); + return mtStore; + } + + /** + * 根据店铺ID获取店铺信息 + * + * @param id 店铺ID + * @throws BusinessCheckException + * @return + */ + @Override + public MtStore queryStoreById(Integer id) { + if (id == null || id < 1) { + return null; + } + return mtStoreMapper.selectById(id); + } + + /** + * 获取系统默认店铺 + * + * @param merchantNo 商户号 + * @return + */ + @Override + public MtStore getDefaultStore(String merchantNo) { + Map params = new HashMap<>(); + params.put("status", StatusEnum.ENABLED.getKey()); + params.put("is_default", YesOrNoEnum.YES.getKey()); + if (StringUtil.isNotEmpty(merchantNo)) { + MtMerchant mtMerchant = merchantService.queryMerchantByNo(merchantNo); + if (mtMerchant != null) { + params.put("merchantId", mtMerchant.getId()); + } + } + List storeList = queryStoresByParams(params); + if (storeList.size() > 0) { + return storeList.get(0); + } else { + Map param = new HashMap<>(); + param.put("status", StatusEnum.ENABLED.getKey()); + List dataList = queryStoresByParams(param); + if (dataList.size() > 0) { + return dataList.get(0); + } else { + return null; + } + } + } + + /** + * 根据店铺名称获取店铺信息 + * + * @param storeName 店铺名称 + * @return + */ + @Override + public StoreDto queryStoreByName(String storeName) { + MtStore mtStore = mtStoreMapper.queryStoreByName(storeName); + StoreDto storeDto = null; + + if (mtStore != null) { + storeDto = new StoreDto(); + BeanUtils.copyProperties(mtStore, storeDto); + } + + return storeDto; + } + + /** + * 根据店铺ID获取店铺信息 + * + * @param id 店铺ID + * @throws BusinessCheckException + * @return + */ + @Override + public StoreDto queryStoreDtoById(Integer id) throws BusinessCheckException { + MtStore mtStore = queryStoreById(id); + if (null == mtStore || StatusEnum.DISABLE.getKey().equals(mtStore.getStatus())) { + throw new BusinessCheckException("该店铺状态异常"); + } + + StoreDto mtStoreDto = new StoreDto(); + BeanUtils.copyProperties(mtStore, mtStoreDto); + + if (StringUtil.isEmpty(mtStore.getQrCode())) { + try { + String page = QrCodeEnum.STORE.getPage() + "?" + QrCodeEnum.STORE.getKey() + "Id = " + mtStore.getId(); + String qr = weixinService.createQrCode(mtStore.getMerchantId(), QrCodeEnum.STORE.getKey(), mtStore.getId(), page, 320); + mtStoreDto.setQrCode(qr); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + + return mtStoreDto; + } + + /** + * 更新店铺状态 + * + * @param id 店铺ID + * @param operator 操作人 + * @param status 状态 + * @throws BusinessCheckException + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改店铺状态") + public void updateStatus(Integer id, String operator, String status) throws BusinessCheckException { + MtStore mtStore = queryStoreById(id); + if (null == mtStore) { + throw new BusinessCheckException("该店铺不存在."); + } + + mtStore.setStatus(status); + mtStore.setUpdateTime(new Date()); + mtStore.setOperator(operator); + + // 删除店铺 + if (status.equals(StatusEnum.DISABLE.getKey())) { + mtStoreGoodsMapper.removeStoreGoods(id); + } + + mtStoreMapper.updateById(mtStore); + } + + /** + * 根据条件查询店铺列表 + * + * @param params 查询参数 + * @return + * */ + @Override + public List queryStoresByParams(Map params) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtStore::getStatus, StatusEnum.DISABLE.getKey()); + + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtStore::getId, storeId); + } + + String name = params.get("name") == null ? "" : params.get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtStore::getName, name); + } + String status = params.get("status") == null ? "" : params.get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtStore::getStatus, status); + } + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtStore::getMerchantId, merchantId); + } + + lambdaQueryWrapper.orderByAsc(MtStore::getStatus).orderByDesc(MtStore::getIsDefault); + return mtStoreMapper.selectList(lambdaQueryWrapper); + } + + /** + * 获取我的店铺列表 + * + * @param merchantId 商户ID + * @param storeId 店铺ID + * @param status 状态 + * @return + * */ + @Override + public List getMyStoreList(Integer merchantId, Integer storeId, String status) { + return mtStoreMapper.getMyStoreList(merchantId, storeId, status); + } + + /** + * 根据距离远近获取店铺列表 + * + * @param merchantNo 商户号 + * @param keyword 关键字 + * @param latitude 维度 + * @param longitude 经度 + * @return + * */ + @Override + public List queryByDistance(String merchantNo, String keyword, String latitude, String longitude) { + List dataList = new ArrayList<>(); + + MtMerchant mtMerchant = merchantService.queryMerchantByNo(merchantNo); + Integer merchantId = (mtMerchant == null) ? 0 : mtMerchant.getId(); + + List distanceList = mtStoreMapper.queryByDistance(merchantId, keyword, latitude, longitude); + Map param = new HashMap<>(); + param.put("status", StatusEnum.ENABLED.getKey()); + if (merchantId != null && merchantId > 0) { + param.put("merchant_id", merchantId); + } + List storeList = mtStoreMapper.selectByMap(param); + + if (distanceList != null) { + for (StoreDistanceBean bean : distanceList) { + for (MtStore mtStore : storeList) { + if (mtStore.getId().equals(bean.getId())) { + if (StringUtil.isNotEmpty(latitude) && StringUtil.isNotEmpty(longitude)) { + mtStore.setDistance(new BigDecimal(bean.getDistance())); + } else { + mtStore.setDistance(new BigDecimal("0.0")); + } + StoreInfo storeInfo = new StoreInfo(); + BeanUtils.copyProperties(mtStore, storeInfo); + dataList.add(storeInfo); + } + } + } + } + + return dataList; + } + + /** + * 获取店铺名称 + * + * @param storeIds 店铺ID + * @return + * */ + @Override + public String getStoreNames(String storeIds) { + if (StringUtil.isEmpty(storeIds)) { + return ""; + } + String[] ids = storeIds.split(","); + List storeNames = new ArrayList<>(); + if (ids.length > 0) { + for (int i = 0; i < ids.length; i++) { + MtStore mtStore = mtStoreMapper.selectById(Integer.parseInt(ids[i])); + if (mtStore != null) { + storeNames.add(mtStore.getName()); + } + } + } + return String.join(",", storeNames); + } + + /** + * 获取店铺名称 + * + * @param merchantId 商户ID + * @param storeNames 店铺名称 + * @return + * */ + @Override + public String getStoreIds(Integer merchantId, String storeNames) { + if (StringUtil.isEmpty(storeNames)) { + return ""; + } + String[] names = storeNames.split(","); + List storeIds = new ArrayList<>(); + if (names.length > 0) { + for (int i = 0; i < names.length; i++) { + MtStore mtStore = mtStoreMapper.queryStoreByName(names[i]); + if (mtStore != null) { + storeIds.add(mtStore.getId().toString()); + } + } + } + return String.join(",", storeIds); + } + + /** + * 根据商户ID删除店铺信息 + * + * @param merchantId 商户ID + * @return + * */ + @Override + public void deleteStoreByMerchant(Integer merchantId) { + if (merchantId == null || merchantId <= 0) { + return; + } + mtStoreMapper.deleteStoreByMerchant(merchantId); + } + + /** + * 根据地址获取经纬度 + * + * @param addr 地址 + * @return + * */ + public Map getLatAndLngByAddress(String addr) { + String key = env.getProperty("amap.key"); + Map map = new HashMap<>(); + if (StringUtil.isEmpty(key) || key.length() < 10) { + map.put("lat", ""); + map.put("lng", ""); + return map; + } + + String address = ""; + try { + address = java.net.URLEncoder.encode(addr,"UTF-8"); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + + // key如果失效了就去高德地图官网申请 + String url = "https://restapi.amap.com/v3/geocode/geo?address="+address+"&output=JSON&key="+key; + + URL myURL = null; + URLConnection httpsConn; + // 进行转码 + try { + myURL = new URL(url); + } catch (MalformedURLException e) { + // empty + } + StringBuffer sb = new StringBuffer(); + try { + httpsConn = myURL.openConnection(); + if (httpsConn != null) { + InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8"); + BufferedReader br = new BufferedReader(insr); + String data = null; + while ((data = br.readLine()) != null) { + sb.append(data); + } + insr.close(); + } + } catch (IOException e) { + logger.error("根据地址获取经纬度失败:{}", e.getMessage()); + } + + JSONObject resultJson = JSON.parseObject(sb.toString()); + JSONArray geocodes = resultJson.getJSONArray("geocodes"); + + String lat = ""; + String lng = ""; + + if (geocodes != null) { + JSONObject jsonObject = geocodes.getJSONObject(0); + String location = jsonObject.getString("location"); + if (org.apache.commons.lang.StringUtils.isNotEmpty(location)) { + String latAndLng[] = location.split(","); + if (latAndLng.length == 2) { + lat = latAndLng[1]; + lng = latAndLng[0]; + } + } + } + + map.put("lat", lat); + map.put("lng", lng); + + return map; + } + + /** + * 测量步行距离 + * + * @param origin 起点经纬度 格式如:116.434446,39.90816 + * @param destination 终点经纬度 格式如:116.434307,39.90909 + * @return + * */ + public Double getDistance(String origin, String destination) { + String key = env.getProperty("amap.key"); + if (StringUtil.isEmpty(key)) { + return 0d; + } + String url = "https://restapi.amap.com/v3/direction/walking?origin="+origin+"&destination="+destination+"&key="+key; + String response = HttpUtil.sendRequest(url); + if (StringUtil.isEmpty(response)) { + return 0d; + } + JSONObject resultJson = JSON.parseObject(response); + if (resultJson != null && "1".equals(resultJson.getString("status"))) { + JSONObject route = resultJson.getJSONObject("route"); + if (route != null) { + JSONArray paths = route.getJSONArray("paths"); + if (paths != null && paths.size() > 0) { + JSONObject path = paths.getJSONObject(0); + String distance = path.getString("distance"); + if (distance != null) { + return Double.parseDouble(distance)/1000; + } + } + } + + } + return 0d; + } + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/UnionPayServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/UnionPayServiceImpl.java new file mode 100644 index 0000000..86d56f3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/UnionPayServiceImpl.java @@ -0,0 +1,271 @@ +package com.fuint.common.service.impl; + +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradeQueryModel; +import com.alipay.api.domain.AlipayTradeRefundModel; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.response.AlipayTradeQueryResponse; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.ijpay.unionpay.UnionPayApi; +import com.fuint.common.bean.UnionPayBean; +import com.fuint.common.dto.OrderDto; +import com.fuint.common.dto.UserOrderDto; +import com.fuint.common.enums.*; +import com.fuint.common.service.*; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.ijpay.alipay.AliPayApi; +import com.ijpay.alipay.AliPayApiConfig; +import com.ijpay.alipay.AliPayApiConfigKit; +import com.ijpay.core.enums.SignType; +import com.ijpay.core.kit.WxPayKit; +import com.ijpay.unionpay.enums.ServiceEnum; +import com.ijpay.unionpay.model.MicroPayModel; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.*; + +/** + * 云闪付相关接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class UnionPayServiceImpl implements UnionPayService { + + private static final Logger logger = LoggerFactory.getLogger(UnionPayServiceImpl.class); + + private UnionPayBean unionPayBean; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 创建预支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP地址 + * @param platform 支付平台 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException { + logger.info("UnionPayService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo); + + String goodsInfo = orderInfo.getOrderSn(); + if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) { + goodsInfo = OrderTypeEnum.PRESTORE.getValue(); + } + + // 更新支付金额 + BigDecimal payAmount1 = new BigDecimal(payAmount).divide(new BigDecimal("100")); + OrderDto reqDto = new OrderDto(); + reqDto.setId(orderInfo.getId()); + reqDto.setPayAmount(payAmount1); + reqDto.setPayType(orderInfo.getPayType()); + reqDto.setOrderSn(orderInfo.getOrderSn()); + orderService.updateOrder(reqDto); + + getApiConfig(orderInfo.getStoreId()); + Map params = MicroPayModel.builder() + .service(ServiceEnum.MICRO_PAY.toString()) + .mch_id(unionPayBean.getMachId()) + .out_trade_no(WxPayKit.generateStr()) + .body(goodsInfo) + .attach("云闪付支付") + .total_fee(payAmount1.toString()) + .mch_create_ip(ip) + .auth_code(authCode) + .nonce_str(WxPayKit.generateStr()) + .build() + .createSign(unionPayBean.getKey(), SignType.MD5); + String returnCode = "0"; + try { + String xmlResult = UnionPayApi.execution(unionPayBean.getServerUrl(), params); + Map result = WxPayKit.xmlToMap(xmlResult); + returnCode = result.get("status"); + String resultCode = result.get("result_code"); + String errMsg = result.get("err_msg"); + String errCode = result.get("err_code"); + + logger.info("UnionPayService createPrepayOrder xmlResult: {} ", xmlResult); + if (!"0".equals(returnCode) || !"0".equals(resultCode)) { + if (returnCode.equals("10003")) { + // 需要会员输入支付密码,等待10秒后查询订单 + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Map payResult = queryPaidOrder(orderInfo.getStoreId(), "云闪付单号", orderInfo.getOrderSn()); + if (payResult == null) { + throw new BusinessCheckException("云闪付支付失败"); + } + } else { + throw new BusinessCheckException("云闪付支付出错:" + errCode + errMsg); + } + } + } catch (Exception e) { + logger.error("UnionPayService createPrepayOrder exception {}", e.getMessage()); + throw new BusinessCheckException("云闪付支付出错,请检查配置项"); + } + + Map respData = new HashMap<>(); + respData.put("result", returnCode); + + ResponseObject responseObject = new ResponseObject(200, "云闪付支付接口返回成功", respData); + logger.info("UnionPayService createPrepayOrder outParams {}", responseObject.toString()); + + return responseObject; + } + + /** + * 支付回调 + * + * @param params 请求参数 + * @return + * */ + @Override + public Boolean checkCallBack(Map params) throws Exception { + String orderSn = params.get("out_trade_no") != null ? params.get("out_trade_no") : ""; + Integer storeId = 0; + UserOrderDto orderDto = orderService.getOrderByOrderSn(orderSn); + if (orderDto != null && orderDto.getStoreInfo() != null) { + storeId = orderDto.getStoreInfo().getId(); + } + getApiConfig(storeId); + return AlipaySignature.rsaCheckV1(params, unionPayBean.getKey(), "UTF-8", "RSA2"); + } + + /** + * 获取支付配置 + * + * @param storeId 店铺ID + * @return + * */ + public AliPayApiConfig getApiConfig(Integer storeId) throws BusinessCheckException { + AliPayApiConfig aliPayApiConfig; + String appId = unionPayBean.getMachId(); + String privateKey = unionPayBean.getMachId(); + String publicKey = unionPayBean.getKey(); + + // 优先读取店铺的支付账号 + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null && StringUtil.isNotEmpty(mtStore.getAlipayAppId()) && StringUtil.isNotEmpty(mtStore.getAlipayPrivateKey()) && StringUtil.isNotEmpty(mtStore.getAlipayPublicKey())) { + appId = mtStore.getAlipayAppId(); + privateKey = mtStore.getAlipayPrivateKey(); + publicKey = mtStore.getAlipayPublicKey(); + } + + aliPayApiConfig = AliPayApiConfig.builder() + .setAppId(appId) + .setAliPayPublicKey(publicKey) + .setCharset("UTF-8") + .setPrivateKey(privateKey) + .setServiceUrl(unionPayBean.getServerUrl()) + .setSignType("RSA2") + .build(); + + AliPayApiConfigKit.setThreadLocalAppId(appId); + AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig); + + return aliPayApiConfig; + } + + /** + * 查询支付订单 + * + * @param storeId 店铺ID + * @param tradeNo 交易单号 + * @param orderSn 订单号 + * @return + * */ + @Override + public Map queryPaidOrder(Integer storeId, String tradeNo, String orderSn) throws BusinessCheckException { + try { + AlipayTradeQueryModel model = new AlipayTradeQueryModel(); + if (StringUtil.isNotEmpty(orderSn)) { + model.setOutTradeNo(orderSn); + } + if (StringUtil.isNotEmpty(tradeNo)) { + model.setTradeNo(tradeNo); + } + getApiConfig(storeId); + AlipayTradeQueryResponse response = AliPayApi.tradeQueryToResponse(model); + if (response != null) { + // TradeStatus:TRADE_SUCCESS(交易支付成功,可进行退款)或 TRADE_FINISHED(交易结束,不可退款) + if (response.getTradeStatus() != null && response.getTradeStatus().equals("TRADE_SUCCESS")) { + Map result = new HashMap<>(); + result.put("tradeNo", response.getTradeNo()); + result.put("status", response.getTradeStatus()); + result.put("payAmount", response.getBuyerPayAmount()); + return result; + } + } + } catch (AlipayApiException e) { + logger.info("UnionPayService queryPaidOrder response", e.getMessage()); + } + + return null; + } + + /** + * 发起售后退款 + * + * @param storeId 店铺ID + * @param orderSn 订单号 + * @param totalAmount 订单总金额 + * @param refundAmount 售后金额 + * @param platform 订单平台 + * @return + * */ + public Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException { + try { + logger.info("UnionPayService.doRefund orderSn = {}, totalFee = {}, refundFee = {}", orderSn, totalAmount, refundAmount); + if (StringUtil.isEmpty(orderSn)) { + throw new BusinessCheckException("退款订单号不能为空..."); + } + if (refundAmount.compareTo(totalAmount) > 0) { + throw new BusinessCheckException("退款金额不能大于总金额..."); + } + getApiConfig(storeId); + AlipayTradeRefundModel model = new AlipayTradeRefundModel(); + model.setOutTradeNo(orderSn); + model.setRefundAmount(refundAmount.toString()); + model.setRefundReason("申请退款"); + AlipayTradeRefundResponse refundResponse = AliPayApi.tradeRefundToResponse(model); + String code = refundResponse.getCode(); + String msg = refundResponse.getMsg(); + String subMsg = refundResponse.getSubMsg() == null ? msg : refundResponse.getSubMsg(); + logger.info("UnionPayService refundResult response Body = {}", refundResponse.getBody()); + if (!code.equals("10000") || !msg.equalsIgnoreCase("Success")) { + throw new BusinessCheckException("云闪付退款失败," + subMsg); + } + } catch (AlipayApiException e) { + logger.error("UnionPayService.doRefund error = {}", e.getMessage()); + e.printStackTrace(); + } + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/UploadServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/UploadServiceImpl.java new file mode 100644 index 0000000..08d7386 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/UploadServiceImpl.java @@ -0,0 +1,74 @@ +package com.fuint.common.service.impl; + +import com.fuint.common.service.UploadService; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.DateUtil; +import com.fuint.common.util.SeqUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.utils.StringUtil; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import org.springframework.util.ResourceUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.util.Date; + +/** + * 文件上传服务类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class UploadServiceImpl implements UploadService { + + private static final Logger logger = LoggerFactory.getLogger(UploadServiceImpl.class); + + /** + * 环境变量 + * */ + private Environment env; + + /** + * 保存文件 + * + * @param file excel文件 + * @param request + * @return + * */ + public String saveUploadFile(HttpServletRequest request, MultipartFile file) throws Exception { + if (file == null) { + throw new BusinessCheckException("上传文件出错!"); + } + String fileName = file.getOriginalFilename(); + String uploadPath = fileName.substring(fileName.lastIndexOf(".")); + String pathRoot = env.getProperty("images.root"); + if (pathRoot == null || StringUtil.isEmpty(pathRoot)) { + pathRoot = ResourceUtils.getURL("classpath:").getPath(); + } + String uuid = SeqUtil.getUUID(); + + String filePath = "/static/uploadFiles/"+ DateUtil.formatDate(new Date(), "yyyyMMdd")+"/"; + String path = filePath + uuid + uploadPath; + + try { + File tempFile = new File(pathRoot + path); + if (!tempFile.getParentFile().exists()) { + tempFile.getParentFile().mkdirs(); + } + CommonUtil.saveMultipartFile(file, pathRoot + path); + } catch (Exception e) { + logger.error("上传文件保存出错:", e.getMessage()); + } + + return path; + } + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/UserActionServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/UserActionServiceImpl.java new file mode 100644 index 0000000..571994f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/UserActionServiceImpl.java @@ -0,0 +1,147 @@ +package com.fuint.common.service.impl; + +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.fuint.common.enums.StatusEnum; +import com.fuint.common.service.UserActionService; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtUserActionMapper; +import com.fuint.repository.model.MtUserAction; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 会员行为业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class UserActionServiceImpl extends ServiceImpl implements UserActionService { + + private MtUserActionMapper mtUserActionMapper; + + /** + * 分页查询会员行为记录列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryUserActionListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtUserAction::getStatus, StatusEnum.DISABLE.getKey()); + + String description = paginationRequest.getSearchParams().get("description") == null ? "" : paginationRequest.getSearchParams().get("description").toString(); + if (StringUtils.isNotBlank(description)) { + lambdaQueryWrapper.like(MtUserAction::getDescription, description); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtUserAction::getMerchantId, merchantId); + } + String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString(); + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtUserAction::getStoreId, storeId); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtUserAction::getStatus, status); + } + + lambdaQueryWrapper.orderByDesc(MtUserAction::getId); + List dataList = mtUserActionMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtUserAction.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 新增会员行为 + * + * @param reqUserAction 会员行为 + * @return + */ + @Override + public boolean addUserAction(MtUserAction reqUserAction) { + if (reqUserAction.getAction() == null || reqUserAction.getUserId() == null) { + return false; + } + + Map params = new HashMap<>(); + params.put("USER_ID", reqUserAction.getUserId()); + params.put("action", reqUserAction.getAction()); + if (reqUserAction.getParam() != null) { + params.put("param", reqUserAction.getParam()); + } + + List dataList = mtUserActionMapper.selectByMap(params); + + // 防止重复 + if (dataList.size() == 0) { + MtUserAction mtUserAction = new MtUserAction(); + mtUserAction.setAction(reqUserAction.getAction()); + mtUserAction.setUserId(reqUserAction.getUserId()); + mtUserAction.setMerchantId(reqUserAction.getMerchantId()); + mtUserAction.setStoreId(reqUserAction.getStoreId()); + mtUserAction.setParam(reqUserAction.getParam()); + mtUserAction.setOperator(reqUserAction.getOperator()); + mtUserAction.setDescription(reqUserAction.getDescription()); + mtUserAction.setStatus(StatusEnum.ENABLED.getKey()); + mtUserAction.setCreateTime(new Date()); + mtUserAction.setUpdateTime(new Date()); + mtUserActionMapper.insert(mtUserAction); + } + + return true; + } + + /** + * 根据ID获取信息 + * + * @param id + * @return + */ + @Override + public MtUserAction getUserActionDetail(Integer id) { + return mtUserActionMapper.selectById(id); + } + + /** + * 根据ID删除 + * + * @param id + * @param operator 操作人 + * @return + */ + @Override + public void deleteUserAction(Integer id, String operator) { + MtUserAction mtUserAction = this.getUserActionDetail(id); + if (mtUserAction == null) { + return; + } + mtUserAction.setStatus(StatusEnum.DISABLE.getKey()); + mtUserAction.setUpdateTime(new Date()); + mtUserActionMapper.updateById(mtUserAction); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/UserCouponServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/UserCouponServiceImpl.java new file mode 100644 index 0000000..ce92f6b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/UserCouponServiceImpl.java @@ -0,0 +1,766 @@ +package com.fuint.common.service.impl; + +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.fuint.common.Constants; +import com.fuint.common.config.Message; +import com.fuint.common.dto.CouponDto; +import com.fuint.common.dto.MyCouponDto; +import com.fuint.common.enums.*; +import com.fuint.common.param.CouponReceiveParam; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.DateUtil; +import com.fuint.common.util.SeqUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.mapper.MtUserCouponMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.*; + +/** + * 会员卡券业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class UserCouponServiceImpl extends ServiceImpl implements UserCouponService { + + private MtUserCouponMapper mtUserCouponMapper; + + /** + * 卡券服务接口 + * */ + private CouponService couponService; + + /** + * 卡券分组服务接口 + * */ + private CouponGroupService couponGroupService; + + /** + * 会员服务接口 + * */ + private MemberService memberService; + + /** + * 积分服务接口 + * */ + private PointService pointService; + + /** + * 卡券核销记录服务接口 + * */ + private ConfirmLogService confirmLogService; + + /** + * 店铺服务接口 + * */ + private StoreService storeService; + + /** + * 系统设置服务接口 + * */ + private SettingService settingService; + + /** + * 订单服务接口 + * */ + private OrderService orderService; + + /** + * 分页查询券列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryUserCouponListByPagination(PaginationRequest paginationRequest) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtUserCoupon::getStatus, StatusEnum.DISABLE.getKey()); + + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtUserCoupon::getStatus, status); + } + String userCouponId = paginationRequest.getSearchParams().get("userCouponId") == null ? "" : paginationRequest.getSearchParams().get("userCouponId").toString(); + if (StringUtils.isNotBlank(userCouponId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getId, userCouponId); + } + String userId = paginationRequest.getSearchParams().get("userId") == null ? "" : paginationRequest.getSearchParams().get("userId").toString(); + if (StringUtils.isNotBlank(userId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getUserId, userId); + } + String couponId = paginationRequest.getSearchParams().get("couponId") == null ? "" : paginationRequest.getSearchParams().get("couponId").toString(); + if (StringUtils.isNotBlank(couponId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getCouponId, couponId); + } + String code = paginationRequest.getSearchParams().get("code") == null ? "" : paginationRequest.getSearchParams().get("code").toString(); + if (StringUtils.isNotBlank(code)) { + lambdaQueryWrapper.eq(MtUserCoupon::getCode, code); + } + String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString(); + if (StringUtils.isNotBlank(mobile)) { + lambdaQueryWrapper.eq(MtUserCoupon::getMobile, mobile); + } + + lambdaQueryWrapper.orderByDesc(MtUserCoupon::getId); + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + List dataList = mtUserCouponMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtUserCoupon.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 领取卡券(优惠券、计次卡) + * + * @param receiveParam 领取参数 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean receiveCoupon(CouponReceiveParam receiveParam) throws BusinessCheckException { + Integer couponId = receiveParam.getCouponId() == null ? 0 : receiveParam.getCouponId(); + Integer userId = receiveParam.getUserId() == null ? 0 : receiveParam.getUserId(); + Integer num = receiveParam.getNum() == null ? 1 : receiveParam.getNum(); + String receiveCode = receiveParam.getReceiveCode() == null ? "" : receiveParam.getReceiveCode(); + Integer userCouponId = 0; + MtCoupon couponInfo = couponService.queryCouponById(couponId); + if (couponInfo == null) { + MtUserCoupon userCoupon = mtUserCouponMapper.findByCode(receiveCode); + if (userCoupon != null) { + if (userCoupon.getUserId() != null && userCoupon.getUserId() > 0) { + if (userCoupon.getUserId().compareTo(userId) == 0) { + throw new BusinessCheckException(Message.HAS_COUPON); + } else { + throw new BusinessCheckException(Message.CODE_ERROR); + } + } + couponInfo = couponService.queryCouponById(userCoupon.getCouponId()); + userCouponId = userCoupon.getId(); + } else { + throw new BusinessCheckException(Message.CODE_ERROR_1); + } + if (couponInfo == null) { + throw new BusinessCheckException(Message.COUPON_NOT_EXIST); + } + } + if (!couponInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) { + throw new BusinessCheckException(Message.COUPON_NOT_EXIST); + } + + MtCouponGroup groupInfo = couponGroupService.queryCouponGroupById(couponInfo.getGroupId()); + MtUser userInfo = memberService.queryMemberById(userId); + if (null == userInfo) { + throw new BusinessCheckException(Message.USER_NOT_EXIST); + } + + // 校验后台领取 + if (couponInfo.getSendWay().equals(SendWayEnum.BACKEND.getKey())) { + throw new BusinessCheckException(Message.SEND_WAY_ERROR); + } + + // 会员等级限制 + if (couponInfo.getGradeIds() != null && StringUtil.isNotEmpty(couponInfo.getGradeIds())) { + String gradeIds[] = couponInfo.getGradeIds().split(","); + if (gradeIds.length > 0) { + boolean isContains = Arrays.asList(gradeIds).contains(userInfo.getGradeId()+""); + if (!isContains) { + throw new BusinessCheckException(Message.GRADE_ERROR); + } + } + } + + // 是否需要领取码 + if (couponInfo.getReceiveCode() != null && StringUtil.isNotEmpty(couponInfo.getReceiveCode())) { + if (StringUtil.isEmpty(receiveCode)) { + throw new BusinessCheckException(Message.NEED_CODE); + } + // 线下发放的领取码 + if (couponInfo.getSendWay().equals(SendWayEnum.OFFLINE.getKey())) { + MtUserCoupon userCoupon = mtUserCouponMapper.findByCode(receiveCode); + if (userCoupon == null || !userCoupon.getCode().equals(receiveCode)) { + throw new BusinessCheckException(Message.CODE_ERROR_1); + } else { + userCouponId = userCoupon.getId(); + } + } + // 前台领取的领取码 + if (couponInfo.getSendWay().equals(SendWayEnum.FRONT.getKey()) && !receiveCode.equals(couponInfo.getReceiveCode())) { + throw new BusinessCheckException(Message.CODE_ERROR); + } + } + + // 是否已经领取 + List statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey(), UserCouponStatusEnum.USED.getKey(), UserCouponStatusEnum.EXPIRE.getKey()); + List userCouponData = mtUserCouponMapper.getUserCouponListByCouponId(userId, couponId, statusList); + if ((userCouponData.size() >= couponInfo.getLimitNum()) && (couponInfo.getLimitNum() > 0)) { + throw new BusinessCheckException(Message.MAX_COUPON_LIMIT); + } + + // 积分不足以领取 + if (couponInfo.getPoint() != null && couponInfo.getPoint() > 0) { + if (userInfo.getPoint() < couponInfo.getPoint()) { + throw new BusinessCheckException(Message.POINT_LIMIT); + } + } + + // 可领取多张 + String uuid = SeqUtil.getRandomNumber(16); + for (int i = 1; i <= num; i++) { + MtUserCoupon userCoupon = new MtUserCoupon(); + if (userCouponId > 0) { + userCoupon = mtUserCouponMapper.selectById(userCouponId); + } + userCoupon.setMerchantId(userInfo.getMerchantId()); + userCoupon.setStoreId(couponInfo.getStoreId()); + userCoupon.setCouponId(couponInfo.getId()); + userCoupon.setType(couponInfo.getType()); + if (couponInfo.getAmount() != null && couponInfo.getAmount().compareTo(new BigDecimal("0")) > 0) { + userCoupon.setAmount(couponInfo.getAmount()); + } + userCoupon.setGroupId(groupInfo.getId()); + userCoupon.setMobile(userInfo.getMobile()); + userCoupon.setUserId(userInfo.getId()); + userCoupon.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + userCoupon.setCreateTime(new Date()); + userCoupon.setUpdateTime(new Date()); + userCoupon.setExpireTime(couponInfo.getEndTime()); + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + Date expireTime = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(expireTime); + c.add(Calendar.DATE, couponInfo.getExpireTime()); + expireTime = c.getTime(); + userCoupon.setExpireTime(expireTime); + } + // 16位随机数核销码 + userCoupon.setCode(SeqUtil.getRandomNumber(16)); + userCoupon.setUuid(uuid); + if (userCoupon.getId() != null) { + mtUserCouponMapper.updateById(userCoupon); + } else { + mtUserCouponMapper.insert(userCoupon); + } + } + + // 是否需要扣除相应积分 + if (couponInfo.getPoint() != null && couponInfo.getPoint() > 0) { + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setUserId(userId); + reqPointDto.setAmount(-couponInfo.getPoint()); + reqPointDto.setDescription("领取"+ couponInfo.getName() + "扣除" +couponInfo.getPoint() +"积分"); + reqPointDto.setOperator(""); + pointService.addPoint(reqPointDto); + } + + return true; + } + + /** + * 储值卡券 + * + * @param paramMap 储值参数 + * @return + * */ + public boolean preStore(Map paramMap) throws BusinessCheckException { + Integer couponId = paramMap.get("couponId") == null ? 0 : Integer.parseInt(paramMap.get("couponId").toString()); + Integer userId = paramMap.get("userId") == null ? 0 : Integer.parseInt(paramMap.get("userId").toString()); + String param = paramMap.get("param") == null ? "" : paramMap.get("param").toString(); + Integer orderId = paramMap.get("orderId") == null ? 0 : Integer.parseInt(paramMap.get("orderId").toString()); + + if (StringUtil.isEmpty(param) || couponId <= 0 || userId <= 0) { + throw new BusinessCheckException(Message.PARAM_ERROR); + } + + MtCoupon couponInfo = couponService.queryCouponById(couponId); + if (couponInfo == null) { + throw new BusinessCheckException(Message.COUPON_NOT_EXIST); + } + + MtUser userInfo = memberService.queryMemberById(userId); + if (userInfo == null) { + throw new BusinessCheckException(Message.USER_NOT_EXIST); + } + + String[] paramArr = param.split(","); + + for (int i = 0; i < paramArr.length; i++) { + String item = paramArr[i]; + if (StringUtil.isNotEmpty(item)) { + String buyItem = paramArr[i]; // 100_200_1 + String[] buyItemArr = buyItem.split("_"); + if (StringUtil.isNotEmpty(buyItemArr[2])) { + Integer numInt = Integer.parseInt(buyItemArr[2]); + for (int j = 1; j <= numInt; j++) { + if (StringUtil.isNotEmpty(buyItemArr[1])) { + preStoreItem(couponInfo, userInfo, orderId, new BigDecimal(buyItemArr[1])); + } + } + } + } + } + + return true; + } + + /** + * 获取会员卡券列表 + * + * @param userId 会员ID + * @param status 状态 + * @return + * */ + @Override + public List getUserCouponList(Integer userId, List status) { + return mtUserCouponMapper.getUserCouponList(userId, status); + } + + /** + * 获取会员卡券列表 + * + * @param paramMap + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject getUserCouponList(Map paramMap) throws BusinessCheckException { + Integer pageNumber = paramMap.get("pageNumber") == null ? Constants.PAGE_NUMBER : Integer.parseInt(paramMap.get("pageNumber").toString()); + Integer pageSize = paramMap.get("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(paramMap.get("pageSize").toString()); + String userId = paramMap.get("userId") == null ? "" : paramMap.get("userId").toString(); + String userNo = paramMap.get("userNo") == null ? "" : paramMap.get("userNo").toString(); + String status = paramMap.get("status") == null ? "" : paramMap.get("status").toString(); + String type = paramMap.get("type") == null ? "": paramMap.get("type").toString(); + String mobile = paramMap.get("mobile") == null ? "" : paramMap.get("mobile").toString(); + String merchantId = paramMap.get("merchantId") == null ? "" : paramMap.get("merchantId").toString(); + String storeId = paramMap.get("storeId") == null ? "" : paramMap.get("storeId").toString(); + String couponId = paramMap.get("couponId") == null ? "" : paramMap.get("couponId").toString(); + String code = paramMap.get("code") == null ? "" : paramMap.get("code").toString(); + String id = paramMap.get("id") == null ? "" : paramMap.get("id").toString(); + + // 处理已失效 + if (pageNumber <= 1 && StringUtil.isNotBlank(userId)) { + List statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey()); + List data = mtUserCouponMapper.getUserCouponList(Integer.parseInt(userId), statusList); + for (MtUserCoupon uc : data) { + MtCoupon coupon = couponService.queryCouponById(uc.getCouponId()); + // 已过期 + if (coupon.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey()) && coupon.getEndTime() != null && coupon.getEndTime().before(new Date())) { + uc.setStatus(UserCouponStatusEnum.EXPIRE.getKey()); + uc.setUpdateTime(new Date()); + mtUserCouponMapper.updateById(uc); + } + // 已过期 + if (coupon.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey()) && uc.getExpireTime() != null && uc.getExpireTime().before(new Date())) { + uc.setStatus(UserCouponStatusEnum.EXPIRE.getKey()); + uc.setUpdateTime(new Date()); + mtUserCouponMapper.updateById(uc); + } + // 已删除 + if (coupon.getStatus().equals(StatusEnum.DISABLE.getKey())) { + uc.setStatus(UserCouponStatusEnum.DISABLE.getKey()); + uc.setUpdateTime(new Date()); + mtUserCouponMapper.updateById(uc); + } + } + } + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtUserCoupon::getStatus, StatusEnum.DISABLE.getKey()); + if (StringUtil.isNotBlank(mobile)) { + MtUser mtUser = memberService.queryMemberByMobile(Integer.parseInt(merchantId), mobile); + if (mtUser != null) { + userId = mtUser.getId().toString(); + } else { + lambdaQueryWrapper.eq(MtUserCoupon::getUserId, -1); + } + } + if (StringUtil.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtUserCoupon::getStatus, status); + } + if (StringUtil.isNotBlank(userId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getUserId, userId); + } + if (StringUtil.isNotBlank(userNo)) { + if (StringUtil.isBlank(merchantId)) { + merchantId = "0"; + } + MtUser userInfo = memberService.queryMemberByUserNo(Integer.parseInt(merchantId), userNo); + if (userInfo != null) { + lambdaQueryWrapper.eq(MtUserCoupon::getUserId, userInfo.getId()); + } else { + lambdaQueryWrapper.eq(MtUserCoupon::getUserId, -1); + } + } + if (StringUtil.isNotBlank(type)) { + lambdaQueryWrapper.eq(MtUserCoupon::getType, type); + } + if (StringUtil.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getMerchantId, merchantId); + } + if (StringUtil.isNotBlank(storeId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getStoreId, storeId); + } + if (StringUtil.isNotBlank(couponId)) { + lambdaQueryWrapper.eq(MtUserCoupon::getCouponId, couponId); + } + if (StringUtil.isNotBlank(code)) { + lambdaQueryWrapper.eq(MtUserCoupon::getCode, code); + } + if (StringUtil.isNotBlank(id)) { + lambdaQueryWrapper.eq(MtUserCoupon::getId, id); + } + + lambdaQueryWrapper.orderByDesc(MtUserCoupon::getId); + Page pageHelper = PageHelper.startPage(pageNumber, pageSize); + List userCouponList = mtUserCouponMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + if (userCouponList.size() > 0) { + for (MtUserCoupon userCouponDto : userCouponList) { + MtCoupon couponInfo = couponService.queryCouponById(userCouponDto.getCouponId()); + MtUser userInfo = memberService.queryMemberById(userCouponDto.getUserId()); + MtStore storeInfo = storeService.queryStoreById(userCouponDto.getStoreId()); + if (couponInfo == null) { + continue; + } + if (userInfo != null) { + userInfo.setMobile(CommonUtil.hidePhone(userInfo.getMobile())); + } + MyCouponDto dto = new MyCouponDto(); + dto.setId(userCouponDto.getId()); + dto.setName(couponInfo.getName()); + dto.setCode(userCouponDto.getCode()); + dto.setCouponId(couponInfo.getId()); + dto.setUseRule(couponInfo.getOutRule()); + String image = couponInfo.getImage(); + String baseImage = settingService.getUploadBasePath(); + dto.setImage(baseImage + image); + dto.setStatus(userCouponDto.getStatus()); + dto.setAmount(userCouponDto.getAmount()); + dto.setBalance(userCouponDto.getBalance()); + dto.setType(couponInfo.getType()); + dto.setContent(couponInfo.getContent()); + dto.setUsedTime(userCouponDto.getUsedTime()); + dto.setCreateTime(userCouponDto.getCreateTime()); + dto.setUserInfo(userInfo); + dto.setStoreInfo(storeInfo); + dto.setNum(0); + + // 次卡核销情况 + if (dto.getType().equals(CouponTypeEnum.TIMER.getKey())) { + if (StringUtil.isNotEmpty(couponInfo.getOutRule())) { + dto.setAmount(new BigDecimal(couponInfo.getOutRule())); + } + Long confirmCount = confirmLogService.getConfirmNum(dto.getId()); + dto.setBalance(new BigDecimal(confirmCount)); + } + + boolean canUse = couponService.isCouponEffective(couponInfo, userCouponDto); + if (!userCouponDto.getStatus().equals(UserCouponStatusEnum.UNUSED.getKey())) { + canUse = false; + } + dto.setCanUse(canUse); + + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) { + String effectiveDate = DateUtil.formatDate(couponInfo.getBeginTime(), "yyyy.MM.dd HH:mm") + "-" + DateUtil.formatDate(couponInfo.getEndTime(), "yyyy.MM.dd HH:mm"); + dto.setEffectiveDate(effectiveDate); + } + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + String effectiveDate = DateUtil.formatDate(userCouponDto.getCreateTime(), "yyyy.MM.dd HH:mm") + "-" + DateUtil.formatDate(userCouponDto.getExpireTime(), "yyyy.MM.dd HH:mm"); + dto.setEffectiveDate(effectiveDate); + } + + String tips = ""; + + // 优惠券tips + if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + if (StringUtil.isNotEmpty(couponInfo.getOutRule()) && Float.parseFloat(couponInfo.getOutRule()) > 0) { + tips = "满" + couponInfo.getOutRule() + "可用"; + } else { + tips = "无门槛券"; + } + } + + // 储值卡tips + if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + tips = "¥" + userCouponDto .getAmount() + ",余额¥" + userCouponDto.getBalance(); + } + + // 计次卡tips + if (couponInfo.getType().equals(CouponTypeEnum.TIMER.getKey())) { + Long confirmNum = confirmLogService.getConfirmNum(userCouponDto.getId()); + tips = "已使用"+ confirmNum +"次,可使用" + couponInfo.getOutRule() + "次"; + dto.setNum(Integer.parseInt(couponInfo.getOutRule()) - confirmNum.intValue()); + } + + dto.setTips(tips); + dataList.add(dto); + } + } + + PageRequest pageRequest = PageRequest.of(pageNumber, pageSize); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MyCouponDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + if (dataList.size() == 0) { + paginationResponse.setTotalPages(0); + paginationResponse.setTotalElements(0); + } + paginationResponse.setContent(dataList); + + return new ResponseObject(200, "查询成功", paginationResponse); + } + + /** + * 获取会员可支付使用的卡券 + * + * @param userId 会员ID + * @param storeId 使用门店 + * @param useFor 用途 + * @return + * */ + @Override + public List getPayAbleCouponList(Integer userId, Integer storeId, String useFor) throws BusinessCheckException { + List statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey()); + List userCouponList = mtUserCouponMapper.getUserCouponList(userId, statusList); + List dataList = new ArrayList<>(); + + if (userCouponList.size() > 0) { + for (MtUserCoupon userCoupon : userCouponList) { + MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId()); + // 适用门店 + if (storeId != null && storeId > 0 && StringUtil.isNotEmpty(couponInfo.getStoreIds())) { + String[] storeIds = couponInfo.getStoreIds().split(","); + if (!Arrays.asList(storeIds).contains(storeId.toString())) { + continue; + } + } + // 只取专用卡券 + if (StringUtil.isNotEmpty(useFor) && !couponInfo.getUseFor().equals(useFor)) { + continue; + } + // 不取专用卡券 + if (StringUtil.isEmpty(useFor) && couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) { + continue; + } + CouponDto couponDto = new CouponDto(); + couponDto.setId(couponInfo.getId()); + couponDto.setUserCouponId(userCoupon.getId()); + couponDto.setName(couponInfo.getName()); + couponDto.setAmount(userCoupon.getAmount()); + couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + boolean isEffective = couponService.isCouponEffective(couponInfo, userCoupon); + // 1.储值卡可用 + if (isEffective && couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) { + if (userCoupon.getBalance().compareTo(new BigDecimal("0")) > 0) { + couponDto.setType(CouponTypeEnum.PRESTORE.getValue()); + couponDto.setAmount(userCoupon.getBalance()); + dataList.add(couponDto); + } + } else if(isEffective && couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) { + // 2.无门槛的优惠券可用 + if (StringUtil.isEmpty(couponInfo.getOutRule()) || couponInfo.getOutRule().equals("0")) { + couponDto.setType(CouponTypeEnum.COUPON.getValue()); + dataList.add(couponDto); + } + } + } + } + + return dataList; + } + + /** + * 获取会员卡券详情 + * + * @param userId 会员ID + * @param couponId 卡券ID + * @return + * */ + @Override + public List getUserCouponDetail(Integer userId, Integer couponId) { + return mtUserCouponMapper.findUserCouponDetail(couponId, userId); + } + + /** + * 获取会员卡券详情 + * + * @param userCouponId 会员卡券ID + * @return + * */ + @Override + public MtUserCoupon getUserCouponDetail(Integer userCouponId) { + return mtUserCouponMapper.selectById(userCouponId); + } + + /** + * 根据过期时间查询会员卡券 + * + * @param userId 会员ID + * @param status 状态 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return + * */ + @Override + public List getUserCouponListByExpireTime(Integer userId, String status, String startTime, String endTime) { + return mtUserCouponMapper.getUserCouponListByExpireTime(userId, status, startTime, endTime); + } + + /** + * 会员发送卡券 + * + * @param orderId 订单ID + * @param couponId 卡券ID + * @param userId 会员ID + * @param mobile 手机号 + * @param num 购买数量 + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean buyCouponItem(Integer orderId, Integer couponId, Integer userId, String mobile, Double num) throws BusinessCheckException { + if (num == null || num <= 0) { + num = 1.0; + } + for (int j = 0; j < num; j++) { + MtCoupon couponInfo = couponService.queryCouponById(couponId); + MtUserCoupon userCoupon = new MtUserCoupon(); + userCoupon.setCouponId(couponId); + userCoupon.setMerchantId(couponInfo.getMerchantId()); + userCoupon.setStoreId(couponInfo.getStoreId()); + userCoupon.setType(couponInfo.getType()); + userCoupon.setGroupId(couponInfo.getGroupId()); + userCoupon.setMobile(mobile); + userCoupon.setUserId(userId); + userCoupon.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + userCoupon.setCreateTime(new Date()); + userCoupon.setUpdateTime(new Date()); + userCoupon.setExpireTime(couponInfo.getEndTime()); + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + Date expireTime = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(expireTime); + c.add(Calendar.DATE, couponInfo.getExpireTime()); + expireTime = c.getTime(); + userCoupon.setExpireTime(expireTime); + } + userCoupon.setOrderId(orderId); + + // 如果购买的是储值卡 + if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey()) && couponInfo.getInRule() != null) { + String[] paramArr = couponInfo.getInRule().split(","); // 100_200,300_500 + MtOrder orderInfo = orderService.getOrderInfo(orderId); + if (orderInfo != null) { + BigDecimal payAmount = orderInfo.getPayAmount(); + BigDecimal totalAmount = new BigDecimal(0); + if (paramArr.length > 0) { + for (int i = 0; i < paramArr.length; i++) { + String[] storeItem = paramArr[i].split("_"); + if (storeItem.length > 0) { + BigDecimal amount = new BigDecimal(paramArr[i].split("_")[0]); + if (payAmount.compareTo(amount) >= 0) { + totalAmount = new BigDecimal(paramArr[i].split("_")[1]); + payAmount = payAmount.subtract(amount); + } + } + } + } + couponInfo.setAmount(totalAmount); + } + } + + userCoupon.setAmount(couponInfo.getAmount()); + userCoupon.setBalance(couponInfo.getAmount()); + + // 16位随机数 + String code = SeqUtil.getRandomNumber(16); + userCoupon.setCode(code); + userCoupon.setUuid(code); + + mtUserCouponMapper.insert(userCoupon); + } + return true; + } + + /** + * 通过卡券ID删除会员卡券 + * + * @param couponId 卡券ID + * @return + * */ + public void removeUserCouponByCouponId(Integer couponId) { + if (couponId == null || couponId <= 0) { + return; + } + mtUserCouponMapper.removeUserCouponByCouponId(couponId); + } + + /** + * 预存单张 + * + * @param couponInfo 卡券信息 + * @param userInfo 会员信息 + * @return + * */ + private boolean preStoreItem(MtCoupon couponInfo, MtUser userInfo, Integer orderId, BigDecimal amount) { + MtUserCoupon userCoupon = new MtUserCoupon(); + userCoupon.setCouponId(couponInfo.getId()); + userCoupon.setType(couponInfo.getType()); + userCoupon.setGroupId(couponInfo.getGroupId()); + userCoupon.setMobile(userInfo.getMobile()); + userCoupon.setMerchantId(couponInfo.getMerchantId()); + userCoupon.setStoreId(couponInfo.getStoreId()); + userCoupon.setUserId(userInfo.getId()); + userCoupon.setStatus(UserCouponStatusEnum.UNUSED.getKey()); + userCoupon.setCreateTime(new Date()); + userCoupon.setUpdateTime(new Date()); + userCoupon.setExpireTime(couponInfo.getEndTime()); + if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) { + Date expireTime = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(expireTime); + c.add(Calendar.DATE, couponInfo.getExpireTime()); + expireTime = c.getTime(); + userCoupon.setExpireTime(expireTime); + } + + userCoupon.setOrderId(orderId); + userCoupon.setAmount(amount); + userCoupon.setBalance(amount); + + // 16位随机数 + String code = SeqUtil.getRandomNumber(16); + userCoupon.setCode(code); + userCoupon.setUuid(code); + + mtUserCouponMapper.insert(userCoupon); + return true; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/UserGradeServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/UserGradeServiceImpl.java new file mode 100644 index 0000000..cf05a14 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/UserGradeServiceImpl.java @@ -0,0 +1,264 @@ +package com.fuint.common.service.impl; + +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.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.UserGradeCatchTypeEnum; +import com.fuint.common.service.UserGradeService; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtStaffMapper; +import com.fuint.repository.mapper.MtUserGradeMapper; +import com.fuint.repository.model.MtBanner; +import com.fuint.repository.model.MtStaff; +import com.fuint.repository.model.MtUser; +import com.fuint.repository.model.MtUserGrade; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 会员等级业务接口实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class UserGradeServiceImpl extends ServiceImpl implements UserGradeService { + + private MtUserGradeMapper mtUserGradeMapper; + + private MtStaffMapper mtStaffMapper; + + /** + * 分页查询会员等级列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryUserGradeListByPagination(PaginationRequest paginationRequest) { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtUserGrade::getStatus, StatusEnum.DISABLE.getKey()); + + String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString(); + if (StringUtils.isNotBlank(name)) { + lambdaQueryWrapper.like(MtUserGrade::getName, name); + } + String catchType = paginationRequest.getSearchParams().get("catchType") == null ? "" : paginationRequest.getSearchParams().get("catchType").toString(); + if (StringUtils.isNotBlank(catchType)) { + lambdaQueryWrapper.like(MtUserGrade::getCatchType, catchType); + } + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtUserGrade::getStatus, status); + } + String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString(); + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtUserGrade::getMerchantId, merchantId); + } + + lambdaQueryWrapper.orderByDesc(MtUserGrade::getGrade); + List dataList = mtUserGradeMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtBanner.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + /** + * 添加会员等级信息 + * + * @param mtUserGrade 会员等级 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "新增会员等级") + public MtUserGrade addUserGrade(MtUserGrade mtUserGrade) throws BusinessCheckException { + if (mtUserGrade.getMerchantId() == null || mtUserGrade.getMerchantId() < 1) { + throw new BusinessCheckException("平台方帐号无法执行该操作,请使用商户帐号操作"); + } + if (mtUserGrade.getGrade() != null && (mtUserGrade.getGrade() <= 0)) { + throw new BusinessCheckException("会员等级需大于0"); + } + if (mtUserGrade.getDiscount() != null && (mtUserGrade.getDiscount() > 10 || mtUserGrade.getDiscount() < 0)) { + throw new BusinessCheckException("会员折扣需在0和10之间"); + } + mtUserGradeMapper.insert(mtUserGrade); + return mtUserGrade; + } + + /** + * 根据ID获取会员等级信息 + * + * @param merchantId 商户ID + * @param gradeId 会员等级ID + * @param userId 会员ID + * @return + */ + @Override + public MtUserGrade queryUserGradeById(Integer merchantId, Integer gradeId, Integer userId) { + if (userId != null && userId > 0) { + Map params = new HashMap<>(); + params.put("AUDITED_STATUS", StatusEnum.ENABLED.getKey()); + params.put("USER_ID", userId); + List staffList = mtStaffMapper.selectByMap(params); + // 如果是员工关联的会员,就返回默认的会员等级 + if (staffList != null && staffList.size() > 0) { + return getInitUserGrade(merchantId); + } + } + return mtUserGradeMapper.selectById(gradeId); + } + + /** + * 修改会员等级 + * + * @param mtUserGrade 会员等级 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "修改会员等级") + public MtUserGrade updateUserGrade(MtUserGrade mtUserGrade) throws BusinessCheckException { + if (mtUserGrade.getDiscount() != null && (mtUserGrade.getDiscount() > 10 || mtUserGrade.getDiscount() < 0)) { + throw new BusinessCheckException("会员折扣需在0和10之间"); + } + if (mtUserGrade.getGrade() != null && (mtUserGrade.getGrade() <= 0)) { + throw new BusinessCheckException("会员等级需大于0"); + } + MtUserGrade userGrade = mtUserGradeMapper.selectById(mtUserGrade.getId()); + if (null != userGrade) { + mtUserGrade.setMerchantId(userGrade.getMerchantId()); + mtUserGradeMapper.updateById(mtUserGrade); + } + return mtUserGrade; + } + + /** + * 根据ID删除会员等级 + * + * @param id ID + * @param operator 操作人 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "删除会员等级") + public Integer deleteUserGrade(Integer id, String operator) { + MtUserGrade mtUserGrade = queryUserGradeById(0, id, 0); + if (null == mtUserGrade) { + return 0; + } + mtUserGrade.setStatus(StatusEnum.DISABLE.getKey()); + mtUserGradeMapper.updateById(mtUserGrade); + return mtUserGrade.getId(); + } + + /** + * 获取默认的会员等级 + * + * @param merchantId 商户ID + * @return + */ + @Override + public MtUserGrade getInitUserGrade(Integer merchantId) { + Map param = new HashMap<>(); + param.put("status", StatusEnum.ENABLED.getKey()); + param.put("CATCH_TYPE", UserGradeCatchTypeEnum.INIT.getKey()); + param.put("MERCHANT_ID", merchantId); + + List dataList = mtUserGradeMapper.selectByMap(param); + MtUserGrade initGrade; + if (dataList != null && dataList.size() > 0) { + initGrade = dataList.get(0); + } else { + initGrade = new MtUserGrade(); + initGrade.setId(0); + initGrade.setStatus(StatusEnum.ENABLED.getKey()); + initGrade.setGrade(0); + initGrade.setMerchantId(0); + initGrade.setSpeedPoint(1f); + initGrade.setDiscount(0f); + } + return initGrade; + } + + /** + * 获取付费会员等级列表 + * + * @param merchantId 商户ID + * @param userInfo 会员信息 + * @return + * */ + @Override + public List getPayUserGradeList(Integer merchantId, MtUser userInfo) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtUserGrade::getStatus, StatusEnum.ENABLED.getKey()); + lambdaQueryWrapper.eq(MtUserGrade::getCatchType, UserGradeCatchTypeEnum.PAY.getKey()); + lambdaQueryWrapper.eq(MtUserGrade::getMerchantId, merchantId); + lambdaQueryWrapper.orderByAsc(MtUserGrade::getGrade); + + List userGrades = mtUserGradeMapper.selectList(lambdaQueryWrapper); + List dataList = new ArrayList<>(); + + Integer userGradeId = 0; + if (userInfo != null) { + if (userInfo.getGradeId() != null && userInfo.getGradeId() > 0) { + userGradeId = userInfo.getGradeId(); + } + } + + if (userGrades.size() > 0) { + MtUserGrade myGradeInfo = mtUserGradeMapper.selectById(userGradeId); + if (myGradeInfo != null) { + Integer myGrade = myGradeInfo.getGrade(); + for (MtUserGrade grade : userGrades) { + if (!myGrade.equals(grade.getGrade().toString()) && (grade.getGrade() > myGrade)) { + dataList.add(grade); + } + } + } else { + for (MtUserGrade grade : userGrades) { + dataList.add(grade); + } + } + } + + return dataList; + } + + /** + * 获取商户会员等级列表 + * + * @param merchantId 商户ID + * @param status 状态 + * @return + * */ + @Override + public List getMerchantGradeList(Integer merchantId, String status) { + return mtUserGradeMapper.getMerchantGradeList(merchantId, status); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/VerifyCodeServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/VerifyCodeServiceImpl.java new file mode 100644 index 0000000..c73c7a8 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/VerifyCodeServiceImpl.java @@ -0,0 +1,125 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.service.VerifyCodeService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.exception.BusinessRuntimeException; +import com.fuint.repository.mapper.MtVerifyCodeMapper; +import com.fuint.repository.model.MtVerifyCode; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * 验证码业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor(onConstructor_= {@Lazy}) +public class VerifyCodeServiceImpl extends ServiceImpl implements VerifyCodeService { + + private MtVerifyCodeMapper mtVerifyCodeMapper; + + /** + * 添加验证码 + * + * @param mobile + * @param verifyCode + * @throws BusinessCheckException + * @return + */ + public MtVerifyCode addVerifyCode(String mobile, String verifyCode, Integer expireSecond) { + if (null == expireSecond || expireSecond<0) { + expireSecond=0; + } + + MtVerifyCode reqVerifyCodeDto = new MtVerifyCode(); + reqVerifyCodeDto.setMobile(mobile); + reqVerifyCodeDto.setVerifyCode(verifyCode); + reqVerifyCodeDto.setValidFlag("0"); + + Date now = new Date(); + reqVerifyCodeDto.setAddTime(now); + + // 验证码过期时间5分钟 + Date expireTime = new Date(); + expireTime.setTime(expireTime.getTime()+5*60*1000); + reqVerifyCodeDto.setExpireTime(expireTime); + + // 发送验证码2分钟后才能继续发送,取最后一条 + List verifyCodeList = mtVerifyCodeMapper.queryVerifyCodeLastRecord(mobile); + if (null == verifyCodeList || verifyCodeList.size() == 0) { + // 没发过短信 + this.save(reqVerifyCodeDto); + return reqVerifyCodeDto; + } + MtVerifyCode verifyCodeLastRecord = verifyCodeList.get(0); + Long curInt = reqVerifyCodeDto.getAddTime().getTime(); //时间毫秒,长整型 + Long lastInt = verifyCodeLastRecord.getAddTime().getTime(); + Integer diffSecond = (int)((curInt-lastInt) / 1000); //间隔秒数 + if (diffSecond 0) { + MtMerchant mtMerchant = merchantService.queryMerchantById(merchantId); + if (mtMerchant != null && StringUtil.isNotEmpty(mtMerchant.getWxAppId()) && StringUtil.isNotEmpty(mtMerchant.getWxAppSecret())) { + wxAppId = mtMerchant.getWxAppId(); + wxAppSecret = mtMerchant.getWxAppSecret(); + tokenKey = tokenKey + merchantId; + } + } + + String wxTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; + String url = String.format(wxTokenUrl, wxAppId, wxAppSecret); + String token = ""; + + if (useCache) { + token = RedisUtil.get(tokenKey); + } + + if (token == null || StringUtil.isEmpty(token)) { + try { + String response = HttpRESTDataClient.requestGet(url); + JSONObject json = (JSONObject) JSONObject.parse(response); + if (!json.containsKey("errcode")) { + RedisUtil.set(tokenKey, json.get("access_token"), 7200); + token = (String) json.get("access_token"); + } else { + logger.error("获取微信accessToken出错:" + json.get("errmsg")); + } + } catch (Exception e) { + logger.error("获取微信accessToken异常:" + e.getMessage()); + } + } + + return token; + } + + /** + * 创建支付订单 + * + * @param userInfo 会员信息 + * @param orderInfo 订单信息 + * @param payAmount 支付金额 + * @param authCode 付款码 + * @param giveAmount 赠送金额 + * @param ip 支付IP + * @param platform 支付平台 + * @param isWechat 是否微信客户端 + * @throws BusinessCheckException + * @return + * */ + @Override + @Transactional(rollbackFor = Exception.class) + public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException { + logger.info("WeixinService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo); + + String goodsInfo = orderInfo.getOrderSn(); + if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) { + goodsInfo = OrderTypeEnum.PRESTORE.getValue(); + } + + // 1. 调用微信接口生成预支付订单 + Map reqData = new HashMap<>(); + reqData.put("body", goodsInfo); + reqData.put("out_trade_no", orderInfo.getOrderSn()); + reqData.put("device_info", ""); + reqData.put("fee_type", "CNY"); + reqData.put("total_fee", payAmount.toString()); + reqData.put("spbill_create_ip", ip); + if (orderInfo.getType() != null && orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) { + Map params = new HashMap<>(); + params.put("ORDER_ID", orderInfo.getId()); + params.put("STATUS", StatusEnum.ENABLED.getKey()); + List goodsList = mtOrderGoodsMapper.selectByMap(params); + if (goodsList != null && goodsList.size() > 0) { + Integer goodsId = goodsList.get(0).getGoodsId(); + if (goodsId != null && goodsId > 0) { + MtGoods mtGoods = mtGoodsMapper.selectById(goodsId); + if (mtGoods != null) { + reqData.put("description", mtGoods.getName()); + } + } + } + } + + // JSAPI支付 + if (orderInfo.getPayType().equals(PayTypeEnum.JSAPI.getKey())) { + reqData.put("trade_type", PayTypeEnum.JSAPI.getKey()); + reqData.put("openid", userInfo.getOpenId() == null ? "" : userInfo.getOpenId()); + } + + // 刷卡支付 + if (StringUtil.isNotEmpty(authCode)) { + reqData.put("auth_code", authCode); + } + + // 更新支付金额 + BigDecimal payAmount1 = new BigDecimal(payAmount).divide(new BigDecimal("100")); + OrderDto reqDto = new OrderDto(); + reqDto.setId(orderInfo.getId()); + reqDto.setPayAmount(payAmount1); + reqDto.setPayType(orderInfo.getPayType()); + reqDto.setOrderSn(orderInfo.getOrderSn()); + orderService.updateOrder(reqDto); + + Map respData; + if (reqData.get("auth_code") != null && StringUtil.isNotEmpty(reqData.get("auth_code"))) { + respData = microPay(orderInfo.getStoreId(), reqData, ip, platform); + } else { + if (platform.equals(PlatformTypeEnum.H5.getCode()) && isWechat.equals(YesOrNoEnum.NO.getKey())) { + respData = wapPay(orderInfo.getStoreId(), reqData, ip, platform); + } else { + respData = jsapiPay(orderInfo.getStoreId(), reqData, ip, platform); + } + } + logger.info("微信支付接口调用返回:{}", JsonUtil.toJSONString(respData)); + + if (respData == null || respData.get("return_code").equals("FAIL")) { + logger.error("微信支付接口调用异常......"); + return new ResponseObject(3000, "微信支付接口调用异常", null); + } + + // 2.更新预支付订单号 + if (respData.get("result_code").equals("SUCCESS")) { + if (respData.get("trade_type").equals(PayTypeEnum.JSAPI.getKey())) { + String prepayId = respData.get("prepay_id"); + getApiConfig(orderInfo.getStoreId(), platform); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + respData = WxPayKit.miniAppPrepayIdCreateSign(wxPayApiConfig.getAppId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.MD5); + String jsonStr = JSON.toJSONString(respData); + logger.info("小程序支付的参数:" + jsonStr); + } + } else { + logger.error("微信支付接口返回状态失败......" + respData.toString() + "...reason"); + return new ResponseObject(3000, "微信支付失败:" + (respData.get("err_code_des") != null ? respData.get("err_code_des") : "未知错误"), null); + } + + ResponseObject responseObject = new ResponseObject(200, "微信支付接口返回成功", respData); + logger.info("WXService createPrepayOrder outParams {}", responseObject.toString()); + + return responseObject; + } + + /** + * 处理支付回调 + * + * @param request 请求参数 + * @return + * */ + public Map processResXml(HttpServletRequest request) { + try { + String xmlMsg = HttpKit.readData(request); + Map result = WxPayKit.xmlToMap(xmlMsg); + String returnCode = result.get("return_code"); + String orderSn = result.get("out_trade_no"); + logger.info("支付通知,xml = {}, orderSn = {}", xmlMsg, orderSn); + + Integer storeId = 0; + String platform = PlatformTypeEnum.MP_WEIXIN.getCode(); + if (StringUtil.isNotEmpty(orderSn)) { + MtOrder mtOrder = orderService.getOrderInfoByOrderSn(orderSn); + if (mtOrder != null) { + storeId = mtOrder.getStoreId(); + platform = mtOrder.getPlatform(); + } + } + + getApiConfig(storeId, platform); + if (WxPayKit.verifyNotify(result, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.MD5)) { + if (WxPayKit.codeIsOk(returnCode)) { + return result; + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * 处理回调xml + * + * @param response 响应参数 + * @param flag 标记 + * @return + * */ + public void processRespXml(HttpServletResponse response, boolean flag){ + Map respData = new HashMap<>(); + if (flag) { + respData.put("return_code", "SUCCESS"); + respData.put("return_msg", "OK"); + }else{ + respData.put("return_code", "FAIL"); + respData.put("return_msg", "FAIL"); + } + OutputStream outputStream = null; + try { + String respXml = WxPayKit.toXml(respData); + outputStream = response.getOutputStream(); + outputStream.write(respXml.getBytes("UTF-8")); + outputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if(outputStream!=null){ + try { + outputStream.close(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + } + } + + /** + * 获取微信个人信息 + * + * @param merchantId 商户ID + * @param code 微信返回编码 + * @throws BusinessCheckException + * @return + * */ + @Override + public JSONObject getWxProfile(Integer merchantId, String code) throws BusinessCheckException { + String wxAppId = env.getProperty("wxpay.appId"); + String wxAppSecret = env.getProperty("wxpay.appSecret"); + + if (merchantId != null && merchantId > 0) { + MtMerchant mtMerchant = merchantService.queryMerchantById(merchantId); + if (mtMerchant != null && StringUtil.isNotEmpty(mtMerchant.getWxAppId()) && StringUtil.isNotEmpty(mtMerchant.getWxAppSecret())) { + wxAppId = mtMerchant.getWxAppId(); + wxAppSecret = mtMerchant.getWxAppSecret(); + } + } + + String wxAccessUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"; + String url = String.format(wxAccessUrl, wxAppId, wxAppSecret, code); + try { + String response = HttpRESTDataClient.requestGet(url); + JSONObject json = (JSONObject) JSONObject.parse(response); + if (!json.containsKey("errcode")) { + return json; + } else { + logger.error("获取微信getWxProfile出错:code = " + json.containsKey("errcode") + ",msg="+ json.get("errmsg")); + } + } catch (Exception e) { + logger.error("获取微信getWxProfile异常:" + e.getMessage()); + } + + return null; + } + + /** + * 获取公众号openId + * + * @param merchantId 商户ID + * @param code 微信返回编码 + * @throws BusinessCheckException + * @return + * */ + @Override + public JSONObject getWxOpenId(Integer merchantId, String code) throws BusinessCheckException { + String wxAppId = env.getProperty("weixin.official.appId"); + String wxAppSecret = env.getProperty("weixin.official.appSecret"); + + if (merchantId != null && merchantId > 0) { + MtMerchant mtMerchant = merchantService.queryMerchantById(merchantId); + if (mtMerchant != null && StringUtil.isNotEmpty(mtMerchant.getWxOfficialAppId()) && StringUtil.isNotEmpty(mtMerchant.getWxOfficialAppSecret())) { + wxAppId = mtMerchant.getWxOfficialAppId(); + wxAppSecret = mtMerchant.getWxOfficialAppSecret(); + } + } + + String wxAccessUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; + String url = String.format(wxAccessUrl, wxAppId, wxAppSecret, code); + try { + String response = HttpRESTDataClient.requestGet(url); + JSONObject json = (JSONObject) JSONObject.parse(response); + if (!json.containsKey("errcode")) { + return json; + } else { + logger.error("获取openId出错:code = " + json.containsKey("errcode") + ",msg="+ json.get("errmsg")); + } + } catch (Exception e) { + logger.error("获取微信openId异常:" + e.getMessage()); + } + + return null; + } + + /** + * 获取微信绑定手机号 + * + * @param encryptedData 微信返回加密字符串 + * @param sessionKey session键值 + * @param iv 微信IV + * @return + * */ + @Override + public String getPhoneNumber(String encryptedData, String sessionKey, String iv) { + // 被加密的数据 + byte[] dataByte = Base64.getDecoder().decode(encryptedData); + // 加密秘钥 + byte[] keyByte = Base64.getDecoder().decode(sessionKey); + // 偏移量 + byte[] ivByte = Base64.getDecoder().decode(iv); + try { + // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 + int base = 16; + if (keyByte.length % base != 0) { + int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); + byte[] temp = new byte[groups * base]; + Arrays.fill(temp, (byte) 0); + System.arraycopy(keyByte, 0, temp, 0, keyByte.length); + keyByte = temp; + } + // 初始化 + Security.addProvider(new BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); + AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); + parameters.init(new IvParameterSpec(ivByte)); + cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 + byte[] resultByte = cipher.doFinal(dataByte); + if (null != resultByte && resultByte.length > 0) { + String result = new String(resultByte, "UTF-8"); + JSONObject object = JSONObject.parseObject(result); + return object.getString("phoneNumber"); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 发送小程序订阅消息 + * + * @param merchantId 商户ID + * @param userId 会员ID + * @param toUserOpenId 接受者openId + * @param key 消息key + * @param page 跳转页面 + * @param params 发送参数 + * @param sendTime 发送时间 + * @throws BusinessCheckException + * @return + * */ + @Override + public Boolean sendSubscribeMessage(Integer merchantId, Integer userId, String toUserOpenId, String key, String page, Map params, Date sendTime) throws BusinessCheckException { + if (StringUtil.isEmpty(toUserOpenId) || StringUtil.isEmpty(key) || userId < 1) { + return false; + } + + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.SUB_MESSAGE.getKey(), key); + if (mtSetting == null) { + return false; + } + + JSONObject jsonObject = null; + String templateId = ""; + JSONArray paramArray = null; + try { + if (mtSetting != null && mtSetting.getValue().indexOf('}') > 0) { + jsonObject = JSONObject.parseObject(mtSetting.getValue()); + } + if (jsonObject != null) { + templateId = jsonObject.get("templateId").toString(); + paramArray = (JSONArray) JSONObject.parse(jsonObject.get("params").toString()); + } + } catch (Exception e) { + logger.info("WeixinService sendSubscribeMessage parse setting error={}", mtSetting); + } + + if (StringUtil.isEmpty(templateId) || paramArray.size() < 1) { + logger.info("WeixinService sendSubscribeMessage setting error={}", mtSetting); + return false; + } + + JSONObject jsonData = new JSONObject(); + jsonData.put("touser", toUserOpenId); // 接收者的openid + jsonData.put("template_id", templateId); + + if (StringUtil.isEmpty(page)) { + page = "pages/index/index"; + } + jsonData.put("page", page); + + // 组装参数 + JSONObject data = new JSONObject(); + for (int i = 0; i < paramArray.size(); i++) { + JSONObject para = paramArray.getJSONObject(i); + String value = para.get("value").toString().replaceAll("\\{", "").replaceAll(".DATA}}", ""); + String paraKey = para.get("key").toString(); + String paraValue = params.get(paraKey).toString(); + JSONObject arg = new JSONObject(); + arg.put("value", paraValue); + data.put(value, arg); + } + jsonData.put("data", data); + + String reqDataJsonStr = JSON.toJSONString(jsonData); + + // 存储到消息表里,后续通过定时任务发送 + MtMessage mtMessage = new MtMessage(); + mtMessage.setMerchantId(merchantId); + mtMessage.setUserId(userId); + mtMessage.setType(MessageEnum.SUB_MSG.getKey()); + mtMessage.setTitle(WxMessageEnum.getValue(key)); + mtMessage.setContent(WxMessageEnum.getValue(key)); + mtMessage.setIsRead(YesOrNoEnum.NO.getKey()); + mtMessage.setIsSend(YesOrNoEnum.NO.getKey()); + mtMessage.setSendTime(sendTime); + mtMessage.setStatus(StatusEnum.ENABLED.getKey()); + mtMessage.setParams(reqDataJsonStr); + messageService.addMessage(mtMessage); + + return true; + } + + /** + * 发送订阅消息 + * + * @param merchantId 商户ID + * @param reqDataJsonStr 请求参数 + * @return + * */ + @Override + public Boolean doSendSubscribeMessage(Integer merchantId, String reqDataJsonStr) { + try { + String token = getAccessToken(merchantId, true,true); + if (StringUtil.isEmpty(token)) { + return false; + } + String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token; + String response = HttpRESTDataClient.requestPost(url, "application/json; charset=utf-8", reqDataJsonStr); + logger.info("WeixinService sendSubscribeMessage response={}", response); + JSONObject json = (JSONObject) JSONObject.parse(response); + if (json.get("errcode").toString().equals("40001")) { + getAccessToken(merchantId, true,true); + logger.error("发送订阅消息出错error1:" + json.get("errcode").toString()); + return false; + } else if (!json.get("errcode").toString().equals("0")) { + logger.error("发送订阅消息出错error2:" + json.get("errcode").toString()); + return false; + } else { + return true; + } + } catch (Exception e) { + logger.error("发送订阅消息出错:" + e.getMessage()); + } + + return true; + } + + /** + * 查询支付订单 + * + * @param storeId 店铺ID + * @param transactionId 支付流水ID + * @param orderSn 订单号 + * @return + * */ + @Override + public Map queryPaidOrder(Integer storeId, String transactionId, String orderSn) { + try { + MtOrder mtOrder = orderService.getOrderInfoByOrderSn(orderSn); + String platform = PlatformTypeEnum.MP_WEIXIN.getCode(); + if (mtOrder != null) { + platform = mtOrder.getPlatform(); + } + getApiConfig(storeId, platform); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + Map params = OrderQueryModel.builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .transaction_id(transactionId) + .out_trade_no(orderSn) + .nonce_str(WxPayKit.generateStr()) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); + logger.info("请求参数:{}", WxPayKit.toXml(params)); + String query = WxPayApi.orderQuery(params); + Map result = WxPayKit.xmlToMap(query); + logger.info("查询结果: {}", result); + if (result.get("result_code").equals("FAIL")) { + result.put("trade_state", "FAIL"); + } + return result; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 发起售后 + * + * @param storeId 店铺ID + * @param orderSn 订单号 + * @param totalAmount 支付总金额 + * @param refundAmount 退款金额 + * @param platform 支付平台 + * @throws BusinessCheckException + * @return + * */ + @Override + public Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException { + try { + logger.info("WeixinService.doRefund orderSn = {}, totalFee = {}, refundFee = {}", orderSn, totalAmount, refundAmount); + if (StringUtil.isEmpty(orderSn)) { + throw new BusinessCheckException("退款订单号不能为空..."); + } + + BigDecimal totalFee = totalAmount.multiply(new BigDecimal("100")); + BigDecimal refundFee = refundAmount.multiply(new BigDecimal("100")); + Integer totalFeeInt = totalFee.intValue(); + Integer refundFeeInt = refundFee.intValue(); + if (refundFee.compareTo(totalFee) > 0) { + throw new BusinessCheckException("退款金额不能大于总金额"); + } + + // 支付配置 + getApiConfig(storeId, platform); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + Map params = RefundModel.builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .nonce_str(WxPayKit.generateStr()) + .transaction_id("") + .out_trade_no(orderSn) + .out_refund_no(orderSn) + .total_fee(totalFeeInt.toString()) + .refund_fee(refundFeeInt.toString()) + .notify_url(wxPayApiConfig.getDomain() + REFUND_NOTIFY_URL) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); + logger.info("WeixinService doRefund params: {}", params); + String refundStr = WxPayApi.orderRefundByProtocol(false, params, wxPayApiConfig.getCertPath(), wxPayApiConfig.getMchId(), ""); + logger.info("WeixinService doRefund return: {}", refundStr); + Map result = WxPayKit.xmlToMap(refundStr); + String returnCode = result.get("return_code"); + String returnMsg = result.get("return_msg"); + if (!WxPayKit.codeIsOk(returnCode)) { + logger.error(returnMsg); + return false; + } + return true; + } catch (Exception e) { + throw new BusinessCheckException("WeixinService.doRefund 微信退款失败:" + e.getMessage()); + } + } + + /*** + * 生成二维码 + * + * @param merchantId 商户ID + * @param type 类型 + * @param id 数据ID + * @param page 页面 + * @param width 宽度 + * @return + * */ + @Override + public String createQrCode(Integer merchantId, String type, Integer id, String page, Integer width) throws BusinessCheckException { + try { + String accessToken = getAccessToken(merchantId, true,true); + if (StringUtil.isEmpty(accessToken)) { + throw new BusinessCheckException("生成二维码出错,请检查小程序配置"); + } + + String url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + accessToken; + String reqDataJsonStr = ""; + + Map reqData = new HashMap<>(); + reqData.put("access_token", accessToken); + reqData.put("path", page); + reqData.put("width", width); + reqDataJsonStr = JsonUtil.toJSONString(reqData); + + JSONObject jsonParam = new JSONObject(); + jsonParam.put("path", page); + jsonParam.put("width", width); + + InputStream inputStream = HttpRESTDataClient.doWXPost(url, jsonParam); + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int n; + while (-1 != (n = inputStream.read(buffer))) { + output.write(buffer, 0, n); + } + byte[] bytes = output.toByteArray(); + String resStr = output.toString(); + logger.info("WechatService createStoreQrCode reqData:{},resStr:{}", reqDataJsonStr, resStr); + try { + JSONObject res = JSON.parseObject(resStr); + String errCode = res.get("errcode").toString(); + if (errCode.equals("40001")) { + getAccessToken(merchantId, true, false); + } + } catch (Exception e) { + String pathRoot = env.getProperty("images.root"); + String baseImage = env.getProperty("images.path"); + + String filePath = "Qr" + type + id + ".png"; + String path = pathRoot + baseImage + filePath; + QRCodeUtil.saveQrCodeToLocal(bytes, path); + + // 上传阿里云oss + String mode = env.getProperty("aliyun.oss.mode"); + if (mode.equals("1")) { // 检查是否开启上传 + String endpoint = env.getProperty("aliyun.oss.endpoint"); + String accessKeyId = env.getProperty("aliyun.oss.accessKeyId"); + String accessKeySecret = env.getProperty("aliyun.oss.accessKeySecret"); + String bucketName = env.getProperty("aliyun.oss.bucketName"); + String folder = env.getProperty("aliyun.oss.folder"); + OSS ossClient = AliyunOssUtil.getOSSClient(accessKeyId, accessKeySecret, endpoint); + File ossFile = new File(path); + return AliyunOssUtil.upload(ossClient, ossFile, bucketName, folder); + } else { + return baseImage + filePath; + } + } + } catch (Exception e) { + logger.error("生成店铺二维码出错啦:{}", e.getMessage()); + throw new BusinessCheckException("生成二维码出错,请检查小程序配置."); + } + + throw new BusinessCheckException("生成二维码出错,请稍后再试."); + } + + /** + * 开通微信卡券 + * + * @param merchantId 商户ID + * @param wxCardId 微信会员卡ID + * @return + * */ + @Override + public String createWxCard(Integer merchantId, String wxCardId) throws BusinessCheckException { + String cardId = ""; + try { + MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.USER.getKey(), UserSettingEnum.WX_MEMBER_CARD.getKey()); + if (mtSetting == null) { + return cardId; + } + WxCardDto wxCardDto = JsonUtil.parseObject(mtSetting.getValue(), WxCardDto.class); + + String accessToken = getAccessToken(merchantId, false,true); + String createUrl = "https://api.weixin.qq.com/card/create?access_token=" + accessToken; + String updateUrl = "https://api.weixin.qq.com/card/update?access_token=" + accessToken; + + Map params = new HashMap<>(); + Map card = new HashMap<>(); + if (StringUtil.isEmpty(wxCardId)) { + card.put("card_type", "MEMBER_CARD"); + } + Map memberCard = new HashMap<>(); + String baseImage = settingService.getUploadBasePath(); + if (StringUtil.isNotEmpty(wxCardDto.getBackgroundUrl())) { + // memberCard.put("background_pic_url", baseImage + wxCardDto.getBackgroundUrl()); + } + + // baseInfo + Map baseInfo = new HashMap<>(); + if (StringUtil.isNotEmpty(wxCardDto.getLogoUrl())) { + baseInfo.put("logo_url", baseImage + wxCardDto.getLogoUrl()); + } + if (StringUtil.isEmpty(wxCardId)) { + baseInfo.put("brand_name", wxCardDto.getBrandName()); + } + baseInfo.put("code_type", "CODE_TYPE_TEXT"); + baseInfo.put("title", wxCardDto.getTitle()); + baseInfo.put("color", wxCardDto.getColor()); + baseInfo.put("notice", wxCardDto.getNotice()); + if (StringUtil.isNotEmpty(wxCardDto.getServicePhone())) { + baseInfo.put("service_phone", wxCardDto.getServicePhone()); + } + baseInfo.put("description", wxCardDto.getDescription()); + Map dateInfo = new HashMap<>(); + dateInfo.put("type", "DATE_TYPE_PERMANENT"); + if (StringUtil.isEmpty(wxCardId)) { + baseInfo.put("date_info", dateInfo); + } + Map sku = new HashMap<>(); + sku.put("quantity", Constants.ALL_ROWS); + if (StringUtil.isEmpty(wxCardId)) { + baseInfo.put("sku", sku); + baseInfo.put("get_limit", 1); + } + if (StringUtil.isEmpty(wxCardId)) { + baseInfo.put("use_custom_code", false); + baseInfo.put("bind_openid", false); + } + baseInfo.put("can_give_friend", false); + if (StringUtil.isEmpty(wxCardId)) { + baseInfo.put("location_id_list", null); + } + if (StringUtil.isNotEmpty(wxCardDto.getCustomUrlName())) { + baseInfo.put("custom_url_name", wxCardDto.getCustomUrlName()); + } + if (StringUtil.isNotEmpty(wxCardDto.getCustomUrl())) { + baseInfo.put("custom_url", wxCardDto.getCustomUrl()); + } + if (StringUtil.isNotEmpty(wxCardDto.getCustomUrlSubTitle())) { + baseInfo.put("custom_url_sub_title", wxCardDto.getCustomUrlSubTitle()); + } + baseInfo.put("need_push_on_view", true); + memberCard.put("base_info", baseInfo); + + // 特权说明 + if (StringUtil.isNotEmpty(wxCardDto.getPrerogative())) { + memberCard.put("prerogative", wxCardDto.getPrerogative()); + } + // 自动激活 + memberCard.put("auto_activate", true); + memberCard.put("supply_bonus", wxCardDto.getSupplyBonus()); + if (StringUtil.isNotEmpty(wxCardDto.getBonusUrl())) { + memberCard.put("bonus_url", wxCardDto.getBonusUrl()); + } + if (StringUtil.isEmpty(wxCardId)) { + memberCard.put("supply_balance", wxCardDto.getSupplyBalance()); + } + if (StringUtil.isNotEmpty(wxCardDto.getBalanceUrl())) { + memberCard.put("balance_url", wxCardDto.getBalanceUrl()); + } + card.put("member_card", memberCard); + if (StringUtil.isEmpty(wxCardId)) { + params.put("card", card); + } else { + card.put("card_id", wxCardId); + params = card; + } + + ObjectMapper mapper = new ObjectMapper(); + String reqDataJson = mapper.writeValueAsString(params); + String url = createUrl; + if (StringUtil.isNotEmpty(wxCardId)) { + url = updateUrl; + } + logger.info("开通微信卡券接口url:{},请求参数:{}", url, reqDataJson); + String response = HttpRESTDataClient.requestPost(url, "application/json; charset=utf-8", reqDataJson); + logger.info("开通微信卡券接口返回:{}", response); + JSONObject data = (JSONObject) JSONObject.parse(response); + if (data.get("errcode").toString().equals("0")) { + if (StringUtil.isEmpty(wxCardId)) { + cardId = data.get("card_id").toString(); + } else { + cardId = wxCardId; + } + } else { + // token失效,刷新token + if (data.get("errcode").toString().equals("40014")) { + getAccessToken(merchantId, false,false); + } + logger.error("开通微信卡券出错啦{}", data.get("errmsg").toString()); + throw new BusinessCheckException("开通微信卡券出错啦:" + data.get("errmsg").toString()); + } + } catch (Exception e) { + logger.error("开通微信卡券出错啦:{}", e.getMessage()); + throw new BusinessCheckException("开通微信卡券出错啦:" + e.getMessage()); + } + + return cardId; + } + + /** + * 创建微信卡券领取的二维码 + * + * @param merchantId 商户ID + * @param cardId 微信卡券ID + * @param code 会员卡编码 + * @return + * */ + @Override + public String createCardQrCode(Integer merchantId, String cardId, String code) { + try { + String accessToken = getAccessToken(merchantId, false, true); + String url = "https://api.weixin.qq.com/card/qrcode/create?access_token="+accessToken; + + Map param = new HashMap<>(); + Map actionInfo = new HashMap<>(); + Map card = new HashMap<>(); + card.put("card_id", cardId); + card.put("code", code); + card.put("is_unique_code", false); + card.put("outer_str", "12b"); + actionInfo.put("card", card); + param.put("action_name", "QR_CARD"); + param.put("action_info", actionInfo); + + String reqDataJsonStr = JsonUtil.toJSONString(param); + String response = HttpRESTDataClient.requestPostBody(url, reqDataJsonStr); + logger.info("微信卡券createCardQrCode接口返回:{}", response); + JSONObject data = (JSONObject) JSONObject.parse(response); + String qrCode = ""; + if (data.get("errcode").toString().equals("0")) { + String content = data.get("url").toString(); + try { + // 生成并输出二维码 + ByteArrayOutputStream out = new ByteArrayOutputStream(); + com.fuint.common.util.QRCodeUtil.createQrCode(out, content, 800, 800, "png", ""); + // 对数据进行Base64编码 + qrCode = new String(Base64Util.baseEncode(out.toByteArray()), "UTF-8"); + return "data:image/jpg;base64," + qrCode; + } catch (Exception e) { + logger.error("生成并输出二维码出错:{}", e.getMessage()); + } + } + } catch (Exception e) { + logger.error("创建微信卡券领取二维码出错:{}", e.getMessage()); + return ""; + } + return ""; + } + + /** + * 是否已领取卡券 + * + * @param merchantId 商户ID + * @param cardId 微信卡券ID + * @param openId openId + * @return + * */ + @Override + public Boolean isOpenCard(Integer merchantId, String cardId, String openId) { + try { + String accessToken = getAccessToken(merchantId, false,true); + String url = "https://api.weixin.qq.com/card/user/getcardlist?access_token="+accessToken; + + Map param = new HashMap<>(); + param.put("openid", openId); + param.put("card_id", cardId); + + String reqDataJsonStr = JsonUtil.toJSONString(param); + String response = HttpRESTDataClient.requestPostBody(url, reqDataJsonStr); + logger.info("微信卡券getCardList接口返回:{}", response); + JSONObject data = (JSONObject) JSONObject.parse(response); + if (data.get("errcode").toString().equals("0")) { + Object cards = data.get("card_list"); + logger.info("微信卡券getCardList接口card_list:{}", cards.toString()); + if (cards != null && cards.toString().length() > 6) { + return true; + } + return false; + } + } catch (Exception e) { + logger.error("微信卡券getCardList接口出错:{}", e.getMessage()); + return true; + } + return true; + } + + /** + * 生成小程序链接 + * + * @param merchantId 商户ID + * @param path 页面路径 + * @return + * */ + @Override + public String createMiniAppLink(Integer merchantId, String path) { + String link = ""; + try { + String accessToken = getAccessToken(merchantId, true,true); + if (StringUtil.isEmpty(accessToken)) { + return ""; + } + String url = "https://api.weixin.qq.com/wxa/genwxashortlink?access_token=" + accessToken +"&"; + + Map param = new HashMap<>(); + param.put("page_url", path); + + String reqDataJsonStr = JsonUtil.toJSONString(param); + String response = HttpRESTDataClient.requestPostBody(url, reqDataJsonStr); + logger.info("微信生成链接接口返回:{}", response); + JSONObject data = (JSONObject) JSONObject.parse(response); + + if (data.get("errcode").toString().equals("0")) { + Object linkObject = data.get("link"); + if (linkObject != null && StringUtil.isNotEmpty(linkObject.toString())) { + link = linkObject.toString(); + } + } + } catch (Exception e) { + logger.error("微信生成链接接口出错:{}", e.getMessage()); + return ""; + } + + return link; + } + + /** + * 上传小程序发货信息 + * + * @param orderSn 订单号 + * @return + */ + @Override + public void uploadShippingInfo(String orderSn) throws BusinessCheckException { + UserOrderDto orderInfo = orderService.getOrderByOrderSn(orderSn); + if (orderInfo == null) { + return; + } + if (orderInfo.getExpressInfo() == null || StringUtil.isEmpty(orderInfo.getExpressInfo().getExpressNo())) { + throw new BusinessCheckException("上传发货信息失败,物流信息不能为空!"); + } + if (orderInfo.getUserInfo() == null || StringUtil.isEmpty(orderInfo.getUserInfo().getOpenId())) { + throw new BusinessCheckException("上传发货信息失败,会员的openId不能为空!"); + } + // 是否是微信小程序订单 && 微信支付 + if (orderInfo != null && orderInfo.getPlatform().equals(PlatformTypeEnum.MP_WEIXIN.getCode()) || orderInfo.getPayType().equals(PayTypeEnum.JSAPI.name())) { + String url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + getAccessToken(orderInfo.getMerchantId(), true, true); + + // 获取微信支付配置 + getApiConfig(orderInfo.getStoreId(), orderInfo.getPlatform()); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + + // 组织上传参数 + ShippingInfo shippingInfo = new ShippingInfo(); + + // 1、订单参数 + OrderKeyBean orderKeyBean = new OrderKeyBean(); + orderKeyBean.setOrderNumberType(1); + orderKeyBean.setMchId(wxPayApiConfig.getMchId()); + orderKeyBean.setOutTradeNo(orderSn); + shippingInfo.setOrderKey(orderKeyBean); + + // 2、物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 + shippingInfo.setLogisticsType(1); + + // 3、发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY + shippingInfo.setDeliveryMode(1); + + // 4、物流信息列表,发货物流单列表,支持统一发货(单个物流单)和分拆发货(多个物流单)两种模式 + List shippingList = new ArrayList<>(); + ShippingListBean shippingListBean = new ShippingListBean(); + shippingListBean.setTrackingNo(orderInfo.getExpressInfo().getExpressNo()); + shippingListBean.setExpressCompany(orderInfo.getExpressInfo().getExpressCode()); + ContactBean contact = new ContactBean(); + contact.setConsignorContact(orderInfo.getStoreInfo().getPhone()); + contact.setReceiverContact(orderInfo.getAddress().getMobile()); + shippingListBean.setContact(contact); + + shippingList.add(shippingListBean); + shippingInfo.setShippingList(shippingList); + + // 5、支付者信息 + PayerBean payerBean = new PayerBean(); + payerBean.setOpenid(orderInfo.getUserInfo().getOpenId()); + shippingInfo.setPayer(payerBean); + + try { + String reqJson = JsonUtil.toJSONString(shippingInfo); + String response = HttpRESTDataClient.requestPostBody(url, reqJson); + logger.info("微信上传发货信息接口参数:{},返回:{}", reqJson, response); + JSONObject data = (JSONObject) JSONObject.parse(response); + MtUploadShippingLog mtUploadShippingLog = new MtUploadShippingLog(); + mtUploadShippingLog.setMerchantId(orderInfo.getMerchantId()); + mtUploadShippingLog.setStoreId(orderInfo.getStoreId()); + mtUploadShippingLog.setOrderId(orderInfo.getId()); + mtUploadShippingLog.setOrderSn(orderSn); + mtUploadShippingLog.setMobile(orderInfo.getAddress().getMobile()); + Date time = new Date(); + mtUploadShippingLog.setCreateTime(time); + mtUploadShippingLog.setUpdateTime(time); + if (data.get("errcode").toString().equals("0")) { + logger.info("微信上传发货信息接口成功,订单号:", orderSn); + mtUploadShippingLog.setStatus(OrderStatusType.Completed.getVal()); + } else { + mtUploadShippingLog.setStatus(OrderStatusType.Failed.getVal()); + } + uploadShippingLogMapper.insert(mtUploadShippingLog); + } catch (Exception e) { + logger.error("微信上传发货信息接口失败:", e.getMessage()); + } + } + } + + /** + * 刷卡支付 + * + * @param storeId 店铺ID + * @param reqData 请求参数 + * @param ip 支付IP + * @param platform 支付平台 + * @return + * */ + private Map microPay(Integer storeId, Map reqData, String ip, String platform) { + try { + String orderSn = reqData.get("out_trade_no"); + + logger.info("调用微信刷卡支付下单接口入参{}", JsonUtil.toJSONString(reqData)); + logger.info("请求平台:{}, 订单号:{}", platform, orderSn); + + // 支付配置 + getApiConfig(storeId, platform); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + Map params = MicroPayModel.builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .nonce_str(WxPayKit.generateStr()) + .body(reqData.get("body")) + .attach(reqData.get("body")) + .out_trade_no(orderSn) + .total_fee(reqData.get("total_fee")) + .spbill_create_ip(ip) + .auth_code(reqData.get("auth_code")) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); + String xmlResult = WxPayApi.microPay(false, params); + + // 同步返回结果 + logger.info("xmlResult:" + xmlResult); + Map respMap = WxPayKit.xmlToMap(xmlResult); + String returnCode = respMap.get("return_code"); + String returnMsg = respMap.get("return_msg"); + String errCode = respMap.get("err_code"); + if (!WxPayKit.codeIsOk(returnCode)) { + Map payResult = null; + if (StringUtil.isNotEmpty(errCode)) { + // 用户支付中,需要输入密码 + if (errCode.equals("USERPAYING")) { + // 等待10秒后查询订单 + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + payResult = queryPaidOrder(storeId, respMap.get("transaction_id"), orderSn); + } + } + if (payResult == null || !payResult.get("trade_state").equals("SUCCESS")) { + logger.info("提交刷卡支付失败>>" + xmlResult); + return respMap; + } + } + + String resultCode = respMap.get("result_code"); + if (!WxPayKit.codeIsOk(resultCode)) { + logger.info("支付失败>>" + xmlResult); + logger.error(returnMsg); + return respMap; + } + + // 支付成功 + logger.info("刷卡支付返回>>" + respMap.toString()); + + if (StringUtil.isNotEmpty(orderSn)) { + UserOrderDto orderInfo = orderService.getOrderByOrderSn(orderSn); + if (orderInfo != null) { + if (!orderInfo.getStatus().equals(OrderStatusEnum.DELETED.getKey())) { + paymentService.paymentCallback(orderInfo); + } + } + } + + return respMap; + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * 小程序、公众号支付 + * + * @param storeId 店铺ID + * @param reqData 请求参数 + * @param ip 支付IP + * @param platform 支付平台 + * @return + * */ + private Map jsapiPay(Integer storeId, Map reqData, String ip, String platform) { + try { + logger.info("调用微信支付下单接口入参:{},请求平台:{}", JsonUtil.toJSONString(reqData), platform); + // 获取支付配置 + getApiConfig(storeId, platform); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + Map params = UnifiedOrderModel + .builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .nonce_str(WxPayKit.generateStr()) + .body(reqData.get("body")) + .attach(reqData.get("body")) + .out_trade_no(reqData.get("out_trade_no")) + .total_fee(reqData.get("total_fee")) + .spbill_create_ip(ip) + .notify_url(wxPayApiConfig.getDomain() + CALL_BACK_URL) + .trade_type(reqData.get("trade_type")) + .openid(reqData.get("openid")) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); + String xmlResult = WxPayApi.pushOrder(false, params); + + logger.info("调用微信支付回调地址:{}", wxPayApiConfig.getDomain() + CALL_BACK_URL); + logger.info("调用微信支付下单接口返回xml:{}", xmlResult); + Map result = WxPayKit.xmlToMap(xmlResult); + + String returnCode = result.get("return_code"); + String returnMsg = result.get("return_msg"); + if (!WxPayKit.codeIsOk(returnCode)) { + logger.error(returnMsg); + } + String resultCode = result.get("result_code"); + if (!WxPayKit.codeIsOk(resultCode)) { + logger.error(returnMsg); + } + + logger.info("调用微信支付下单接口返回数据:{}", JsonUtil.toJSONString(result)); + return result; + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * h5支付 + * + * @param storeId 店铺ID + * @param reqData 请求参数 + * @param ip 支付IP + * @param platform 支付平台 + * @return + * */ + private Map wapPay(Integer storeId, Map reqData, String ip, String platform) { + try { + logger.info("调用微信h5支付下单接口入参{},请求平台:{}", JsonUtil.toJSONString(reqData), platform); + // 支付配置 + getApiConfig(storeId, platform); + WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); + H5SceneInfo sceneInfo = new H5SceneInfo(); + H5SceneInfo.H5 h5Info = new H5SceneInfo.H5(); + h5Info.setType("Wap"); + // 支付域名必须在商户平台->"产品中心"->"开发配置"中添加 + h5Info.setWap_url(wxPayApiConfig.getDomain()); + h5Info.setWap_name("WEB"); + sceneInfo.setH5Info(h5Info); + Map params = UnifiedOrderModel + .builder() + .appid(wxPayApiConfig.getAppId()) + .mch_id(wxPayApiConfig.getMchId()) + .nonce_str(WxPayKit.generateStr()) + .body(reqData.get("body")) + .attach(reqData.get("body")) + .out_trade_no(WxPayKit.generateStr()) + .total_fee(reqData.get("total_fee")) + .spbill_create_ip(ip) + .notify_url(wxPayApiConfig.getDomain() + CALL_BACK_URL) + .trade_type(TradeType.MWEB.getTradeType()) + .scene_info(JSON.toJSONString(sceneInfo)) + .build() + .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); + + String xmlResult = WxPayApi.pushOrder(false, params); + logger.info("调用微信h5支付接口返回xml:{}", xmlResult); + + Map result = WxPayKit.xmlToMap(xmlResult); + + String return_code = result.get("return_code"); + String return_msg = result.get("return_msg"); + if (!WxPayKit.codeIsOk(return_code)) { + throw new RuntimeException(return_msg); + } + String result_code = result.get("result_code"); + if (!WxPayKit.codeIsOk(result_code)) { + throw new RuntimeException(return_msg); + } + result.put("backUrl", env.getProperty("website.url")); + logger.info("调用微信h5支付接口返回数据:{}", JsonUtil.toJSONString(result)); + return result; + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * 获取支付配置 + * + * @param storeId 店铺ID + * @param platform 支付平台 + * @throws BusinessCheckException + * @return + * */ + private WxPayApiConfig getApiConfig(Integer storeId, String platform) throws BusinessCheckException { + WxPayApiConfig apiConfig; + + String mchId = wxPayBean.getMchId(); + String apiV2 = wxPayBean.getApiV2(); + String certPath = wxPayBean.getCertPath(); + String appId = wxPayBean.getAppId(); + + MtStore mtStore = storeService.queryStoreById(storeId); + logger.info("微信支付店铺信息:{}", JsonUtil.toJSONString(mtStore)); + if (mtStore != null && StringUtil.isNotEmpty(mtStore.getWxApiV2()) && StringUtil.isNotEmpty(mtStore.getWxMchId())) { + mchId = mtStore.getWxMchId(); + apiV2 = mtStore.getWxApiV2(); + String basePath = env.getProperty("images.root"); + certPath = basePath + mtStore.getWxCertPath(); + MtMerchant mtMerchant = merchantService.queryMerchantById(mtStore.getMerchantId()); + if (mtMerchant != null && StringUtil.isNotEmpty(mtMerchant.getWxAppId())) { + appId = mtMerchant.getWxAppId(); + } + } + + apiConfig = WxPayApiConfig.builder() + .appId(appId) + .mchId(mchId) + .partnerKey(apiV2) + .certPath(certPath) + .domain(wxPayBean.getDomain()) + .build(); + + // 微信内h5公众号支付 + if (platform.equals(PlatformTypeEnum.H5.getCode()) || StringUtil.isBlank(appId)) { + String wxAppId = env.getProperty("weixin.official.appId"); + String wxAppSecret = env.getProperty("weixin.official.appSecret"); + + if (mtStore != null) { + MtMerchant mtMerchant = merchantService.queryMerchantById(mtStore.getMerchantId()); + if (mtMerchant != null && StringUtil.isNotEmpty(mtMerchant.getWxOfficialAppId()) && StringUtil.isNotEmpty(mtMerchant.getWxOfficialAppSecret())) { + wxAppId = mtMerchant.getWxOfficialAppId(); + wxAppSecret = mtMerchant.getWxOfficialAppSecret(); + } + } + + if (StringUtil.isNotEmpty(wxAppId) && StringUtil.isNotEmpty(wxAppSecret)) { + apiConfig.setAppId(wxAppId); + apiConfig.setApiKey(wxAppSecret); + } + } + + WxPayApiConfigKit.setThreadLocalWxPayApiConfig(apiConfig); + logger.info("微信支付参数:{}", JsonUtil.toJSONString(apiConfig)); + + return apiConfig; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/util/AliyunOssUtil.java b/fuint-application/src/main/java/com/fuint/common/util/AliyunOssUtil.java new file mode 100644 index 0000000..8bfc919 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/util/AliyunOssUtil.java @@ -0,0 +1,124 @@ +package com.fuint.common.util; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.model.Bucket; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.OSSObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Date; + +/** + * 阿里云OSS存储工具 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class AliyunOssUtil { + + private static final Logger logger = LoggerFactory.getLogger(AliyunOssUtil.class); + + /** + * 获取阿里云OSS客户端对象 + * + * @param accessKeyId 访问键值 + * @param accessKeySecret 访问秘钥 + * @param endpoint 存储endPoint + * @return ossClient + */ + public static OSS getOSSClient(String accessKeyId, String accessKeySecret, String endpoint) { + return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + } + + /** + * 创建存储空间 + * + * @param ossClient OSS连接 + * @param bucketName 存储空间 + * @return + */ + public static String createBucketName(OSS ossClient, String bucketName) { + // 存储空间 + final String bucketNames = bucketName; + + if (!ossClient.doesBucketExist(bucketName)) { + // 创建存储空间 + Bucket bucket = ossClient.createBucket(bucketName); + logger.info("创建存储空间成功"); + return bucket.getName(); + } + + return bucketNames; + } + + /** + * 创建模拟文件夹 + * + * @param ossClient oss连接 + * @param bucketName 存储bucket + * @param folder 文件夹 + * @return 文件夹名 + */ + public static String createFolder(OSS ossClient, String bucketName, String folder) { + // 文件夹名 + final String keySuffixWithSlash = folder; + + // 判断文件夹是否存在,不存在则创建 + if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { + // 创建文件夹 + ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); + logger.info("创建文件夹成功"); + // 得到文件夹名 + OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); + String fileDir = object.getKey(); + return fileDir; + } + + return keySuffixWithSlash; + } + + /** + * 上传图片至OSS + * + * @param ossClient oss连接 + * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg) + * @return String 返回文件url + */ + public static String upload(OSS ossClient, File file, String bucketName, String folder) { + String resultStr = null; + + // 先创建存储空间和文件夹 + createBucketName(ossClient, bucketName); + createFolder(ossClient, bucketName, folder); + + try { + InputStream is = new FileInputStream(file); + String fileName = file.getName(); + String date = DateUtil.formatDate(new Date(), "yyyyMMdd"); + ossClient.putObject(bucketName, folder + "/" + date + "/" + fileName, is); + resultStr = "/" + folder + "/" + date +"/" + fileName; + } catch (Exception e) { + e.printStackTrace(); + logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e); + } + + return resultStr; + } + + /** + * 根据key删除OSS上的文件 + * + * @param ossClient oss连接 + * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg" + */ + public static void deleteFile(OSS ossClient, String bucketName, String folder, String key) { + ossClient.deleteObject(bucketName, folder + key); + + logger.info("删除" + bucketName + "下的文件" + folder + key + "成功"); + } +} + diff --git a/fuint-application/src/main/java/com/fuint/common/util/AuthUserUtil.java b/fuint-application/src/main/java/com/fuint/common/util/AuthUserUtil.java new file mode 100644 index 0000000..24a681c --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/util/AuthUserUtil.java @@ -0,0 +1,29 @@ +package com.fuint.common.util; + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.fuint.common.dto.AccountInfo; + +/** + * 用户认证工具 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class AuthUserUtil { + + private static final ThreadLocal USER_INFO_IN_TOKEN_HOLDER = new TransmittableThreadLocal<>(); + + public static AccountInfo get() { + return USER_INFO_IN_TOKEN_HOLDER.get(); + } + + public static void set(AccountInfo userInfoInTokenBo) { + USER_INFO_IN_TOKEN_HOLDER.set(userInfoInTokenBo); + } + + public static void clean() { + if (USER_INFO_IN_TOKEN_HOLDER.get() != null) { + USER_INFO_IN_TOKEN_HOLDER.remove(); + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/util/Base64Util.java b/fuint-application/src/main/java/com/fuint/common/util/Base64Util.java new file mode 100644 index 0000000..a560bc9 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/util/Base64Util.java @@ -0,0 +1,106 @@ +package com.fuint.common.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.UnsupportedEncodingException; +import java.util.Base64; + +/** + * 编码工具 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Base64Util { + + private static final Logger logger = LoggerFactory.getLogger(Base64Util.class); + + public Base64Util() { + // empty + } + + public static byte[] baseEncode(byte[] bytes) { + return Base64.getEncoder().encode(bytes); + } + + public static String baseEncode(String s) { + try { + byte[] e = s.getBytes("UTF-8"); + return Base64.getEncoder().encodeToString(e); + } catch (UnsupportedEncodingException var2) { + logger.error(var2.getMessage(), var2); + return null; + } + } + + public static byte[] baseDecode(byte[] bytes) { + return Base64.getDecoder().decode(bytes); + } + + public static String baseDecode(String s) { + try { + byte[] e = Base64.getDecoder().decode(s); + return new String(e, "UTF-8"); + } catch (UnsupportedEncodingException var2) { + logger.error(var2.getMessage(), var2); + return null; + } + } + + public static byte[] urlEncode(byte[] bytes) { + return Base64.getUrlEncoder().encode(bytes); + } + + public static String urlEncode(String s) { + try { + byte[] e = s.getBytes("UTF-8"); + return Base64.getUrlEncoder().encodeToString(e); + } catch (UnsupportedEncodingException var2) { + logger.error(var2.getMessage(), var2); + return null; + } + } + + public static byte[] urlDecode(byte[] bytes) { + return Base64.getUrlDecoder().decode(bytes); + } + + public static String urlDecode(String s) { + byte[] result = Base64.getUrlDecoder().decode(s); + + try { + return new String(result, "UTF-8"); + } catch (UnsupportedEncodingException var3) { + logger.error(var3.getMessage(), var3); + return null; + } + } + + public static byte[] mimeEncode(byte[] bytes) { + return Base64.getMimeEncoder().encode(bytes); + } + + public static String mimeEncode(String s) { + try { + byte[] e = s.getBytes("UTF-8"); + return Base64.getMimeEncoder().encodeToString(e); + } catch (UnsupportedEncodingException var2) { + logger.error(var2.getMessage(), var2); + return null; + } + } + + public static byte[] mimeDecode(byte[] bytes) { + return Base64.getMimeDecoder().decode(bytes); + } + + public static String mimeDecode(String s) { + try { + byte[] e = Base64.getMimeDecoder().decode(s); + return new String(e, "UTF-8"); + } catch (UnsupportedEncodingException var2) { + logger.error(var2.getMessage(), var2); + return null; + } + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/util/BizCodeGenerator.java b/fuint-application/src/main/java/com/fuint/common/util/BizCodeGenerator.java new file mode 100644 index 0000000..968220b --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/util/BizCodeGenerator.java @@ -0,0 +1,65 @@ +package com.fuint.common.util; + +import com.fuint.utils.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * 业务Code生成器 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class BizCodeGenerator { + + private static final Logger logger = LoggerFactory.getLogger(BizCodeGenerator.class); + + private static final String DATE_FORMAT="yyyyMMddHHmmssSSS"; + + /** + * 获取指定前缀的Code字符串 + * @param preString 前缀字符串 + * @return + */ + public synchronized static String getPreCodeString(String preString) { + StringBuffer result = new StringBuffer(); + if(StringUtil.isNotEmpty(preString)){ + result.append(preString); + } + + String dateStr = new SimpleDateFormat(DATE_FORMAT).format(new Date()); + result.append(dateStr); + + String randomStr = SeqUtil.getRandomNumber(2); + result.append(randomStr); + return result.toString(); + } + + + /** + * 生成6位数字短信验证码 + * @param + * @return + */ + public synchronized static String getVerifyCode() { + String verifyCode = getFixLengthString(6); + return verifyCode; + } + + /** + * 返回长度为【strLength】的随机数,在前面补0 + * @return + */ + private static String getFixLengthString(int strLength) { + Random rm = new Random(); + // 获得随机数 + double process = (1 + rm.nextDouble()) * Math.pow(10, strLength); + // 将获得的获得随机数转化为字符串 + String codeStr = String.valueOf(process); + // 返回固定的长度的随机数 + return codeStr.substring(1, strLength + 1); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/util/CommonUtil.java b/fuint-application/src/main/java/com/fuint/common/util/CommonUtil.java new file mode 100644 index 0000000..32512c1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/util/CommonUtil.java @@ -0,0 +1,532 @@ +package com.fuint.common.util; + +import com.fuint.utils.StringUtil; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.net.InetAddress; +import java.net.URLDecoder; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 通用工具 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class CommonUtil { + + /** + * 校验经纬度是否是有效的全球坐标 + * + * @param longitude 经度 + * @param latitude 纬度 + * @return true-有效; false-无效 + */ + public static boolean isValidGlobalCoordinate(double longitude, double latitude) { + // 校验纬度范围 (-90 ~ 90) + boolean isLatValid = (latitude >= -90.0 && latitude <= 90.0); + // 校验经度范围 (-180 ~ 180) + boolean isLngValid = (longitude >= -180.0 && longitude <= 180.0); + return isLatValid && isLngValid; + } + + /** + * 对象转化成map + * + * @param obj 对象 + * @return + * */ + public static Map convert(Object obj) throws IllegalAccessException { + Map map = new HashMap<>(); + Class clazz = obj.getClass(); + + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + map.put(field.getName(), field.get(obj)); + } + + return map; + } + + /** + * 隐藏手机号中间4位 + * + * @param phone + * @return + * */ + public static String hidePhone(String phone) { + if (StringUtil.isBlank(phone)) { + return ""; + } + if (phone.length() < 11) { + return phone; + } + return phone.substring(0, 3) + "****" + phone.substring(7); + } + + + /** + * 功能:将输入字符串的首字母改成大写 + * + * @param str + * @return + */ + public static String firstLetterToUpperCase(String str) { + char[] ch = str.toCharArray(); + if (ch[0] >= 'a' && ch[0] <= 'z') { + ch[0] = (char) (ch[0] - 32); + } + return new String(ch); + } + + /** + * 功能:将输入字符串的首字母改成驼峰格式 + * + * @param str + * @return + */ + public static String toCamelCase(String str) { + if (str == null) { + return null; + } + str = str.toLowerCase(); + StringBuilder sb = new StringBuilder(); + boolean upperCase = false; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (c == '_') { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 判断是否UTF-8编码 + * + * @param str + * @return + * */ + public static boolean isUtf8(String str) { + try { + byte[] bytes = str.getBytes("UTF-8"); + String newStr = new String(bytes, "UTF-8"); + return str.equals(newStr); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return false; + } + + /** + * 判断是否乱码 + * + * @param str + * @return + * */ + public static boolean isErrCode(String str) { + return !(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(str)); + } + + /** + * 判断是否数字 + * + * @param str 字符串 + * @return + * */ + public static boolean isNumeric(String str) { + if (StringUtil.isEmpty(str)) { + return false; + } + + Pattern pattern = Pattern.compile("[0-9]*\\.?[0-9]+"); + Matcher isNum = pattern.matcher(str); + + if (!isNum.matches()) { + return false; + } + + return true; + } + + /** + * 生成随机会员号(13位数) + * + * @return + * */ + public static String createUserNo() { + StringBuilder sb = new StringBuilder("8"); + sb.append(SeqUtil.getRandomNumber(4)); + sb.append(SeqUtil.getRandomNumber(4)); + sb.append(SeqUtil.getRandomNumber(4)); + return sb.toString(); + } + + /** + * 生成随机键值号 + * + * @return + * */ + public static String createAccountKey() { + StringBuilder sb = new StringBuilder("11"); + sb.append(SeqUtil.getRandomNumber(6)); + sb.append(SeqUtil.getRandomNumber(5)); + String t = TimeUtils.formatDate(new Date(), "yyyyMMddHH"); + return t + sb.toString(); + } + + /** + * 生成随机商户号 + * + * @return + * */ + public static String createMerchantNo() { + StringBuilder sb = new StringBuilder("8"); + sb.append(SeqUtil.getRandomNumber(4)); + sb.append(SeqUtil.getRandomNumber(4)); + return sb.toString(); + } + + /** + * 生成随机结算单号(13位数) + * + * @return + * */ + public static String createSettlementNo() { + StringBuilder sb = new StringBuilder("8"); + sb.append(SeqUtil.getRandomNumber(4)); + sb.append(SeqUtil.getRandomNumber(4)); + sb.append(SeqUtil.getRandomNumber(4)); + return sb.toString(); + } + + /** + * 生成随机订单号 + * + * @param userId + * @return + * */ + public static String createOrderSN(String userId) { + // 时间是17位 + String date = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyyMMddHHmmssSSS"); + StringBuilder sb = new StringBuilder(); + sb.append(date); + + // 目前的会员id为9位,不确定后面会不会变更 + if (userId.length() > 9) { + sb.append(userId.substring(userId.length() - 9, 9)); + } + + if (userId.length() == 9) { + sb.append(userId); + } + + // 如果小于9位补位 + if (userId.length() < 9) { + for (int i = 0; i < userId.length() - 9; i++) { + sb.append("0"); + } + } + + // 加上4位随机数 + sb.append(SeqUtil.getRandomNumber(4)); + return sb.toString(); + } + + /** + * 获取IP地址 + * + * @param request + * @return String + */ + public static String getIPFromHttpRequest(HttpServletRequest request) { + String ipAddress; + try { + ipAddress = request.getHeader("x-forwarded-for"); + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getRemoteAddr(); + if (ipAddress.equals("127.0.0.1")) { + // 根据网卡取本机配置的IP + InetAddress inet = null; + try { + inet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + ipAddress = inet.getHostAddress(); + } + } + // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 + if (ipAddress != null && ipAddress.length() > 15) { + if (ipAddress.indexOf(",") > 0) { + ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); + } + } + } catch (Exception e) { + ipAddress = ""; + } + + if (!isValidIP(ipAddress)) { + return "127.0.0.1"; + } + + return ipAddress; + } + + /** + * 验证ip地址是否正确 + * + * @param ip + * @return + * */ + public static boolean isValidIP(String ip) { + if ((ip != null) && (!ip.isEmpty())) { + return Pattern.matches("^([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}$", ip); + } + return false; + } + + /** + * 保存上传文件 + * + * @param file 上传的文件 + * @param filePath 文件路径 + * @return + * */ + public static void saveMultipartFile(MultipartFile file, String filePath) { + if (file != null && !file.isEmpty()) { + try { + FileOutputStream os = new FileOutputStream(new File(filePath)); + //拿到上传文件的输入流 + os.write(file.getBytes()); + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 格式化指定的日期 + * + * @param date + * @param formatStr + * @return + */ + public static String formatDate(Date date, String formatStr) { + if (date == null) date = new Date(); + if (StringUtil.isEmpty(formatStr)) formatStr = "yyyy-MM-dd"; + SimpleDateFormat dateFormater = new SimpleDateFormat(formatStr); + return dateFormater.format(date); + } + + /** + * 去除待带script、src的语句,转义替换后的value值 + * + * @param value + * + * @return + */ + public static String replaceXSS(String value) { + if (value != null) { + try { + value = value.replace("+","%2B"); + value = URLDecoder.decode(value, "utf-8"); + } catch(Exception e) { + //empty + } + + StringBuilder buf = new StringBuilder(value.length()); + int len = value.length(); + for (int i = 0; i < len; i++) { + char codePoint = value.charAt(i); + if (isEmojiCharacter(codePoint)) { + buf.append("*"); + } else { + buf.append(codePoint); + } + } + + String emojiStr = buf.toString(); + if (!StringUtil.isEmpty(emojiStr)) { + value = emojiStr; + } + + // Avoid null characters + value = value.replaceAll("\0", ""); + + // Avoid anything between script tags + Pattern scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); + value = scriptPattern.matcher(value).replaceAll(""); + + // Avoid anything in a src='...' type of e­xpression + scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); + value = scriptPattern.matcher(value).replaceAll(""); + + scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); + value = scriptPattern.matcher(value).replaceAll(""); + + // Remove any lonesome tag + scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); + value = scriptPattern.matcher(value).replaceAll(""); + + // Remove any lonesome diff --git a/fuint-application/src/main/resources/vm/vue/index.vue.vm b/fuint-application/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..6296014 --- /dev/null +++ b/fuint-application/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,602 @@ + + + diff --git a/fuint-application/src/main/resources/vm/vue/v3/index-tree.vue.vm b/fuint-application/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..c54d62b --- /dev/null +++ b/fuint-application/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/fuint-application/src/main/resources/vm/vue/v3/index.vue.vm b/fuint-application/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..8b25665 --- /dev/null +++ b/fuint-application/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,590 @@ + + + diff --git a/fuint-application/src/main/resources/vm/xml/mapper.xml.vm b/fuint-application/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..fa50fcf --- /dev/null +++ b/fuint-application/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-framework/pom.xml b/fuint-framework/pom.xml new file mode 100644 index 0000000..ad2d6c5 --- /dev/null +++ b/fuint-framework/pom.xml @@ -0,0 +1,42 @@ + + + + fuint + com.fuint + 1.0.0 + + 4.0.0 + + fuint-framework + 1.0.0 + jar + + + + com.fuint + fuint-utils + 1.0.0 + + + com.fuint + fuint-repository + 1.0.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/fuint-framework/src/main/java/com/fuint/framework/FrameworkConstants.java b/fuint-framework/src/main/java/com/fuint/framework/FrameworkConstants.java new file mode 100644 index 0000000..ada13d6 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/FrameworkConstants.java @@ -0,0 +1,11 @@ +package com.fuint.framework; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class FrameworkConstants { + + public static final int HTTP_RESPONSE_CODE_SUCCESS = 200; + +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/annoation/OperationServiceLog.java b/fuint-framework/src/main/java/com/fuint/framework/annoation/OperationServiceLog.java new file mode 100644 index 0000000..b0cdaef --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/annoation/OperationServiceLog.java @@ -0,0 +1,16 @@ +package com.fuint.framework.annoation; + +import java.lang.annotation.*; + +/** + * 操作日志记录注解 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface OperationServiceLog { + String description() default ""; +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/dto/ExcelExportDto.java b/fuint-framework/src/main/java/com/fuint/framework/dto/ExcelExportDto.java new file mode 100644 index 0000000..1901da1 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/dto/ExcelExportDto.java @@ -0,0 +1,65 @@ +package com.fuint.framework.dto; + +import java.io.OutputStream; +import java.util.Map; + +/** + * 导出Excel文件DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class ExcelExportDto { + + /** + * 模板文件名称 + */ + private String srcTemplateFileName; + + /** + * 模板文件所在resource路径 + */ + private String srcPath; + + /** + * 数据 + */ + private Map dataMap; + + /** + * 输出流 + */ + private OutputStream out; + + public String getSrcTemplateFileName() { + return srcTemplateFileName; + } + + public void setSrcTemplateFileName(String srcTemplateFileName) { + this.srcTemplateFileName = srcTemplateFileName; + } + + public Map getDataMap() { + return dataMap; + } + + public void setDataMap(Map dataMap) { + this.dataMap = dataMap; + } + + public OutputStream getOut() { + return out; + } + + public void setOut(OutputStream out) { + this.out = out; + } + + public String getSrcPath() { + return srcPath; + } + + public void setSrcPath(String srcPath) { + this.srcPath = srcPath; + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/exception/BusinessCheckException.java b/fuint-framework/src/main/java/com/fuint/framework/exception/BusinessCheckException.java new file mode 100644 index 0000000..2d78fe4 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/exception/BusinessCheckException.java @@ -0,0 +1,71 @@ +package com.fuint.framework.exception; + +/** + * 业务检查异常 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class BusinessCheckException extends Exception { + private static final long serialVersionUID = 1L; + + private Throwable rootCause; + + public BusinessCheckException(String arg0) { + super(arg0); + this.errorKey = arg0; + rootCause = this; + } + + public BusinessCheckException() { + super(); + } + + public BusinessCheckException(String s, Throwable e) { + this(s); + if (e instanceof BusinessCheckException) { + rootCause = ((BusinessCheckException) e).rootCause; + } else { + rootCause = e; + } + } + + public BusinessCheckException(Throwable e) { + this("", e); + } + + public Throwable getRootCause() { + return rootCause; + } + + private String errorKey; + + public String getErrorKey() { + return errorKey; + } + + private String[] errorParam; + + private Object[] errorObjectParam; + + public Object[] getErrorObjectParam() { + return errorObjectParam; + } + + public void setErrorObjectParam(Object[] errorObjectParam) { + this.errorObjectParam = errorObjectParam; + } + + public BusinessCheckException(String key, Object[] objectParam) { + this(key); + this.errorObjectParam = objectParam; + } + + public String[] getErrorParam() { + return errorParam; + } + + public void setErrorParam(String[] errorParam) { + this.errorParam = errorParam; + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/exception/BusinessRuntimeException.java b/fuint-framework/src/main/java/com/fuint/framework/exception/BusinessRuntimeException.java new file mode 100644 index 0000000..8124f5a --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/exception/BusinessRuntimeException.java @@ -0,0 +1,71 @@ +package com.fuint.framework.exception; + +/** + * 业务运行异常 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class BusinessRuntimeException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private Throwable rootCause; + + public BusinessRuntimeException(String arg0) { + super(arg0); + this.errorKey = arg0; + rootCause = this; + } + + public BusinessRuntimeException() { + super(); + } + + public BusinessRuntimeException(String s, Throwable e) { + this(s); + if (e instanceof BusinessRuntimeException) { + rootCause = ((BusinessRuntimeException) e).rootCause; + } else { + rootCause = e; + } + } + + public BusinessRuntimeException(Throwable e) { + this("", e); + } + + public Throwable getRootCause() { + return rootCause; + } + + private String errorKey; + + public String getErrorKey() { + return errorKey; + } + + private String[] errorParam; + + private Object[] errorObjectParam; + + public Object[] getErrorObjectParam() { + return errorObjectParam; + } + + public void setErrorObjectParam(Object[] errorObjectParam) { + this.errorObjectParam = errorObjectParam; + } + + public BusinessRuntimeException(String key, Object[] objectParam) { + this(key); + this.errorObjectParam = objectParam; + } + + public String[] getErrorParam() { + return errorParam; + } + + public void setErrorParam(String[] errorParam) { + this.errorParam = errorParam; + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/exception/GlobalExceptionHandler.java b/fuint-framework/src/main/java/com/fuint/framework/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..8e2bd74 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/exception/GlobalExceptionHandler.java @@ -0,0 +1,106 @@ +package com.fuint.framework.exception; + +import com.fuint.framework.web.ResponseObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingPathVariableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import javax.servlet.http.HttpServletRequest; + +/** + * 全局异常处理器 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@RestControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public ResponseObject handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return new ResponseObject(201, e.getMessage(), null); + } + + /** + * 业务异常 + */ + @ExceptionHandler(BusinessCheckException.class) + public ResponseObject handleServiceException(BusinessCheckException e) { + log.error(e.getMessage(), e); + return new ResponseObject(201, e.getMessage(), null); + } + + /** + * 请求路径中缺少必需的路径变量 + */ + @ExceptionHandler(MissingPathVariableException.class) + public ResponseObject handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); + return new ResponseObject(201, String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName()), null); + } + + /** + * 请求参数类型不匹配 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseObject handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); + return new ResponseObject(201, String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue()), null); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public ResponseObject handleRuntimeException(RuntimeException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + e.printStackTrace(); + return new ResponseObject(201, e.getMessage(), null); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public ResponseObject handleException(Exception e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + e.printStackTrace(); + return new ResponseObject(201, e.getMessage(), null); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public ResponseObject handleBindException(BindException e) { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return new ResponseObject(201,message, null); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return new ResponseObject(201,message, null); + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationRequest.java b/fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationRequest.java new file mode 100644 index 0000000..56c9dc2 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationRequest.java @@ -0,0 +1,97 @@ +package com.fuint.framework.pagination; + +import java.io.Serializable; +import java.util.Map; + +/** + * 分页实体对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class PaginationRequest implements Serializable { + + private static final long serialVersionUID = -344484321130132260L; + + /** + * 当前页码 + */ + private int currentPage; + /** + * 每页大小 + */ + private int pageSize; + /** + * 排序字段 + */ + private String[] sortColumn; + /** + * 排序类型 + */ + private String sortType; + /** + * 分页查询参数 + */ + private Map searchParams; + + // 默认构造函数 + public PaginationRequest() { + this.currentPage = 1; + this.pageSize = 20; + } + + public PaginationRequest(Integer pageNumber, Integer pageSize) { + this.currentPage = pageNumber; + this.pageSize = pageSize; + } + + public PaginationRequest(Integer pageNumber, Integer pageSize, Map searchParams) { + this.currentPage = pageNumber; + this.pageSize = pageSize; + this.searchParams = searchParams; + } + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String[] getSortColumn() { + return sortColumn; + } + + public void setSortColumn(String sortColumn) { + this.sortColumn = new String[]{sortColumn}; + } + + public void setSortColumn(String[] sortColumns) { + this.sortColumn = sortColumns; + } + + public String getSortType() { + return sortType; + } + + public void setSortType(String sortType) { + this.sortType = sortType; + } + + public Map getSearchParams() { + return searchParams; + } + + public void setSearchParams(Map searchParams) { + this.searchParams = searchParams; + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationResponse.java b/fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationResponse.java new file mode 100644 index 0000000..9f59027 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/pagination/PaginationResponse.java @@ -0,0 +1,167 @@ +package com.fuint.framework.pagination; + +import org.springframework.data.domain.Page; +import java.io.Serializable; +import java.util.List; + +/** + * 分页请求响应结果对象 + * + * @param + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class PaginationResponse implements Serializable { + + private static final long serialVersionUID = 1115676724739520700L; + + /** + * 当前页码 + */ + private int currentPage; + /** + * 每页大小 + */ + private int pageSize; + /** + * 总页数 + */ + private int totalPages; + private int numberOfElements; + /** + * 总记录数 + */ + private long totalElements; + /** + * 是否有上一页 + */ + private boolean hasPreviousPage; + /** + * 是否是第一页 + */ + private boolean isFirstPage; + /** + * 是否有下一页 + */ + private boolean hasNextPage; + /** + * 是否是最后一页 + */ + private boolean isLastPage; + /** + * 是否有内容 + */ + private boolean hasContent; + /** + * 结果集合 + */ + private List content; + + /** + * 构造方法 + */ + public PaginationResponse(final Page page, final Class clz) { + this.currentPage = page.getNumber(); + this.pageSize = page.getSize(); + this.totalPages = page.getTotalPages(); + this.numberOfElements = page.getNumberOfElements(); + this.totalElements = page.getTotalElements(); + this.hasPreviousPage = page.hasPrevious(); + this.isFirstPage = page.isFirst(); + this.hasNextPage = page.hasNext(); + this.isLastPage = page.isLast(); + if (page.getContent() != null && page.getContent().size() > 0) { + this.hasContent = true; + } + + } + + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getTotalPages() { + return totalPages; + } + + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + + public int getNumberOfElements() { + return numberOfElements; + } + + public void setNumberOfElements(int numberOfElements) { + this.numberOfElements = numberOfElements; + } + + public long getTotalElements() { + return totalElements; + } + + public void setTotalElements(long totalElements) { + this.totalElements = totalElements; + } + + public boolean isHasPreviousPage() { + return hasPreviousPage; + } + + public void setHasPreviousPage(boolean hasPreviousPage) { + this.hasPreviousPage = hasPreviousPage; + } + + public boolean isFirstPage() { + return isFirstPage; + } + + public void setFirstPage(boolean isFirstPage) { + this.isFirstPage = isFirstPage; + } + + public boolean isHasNextPage() { + return hasNextPage; + } + + public void setHasNextPage(boolean hasNextPage) { + this.hasNextPage = hasNextPage; + } + + public boolean isLastPage() { + return isLastPage; + } + + public void setLastPage(boolean isLastPage) { + this.isLastPage = isLastPage; + } + + public boolean isHasContent() { + return hasContent; + } + + public void setHasContent(boolean hasContent) { + this.hasContent = hasContent; + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/service/ExportService.java b/fuint-framework/src/main/java/com/fuint/framework/service/ExportService.java new file mode 100644 index 0000000..ca81e0b --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/service/ExportService.java @@ -0,0 +1,21 @@ +package com.fuint.framework.service; + +import com.fuint.framework.dto.ExcelExportDto; + +/** + * 导出Excel文件业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface ExportService { + + /** + * 直接导出本地文件 + * + * @param data srcPath 文件相对路径 + * srcTemplateFileName 文件名称 + * out 输出流 + */ + void exportLocalFile(ExcelExportDto data) throws Exception; +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/service/ExportServiceImpl.java b/fuint-framework/src/main/java/com/fuint/framework/service/ExportServiceImpl.java new file mode 100644 index 0000000..6b0e60a --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/service/ExportServiceImpl.java @@ -0,0 +1,68 @@ +package com.fuint.framework.service; + +import com.fuint.framework.dto.ExcelExportDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; + +/** + * 导出Excel文件业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +public class ExportServiceImpl implements ExportService { + + private static final Logger logger = LoggerFactory.getLogger(ExportServiceImpl.class); + + private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void exportLocalFile(ExcelExportDto data) throws Exception { + // 下载本地文件 + InputStream inStream = null; + try { + String fileName = data.getSrcTemplateFileName(); + // 读到流中s + inStream = new FileInputStream(data.getSrcPath() + File.separator + fileName);// 文件的存放路径 + // 循环取出流中的数据 + byte[] b = new byte[100]; + int len; + while ((len = inStream.read(b)) > 0) { + data.getOut().write(b, 0, len); + } + inStream.close(); + data.getOut().flush(); + data.getOut().close(); + // 设置输出的格式 + } catch (FileNotFoundException e) { + logger.error("ExportServiceImpl.exportLocalFile{}", e); + throw e; + } catch (IOException e) { + logger.error("ExportServiceImpl.exportLocalFile{}", e); + throw e; + } finally { + try { + if (null != inStream) { + inStream.close(); + } + } catch (IOException e) { + logger.error("ExportServiceImpl.exportLocalFile{}", e); + } + if (null != data.getOut()) { + try { + data.getOut().close(); + } catch (IOException e) { + logger.error("ExportServiceImpl.exportLocalFile{}", e); + } + } + } + } +} diff --git a/fuint-framework/src/main/java/com/fuint/framework/web/BaseController.java b/fuint-framework/src/main/java/com/fuint/framework/web/BaseController.java new file mode 100644 index 0000000..de3a6cb --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/web/BaseController.java @@ -0,0 +1,78 @@ +package com.fuint.framework.web; + +import com.fuint.framework.FrameworkConstants; +import com.fuint.utils.PropertiesUtil; + +/** + * 控制器基类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class BaseController { + + /** + * 获取成功返回结果 + * + * @param data + * @return + */ + public ResponseObject getSuccessResult(Object data) { + return new ResponseObject(FrameworkConstants.HTTP_RESPONSE_CODE_SUCCESS, "操作成功", data); + } + + /** + * 获取成功返回结果 + * + * @param message + * @param data + * @return + */ + public ResponseObject getSuccessResult(String message, Object data) { + return new ResponseObject(FrameworkConstants.HTTP_RESPONSE_CODE_SUCCESS, message, data); + } + + /** + * 获取成功返回结果 + * + * @param code + * @param message + * @param data + * @return + */ + public ResponseObject getSuccessResult(int code, String message, Object data) { + return new ResponseObject(code, message, data); + } + + /** + * 获取错返回结果(无参数替换) + * + * @param errorCode + * @return + */ + public ResponseObject getFailureResult(int errorCode) { + return new ResponseObject(errorCode, PropertiesUtil.getResponseErrorMessageByCode(errorCode), null); + } + + /** + * 获取错返回结果(带参数替换) + * + * @param errorCode + * @param message + * @return + */ + public ResponseObject getFailureResult(int errorCode, String message) { + return new ResponseObject(errorCode, message, null); + } + + /** + * 获取错返回结果(带参数替换) + * + * @param errorCode + * @param message + * @return + */ + public ResponseObject getFailureResult(int errorCode, String message, Object data) { + return new ResponseObject(errorCode, message, data); + } +} \ No newline at end of file diff --git a/fuint-framework/src/main/java/com/fuint/framework/web/ResponseObject.java b/fuint-framework/src/main/java/com/fuint/framework/web/ResponseObject.java new file mode 100644 index 0000000..1411364 --- /dev/null +++ b/fuint-framework/src/main/java/com/fuint/framework/web/ResponseObject.java @@ -0,0 +1,55 @@ +package com.fuint.framework.web; + +/** + * 返回数据结构 + * + * Created by FSQ + * + * CopyRight https://www.fuint.cn + */ +public class ResponseObject { + + private Integer code; + private String message; + private Object data; + + public ResponseObject(Integer code, String message, Object data) { + this.code = code; + this.message = message; + this.data = data; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String msg) { + this.message = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ResponseObject{"); + sb.append("code=").append(code); + sb.append(", message='").append(message).append('\''); + sb.append(", data=").append(data); + sb.append('}'); + return sb.toString(); + } +} diff --git a/fuint-repository/pom.xml b/fuint-repository/pom.xml new file mode 100644 index 0000000..cf2e27b --- /dev/null +++ b/fuint-repository/pom.xml @@ -0,0 +1,30 @@ + + + + fuint + com.fuint + 1.0.0 + + 4.0.0 + + fuint-repository + 1.0.0 + jar + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/fuint-repository/src/main/java/com/fuint/repository/base/MyMapper.java b/fuint-repository/src/main/java/com/fuint/repository/base/MyMapper.java new file mode 100644 index 0000000..a72d562 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/base/MyMapper.java @@ -0,0 +1,11 @@ +package com.fuint.repository.base; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MyMapper extends BaseMapper { + // empty +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/ColumnBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/ColumnBean.java new file mode 100644 index 0000000..f7d82b1 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/ColumnBean.java @@ -0,0 +1,28 @@ +package com.fuint.repository.bean; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +/** + * 表结构字段实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class ColumnBean implements Serializable { + + @ApiModelProperty("字段名称") + private String field; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("是否为空") + private String isNull; + + @ApiModelProperty("备注信息") + private String comment; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/CouponNumBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/CouponNumBean.java new file mode 100644 index 0000000..864c80a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/CouponNumBean.java @@ -0,0 +1,26 @@ +package com.fuint.repository.bean; + +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 卡券数量对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@ApiModel(value = "卡券数量对象", description = "卡券数量对象") +public class CouponNumBean implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("数量") + private Long num; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/GoodsBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/GoodsBean.java new file mode 100644 index 0000000..7ca0b54 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/GoodsBean.java @@ -0,0 +1,54 @@ +package com.fuint.repository.bean; + +import java.io.Serializable; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@ApiModel(value = "商品对象", description = "商品对象") +public class GoodsBean implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品图片") + private String logo; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("商品编码") + private String goodsNo; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品价格") + private BigDecimal price; + + @ApiModelProperty("商品库存") + private Double stock; + + @ApiModelProperty("商品规格") + private String specIds; + + @ApiModelProperty("sku价格") + private String skuPrice; + + @ApiModelProperty("sk库存") + private Integer skuStock; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/GoodsTopBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/GoodsTopBean.java new file mode 100644 index 0000000..7c6619b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/GoodsTopBean.java @@ -0,0 +1,52 @@ +package com.fuint.repository.bean; + +import java.io.Serializable; +import java.math.BigDecimal; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品排行对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@ApiModel(value = "商品排行对象", description = "商品排行对象") +public class GoodsTopBean implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 商品ID + */ + @ApiModelProperty("商品ID") + private Integer id; + + /** + * 商品名称 + */ + @ApiModelProperty("商品名称") + private String name; + + /** + * 商品条码 + */ + @ApiModelProperty("商品条码") + private String goodsNo; + + /** + * 销售金额 + */ + @ApiModelProperty("销售金额") + private BigDecimal amount; + + /** + * 销售数量 + */ + @ApiModelProperty("销售数量") + private Integer num; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/MemberTopBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/MemberTopBean.java new file mode 100644 index 0000000..98a8fd7 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/MemberTopBean.java @@ -0,0 +1,50 @@ +package com.fuint.repository.bean; + +import java.io.Serializable; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员排行对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@ApiModel(value = "会员排行对象", description = "会员排行对象") +public class MemberTopBean implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 会员ID + */ + @ApiModelProperty("卡券ID") + private Integer id; + + /** + * 会员名称 + */ + @ApiModelProperty("卡券ID") + private String name; + + /** + * 会员号 + */ + @ApiModelProperty("卡券ID") + private String userNo; + + /** + * 消费金额 + */ + @ApiModelProperty("卡券ID") + private BigDecimal amount; + + /** + * 购买数量 + */ + private Integer num; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/StoreDistanceBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/StoreDistanceBean.java new file mode 100644 index 0000000..6ac82c4 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/StoreDistanceBean.java @@ -0,0 +1,26 @@ +package com.fuint.repository.bean; + +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺距离对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@ApiModel(value = "店铺距离对象", description = "店铺距离对象") +public class StoreDistanceBean implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("店铺ID") + private Integer id; + + @ApiModelProperty("数量") + private String distance; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/bean/UploadShippingLogBean.java b/fuint-repository/src/main/java/com/fuint/repository/bean/UploadShippingLogBean.java new file mode 100644 index 0000000..7049ee2 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/bean/UploadShippingLogBean.java @@ -0,0 +1,38 @@ +package com.fuint.repository.bean; + +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 微信小程序上传发货信息对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@ApiModel(value = "微信小程序上传发货信息对象", description = "微信小程序上传发货信息对象") +public class UploadShippingLogBean implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单ID + */ + @ApiModelProperty("订单ID") + private Integer id; + + /** + * 订单号 + */ + @ApiModelProperty("订单号") + private String orderSn; + + /** + * 状态 + */ + @ApiModelProperty("上传状态,A成功;B失败") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtAddressMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtAddressMapper.java new file mode 100644 index 0000000..8fca2f0 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtAddressMapper.java @@ -0,0 +1,15 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtAddress; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * 会员地址 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtAddressMapper extends BaseMapper { + int setDefault(@Param("userId") Integer userId, @Param("addressId") Integer addressId); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtArticleMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtArticleMapper.java new file mode 100644 index 0000000..3ffb261 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtArticleMapper.java @@ -0,0 +1,15 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtArticle; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * 文章 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtArticleMapper extends BaseMapper { + void increaseClick(@Param("articleId") Integer articleId); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBalanceMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBalanceMapper.java new file mode 100644 index 0000000..8087368 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBalanceMapper.java @@ -0,0 +1,18 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtBalance; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 余额变化表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtBalanceMapper extends BaseMapper { + + List getBalanceListByOrderSn(@Param("orderSn") String orderSn); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBannerMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBannerMapper.java new file mode 100644 index 0000000..e20baa4 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBannerMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtBanner; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * banner Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtBannerMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookCateMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookCateMapper.java new file mode 100644 index 0000000..7bdbd4b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookCateMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtBookCate; + +/** + * 预约分类 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtBookCateMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookItemMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookItemMapper.java new file mode 100644 index 0000000..6dc9b94 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookItemMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtBookItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 预约订单 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtBookItemMapper extends BaseMapper { + + List getBookList(@Param("bookId") Integer bookId, @Param("date") String date, @Param("time") String time); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookMapper.java new file mode 100644 index 0000000..1ebda99 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtBookMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtBook; + +/** + * 预约 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtBookMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCartMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCartMapper.java new file mode 100644 index 0000000..36a00a3 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCartMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtCart; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * 购物车 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCartMapper extends BaseMapper { + + void deleteCartItem(@Param("userId") Integer userId, @Param("goodsId") Integer goodsId, @Param("skuId") Integer skuId); + + void clearCart(@Param("userId") Integer userId); + + void deleteCartByHangNo(@Param("hangNo") String hangNo); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionCashMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionCashMapper.java new file mode 100644 index 0000000..0b45118 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionCashMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtCommissionCash; +import org.apache.ibatis.annotations.Param; + +/** + * 提现记录 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCommissionCashMapper extends BaseMapper { + + Boolean confirmCommissionCash(@Param("merchantId") Integer merchantId, @Param("uuid") String uuid, @Param("operator") String operator); + + Boolean cancelCommissionCash(@Param("merchantId") Integer merchantId, @Param("uuid") String uuid, @Param("operator") String operator); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionLogMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionLogMapper.java new file mode 100644 index 0000000..6024ccc --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionLogMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtCommissionLog; +import org.apache.ibatis.annotations.Param; + +/** + * 佣金记录 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCommissionLogMapper extends BaseMapper { + + Boolean confirmCommissionLog(@Param("merchantId") Integer merchantId, @Param("uuid") String uuid, @Param("operator") String operator); + + Boolean cancelCommissionLog(@Param("merchantId") Integer merchantId, @Param("uuid") String uuid, @Param("operator") String operator); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRelationMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRelationMapper.java new file mode 100644 index 0000000..aa83c2c --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRelationMapper.java @@ -0,0 +1,17 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtCommissionRelation; +import org.apache.ibatis.annotations.Param; + +/** + * 会员分销关系 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCommissionRelationMapper extends BaseMapper { + + Integer getCommissionUserId(@Param("merchantId") Integer merchantId, @Param("userId") Integer userId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleItemMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleItemMapper.java new file mode 100644 index 0000000..db8a952 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleItemMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtCommissionRuleItem; +import org.apache.ibatis.annotations.Param; +import java.util.Date; +import java.util.List; + +/** + * 分佣提成规则项目 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCommissionRuleItemMapper extends BaseMapper { + + Boolean deleteByRuleId(@Param("ruleId") Integer ruleId, @Param("updateTime") Date updateTime); + + List getEffectiveCommissionList(@Param("merchantId") Integer merchantId, @Param("targetId") Integer targetId, @Param("type") String type); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleMapper.java new file mode 100644 index 0000000..9e84b7b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCommissionRuleMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtCommissionRule; + +/** + * 方案规则 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCommissionRuleMapper extends BaseMapper { + // empty +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtConfirmLogMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtConfirmLogMapper.java new file mode 100644 index 0000000..7687d85 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtConfirmLogMapper.java @@ -0,0 +1,23 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtConfirmLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.Date; +import java.util.List; + +/** + * 核销记录表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtConfirmLogMapper extends BaseMapper { + + Long getConfirmNum(@Param("userCouponId") Integer userCouponId); + + Long getConfirmLogCount(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + List getOrderConfirmLogList(@Param("orderId") Integer orderId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGoodsMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGoodsMapper.java new file mode 100644 index 0000000..1d4e9ee --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGoodsMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtCouponGoods; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 卡券商品表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCouponGoodsMapper extends BaseMapper { + + List getCouponGoods(@Param("couponId") Integer couponId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGroupMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGroupMapper.java new file mode 100644 index 0000000..0e711fd --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponGroupMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtCouponGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 优惠券组 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCouponGroupMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponMapper.java new file mode 100644 index 0000000..f258e8d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtCouponMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtCoupon; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 卡券信息表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtCouponMapper extends BaseMapper { + + Long queryNumByGroupId(@Param("groupId") Integer groupId); + + List queryByGroupId(@Param("groupId") Integer groupId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveItemMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveItemMapper.java new file mode 100644 index 0000000..2c045d4 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveItemMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtGiveItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 转赠明细表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGiveItemMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveMapper.java new file mode 100644 index 0000000..86015a0 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGiveMapper.java @@ -0,0 +1,20 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtGive; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 转赠记录表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGiveMapper extends BaseMapper { + + List queryForUnique(@Param("userId") Integer userId, @Param("giveUserId") Integer giveUserId, @Param("couponIds") String couponIds, @Param("createTime") Date createTime); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsCateMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsCateMapper.java new file mode 100644 index 0000000..044c1a7 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsCateMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtGoodsCate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 商品分类 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGoodsCateMapper extends BaseMapper { + // empty +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsMapper.java new file mode 100644 index 0000000..53a4fe2 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsMapper.java @@ -0,0 +1,35 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.bean.GoodsBean; +import com.fuint.repository.bean.GoodsTopBean; +import com.fuint.repository.model.MtGoods; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.Date; +import java.util.List; + +/** + * 商品 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGoodsMapper extends BaseMapper { + + List getStoreGoodsList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("cateId") Integer cateId, @Param("platform") String platform); + + List searchStoreGoodsList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("keyword") String keyword, @Param("platform") String platform); + + MtGoods getByGoodsNo(@Param("merchantId") Integer merchantId, @Param("goodsNo") String goodsNo); + + List getByGoodsName(@Param("merchantId") Integer merchantId, @Param("goodsName") String goodsName); + + Boolean updateInitSale(@Param("goodsId") Integer goodsId, @Param("saleNum") Double saleNum); + + List selectGoodsList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("cateId") Integer cateId, @Param("keyword") String keyword); + + List getGoodsSaleTopList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + void removeMerchantGoods(@Param("merchantId") Integer merchantId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSkuMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSkuMapper.java new file mode 100644 index 0000000..132d649 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSkuMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtGoodsSku; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品SKU表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGoodsSkuMapper extends BaseMapper { + + List getBySkuNo(@Param("skuNo") String skuNo); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSpecMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSpecMapper.java new file mode 100644 index 0000000..985701e --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGoodsSpecMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtGoodsSpec; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 规格表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGoodsSpecMapper extends BaseMapper { + + List getGoodsSpecCountList(@Param("goodsId") Integer goodsId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtInvoiceMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtInvoiceMapper.java new file mode 100644 index 0000000..6f2088a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtInvoiceMapper.java @@ -0,0 +1,20 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtInvoice; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 发票 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtInvoiceMapper extends BaseMapper { + + BigDecimal getInvoiceTotalAmount(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtMerchantMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtMerchantMapper.java new file mode 100644 index 0000000..454a80a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtMerchantMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtMerchant; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * 商户表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtMerchantMapper extends BaseMapper { + + MtMerchant queryMerchantByName(@Param("name") String name); + + MtMerchant queryMerchantByNo(@Param("merchantNo") String merchantNo); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtMessageMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtMessageMapper.java new file mode 100644 index 0000000..f3ae0f1 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtMessageMapper.java @@ -0,0 +1,20 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 消息 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtMessageMapper extends BaseMapper { + + List findNewMessage(@Param("userId") Integer userId, @Param("type") String type); + + List findNeedSendMessage(@Param("type") String type); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftItemMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftItemMapper.java new file mode 100644 index 0000000..9ee2a5d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftItemMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtOpenGiftItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 开卡赠礼明细表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtOpenGiftItemMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftMapper.java new file mode 100644 index 0000000..8b6e3d0 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOpenGiftMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtOpenGift; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 会员开卡赠礼 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtOpenGiftMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderAddressMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderAddressMapper.java new file mode 100644 index 0000000..80761c0 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderAddressMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtOrderAddress; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单收货地址记录表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtOrderAddressMapper extends BaseMapper { + + List getOrderAddress(@Param("orderId") Integer orderId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderGoodsMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderGoodsMapper.java new file mode 100644 index 0000000..4574f7a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderGoodsMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtOrderGoods; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 订单商品表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtOrderGoodsMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java new file mode 100644 index 0000000..21c12a4 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java @@ -0,0 +1,46 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtOrder; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 订单表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtOrderMapper extends BaseMapper { + + BigDecimal getOrderCount(@Param("merchantId") Integer merchantId); + + BigDecimal getStoreOrderCount(@Param("storeId") Integer storeId); + + BigDecimal getOrderCountByTime(@Param("merchantId") Integer merchantId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + BigDecimal getStoreOrderCountByTime(@Param("storeId") Integer storeId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + MtOrder findByOrderSn(@Param("orderSn") String orderSn); + + BigDecimal getPayMoney(@Param("merchantId") Integer merchantId); + + BigDecimal getPayMoneyByTime(@Param("merchantId") Integer merchantId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + BigDecimal getStorePayMoneyByTime(@Param("storeId") Integer storeId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + BigDecimal getStorePayMoney(@Param("storeId") Integer storeId); + + Integer getPayUserCount(@Param("merchantId") Integer merchantId); + + Integer getStorePayUserCount(@Param("storeId") Integer storeId); + + BigDecimal getUserPayMoney(@Param("userId") Integer userId); + + Integer getUserPayOrderCount(@Param("userId") Integer userId); + + List getTobeCommissionOrderList(@Param("dateTime") String dateTime); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtPointMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtPointMapper.java new file mode 100644 index 0000000..ea5e942 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtPointMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtPoint; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 积分变化表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtPointMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtPrinterMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtPrinterMapper.java new file mode 100644 index 0000000..db4ac7b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtPrinterMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtPrinter; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 打印机 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtPrinterMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRefundMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRefundMapper.java new file mode 100644 index 0000000..8bd4c7e --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRefundMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtRefund; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; + +/** + * 售后表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtRefundMapper extends BaseMapper { + + Long getRefundCount(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + MtRefund findByOrderId(@Param("orderId") Integer orderId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRegionMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRegionMapper.java new file mode 100644 index 0000000..7052901 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRegionMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtRegion; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 省市区数据表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtRegionMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSendLogMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSendLogMapper.java new file mode 100644 index 0000000..3f93c7b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSendLogMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtSendLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * 卡券发放记录表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtSendLogMapper extends BaseMapper { + + Integer updateForRemove(@Param("uuid") String uuid, @Param("status") String status, @Param("removeSuccessNum") Integer removeSuccessNum, @Param("removeFailNum") Integer removeFailNum); + + Integer updateSingleForRemove(@Param("uuid") String uuid, @Param("status") String status); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettingMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettingMapper.java new file mode 100644 index 0000000..5ec9506 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettingMapper.java @@ -0,0 +1,20 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtSetting; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 全局设置表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtSettingMapper extends BaseMapper { + + List querySettingByType(@Param("merchantId") Integer merchantId, @Param("type") String type); + + MtSetting querySettingByName(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("type") String type, @Param("name") String name); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementMapper.java new file mode 100644 index 0000000..9299810 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtSettlement; + +/** + * 结算表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtSettlementMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementOrderMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementOrderMapper.java new file mode 100644 index 0000000..7ef9032 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementOrderMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtSettlementOrder; + +/** + * 结算订单表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtSettlementOrderMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsSendedLogMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsSendedLogMapper.java new file mode 100644 index 0000000..a916a08 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsSendedLogMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtSmsSendedLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 短信发送记录表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtSmsSendedLogMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsTemplateMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsTemplateMapper.java new file mode 100644 index 0000000..7249af9 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtSmsTemplateMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtSmsTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 短信模板 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtSmsTemplateMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStaffMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStaffMapper.java new file mode 100644 index 0000000..70599dc --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStaffMapper.java @@ -0,0 +1,22 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtStaff; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; + +/** + * 店铺员工表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtStaffMapper extends BaseMapper { + + int updateStatus(@Param("id") Integer id, @Param("status") String status, @Param("updateTime") Date updateTime); + + MtStaff queryStaffByMobile(@Param("mobile") String mobile); + + MtStaff queryStaffByUserId(@Param("userId") Integer userId); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockItemMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockItemMapper.java new file mode 100644 index 0000000..5eee1c8 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockItemMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtStockItem; + +/** + * 库存管理明细表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtStockItemMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockMapper.java new file mode 100644 index 0000000..fed34f8 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStockMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtStock; + +/** + * 库存管理记录表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtStockMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreGoodsMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreGoodsMapper.java new file mode 100644 index 0000000..0e49b31 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreGoodsMapper.java @@ -0,0 +1,17 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtStoreGoods; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * 店铺商品 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtStoreGoodsMapper extends BaseMapper { + + void removeStoreGoods(@Param("storeId") Integer storeId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreMapper.java new file mode 100644 index 0000000..de8dc3d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtStoreMapper.java @@ -0,0 +1,30 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.bean.StoreDistanceBean; +import com.fuint.repository.model.MtStore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 店铺表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtStoreMapper extends BaseMapper { + + MtStore queryStoreByName(@Param("name") String name); + + void resetDefaultStore(@Param("merchantId") Integer merchantId); + + List findStoresByIds(@Param("ids") List ids); + + List queryByDistance(@Param("merchantId") Integer merchantId, @Param("keyword") String keyword, @Param("latitude") String latitude, @Param("longitude") String longitude); + + void deleteStoreByMerchant(@Param("merchantId") Integer merchantId); + + List getMyStoreList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("status") String status); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUploadShippingLogMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUploadShippingLogMapper.java new file mode 100644 index 0000000..1358af4 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUploadShippingLogMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.bean.UploadShippingLogBean; +import com.fuint.repository.model.MtUploadShippingLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 微信小程序上传发货信息 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtUploadShippingLogMapper extends BaseMapper { + + List getUploadShippingLogList(@Param("merchantId") Integer merchantId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserActionMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserActionMapper.java new file mode 100644 index 0000000..e3434b0 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserActionMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtUserAction; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; + +/** + * 会员行为 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtUserActionMapper extends BaseMapper { + + Long getActiveUserCount(@Param("merchantId") Integer merchantId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + Long getStoreActiveUserCount(@Param("storeId") Integer storeId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserCouponMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserCouponMapper.java new file mode 100644 index 0000000..6c17754 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserCouponMapper.java @@ -0,0 +1,42 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.bean.CouponNumBean; +import com.fuint.repository.model.MtUserCoupon; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 会员卡券表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtUserCouponMapper extends BaseMapper { + + Boolean updateExpireTime(@Param("couponId") Integer couponId, @Param("expireTime") String expireTime); + + Long getSendNum(@Param("couponId") Integer couponId); + + CouponNumBean getPeopleNumByCouponId(@Param("couponId") Integer couponId); + + List getUserCouponList(@Param("userId") Integer userId, @Param("statusList") List statusList); + + List getUserCouponListByCouponId(@Param("userId") Integer userId, @Param("couponId") Integer couponId ,@Param("statusList") List statusList); + + MtUserCoupon findByCode(@Param("code") String code); + + int removeUserCoupon(@Param("uuid") String uuid, @Param("couponIds") List couponIds, @Param("operator") String operator); + + List queryExpireNumByGroupId(@Param("groupId") Integer groupId); + + List getCouponIdsByUuid(@Param("uuid") String uuid); + + List findUserCouponDetail(@Param("couponId") Integer couponId, @Param("userId") Integer userId); + + List getUserCouponListByExpireTime(@Param("userId") Integer userId, @Param("status") String status, @Param("startTime") String startTime, @Param("endTime") String endTime); + + Boolean removeUserCouponByCouponId(@Param("couponId") Integer couponId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGradeMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGradeMapper.java new file mode 100644 index 0000000..6b3deac --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGradeMapper.java @@ -0,0 +1,19 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtUserGrade; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtUserGradeMapper extends BaseMapper { + + List getMerchantGradeList(@Param("merchantId") Integer merchantId, @Param("status") String status); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGroupMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGroupMapper.java new file mode 100644 index 0000000..c26f49a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserGroupMapper.java @@ -0,0 +1,17 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtUserGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 会员分组 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtUserGroupMapper extends BaseMapper { + Long getMemberNum(@Param("groupIds") List groupIds); +} \ No newline at end of file diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserMapper.java new file mode 100644 index 0000000..31d5f04 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtUserMapper.java @@ -0,0 +1,48 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.bean.MemberTopBean; +import com.fuint.repository.model.MtUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 会员个人信息 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtUserMapper extends BaseMapper { + + List queryMemberByMobile(@Param("merchantId") Integer merchantId, @Param("mobile") String mobile); + + List queryMemberByName(@Param("merchantId") Integer merchantId, @Param("name") String name); + + MtUser queryMemberByOpenId(@Param("merchantId") Integer merchantId, @Param("openId") String openId); + + List findMembersByUserNo(@Param("merchantId") Integer merchantId, @Param("userNo") String userNo); + + void updateActiveTime(@Param("userId") Integer userId, @Param("updateTime") Date updateTime); + + void updateUserBalance(@Param("merchantId") Integer merchantId, @Param("userIds") List userIds, @Param("amount") BigDecimal amount); + + void resetMobile(@Param("merchantId") Integer merchantId, @Param("mobile") String mobile, @Param("userId") Integer userId); + + Long getUserCount(@Param("merchantId") Integer merchantId); + + Long getStoreUserCount(@Param("storeId") Integer storeId); + + Long getUserCountByTime(@Param("merchantId") Integer merchantId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + Long getStoreUserCountByTime(@Param("storeId") Integer storeId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime); + + List getMemberConsumeTopList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + List getUserIdList(@Param("merchantId") Integer merchantId, @Param("storeId") Integer storeId); + + List searchMembers(@Param("merchantId") Integer merchantId, @Param("keyword") String keyword); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtVerifyCodeMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtVerifyCodeMapper.java new file mode 100644 index 0000000..8480250 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtVerifyCodeMapper.java @@ -0,0 +1,22 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.MtVerifyCode; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 短信验证码表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtVerifyCodeMapper extends BaseMapper { + + MtVerifyCode queryByMobileVerifyCode(@Param("mobile") String mobile, @Param("verifyCode") String verifyCode, @Param("queryTime") Date queryTime); + + List queryVerifyCodeLastRecord(@Param("mobile") String mobile); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountDutyMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountDutyMapper.java new file mode 100644 index 0000000..96ba839 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountDutyMapper.java @@ -0,0 +1,20 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.TAccountDuty; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * 后台账号角色 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TAccountDutyMapper extends BaseMapper { + + List getDutyIdsByAccountId(Integer accountId); + + void deleteDutiesByAccountId(long accountId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountMapper.java new file mode 100644 index 0000000..287a6e6 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TAccountMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.TAccount; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 后台账号 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TAccountMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TActionLogMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TActionLogMapper.java new file mode 100644 index 0000000..5f8c669 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TActionLogMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.TActionLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 操作日志 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TActionLogMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TDutyMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TDutyMapper.java new file mode 100644 index 0000000..ba88b08 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TDutyMapper.java @@ -0,0 +1,23 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.TDuty; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 角色表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TDutyMapper extends BaseMapper { + + List findByStatus(@Param("merchantId") Integer merchantId, @Param("status") String status); + + List findByIdIn(@Param("ids") List ids); + + TDuty findByName(@Param("merchantId") Integer merchantId, @Param("name") String name); + + List getRoleIdsByAccountId(@Param("accountId") Integer accountId); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TDutySourceMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TDutySourceMapper.java new file mode 100644 index 0000000..c7184f7 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TDutySourceMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.TDutySource; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色菜单 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TDutySourceMapper extends BaseMapper { + + void deleteSourcesByDutyId(@Param("dutyId") Integer dutyId); + + List findSourceIdsByDutyId(@Param("dutyId") Integer dutyId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TGenCodeMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TGenCodeMapper.java new file mode 100644 index 0000000..af554ae --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TGenCodeMapper.java @@ -0,0 +1,21 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.bean.ColumnBean; +import com.fuint.repository.model.TGenCode; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 代码生成 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TGenCodeMapper extends BaseMapper { + + TGenCode findGenCodeByTableName(@Param("tableName") String tableName); + + List getTableColumnList(@Param("tableName") String tableName); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TPlatformMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TPlatformMapper.java new file mode 100644 index 0000000..3d99a0f --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TPlatformMapper.java @@ -0,0 +1,14 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.TPlatform; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 系统平台 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TPlatformMapper extends BaseMapper { + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/TSourceMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/TSourceMapper.java new file mode 100644 index 0000000..3216d87 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/TSourceMapper.java @@ -0,0 +1,22 @@ +package com.fuint.repository.mapper; + +import com.fuint.repository.model.TSource; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 后台菜单 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface TSourceMapper extends BaseMapper { + + List findSourcesByAccountId(@Param("merchantId") Integer merchantId, @Param("accountId") Integer accountId); + + List findByIdIn(@Param("ids") List ids); + + List findByStatus(@Param("merchantId") Integer merchantId, @Param("status") String status); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtAddress.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtAddress.java new file mode 100644 index 0000000..0f15c97 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtAddress.java @@ -0,0 +1,62 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员地址表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_address") +@ApiModel(value = "MtAddress对象", description = "会员地址表") +public class MtAddress implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("收货人姓名") + private String name; + + @ApiModelProperty("收货手机号") + private String mobile; + + @ApiModelProperty("省份ID") + private Integer provinceId; + + @ApiModelProperty("城市ID") + private Integer cityId; + + @ApiModelProperty("区/县ID") + private Integer regionId; + + @ApiModelProperty("详细地址") + private String detail; + + @ApiModelProperty("是否默认") + private String isDefault; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtArticle.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtArticle.java new file mode 100644 index 0000000..235d54f --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtArticle.java @@ -0,0 +1,68 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 文章 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_article") +@ApiModel(value = "MtArticle对象", description = "MtArticle对象") +public class MtArticle implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("简介") + private String brief; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("链接地址") + private String url; + + @ApiModelProperty("图片地址") + private String image; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("点击数") + private Long click; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;N:禁用;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtBalance.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtBalance.java new file mode 100644 index 0000000..f3e703c --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtBalance.java @@ -0,0 +1,63 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 余额变化表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_balance") +@ApiModel(value = "MtBalance对象", description = "余额变化表") +public class MtBalance implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("余额变化数量") + private BigDecimal amount; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtBanner.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtBanner.java new file mode 100644 index 0000000..a7e8072 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtBanner.java @@ -0,0 +1,62 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 首页banner + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_banner") +@ApiModel(value = "MtBanner对象", description = "MtBanner表对象") +public class MtBanner implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("链接地址") + private String url; + + @ApiModelProperty("图片地址") + private String image; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtBook.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtBook.java new file mode 100644 index 0000000..de82d64 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtBook.java @@ -0,0 +1,77 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 预约实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_book") +@ApiModel(value = "MtBook对象", description = "MtBook表对象") +public class MtBook implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("预约名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("预约类型") + private String type; + + @ApiModelProperty("图片地址") + private String logo; + + @ApiModelProperty("关联商品ID") + private Integer goodsId; + + @ApiModelProperty("类别ID") + private Integer cateId; + + @ApiModelProperty("可预约日期") + private String serviceDates; + + @ApiModelProperty("可预约时间段") + private String serviceTimes; + + @ApiModelProperty("可预约员工ID") + private String serviceStaffIds; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtBookCate.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtBookCate.java new file mode 100644 index 0000000..1710612 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtBookCate.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 预约分类实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_book_cate") +@ApiModel(value = "MtBookCate对象", description = "MtBookCate表对象") +public class MtBookCate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("分类名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("图片地址") + private String logo; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtBookItem.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtBookItem.java new file mode 100644 index 0000000..0e0e7d2 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtBookItem.java @@ -0,0 +1,80 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 预约订单实体 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_book_item") +@ApiModel(value = "MtBookItem对象", description = "MtBookItem表对象") +public class MtBookItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("预约分类ID") + private Integer cateId; + + @ApiModelProperty("预约ID") + private Integer bookId; + + @ApiModelProperty("预约用户ID") + private Integer userId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("核销码") + private String verifyCode; + + @ApiModelProperty("预约联系人") + private String contact; + + @ApiModelProperty("预约手机号") + private String mobile; + + @ApiModelProperty("预约日期") + private String serviceDate; + + @ApiModelProperty("预约时间段") + private String serviceTime; + + @ApiModelProperty("预约备注") + private String remark; + + @ApiModelProperty("预约员工ID") + private Integer serviceStaffId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("A:已提交;B:审核通过;C:审核未通过;D:删除;E:已完成") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCart.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCart.java new file mode 100644 index 0000000..ca0ae63 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCart.java @@ -0,0 +1,61 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 购物车 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_cart") +@ApiModel(value = "MtCart对象", description = "购物车对象") +public class MtCart implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("是否游客") + private String isVisitor; + + @ApiModelProperty("挂单号") + private String hangNo; + + @ApiModelProperty("skuID") + private Integer skuId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("数量") + private Double num; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionCash.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionCash.java new file mode 100644 index 0000000..5abac08 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionCash.java @@ -0,0 +1,66 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 分佣提现记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_commission_cash") +@ApiModel(value = "MtCommissionCash对象", description = "分佣提现记录表") +public class MtCommissionCash implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("结算单号") + private String settleNo; + + @ApiModelProperty("结算uuid") + private String uuid; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("员工ID") + private Integer staffId; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionLog.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionLog.java new file mode 100644 index 0000000..926054d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionLog.java @@ -0,0 +1,90 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 佣金记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_commission_log") +@ApiModel(value = "MtCommissionLog对象", description = "佣金记录表") +public class MtCommissionLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("分佣对象,member:会员分销;staff:员工提成") + private String target; + + @ApiModelProperty("分佣类型") + private String type; + + @ApiModelProperty("分佣等级") + private Integer level; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("员工ID") + private Integer staffId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("分佣金额") + private BigDecimal amount; + + @ApiModelProperty("规则ID") + private Integer ruleId; + + @ApiModelProperty("规则项ID") + private Integer ruleItemId; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("结算uuid") + private String settleUuid; + + @ApiModelProperty("提现记录ID") + private Integer cashId; + + @ApiModelProperty("最后操作人") + private String isCash; + + @ApiModelProperty("提现时间") + private Date cashTime; + + @ApiModelProperty("是否提现") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A:待结算;B:已结算;C:已作废") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRelation.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRelation.java new file mode 100644 index 0000000..aa0ecd2 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRelation.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员分销关系表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_commission_relation") +@ApiModel(value = "MtCommissionRelation对象", description = "会员分销关系表") +public class MtCommissionRelation implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("邀请码") + private String inviteCode; + + @ApiModelProperty("被邀请会员ID") + private Integer subUserId; + + @ApiModelProperty("等级") + private Integer level; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRule.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRule.java new file mode 100644 index 0000000..24c0efc --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRule.java @@ -0,0 +1,62 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 分佣提成规则表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_commission_rule") +@ApiModel(value = "MtCommissionRule对象", description = "分佣提成规则表") +public class MtCommissionRule implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("规则名称") + private String name; + + @ApiModelProperty("方案类型,goods:商品销售;coupon:卡券销售;recharge:会员充值") + private String type; + + @ApiModelProperty("分佣对象,member:会员分销;staff:员工提成") + private String target; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("适用店铺ID,逗号隔开") + private String storeIds; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRuleItem.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRuleItem.java new file mode 100644 index 0000000..592dc70 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCommissionRuleItem.java @@ -0,0 +1,80 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + * 分佣提成规则项目表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_commission_rule_item") +@ApiModel(value = "MtCommissionRuleItem对象", description = "分佣提成规则项目表") +public class MtCommissionRuleItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("方案类型,goods:商品销售;coupon:卡券销售;recharge:会员充值") + private String type; + + @ApiModelProperty("分佣对象,member:会员分销;staff:员工提成") + private String target; + + @ApiModelProperty("规则ID") + private Integer ruleId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("分佣对象ID") + private Integer targetId; + + @ApiModelProperty("提成方式(按比例/固定金额)") + private String method; + + @ApiModelProperty("适用店铺ID,逗号隔开") + private String storeIds; + + @ApiModelProperty("散客佣金") + private BigDecimal guest; + + @ApiModelProperty("二级散客佣金") + private BigDecimal subGuest; + + @ApiModelProperty("会员佣金") + private BigDecimal member; + + @ApiModelProperty("二级会员佣金") + private BigDecimal subMember; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtConfirmLog.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtConfirmLog.java new file mode 100644 index 0000000..44e5c2d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtConfirmLog.java @@ -0,0 +1,79 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 核销记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_confirm_log") +@ApiModel(value = "MtConfirmLog对象", description = "核销记录表") +public class MtConfirmLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("核销金额") + private BigDecimal amount; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("用户券ID") + private Integer userCouponId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("卡券所属用户ID") + private Integer userId; + + @ApiModelProperty("核销者用户ID") + private Integer operatorUserId; + + @ApiModelProperty("核销店铺ID") + private Integer storeId; + + @ApiModelProperty("状态,A正常核销;D:撤销使用") + private String status; + + @ApiModelProperty("撤销时间") + private Date cancelTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("操作来源user_id对应表t_account 还是 mt_user") + private String operatorFrom; + + @ApiModelProperty("备注信息") + private String remark; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCoupon.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCoupon.java new file mode 100644 index 0000000..0f77be9 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCoupon.java @@ -0,0 +1,127 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 卡券信息表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_coupon") +@ApiModel(value = "MtCoupon对象", description = "卡券信息表") +public class MtCoupon implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("券组ID") + private Integer groupId; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("券类型,C优惠券;P储值卡;T计次卡") + private String type; + + @ApiModelProperty("券内容,如:0表示满减券、1表示折扣券") + private Integer content; + + @ApiModelProperty("券名称") + private String name; + + @ApiModelProperty("是否允许转赠") + private Boolean isGive; + + @ApiModelProperty("获得卡券所消耗积分") + private Integer point; + + @ApiModelProperty("适用商品:allGoods、parkGoods") + private String applyGoods; + + @ApiModelProperty("领取码") + private String receiveCode; + + @ApiModelProperty("使用专项") + private String useFor; + + @ApiModelProperty("过期类型") + private String expireType; + + @ApiModelProperty("有效天数") + private Integer expireTime; + + @ApiModelProperty("开始有效期") + private Date beginTime; + + @ApiModelProperty("结束有效期") + private Date endTime; + + @ApiModelProperty("面额") + private BigDecimal amount; + + @ApiModelProperty("发放方式") + private String sendWay; + + @ApiModelProperty("每次发放数量") + private Integer sendNum; + + @ApiModelProperty("发行数量") + private Integer total; + + @ApiModelProperty("每人拥有数量限制") + private Integer limitNum; + + @ApiModelProperty("不可用日期,逗号隔开。周末:weekend;其他:2019-01-02_2019-02-09") + private String exceptTime; + + @ApiModelProperty("适用店铺ID,逗号隔开") + private String storeIds; + + @ApiModelProperty("适用会员等级,逗号隔开") + private String gradeIds; + + @ApiModelProperty("描述信息") + private String description; + + @ApiModelProperty("效果图片") + private String image; + + @ApiModelProperty("后台备注") + private String remarks; + + @ApiModelProperty("获取券的规则") + private String inRule; + + @ApiModelProperty("核销券的规则") + private String outRule; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("A:正常;D:删除") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGoods.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGoods.java new file mode 100644 index 0000000..4aebca1 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGoods.java @@ -0,0 +1,44 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 卡券商品表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_coupon_goods") +@ApiModel(value = "MtCouponGoods对象", description = "卡券商品表") +public class MtCouponGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGroup.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGroup.java new file mode 100644 index 0000000..6b3101b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtCouponGroup.java @@ -0,0 +1,64 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 优惠券组 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_coupon_group") +@ApiModel(value = "MtCouponGroup对象", description = "优惠券组") +public class MtCouponGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("券组名称") + private String name; + + @ApiModelProperty("价值金额") + private BigDecimal money; + + @ApiModelProperty("券种类数量") + private Integer num; + + @ApiModelProperty("发行数量") + private Integer total; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("创建日期") + private Date createTime; + + @ApiModelProperty("更新日期") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("A:正常;D:删除") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGive.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGive.java new file mode 100644 index 0000000..893f75d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGive.java @@ -0,0 +1,82 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 转赠记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_give") +@ApiModel(value = "MtGive对象", description = "转赠记录表") +public class MtGive implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("获赠者用户ID") + private Integer userId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("赠送者用户ID") + private Integer giveUserId; + + @ApiModelProperty("赠予对象手机号") + private String mobile; + + @ApiModelProperty("用户手机") + private String userMobile; + + @ApiModelProperty("券组ID,逗号隔开") + private String groupIds; + + @ApiModelProperty("券组名称,逗号隔开") + private String groupNames; + + @ApiModelProperty("券ID,逗号隔开") + private String couponIds; + + @ApiModelProperty("券名称,逗号隔开") + private String couponNames; + + @ApiModelProperty("数量") + private Integer num; + + @ApiModelProperty("总金额") + private BigDecimal money; + + @ApiModelProperty("备注") + private String note; + + @ApiModelProperty("留言") + private String message; + + @ApiModelProperty("赠送时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A正常;C取消") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGiveItem.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGiveItem.java new file mode 100644 index 0000000..4e4d536 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGiveItem.java @@ -0,0 +1,44 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 转赠明细表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_give_item") +@ApiModel(value = "MtGiveItem对象", description = "转赠明细表") +public class MtGiveItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("转赠ID") + private Integer giveId; + + @ApiModelProperty("用户电子券ID") + private Integer userCouponId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGoods.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoods.java new file mode 100644 index 0000000..efdcda1 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoods.java @@ -0,0 +1,115 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_goods") +@ApiModel(value = "MtGoods对象", description = "MtGoods对象") +public class MtGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品类型") + private String type; + + @ApiModelProperty("分类ID") + private Integer cateId; + + @ApiModelProperty("预约项目ID") + private Integer bookId; + + @ApiModelProperty("商品编码") + private String goodsNo; + + @ApiModelProperty("可用平台,0:不限,1:仅会员端(小程序和h5);2:仅收银端") + private Integer platform; + + @ApiModelProperty("是否单规格") + private String isSingleSpec; + + @ApiModelProperty("主图地址") + private String logo; + + @ApiModelProperty("图片地址") + private String images; + + @ApiModelProperty("销售价格") + private BigDecimal price; + + @ApiModelProperty("划线价格") + private BigDecimal linePrice; + + @ApiModelProperty("成本价格") + private BigDecimal costPrice; + + @ApiModelProperty("库存") + private Double stock; + + @ApiModelProperty("关联卡券") + private String couponIds; + + @ApiModelProperty("服务时长") + private Integer serviceTime; + + @ApiModelProperty("重量") + private BigDecimal weight; + + @ApiModelProperty("初始销量") + private Double initSale; + + @ApiModelProperty("商品卖点") + private String salePoint; + + @ApiModelProperty("可否使用积分抵扣") + private String canUsePoint; + + @ApiModelProperty("会员是否有折扣") + private String isMemberDiscount; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("商品描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsCate.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsCate.java new file mode 100644 index 0000000..2e4ab0e --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsCate.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品分类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_goods_cate") +@ApiModel(value = "MtGoodsCate对象", description = "") +public class MtGoodsCate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("分类名称") + private String name; + + @ApiModelProperty("LOGO地址") + private String logo; + + @ApiModelProperty("分类描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSku.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSku.java new file mode 100644 index 0000000..e01488f --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSku.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品SKU表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_goods_sku") +@ApiModel(value = "MtGoodsSku对象", description = "商品SKU表") +public class MtGoodsSku implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("sku编码") + private String skuNo; + + @ApiModelProperty("图片") + private String logo; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("规格ID") + private String specIds; + + @ApiModelProperty("库存") + private Double stock; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("划线价格") + private BigDecimal linePrice; + + @ApiModelProperty("成本价格") + private BigDecimal costPrice; + + @ApiModelProperty("重量") + private BigDecimal weight; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSpec.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSpec.java new file mode 100644 index 0000000..1152936 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGoodsSpec.java @@ -0,0 +1,41 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 规格表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_goods_spec") +@ApiModel(value = "MtGoodsSpec对象", description = "规格表") +public class MtGoodsSpec implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("规格名称") + private String name; + + @ApiModelProperty("规格值") + private String value; + + @ApiModelProperty("状态") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtInvoice.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtInvoice.java new file mode 100644 index 0000000..8101362 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtInvoice.java @@ -0,0 +1,93 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 发票实体 + * + * @Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_invoice") +@ApiModel(value = "invoice表对象", description = "invoice表对象") +public class MtInvoice implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("开票时间") + private Date InvoiceTime; + + @ApiModelProperty("开票金额") + private BigDecimal invoiceAmount; + + @ApiModelProperty("发票抬头") + private String title; + + @ApiModelProperty("发票下载地址") + private String downloadUrl; + + @ApiModelProperty("发票类型") + private String type; + + @ApiModelProperty("纳税人识别码") + private String taxCode; + + @ApiModelProperty("开户行") + private String bankName; + + @ApiModelProperty("开户卡号") + private String bankCardNo; + + @ApiModelProperty("开户户名") + private String bankCardName; + + @ApiModelProperty("开票备注") + private String description; + + @ApiModelProperty("接收邮箱") + private String email; + + @ApiModelProperty("联系电话") + private String mobile; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A开票中,B开票成功,C已冲红") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtMerchant.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtMerchant.java new file mode 100644 index 0000000..7851e28 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtMerchant.java @@ -0,0 +1,81 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商户表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_merchant") +@ApiModel(value = "MtMerchant对象", description = "商户表") +public class MtMerchant implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("微信小程序appId") + private String wxAppId; + + @ApiModelProperty("微信小程序秘钥") + private String wxAppSecret; + + @ApiModelProperty("微信公众号appId") + private String wxOfficialAppId; + + @ApiModelProperty("微信公众号秘钥") + private String wxOfficialAppSecret; + + @ApiModelProperty(value="结算比例") + private BigDecimal settleRate; + + @ApiModelProperty("商户号") + private String no; + + @ApiModelProperty("商户名称") + private String name; + + @ApiModelProperty("商户logo") + private String logo; + + @ApiModelProperty("联系人姓名") + private String contact; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("联系地址") + private String address; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:有效/启用;D:无效") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtMessage.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtMessage.java new file mode 100644 index 0000000..42737bf --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtMessage.java @@ -0,0 +1,65 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 系统消息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_message") +@ApiModel(value = "MtMessage对象", description = "系统消息") +public class MtMessage implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("消息类型") + private String type; + + @ApiModelProperty("消息标题") + private String title; + + @ApiModelProperty("消息内容") + private String content; + + @ApiModelProperty("是否已读") + private String isRead; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("参数信息") + private String params; + + @ApiModelProperty("是否已发送") + private String isSend; + + @ApiModelProperty("发送时间") + private Date sendTime; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGift.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGift.java new file mode 100644 index 0000000..4fe28d3 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGift.java @@ -0,0 +1,58 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员开卡赠礼 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_open_gift") +@ApiModel(value = "MtOpenGift对象", description = "会员开卡赠礼") +public class MtOpenGift implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("会员等级ID") + private Integer gradeId; + + @ApiModelProperty("赠送积分") + private Integer point; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("卡券数量") + private Integer couponNum; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGiftItem.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGiftItem.java new file mode 100644 index 0000000..8c090d7 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtOpenGiftItem.java @@ -0,0 +1,42 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 开卡赠礼明细表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_open_gift_item") +@ApiModel(value = "MtOpenGiftItem对象", description = "开卡赠礼明细表") +public class MtOpenGiftItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("会用ID") + private Integer userId; + + @ApiModelProperty("赠礼ID") + private Integer openGiftId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("状态") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtOrder.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtOrder.java new file mode 100644 index 0000000..cd82d3f --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtOrder.java @@ -0,0 +1,129 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_order") +@ApiModel(value = "MtOrder对象", description = "订单表") +public class MtOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("订单类型") + private String type; + + @ApiModelProperty("支付类型") + private String payType; + + @ApiModelProperty("订单模式") + private String orderMode; + + @ApiModelProperty("下单平台") + private String platform; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("核销验证码") + private String verifyCode; + + @ApiModelProperty("是否游客") + private String isVisitor; + + @ApiModelProperty("订单金额") + private BigDecimal amount; + + @ApiModelProperty("支付金额") + private BigDecimal payAmount; + + @ApiModelProperty(value="结算状态") + private String settleStatus; + + @ApiModelProperty("使用积分数量") + private Integer usePoint; + + @ApiModelProperty("积分金额") + private BigDecimal pointAmount; + + @ApiModelProperty("折扣金额") + private BigDecimal discount; + + @ApiModelProperty("配送费用") + private BigDecimal deliveryFee; + + @ApiModelProperty("订单参数") + private String param; + + @ApiModelProperty("物流信息") + private String expressInfo; + + @ApiModelProperty("用户备注") + private String remark; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("订单状态") + private String status; + + @ApiModelProperty("支付时间") + private Date payTime; + + @ApiModelProperty("支付状态") + private String payStatus; + + @ApiModelProperty("操作员工") + private Integer staffId; + + @ApiModelProperty("核销状态") + private String confirmStatus; + + @ApiModelProperty("核销时间") + private Date confirmTime; + + @ApiModelProperty("核销备注") + private String confirmRemark; + + @ApiModelProperty("分佣提成用户ID") + private Integer commissionUserId; + + @ApiModelProperty("分佣提成计算状态") + private String commissionStatus; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtOrderAddress.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtOrderAddress.java new file mode 100644 index 0000000..6d7988a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtOrderAddress.java @@ -0,0 +1,57 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单收货地址记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_order_address") +@ApiModel(value = "MtOrderAddress对象", description = "订单收货地址记录表") +public class MtOrderAddress implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("地址ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("收货人姓名") + private String name; + + @ApiModelProperty("联系电话") + private String mobile; + + @ApiModelProperty("省份ID") + private Integer provinceId; + + @ApiModelProperty("城市ID") + private Integer cityId; + + @ApiModelProperty("区/县ID") + private Integer regionId; + + @ApiModelProperty("详细地址") + private String detail; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("创建时间") + private Date createTime; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtOrderGoods.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtOrderGoods.java new file mode 100644 index 0000000..055b7d9 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtOrderGoods.java @@ -0,0 +1,57 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单商品表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_order_goods") +@ApiModel(value = "MtOrderGoods对象", description = "订单商品表") +public class MtOrderGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("skuID") + private Integer skuId; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("优惠价") + private BigDecimal discount; + + @ApiModelProperty("商品数量") + private Double num; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("A:正常;D:删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtPoint.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtPoint.java new file mode 100644 index 0000000..9c45973 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtPoint.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员积分记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_point") +@ApiModel(value = "MtPoint对象", description = "会员积分记录表") +public class MtPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("积分变化数量") + private Integer amount; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtPrinter.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtPrinter.java new file mode 100644 index 0000000..4d70f7c --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtPrinter.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 打印机实体 + * + * @Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_printer") +@ApiModel(value = "printer表对象", description = "printer表对象") +public class MtPrinter implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("打印机编号") + private String sn; + + @ApiModelProperty("打印机名称") + private String name; + + @ApiModelProperty("是否自动打印机") + private String autoPrint; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtRefund.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtRefund.java new file mode 100644 index 0000000..f56e69a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtRefund.java @@ -0,0 +1,75 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 售后表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_refund") +@ApiModel(value = "MtRefund对象", description = "售后表") +public class MtRefund implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("退款金额") + private BigDecimal amount; + + @ApiModelProperty("售后类型") + private String type; + + @ApiModelProperty("退款备注") + private String remark; + + @ApiModelProperty("物流公司名称") + private String expressName; + + @ApiModelProperty("物流单号") + private String expressNo; + + @ApiModelProperty("拒绝原因") + private String rejectReason; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("图片") + private String images; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtRegion.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtRegion.java new file mode 100644 index 0000000..3313a68 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtRegion.java @@ -0,0 +1,41 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 省市区数据表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_region") +@ApiModel(value = "MtRegion对象", description = "省市区数据表") +public class MtRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("区划信息ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("区划名称") + private String name; + + @ApiModelProperty("父级ID") + private Integer pid; + + @ApiModelProperty("区划编码") + private String code; + + @ApiModelProperty("层级(1省级 2市级 3区/县级)") + private Integer level; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtSendLog.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtSendLog.java new file mode 100644 index 0000000..4db4704 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtSendLog.java @@ -0,0 +1,81 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 卡券发放记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_send_log") +@ApiModel(value = "MtSendLog对象", description = "卡券发放记录表") +public class MtSendLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("1:单用户发券;2:批量发券") + private Integer type; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("导入excel文件名") + private String fileName; + + @ApiModelProperty("导入excel文件路径") + private String filePath; + + @ApiModelProperty("用户手机") + private String mobile; + + @ApiModelProperty("券组ID") + private Integer groupId; + + @ApiModelProperty("券组名称") + private String groupName; + + @ApiModelProperty("卡券ID") + private Integer couponId; + + @ApiModelProperty("发放套数") + private Integer sendNum; + + @ApiModelProperty("操作时间") + private Date createTime; + + @ApiModelProperty("操作人") + private String operator; + + @ApiModelProperty("导入UUID") + private String uuid; + + @ApiModelProperty("作废成功张数") + private Integer removeSuccessNum; + + @ApiModelProperty("作废失败张数") + private Integer removeFailNum; + + @ApiModelProperty("状态,A正常;B:部分作废;D全部作废") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtSetting.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtSetting.java new file mode 100644 index 0000000..beb25de --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtSetting.java @@ -0,0 +1,60 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 全局设置表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_setting") +@ApiModel(value = "MtSetting对象", description = "全局设置表") +public class MtSetting implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("配置项") + private String name; + + @ApiModelProperty("配置值") + private String value; + + @ApiModelProperty("配置说明") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态 A启用;D禁用") + private String status; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtSettlement.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtSettlement.java new file mode 100644 index 0000000..3ec3a57 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtSettlement.java @@ -0,0 +1,66 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 结算表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_settlement") +@ApiModel(value = "MtSettlement对象", description = "结算表") +public class MtSettlement implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("结算单号") + private String settlementNo; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("结算比例") + private BigDecimal settleRate; + + @ApiModelProperty("订单总金额") + private BigDecimal totalOrderAmount; + + @ApiModelProperty("结算金额") + private BigDecimal amount; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("支付状态,A待支付;B已支付") + private String payStatus; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtSettlementOrder.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtSettlementOrder.java new file mode 100644 index 0000000..4c28ec3 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtSettlementOrder.java @@ -0,0 +1,50 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 结算订单表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_settlement_order") +@ApiModel(value = "MtSettlementOrder对象", description = "结算订单表") +public class MtSettlementOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("结算ID") + private Integer settlementId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtSmsSendedLog.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtSmsSendedLog.java new file mode 100644 index 0000000..45affef --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtSmsSendedLog.java @@ -0,0 +1,51 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 短信发送记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_sms_sended_log") +@ApiModel(value = "MtSmsSendedLog对象", description = "短信发送记录表") +public class MtSmsSendedLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("日志ID") + @TableId(value = "LOG_ID", type = IdType.AUTO) + private Integer logId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("手机号") + private String mobilePhone; + + @ApiModelProperty("短信内容") + private String content; + + @ApiModelProperty("发送时间") + private Date sendTime; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtSmsTemplate.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtSmsTemplate.java new file mode 100644 index 0000000..63abb12 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtSmsTemplate.java @@ -0,0 +1,59 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 短信模板 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_sms_template") +@ApiModel(value = "MtSmsTemplate对象", description = "短信模板") +public class MtSmsTemplate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("英文名称") + private String uname; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态:A激活;N禁用") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtStaff.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtStaff.java new file mode 100644 index 0000000..169d70a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtStaff.java @@ -0,0 +1,65 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺员工表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_staff") +@ApiModel(value = "MtStaff对象", description = "店铺员工表") +public class MtStaff implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("员工类别") + private Integer category; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("微信号") + private String wechat; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("审核状态,A:审核通过;U:未审核;D:无效; ") + private String auditedStatus; + + @ApiModelProperty("审核时间") + private Date auditedTime; + + @ApiModelProperty("备注") + private String description; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtStock.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtStock.java new file mode 100644 index 0000000..c7392a3 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtStock.java @@ -0,0 +1,53 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 库存管理记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_stock") +@ApiModel(value = "MtStock对象", description = "库存管理记录表") +public class MtStock implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("类型,increase:入库,reduce:出库") + private String type; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("赠送时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;C取消") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtStockItem.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtStockItem.java new file mode 100644 index 0000000..b92e261 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtStockItem.java @@ -0,0 +1,53 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 库存管理明细表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_stock_item") +@ApiModel(value="MtStockItem对象", description="库存管理明细表") +public class MtStockItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("库存管理ID") + private Integer stockId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("SKU") + private Integer skuId; + + @ApiModelProperty("数量") + private Double num; + + @ApiModelProperty("备注说明") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A正常;D删除") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtStore.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtStore.java new file mode 100644 index 0000000..5a0917e --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtStore.java @@ -0,0 +1,114 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_store") +@ApiModel(value = "MtStore对象", description = "店铺表") +public class MtStore implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺名称") + private String name; + + @ApiModelProperty("商户logo") + private String logo; + + @ApiModelProperty("店铺二维码") + private String qrCode; + + @ApiModelProperty("是否默认") + private String isDefault; + + @ApiModelProperty("联系人姓名") + private String contact; + + @ApiModelProperty("微信支付商户号") + private String wxMchId; + + @ApiModelProperty("微信支付APIv2密钥") + private String wxApiV2; + + @ApiModelProperty("微信支付证书") + private String wxCertPath; + + @ApiModelProperty("支付宝appId") + private String alipayAppId; + + @ApiModelProperty("支付宝应用私钥") + private String alipayPrivateKey; + + @ApiModelProperty("支付宝应用公钥") + private String alipayPublicKey; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("经度") + private String latitude; + + @ApiModelProperty("维度") + private String longitude; + + @ApiModelProperty("距离") + private BigDecimal distance; + + @ApiModelProperty("营业时间") + private String hours; + + @ApiModelProperty("营业执照") + private String license; + + @ApiModelProperty("统一社会信用代码") + private String creditCode; + + @ApiModelProperty("银行名称") + private String bankName; + + @ApiModelProperty("银行卡账户名") + private String bankCardName; + + @ApiModelProperty("银行卡卡号") + private String bankCardNo; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:有效/启用;D:无效") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtStoreGoods.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtStoreGoods.java new file mode 100644 index 0000000..fc1085c --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtStoreGoods.java @@ -0,0 +1,50 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺商品实体 + * + * @Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_store_goods") +@ApiModel(value = "store_goods表对象", description = "store_goods表对象") +public class MtStoreGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户") + private Integer merchantId; + + @ApiModelProperty("所属店铺") + private Integer storeId; + + @ApiModelProperty("商品ID") + private Integer goodsId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:有效/启用;D:无效") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtUploadShippingLog.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtUploadShippingLog.java new file mode 100644 index 0000000..6d27bb4 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtUploadShippingLog.java @@ -0,0 +1,56 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 微信小程序上传发货信息实体 + * + * @Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_upload_shipping_log") +@ApiModel(value = "upload_shipping_log表对象", description = "微信小程序上传发货信息对象") +public class MtUploadShippingLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty("订单号") + private String orderSn; + + @ApiModelProperty("订单手机号") + private String mobile; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A成功;B失败") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtUser.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtUser.java new file mode 100644 index 0000000..9fedc27 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtUser.java @@ -0,0 +1,118 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员个人信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_user") +@ApiModel(value = "MtUser对象", description = "会员个人信息") +public class MtUser implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("会员ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("头像") + private String avatar; + + @ApiModelProperty("分组ID") + private Integer groupId; + + @ApiModelProperty("称呼") + private String name; + + @ApiModelProperty("微信open_id") + private String openId; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("证件号码") + private String idcard; + + @ApiModelProperty("等级ID") + private Integer gradeId; + + @ApiModelProperty("会员开始时间") + @TableField(strategy = FieldStrategy.IGNORED) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + @ApiModelProperty("会员结束时间") + @TableField(strategy=FieldStrategy.IGNORED) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + + @ApiModelProperty("余额") + private BigDecimal balance; + + @ApiModelProperty("积分") + private Integer point; + + @ApiModelProperty("性别 1男;0女") + private Integer sex; + + @ApiModelProperty("出生日期") + private String birthday; + + @ApiModelProperty("车牌号") + private String carNo; + + @ApiModelProperty("来源渠道") + private String source; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("salt") + private String salt; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("默认店铺") + private Integer storeId; + + @ApiModelProperty("是否员工") + private String isStaff; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:激活;N:禁用;D:删除") + private String status; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("注册IP") + private String ip; + + @ApiModelProperty("最后操作人") + private String operator; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtUserAction.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserAction.java new file mode 100644 index 0000000..565428d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserAction.java @@ -0,0 +1,58 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员行为信息 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_user_action") +@ApiModel(value = "MtUserAction对象", description = "会员行为信息") +public class MtUserAction implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("行为类别") + private String action; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("参数") + private String param; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:激活;N:禁用;D:删除") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtUserCoupon.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserCoupon.java new file mode 100644 index 0000000..654b601 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserCoupon.java @@ -0,0 +1,87 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员卡券表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_user_coupon") +@ApiModel(value = "MtUserCoupon对象", description = "会员卡券表") +public class MtUserCoupon implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("核销码") + private String code; + + @ApiModelProperty("券类型,C优惠券;P储值卡;T计次卡") + private String type; + + @ApiModelProperty("效果图") + private String image; + + @ApiModelProperty("券组ID") + private Integer groupId; + + @ApiModelProperty("券ID") + private Integer couponId; + + @ApiModelProperty("用户手机号码") + private String mobile; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("使用店铺ID") + private Integer storeId; + + @ApiModelProperty("面额") + private BigDecimal amount; + + @ApiModelProperty("余额") + private BigDecimal balance; + + @ApiModelProperty("状态:A:未使用;B:已使用;C:已过期; D:已删除;E:未领取") + private String status; + + @ApiModelProperty("使用时间") + private Date usedTime; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("导入UUID") + private String uuid; + + @ApiModelProperty("订单ID") + private Integer orderId; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtUserGrade.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserGrade.java new file mode 100644 index 0000000..6b44821 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserGrade.java @@ -0,0 +1,62 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员等级表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_user_grade") +@ApiModel(value = "MtUserGrade对象", description = "") +public class MtUserGrade implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("等级") + private Integer grade; + + @ApiModelProperty("等级名称") + private String name; + + @ApiModelProperty("升级会员等级条件描述") + private String catchCondition; + + @ApiModelProperty("升级会员等级条件,init:默认获取;pay:付费升级;frequency:消费次数;amount:累积消费金额升级") + private String catchType; + + @ApiModelProperty("达到升级条件的值") + private BigDecimal catchValue; + + @ApiModelProperty("会员权益描述") + private String userPrivilege; + + @ApiModelProperty("有效期") + private Integer validDay; + + @ApiModelProperty("享受折扣") + private Float discount; + + @ApiModelProperty("积分加速") + private Float speedPoint; + + @ApiModelProperty("状态") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtUserGroup.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserGroup.java new file mode 100644 index 0000000..b4683ab --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtUserGroup.java @@ -0,0 +1,54 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员分组 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_user_group") +@ApiModel(value = "MtUserGroup对象", description = "会员分组") +public class MtUserGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("分组ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("分组名称") + private String name; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("默认店铺") + private Integer storeId; + + @ApiModelProperty("父ID") + private Integer parentId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A:激活;N:禁用;D:删除") + private String status; + + @ApiModelProperty("备注信息") + private String description; + + @ApiModelProperty("最后操作人") + private String operator; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtVerifyCode.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtVerifyCode.java new file mode 100644 index 0000000..7d01050 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtVerifyCode.java @@ -0,0 +1,48 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 短信验证码表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_verify_code") +@ApiModel(value = "MtVerifyCode对象", description = "短信验证码表") +public class MtVerifyCode implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("验证码") + private String verifyCode; + + @ApiModelProperty("创建时间") + private Date addTime; + + @ApiModelProperty("过期时间") + private Date expireTime; + + @ApiModelProperty("使用时间") + private Date usedTime; + + @ApiModelProperty("可用状态 0未用 1已用 2置为失效") + private String validFlag; + + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TAccount.java b/fuint-repository/src/main/java/com/fuint/repository/model/TAccount.java new file mode 100644 index 0000000..7eebf69 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TAccount.java @@ -0,0 +1,70 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 后台管理员表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_account") +@ApiModel(value = "TAccount对象", description = "后台管理员表") +public class TAccount implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键id") + @TableId(value = "acct_id", type = IdType.AUTO) + private Integer acctId; + + @ApiModelProperty("账户编码") + private String accountKey; + + @ApiModelProperty("账户名称") + private String accountName; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("0 无效 1 有效") + private Integer accountStatus; + + @ApiModelProperty("0 未激活 1已激活") + private Integer isActive; + + @ApiModelProperty("创建时间") + private Date createDate; + + @ApiModelProperty("修改时间") + private Date modifyDate; + + @ApiModelProperty("随机码") + private String salt; + + private String roleIds; + + private Integer locked; + + @ApiModelProperty("所属平台") + private Integer ownerId; + + private String realName; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("员工ID") + private Integer staffId; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TAccountDuty.java b/fuint-repository/src/main/java/com/fuint/repository/model/TAccountDuty.java new file mode 100644 index 0000000..d6a990b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TAccountDuty.java @@ -0,0 +1,34 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 后台账号角色表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_account_duty") +@ApiModel(value = "TAccountDuty对象", description = "后台账号角色表") +public class TAccountDuty implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("账户角色ID") + @TableId(value = "acc_duty_id", type = IdType.AUTO) + private Integer accDutyId; + + @ApiModelProperty("账户ID") + private Integer acctId; + + @ApiModelProperty("角色ID") + private Integer dutyId; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TActionLog.java b/fuint-repository/src/main/java/com/fuint/repository/model/TActionLog.java new file mode 100644 index 0000000..e324f12 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TActionLog.java @@ -0,0 +1,62 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 后台操作日志表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_action_log") +@ApiModel(value = "TActionLog对象", description = "后台操作日志表") +public class TActionLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("操作时间") + private Date actionTime; + + @ApiModelProperty("耗时") + private BigDecimal timeConsuming; + + @ApiModelProperty("客户端IP") + private String clientIp; + + @ApiModelProperty("操作模块") + private String module; + + @ApiModelProperty("请求URL") + private String url; + + @ApiModelProperty("操作用户账户") + private String acctName; + + @ApiModelProperty("用户系统以及浏览器信息") + private String userAgent; + + @ApiModelProperty("端口号") + private Integer clientPort; + + @ApiModelProperty("操作参数") + private String param; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TDuty.java b/fuint-repository/src/main/java/com/fuint/repository/model/TDuty.java new file mode 100644 index 0000000..3cbb3d8 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TDuty.java @@ -0,0 +1,42 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 角色表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_duty") +@ApiModel(value = "TDuty对象", description = "角色表") +public class TDuty implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("角色ID") + @TableId(value = "duty_id", type = IdType.AUTO) + private Integer dutyId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("角色名称") + private String dutyName; + + @ApiModelProperty("状态(A: 可用 D: 禁用)") + private String status; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("角色类型") + private String dutyType; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TDutySource.java b/fuint-repository/src/main/java/com/fuint/repository/model/TDutySource.java new file mode 100644 index 0000000..47fca97 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TDutySource.java @@ -0,0 +1,30 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * 角色权限对象 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_duty_source") +@ApiModel(value = "TDutySource对象", description = "角色权限对象") +public class TDutySource implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "duty_source_id", type = IdType.AUTO) + private Integer dutySourceId; + + private Integer dutyId; + + private Integer sourceId; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TGenCode.java b/fuint-repository/src/main/java/com/fuint/repository/model/TGenCode.java new file mode 100644 index 0000000..429f11e --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TGenCode.java @@ -0,0 +1,65 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 生成代码实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_gen_code") +@ApiModel(value = "TGenCode对象", description = "生成代码实体") +public class TGenCode implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("服务名称") + private String serviceName; + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("表名称") + private String tableName; + + @ApiModelProperty("表前缀") + private String tablePrefix; + + @ApiModelProperty("主键名") + private String pkName; + + @ApiModelProperty("后端包名") + private String packageName; + + @ApiModelProperty("后端路径") + private String backendPath; + + @ApiModelProperty("前端路径") + private String frontPath; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("作者") + private String author; + + @ApiModelProperty("状态 0 无效 1 有效") + private String status; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TPlatform.java b/fuint-repository/src/main/java/com/fuint/repository/model/TPlatform.java new file mode 100644 index 0000000..cdb2be6 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TPlatform.java @@ -0,0 +1,40 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 平台实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_platform") +@ApiModel(value = "TPlatform对象", description = "平台") +public class TPlatform implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键") + @TableId(value = "owner_id", type = IdType.AUTO) + private Integer ownerId; + + @ApiModelProperty("平台名称") + private String name; + + @ApiModelProperty("状态 0 无效 1 有效") + private Integer status; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("平台类型") + private Integer platformType; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/TSource.java b/fuint-repository/src/main/java/com/fuint/repository/model/TSource.java new file mode 100644 index 0000000..14e46d5 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/TSource.java @@ -0,0 +1,69 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 菜单表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("t_source") +@ApiModel(value = "TSource对象", description = "菜单表") +public class TSource implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("菜单Id") + @TableId(value = "source_id", type = IdType.AUTO) + private Integer sourceId; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("菜单名称") + private String sourceName; + + @ApiModelProperty("菜单对应url") + private String sourceCode; + + @ApiModelProperty("路径") + private String path; + + @ApiModelProperty("字母名称") + private String ename; + + @ApiModelProperty("新图标") + private String newIcon; + + @ApiModelProperty("状态(A:可用 D:禁用)") + private String status; + + @ApiModelProperty("菜单级别") + private Integer sourceLevel; + + @ApiModelProperty("样式") + private String sourceStyle; + + @ApiModelProperty("是否显示") + private Integer isMenu; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("上级菜单ID") + private Integer parentId; + + private Integer isLog; + + @ApiModelProperty("菜单图标") + private String icon; + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/base/AutoIncrementIdModel.java b/fuint-repository/src/main/java/com/fuint/repository/model/base/AutoIncrementIdModel.java new file mode 100644 index 0000000..6199cdf --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/base/AutoIncrementIdModel.java @@ -0,0 +1,18 @@ +package com.fuint.repository.model.base; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class AutoIncrementIdModel { + + private int id; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/base/ElasticSearchModel.java b/fuint-repository/src/main/java/com/fuint/repository/model/base/ElasticSearchModel.java new file mode 100644 index 0000000..feb14ec --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/base/ElasticSearchModel.java @@ -0,0 +1,26 @@ +package com.fuint.repository.model.base; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface ElasticSearchModel { + + /** + * 在ElasticSearch中的Index + * @return + */ + String elasticSearchIndex(); + + /** + * 在ElasticSearch中的Type + * @return + */ + String elasticSearchType(); + + /** + * 获取ID + * @return + */ + String elasticSearchId(); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/base/OpsExercise.java b/fuint-repository/src/main/java/com/fuint/repository/model/base/OpsExercise.java new file mode 100644 index 0000000..0c665fd --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/base/OpsExercise.java @@ -0,0 +1,38 @@ +package com.fuint.repository.model.base; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class OpsExercise { + + private String exerId; + + private int courseId; + + private int difficultyLv; + + public String getExerId() { + return exerId; + } + + public void setExerId(String exerId) { + this.exerId = exerId; + } + + public int getCourseId() { + return courseId; + } + + public void setCourseId(int courseId) { + this.courseId = courseId; + } + + public int getDifficultyLv() { + return difficultyLv; + } + + public void setDifficultyLv(int difficultyLv) { + this.difficultyLv = difficultyLv; + } +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/base/RedisCache.java b/fuint-repository/src/main/java/com/fuint/repository/model/base/RedisCache.java new file mode 100644 index 0000000..427d75a --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/base/RedisCache.java @@ -0,0 +1,17 @@ +package com.fuint.repository.model.base; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RedisCache { + String prefix() default ""; + String key() default ""; +} diff --git a/fuint-repository/src/main/resources/mapper/MtAddressMapper.xml b/fuint-repository/src/main/resources/mapper/MtAddressMapper.xml new file mode 100644 index 0000000..bcc358f --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtAddressMapper.xml @@ -0,0 +1,7 @@ + + + + + update mt_address p set p.IS_DEFAULT = 'N' where p.USER_ID = #{userId} and p.ID != #{addressId} + + diff --git a/fuint-repository/src/main/resources/mapper/MtArticleMapper.xml b/fuint-repository/src/main/resources/mapper/MtArticleMapper.xml new file mode 100644 index 0000000..4da55a9 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtArticleMapper.xml @@ -0,0 +1,7 @@ + + + + + update mt_article t set t.CLICK = t.CLICK + 1 where t.ID = #{articleId} + + diff --git a/fuint-repository/src/main/resources/mapper/MtBalanceMapper.xml b/fuint-repository/src/main/resources/mapper/MtBalanceMapper.xml new file mode 100644 index 0000000..3784157 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtBalanceMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtBannerMapper.xml b/fuint-repository/src/main/resources/mapper/MtBannerMapper.xml new file mode 100644 index 0000000..ac12cb3 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtBannerMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtBookItemMapper.xml b/fuint-repository/src/main/resources/mapper/MtBookItemMapper.xml new file mode 100644 index 0000000..5aa401f --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtBookItemMapper.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCartMapper.xml b/fuint-repository/src/main/resources/mapper/MtCartMapper.xml new file mode 100644 index 0000000..317ffc5 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCartMapper.xml @@ -0,0 +1,15 @@ + + + + + delete from mt_cart where USER_ID = #{userId} and GOODS_ID = #{goodsId} and SKU_ID = #{skuId} + + + + delete from mt_cart where USER_ID = #{userId} + + + + delete from mt_cart where HANG_NO = #{hangNo} + + diff --git a/fuint-repository/src/main/resources/mapper/MtCommissionCashMapper.xml b/fuint-repository/src/main/resources/mapper/MtCommissionCashMapper.xml new file mode 100644 index 0000000..ab78b9f --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCommissionCashMapper.xml @@ -0,0 +1,17 @@ + + + + + update mt_commission_cash t set t.STATUS = 'B',t.OPERATOR = #{operator} where t.uuid = #{uuid} + + AND t.MERCHANT_ID = #{merchantId} + + + + + update mt_commission_cash t set t.STATUS = 'D',t.OPERATOR = #{operator} where t.uuid = #{uuid} + + AND t.MERCHANT_ID = #{merchantId} + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCommissionLogMapper.xml b/fuint-repository/src/main/resources/mapper/MtCommissionLogMapper.xml new file mode 100644 index 0000000..a9d6b45 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCommissionLogMapper.xml @@ -0,0 +1,17 @@ + + + + + update mt_commission_log t set t.STATUS = 'B',t.OPERATOR = #{operator} where t.SETTLE_UUID = #{uuid} + + AND t.MERCHANT_ID = #{merchantId} + + + + + update mt_commission_log t set t.STATUS = 'A',t.OPERATOR = #{operator} where t.SETTLE_UUID = #{uuid} + + AND t.MERCHANT_ID = #{merchantId} + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCommissionRelationMapper.xml b/fuint-repository/src/main/resources/mapper/MtCommissionRelationMapper.xml new file mode 100644 index 0000000..4cb3122 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCommissionRelationMapper.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCommissionRuleItemMapper.xml b/fuint-repository/src/main/resources/mapper/MtCommissionRuleItemMapper.xml new file mode 100644 index 0000000..56196e0 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCommissionRuleItemMapper.xml @@ -0,0 +1,23 @@ + + + + + update mt_commission_rule_item set STATUS = 'D',UPDATE_TIME=#{updateTime} where RULE_ID = #{ruleId} + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCommissionRuleMapper.xml b/fuint-repository/src/main/resources/mapper/MtCommissionRuleMapper.xml new file mode 100644 index 0000000..a909346 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCommissionRuleMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtConfirmLogMapper.xml b/fuint-repository/src/main/resources/mapper/MtConfirmLogMapper.xml new file mode 100644 index 0000000..8cc1c4d --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtConfirmLogMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCouponGoodsMapper.xml b/fuint-repository/src/main/resources/mapper/MtCouponGoodsMapper.xml new file mode 100644 index 0000000..99d579f --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCouponGoodsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCouponGroupMapper.xml b/fuint-repository/src/main/resources/mapper/MtCouponGroupMapper.xml new file mode 100644 index 0000000..9c0c217 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCouponGroupMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtCouponMapper.xml b/fuint-repository/src/main/resources/mapper/MtCouponMapper.xml new file mode 100644 index 0000000..7ec97c8 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtCouponMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtGiveItemMapper.xml b/fuint-repository/src/main/resources/mapper/MtGiveItemMapper.xml new file mode 100644 index 0000000..fda3c04 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGiveItemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtGiveMapper.xml b/fuint-repository/src/main/resources/mapper/MtGiveMapper.xml new file mode 100644 index 0000000..d984ada --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGiveMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtGoodsCateMapper.xml b/fuint-repository/src/main/resources/mapper/MtGoodsCateMapper.xml new file mode 100644 index 0000000..a3add51 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGoodsCateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtGoodsMapper.xml b/fuint-repository/src/main/resources/mapper/MtGoodsMapper.xml new file mode 100644 index 0000000..19eb3b4 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGoodsMapper.xml @@ -0,0 +1,100 @@ + + + + + `ID`, `TYPE`, `MERCHANT_ID`, `STORE_ID`, `NAME`, `CATE_ID`, `GOODS_NO`, `PLATFORM`, `IS_SINGLE_SPEC`, + `LOGO`, `PRICE`, `LINE_PRICE`, `COST_PRICE`, `STOCK`, `WEIGHT`, `COUPON_IDS`, `INIT_SALE`, `SALE_POINT`, + `CAN_USE_POINT`, `IS_MEMBER_DISCOUNT`, `SORT`, `CREATE_TIME`, `UPDATE_TIME`, `OPERATOR`, `STATUS` + + + + + + + + + + + update mt_goods t set t.INIT_SALE = t.INIT_SALE + #{saleNum} where t.ID = #{goodsId} + + + + + + + + update mt_goods t set t.STATUS = 'D' where t.MERCHANT_ID = #{merchantId} + + diff --git a/fuint-repository/src/main/resources/mapper/MtGoodsSkuMapper.xml b/fuint-repository/src/main/resources/mapper/MtGoodsSkuMapper.xml new file mode 100644 index 0000000..2d45414 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGoodsSkuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtGoodsSpecMapper.xml b/fuint-repository/src/main/resources/mapper/MtGoodsSpecMapper.xml new file mode 100644 index 0000000..bef3054 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGoodsSpecMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtInvoiceMapper.xml b/fuint-repository/src/main/resources/mapper/MtInvoiceMapper.xml new file mode 100644 index 0000000..4719bbf --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtInvoiceMapper.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtMerchantMapper.xml b/fuint-repository/src/main/resources/mapper/MtMerchantMapper.xml new file mode 100644 index 0000000..ddf9e1d --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtMerchantMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtMessageMapper.xml b/fuint-repository/src/main/resources/mapper/MtMessageMapper.xml new file mode 100644 index 0000000..da81642 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtMessageMapper.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtOpenGiftItemMapper.xml b/fuint-repository/src/main/resources/mapper/MtOpenGiftItemMapper.xml new file mode 100644 index 0000000..67dba73 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtOpenGiftItemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtOpenGiftMapper.xml b/fuint-repository/src/main/resources/mapper/MtOpenGiftMapper.xml new file mode 100644 index 0000000..ccdb2b3 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtOpenGiftMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtOrderAddressMapper.xml b/fuint-repository/src/main/resources/mapper/MtOrderAddressMapper.xml new file mode 100644 index 0000000..6261d57 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtOrderAddressMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtOrderGoodsMapper.xml b/fuint-repository/src/main/resources/mapper/MtOrderGoodsMapper.xml new file mode 100644 index 0000000..cfe7104 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtOrderGoodsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml b/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml new file mode 100644 index 0000000..299ae0c --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtOrderMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtPointMapper.xml b/fuint-repository/src/main/resources/mapper/MtPointMapper.xml new file mode 100644 index 0000000..75e2393 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtPointMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtPrinterMapper.xml b/fuint-repository/src/main/resources/mapper/MtPrinterMapper.xml new file mode 100644 index 0000000..bbe3968 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtPrinterMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtRefundMapper.xml b/fuint-repository/src/main/resources/mapper/MtRefundMapper.xml new file mode 100644 index 0000000..0086b0a --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtRefundMapper.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtRegionMapper.xml b/fuint-repository/src/main/resources/mapper/MtRegionMapper.xml new file mode 100644 index 0000000..0ac2103 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtRegionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtSendLogMapper.xml b/fuint-repository/src/main/resources/mapper/MtSendLogMapper.xml new file mode 100644 index 0000000..d9b89ee --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtSendLogMapper.xml @@ -0,0 +1,11 @@ + + + + + update mt_send_log p set p.STATUS =#{status},p.REMOVE_SUCCESS_NUM =#{removeSuccessNum},p.REMOVE_FAIL_NUM =#{removeFailNum} where p.UUID = #{uuid} + + + + update mt_send_log p set p.STATUS =#{status},p.REMOVE_SUCCESS_NUM =p.REMOVE_SUCCESS_NUM+1 where p.UUID =#{uuid} + + diff --git a/fuint-repository/src/main/resources/mapper/MtSettingMapper.xml b/fuint-repository/src/main/resources/mapper/MtSettingMapper.xml new file mode 100644 index 0000000..052918d --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtSettingMapper.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtSettlementMapper.xml b/fuint-repository/src/main/resources/mapper/MtSettlementMapper.xml new file mode 100644 index 0000000..75e2393 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtSettlementMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtSettlementOrderMapper.xml b/fuint-repository/src/main/resources/mapper/MtSettlementOrderMapper.xml new file mode 100644 index 0000000..75e2393 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtSettlementOrderMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtSmsSendedLogMapper.xml b/fuint-repository/src/main/resources/mapper/MtSmsSendedLogMapper.xml new file mode 100644 index 0000000..8325cc9 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtSmsSendedLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtSmsTemplateMapper.xml b/fuint-repository/src/main/resources/mapper/MtSmsTemplateMapper.xml new file mode 100644 index 0000000..6be0cd8 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtSmsTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtStaffMapper.xml b/fuint-repository/src/main/resources/mapper/MtStaffMapper.xml new file mode 100644 index 0000000..7361ca6 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtStaffMapper.xml @@ -0,0 +1,15 @@ + + + + + update mt_staff p set p.AUDITED_STATUS = #{status}, p.UPDATE_TIME = #{updateTime} where p.ID = #{id} + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtStoreGoodsMapper.xml b/fuint-repository/src/main/resources/mapper/MtStoreGoodsMapper.xml new file mode 100644 index 0000000..71f5870 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtStoreGoodsMapper.xml @@ -0,0 +1,7 @@ + + + + + update mt_store_goods set STATUS = 'D' where STORE_ID = #{storeId} + + diff --git a/fuint-repository/src/main/resources/mapper/MtStoreMapper.xml b/fuint-repository/src/main/resources/mapper/MtStoreMapper.xml new file mode 100644 index 0000000..b5c5360 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtStoreMapper.xml @@ -0,0 +1,51 @@ + + + + + + + update mt_store p set p.IS_DEFAULT = 'N' where p.STATUS != 'D' + + AND p.MERCHANT_ID = #{merchantId} + + + + + + + + + update mt_store set STATUS = 'D' where MERCHANT_ID = #{merchantId} + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtUploadShippingLogMapper.xml b/fuint-repository/src/main/resources/mapper/MtUploadShippingLogMapper.xml new file mode 100644 index 0000000..2c21882 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtUploadShippingLogMapper.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtUserActionMapper.xml b/fuint-repository/src/main/resources/mapper/MtUserActionMapper.xml new file mode 100644 index 0000000..b148eb6 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtUserActionMapper.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtUserCouponMapper.xml b/fuint-repository/src/main/resources/mapper/MtUserCouponMapper.xml new file mode 100644 index 0000000..828fa3a --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtUserCouponMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + update mt_user_coupon p set p.STATUS ='D',p.OPERATOR = #{operator} where p.UUID = #{uuid} and p.COUPON_ID in + + #{couponId} + + and p.status='A' + + + + + + + + + + + + update mt_user_coupon set EXPIRE_TIME = #{expireTime} where COUPON_ID = #{couponId} + + + + update mt_user_coupon set STATUS = 'D' where COUPON_ID = #{couponId} + + diff --git a/fuint-repository/src/main/resources/mapper/MtUserGradeMapper.xml b/fuint-repository/src/main/resources/mapper/MtUserGradeMapper.xml new file mode 100644 index 0000000..0905218 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtUserGradeMapper.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtUserGroupMapper.xml b/fuint-repository/src/main/resources/mapper/MtUserGroupMapper.xml new file mode 100644 index 0000000..eea58ed --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtUserGroupMapper.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtUserMapper.xml b/fuint-repository/src/main/resources/mapper/MtUserMapper.xml new file mode 100644 index 0000000..7c37060 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtUserMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + update mt_user t set t.UPDATE_TIME = #{updateTime} where t.ID = #{userId} + + + + update mt_user t set t.BALANCE = (t.BALANCE + #{amount}) where t.STATUS = 'A' + + AND t.ID IN + + #{userId} + + + + AND t.MERCHANT_ID = #{merchantId} + + + + + update mt_user t set t.MOBILE = '' where t.MOBILE = #{mobile} and t.ID != #{userId} + + AND t.MERCHANT_ID = #{merchantId} + + + + + + + + + + + + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtVerifyCodeMapper.xml b/fuint-repository/src/main/resources/mapper/MtVerifyCodeMapper.xml new file mode 100644 index 0000000..6bd5382 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtVerifyCodeMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/TAccountDutyMapper.xml b/fuint-repository/src/main/resources/mapper/TAccountDutyMapper.xml new file mode 100644 index 0000000..85ed1bd --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TAccountDutyMapper.xml @@ -0,0 +1,11 @@ + + + + + + + delete from t_account_duty where acct_id = #{accountId} + + diff --git a/fuint-repository/src/main/resources/mapper/TAccountMapper.xml b/fuint-repository/src/main/resources/mapper/TAccountMapper.xml new file mode 100644 index 0000000..74fe457 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TAccountMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/TActionLogMapper.xml b/fuint-repository/src/main/resources/mapper/TActionLogMapper.xml new file mode 100644 index 0000000..2378f52 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TActionLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/TDutyMapper.xml b/fuint-repository/src/main/resources/mapper/TDutyMapper.xml new file mode 100644 index 0000000..9f64f43 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TDutyMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/TDutySourceMapper.xml b/fuint-repository/src/main/resources/mapper/TDutySourceMapper.xml new file mode 100644 index 0000000..255f251 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TDutySourceMapper.xml @@ -0,0 +1,12 @@ + + + + + + + delete from t_duty_source where duty_id = #{dutyId} + + diff --git a/fuint-repository/src/main/resources/mapper/TGenCodeMapper.xml b/fuint-repository/src/main/resources/mapper/TGenCodeMapper.xml new file mode 100644 index 0000000..04cbb8e --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TGenCodeMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/TPlatformMapper.xml b/fuint-repository/src/main/resources/mapper/TPlatformMapper.xml new file mode 100644 index 0000000..a089ad1 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TPlatformMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/TSourceMapper.xml b/fuint-repository/src/main/resources/mapper/TSourceMapper.xml new file mode 100644 index 0000000..41b2af4 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/TSourceMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/fuint-utils/pom.xml b/fuint-utils/pom.xml new file mode 100644 index 0000000..aebf27a --- /dev/null +++ b/fuint-utils/pom.xml @@ -0,0 +1,70 @@ + + + + fuint + com.fuint + 1.0.0 + + 4.0.0 + + fuint-utils + 1.0.0 + jar + + + + com.google.zxing + core + 3.3.0 + + + com.google.zxing + javase + 3.3.0 + + + org.bouncycastle + bcprov-jdk15on + 1.58 + + + commons-lang + commons-lang + 2.6 + + + + org.apache.poi + poi + 3.14 + + + org.apache.poi + poi-ooxml + 3.14 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + diff --git a/fuint-utils/src/main/java/com/fuint/exception/Exceptions.java b/fuint-utils/src/main/java/com/fuint/exception/Exceptions.java new file mode 100644 index 0000000..d50ad40 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/exception/Exceptions.java @@ -0,0 +1,70 @@ +package com.fuint.exception; + +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * 关于异常的工具类. + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Exceptions { + + /** + * 将CheckedException转换为UncheckedException. + */ + public static RuntimeException unchecked(Throwable ex) { + if (ex instanceof RuntimeException) { + return (RuntimeException) ex; + } else { + return new RuntimeException(ex); + } + } + + /** + * 将ErrorStack转化为String. + */ + public static String getStackTraceAsString(Throwable ex) { + StringWriter stringWriter = new StringWriter(); + ex.printStackTrace(new PrintWriter(stringWriter)); + return stringWriter.toString(); + } + + /** + * 获取组合本异常信息与底层异常信息的异常描述, 适用于本异常为统一包装异常类,底层异常才是根本原因的情况。 + */ + public static String getErrorMessageWithNestedException(Throwable ex) { + Throwable nestedException = ex.getCause(); + return new StringBuilder().append(ex.getMessage()).append(" nested exception is ") + .append(nestedException.getClass().getName()).append(":") + .append(nestedException.getMessage()).toString(); + } + + /** + * 获取异常的Root Cause. + */ + public static Throwable getRootCause(Throwable ex) { + Throwable cause; + while ((cause = ex.getCause()) != null) { + ex = cause; + } + return ex; + } + + /** + * 判断异常是否由某些底层的异常引起. + */ + public static boolean isCausedBy(Exception ex, Class... causeExceptionClasses) { + Throwable cause = ex; + while (cause != null) { + for (Class causeClass : causeExceptionClasses) { + if (causeClass.isInstance(cause)) { + return true; + } + } + cause = cause.getCause(); + } + return false; + } +} diff --git a/fuint-utils/src/main/java/com/fuint/text/CharsetKit.java b/fuint-utils/src/main/java/com/fuint/text/CharsetKit.java new file mode 100644 index 0000000..77b4c0e --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/text/CharsetKit.java @@ -0,0 +1,87 @@ +package com.fuint.text; + +import org.apache.commons.lang3.StringUtils; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * 字符集工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class CharsetKit { + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/text/Convert.java b/fuint-utils/src/main/java/com/fuint/text/Convert.java new file mode 100644 index 0000000..ff12a5f --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/text/Convert.java @@ -0,0 +1,1007 @@ +package com.fuint.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; + +/** + * 类型转换器 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Convert { + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + // 优化double计算精度丢失问题 + BigDecimal nNum = new BigDecimal(n); + BigDecimal decimal = new BigDecimal(10); + BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN); + double d = scale.doubleValue(); + s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/text/StrFormatter.java b/fuint-utils/src/main/java/com/fuint/text/StrFormatter.java new file mode 100644 index 0000000..4e15dcd --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/text/StrFormatter.java @@ -0,0 +1,93 @@ +package com.fuint.text; + +import com.fuint.utils.StringUtil; + +/** + * 字符串格式化 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class StrFormatter { + + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtil.isEmpty(strPattern) || argArray == null) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/AES.java b/fuint-utils/src/main/java/com/fuint/utils/AES.java new file mode 100644 index 0000000..a73bfba --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/AES.java @@ -0,0 +1,99 @@ +package com.fuint.utils; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Security; +import java.util.Arrays; + +/** + * 加密算法 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class AES { + // 算法名称 + final String KEY_ALGORITHM = "AES"; + // 加解密算法/模式/填充方式 + final String algorithmStr = "AES/CBC/PKCS7Padding"; + private Key key; + private Cipher cipher; + + static { + Security.addProvider(new BouncyCastleProvider()); + } + + final byte[] iv = {0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38}; + + public void init(byte[] keyBytes) { + + // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 + int base = 16; + if (keyBytes.length % base != 0) { + int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0); + byte[] temp = new byte[groups * base]; + Arrays.fill(temp, (byte) 0); + System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length); + keyBytes = temp; + } + // 初始化 + // 转化成JAVA的密钥格式 + key = new SecretKeySpec(keyBytes, KEY_ALGORITHM); + try { + // 初始化cipher + cipher = Cipher.getInstance(algorithmStr, "BC"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (NoSuchProviderException e) { + e.printStackTrace(); + } + } + + /** + * 加密方法 + * + * @param content 要加密的字符串 + * @param keyBytes 加密密钥 + * @return + */ + public byte[] encrypt(byte[] content, byte[] keyBytes) { + byte[] encryptedText = null; + init(keyBytes); + System.out.println("IV:" + new String(iv)); + try { + cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv)); + encryptedText = cipher.doFinal(content); + } catch (Exception e) { + e.printStackTrace(); + } + return encryptedText; + } + + /** + * 解密方法 + * + * @param encryptedData 要解密的字符串 + * @param keyBytes 解密密钥 + * @return + */ + public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) { + byte[] encryptedText = null; + init(keyBytes); + System.out.println("IV:" + new String(iv)); + try { + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); + encryptedText = cipher.doFinal(encryptedData); + } catch (Exception e) { + e.printStackTrace(); + } + return encryptedText; + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/ArrayUtil.java b/fuint-utils/src/main/java/com/fuint/utils/ArrayUtil.java new file mode 100644 index 0000000..ce15379 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/ArrayUtil.java @@ -0,0 +1,5546 @@ +package com.fuint.utils; + +import java.lang.reflect.Array; +import java.util.*; + +/** + * 有关数组处理的工具类。 + * + * 这个类中的每个方法都可以“安全”地处理null,而不会抛出NullPointerException。 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class ArrayUtil { + + /* ============================================================================ */ + /* 常量和singleton。 */ + /* ============================================================================ */ + + /** 空的Object数组。 */ + public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; + + /** 空的Class数组。 */ + public static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; + + /** 空的String数组。 */ + public static final String[] EMPTY_STRING_ARRAY = new String[0]; + + /** 空的long数组。 */ + public static final long[] EMPTY_LONG_ARRAY = new long[0]; + + /** 空的Long数组。 */ + public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0]; + + /** 空的int数组。 */ + public static final int[] EMPTY_INT_ARRAY = new int[0]; + + /** 空的Integer数组。 */ + public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0]; + + /** 空的short数组。 */ + public static final short[] EMPTY_SHORT_ARRAY = new short[0]; + + /** 空的Short数组。 */ + public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0]; + + /** 空的byte数组。 */ + public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + + /** 空的Byte数组。 */ + public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0]; + + /** 空的double数组。 */ + public static final double[] EMPTY_DOUBLE_ARRAY = new double[0]; + + /** 空的Double数组。 */ + public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0]; + + /** 空的float数组。 */ + public static final float[] EMPTY_FLOAT_ARRAY = new float[0]; + + /** 空的Float数组。 */ + public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0]; + + /** 空的boolean数组。 */ + public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0]; + + /** 空的Boolean数组。 */ + public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0]; + + /** 空的char数组。 */ + public static final char[] EMPTY_CHAR_ARRAY = new char[0]; + + /** 空的Character数组。 */ + public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0]; + + /** 计算hashcode所用的常量。 */ + private static final int INITIAL_NON_ZERO_ODD_NUMBER = 17; + + /** 计算hashcode所用的常量。 */ + private static final int MULTIPLIER_NON_ZERO_ODD_NUMBER = 37; + + /* ============================================================================ */ + /* 判空函数。 */ + /* */ + /* 判断一个数组是否为null或包含0个元素。 */ + /* ============================================================================ */ + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new String[0])     = true
+     * ArrayUtil.isEmpty(new String[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(Object[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new long[0])     = true
+     * ArrayUtil.isEmpty(new long[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(long[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new int[0])     = true
+     * ArrayUtil.isEmpty(new int[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(int[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new short[0])     = true
+     * ArrayUtil.isEmpty(new short[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(short[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new byte[0])     = true
+     * ArrayUtil.isEmpty(new byte[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(byte[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new double[0])     = true
+     * ArrayUtil.isEmpty(new double[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(double[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new float[0])     = true
+     * ArrayUtil.isEmpty(new float[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(float[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new boolean[0])     = true
+     * ArrayUtil.isEmpty(new boolean[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(boolean[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否为null或空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = true
+     * ArrayUtil.isEmpty(new char[0])     = true
+     * ArrayUtil.isEmpty(new char[10])    = false
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(char[] array) { + return ((array == null) || (array.length == 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new String[0])     = false
+     * ArrayUtil.isEmpty(new String[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(Object[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new long[0])     = false
+     * ArrayUtil.isEmpty(new long[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(long[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new int[0])     = false
+     * ArrayUtil.isEmpty(new int[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(int[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new short[0])     = false
+     * ArrayUtil.isEmpty(new short[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(short[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new byte[0])     = false
+     * ArrayUtil.isEmpty(new byte[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(byte[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new double[0])     = false
+     * ArrayUtil.isEmpty(new double[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(double[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new float[0])     = false
+     * ArrayUtil.isEmpty(new float[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(float[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new boolean[0])     = false
+     * ArrayUtil.isEmpty(new boolean[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(boolean[] array) { + return ((array != null) && (array.length > 0)); + } + + /** + * 检查数组是否不是null和空数组[]。 + *
+     * ArrayUtil.isEmpty(null)              = false
+     * ArrayUtil.isEmpty(new char[0])     = false
+     * ArrayUtil.isEmpty(new char[10])    = true
+     * 
+ * + * @param array 要检查的数组 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(char[] array) { + return ((array != null) && (array.length > 0)); + } + + /* ============================================================================ */ + /* 默认值函数。 */ + /* */ + /* 当数组为null或empty时,将数组转换成指定的默认数组。 */ + /* ============================================================================ */ + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new String[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new String[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static Object[] defaultIfNull(Object[] array) { + return (array == null) ? EMPTY_OBJECT_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new long[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new long[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static long[] defaultIfNull(long[] array) { + return (array == null) ? EMPTY_LONG_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new int[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new int[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static int[] defaultIfNull(int[] array) { + return (array == null) ? EMPTY_INT_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new short[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new short[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static short[] defaultIfNull(short[] array) { + return (array == null) ? EMPTY_SHORT_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new byte[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new byte[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static byte[] defaultIfNull(byte[] array) { + return (array == null) ? EMPTY_BYTE_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new double[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new double[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static double[] defaultIfNull(double[] array) { + return (array == null) ? EMPTY_DOUBLE_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new float[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new float[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static float[] defaultIfNull(float[] array) { + return (array == null) ? EMPTY_FLOAT_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new boolean[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new boolean[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static boolean[] defaultIfNull(boolean[] array) { + return (array == null) ? EMPTY_BOOLEAN_ARRAY : array; + } + + /** + * 如果数组是null,则返回空数组[],否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null)           = []
+     * ArrayUtil.defaultIfNull(new char[0])  = 数组本身
+     * ArrayUtil.defaultIfNull(new char[10]) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static char[] defaultIfNull(char[] array) { + return (array == null) ? EMPTY_CHAR_ARRAY : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfNull(new String[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new String[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static Object[] defaultIfNull(Object[] array, Object[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)         = defaultArray
+     * ArrayUtil.defaultIfNull(new long[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new long[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static long[] defaultIfNull(long[] array, long[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)        = defaultArray
+     * ArrayUtil.defaultIfNull(new int[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new int[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static int[] defaultIfNull(int[] array, int[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)          = defaultArray
+     * ArrayUtil.defaultIfNull(new short[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new short[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static short[] defaultIfNull(short[] array, short[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)         = defaultArray
+     * ArrayUtil.defaultIfNull(new byte[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new byte[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static byte[] defaultIfNull(byte[] array, byte[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)         = defaultArray
+     * ArrayUtil.defaultIfNull(new double[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new double[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static double[] defaultIfNull(double[] array, double[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)          = defaultArray
+     * ArrayUtil.defaultIfNull(new float[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new float[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static float[] defaultIfNull(float[] array, float[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)            = defaultArray
+     * ArrayUtil.defaultIfNull(new boolean[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new boolean[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static boolean[] defaultIfNull(boolean[] array, boolean[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, defaultArray)         = defaultArray
+     * ArrayUtil.defaultIfNull(new char[0], defaultArray)  = 数组本身
+     * ArrayUtil.defaultIfNull(new char[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static char[] defaultIfNull(char[] array, char[] defaultArray) { + return (array == null) ? defaultArray : array; + } + + /** + * 如果数组是null,则返回指定元素类型的空数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, String.class)           = new String[0]
+     * ArrayUtil.defaultIfNull(new String[0], String.class)  = 数组本身
+     * ArrayUtil.defaultIfNull(new String[10], String.class) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultComponentType 默认数组的元素类型 + * + * @return 数组本身或指定类型的空数组 + */ + public static Object[] defaultIfNull(Object[] array, Class defaultComponentType) { + return (array == null) ? (Object[]) Array.newInstance( + ClassUtil.getNonPrimitiveType(defaultComponentType), 0) : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)           = []
+     * ArrayUtil.defaultIfEmpty(new String[0])  = 数组本身
+     * ArrayUtil.defaultIfEmpty(new String[10]) = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static Object[] defaultIfEmpty(Object[] array) { + return (array == null) ? EMPTY_OBJECT_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)           = []
+     * ArrayUtil.defaultIfEmpty(new long[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new long[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static long[] defaultIfEmpty(long[] array) { + return (array == null) ? EMPTY_LONG_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)          = []
+     * ArrayUtil.defaultIfEmpty(new int[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new int[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static int[] defaultIfEmpty(int[] array) { + return (array == null) ? EMPTY_INT_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)               = []
+     * ArrayUtil.defaultIfEmpty(new short[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new short[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static short[] defaultIfEmpty(short[] array) { + return (array == null) ? EMPTY_SHORT_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)           = []
+     * ArrayUtil.defaultIfEmpty(new byte[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new byte[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static byte[] defaultIfEmpty(byte[] array) { + return (array == null) ? EMPTY_BYTE_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)               = []
+     * ArrayUtil.defaultIfEmpty(new double[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new double[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static double[] defaultIfEmpty(double[] array) { + return (array == null) ? EMPTY_DOUBLE_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)               = []
+     * ArrayUtil.defaultIfEmpty(new float[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new float[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static float[] defaultIfEmpty(float[] array) { + return (array == null) ? EMPTY_FLOAT_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)               = []
+     * ArrayUtil.defaultIfEmpty(new boolean[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new boolean[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static boolean[] defaultIfEmpty(boolean[] array) { + return (array == null) ? EMPTY_BOOLEAN_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回空数组[],否则返回数组本身。 + * + *

+ * 此方法实际上和defaultIfNull(Object[])等效。 + *

+     * ArrayUtil.defaultIfEmpty(null)           = []
+     * ArrayUtil.defaultIfEmpty(new char[0])    = 数组本身
+     * ArrayUtil.defaultIfEmpty(new char[10])   = 数组本身
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 数组本身或空数组[] + */ + public static char[] defaultIfEmpty(char[] array) { + return (array == null) ? EMPTY_CHAR_ARRAY : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new String[0], defaultArray)  = defaultArray
+     * ArrayUtil.defaultIfEmpty(new String[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static Object[] defaultIfEmpty(Object[] array, Object[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new long[0], defaultArray)    = defaultArray
+     * ArrayUtil.defaultIfEmpty(new long[10], defaultArray)   = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static long[] defaultIfEmpty(long[] array, long[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new int[0], defaultArray)     = defaultArray
+     * ArrayUtil.defaultIfEmpty(new int[10], defaultArray)    = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static int[] defaultIfEmpty(int[] array, int[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new short[0], defaultArray)   = defaultArray
+     * ArrayUtil.defaultIfEmpty(new short[10], defaultArray)  = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static short[] defaultIfEmpty(short[] array, short[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new byte[0], defaultArray)    = defaultArray
+     * ArrayUtil.defaultIfEmpty(new byte[10], defaultArray)   = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static byte[] defaultIfEmpty(byte[] array, byte[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new double[0], defaultArray)  = defaultArray
+     * ArrayUtil.defaultIfEmpty(new double[10], defaultArray) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static double[] defaultIfEmpty(double[] array, double[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new float[0], defaultArray)   = defaultArray
+     * ArrayUtil.defaultIfEmpty(new float[10], defaultArray)  = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static float[] defaultIfEmpty(float[] array, float[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)              = defaultArray
+     * ArrayUtil.defaultIfEmpty(new boolean[0], defaultArray)    = defaultArray
+     * ArrayUtil.defaultIfEmpty(new boolean[10], defaultArray)   = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static boolean[] defaultIfEmpty(boolean[] array, boolean[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定默认数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfEmpty(null, defaultArray)           = defaultArray
+     * ArrayUtil.defaultIfEmpty(new char[0], defaultArray)    = defaultArray
+     * ArrayUtil.defaultIfEmpty(new char[10], defaultArray)   = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultArray 默认数组 + * + * @return 数组本身或指定的默认数组 + */ + public static char[] defaultIfEmpty(char[] array, char[] defaultArray) { + return ((array == null) || (array.length == 0)) ? defaultArray : array; + } + + /** + * 如果数组是null或空数组[],则返回指定元素类型的空数组,否则返回数组本身。 + *
+     * ArrayUtil.defaultIfNull(null, String.class)           = new String[0]
+     * ArrayUtil.defaultIfNull(new String[0], String.class)  = new String[0]
+     * ArrayUtil.defaultIfNull(new String[10], String.class) = 数组本身
+     * 
+ * + * @param array 要转换的数组 + * @param defaultComponentType 默认数组的元素类型 + * + * @return 数组本身或指定类型的空数组 + */ + public static Object[] defaultIfEmpty(Object[] array, Class defaultComponentType) { + return ((array == null) || (array.length == 0)) ? (Object[]) Array.newInstance( + ClassUtil.getNonPrimitiveType(defaultComponentType), 0) : array; + } + + /* ============================================================================ */ + /* 比较函数。 */ + /* */ + /* 以下方法用来比较两个数组是否完全相同,支持多维数组。 */ + /* ============================================================================ */ + + /** + * 递归地比较两个数组是否相同,支持多维数组。 + * + *

+ * 如果比较的对象不是数组,则此方法的结果同ObjectUtil.equals。 + *

+ * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果相等, 则返回true + */ + public static boolean equals(Object array1, Object array2) { + if (array1 == array2) { + return true; + } + + if ((array1 == null) || (array2 == null)) { + return false; + } + + Class clazz = array1.getClass(); + + if (!clazz.equals(array2.getClass())) { + return false; + } + + if (!clazz.isArray()) { + return array1.equals(array2); + } + + // array1和array2为同类型的数组 + if (array1 instanceof long[]) { + long[] longArray1 = (long[]) array1; + long[] longArray2 = (long[]) array2; + + if (longArray1.length != longArray2.length) { + return false; + } + + for (int i = 0; i < longArray1.length; i++) { + if (longArray1[i] != longArray2[i]) { + return false; + } + } + + return true; + } else if (array1 instanceof int[]) { + int[] intArray1 = (int[]) array1; + int[] intArray2 = (int[]) array2; + + if (intArray1.length != intArray2.length) { + return false; + } + + for (int i = 0; i < intArray1.length; i++) { + if (intArray1[i] != intArray2[i]) { + return false; + } + } + + return true; + } else if (array1 instanceof short[]) { + short[] shortArray1 = (short[]) array1; + short[] shortArray2 = (short[]) array2; + + if (shortArray1.length != shortArray2.length) { + return false; + } + + for (int i = 0; i < shortArray1.length; i++) { + if (shortArray1[i] != shortArray2[i]) { + return false; + } + } + + return true; + } else if (array1 instanceof byte[]) { + byte[] byteArray1 = (byte[]) array1; + byte[] byteArray2 = (byte[]) array2; + + if (byteArray1.length != byteArray2.length) { + return false; + } + + for (int i = 0; i < byteArray1.length; i++) { + if (byteArray1[i] != byteArray2[i]) { + return false; + } + } + + return true; + } else if (array1 instanceof double[]) { + double[] doubleArray1 = (double[]) array1; + double[] doubleArray2 = (double[]) array2; + + if (doubleArray1.length != doubleArray2.length) { + return false; + } + + for (int i = 0; i < doubleArray1.length; i++) { + if (Double.doubleToLongBits(doubleArray1[i]) != Double + .doubleToLongBits(doubleArray2[i])) { + return false; + } + } + + return true; + } else if (array1 instanceof float[]) { + float[] floatArray1 = (float[]) array1; + float[] floatArray2 = (float[]) array2; + + if (floatArray1.length != floatArray2.length) { + return false; + } + + for (int i = 0; i < floatArray1.length; i++) { + if (Float.floatToIntBits(floatArray1[i]) != Float.floatToIntBits(floatArray2[i])) { + return false; + } + } + + return true; + } else if (array1 instanceof boolean[]) { + boolean[] booleanArray1 = (boolean[]) array1; + boolean[] booleanArray2 = (boolean[]) array2; + + if (booleanArray1.length != booleanArray2.length) { + return false; + } + + for (int i = 0; i < booleanArray1.length; i++) { + if (booleanArray1[i] != booleanArray2[i]) { + return false; + } + } + + return true; + } else if (array1 instanceof char[]) { + char[] charArray1 = (char[]) array1; + char[] charArray2 = (char[]) array2; + + if (charArray1.length != charArray2.length) { + return false; + } + + for (int i = 0; i < charArray1.length; i++) { + if (charArray1[i] != charArray2[i]) { + return false; + } + } + + return true; + } else { + Object[] objectArray1 = (Object[]) array1; + Object[] objectArray2 = (Object[]) array2; + + if (objectArray1.length != objectArray2.length) { + return false; + } + + for (int i = 0; i < objectArray1.length; i++) { + if (!equals(objectArray1[i], objectArray2[i])) { + return false; + } + } + + return true; + } + } + + /* ============================================================================ */ + /* Hashcode函数。 */ + /* */ + /* 以下方法用来取得数组的hash code。 */ + /* ============================================================================ */ + + /** + * 取得数组的hash值, 如果数组为null, 则返回0。 + * + *

+ * 如果对象不是数组,则此方法的结果同ObjectUtil.hashCode。 + *

+ * + * @param array 数组 + * + * @return hash值 + */ + public static int hashCode(Object array) { + if (array == null) { + return 0; + } + + if (!array.getClass().isArray()) { + return array.hashCode(); + } + + int hashCode = INITIAL_NON_ZERO_ODD_NUMBER; + + // array是数组 + if (array instanceof long[]) { + long[] longArray = (long[]) array; + + for (int i = 0; i < longArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + + ((int) (longArray[i] ^ (longArray[i] >> 32))); + } + } else if (array instanceof int[]) { + int[] intArray = (int[]) array; + + for (int i = 0; i < intArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + intArray[i]; + } + } else if (array instanceof short[]) { + short[] shortArray = (short[]) array; + + for (int i = 0; i < shortArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + shortArray[i]; + } + } else if (array instanceof byte[]) { + byte[] byteArray = (byte[]) array; + + for (int i = 0; i < byteArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + byteArray[i]; + } + } else if (array instanceof double[]) { + double[] doubleArray = (double[]) array; + + for (int i = 0; i < doubleArray.length; i++) { + long longBits = Double.doubleToLongBits(doubleArray[i]); + + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + + ((int) (longBits ^ (longBits >> 32))); + } + } else if (array instanceof float[]) { + float[] floatArray = (float[]) array; + + for (int i = 0; i < floatArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + + Float.floatToIntBits(floatArray[i]); + } + } else if (array instanceof boolean[]) { + boolean[] booleanArray = (boolean[]) array; + + for (int i = 0; i < booleanArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + (booleanArray[i] ? 1 : 0); + } + } else if (array instanceof char[]) { + char[] charArray = (char[]) array; + + for (int i = 0; i < charArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + charArray[i]; + } + } else { + Object[] objectArray = (Object[]) array; + + for (int i = 0; i < objectArray.length; i++) { + hashCode = (hashCode * MULTIPLIER_NON_ZERO_ODD_NUMBER) + hashCode(objectArray[i]); + } + } + + return hashCode; + } + + /* ============================================================================ */ + /* 将数组转换成集合类。 */ + /* ============================================================================ */ + + /** + * 将数组映射成固定长度的List,当改变这个List中的值时。数组中的相应值也被改变。 + * + *

+ * 如果输入数组为null,则返回null。 + *

+ * + *

+ * 该方法内部调用java.util.Arrays.asList方法所返回的列表为指定数组的映像(固定长度),因此性能和内存占用上比toList方法更优。 + *

+ * + *

+ * 这个方法常被用于初始化,例如: + *

+     * List myList = ArrayUtil.toFixedList(new String[] { "aaa", "bbb", "ccc" });
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 以数组本身为映射的list + */ + public static List toFixedList(Object[] array) { + if (array == null) { + return null; + } + + return Arrays.asList(array); + } + + /** + * 将数组转换成List。 + * + *

+ * 如果输入数组为null,则返回null。 + *

+ * + *

+ * 该方法返回的列表为指定数组的复本,而java.util.Arrays.asList方法所返回的列表为指定数组的映像(固定长度)。 + *

+ * + *

+ * 这个方法常被用于初始化,例如: + *

+     * List myList      = ArrayUtil.toList(new String[] { "aaa", "bbb", "ccc" });
+     * List singleList  = ArrayUtil.toList("hello");     // 返回单个元素的列表["hello"]
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 被创建的list + */ + public static List toList(Object array) { + return toList(array, null); + } + + /** + * 将数组转换成List。 + * + *

+ * 如果输入数组为null,则返回null。 + *

+ * + *

+ * 该方法返回的列表为指定数组的复本,而java.util.Arrays.asList方法所返回的列表为指定数组的映像(固定长度)。 + *

+ * + *

+ * 这个方法常被用于初始化,例如: + *

+     * List myList      = ArrayUtil.toList(new String[] { "aaa", "bbb", "ccc" }, new ArrayList());
+     * List singleList  = ArrayUtil.toList("hello", new ArrayList());     // 返回单个元素的列表["hello"]
+     * 
+ *

+ * + * @param array 要转换的数组 + * @param list 要填充的列表,如果是null,则创建之 + * + * @return 被创建或填充的list + */ + public static List toList(Object array, List list) { + if (array == null) { + return list; + } + + // 非array,创建一个只有一个元素的列表 + if (!array.getClass().isArray()) { + if (list == null) { + list = new ArrayList(1); + } + + list.add(array); + } else if (array instanceof long[]) { + long[] longArray = (long[]) array; + + if (list == null) { + list = new ArrayList(longArray.length); + } + + for (int i = 0; i < longArray.length; i++) { + list.add(new Long(longArray[i])); + } + } else if (array instanceof int[]) { + int[] intArray = (int[]) array; + + if (list == null) { + list = new ArrayList(intArray.length); + } + + for (int i = 0; i < intArray.length; i++) { + list.add(new Integer(intArray[i])); + } + } else if (array instanceof short[]) { + short[] shortArray = (short[]) array; + + if (list == null) { + list = new ArrayList(shortArray.length); + } + + for (int i = 0; i < shortArray.length; i++) { + list.add(new Short(shortArray[i])); + } + } else if (array instanceof byte[]) { + byte[] byteArray = (byte[]) array; + + if (list == null) { + list = new ArrayList(byteArray.length); + } + + for (int i = 0; i < byteArray.length; i++) { + list.add(new Byte(byteArray[i])); + } + } else if (array instanceof double[]) { + double[] doubleArray = (double[]) array; + + if (list == null) { + list = new ArrayList(doubleArray.length); + } + + for (int i = 0; i < doubleArray.length; i++) { + list.add(new Double(doubleArray[i])); + } + } else if (array instanceof float[]) { + float[] floatArray = (float[]) array; + + if (list == null) { + list = new ArrayList(floatArray.length); + } + + for (int i = 0; i < floatArray.length; i++) { + list.add(new Float(floatArray[i])); + } + } else if (array instanceof boolean[]) { + boolean[] booleanArray = (boolean[]) array; + + if (list == null) { + list = new ArrayList(booleanArray.length); + } + + for (int i = 0; i < booleanArray.length; i++) { + list.add(booleanArray[i] ? Boolean.TRUE : Boolean.FALSE); + } + } else if (array instanceof char[]) { + char[] charArray = (char[]) array; + + if (list == null) { + list = new ArrayList(charArray.length); + } + + for (int i = 0; i < charArray.length; i++) { + list.add(new Character(charArray[i])); + } + } else { + Object[] objectArray = (Object[]) array; + + if (list == null) { + list = new ArrayList(objectArray.length); + } + + for (int i = 0; i < objectArray.length; i++) { + list.add(objectArray[i]); + } + } + + return list; + } + + /** + * 将数组转换成Map。数组的元素必须是Map.Entry或元素个数多于2的子数组。 + * + *

+ * 如果输入数组为null,则返回null。 + *

+ * + *

+ * 这个方法常被用于初始化,例如: + *

+     * Map colorMap = ArrayUtil.toMap(new String[][] {
+     *     {"RED", "#FF0000"},
+     *     {"GREEN", "#00FF00"},
+     *     {"BLUE", "#0000FF"}});
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 被创建的map + * + * @throws IllegalArgumentException 如果有一个子数组元素个数小于2或不是Map.Entry实例 + */ + public static Map toMap(Object[] array) { + return toMap(array, null); + } + + /** + * 将数组转换成Map。数组的元素必须是Map.Entry或元素个数多于2的子数组。 + * + *

+ * 如果输入数组为null,则返回null。 + *

+ * + *

+ * 这个方法常被用于初始化,例如: + *

+     * Map colorMap = ArrayUtil.toMap(new String[][] {{
+     *     {"RED", "#FF0000"},
+     *     {"GREEN", "#00FF00"},
+     *     {"BLUE", "#0000FF"}}, new HashMap());
+     * 
+ *

+ * + * @param array 要转换的数组 + * @param map 要填充的map,如果为null则自动创建之 + * + * @return 被创建或填充的map + * + * @throws IllegalArgumentException 如果有一个子数组元素个数小于2或不是Map.Entry实例 + */ + public static Map toMap(Object[] array, Map map) { + if (array == null) { + return map; + } + + if (map == null) { + map = new HashMap((int) (array.length * 1.5)); + } + + for (int i = 0; i < array.length; i++) { + Object object = array[i]; + + if (object instanceof Map.Entry) { + Map.Entry entry = (Map.Entry) object; + + map.put(entry.getKey(), entry.getValue()); + } else if (object instanceof Object[]) { + Object[] entry = (Object[]) object; + + if (entry.length < 2) { + throw new IllegalArgumentException("Array element " + i + ", '" + object + + "', has a length less than 2"); + } + + map.put(entry[0], entry[1]); + } else { + throw new IllegalArgumentException("Array element " + i + ", '" + object + + "', is neither of type Map.Entry nor an Array"); + } + } + + return map; + } + + /* ============================================================================ */ + /* Clone函数。 */ + /* */ + /* 以下方法调用Object.clone方法,进行“浅复制”(shallow copy)。 */ + /* ============================================================================ */ + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法只进行“浅复制”,也就是说,数组中的对象本身不会被复制。 另外,此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static Object[] clone(Object[] array) { + if (array == null) { + return null; + } + + return (Object[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static long[] clone(long[] array) { + if (array == null) { + return null; + } + + return (long[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static int[] clone(int[] array) { + if (array == null) { + return null; + } + + return (int[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static short[] clone(short[] array) { + if (array == null) { + return null; + } + + return (short[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static byte[] clone(byte[] array) { + if (array == null) { + return null; + } + + return (byte[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static double[] clone(double[] array) { + if (array == null) { + return null; + } + + return (double[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static float[] clone(float[] array) { + if (array == null) { + return null; + } + + return (float[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static boolean[] clone(boolean[] array) { + if (array == null) { + return null; + } + + return (boolean[]) array.clone(); + } + + /** + * 复制一个数组。如果数组为null,则返回null。 + * + *

+ * 此方法也不处理多维数组。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static char[] clone(char[] array) { + if (array == null) { + return null; + } + + return (char[]) array.clone(); + } + + /* ============================================================================ */ + /* 比较数组的长度。 */ + /* ============================================================================ */ + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(Object[] array1, Object[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(long[] array1, long[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(int[] array1, int[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(short[] array1, short[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(byte[] array1, byte[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(double[] array1, double[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(float[] array1, float[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(boolean[] array1, boolean[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /** + * 判断两个数组是否具有相同的长度。如果数组为null则被看作长度为0。 + * + * @param array1 数组1 + * @param array2 数组2 + * + * @return 如果两个数组长度相同,则返回true + */ + public static boolean isSameLength(char[] array1, char[] array2) { + int length1 = (array1 == null) ? 0 : array1.length; + int length2 = (array2 == null) ? 0 : array2.length; + + return length1 == length2; + } + + /* ============================================================================ */ + /* 反转数组的元素顺序。 */ + /* ============================================================================ */ + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(Object[] array) { + if (array == null) { + return; + } + + Object tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(long[] array) { + if (array == null) { + return; + } + + long tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(int[] array) { + if (array == null) { + return; + } + + int tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(short[] array) { + if (array == null) { + return; + } + + short tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(byte[] array) { + if (array == null) { + return; + } + + byte tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(double[] array) { + if (array == null) { + return; + } + + double tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(float[] array) { + if (array == null) { + return; + } + + float tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(boolean[] array) { + if (array == null) { + return; + } + + boolean tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /** + * 反转数组的元素顺序。如果数组为null,则什么也不做。 + * + * @param array 要反转的数组 + */ + public static void reverse(char[] array) { + if (array == null) { + return; + } + + char tmp; + + for (int i = 0, j = array.length - 1; j > i; i++, j--) { + tmp = array[j]; + array[j] = array[i]; + array[i] = tmp; + } + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:Object[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param objectToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(Object[] array, Object objectToFind) { + return indexOf(array, objectToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(Object[] array, Object[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param objectToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(Object[] array, Object objectToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (objectToFind == null) { + for (int i = startIndex; i < array.length; i++) { + if (array[i] == null) { + return i; + } + } + } else { + for (int i = startIndex; i < array.length; i++) { + if (objectToFind.equals(array[i])) { + return i; + } + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(Object[] array, Object[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + Object first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && !ObjectUtil.equals(array[i], first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (!ObjectUtil.equals(array[j++], arrayToFind[k++])) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param objectToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(Object[] array, Object objectToFind) { + return lastIndexOf(array, objectToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(Object[] array, Object[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param objectToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(Object[] array, Object objectToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + if (objectToFind == null) { + for (int i = startIndex; i >= 0; i--) { + if (array[i] == null) { + return i; + } + } + } else { + for (int i = startIndex; i >= 0; i--) { + if (objectToFind.equals(array[i])) { + return i; + } + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(Object[] array, Object[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + Object last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && !ObjectUtil.equals(array[i], last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (!ObjectUtil.equals(array[j--], arrayToFind[k--])) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param objectToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(Object[] array, Object objectToFind) { + return indexOf(array, objectToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(Object[] array, Object[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:long[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param longToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(long[] array, long longToFind) { + return indexOf(array, longToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(long[] array, long[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param longToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(long[] array, long longToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + for (int i = startIndex; i < array.length; i++) { + if (longToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(long[] array, long[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + long first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && (array[i] != first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (array[j++] != arrayToFind[k++]) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param longToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(long[] array, long longToFind) { + return lastIndexOf(array, longToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(long[] array, long[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param longToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(long[] array, long longToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + for (int i = startIndex; i >= 0; i--) { + if (longToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(long[] array, long[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + long last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && (array[i] != last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (array[j--] != arrayToFind[k--]) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param longToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(long[] array, long longToFind) { + return indexOf(array, longToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(long[] array, long[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:int[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param intToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(int[] array, int intToFind) { + return indexOf(array, intToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(int[] array, int[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param intToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(int[] array, int intToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + for (int i = startIndex; i < array.length; i++) { + if (intToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(int[] array, int[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + int first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && (array[i] != first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (array[j++] != arrayToFind[k++]) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param intToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(int[] array, int intToFind) { + return lastIndexOf(array, intToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(int[] array, int[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param intToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(int[] array, int intToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + for (int i = startIndex; i >= 0; i--) { + if (intToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(int[] array, int[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + int last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && (array[i] != last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (array[j--] != arrayToFind[k--]) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param intToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(int[] array, int intToFind) { + return indexOf(array, intToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(int[] array, int[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:short[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param shortToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(short[] array, short shortToFind) { + return indexOf(array, shortToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(short[] array, short[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param shortToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(short[] array, short shortToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + for (int i = startIndex; i < array.length; i++) { + if (shortToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(short[] array, short[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + short first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && (array[i] != first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (array[j++] != arrayToFind[k++]) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param shortToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(short[] array, short shortToFind) { + return lastIndexOf(array, shortToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(short[] array, short[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param shortToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(short[] array, short shortToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + for (int i = startIndex; i >= 0; i--) { + if (shortToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(short[] array, short[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + short last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && (array[i] != last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (array[j--] != arrayToFind[k--]) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param shortToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(short[] array, short shortToFind) { + return indexOf(array, shortToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(short[] array, short[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:byte[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param byteToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(byte[] array, byte byteToFind) { + return indexOf(array, byteToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(byte[] array, byte[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param byteToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(byte[] array, byte byteToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + for (int i = startIndex; i < array.length; i++) { + if (byteToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(byte[] array, byte[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + byte first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && (array[i] != first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (array[j++] != arrayToFind[k++]) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param byteToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(byte[] array, byte byteToFind) { + return lastIndexOf(array, byteToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(byte[] array, byte[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param byteToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(byte[] array, byte byteToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + for (int i = startIndex; i >= 0; i--) { + if (byteToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(byte[] array, byte[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + byte last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && (array[i] != last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (array[j--] != arrayToFind[k--]) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param byteToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(byte[] array, byte byteToFind) { + return indexOf(array, byteToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(byte[] array, byte[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:double[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double doubleToFind) { + return indexOf(array, doubleToFind, 0, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double doubleToFind, double tolerance) { + return indexOf(array, doubleToFind, 0, tolerance); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double[] arrayToFind) { + return indexOf(array, arrayToFind, 0, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double[] arrayToFind, double tolerance) { + return indexOf(array, arrayToFind, 0, tolerance); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double doubleToFind, int startIndex) { + return indexOf(array, doubleToFind, startIndex, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double doubleToFind, int startIndex, double tolerance) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + double min = doubleToFind - tolerance; + double max = doubleToFind + tolerance; + + for (int i = startIndex; i < array.length; i++) { + if ((array[i] >= min) && (array[i] <= max)) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double[] arrayToFind, int startIndex) { + return indexOf(array, arrayToFind, startIndex, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(double[] array, double[] arrayToFind, int startIndex, double tolerance) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + double firstMin = arrayToFind[0] - tolerance; + double firstMax = arrayToFind[0] + tolerance; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && ((array[i] < firstMin) || (array[i] > firstMax))) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (Math.abs(array[j++] - arrayToFind[k++]) > tolerance) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double doubleToFind) { + return lastIndexOf(array, doubleToFind, Integer.MAX_VALUE, 0); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double doubleToFind, double tolerance) { + return lastIndexOf(array, doubleToFind, Integer.MAX_VALUE, tolerance); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE, 0); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double[] arrayToFind, double tolerance) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE, tolerance); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double doubleToFind, int startIndex) { + return lastIndexOf(array, doubleToFind, startIndex, 0); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double doubleToFind, int startIndex, + double tolerance) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + double min = doubleToFind - tolerance; + double max = doubleToFind + tolerance; + + for (int i = startIndex; i >= 0; i--) { + if ((array[i] >= min) && (array[i] <= max)) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double[] arrayToFind, int startIndex) { + return lastIndexOf(array, arrayToFind, startIndex, 0); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(double[] array, double[] arrayToFind, int startIndex, + double tolerance) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + double lastMin = arrayToFind[lastIndex] - tolerance; + double lastMax = arrayToFind[lastIndex] + tolerance; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && ((array[i] < lastMin) || (array[i] > lastMax))) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (Math.abs(array[j--] - arrayToFind[k--]) > tolerance) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(double[] array, double doubleToFind) { + return indexOf(array, doubleToFind) != -1; + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param doubleToFind 要查找的元素 + * @param tolerance 误差 + * + * @return 如果找到则返回true + */ + public static boolean contains(double[] array, double doubleToFind, double tolerance) { + return indexOf(array, doubleToFind, tolerance) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(double[] array, double[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param tolerance 误差 + * + * @return 如果找到则返回true + */ + public static boolean contains(double[] array, double[] arrayToFind, double tolerance) { + return indexOf(array, arrayToFind, tolerance) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:float[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float floatToFind) { + return indexOf(array, floatToFind, 0, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float floatToFind, float tolerance) { + return indexOf(array, floatToFind, 0, tolerance); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float[] arrayToFind) { + return indexOf(array, arrayToFind, 0, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float[] arrayToFind, float tolerance) { + return indexOf(array, arrayToFind, 0, tolerance); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float floatToFind, int startIndex) { + return indexOf(array, floatToFind, startIndex, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float floatToFind, int startIndex, float tolerance) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + float min = floatToFind - tolerance; + float max = floatToFind + tolerance; + + for (int i = startIndex; i < array.length; i++) { + if ((array[i] >= min) && (array[i] <= max)) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float[] arrayToFind, int startIndex) { + return indexOf(array, arrayToFind, startIndex, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(float[] array, float[] arrayToFind, int startIndex, float tolerance) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + float firstMin = arrayToFind[0] - tolerance; + float firstMax = arrayToFind[0] + tolerance; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && ((array[i] < firstMin) || (array[i] > firstMax))) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (Math.abs(array[j++] - arrayToFind[k++]) > tolerance) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float floatToFind) { + return lastIndexOf(array, floatToFind, Integer.MAX_VALUE, 0); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float floatToFind, float tolerance) { + return lastIndexOf(array, floatToFind, Integer.MAX_VALUE, tolerance); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE, 0); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float[] arrayToFind, float tolerance) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE, tolerance); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float floatToFind, int startIndex) { + return lastIndexOf(array, floatToFind, startIndex, 0); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float floatToFind, int startIndex, float tolerance) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + float min = floatToFind - tolerance; + float max = floatToFind + tolerance; + + for (int i = startIndex; i >= 0; i--) { + if ((array[i] >= min) && (array[i] <= max)) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float[] arrayToFind, int startIndex) { + return lastIndexOf(array, arrayToFind, startIndex, 0); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * @param tolerance 误差 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(float[] array, float[] arrayToFind, int startIndex, + float tolerance) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + float lastMin = arrayToFind[lastIndex] - tolerance; + float lastMax = arrayToFind[lastIndex] + tolerance; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && ((array[i] < lastMin) || (array[i] > lastMax))) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (Math.abs(array[j--] - arrayToFind[k--]) > tolerance) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(float[] array, float floatToFind) { + return indexOf(array, floatToFind) != -1; + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param floatToFind 要查找的元素 + * @param tolerance 误差 + * + * @return 如果找到则返回true + */ + public static boolean contains(float[] array, float floatToFind, float tolerance) { + return indexOf(array, floatToFind, tolerance) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(float[] array, float[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param tolerance 误差 + * + * @return 如果找到则返回true + */ + public static boolean contains(float[] array, float[] arrayToFind, float tolerance) { + return indexOf(array, arrayToFind, tolerance) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:boolean[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param booleanToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(boolean[] array, boolean booleanToFind) { + return indexOf(array, booleanToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(boolean[] array, boolean[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param booleanToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(boolean[] array, boolean booleanToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + for (int i = startIndex; i < array.length; i++) { + if (booleanToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(boolean[] array, boolean[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + boolean first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && (array[i] != first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (array[j++] != arrayToFind[k++]) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param booleanToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(boolean[] array, boolean booleanToFind) { + return lastIndexOf(array, booleanToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(boolean[] array, boolean[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param booleanToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(boolean[] array, boolean booleanToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + for (int i = startIndex; i >= 0; i--) { + if (booleanToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(boolean[] array, boolean[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + boolean last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && (array[i] != last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (array[j--] != arrayToFind[k--]) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param booleanToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(boolean[] array, boolean booleanToFind) { + return indexOf(array, booleanToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(boolean[] array, boolean[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 在数组中查找一个元素或一个元素序列。 */ + /* */ + /* 类型:char[] */ + /* ============================================================================ */ + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param charToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(char[] array, char charToFind) { + return indexOf(array, charToFind, 0); + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(char[] array, char[] arrayToFind) { + return indexOf(array, arrayToFind, 0); + } + + /** + * 在数组中查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param charToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(char[] array, char charToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + startIndex = 0; + } + + for (int i = startIndex; i < array.length; i++) { + if (charToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则看作0,超出数组长度的起始索引则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int indexOf(char[] array, char[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + if (startIndex >= sourceLength) { + return (targetLength == 0) ? sourceLength : (-1); + } + + if (startIndex < 0) { + startIndex = 0; + } + + if (targetLength == 0) { + return startIndex; + } + + char first = arrayToFind[0]; + int i = startIndex; + int max = sourceLength - targetLength; + + startSearchForFirst: while (true) { + // 查找第一个元素 + while ((i <= max) && (array[i] != first)) { + i++; + } + + if (i > max) { + return -1; + } + + // 已经找到第一个元素,接着找 + int j = i + 1; + int end = (j + targetLength) - 1; + int k = 1; + + while (j < end) { + if (array[j++] != arrayToFind[k++]) { + i++; + + // 重新查找第一个元素 + continue startSearchForFirst; + } + } + + // 找到了 + return i; + } + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param charToFind 要查找的元素 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(char[] array, char charToFind) { + return lastIndexOf(array, charToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(char[] array, char[] arrayToFind) { + return lastIndexOf(array, arrayToFind, Integer.MAX_VALUE); + } + + /** + * 在数组中从末尾开始查找一个元素。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param charToFind 要查找的元素 + * @param startIndex 起始索引 + * + * @return 该元素在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(char[] array, char charToFind, int startIndex) { + if (array == null) { + return -1; + } + + if (startIndex < 0) { + return -1; + } else if (startIndex >= array.length) { + startIndex = array.length - 1; + } + + for (int i = startIndex; i >= 0; i--) { + if (charToFind == array[i]) { + return i; + } + } + + return -1; + } + + /** + * 在数组中从末尾开始查找一个元素序列。 + * + *

+ * 如果未找到或数组为null则返回-1。 + *

+ * + *

+ * 起始索引小于0则返回-1,超出数组长度的起始索引则从数组末尾开始找。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * @param startIndex 起始索引 + * + * @return 该元素序列在数组中的序号,如果数组为null或未找到,则返回-1。 + */ + public static int lastIndexOf(char[] array, char[] arrayToFind, int startIndex) { + if ((array == null) || (arrayToFind == null)) { + return -1; + } + + int sourceLength = array.length; + int targetLength = arrayToFind.length; + + int rightIndex = sourceLength - targetLength; + + if (startIndex < 0) { + return -1; + } + + if (startIndex > rightIndex) { + startIndex = rightIndex; + } + + if (targetLength == 0) { + return startIndex; + } + + int lastIndex = targetLength - 1; + char last = arrayToFind[lastIndex]; + int min = targetLength - 1; + int i = min + startIndex; + + startSearchForLast: while (true) { + while ((i >= min) && (array[i] != last)) { + i--; + } + + if (i < min) { + return -1; + } + + int j = i - 1; + int start = j - (targetLength - 1); + int k = lastIndex - 1; + + while (j > start) { + if (array[j--] != arrayToFind[k--]) { + i--; + continue startSearchForLast; + } + } + + return start + 1; + } + } + + /** + * 判断指定对象是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param charToFind 要查找的元素 + * + * @return 如果找到则返回true + */ + public static boolean contains(char[] array, char charToFind) { + return indexOf(array, charToFind) != -1; + } + + /** + * 判断指定元素序列是否存在于指定数组中。 + * + *

+ * 如果数组为null则返回false。 + *

+ * + * @param array 要扫描的数组 + * @param arrayToFind 要查找的元素序列 + * + * @return 如果找到则返回true + */ + public static boolean contains(char[] array, char[] arrayToFind) { + return indexOf(array, arrayToFind) != -1; + } + + /* ============================================================================ */ + /* 将数组转换成易于阅读的字符串表示。 */ + /* */ + /* 支持多维数组。 */ + /* ============================================================================ */ + + /** + * 将数组转换成易于阅读的字符串表示。 + * + *

+ * 如果数组是null则返回[],支持多维数组。 + * 如果数组元素为null,则显示<null>。 + *

+     * ArrayUtil.toString(null)                              = "[]"
+     * ArrayUtil.toString(new int[] {1, 2, 3})               = "[1, 2, 3]"
+     * ArrayUtil.toString(new boolean[] {true, false, true}) = "[true, false, true]"
+     * ArrayUtil.toString(new Object[] {
+     *                       {1, 2, 3},  // 嵌套数组
+     *                       hello,      // 嵌套非数组
+     *                       null,       // 嵌套null
+     *                       {},         // 嵌套空数组
+     *                       {2, 3, 4}   // 嵌套数组
+     *                    })                                 = "[[1, 2, 3], hello, , [], [2, 3, 4]]"
+     * 
+ *

+ * + * @param array 要转换的数组 + * + * @return 字符串表示,"[]"表示空数组或null + */ + public static String toString(Object array) { + return toString(array, "[]", ""); + } + + /** + * 将数组转换成易于阅读的字符串表示。 + * + *

+ * 如果数组是null则返回指定字符串,支持多维数组。 + * 如果数组元素为null,则显示<null>。 + *

+     * ArrayUtil.toString(null, "null")                              = "null"
+     * ArrayUtil.toString(new int[] {1, 2, 3}, "null")               = "[1, 2, 3]"
+     * ArrayUtil.toString(new boolean[] {true, false, true}, "null") = "[true, false, true]"
+     * ArrayUtil.toString(new Object[] {
+     *                       {1, 2, 3},  // 嵌套数组
+     *                       hello,      // 嵌套非数组
+     *                       null,       // 嵌套null
+     *                       {},         // 嵌套空数组
+     *                       {2, 3, 4}   // 嵌套数组
+     *                    }, "null")                                 = "[[1, 2, 3], hello, , [], [2, 3, 4]]"
+     * 
+ *

+ * + * @param array 要转换的数组 + * @param nullArrayStr 如果数组是null,则返回此字符串 + * + * @return 字符串表示,或返回指定字符串表示null + */ + public static String toString(Object array, String nullArrayStr) { + return toString(array, nullArrayStr, ""); + } + + /** + * 将数组转换成易于阅读的字符串表示。 + * + *

+ * 如果数组是null则返回指定字符串,支持多维数组。 如果数组元素为null,则显示指定字符串。 + *

+     * ArrayUtil.toString(null, "null", "NULL")                              = "null"
+     * ArrayUtil.toString(new int[] {1, 2, 3}, "null", "NULL")               = "[1, 2, 3]"
+     * ArrayUtil.toString(new boolean[] {true, false, true}, "null", "NULL") = "[true, false, true]"
+     * ArrayUtil.toString(new Object[] {
+     *                       {1, 2, 3},  // 嵌套数组
+     *                       hello,      // 嵌套非数组
+     *                       null,       // 嵌套null
+     *                       {},         // 嵌套空数组
+     *                       {2, 3, 4}   // 嵌套数组
+     *                    }, "null", "NULL")                                 = "[[1, 2, 3], hello, NULL, [], [2, 3, 4]]"
+     * 
+ *

+ * + * @param array 要转换的数组 + * @param nullArrayStr 如果数组是null,则返回此字符串 + * @param nullElementStr 如果数组中的元素为null,则返回此字符串 + * + * @return 字符串表示,或返回指定字符串表示null + */ + public static String toString(Object array, String nullArrayStr, String nullElementStr) { + if (array == null) { + return nullArrayStr; + } + + StringBuffer buffer = new StringBuffer(); + + toString(buffer, array, nullArrayStr, nullElementStr); + + return buffer.toString(); + } + + /** + * 将数组转换成易于阅读的字符串表示。null将被看作空数组。 支持多维数组。 + * + * @param buffer 将转换后的字符串加入到这个StringBuffer中 + * @param array 要转换的数组 + * @param nullArrayStr 如果数组是null,则返回此字符串 + * @param nullElementStr 如果数组中的元素为null,则返回此字符串 + */ + private static void toString(StringBuffer buffer, Object array, String nullArrayStr, + String nullElementStr) { + if (array == null) { + buffer.append(nullElementStr); + return; + } + + if (!array.getClass().isArray()) { + buffer.append(ObjectUtil.toString(array, nullElementStr)); + return; + } + + buffer.append('['); + + // array为数组 + if (array instanceof long[]) { + long[] longArray = (long[]) array; + int length = longArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(longArray[i]); + } + } else if (array instanceof int[]) { + int[] intArray = (int[]) array; + int length = intArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(intArray[i]); + } + } else if (array instanceof short[]) { + short[] shortArray = (short[]) array; + int length = shortArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(shortArray[i]); + } + } else if (array instanceof byte[]) { + byte[] byteArray = (byte[]) array; + int length = byteArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } else { + buffer.append("0x"); + } + + String hexStr = Integer.toHexString(0xFF & byteArray[i]).toUpperCase(); + + if (hexStr.length() == 0) { + buffer.append("00"); + } else if (hexStr.length() == 1) { + buffer.append("0"); + } + + buffer.append(hexStr); + } + } else if (array instanceof double[]) { + double[] doubleArray = (double[]) array; + int length = doubleArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(doubleArray[i]); + } + } else if (array instanceof float[]) { + float[] floatArray = (float[]) array; + int length = floatArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(floatArray[i]); + } + } else if (array instanceof boolean[]) { + boolean[] booleanArray = (boolean[]) array; + int length = booleanArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(booleanArray[i]); + } + } else if (array instanceof char[]) { + char[] charArray = (char[]) array; + int length = charArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + buffer.append(charArray[i]); + } + } else { + Object[] objectArray = (Object[]) array; + int length = objectArray.length; + + for (int i = 0; i < length; i++) { + if (i > 0) { + buffer.append(", "); + } + + toString(buffer, objectArray[i], nullArrayStr, nullElementStr); + } + } + + buffer.append(']'); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/Base64Util.java b/fuint-utils/src/main/java/com/fuint/utils/Base64Util.java new file mode 100644 index 0000000..bb2b433 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/Base64Util.java @@ -0,0 +1,175 @@ +package com.fuint.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.UnsupportedEncodingException; + +/** + * 基于Java8的Base64工具类实现,不依赖第三方包 + * [Basic编码:适用于标准编码] + * [URL编码:适用于URL地址编码,自动替换掉URL中不能出现的"/"等字符] + * [MIME编码:适用于MIME编码,使用基本的字母数字产生BASE64输出,每一行输出不超过76个字符,而且每行以“\r\n”符结束] + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Base64Util { + private static final Logger logger = LoggerFactory.getLogger(Base64Util.class); + + private static final String CHARSET = "UTF-8";//默认字符集 + + /** + * 基本Base64编码 + * @param bytes + * @return byte[] + */ + public static byte[] baseEncode(byte[] bytes) { + return java.util.Base64.getEncoder().encode(bytes); + } + + /** + * 基本Base64编码 + * + * @param s + * @return String + */ + public static String baseEncode(String s) { + try { + byte[] bytes = s.getBytes(CHARSET); + return java.util.Base64.getEncoder().encodeToString(bytes); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + return null; + } + } + + /** + * 基本Base64解码 + * + * @param bytes + * @return byte[] + */ + public static byte[] baseDecode(byte[] bytes) { + return java.util.Base64.getDecoder().decode(bytes); + } + + /** + * 基本Base64解码 + * + * @param s + * @return String + */ + public static String baseDecode(String s) { + try { + byte[] result = java.util.Base64.getDecoder().decode(s); + return new String(result, CHARSET); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + return null; + } + } + + /** + * URL编码 + * + * @param bytes + * @return byte[] + */ + public static byte[] urlEncode(byte[] bytes) { + return java.util.Base64.getUrlEncoder().encode(bytes); + } + + /** + * URL编码 + * + * @param s + * @return String + */ + public static String urlEncode(String s) { + try { + byte[] bytes = s.getBytes(CHARSET); + return java.util.Base64.getUrlEncoder().encodeToString(bytes); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + return null; + } + } + + /** + * URL解码 + * + * @param bytes + * @return byte[] + */ + public static byte[] urlDecode(byte[] bytes) { + return java.util.Base64.getUrlDecoder().decode(bytes); + } + + /** + * URL解码 + * + * @param s + * @return String + */ + public static String urlDecode(String s) { + byte[] result = java.util.Base64.getUrlDecoder().decode(s); + try { + return new String(result, CHARSET); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + return null; + } + } + + /** + * MIME编码 + * + * @param bytes + * @return byte[] + */ + public static byte[] mimeEncode(byte[] bytes) { + return java.util.Base64.getMimeEncoder().encode(bytes); + } + + /** + * MIME编码 + * + * @param s + * @return String + */ + public static String mimeEncode(String s) { + try { + byte[] bytes = s.getBytes(CHARSET); + return java.util.Base64.getMimeEncoder().encodeToString(bytes); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + return null; + } + } + + /** + * MIME解码 + * + * @param bytes + * @return byte[] + */ + public static byte[] mimeDecode(byte[] bytes) { + return java.util.Base64.getMimeDecoder().decode(bytes); + } + + /** + * MIME解码 + * + * @param s + * @return String + */ + public static String mimeDecode(String s) { + try { + byte[] result = java.util.Base64.getMimeDecoder().decode(s); + return new String(result, CHARSET); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + return null; + } + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/BeanToMapUtil.java b/fuint-utils/src/main/java/com/fuint/utils/BeanToMapUtil.java new file mode 100644 index 0000000..7963afc --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/BeanToMapUtil.java @@ -0,0 +1,83 @@ +package com.fuint.utils; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class BeanToMapUtil { + /** + * 将一个 Map 对象转化为一个 JavaBean + * + * @param type 要转化的类型 + * @param map 包含属性值的 map + * @return 转化出来的 JavaBean 对象 + * @throws IntrospectionException 如果分析类属性失败 + * @throws IllegalAccessException 如果实例化 JavaBean 失败 + * @throws InstantiationException 如果实例化 JavaBean 失败 + * @throws InvocationTargetException 如果调用属性的 setter 方法失败 + */ + public static Object convertMap(Class type, Map map) + throws IntrospectionException, IllegalAccessException, + InstantiationException, InvocationTargetException { + BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性 + Object obj = type.newInstance(); // 创建 JavaBean 对象 + + // 给 JavaBean 对象的属性赋值 + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (int i = 0; i < propertyDescriptors.length; i++) { + PropertyDescriptor descriptor = propertyDescriptors[i]; + String propertyName = descriptor.getName(); + + if (map.containsKey(propertyName)) { + // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。 + Object value = map.get(propertyName); + + Object[] args = new Object[1]; + args[0] = value; + + descriptor.getWriteMethod().invoke(obj, args); + } + } + return obj; + } + + /** + * 将一个 JavaBean 对象转化为一个 Map + * + * @param bean 要转化的JavaBean 对象 + * @return 转化出来的 Map 对象 + * @throws IntrospectionException 如果分析类属性失败 + * @throws IllegalAccessException 如果实例化 JavaBean 失败 + * @throws InvocationTargetException 如果调用属性的 setter 方法失败 + */ + public static Map convertBean(Object bean) throws IntrospectionException, IllegalAccessException, InvocationTargetException { + Class type = bean.getClass(); + Map returnMap = new HashMap(); + BeanInfo beanInfo = Introspector.getBeanInfo(type); + + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (int i = 0; i < propertyDescriptors.length; i++) { + PropertyDescriptor descriptor = propertyDescriptors[i]; + String propertyName = descriptor.getName(); + if (!propertyName.equals("class")) { + Method readMethod = descriptor.getReadMethod(); + Object result = readMethod.invoke(bean, new Object[0]); + if (result != null) { + returnMap.put(propertyName, result); + } else { + returnMap.put(propertyName, ""); + } + } + } + return returnMap; + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/ClassUtil.java b/fuint-utils/src/main/java/com/fuint/utils/ClassUtil.java new file mode 100644 index 0000000..0857a57 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/ClassUtil.java @@ -0,0 +1,1250 @@ +package com.fuint.utils; + +import java.lang.reflect.Array; +import java.util.*; + +/** + * 有关 Class 处理的工具类。 + * + * + * 这个类中的每个方法都可以“安全”地处理 null ,而不会抛出 NullPointerException。 + * + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class ClassUtil { + /* ============================================================================ */ + /* 常量和singleton。 */ + /* ============================================================================ */ + + /** 资源文件的分隔符: '/'。 */ + public static final char RESOURCE_SEPARATOR_CHAR = '/'; + + /** Java类名的分隔符: '.'。 */ + public static final char PACKAGE_SEPARATOR_CHAR = '.'; + + /** Java类名的分隔符: "."。 */ + public static final String PACKAGE_SEPARATOR = String.valueOf(PACKAGE_SEPARATOR_CHAR); + + /** 内联类的分隔符: '$'。 */ + public static final char INNER_CLASS_SEPARATOR_CHAR = '$'; + + /** 内联类的分隔符: "$"。 */ + public static final String INNER_CLASS_SEPARATOR = String.valueOf(INNER_CLASS_SEPARATOR_CHAR); + + /** 所有类的信息表,包括父类, 接口, 数组的维数等信息。 */ + private static final Map TYPE_MAP = Collections.synchronizedMap(new WeakHashMap()); + + /* ============================================================================ */ + /* 取得类名和package名的方法。 */ + /* ============================================================================ */ + + /** + * 取得对象所属的类的直观类名。 + * + *

+ * 相当于 object.getClass().getName() ,但不同的是,该方法用更直观的方式显示数组类型。 例如: + *

+     *  int[].class.getName() = "[I" ClassUtil.getClassName(int[].class) = "int[]"
+     *
+     *  Integer[][].class.getName() = "[[Ljava.lang.Integer;" ClassUtil.getClassName(Integer[][].class) = "java.lang.Integer[][]"
+     *  
+ *

+ * + *

+ * 对于非数组的类型,该方法等效于 Class.getName() 方法。 + *

+ * + *

+ * 注意,该方法所返回的数组类名只能用于显示给人看,不能用于 Class.forName 操作。 + *

+ * + * @param object 要显示类名的对象 + * + * @return 用于显示的直观类名,如果原类名为空或非法,则返回 null + */ + public static String getClassNameForObject(Object object) { + if (object == null) { + return null; + } + + return getClassName(object.getClass().getName(), true); + } + + /** + * 取得直观的类名。 + * + *

+ * 相当于 clazz.getName() ,但不同的是,该方法用更直观的方式显示数组类型。 例如: + *

+     *  int[].class.getName() = "[I" ClassUtil.getClassName(int[].class) = "int[]"
+     *
+     *  Integer[][].class.getName() = "[[Ljava.lang.Integer;" ClassUtil.getClassName(Integer[][].class) = "java.lang.Integer[][]"
+     *  
+ *

+ * + *

+ * 对于非数组的类型,该方法等效于 Class.getName() 方法。 + *

+ * + *

+ * 注意,该方法所返回的数组类名只能用于显示给人看,不能用于 Class.forName 操作。 + *

+ * + * @param clazz 要显示类名的类 + * + * @return 用于显示的直观类名,如果原始类为 null ,则返回 null + */ + public static String getClassName(Class clazz) { + if (clazz == null) { + return null; + } + + return getClassName(clazz.getName(), true); + } + + /** + * 取得直观的类名。 + * + *

+ * className 必须是从 clazz.getName() 所返回的合法类名。该方法用更直观的方式显示数组类型。 例如: + *

+     *  int[].class.getName() = "[I" ClassUtil.getClassName(int[].class) = "int[]"
+     *
+     *  Integer[][].class.getName() = "[[Ljava.lang.Integer;" ClassUtil.getClassName(Integer[][].class) = "java.lang.Integer[][]"
+     *  
+ *

+ * + *

+ * 对于非数组的类型,该方法等效于 Class.getName() 方法。 + *

+ * + *

+ * 注意,该方法所返回的数组类名只能用于显示给人看,不能用于 Class.forName 操作。 + *

+ * + * @param className 要显示的类名 + * + * @return 用于显示的直观类名,如果原类名为 null ,则返回 null ,如果原类名是非法的,则返回原类名 + */ + public static String getClassName(String className) { + return getClassName(className, true); + } + + /** + * 取得直观的类名。 + * + * @param className 类名 + * @param processInnerClass 是否将内联类分隔符 '$' 转换成 '.' + * + * @return 直观的类名,或 null + */ + private static String getClassName(String className, boolean processInnerClass) { + if (StringUtil.isEmpty(className)) { + return className; + } + + if (processInnerClass) { + className = className.replace(INNER_CLASS_SEPARATOR_CHAR, PACKAGE_SEPARATOR_CHAR); + } + + int length = className.length(); + int dimension = 0; + + // 取得数组的维数,如果不是数组,维数为0 + for (int i = 0; i < length; i++, dimension++) { + if (className.charAt(i) != '[') { + break; + } + } + + // 如果不是数组,则直接返回 + if (dimension == 0) { + return className; + } + + // 确保类名合法 + if (length <= dimension) { + return className; // 非法类名 + } + + // 处理数组 + StringBuffer componentTypeName = new StringBuffer(); + + switch (className.charAt(dimension)) { + case 'Z': + componentTypeName.append("boolean"); + break; + + case 'B': + componentTypeName.append("byte"); + break; + + case 'C': + componentTypeName.append("char"); + break; + + case 'D': + componentTypeName.append("double"); + break; + + case 'F': + componentTypeName.append("float"); + break; + + case 'I': + componentTypeName.append("int"); + break; + + case 'J': + componentTypeName.append("long"); + break; + + case 'S': + componentTypeName.append("short"); + break; + + case 'L': + + if ((className.charAt(length - 1) != ';') || (length <= (dimension + 2))) { + return className; // 非法类名 + } + + componentTypeName.append(className.substring(dimension + 1, length - 1)); + break; + + default: + return className; // 非法类名 + } + + for (int i = 0; i < dimension; i++) { + componentTypeName.append("[]"); + } + + return componentTypeName.toString(); + } + + /** + * 取得指定对象所属的类的短类名,不包括package名。 + * + *

+ * 此方法可以正确显示数组和内联类的名称。 + *

+ * + *

+ * 例如: + *

+     *  ClassUtil.getShortClassNameForObject(Boolean.TRUE) = "Boolean" ClassUtil.getShortClassNameForObject(new Boolean[10]) = "Boolean[]" ClassUtil.getShortClassNameForObject(new int[1][2]) = "int[][]"
+     *  
+ *

+ * + * @param object 要查看的对象 + * + * @return 短类名,如果对象为 null ,则返回 null + */ + public static String getShortClassNameForObject(Object object) { + if (object == null) { + return null; + } + + return getShortClassName(object.getClass().getName()); + } + + /** + * 取得短类名,不包括package名。 + * + *

+ * 此方法可以正确显示数组和内联类的名称。 + *

+ * + *

+ * 例如: + *

+     *  ClassUtil.getShortClassName(Boolean.class) = "Boolean" ClassUtil.getShortClassName(Boolean[].class) = "Boolean[]" ClassUtil.getShortClassName(int[][].class) = "int[][]" ClassUtil.getShortClassName(Map.Entry.class) = "Map.Entry"
+     *  
+ *

+ * + * @param clazz 要查看的类 + * + * @return 短类名,如果类为 null ,则返回 null + */ + public static String getShortClassName(Class clazz) { + if (clazz == null) { + return null; + } + + return getShortClassName(clazz.getName()); + } + + /** + * 取得类名,不包括package名。 + * + *

+ * 此方法可以正确显示数组和内联类的名称。 + *

+ * + *

+ * 例如: + *

+     *  ClassUtil.getShortClassName(Boolean.class.getName()) = "Boolean" ClassUtil.getShortClassName(Boolean[].class.getName()) = "Boolean[]" ClassUtil.getShortClassName(int[][].class.getName()) = "int[][]" ClassUtil.getShortClassName(Map.Entry.class.getName()) = "Map.Entry"
+     *  
+ *

+ * + * @param className 要查看的类名 + * + * @return 短类名,如果类名为空,则返回 null + */ + public static String getShortClassName(String className) { + if (StringUtil.isEmpty(className)) { + return className; + } + + // 转换成直观的类名 + className = getClassName(className, false); + + char[] chars = className.toCharArray(); + int lastDot = 0; + + for (int i = 0; i < chars.length; i++) { + if (chars[i] == PACKAGE_SEPARATOR_CHAR) { + lastDot = i + 1; + } else if (chars[i] == INNER_CLASS_SEPARATOR_CHAR) { + chars[i] = PACKAGE_SEPARATOR_CHAR; + } + } + + return new String(chars, lastDot, chars.length - lastDot); + } + + /** + * 取得指定对象所属的类的package名。 + * + *

+ * 对于数组,此方法返回的是数组元素类型的package名。 + *

+ * + * @param object 要查看的对象 + * + * @return package名,如果对象为 null ,则返回 null + */ + public static String getPackageNameForObject(Object object) { + if (object == null) { + return null; + } + + return getPackageName(object.getClass().getName()); + } + + /** + * 取得指定类的package名。 + * + *

+ * 对于数组,此方法返回的是数组元素类型的package名。 + *

+ * + * @param clazz 要查看的类 + * + * @return package名,如果类为 null ,则返回 null + */ + public static String getPackageName(Class clazz) { + if (clazz == null) { + return null; + } + + return getPackageName(clazz.getName()); + } + + /** + * 取得指定类名的package名。 + * + *

+ * 对于数组,此方法返回的是数组元素类型的package名。 + *

+ * + * @param className 要查看的类名 + * + * @return package名,如果类名为空,则返回 null + */ + public static String getPackageName(String className) { + if (StringUtil.isEmpty(className)) { + return null; + } + + // 转换成直观的类名 + className = getClassName(className, false); + + int i = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR); + + if (i == -1) { + return ""; + } + + return className.substring(0, i); + } + + /* ============================================================================ */ + /* 取得类名和package名的resource名的方法。 */ + /* */ + /* 和类名、package名不同的是,resource名符合文件名命名规范,例如: */ + /* java/lang/String.class */ + /* com/alibaba/commons/lang */ + /* etc. */ + /* ============================================================================ */ + + /** + * 取得对象所属的类的资源名。 + * + *

+ * 例如: + *

+     * ClassUtil.getClassNameForObjectAsResource("This is a string")    = "java/lang/String.class"
+     * 
+ *

+ * + * @param object 要显示类名的对象 + * + * @return 指定对象所属类的资源名,如果对象为空,则返回null + */ + public static String getClassNameForObjectAsResource(Object object) { + if (object == null) { + return null; + } + + return object.getClass().getName().replace(PACKAGE_SEPARATOR_CHAR, RESOURCE_SEPARATOR_CHAR) + + ".class"; + } + + /** + * 取得指定类的资源名。 + * + *

+ * 例如: + *

+     * ClassUtil.getClassNameAsResource(String.class)   = "java/lang/String.class"
+     * 
+ *

+ * + * @param clazz 要显示类名的类 + * + * @return 指定类的资源名,如果指定类为空,则返回null + */ + public static String getClassNameAsResource(Class clazz) { + if (clazz == null) { + return null; + } + + return clazz.getName().replace(PACKAGE_SEPARATOR_CHAR, RESOURCE_SEPARATOR_CHAR) + ".class"; + } + + /** + * 取得指定类的资源名。 + * + *

+ * 例如: + *

+     * ClassUtil.getClassNameAsResource("java.lang.String") = "java/lang/String.class"
+     * 
+ *

+ * + * @param className 要显示的类名 + * + * @return 指定类名对应的资源名,如果指定类名为空,则返回null + */ + public static String getClassNameAsResource(String className) { + if (className == null) { + return null; + } + + return className.replace(PACKAGE_SEPARATOR_CHAR, RESOURCE_SEPARATOR_CHAR) + ".class"; + } + + /** + * 取得指定对象所属的类的package名的资源名。 + * + *

+ * 对于数组,此方法返回的是数组元素类型的package名。 + *

+ * + * @param object 要查看的对象 + * + * @return package名,如果对象为 null ,则返回 null + */ + public static String getPackageNameForObjectAsResource(Object object) { + if (object == null) { + return null; + } + + return getPackageNameForObject(object).replace(PACKAGE_SEPARATOR_CHAR, + RESOURCE_SEPARATOR_CHAR); + } + + /** + * 取得指定类的package名的资源名。 + * + *

+ * 对于数组,此方法返回的是数组元素类型的package名。 + *

+ * + * @param clazz 要查看的类 + * + * @return package名,如果类为 null ,则返回 null + */ + public static String getPackageNameAsResource(Class clazz) { + if (clazz == null) { + return null; + } + + return getPackageName(clazz).replace(PACKAGE_SEPARATOR_CHAR, RESOURCE_SEPARATOR_CHAR); + } + + /** + * 取得指定类名的package名的资源名。 + * + *

+ * 对于数组,此方法返回的是数组元素类型的package名。 + *

+ * + * @param className 要查看的类名 + * + * @return package名,如果类名为空,则返回 null + */ + public static String getPackageNameAsResource(String className) { + if (className == null) { + return null; + } + + return getPackageName(className).replace(PACKAGE_SEPARATOR_CHAR, RESOURCE_SEPARATOR_CHAR); + } + + /* ============================================================================ */ + /* 取得类的信息,如父类, 接口, 数组的维数等。 */ + /* ============================================================================ */ + + /** + * 取得指定维数的 Array类. + * + * @param componentType 数组的基类 + * @param dimension 维数,如果小于 0 则看作 0 + * + * @return 如果维数为0, 则返回基类本身, 否则返回数组类,如果数组的基类为 null ,则返回 null + */ + public static Class getArrayClass(Class componentType, int dimension) { + if (dimension <= 0) { + return componentType; + } + + if (componentType == null) { + return null; + } + + return Array.newInstance(componentType, new int[dimension]).getClass(); + } + + /** + * 取得数组元素的类型。 + * + * @param type 要查找的类 + * + * @return 如果是数组, 则返回数组元素的类型, 否则返回 null + */ + public static Class getArrayComponentType(Class type) { + if (type == null) { + return null; + } + + return getTypeInfo(type).getArrayComponentType(); + } + + /** + * 取得数组的维数。 + * + * @param clazz 要查找的类 + * + * @return 数组的维数. 如果不是数组, 则返回 0 ,如果数组为 null ,是返回 -1 + */ + public static int getArrayDimension(Class clazz) { + if (clazz == null) { + return -1; + } + + return getTypeInfo(clazz).getArrayDimension(); + } + + /** + * 取得指定类的所有父类。 + * + *

+ * 对于一个 Class 实例,如果它不是接口,也不是数组,此方法依次列出从该类的父类开始直到 Object 的所有类。 + *

+ * + *

+ * 例如 ClassUtil.getSuperclasses(java.util.ArrayList.class) 返回以下列表: + * + *

    + *
  1. + * java.util.AbstractList + *
  2. + *
  3. + * java.util.AbstractCollection + *
  4. + *
  5. + * java.lang.Object + *
  6. + *
+ *

+ * + *

+ * 对于一个接口,此方法返回一个空列表。 + *

+ * + *

+ * 例如ClassUtil.getSuperclasses(java.util.List.class)将返回一个空列表。 + *

+ * + *

+ * 对于一个数组,此方法返回一个列表,列出所有component类型的父类的相同维数的数组类型。 例如: + * ClassUtil.getSuperclasses(java.util.ArrayList[][].class) 返回以下列表: + * + *

    + *
  1. + * java.util.AbstractList[][] + *
  2. + *
  3. + * java.util.AbstractCollection[][] + *
  4. + *
  5. + * java.lang.Object[][] + *
  6. + *
  7. + * java.lang.Object[] + *
  8. + *
  9. + * java.lang.Object + *
  10. + *
+ * + * 注意,原子类型及其数组,将被转换成相应的包装类来处理。 例如: ClassUtil.getSuperclasses(int[][].class) + * 返回以下列表: + * + *
    + *
  1. + * java.lang.Number[][] + *
  2. + *
  3. + * java.lang.Object[][] + *
  4. + *
  5. + * java.lang.Object[] + *
  6. + *
  7. + * java.lang.Object + *
  8. + *
+ *

+ * + * @param clazz 要查找的类 + * + * @return 所有父类的列表,如果指定类为 null ,则返回 null + */ + public static List getSuperclasses(Class clazz) { + if (clazz == null) { + return null; + } + + return getTypeInfo(clazz).getSuperclasses(); + } + + /** + * 取得指定类的所有接口。 + * + *

+ * 对于一个 Class 实例,如果它不是接口,也不是数组,此方法依次列出从该类的父类开始直到 Object 的所有类。 + *

+ * + *

+ * 例如 ClassUtil.getInterfaces(java.util.ArrayList.class) 返回以下列表: + * + *

    + *
  1. + * java.util.List + *
  2. + *
  3. + * java.util.Collection + *
  4. + *
  5. + * java.util.RandomAccess + *
  6. + *
  7. + * java.lang.Cloneable + *
  8. + *
  9. + * java.io.Serializable + *
  10. + *
+ *

+ * + *

+ * 对于一个数组,此方法返回一个列表,列出所有component类型的接口的相同维数的数组类型。 例如: + * ClassUtil.getInterfaces(java.util.ArrayList[][].class) 返回以下列表: + * + *

    + *
  1. + * java.util.List[][] + *
  2. + *
  3. + * java.util.Collection[][] + *
  4. + *
  5. + * java.util.RandomAccess[][] + *
  6. + *
  7. + * java.lang.Cloneable[][] + *
  8. + *
  9. + * java.io.Serializable[][] + *
  10. + *
+ *

+ * + *

+ * 注意,原子类型及其数组,将被转换成相应的包装类来处理。 例如: ClassUtil.getInterfaces(int[][].class) 返回以下列表: + * + *

    + *
  1. + * java.lang.Comparable[][] + *
  2. + *
  3. + * java.io.Serializable[][] + *
  4. + *
+ *

+ * + * @param clazz 要查找的类 + * + * @return 所有接口的列表,如果指定类为 null ,则返回 null + */ + public static List getInterfaces(Class clazz) { + if (clazz == null) { + return null; + } + + return getTypeInfo(clazz).getInterfaces(); + } + + /** + * 判断指定类是否为内联类。 + * + * @param clazz 要查找的类 + * + * @return 如果是,则返回 true + */ + public static boolean isInnerClass(Class clazz) { + if (clazz == null) { + return false; + } + + return StringUtil.contains(clazz.getName(), INNER_CLASS_SEPARATOR_CHAR); + } + + /** + * 检查一组指定类型 fromClasses 的对象是否可以赋值给另一组类型 classes。 + * + *

+ * 此方法可以用来确定指定类型的参数 object1, object2, ... 是否可以用来调用确定参数类型为 class1, class2, + * ... 的方法。 + *

+ * + *

+ * 对于 fromClasses 的每个元素 fromClassclasses 的每个元素 + * clazz, 按照如下规则: + * + *

    + *
  1. + * 如果目标类 clazznull ,总是返回 false。 + *
  2. + *
  3. + * 如果参数类型 fromClassnull ,并且目标类型 clazz 为非原子类型,则返回 + * true。 因为 null 可以被赋给任何引用类型。 + *
  4. + *
  5. + * 调用 Class.isAssignableFrom 方法来确定目标类 clazz 是否和参数类 + * fromClass 相同或是其父类、接口,如果是,则返回 true。 + *
  6. + *
  7. + * 如果目标类型 clazz 为原子类型,那么根据 The Java + * Language Specification ,sections 5.1.1, 5.1.2, 5.1.4定义的Widening Primitive + * Conversion规则,参数类型 fromClass 可以是任何能扩展成该目标类型的原子类型及其包装类。 例如, clazz 为 + * long ,那么参数类型可以是 byte、 + * shortintlongchar 及其包装类 + * java.lang.Bytejava.lang.Shortjava.lang.Integer、 + * java.lang.Longjava.lang.Character 。如果满足这个条件,则返回 + * true。 + *
  8. + *
  9. + * 不满足上述所有条件,则返回 false。 + *
  10. + *
+ *

+ * + * @param classes 目标类型列表,如果是 null 总是返回 false + * @param fromClasses 参数类型列表, null 表示可赋值给任意非原子类型 + * + * @return 如果可以被赋值,则返回 true + */ + public static boolean isAssignable(Class[] classes, Class[] fromClasses) { + if (!ArrayUtil.isSameLength(fromClasses, classes)) { + return false; + } + + if (fromClasses == null) { + fromClasses = ArrayUtil.EMPTY_CLASS_ARRAY; + } + + if (classes == null) { + classes = ArrayUtil.EMPTY_CLASS_ARRAY; + } + + for (int i = 0; i < fromClasses.length; i++) { + if (isAssignable(classes[i], fromClasses[i]) == false) { + return false; + } + } + + return true; + } + + /** + * 检查指定类型 fromClass 的对象是否可以赋值给另一种类型 clazz。 + * + *

+ * 此方法可以用来确定指定类型的参数 object1, object2, ... 是否可以用来调用确定参数类型 class1, class2, + * ... 的方法。 + *

+ * + *

+ * 按照如下规则: + * + *

    + *
  1. + * 如果目标类 clazznull ,总是返回 false。 + *
  2. + *
  3. + * 如果参数类型 fromClassnull ,并且目标类型 clazz 为非原子类型,则返回 + * true。 因为 null 可以被赋给任何引用类型。 + *
  4. + *
  5. + * 调用 Class.isAssignableFrom 方法来确定目标类 clazz 是否和参数类 + * fromClass 相同或是其父类、接口,如果是,则返回 true。 + *
  6. + *
  7. + * 如果目标类型 clazz 为原子类型,那么根据 The Java + * Language Specification ,sections 5.1.1, 5.1.2, 5.1.4定义的Widening Primitive + * Conversion规则,参数类型 fromClass 可以是任何能扩展成该目标类型的原子类型及其包装类。 例如, clazz 为 + * long ,那么参数类型可以是 byte、 + * shortintlongchar 及其包装类 + * java.lang.Bytejava.lang.Shortjava.lang.Integer、 + * java.lang.Longjava.lang.Character 。如果满足这个条件,则返回 + * true。 + *
  8. + *
  9. + * 不满足上述所有条件,则返回 false。 + *
  10. + *
+ *

+ * + * @param clazz 目标类型,如果是 null 总是返回 false + * @param fromClass 参数类型, null 表示可赋值给任意非原子类型 + * + * @return 如果可以被赋值,则返回 null + */ + public static boolean isAssignable(Class clazz, Class fromClass) { + if (clazz == null) { + return false; + } + + // 如果fromClass是null,只要clazz不是原子类型如int,就一定可以赋值 + if (fromClass == null) { + return !clazz.isPrimitive(); + } + + // 如果类相同或有父子关系,当然可以赋值 + if (clazz.isAssignableFrom(fromClass)) { + return true; + } + + // 对于原子类型,根据JLS的规则进行扩展 + // 目标class为原子类型时,fromClass可以为原子类型和原子类型的包装类型。 + if (clazz.isPrimitive()) { + // boolean可以接受:boolean + if (Boolean.TYPE.equals(clazz)) { + return Boolean.class.equals(fromClass); + } + + // byte可以接受:byte + if (Byte.TYPE.equals(clazz)) { + return Byte.class.equals(fromClass); + } + + // char可以接受:char + if (Character.TYPE.equals(clazz)) { + return Character.class.equals(fromClass); + } + + // short可以接受:short, byte + if (Short.TYPE.equals(clazz)) { + return Short.class.equals(fromClass) || Byte.TYPE.equals(fromClass) + || Byte.class.equals(fromClass); + } + + // int可以接受:int、byte、short、char + if (Integer.TYPE.equals(clazz)) { + return Integer.class.equals(fromClass) || Byte.TYPE.equals(fromClass) + || Byte.class.equals(fromClass) || Short.TYPE.equals(fromClass) + || Short.class.equals(fromClass) || Character.TYPE.equals(fromClass) + || Character.class.equals((fromClass)); + } + + // long可以接受:long、int、byte、short、char + if (Long.TYPE.equals(clazz)) { + return Long.class.equals(fromClass) || Integer.TYPE.equals(fromClass) + || Integer.class.equals(fromClass) || Byte.TYPE.equals(fromClass) + || Byte.class.equals(fromClass) || Short.TYPE.equals(fromClass) + || Short.class.equals(fromClass) || Character.TYPE.equals(fromClass) + || Character.class.equals((fromClass)); + } + + // float可以接受:float, long, int, byte, short, char + if (Float.TYPE.equals(clazz)) { + return Float.class.equals(fromClass) || Long.TYPE.equals(fromClass) + || Long.class.equals(fromClass) || Integer.TYPE.equals(fromClass) + || Integer.class.equals(fromClass) || Byte.TYPE.equals(fromClass) + || Byte.class.equals(fromClass) || Short.TYPE.equals(fromClass) + || Short.class.equals(fromClass) || Character.TYPE.equals(fromClass) + || Character.class.equals((fromClass)); + } + + // double可以接受:double, float, long, int, byte, short, char + if (Double.TYPE.equals(clazz)) { + return Double.class.equals(fromClass) || Float.TYPE.equals(fromClass) + || Float.class.equals(fromClass) || Long.TYPE.equals(fromClass) + || Long.class.equals(fromClass) || Integer.TYPE.equals(fromClass) + || Integer.class.equals(fromClass) || Byte.TYPE.equals(fromClass) + || Byte.class.equals(fromClass) || Short.TYPE.equals(fromClass) + || Short.class.equals(fromClass) || Character.TYPE.equals(fromClass) + || Character.class.equals((fromClass)); + } + } + + return false; + } + + /** + * 取得指定类的 TypeInfo。 + * + * @param type 指定类或接口 + * + * @return TypeInfo 对象. + */ + protected static TypeInfo getTypeInfo(Class type) { + if (type == null) { + throw new IllegalArgumentException("Parameter clazz should not be null"); + } + + TypeInfo classInfo; + + synchronized (TYPE_MAP) { + classInfo = (TypeInfo) TYPE_MAP.get(type); + + if (classInfo == null) { + classInfo = new TypeInfo(type); + TYPE_MAP.put(type, classInfo); + } + } + + return classInfo; + } + + /** + * 代表一个类的信息, 包括父类, 接口, 数组的维数等. + */ + protected static class TypeInfo { + private Class type; + private Class componentType; + private int dimension; + private List superclasses = new ArrayList(2); + private List interfaces = new ArrayList(2); + + /** + * 创建 TypeInfo。 + * + * @param type 创建指定类的 TypeInfo + */ + private TypeInfo(Class type) { + this.type = type; + + // 如果是array, 设置componentType和dimension + Class componentType = null; + + if (type.isArray()) { + componentType = type; + + do { + componentType = componentType.getComponentType(); + dimension++; + } while (componentType.isArray()); + } + + this.componentType = componentType; + + // 取得所有superclass + if (dimension > 0) { + // 将primitive类型转换成对应的包装类 + componentType = getNonPrimitiveType(componentType); + + Class superComponentType = componentType.getSuperclass(); + + // 如果是primitive, interface, 则设置其基类为Object. + if ((superComponentType == null) && !Object.class.equals(componentType)) { + superComponentType = Object.class; + } + + if (superComponentType != null) { + Class superclass = getArrayClass(superComponentType, dimension); + + superclasses.add(superclass); + superclasses.addAll(getTypeInfo(superclass).superclasses); + } else { + for (int i = dimension - 1; i >= 0; i--) { + superclasses.add(getArrayClass(Object.class, i)); + } + } + } else { + // 将primitive类型转换成对应的包装类 + type = getNonPrimitiveType(type); + + Class superclass = type.getSuperclass(); + + if (superclass != null) { + superclasses.add(superclass); + superclasses.addAll(getTypeInfo(superclass).superclasses); + } + } + + // 取得所有interface + if (dimension == 0) { + Class[] typeInterfaces = type.getInterfaces(); + List set = new ArrayList(); + + for (int i = 0; i < typeInterfaces.length; i++) { + Class typeInterface = typeInterfaces[i]; + + set.add(typeInterface); + set.addAll(getTypeInfo(typeInterface).interfaces); + } + + for (Iterator i = superclasses.iterator(); i.hasNext();) { + Class typeInterface = (Class) i.next(); + + set.addAll(getTypeInfo(typeInterface).interfaces); + } + + for (Iterator i = set.iterator(); i.hasNext();) { + Class interfaceClass = (Class) i.next(); + + if (!interfaces.contains(interfaceClass)) { + interfaces.add(interfaceClass); + } + } + } else { + for (Iterator i = getTypeInfo(componentType).interfaces.iterator(); i.hasNext();) { + Class componentInterface = (Class) i.next(); + + interfaces.add(getArrayClass(componentInterface, dimension)); + } + } + } + + /** + * 将所有的原子类型转换成对应的包装类,其它类型不变。 + * + * @param type 要转换的类型 + * + * @return 非原子类型 + */ + private Class getNonPrimitiveType(Class type) { + if (type.isPrimitive()) { + if (Integer.TYPE.equals(type)) { + type = Integer.class; + } else if (Long.TYPE.equals(type)) { + type = Long.class; + } else if (Short.TYPE.equals(type)) { + type = Short.class; + } else if (Byte.TYPE.equals(type)) { + type = Byte.class; + } else if (Float.TYPE.equals(type)) { + type = Float.class; + } else if (Double.TYPE.equals(type)) { + type = Double.class; + } else if (Boolean.TYPE.equals(type)) { + type = Boolean.class; + } else if (Character.TYPE.equals(type)) { + type = Character.class; + } + } + + return type; + } + + /** + * 取得 TypeInfo 所代表的java类。 + * + * @return TypeInfo 所代表的java类 + */ + public Class getType() { + return type; + } + + /** + * 取得数组元素的类型。 + * + * @return 如果是数组, 则返回数组元素的类型, 否则返回 null + */ + public Class getArrayComponentType() { + return componentType; + } + + /** + * 取得数组的维数。 + * + * @return 数组的维数. 如果不是数组, 则返回 0 + */ + public int getArrayDimension() { + return dimension; + } + + /** + * 取得所有的父类。 + * + * @return 所有的父类 + */ + public List getSuperclasses() { + return Collections.unmodifiableList(superclasses); + } + + /** + * 取得所有的接口。 + * + * @return 所有的接口 + */ + public List getInterfaces() { + return Collections.unmodifiableList(interfaces); + } + } + + /* ============================================================================ */ + /* 有关primitive类型的方法。 */ + /* ============================================================================ */ + + /** + * 返回指定类型所对应的primitive类型。 + * + * @param clazz 要检查的类型 + * + * @return 如果指定类型为null或不是primitive类型的包装类,则返回null,否则返回相应的primitive类型。 + */ + public static Class getPrimitiveType(Class clazz) { + if (clazz == null) { + return null; + } + + if (clazz.isPrimitive()) { + return clazz; + } + + if (clazz.equals(Long.class)) { + return long.class; + } + + if (clazz.equals(Integer.class)) { + return int.class; + } + + if (clazz.equals(Short.class)) { + return short.class; + } + + if (clazz.equals(Byte.class)) { + return byte.class; + } + + if (clazz.equals(Double.class)) { + return double.class; + } + + if (clazz.equals(Float.class)) { + return float.class; + } + + if (clazz.equals(Boolean.class)) { + return boolean.class; + } + + if (clazz.equals(Character.class)) { + return char.class; + } + + return null; + } + + /** + * 返回指定类型所对应的非primitive类型。 + * + * @param clazz 要检查的类型 + * + * @return 如果指定类型为null,则返回null,如果是primitive类型,则返回相应的包装类,否则返回原始的类型。 + */ + public static Class getNonPrimitiveType(Class clazz) { + if (clazz == null) { + return null; + } + + if (!clazz.isPrimitive()) { + return clazz; + } + + if (clazz.equals(long.class)) { + return Long.class; + } + + if (clazz.equals(int.class)) { + return Integer.class; + } + + if (clazz.equals(short.class)) { + return Short.class; + } + + if (clazz.equals(byte.class)) { + return Byte.class; + } + + if (clazz.equals(double.class)) { + return Double.class; + } + + if (clazz.equals(float.class)) { + return Float.class; + } + + if (clazz.equals(boolean.class)) { + return Boolean.class; + } + + if (clazz.equals(char.class)) { + return Character.class; + } + + return null; + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/CommonUtil.java b/fuint-utils/src/main/java/com/fuint/utils/CommonUtil.java new file mode 100644 index 0000000..e82d149 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/CommonUtil.java @@ -0,0 +1,28 @@ +package com.fuint.utils; + +import org.apache.commons.lang.StringUtils; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class CommonUtil { + + /** + * 格式化指定的日期 + * + * @param date + * @param formatStr + * @return + */ + public static String formatDate(Date date, String formatStr) { + if (date == null) date = new Date(); + if (StringUtils.isEmpty(formatStr)) formatStr = "yyyy-MM-dd"; + SimpleDateFormat dateFormater = new SimpleDateFormat(formatStr); + return dateFormater.format(date); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/ContextUtils.java b/fuint-utils/src/main/java/com/fuint/utils/ContextUtils.java new file mode 100644 index 0000000..0e9d970 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/ContextUtils.java @@ -0,0 +1,42 @@ +package com.fuint.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Context 工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Component +public class ContextUtils implements ApplicationContextAware { + public static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + ContextUtils.applicationContext = applicationContext; + } + + public static Object getBean(String name) { + return applicationContext.getBean(name); + } + + public static T getBean(String name, Class requiredType) { + return applicationContext.getBean(name, requiredType); + } + + public static boolean containsBean(String name) { + return applicationContext.containsBean(name); + } + + public static boolean isSingleton(String name) { + return applicationContext.isSingleton(name); + } + + public static Class getType(String name) { + return applicationContext.getType(name); + } +} \ No newline at end of file diff --git a/fuint-utils/src/main/java/com/fuint/utils/Digests.java b/fuint-utils/src/main/java/com/fuint/utils/Digests.java new file mode 100644 index 0000000..f4c0389 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/Digests.java @@ -0,0 +1,110 @@ +package com.fuint.utils; + +import com.fuint.exception.Exceptions; +import org.apache.commons.lang.Validate; +import java.io.IOException; +import java.io.InputStream; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.SecureRandom; + +/** + * 支持SHA-1/MD5消息摘要的工具类. + * + * 返回ByteSource,可进一步被编码为Hex, Base64或UrlSafeBase64 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Digests { + + private static final String SHA1 = "SHA-1"; + private static final String MD5 = "MD5"; + + private static SecureRandom random = new SecureRandom(); + + /** + * 对输入字符串进行sha1散列. + */ + public static byte[] sha1(byte[] input) { + return digest(input, SHA1, null, 1); + } + + public static byte[] sha1(byte[] input, byte[] salt) { + return digest(input, SHA1, salt, 1); + } + + public static byte[] sha1(byte[] input, byte[] salt, int iterations) { + return digest(input, SHA1, salt, iterations); + } + + /** + * 对字符串进行散列, 支持md5与sha1算法. + */ + private static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) { + try { + MessageDigest digest = MessageDigest.getInstance(algorithm); + + if (salt != null) { + digest.update(salt); + } + + byte[] result = digest.digest(input); + + for (int i = 1; i < iterations; i++) { + digest.reset(); + result = digest.digest(result); + } + return result; + } catch (GeneralSecurityException e) { + throw Exceptions.unchecked(e); + } + } + + /** + * 生成随机的Byte[]作为salt. + * + * @param numBytes byte数组的大小 + */ + public static byte[] generateSalt(int numBytes) { + Validate.isTrue(numBytes > 0, "numBytes argument must be a positive integer (1 or larger)", + numBytes); + + byte[] bytes = new byte[numBytes]; + random.nextBytes(bytes); + return bytes; + } + + /** + * 对文件进行md5散列. + */ + public static byte[] md5(InputStream input) throws IOException { + return digest(input, MD5); + } + + /** + * 对文件进行sha1散列. + */ + public static byte[] sha1(InputStream input) throws IOException { + return digest(input, SHA1); + } + + private static byte[] digest(InputStream input, String algorithm) throws IOException { + try { + MessageDigest messageDigest = MessageDigest.getInstance(algorithm); + int bufferLength = 8 * 1024; + byte[] buffer = new byte[bufferLength]; + int read = input.read(buffer, 0, bufferLength); + + while (read > -1) { + messageDigest.update(buffer, 0, read); + read = input.read(buffer, 0, bufferLength); + } + + return messageDigest.digest(); + } catch (GeneralSecurityException e) { + throw Exceptions.unchecked(e); + } + } + +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/Encodes.java b/fuint-utils/src/main/java/com/fuint/utils/Encodes.java new file mode 100644 index 0000000..1b0f436 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/Encodes.java @@ -0,0 +1,125 @@ +package com.fuint.utils; + +import com.fuint.exception.Exceptions; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.lang.StringEscapeUtils; + +/** + * 编码转换工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class Encodes { + + private static final String DEFAULT_URL_ENCODING = "UTF-8"; + private static final char[] BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + .toCharArray(); + + /** + * Hex编码. + */ + public static String encodeHex(byte[] input) { + return Hex.encodeHexString(input); + } + + /** + * Hex解码. + */ + public static byte[] decodeHex(String input) { + try { + return Hex.decodeHex(input.toCharArray()); + } catch (DecoderException e) { + throw Exceptions.unchecked(e); + } + } + + /** + * Base64编码. + */ + public static String encodeBase64(byte[] input) { + return Base64.encodeBase64String(input); + } + + /** + * Base64编码, URL安全(将Base64中的URL非法字符'+'和'/'转为'-'和'_', 见RFC3548). + */ + public static String encodeUrlSafeBase64(byte[] input) { + return Base64.encodeBase64URLSafeString(input); + } + + /** + * Base64解码. + */ + public static byte[] decodeBase64(String input) { + return Base64.decodeBase64(input); + } + + /** + * Base62编码。 + */ + public static String encodeBase62(byte[] input) { + char[] chars = new char[input.length]; + for (int i = 0; i < input.length; i++) { + chars[i] = BASE62[(input[i] & 0xFF) % BASE62.length]; + } + return new String(chars); + } + + /** + * Html 转码. + */ + public static String escapeHtml(String html) { + return StringEscapeUtils.escapeHtml(html); + } + + /** + * Html 解码. + */ + public static String unescapeHtml(String htmlEscaped) { + return StringEscapeUtils.unescapeHtml(htmlEscaped); + } + + /** + * Xml 转码. + */ + @SuppressWarnings("deprecation") + public static String escapeXml(String xml) { + return StringEscapeUtils.escapeXml(xml); + } + + /** + * Xml 解码. + */ + public static String unescapeXml(String xmlEscaped) { + return StringEscapeUtils.unescapeXml(xmlEscaped); + } + + /** + * URL 编码, Encode默认为UTF-8. + */ + public static String urlEncode(String part) { + try { + return URLEncoder.encode(part, DEFAULT_URL_ENCODING); + } catch (UnsupportedEncodingException e) { + throw com.fuint.exception.Exceptions.unchecked(e); + } + } + + /** + * URL 解码, Encode默认为UTF-8. + */ + public static String urlDecode(String part) { + + try { + return URLDecoder.decode(part, DEFAULT_URL_ENCODING); + } catch (UnsupportedEncodingException e) { + throw com.fuint.exception.Exceptions.unchecked(e); + } + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/ExportExcelUtil.java b/fuint-utils/src/main/java/com/fuint/utils/ExportExcelUtil.java new file mode 100644 index 0000000..26f2f1f --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/ExportExcelUtil.java @@ -0,0 +1,363 @@ +package com.fuint.utils; + +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.util.HSSFColor; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处! + * + * Created by FSQ + * CopyRight https://www.fuint.cn + * @param + * 应用泛型,代表任意一个符合javabean风格的类 + * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() + * byte[]表jpg格式的图片数据 + */ +public class ExportExcelUtil { + + public void exportExcel(String title,Collection dataset, OutputStream out) { + exportExcel(title, null, dataset, out, "yyyy-MM-dd"); + } + + + public void exportExcel(String title, + String[] headers, + Collection dataset, + OutputStream out, + String pattern) { + exportExcel(title, headers, dataset, out, pattern); + } + + + public void exportExcel(String title, + String[] headers, + String[] fields, + Collection dataset, + OutputStream out) { + + exportExcel(title, + headers, + fields, + dataset, + out, + "yyyy-MM-dd"); + } + + + /** + * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上 + * + * @param title + * 表格标题名 + * @param headers + * 表格属性列名数组 + * @param dataset + * 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 + * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) + * @param out + * 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + * @param pattern + * 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" + */ + @SuppressWarnings("unchecked") + public void exportExcel(String title, + String[] headers, + String[] ofields, + Collection dataset, + OutputStream out, + String pattern) { + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 生成一个表格 + HSSFSheet sheet = workbook.createSheet(title); + // 设置表格默认列宽度为15个字节 + sheet.setDefaultColumnWidth((short) 15); + // 生成一个样式 + + HSSFCellStyle hssfCellStyle = workbook.createCellStyle(); + HSSFFont font = workbook.createFont(); + font.setColor(HSSFColor.BLACK.index); + hssfCellStyle.setFont(font); + // 产生表格标题行 + HSSFRow row = sheet.createRow(0); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row.createCell(i); + // cell.setCellStyle(style); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(hssfCellStyle); + } + + // 遍历集合数据,产生数据行 + DecimalFormat df = new DecimalFormat("0.00"); + Iterator it = dataset.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + T t = (T) it.next(); + // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 + if (ofields != null) { + for (int i = 0; i < ofields.length; i++) { + HSSFCell cell = row.createCell(i); + // cell.setCellStyle(style2); + String fieldName = ofields[i]; + + String getMethodName = "get" + + fieldName.substring(0, 1) + .toUpperCase() + + fieldName.substring(1); + try { + Class tCls = t.getClass(); + Object value = null; + try { + Method getMethod = tCls.getMethod(getMethodName, + new Class[]{}); + value = getMethod.invoke(t, new Object[]{}); + } + catch (Exception e) { + // e.printStackTrace(); + } + // 判断值的类型后进行强制类型转换 + String textValue; + if (value == null) + continue; + textValue = convertTextValue(pattern, df, value); + // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 + if (textValue != null) { + Pattern p = Pattern.compile("^//d+(//.//d+)?$"); + Matcher matcher = p.matcher(textValue); + if (matcher.matches()) { + // 是数字当作double处理 + cell.setCellValue(Double.parseDouble(textValue)); + } else { + HSSFRichTextString richString = new HSSFRichTextString(textValue); + HSSFFont font3 = workbook.createFont(); + font3.setColor(HSSFColor.BLACK.index); + richString.applyFont(font3); + cell.setCellValue(richString); + } + } + + } + catch (SecurityException e) { + e.printStackTrace(); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + finally { + // 清理资源 + } + } + } else { + Field[] fields = t.getClass().getDeclaredFields(); + for (int i = 0; i < fields.length; i++) { + HSSFCell cell = row.createCell(i); + // cell.setCellStyle(style2); + Field field = fields[i]; + String fieldName = field.getName(); + + String getMethodName = "get" + + fieldName.substring(0, 1) + .toUpperCase() + + fieldName.substring(1); + try { + Class tCls = t.getClass(); + Object value = null; + try { + Method getMethod = tCls.getMethod(getMethodName, + new Class[]{}); + value = getMethod.invoke(t, new Object[]{}); + } + catch (Exception e) { + e.printStackTrace(); + } + // 判断值的类型后进行强制类型转换 + String textValue = null; + + if (value == null) + continue; + textValue = convertTextValue(pattern, df, value); + // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 + if (textValue != null) { + Pattern p = Pattern.compile("^//d+(//.//d+)?$"); + Matcher matcher = p.matcher(textValue); + if (matcher.matches()) { + // 是数字当作double处理 + cell.setCellValue(Double.parseDouble(textValue)); + } else { + HSSFRichTextString richString = new HSSFRichTextString(textValue); + // HSSFFont font3 = workbook.createFont(); + font.setColor(HSSFColor.BLACK.index); + richString.applyFont(font); + cell.setCellValue(richString); + } + } + + } + catch (SecurityException e) { + e.printStackTrace(); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + finally { + // 清理资源 + } + } + } + } + try { + workbook.write(out); + } + catch (IOException e) { + e.printStackTrace(); + } + + } + + private String convertTextValue(String pattern, DecimalFormat df, Object value) { + String textValue; + if (value instanceof Date) { + Date date = (Date) value; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + textValue = sdf.format(date); + } else if(value instanceof Timestamp){ + Timestamp timestamp = (Timestamp) value; + Date date = new Date(timestamp.getTime()); + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + textValue = sdf.format(date); + } else if (value instanceof Number) { + if (((Number) value).intValue() != 0) { + textValue = df.format((float) ((Number) value).intValue() / 100); + } else { + textValue = "0.00"; + } + } + /* + * else if (value instanceof byte[]) { // + * 有图片时,设置行高为60px; row.setHeightInPoints(60); // + * 设置图片所在列宽度为80px,注意这里单位的一个换算 sheet.setColumnWidth(i, + * (short) (35.7 * 80)); // sheet.autoSizeColumn(i); + * byte[] bsValue = (byte[]) value; HSSFClientAnchor + * anchor = new HSSFClientAnchor(0, 0, 1023, 255, + * (short) 6, index, (short) 6, index); + * anchor.setAnchorType(2); + * patriarch.createPicture(anchor, workbook.addPicture( + * bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG)); } + */ + else { + // 其它数据类型都当作字符串简单处理 + textValue = value.toString(); + } + return textValue; + } + + @SuppressWarnings("unchecked") + public static void exportExcel(String title, + String[] headers, + Collection dataset, + OutputStream out) { + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 生成一个表格 + HSSFSheet sheet = workbook.createSheet(title); + // 设置表格默认列宽度为15个字节 + sheet.setDefaultColumnWidth((short) 15); + // 生成一个样式 + HSSFCellStyle style = workbook.createCellStyle(); + // 设置这些样式 + style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); + style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); + style.setBorderBottom(HSSFCellStyle.BORDER_THIN); + style.setBorderLeft(HSSFCellStyle.BORDER_THIN); + style.setBorderRight(HSSFCellStyle.BORDER_THIN); + style.setBorderTop(HSSFCellStyle.BORDER_THIN); + style.setAlignment(HSSFCellStyle.ALIGN_CENTER); + // 生成一个字体 + HSSFFont font = workbook.createFont(); + font.setColor(HSSFColor.VIOLET.index); + font.setFontHeightInPoints((short) 12); + font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + // 把字体应用到当前的样式 + style.setFont(font); + // 生成并设置另一个样式 + HSSFCellStyle style2 = workbook.createCellStyle(); + style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); + style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); + style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); + style2.setBorderLeft(HSSFCellStyle.BORDER_THIN); + style2.setBorderRight(HSSFCellStyle.BORDER_THIN); + style2.setBorderTop(HSSFCellStyle.BORDER_THIN); + style2.setAlignment(HSSFCellStyle.ALIGN_CENTER); + style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); + // 生成另一个字体 + HSSFFont font2 = workbook.createFont(); + font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); + // 把字体应用到当前的样式 + style2.setFont(font2); + + // 声明一个画图的顶级管理器 + HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); + // 定义注释的大小和位置,详见文档 + HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, + 0, + 0, + 0, + (short) 4, + 2, + (short) 6, + 5)); + // 设置注释内容 + comment.setString(new HSSFRichTextString("可以在POI中添加注释!")); + // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容. + comment.setAuthor("leno"); + + // 产生表格标题行 + HSSFRow row = sheet.createRow(0); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row.createCell(i); + cell.setCellStyle(style); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + } + + // 遍历集合数据,产生数据行 + Iterator it = dataset.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index);// 行 + String[] t = (String[]) it.next(); + + for (int i = 0; i < t.length; i++) { + HSSFCell cell = row.createCell(i);// 行的格 + cell.setCellStyle(style2);// 行的样式 + HSSFRichTextString richString = new HSSFRichTextString(t[i]); + HSSFFont font3 = workbook.createFont(); + font3.setColor(HSSFColor.BLUE.index); + richString.applyFont(font3); + cell.setCellValue(richString); + } + } + try { + workbook.write(out); + } + catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/HttpUtil.java b/fuint-utils/src/main/java/com/fuint/utils/HttpUtil.java new file mode 100644 index 0000000..7433fc3 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/HttpUtil.java @@ -0,0 +1,147 @@ +package com.fuint.utils; + +import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.net.HttpURLConnection; +import java.nio.charset.Charset; +import java.util.Iterator; +import java.util.Map; + +/** + * http请求工具 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class HttpUtil { + + public static final int CONNECT_TIMEOUT = 30000; + public static final int READ_TIMEOUT = 60000; + public static final Charset UTF8 = Charset.forName("UTF-8"); + + public static byte[] toByteArray(Object obj) { + byte[] bytes = null; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try { + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.flush(); + bytes = bos.toByteArray(); + oos.close(); + bos.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + return bytes; + } + + /** + * 发送http请求 + * + * @param url + * @return + * @throws IOException + */ + public static String sendRequest(String url) { + URL myURL = null; + URLConnection httpsConn; + // 进行转码 + try { + myURL = new URL(url); + } catch (MalformedURLException e) { + // empty + } + StringBuffer sb = new StringBuffer(); + try { + httpsConn = myURL.openConnection(); + if (httpsConn != null) { + InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8"); + BufferedReader br = new BufferedReader(insr); + String data = null; + while ((data = br.readLine()) != null) { + sb.append(data); + } + insr.close(); + } + } catch (IOException e) { + return ""; + } + + return sb.toString(); + } + + public static String sendRequest(URL url, String data, Method method, Map headers) throws IOException { + HttpURLConnection client = (HttpURLConnection) url.openConnection(); + client.setConnectTimeout(CONNECT_TIMEOUT); + client.setReadTimeout(READ_TIMEOUT); + client.setRequestMethod(method.value); + if (headers != null && headers.size() > 0) { + Iterator iter = headers.keySet().iterator(); + while (iter.hasNext()) { + String key = iter.next().toString(); + client.setRequestProperty(key, headers.get(key)); + } + } + if (Method.POST.equals(method)) { + // 发送数据 + if (data != null) { + client.setDoOutput(true); + OutputStreamWriter osw = new OutputStreamWriter(client.getOutputStream(), "UTF-8"); + osw.write(data); + osw.flush(); + osw.close(); + } + } + // 发送请求 + client.connect(); + if (client.getResponseCode() >= 300) { + throw new ServerUnavailable(url, client.getResponseCode(), client.getResponseMessage()); + } + + // 获取响应 + BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(), UTF8)); + StringBuilder response = new StringBuilder(); + for (String line = in.readLine(); line != null; line = in.readLine()) { + response.append(line); + } + return response.toString(); + } + + public enum Method { + GET("GET"), + POST("POST"), + DELETE("DELETE"), + PUT("PUT"); + + /** + * 值 + */ + private String value; + + private Method(String value) { + this.value = value; + } + + /** + * @return the value + */ + public String getValue() { + return value; + } + + } + + public static class ServerUnavailable extends RuntimeException { + /** + * serialVersionUID + */ + private static final long serialVersionUID = 1L; + + public ServerUnavailable(URL url, int code, String msg) { + super("url: " + url + ", code: " + code + ", msg: " + msg); + } + } + +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/IDCard.java b/fuint-utils/src/main/java/com/fuint/utils/IDCard.java new file mode 100644 index 0000000..95348f1 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/IDCard.java @@ -0,0 +1,416 @@ +package com.fuint.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.regex.Pattern; + +/** + * 身份证工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class IDCard { + + /** + * 省,直辖市代码表: { 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", + * 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", + * 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南", + * 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆", + * 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃", + * 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} + */ + protected String codeAndCity[][] = {{"11", "北京"}, {"12", "天津"}, + {"13", "河北"}, {"14", "山西"}, {"15", "内蒙古"}, {"21", "辽宁"}, + {"22", "吉林"}, {"23", "黑龙江"}, {"31", "上海"}, {"32", "江苏"}, + {"33", "浙江"}, {"34", "安徽"}, {"35", "福建"}, {"36", "江西"}, + {"37", "山东"}, {"41", "河南"}, {"42", "湖北"}, {"43", "湖南"}, + {"44", "广东"}, {"45", "广西"}, {"46", "海南"}, {"50", "重庆"}, + {"51", "四川"}, {"52", "贵州"}, {"53", "云南"}, {"54", "西藏"}, + {"61", "陕西"}, {"62", "甘肃"}, {"63", "青海"}, {"64", "宁夏"}, + {"65", "新疆"}, {"71", "台湾"}, {"81", "香港"}, {"82", "澳门"}, + {"91", "国外"}}; + + private final String cityCode[] = {"11", "12", "13", "14", "15", "21", "22", + "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", + "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", + "64", "65", "71", "81", "82", "91"}; + + // 每位加权因子 + private int power[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; + + // 第18位校检码 + private final String verifyCode[] = {"1", "0", "X", "9", "8", "7", "6", "5", + "4", "3", "2"}; + + /** + * 验证所有的身份证的合法性 + * + * @param idcard + * @return + */ + public boolean isValidatedAllIdcard(String idcard) { + if (idcard.length() == 15) { + idcard = this.convertIdcarBy15bit(idcard); + } + return this.isValidate18Idcard(idcard); + } + + /** + *

+ * 判断18位身份证的合法性 + *

+ * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 + * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 + *

+ * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 + *

+ *

+ * 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码; + * 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码; + * 6.第17位数字表示性别:奇数表示男性,偶数表示女性; + * 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 + *

+ *

+ * 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 + * 2 1 6 3 7 9 10 5 8 4 2 + *

+ *

+ * 2.将这17位数字和系数相乘的结果相加。 + *

+ *

+ * 3.用加出来和除以11,看余数是多少? + *

+ * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 + * 2。 + *

+ * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 + *

+ * + * @param idcard + * @return + */ + public boolean isValidate18Idcard(String idcard) { + // 非18位为假 + if (idcard.length() != 18) { + return false; + } + // 获取前17位 + String idcard17 = idcard.substring(0, 17); + // 获取第18位 + String idcard18Code = idcard.substring(17, 18); + char c[] = null; + String checkCode = ""; + // 是否都为数字 + if (isDigital(idcard17)) { + c = idcard17.toCharArray(); + } else { + return false; + } + + if (null != c) { + int bit[] = new int[idcard17.length()]; + + bit = converCharToInt(c); + + int sum17 = 0; + + sum17 = getPowerSum(bit); + + // 将和值与11取模得到余数进行校验码判断 + checkCode = getCheckCodeBySum(sum17); + if (null == checkCode) { + return false; + } + // 将身份证的第18位与算出来的校码进行匹配,不相等就为假 + if (!idcard18Code.equalsIgnoreCase(checkCode)) { + return false; + } + } + return true; + } + + /** + * 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。 + * + * @param idcard + * @return + */ + public boolean isValidate15Idcard(String idcard) { + // 非15位为假 + if (idcard.length() != 15) { + return false; + } + + // 是否全都为数字 + if (isDigital(idcard)) { + String provinceid = idcard.substring(0, 2); + String birthday = idcard.substring(6, 12); + int year = Integer.parseInt(idcard.substring(6, 8)); + int month = Integer.parseInt(idcard.substring(8, 10)); + int day = Integer.parseInt(idcard.substring(10, 12)); + + // 判断是否为合法的省份 + boolean flag = false; + for (String id : cityCode) { + if (id.equals(provinceid)) { + flag = true; + break; + } + } + if (!flag) { + return false; + } + // 该身份证生出日期在当前日期之后时为假 + Date birthdate = null; + try { + birthdate = new SimpleDateFormat("yyMMdd").parse(birthday); + } catch (ParseException e) { + e.printStackTrace(); + } + if (birthdate == null || new Date().before(birthdate)) { + return false; + } + + // 判断是否为合法的年份 + GregorianCalendar curDay = new GregorianCalendar(); + int curYear = curDay.get(Calendar.YEAR); + int year2bit = Integer.parseInt(String.valueOf(curYear) + .substring(2)); + + // 判断该年份的两位表示法,小于50的和大于当前年份的,为假 + if ((year < 50 && year > year2bit)) { + return false; + } + + // 判断是否为合法的月份 + if (month < 1 || month > 12) { + return false; + } + + // 判断是否为合法的日期 + boolean mflag = false; + curDay.setTime(birthdate); // 将该身份证的出生日期赋于对象curDay + switch (month) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + mflag = (day >= 1 && day <= 31); + break; + case 2: // 公历的2月非闰年有28天,闰年的2月是29天。 + if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) { + mflag = (day >= 1 && day <= 29); + } else { + mflag = (day >= 1 && day <= 28); + } + break; + case 4: + case 6: + case 9: + case 11: + mflag = (day >= 1 && day <= 30); + break; + } + if (!mflag) { + return false; + } + } else { + return false; + } + return true; + } + + /** + * 将15位的身份证转成18位身份证 + * + * @param idcard + * @return + */ + public String convertIdcarBy15bit(String idcard) { + String idcard17 = null; + // 非15位身份证 + if (idcard.length() != 15) { + return null; + } + + if (isDigital(idcard)) { + // 获取出生年月日 + String birthday = idcard.substring(6, 12); + Date birthdate = null; + try { + birthdate = new SimpleDateFormat("yyMMdd").parse(birthday); + } catch (ParseException e) { + e.printStackTrace(); + } + Calendar cday = Calendar.getInstance(); + cday.setTime(birthdate); + String year = String.valueOf(cday.get(Calendar.YEAR)); + + idcard17 = idcard.substring(0, 6) + year + idcard.substring(8); + + char c[] = idcard17.toCharArray(); + String checkCode = ""; + + if (null != c) { + int bit[] = new int[idcard17.length()]; + + // 将字符数组转为整型数组 + bit = converCharToInt(c); + int sum17 = 0; + sum17 = getPowerSum(bit); + + // 获取和值与11取模得到余数进行校验码 + checkCode = getCheckCodeBySum(sum17); + // 获取不到校验位 + if (null == checkCode) { + return null; + } + + // 将前17位与第18位校验码拼接 + idcard17 += checkCode; + } + } else { // 身份证包含数字 + return null; + } + return idcard17; + } + + /** + * 15位和18位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public boolean isIdcard(String idcard) { + return idcard == null || "".equals(idcard) ? false : Pattern.matches( + "(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)", idcard); + } + + /** + * 15位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public boolean is15Idcard(String idcard) { + return idcard == null || "".equals(idcard) ? false : Pattern.matches( + "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$", + idcard); + } + + /** + * 18位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public boolean is18Idcard(String idcard) { + return Pattern + .matches( + "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", + idcard); + } + + /** + * 数字验证 + * + * @param str + * @return + */ + public boolean isDigital(String str) { + return str == null || "".equals(str) ? false : str.matches("^[0-9]*$"); + } + + /** + * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 + * + * @param bit + * @return + */ + public int getPowerSum(int[] bit) { + + int sum = 0; + + if (power.length != bit.length) { + return sum; + } + + for (int i = 0; i < bit.length; i++) { + for (int j = 0; j < power.length; j++) { + if (i == j) { + sum = sum + bit[i] * power[j]; + } + } + } + return sum; + } + + /** + * 将和值与11取模得到余数进行校验码判断 + * + * @param sum17 + * @return 校验位 + */ + public String getCheckCodeBySum(int sum17) { + String checkCode = null; + switch (sum17 % 11) { + case 10: + checkCode = "2"; + break; + case 9: + checkCode = "3"; + break; + case 8: + checkCode = "4"; + break; + case 7: + checkCode = "5"; + break; + case 6: + checkCode = "6"; + break; + case 5: + checkCode = "7"; + break; + case 4: + checkCode = "8"; + break; + case 3: + checkCode = "9"; + break; + case 2: + checkCode = "x"; + break; + case 1: + checkCode = "0"; + break; + case 0: + checkCode = "1"; + break; + } + return checkCode; + } + + /** + * 将字符数组转为整型数组 + * + * @param c + * @return + * @throws NumberFormatException + */ + public int[] converCharToInt(char[] c) throws NumberFormatException { + int[] a = new int[c.length]; + int k = 0; + for (char temp : c) { + a[k++] = Integer.parseInt(String.valueOf(temp)); + } + return a; + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/IpUtil.java b/fuint-utils/src/main/java/com/fuint/utils/IpUtil.java new file mode 100644 index 0000000..19734b2 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/IpUtil.java @@ -0,0 +1,72 @@ +package com.fuint.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.servlet.http.HttpServletRequest; + +/** + * IP地址工具类 + * + * Created by: FSQ + * CopyRight https://www.fuint.cn + */ +public class IpUtil { + + public static final Logger logger = LoggerFactory.getLogger(IpUtil.class); + + /** + * 校验IP是否在指定的段 + * + * @param ipSection IP网段,如: 10.167.7.1-10.167.7.255 + * @param ip Ip地址,如:10.167.7.56 + * @return boolean + */ + public static boolean ipIsValid(String ipSection, String ip) { + if (ipSection == null) { + throw new NullPointerException("IP段不能为空!"); + } + + if (ip == null) { + throw new NullPointerException("IP不能为空!"); + } + + ipSection = ipSection.trim(); + ip = ip.trim(); + final String REGX_IP = "((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; + final String REGX_IPB = REGX_IP + "\\-" + REGX_IP; + if (!ipSection.matches(REGX_IPB) || !ip.matches(REGX_IP)) + return false; + int idx = ipSection.indexOf('-'); + String[] sips = ipSection.substring(0, idx).split("\\."); + String[] sipe = ipSection.substring(idx + 1).split("\\."); + String[] sipt = ip.split("\\."); + long ips = 0L, ipe = 0L, ipt = 0L; + for (int i = 0; i < 4; ++i) { + ips = ips << 8 | Integer.parseInt(sips[i]); + ipe = ipe << 8 | Integer.parseInt(sipe[i]); + ipt = ipt << 8 | Integer.parseInt(sipt[i]); + } + if (ips > ipe) { + long t = ips; + ips = ipe; + ipe = t; + } + return ips <= ipt && ipt <= ipe; + } + + /** + * 校验IP是否在指定的段列表 + * + * @param ip + * @param ipSections + * @return boolean + */ + public static boolean ipIsValid(String ip, String... ipSections) { + for (String ipSection : ipSections) { + if (ipIsValid(ipSection, ip)) { + return true; + } + } + return false; + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/MD5Util.java b/fuint-utils/src/main/java/com/fuint/utils/MD5Util.java new file mode 100644 index 0000000..112b102 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/MD5Util.java @@ -0,0 +1,41 @@ +package com.fuint.utils; + +import java.security.MessageDigest; + +/** + * MD5加密工具 + * + * Created by: FSQ + * CopyRight https://www.fuint.cn + */ +public class MD5Util { + private final static char[] hexDigits = {'0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + private static String bytesToHex(byte[] bytes) { + StringBuffer sb = new StringBuffer(); + int t; + for (int i = 0; i < 16; i++) {// 16 == bytes.length; + + t = bytes[i]; + if (t < 0) + t += 256; + sb.append(hexDigits[(t >>> 4)]); + sb.append(hexDigits[(t % 16)]); + } + return sb.toString(); + } + + public static String code(String input) { + byte[] bytes = null; + MessageDigest md = null; + try { + bytes = input.getBytes("utf-8"); + md = MessageDigest.getInstance(System.getProperty( + "MD5.algorithm", "MD5")); + } catch (Exception e) { + e.printStackTrace(); + } + return bytesToHex(md.digest(bytes)); + } +} \ No newline at end of file diff --git a/fuint-utils/src/main/java/com/fuint/utils/ObjectUtil.java b/fuint-utils/src/main/java/com/fuint/utils/ObjectUtil.java new file mode 100644 index 0000000..89942e3 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/ObjectUtil.java @@ -0,0 +1,376 @@ +package com.fuint.utils; + +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 有关Object处理的工具类。 + * + * 这个类中的每个方法都可以“安全”地处理null,而不会抛出NullPointerException。 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class ObjectUtil { + /* ============================================================================ */ + /* 常量和singleton。 */ + /* ============================================================================ */ + + /** + * 用于表示null的常量。 + * + *

+ * 例如,HashMap.get(Object)方法返回null有两种可能: + * 值不存在或值为null。而这个singleton可用来区别这两种情形。 + *

+ * + *

+ * 另一个例子是,Hashtable的值不能为null。 + *

+ */ + public static final Object NULL = new Serializable() { + private static final long serialVersionUID = 7092611880189329093L; + + private Object readResolve() { + return NULL; + } + }; + + /* ============================================================================ */ + /* 默认值函数。 */ + /* */ + /* 当对象为null时,将对象转换成指定的默认对象。 */ + /* ============================================================================ */ + + /** + * 如果对象为null,则返回指定默认对象,否则返回对象本身。 + *
+     * ObjectUtil.defaultIfNull(null, null)      = null
+     * ObjectUtil.defaultIfNull(null, "")        = ""
+     * ObjectUtil.defaultIfNull(null, "zz")      = "zz"
+     * ObjectUtil.defaultIfNull("abc", *)        = "abc"
+     * ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
+     * 
+ * + * @param object 要测试的对象 + * @param defaultValue 默认值 + * + * @return 对象本身或默认对象 + */ + public static Object defaultIfNull(Object object, Object defaultValue) { + return (object != null) ? object : defaultValue; + } + + /* ============================================================================ */ + /* 比较函数。 */ + /* */ + /* 以下方法用来比较两个对象是否相同。 */ + /* ============================================================================ */ + + /** + * 比较两个对象是否完全相等。 + * + *

+ * 此方法可以正确地比较多维数组。 + *

+     * ObjectUtil.equals(null, null)                  = true
+     * ObjectUtil.equals(null, "")                    = false
+     * ObjectUtil.equals("", null)                    = false
+     * ObjectUtil.equals("", "")                      = true
+     * ObjectUtil.equals(Boolean.TRUE, null)          = false
+     * ObjectUtil.equals(Boolean.TRUE, "true")        = false
+     * ObjectUtil.equals(Boolean.TRUE, Boolean.TRUE)  = true
+     * ObjectUtil.equals(Boolean.TRUE, Boolean.FALSE) = false
+     * 
+ *

+ * + * @param object1 对象1 + * @param object2 对象2 + * + * @return 如果相等, 则返回true + */ + public static boolean equals(Object object1, Object object2) { + return ArrayUtil.equals(object1, object2); + } + + /* ============================================================================ */ + /* Hashcode函数。 */ + /* */ + /* 以下方法用来取得对象的hash code。 */ + /* ============================================================================ */ + + /** + * 取得对象的hash值, 如果对象为null, 则返回0。 + * + *

+ * 此方法可以正确地处理多维数组。 + *

+ * + * @param object 对象 + * + * @return hash值 + */ + public static int hashCode(Object object) { + return ArrayUtil.hashCode(object); + } + + /** + * 取得对象的原始的hash值, 如果对象为null, 则返回0。 + * + *

+ * 该方法使用System.identityHashCode来取得hash值,该值不受对象本身的hashCode方法的影响。 + *

+ * + * @param object 对象 + * + * @return hash值 + */ + public static int identityHashCode(Object object) { + return (object == null) ? 0 : System.identityHashCode(object); + } + + /* ============================================================================ */ + /* 取得对象的identity。 */ + /* ============================================================================ */ + + /** + * 取得对象自身的identity,如同对象没有覆盖toString()方法时,Object.toString()的原始输出。 + *
+     * ObjectUtil.identityToString(null)          = null
+     * ObjectUtil.identityToString("")            = "java.lang.String@1e23"
+     * ObjectUtil.identityToString(Boolean.TRUE)  = "java.lang.Boolean@7fa"
+     * ObjectUtil.identityToString(new int[0])    = "int[]@7fa"
+     * ObjectUtil.identityToString(new Object[0]) = "java.lang.Object[]@7fa"
+     * 
+ * + * @param object 对象 + * + * @return 对象的identity,如果对象是null,则返回null + */ + public static String identityToString(Object object) { + if (object == null) { + return null; + } + + return appendIdentityToString(null, object).toString(); + } + + /** + * 取得对象自身的identity,如同对象没有覆盖toString()方法时,Object.toString()的原始输出。 + *
+     * ObjectUtil.identityToString(null, "NULL")            = "NULL"
+     * ObjectUtil.identityToString("", "NULL")              = "java.lang.String@1e23"
+     * ObjectUtil.identityToString(Boolean.TRUE, "NULL")    = "java.lang.Boolean@7fa"
+     * ObjectUtil.identityToString(new int[0], "NULL")      = "int[]@7fa"
+     * ObjectUtil.identityToString(new Object[0], "NULL")   = "java.lang.Object[]@7fa"
+     * 
+ * + * @param object 对象 + * @param nullStr 如果对象为null,则返回该字符串 + * + * @return 对象的identity,如果对象是null,则返回指定字符串 + */ + public static String identityToString(Object object, String nullStr) { + if (object == null) { + return nullStr; + } + + return appendIdentityToString(null, object).toString(); + } + + /** + * 将对象自身的identity——如同对象没有覆盖toString()方法时,Object.toString()的原始输出——追加到StringBuffer中。 + *
+     * ObjectUtil.appendIdentityToString(*, null)            = null
+     * ObjectUtil.appendIdentityToString(null, "")           = "java.lang.String@1e23"
+     * ObjectUtil.appendIdentityToString(null, Boolean.TRUE) = "java.lang.Boolean@7fa"
+     * ObjectUtil.appendIdentityToString(buf, Boolean.TRUE)  = buf.append("java.lang.Boolean@7fa")
+     * ObjectUtil.appendIdentityToString(buf, new int[0])    = buf.append("int[]@7fa")
+     * ObjectUtil.appendIdentityToString(buf, new Object[0]) = buf.append("java.lang.Object[]@7fa")
+     * 
+ * + * @param buffer StringBuffer对象,如果是null,则创建新的 + * @param object 对象 + * + * @return StringBuffer对象,如果对象为null,则返回null + */ + public static StringBuffer appendIdentityToString(StringBuffer buffer, Object object) { + if (object == null) { + return null; + } + + if (buffer == null) { + buffer = new StringBuffer(); + } + + buffer.append(ClassUtil.getClassNameForObject(object)); + + return buffer.append('@').append(Integer.toHexString(identityHashCode(object))); + } + + /* ============================================================================ */ + /* Clone函数。 */ + /* */ + /* 以下方法调用Object.clone方法,默认是“浅复制”(shallow copy)。 */ + /* ============================================================================ */ + + /** + * 复制一个对象。如果对象为null,则返回null。 + * + *

+ * 此方法调用Object.clone方法,默认只进行“浅复制”。 对于数组,调用ArrayUtil.clone方法更高效。 + *

+ * + * @param array 要复制的数组 + * + * @return 数组的复本,如果原始数组为null,则返回null + */ + public static Object clone(Object array) { + if (array == null) { + return null; + } + + // 对数组特殊处理 + if (array instanceof Object[]) { + return ArrayUtil.clone((Object[]) array); + } + + if (array instanceof long[]) { + return ArrayUtil.clone((long[]) array); + } + + if (array instanceof int[]) { + return ArrayUtil.clone((int[]) array); + } + + if (array instanceof short[]) { + return ArrayUtil.clone((short[]) array); + } + + if (array instanceof byte[]) { + return ArrayUtil.clone((byte[]) array); + } + + if (array instanceof double[]) { + return ArrayUtil.clone((double[]) array); + } + + if (array instanceof float[]) { + return ArrayUtil.clone((float[]) array); + } + + if (array instanceof boolean[]) { + return ArrayUtil.clone((boolean[]) array); + } + + if (array instanceof char[]) { + return ArrayUtil.clone((char[]) array); + } + + // Not cloneable + if (!(array instanceof Cloneable)) { + throw new RuntimeException("Object of class " + array.getClass().getName() + + " is not Cloneable"); + } + + // 用reflection调用clone方法 + Class clazz = array.getClass(); + + try { + Method cloneMethod = clazz.getMethod("clone", ArrayUtil.EMPTY_CLASS_ARRAY); + + return cloneMethod.invoke(array, ArrayUtil.EMPTY_OBJECT_ARRAY); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + /* ============================================================================ */ + /* 比较对象的类型。 */ + /* ============================================================================ */ + + /** + * 检查两个对象是否属于相同类型。null将被看作任意类型。 + * + * @param object1 对象1 + * @param object2 对象2 + * + * @return 如果两个对象有相同的类型,则返回true + */ + public static boolean isSameType(Object object1, Object object2) { + if ((object1 == null) || (object2 == null)) { + return true; + } + + return object1.getClass().equals(object2.getClass()); + } + + /* ============================================================================ */ + /* toString方法。 */ + /* ============================================================================ */ + + /** + * 取得对象的toString()的值,如果对象为null,则返回空字符串""。 + *
+     * ObjectUtil.toString(null)         = ""
+     * ObjectUtil.toString("")           = ""
+     * ObjectUtil.toString("bat")        = "bat"
+     * ObjectUtil.toString(Boolean.TRUE) = "true"
+     * ObjectUtil.toString([1, 2, 3])    = "[1, 2, 3]"
+     * 
+ * + * @param object 对象 + * + * @return 对象的toString()的返回值,或空字符串"" + */ + public static String toString(Object object) { + return (object == null) ? StringUtil.EMPTY_STRING + : (object.getClass().isArray() ? ArrayUtil.toString(object) : object.toString()); + } + + /** + * 取得对象的toString()的值,如果对象为null,则返回指定字符串。 + *
+     * ObjectUtil.toString(null, null)           = null
+     * ObjectUtil.toString(null, "null")         = "null"
+     * ObjectUtil.toString("", "null")           = ""
+     * ObjectUtil.toString("bat", "null")        = "bat"
+     * ObjectUtil.toString(Boolean.TRUE, "null") = "true"
+     * ObjectUtil.toString([1, 2, 3], "null")    = "[1, 2, 3]"
+     * 
+ * + * @param object 对象 + * @param nullStr 如果对象为null,则返回该字符串 + * + * @return 对象的toString()的返回值,或指定字符串 + */ + public static String toString(Object object, String nullStr) { + return (object == null) ? nullStr : (object.getClass().isArray() ? ArrayUtil + .toString(object) : object.toString()); + } + /** + * 数字格式化方法 为thyleaf服务 + * + * @param num + * @return + */ + public static String toNum(Double num){ + java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); + try{ + if(num == null){ + return ""; + }else{ + return df.format(num); + } + }catch(Exception e){ + return "" ; + } + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/PropertiesUtil.java b/fuint-utils/src/main/java/com/fuint/utils/PropertiesUtil.java new file mode 100644 index 0000000..c8b14ff --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/PropertiesUtil.java @@ -0,0 +1,57 @@ +package com.fuint.utils; + +import org.apache.commons.lang.StringUtils; +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; + +/** + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class PropertiesUtil { + + public static final ResourceBundle messageResource = ResourceBundle.getBundle("international.message", Locale.getDefault()); + + /** + * 获取请求返回Code对应的Message + * @param code + * @param params + * @return + */ + public static String getResponseErrorMessageByCode(int code, String...params) { + if (messageResource == null) { + return ""; + } + String pStr = messageResource.getString("response.error." + code); + if (StringUtils.isEmpty(pStr) || pStr == null) { + return ""; + } + if (params == null || params.length == 0) { + return pStr; + } + MessageFormat format = new MessageFormat(pStr, Locale.getDefault()); + return format.format(params); + } + + /** + * 根据Key值获取Value + * @param key + * @param params + * @return + */ + public static String getValueByKey(String key, String...params) { + String pStr = messageResource.getString(key); + if (messageResource == null) { + return ""; + } + if (StringUtils.isEmpty(pStr)) { + return ""; + } + if (params == null || params.length == 0) { + return pStr; + } + MessageFormat format = new MessageFormat(pStr, Locale.getDefault()); + return format.format(params); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/QRCodeUtil.java b/fuint-utils/src/main/java/com/fuint/utils/QRCodeUtil.java new file mode 100644 index 0000000..6e138dd --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/QRCodeUtil.java @@ -0,0 +1,40 @@ +package com.fuint.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.*; + +/** + * 二维码生成工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class QRCodeUtil { + + public static final Logger logger = LoggerFactory.getLogger(QRCodeUtil.class); + + /** + * 保存二维码 + * + * @param bytes + * @return + * */ + public static void saveQrCodeToLocal(byte[] bytes, String path) { + try { + InputStream inputStream = new ByteArrayInputStream(bytes); + FileOutputStream out = new FileOutputStream(path); + + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { + out.write(buffer, 0, bytesRead); + } + out.flush(); + inputStream.close(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/RSAKeys.java b/fuint-utils/src/main/java/com/fuint/utils/RSAKeys.java new file mode 100644 index 0000000..5c6ff42 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/RSAKeys.java @@ -0,0 +1,15 @@ +package com.fuint.utils; +/** + * RSA公钥&私钥. + * */ +public interface RSAKeys { + /** + * 公钥 + * */ + public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxtLcYtsxohITlqO24KehQgJlq9k43XdpbIgjQXOht9eA9ypJKSlo1WbJUrJrKPGZ+2iELGe7dOQDL4Q+q1RGOXbBNRFQFqi8HZTHOz/krcQIuZYt7wjDu2P09zvgIvS+N6LaYrT7jddx+vN+Nk/ZZMcg/3ks/HAg7fBnCr2VcbQIDAQAB"; + + /** + * 私钥 + * */ + public static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALG0txi2zGiEhOWo7bgp6FCAmWr2Tjdd2lsiCNBc6G314D3KkkpKWjVZslSsmso8Zn7aIQsZ7t05AMvhD6rVEY5dsE1EVAWqLwdlMc7P+StxAi5li3vCMO7Y/T3O+Ai9L43otpitPuN13H68342T9lkxyD/eSz8cCDt8GcKvZVxtAgMBAAECgYA+pbbmv4rQTeeMD0G+6wc7Whq72pk4a53PAvCYhChsm4GyRvfLuOqUZEq6Dx+CrEh17/A2Oa47zxy4w18CmprVPpdiM+mSUgcqMxVMJJSJPh5uuN3uw/6B6+NvD81gfDiwHrh5Irh2gJMTah52jMcguCce6OaZa6DG+jSYDaSPAQJBAOsuTAjEPxnpzRrbTZWGgoC9ftfXsdsZCu6wmKfDd2lWHf/Kf6+sNjWN6Hf1gG1tJVYpRS1o9e2yxTfPqrqJnZMCQQDBb+m0sb7Pz41S2mnk/STU4Z5GpeA4JJbbs+GSUzwfzZl9ZGMmJ1Ej1c+9n/BORgoGyrDDQrQPMidAyvR5gV3/AkBRfeBg5UeMPiSRGs6eclaEL6VlO1totRvBq7Wp5CRbfri0asGl6MF7+ylDb/FJeZmHapOK8aTN8bU+6pmZO5g7AkBMjIww3LJFLL6hjhuf6em8cPigvp3nudsVYK8gp93APC3EqIhwHdkHVGKciQGhCCiJnYasDuaQqOlNw8NRnjdjAkEAwh3THsHJArsSKmZYIM98+qgYpgQZVm7KNNxbKGu5IZPh0IV3NsxQYspE0cRBmzr3P3mAWPwPzh1sFHfFRw3UKQ=="; +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/SeqUtil.java b/fuint-utils/src/main/java/com/fuint/utils/SeqUtil.java new file mode 100644 index 0000000..1a01307 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/SeqUtil.java @@ -0,0 +1,122 @@ +package com.fuint.utils; + +import java.math.BigInteger; +import java.util.Calendar; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 序列工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class SeqUtil { + + /** + * 产生字符串序列(长度:32) + * + * @return String 32位字符串序列 + */ + public static String getUUID() { + String uuid = UUID.randomUUID().toString(); + return uuid.replaceAll("\\-", "").toUpperCase(); + } + + /** + * 产生日期序列(长度:32) + * [yyyyMMddHHmmssSSS+15位随机数] + * + * @return Long + */ + public static BigInteger getTimeSeq() { + String date = CommonUtil.formatDate(Calendar.getInstance().getTime(), "yyyyMMddHHmmssSSS"); + StringBuilder sb = new StringBuilder(); + sb.append(date); + int length = 32 - sb.length(); + String randNum = getRandomNumber(length); + sb.append(randNum); + return new BigInteger(sb.toString()); + } + + /** + * 产生日期序列(长度:大于17位) + * [yyyyMMddHHmmssSSS+15位随机数] + * + * @return Long + */ + public static String getTimeSeq(int length) { + String date = CommonUtil.formatDate(Calendar.getInstance().getTime(), "yyyyMMddHHmmssSSS"); + StringBuilder sb = new StringBuilder(); + sb.append(date); + length = length - sb.length(); + if (length > 0) { + String randNum = getRandomNumber(length); + sb.append(randNum); + } + return sb.toString(); + } + + /** + * 根据客户自定义前缀获取序列(长度:32) + * [前缀+yyyyMMddHHmmssSSS+随机数] + * + * @param prefix + * @return String + */ + public static String getCustSeq(String prefix) { + String date = CommonUtil.formatDate(Calendar.getInstance().getTime(), "yyyyMMddHHmmssSSS"); + StringBuilder sb = new StringBuilder(prefix); + sb.append(date); + int length = 32 - sb.length(); + String randNum = getRandomNumber(length); + sb.append(randNum); + return sb.toString(); + } + + /** + * 产生指定长度随机字母 + * + * @param length + * @return String + */ + public static String getRandomLetter(int length) { + String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int rang = 26; + ThreadLocalRandom rand = ThreadLocalRandom.current(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < length; i++) { + sb.append(base.charAt(rand.nextInt(rang))); + } + return sb.toString(); + } + + /** + * 产生指定长度随机数字 + * + * @param length + * @return String + */ + public static String getRandomNumber(int length) { + String base = "0123456789"; + int rang = 10; + ThreadLocalRandom rand = ThreadLocalRandom.current(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < length; i++) { + sb.append(base.charAt(rand.nextInt(rang))); + } + return sb.toString(); + } + + /** + * 产生指定区间的随机整数 + * + * @param min + * @param max + * @return int + */ + public static int getRandomNumber(int min, int max) { + ThreadLocalRandom rand = ThreadLocalRandom.current(); + return rand.nextInt(min, max); + } +} \ No newline at end of file diff --git a/fuint-utils/src/main/java/com/fuint/utils/StringUtil.java b/fuint-utils/src/main/java/com/fuint/utils/StringUtil.java new file mode 100644 index 0000000..f2d7e95 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/StringUtil.java @@ -0,0 +1,4210 @@ +package com.fuint.utils; + +import com.fuint.text.StrFormatter; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * 有关字符串处理的工具类。 + * + * 这个类中的每个方法都可以“安全”地处理null,而不会抛出NullPointerException。 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class StringUtil { + + /* ============================================================================ */ + /* 常量和singleton。 */ + /* ============================================================================ */ + + /** 空字符串。 */ + public static final String EMPTY_STRING = ""; + + /* ============================================================================ */ + /* 判空函数。 */ + /* */ + /* 以下方法用来判定一个字符串是否为: */ + /* 1. null */ + /* 2. empty - "" */ + /* 3. blank - "全部是空白" - 空白由Character.isWhitespace所定义。 */ + /* ============================================================================ */ + + /** + * 检查字符串是否为null或空字符串""。 + *
+     * StringUtil.isEmpty(null)      = true
+     * StringUtil.isEmpty("")        = true
+     * StringUtil.isEmpty(" ")       = false
+     * StringUtil.isEmpty("bob")     = false
+     * StringUtil.isEmpty("  bob  ") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果为空, 则返回true + */ + public static boolean isEmpty(String str) { + return ((str == null) || (str.length() == 0)); + } + + /** + * 检查字符串是否不是null和空字符串""。 + *
+     * StringUtil.isEmpty(null)      = false
+     * StringUtil.isEmpty("")        = false
+     * StringUtil.isEmpty(" ")       = true
+     * StringUtil.isEmpty("bob")     = true
+     * StringUtil.isEmpty("  bob  ") = true
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果不为空, 则返回true + */ + public static boolean isNotEmpty(String str) { + return ((str != null) && (str.length() > 0)); + } + + /** + * 检查字符串是否是空白:null、空字符串""或只有空白字符。 + *
+     * StringUtil.isBlank(null)      = true
+     * StringUtil.isBlank("")        = true
+     * StringUtil.isBlank(" ")       = true
+     * StringUtil.isBlank("bob")     = false
+     * StringUtil.isBlank("  bob  ") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果为空白, 则返回true + */ + public static boolean isBlank(String str) { + int length; + + if ((str == null) || ((length = str.length()) == 0)) { + return true; + } + + for (int i = 0; i < length; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return false; + } + } + + return true; + } + + /** + * 检查字符串是否不是空白:null、空字符串""或只有空白字符。 + *
+     * StringUtil.isBlank(null)      = false
+     * StringUtil.isBlank("")        = false
+     * StringUtil.isBlank(" ")       = false
+     * StringUtil.isBlank("bob")     = true
+     * StringUtil.isBlank("  bob  ") = true
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果为空白, 则返回true + */ + public static boolean isNotBlank(String str) { + int length; + + if ((str == null) || ((length = str.length()) == 0)) { + return false; + } + + for (int i = 0; i < length; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return true; + } + } + + return false; + } + + /** + * 如果字符串是null,则返回空字符串"",否则返回字符串本身。 + *
+     * StringUtil.defaultIfNull(null)  = ""
+     * StringUtil.defaultIfNull("")    = ""
+     * StringUtil.defaultIfNull("  ")  = "  "
+     * StringUtil.defaultIfNull("bat") = "bat"
+     * 
+ * + * @param str 要转换的字符串 + * + * @return 字符串本身或空字符串"" + */ + public static String defaultIfNull(String str) { + return (str == null) ? EMPTY_STRING : str; + } + + /** + * 如果字符串是null,则返回指定默认字符串,否则返回字符串本身。 + *
+     * StringUtil.defaultIfNull(null, "default")  = "default"
+     * StringUtil.defaultIfNull("", "default")    = ""
+     * StringUtil.defaultIfNull("  ", "default")  = "  "
+     * StringUtil.defaultIfNull("bat", "default") = "bat"
+     * 
+ * + * @param str 要转换的字符串 + * @param defaultStr 默认字符串 + * + * @return 字符串本身或指定的默认字符串 + */ + public static String defaultIfNull(String str, String defaultStr) { + return (str == null) ? defaultStr : str; + } + + /** + * 如果字符串是null或空字符串"",则返回空字符串"",否则返回字符串本身。 + * + *

+ * 此方法实际上和defaultIfNull(String)等效。 + *

+     * StringUtil.defaultIfEmpty(null)  = ""
+     * StringUtil.defaultIfEmpty("")    = ""
+     * StringUtil.defaultIfEmpty("  ")  = "  "
+     * StringUtil.defaultIfEmpty("bat") = "bat"
+     * 
+ *

+ * + * @param str 要转换的字符串 + * + * @return 字符串本身或空字符串"" + */ + public static String defaultIfEmpty(String str) { + return (str == null) ? EMPTY_STRING : str; + } + + /** + * 如果字符串是null或空字符串"",则返回指定默认字符串,否则返回字符串本身。 + *
+     * StringUtil.defaultIfEmpty(null, "default")  = "default"
+     * StringUtil.defaultIfEmpty("", "default")    = "default"
+     * StringUtil.defaultIfEmpty("  ", "default")  = "  "
+     * StringUtil.defaultIfEmpty("bat", "default") = "bat"
+     * 
+ * + * @param str 要转换的字符串 + * @param defaultStr 默认字符串 + * + * @return 字符串本身或指定的默认字符串 + */ + public static String defaultIfEmpty(String str, String defaultStr) { + return ((str == null) || (str.length() == 0)) ? defaultStr : str; + } + + /** + * 如果字符串是空白:null、空字符串""或只有空白字符,则返回空字符串"",否则返回字符串本身。 + *
+     * StringUtil.defaultIfBlank(null)  = ""
+     * StringUtil.defaultIfBlank("")    = ""
+     * StringUtil.defaultIfBlank("  ")  = ""
+     * StringUtil.defaultIfBlank("bat") = "bat"
+     * 
+ * + * @param str 要转换的字符串 + * + * @return 字符串本身或空字符串"" + */ + public static String defaultIfBlank(String str) { + return isBlank(str) ? EMPTY_STRING : str; + } + + /** + * 如果字符串是null或空字符串"",则返回指定默认字符串,否则返回字符串本身。 + *
+     * StringUtil.defaultIfBlank(null, "default")  = "default"
+     * StringUtil.defaultIfBlank("", "default")    = "default"
+     * StringUtil.defaultIfBlank("  ", "default")  = "default"
+     * StringUtil.defaultIfBlank("bat", "default") = "bat"
+     * 
+ * + * @param str 要转换的字符串 + * @param defaultStr 默认字符串 + * + * @return 字符串本身或指定的默认字符串 + */ + public static String defaultIfBlank(String str, String defaultStr) { + return isBlank(str) ? defaultStr : str; + } + + /* ============================================================================ */ + /* 去空白(或指定字符)的函数。 */ + /* */ + /* 以下方法用来除去一个字串中的空白或指定字符。 */ + /* ============================================================================ */ + + /** + * 除去字符串头尾部的空白,如果字符串是null,依然返回null。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trim(null)          = null
+     * StringUtil.trim("")            = ""
+     * StringUtil.trim("     ")       = ""
+     * StringUtil.trim("abc")         = "abc"
+     * StringUtil.trim("    abc    ") = "abc"
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 除去空白的字符串,如果原字串为null,则返回null + */ + public static String trim(String str) { + return trim(str, null, 0); + } + + /** + * 除去字符串头尾部的指定字符,如果字符串是null,依然返回null。 + *
+     * StringUtil.trim(null, *)          = null
+     * StringUtil.trim("", *)            = ""
+     * StringUtil.trim("abc", null)      = "abc"
+     * StringUtil.trim("  abc", null)    = "abc"
+     * StringUtil.trim("abc  ", null)    = "abc"
+     * StringUtil.trim(" abc ", null)    = "abc"
+     * StringUtil.trim("  abcyx", "xyz") = "  abc"
+     * 
+ * + * @param str 要处理的字符串 + * @param stripChars 要除去的字符,如果为null表示除去空白字符 + * + * @return 除去指定字符后的的字符串,如果原字串为null,则返回null + */ + public static String trim(String str, String stripChars) { + return trim(str, stripChars, 0); + } + + /** + * 除去字符串头部的空白,如果字符串是null,则返回null。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trimStart(null)         = null
+     * StringUtil.trimStart("")           = ""
+     * StringUtil.trimStart("abc")        = "abc"
+     * StringUtil.trimStart("  abc")      = "abc"
+     * StringUtil.trimStart("abc  ")      = "abc  "
+     * StringUtil.trimStart(" abc ")      = "abc "
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 除去空白的字符串,如果原字串为null或结果字符串为"",则返回null + */ + public static String trimStart(String str) { + return trim(str, null, -1); + } + + /** + * 除去字符串头部的指定字符,如果字符串是null,依然返回null。 + *
+     * StringUtil.trimStart(null, *)          = null
+     * StringUtil.trimStart("", *)            = ""
+     * StringUtil.trimStart("abc", "")        = "abc"
+     * StringUtil.trimStart("abc", null)      = "abc"
+     * StringUtil.trimStart("  abc", null)    = "abc"
+     * StringUtil.trimStart("abc  ", null)    = "abc  "
+     * StringUtil.trimStart(" abc ", null)    = "abc "
+     * StringUtil.trimStart("yxabc  ", "xyz") = "abc  "
+     * 
+ * + * @param str 要处理的字符串 + * @param stripChars 要除去的字符,如果为null表示除去空白字符 + * + * @return 除去指定字符后的的字符串,如果原字串为null,则返回null + */ + public static String trimStart(String str, String stripChars) { + return trim(str, stripChars, -1); + } + + /** + * 除去字符串尾部的空白,如果字符串是null,则返回null。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trimEnd(null)       = null
+     * StringUtil.trimEnd("")         = ""
+     * StringUtil.trimEnd("abc")      = "abc"
+     * StringUtil.trimEnd("  abc")    = "  abc"
+     * StringUtil.trimEnd("abc  ")    = "abc"
+     * StringUtil.trimEnd(" abc ")    = " abc"
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 除去空白的字符串,如果原字串为null或结果字符串为"",则返回null + */ + public static String trimEnd(String str) { + return trim(str, null, 1); + } + + /** + * 除去字符串尾部的指定字符,如果字符串是null,依然返回null。 + *
+     * StringUtil.trimEnd(null, *)          = null
+     * StringUtil.trimEnd("", *)            = ""
+     * StringUtil.trimEnd("abc", "")        = "abc"
+     * StringUtil.trimEnd("abc", null)      = "abc"
+     * StringUtil.trimEnd("  abc", null)    = "  abc"
+     * StringUtil.trimEnd("abc  ", null)    = "abc"
+     * StringUtil.trimEnd(" abc ", null)    = " abc"
+     * StringUtil.trimEnd("  abcyx", "xyz") = "  abc"
+     * 
+ * + * @param str 要处理的字符串 + * @param stripChars 要除去的字符,如果为null表示除去空白字符 + * + * @return 除去指定字符后的的字符串,如果原字串为null,则返回null + */ + public static String trimEnd(String str, String stripChars) { + return trim(str, stripChars, 1); + } + + /** + * 除去字符串头尾部的空白,如果结果字符串是空字符串"",则返回null。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trimToNull(null)          = null
+     * StringUtil.trimToNull("")            = null
+     * StringUtil.trimToNull("     ")       = null
+     * StringUtil.trimToNull("abc")         = "abc"
+     * StringUtil.trimToNull("    abc    ") = "abc"
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 除去空白的字符串,如果原字串为null或结果字符串为"",则返回null + */ + public static String trimToNull(String str) { + return trimToNull(str, null); + } + + /** + * 除去字符串头尾部的空白,如果结果字符串是空字符串"",则返回null。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trim(null, *)          = null
+     * StringUtil.trim("", *)            = null
+     * StringUtil.trim("abc", null)      = "abc"
+     * StringUtil.trim("  abc", null)    = "abc"
+     * StringUtil.trim("abc  ", null)    = "abc"
+     * StringUtil.trim(" abc ", null)    = "abc"
+     * StringUtil.trim("  abcyx", "xyz") = "  abc"
+     * 
+ *

+ * + * @param str 要处理的字符串 + * @param stripChars 要除去的字符,如果为null表示除去空白字符 + * + * @return 除去空白的字符串,如果原字串为null或结果字符串为"",则返回null + */ + public static String trimToNull(String str, String stripChars) { + String result = trim(str, stripChars); + + if ((result == null) || (result.length() == 0)) { + return null; + } + + return result; + } + + /** + * 除去字符串头尾部的空白,如果字符串是null,则返回空字符串""。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trimToEmpty(null)          = ""
+     * StringUtil.trimToEmpty("")            = ""
+     * StringUtil.trimToEmpty("     ")       = ""
+     * StringUtil.trimToEmpty("abc")         = "abc"
+     * StringUtil.trimToEmpty("    abc    ") = "abc"
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 除去空白的字符串,如果原字串为null或结果字符串为"",则返回null + */ + public static String trimToEmpty(String str) { + return trimToEmpty(str, null); + } + + /** + * 除去字符串头尾部的空白,如果字符串是null,则返回空字符串""。 + * + *

+ * 注意,和String.trim不同,此方法使用Character.isWhitespace来判定空白, + * 因而可以除去英文字符集之外的其它空白,如中文空格。 + *

+     * StringUtil.trim(null, *)          = ""
+     * StringUtil.trim("", *)            = ""
+     * StringUtil.trim("abc", null)      = "abc"
+     * StringUtil.trim("  abc", null)    = "abc"
+     * StringUtil.trim("abc  ", null)    = "abc"
+     * StringUtil.trim(" abc ", null)    = "abc"
+     * StringUtil.trim("  abcyx", "xyz") = "  abc"
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 除去空白的字符串,如果原字串为null或结果字符串为"",则返回null + */ + public static String trimToEmpty(String str, String stripChars) { + String result = trim(str, stripChars); + + if (result == null) { + return EMPTY_STRING; + } + + return result; + } + + /** + * 除去字符串头尾部的指定字符,如果字符串是null,依然返回null。 + *
+     * StringUtil.trim(null, *)          = null
+     * StringUtil.trim("", *)            = ""
+     * StringUtil.trim("abc", null)      = "abc"
+     * StringUtil.trim("  abc", null)    = "abc"
+     * StringUtil.trim("abc  ", null)    = "abc"
+     * StringUtil.trim(" abc ", null)    = "abc"
+     * StringUtil.trim("  abcyx", "xyz") = "  abc"
+     * 
+ * + * @param str 要处理的字符串 + * @param stripChars 要除去的字符,如果为null表示除去空白字符 + * @param mode -1表示trimStart,0表示trim全部,1表示trimEnd + * + * @return 除去指定字符后的的字符串,如果原字串为null,则返回null + */ + private static String trim(String str, String stripChars, int mode) { + if (str == null) { + return null; + } + + int length = str.length(); + int start = 0; + int end = length; + + // 扫描字符串头部 + if (mode <= 0) { + if (stripChars == null) { + while ((start < end) && (Character.isWhitespace(str.charAt(start)))) { + start++; + } + } else if (stripChars.length() == 0) { + return str; + } else { + while ((start < end) && (stripChars.indexOf(str.charAt(start)) != -1)) { + start++; + } + } + } + + // 扫描字符串尾部 + if (mode >= 0) { + if (stripChars == null) { + while ((start < end) && (Character.isWhitespace(str.charAt(end - 1)))) { + end--; + } + } else if (stripChars.length() == 0) { + return str; + } else { + while ((start < end) && (stripChars.indexOf(str.charAt(end - 1)) != -1)) { + end--; + } + } + } + + if ((start > 0) || (end < length)) { + return str.substring(start, end); + } + + return str; + } + + /* ============================================================================ */ + /* 比较函数。 */ + /* */ + /* 以下方法用来比较两个字符串是否相同。 */ + /* ============================================================================ */ + + /** + * 比较两个字符串(大小写敏感)。 + *
+     * StringUtil.equals(null, null)   = true
+     * StringUtil.equals(null, "abc")  = false
+     * StringUtil.equals("abc", null)  = false
+     * StringUtil.equals("abc", "abc") = true
+     * StringUtil.equals("abc", "ABC") = false
+     * 
+ * + * @param str1 要比较的字符串1 + * @param str2 要比较的字符串2 + * + * @return 如果两个字符串相同,或者都是null,则返回true + */ + public static boolean equals(String str1, String str2) { + if (str1 == null) { + return str2 == null; + } + + return str1.equals(str2); + } + + /** + * 比较两个字符串(大小写不敏感)。 + *
+     * StringUtil.equalsIgnoreCase(null, null)   = true
+     * StringUtil.equalsIgnoreCase(null, "abc")  = false
+     * StringUtil.equalsIgnoreCase("abc", null)  = false
+     * StringUtil.equalsIgnoreCase("abc", "abc") = true
+     * StringUtil.equalsIgnoreCase("abc", "ABC") = true
+     * 
+ * + * @param str1 要比较的字符串1 + * @param str2 要比较的字符串2 + * + * @return 如果两个字符串相同,或者都是null,则返回true + */ + public static boolean equalsIgnoreCase(String str1, String str2) { + if (str1 == null) { + return str2 == null; + } + + return str1.equalsIgnoreCase(str2); + } + + /* ============================================================================ */ + /* 字符串类型判定函数。 */ + /* */ + /* 判定字符串的类型是否为:字母、数字、空白等 */ + /* ============================================================================ */ + + /** + * 判断字符串是否只包含unicode字母。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isAlpha(null)   = false
+     * StringUtil.isAlpha("")     = true
+     * StringUtil.isAlpha("  ")   = false
+     * StringUtil.isAlpha("abc")  = true
+     * StringUtil.isAlpha("ab2c") = false
+     * StringUtil.isAlpha("ab-c") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode字母组成,则返回true + */ + public static boolean isAlpha(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isLetter(str.charAt(i))) { + return false; + } + } + + return true; + } + + /** + * 判断字符串是否只包含unicode字母和空格' '。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isAlphaSpace(null)   = false
+     * StringUtil.isAlphaSpace("")     = true
+     * StringUtil.isAlphaSpace("  ")   = true
+     * StringUtil.isAlphaSpace("abc")  = true
+     * StringUtil.isAlphaSpace("ab c") = true
+     * StringUtil.isAlphaSpace("ab2c") = false
+     * StringUtil.isAlphaSpace("ab-c") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode字母和空格组成,则返回true + */ + public static boolean isAlphaSpace(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isLetter(str.charAt(i)) && (str.charAt(i) != ' ')) { + return false; + } + } + + return true; + } + + /** + * 判断字符串是否只包含unicode字母和数字。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isAlphanumeric(null)   = false
+     * StringUtil.isAlphanumeric("")     = true
+     * StringUtil.isAlphanumeric("  ")   = false
+     * StringUtil.isAlphanumeric("abc")  = true
+     * StringUtil.isAlphanumeric("ab c") = false
+     * StringUtil.isAlphanumeric("ab2c") = true
+     * StringUtil.isAlphanumeric("ab-c") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode字母数字组成,则返回true + */ + public static boolean isAlphanumeric(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isLetterOrDigit(str.charAt(i))) { + return false; + } + } + + return true; + } + + /** + * 判断字符串是否只包含unicode字母数字和空格' '。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isAlphanumericSpace(null)   = false
+     * StringUtil.isAlphanumericSpace("")     = true
+     * StringUtil.isAlphanumericSpace("  ")   = true
+     * StringUtil.isAlphanumericSpace("abc")  = true
+     * StringUtil.isAlphanumericSpace("ab c") = true
+     * StringUtil.isAlphanumericSpace("ab2c") = true
+     * StringUtil.isAlphanumericSpace("ab-c") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode字母数字和空格组成,则返回true + */ + public static boolean isAlphanumericSpace(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isLetterOrDigit(str.charAt(i)) && (str.charAt(i) != ' ')) { + return false; + } + } + + return true; + } + + /** + * 判断字符串是否只包含unicode数字。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isNumeric(null)   = false
+     * StringUtil.isNumeric("")     = true
+     * StringUtil.isNumeric("  ")   = false
+     * StringUtil.isNumeric("123")  = true
+     * StringUtil.isNumeric("12 3") = false
+     * StringUtil.isNumeric("ab2c") = false
+     * StringUtil.isNumeric("12-3") = false
+     * StringUtil.isNumeric("12.3") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode数字组成,则返回true + */ + public static boolean isNumeric(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isDigit(str.charAt(i))) { + return false; + } + } + + return true; + } + + /** + * 判断字符串是否只包含unicode数字和空格' '。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isNumericSpace(null)   = false
+     * StringUtil.isNumericSpace("")     = true
+     * StringUtil.isNumericSpace("  ")   = true
+     * StringUtil.isNumericSpace("123")  = true
+     * StringUtil.isNumericSpace("12 3") = true
+     * StringUtil.isNumericSpace("ab2c") = false
+     * StringUtil.isNumericSpace("12-3") = false
+     * StringUtil.isNumericSpace("12.3") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode数字和空格组成,则返回true + */ + public static boolean isNumericSpace(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isDigit(str.charAt(i)) && (str.charAt(i) != ' ')) { + return false; + } + } + + return true; + } + + /** + * 判断字符串是否只包含unicode空白。 + * + *

+ * null将返回false,空字符串""将返回true。 + *

+ *
+     * StringUtil.isWhitespace(null)   = false
+     * StringUtil.isWhitespace("")     = true
+     * StringUtil.isWhitespace("  ")   = true
+     * StringUtil.isWhitespace("abc")  = false
+     * StringUtil.isWhitespace("ab2c") = false
+     * StringUtil.isWhitespace("ab-c") = false
+     * 
+ * + * @param str 要检查的字符串 + * + * @return 如果字符串非null并且全由unicode空白组成,则返回true + */ + public static boolean isWhitespace(String str) { + if (str == null) { + return false; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return false; + } + } + + return true; + } + + /* ============================================================================ */ + /* 大小写转换。 */ + /* ============================================================================ */ + + /** + * 将字符串转换成大写。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.toUpperCase(null)  = null
+     * StringUtil.toUpperCase("")    = ""
+     * StringUtil.toUpperCase("aBc") = "ABC"
+     * 
+ *

+ * + * @param str 要转换的字符串 + * + * @return 大写字符串,如果原字符串为null,则返回null + */ + public static String toUpperCase(String str) { + if (str == null) { + return null; + } + + return str.toUpperCase(); + } + + /** + * 将字符串转换成小写。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.toLowerCase(null)  = null
+     * StringUtil.toLowerCase("")    = ""
+     * StringUtil.toLowerCase("aBc") = "abc"
+     * 
+ *

+ * + * @param str 要转换的字符串 + * + * @return 大写字符串,如果原字符串为null,则返回null + */ + public static String toLowerCase(String str) { + if (str == null) { + return null; + } + + return str.toLowerCase(); + } + + /** + * 将字符串的首字符转成大写(Character.toTitleCase),其它字符不变。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.capitalize(null)  = null
+     * StringUtil.capitalize("")    = ""
+     * StringUtil.capitalize("cat") = "Cat"
+     * StringUtil.capitalize("cAt") = "CAt"
+     * 
+ *

+ * + * @param str 要转换的字符串 + * + * @return 首字符为大写的字符串,如果原字符串为null,则返回null + */ + public static String capitalize(String str) { + int strLen; + + if ((str == null) || ((strLen = str.length()) == 0)) { + return str; + } + + return new StringBuffer(strLen).append(Character.toTitleCase(str.charAt(0))) + .append(str.substring(1)).toString(); + } + + /** + * 将字符串的首字符转成小写,其它字符不变。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.uncapitalize(null)  = null
+     * StringUtil.uncapitalize("")    = ""
+     * StringUtil.uncapitalize("Cat") = "cat"
+     * StringUtil.uncapitalize("CAT") = "cAT"
+     * 
+ *

+ * + * @param str 要转换的字符串 + * + * @return 首字符为小写的字符串,如果原字符串为null,则返回null + */ + public static String uncapitalize(String str) { + int strLen; + + if ((str == null) || ((strLen = str.length()) == 0)) { + return str; + } + + return new StringBuffer(strLen).append(Character.toLowerCase(str.charAt(0))) + .append(str.substring(1)).toString(); + } + + /** + * 反转字符串的大小写。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.swapCase(null)                 = null
+     * StringUtil.swapCase("")                   = ""
+     * StringUtil.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
+     * 
+ *

+ * + * @param str 要转换的字符串 + * + * @return 大小写被反转的字符串,如果原字符串为null,则返回null + */ + public static String swapCase(String str) { + int strLen; + + if ((str == null) || ((strLen = str.length()) == 0)) { + return str; + } + + StringBuffer buffer = new StringBuffer(strLen); + + char ch = 0; + + for (int i = 0; i < strLen; i++) { + ch = str.charAt(i); + + if (Character.isUpperCase(ch)) { + ch = Character.toLowerCase(ch); + } else if (Character.isTitleCase(ch)) { + ch = Character.toLowerCase(ch); + } else if (Character.isLowerCase(ch)) { + ch = Character.toUpperCase(ch); + } + + buffer.append(ch); + } + + return buffer.toString(); + } + + /** + * 将字符串转换成camel case。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.toCamelCase(null)  = null
+     * StringUtil.toCamelCase("")    = ""
+     * StringUtil.toCamelCase("aBc") = "aBc"
+     * StringUtil.toCamelCase("aBc def") = "aBcDef"
+     * StringUtil.toCamelCase("aBc def_ghi") = "aBcDefGhi"
+     * StringUtil.toCamelCase("aBc def_ghi 123") = "aBcDefGhi123"
+     * 
+ *

+ * + *

+ * 此方法会保留除了下划线和空白以外的所有分隔符。 + *

+ * + * @param str 要转换的字符串 + * + * @return camel case字符串,如果原字符串为null,则返回null + */ + public static String toCamelCase(String str) { + return CAMEL_CASE_TOKENIZER.parse(str); + } + + /** + * 将字符串转换成pascal case。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.toPascalCase(null)  = null
+     * StringUtil.toPascalCase("")    = ""
+     * StringUtil.toPascalCase("aBc") = "ABc"
+     * StringUtil.toPascalCase("aBc def") = "ABcDef"
+     * StringUtil.toPascalCase("aBc def_ghi") = "ABcDefGhi"
+     * StringUtil.toPascalCase("aBc def_ghi 123") = "aBcDefGhi123"
+     * 
+ *

+ * + *

+ * 此方法会保留除了下划线和空白以外的所有分隔符。 + *

+ * + * @param str 要转换的字符串 + * + * @return pascal case字符串,如果原字符串为null,则返回null + */ + public static String toPascalCase(String str) { + return PASCAL_CASE_TOKENIZER.parse(str); + } + + /** + * 将字符串转换成下划线分隔的大写字符串。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.toUpperCaseWithUnderscores(null)  = null
+     * StringUtil.toUpperCaseWithUnderscores("")    = ""
+     * StringUtil.toUpperCaseWithUnderscores("aBc") = "A_BC"
+     * StringUtil.toUpperCaseWithUnderscores("aBc def") = "A_BC_DEF"
+     * StringUtil.toUpperCaseWithUnderscores("aBc def_ghi") = "A_BC_DEF_GHI"
+     * StringUtil.toUpperCaseWithUnderscores("aBc def_ghi 123") = "A_BC_DEF_GHI_123"
+     * StringUtil.toUpperCaseWithUnderscores("__a__Bc__") = "__A__BC__"
+     * 
+ *

+ * + *

+ * 此方法会保留除了空白以外的所有分隔符。 + *

+ * + * @param str 要转换的字符串 + * + * @return 下划线分隔的大写字符串,如果原字符串为null,则返回null + */ + public static String toUpperCaseWithUnderscores(String str) { + return UPPER_CASE_WITH_UNDERSCORES_TOKENIZER.parse(str); + } + + /** + * 将字符串转换成下划线分隔的小写字符串。 + * + *

+ * 如果字符串是null则返回null。 + *

+     * StringUtil.toLowerCaseWithUnderscores(null)  = null
+     * StringUtil.toLowerCaseWithUnderscores("")    = ""
+     * StringUtil.toLowerCaseWithUnderscores("aBc") = "a_bc"
+     * StringUtil.toLowerCaseWithUnderscores("aBc def") = "a_bc_def"
+     * StringUtil.toLowerCaseWithUnderscores("aBc def_ghi") = "a_bc_def_ghi"
+     * StringUtil.toLowerCaseWithUnderscores("aBc def_ghi 123") = "a_bc_def_ghi_123"
+     * StringUtil.toLowerCaseWithUnderscores("__a__Bc__") = "__a__bc__"
+     * 
+ *

+ * + *

+ * 此方法会保留除了空白以外的所有分隔符。 + *

+ * + * @param str 要转换的字符串 + * + * @return 下划线分隔的小写字符串,如果原字符串为null,则返回null + */ + public static String toLowerCaseWithUnderscores(String str) { + return LOWER_CASE_WITH_UNDERSCORES_TOKENIZER.parse(str); + } + + /** 解析单词的解析器。 */ + private static final WordTokenizer CAMEL_CASE_TOKENIZER = new WordTokenizer() { + protected void startSentence(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toLowerCase(ch)); + } + + protected void startWord(StringBuffer buffer, + char ch) { + if (!isDelimiter(buffer + .charAt(buffer + .length() - 1))) { + buffer + .append(Character + .toUpperCase(ch)); + } else { + buffer + .append(Character + .toLowerCase(ch)); + } + } + + protected void inWord(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toLowerCase(ch)); + } + + protected void startDigitSentence(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void startDigitWord(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void inDigitWord(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void inDelimiter(StringBuffer buffer, + char ch) { + if (ch != UNDERSCORE) { + buffer + .append(ch); + } + } + }; + + private static final WordTokenizer PASCAL_CASE_TOKENIZER = new WordTokenizer() { + protected void startSentence(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toUpperCase(ch)); + } + + protected void startWord(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toUpperCase(ch)); + } + + protected void inWord(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toLowerCase(ch)); + } + + protected void startDigitSentence(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void startDigitWord(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void inDigitWord(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void inDelimiter(StringBuffer buffer, + char ch) { + if (ch != UNDERSCORE) { + buffer + .append(ch); + } + } + }; + + private static final WordTokenizer UPPER_CASE_WITH_UNDERSCORES_TOKENIZER = new WordTokenizer() { + protected void startSentence(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toUpperCase(ch)); + } + + protected void startWord(StringBuffer buffer, + char ch) { + if (!isDelimiter(buffer + .charAt(buffer + .length() - 1))) { + buffer + .append(UNDERSCORE); + } + + buffer + .append(Character + .toUpperCase(ch)); + } + + protected void inWord(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toUpperCase(ch)); + } + + protected void startDigitSentence(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void startDigitWord(StringBuffer buffer, + char ch) { + if (!isDelimiter(buffer + .charAt(buffer + .length() - 1))) { + buffer + .append(UNDERSCORE); + } + + buffer + .append(ch); + } + + protected void inDigitWord(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void inDelimiter(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + }; + + private static final WordTokenizer LOWER_CASE_WITH_UNDERSCORES_TOKENIZER = new WordTokenizer() { + protected void startSentence(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toLowerCase(ch)); + } + + protected void startWord(StringBuffer buffer, + char ch) { + if (!isDelimiter(buffer + .charAt(buffer + .length() - 1))) { + buffer + .append(UNDERSCORE); + } + + buffer + .append(Character + .toLowerCase(ch)); + } + + protected void inWord(StringBuffer buffer, + char ch) { + buffer + .append(Character + .toLowerCase(ch)); + } + + protected void startDigitSentence(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void startDigitWord(StringBuffer buffer, + char ch) { + if (!isDelimiter(buffer + .charAt(buffer + .length() - 1))) { + buffer + .append(UNDERSCORE); + } + + buffer + .append(ch); + } + + protected void inDigitWord(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + + protected void inDelimiter(StringBuffer buffer, + char ch) { + buffer + .append(ch); + } + }; + + /** + * 解析出下列语法所构成的SENTENCE。 + *
+     *  SENTENCE = WORD (DELIMITER* WORD)*
+     *
+     *  WORD = UPPER_CASE_WORD | LOWER_CASE_WORD | TITLE_CASE_WORD | DIGIT_WORD
+     *
+     *  UPPER_CASE_WORD = UPPER_CASE_LETTER+
+     *  LOWER_CASE_WORD = LOWER_CASE_LETTER+
+     *  TITLE_CASE_WORD = UPPER_CASE_LETTER LOWER_CASE_LETTER+
+     *  DIGIT_WORD      = DIGIT+
+     *
+     *  UPPER_CASE_LETTER = Character.isUpperCase()
+     *  LOWER_CASE_LETTER = Character.isLowerCase()
+     *  DIGIT             = Character.isDigit()
+     *  NON_LETTER_DIGIT  = !Character.isUpperCase() && !Character.isLowerCase() && !Character.isDigit()
+     *
+     *  DELIMITER = WHITESPACE | NON_LETTER_DIGIT
+     * 
+ */ + private abstract static class WordTokenizer { + protected static final char UNDERSCORE = '_'; + + /** + * Parse sentence。 + */ + public String parse(String str) { + if (StringUtil.isEmpty(str)) { + return str; + } + + int length = str.length(); + StringBuffer buffer = new StringBuffer(length); + + for (int index = 0; index < length; index++) { + char ch = str.charAt(index); + + // 忽略空白。 + if (Character.isWhitespace(ch)) { + continue; + } + + // 大写字母开始:UpperCaseWord或是TitleCaseWord。 + if (Character.isUpperCase(ch)) { + int wordIndex = index + 1; + + while (wordIndex < length) { + char wordChar = str.charAt(wordIndex); + + if (Character.isUpperCase(wordChar)) { + wordIndex++; + } else if (Character.isLowerCase(wordChar)) { + wordIndex--; + break; + } else { + break; + } + } + + // 1. wordIndex == length,说明最后一个字母为大写,以upperCaseWord处理之。 + // 2. wordIndex == index,说明index处为一个titleCaseWord。 + // 3. wordIndex > index,说明index到wordIndex - 1处全部是大写,以upperCaseWord处理。 + if ((wordIndex == length) || (wordIndex > index)) { + index = parseUpperCaseWord(buffer, str, index, wordIndex); + } else { + index = parseTitleCaseWord(buffer, str, index); + } + + continue; + } + + // 小写字母开始:LowerCaseWord。 + if (Character.isLowerCase(ch)) { + index = parseLowerCaseWord(buffer, str, index); + continue; + } + + // 数字开始:DigitWord。 + if (Character.isDigit(ch)) { + index = parseDigitWord(buffer, str, index); + continue; + } + + // 非字母数字开始:Delimiter。 + inDelimiter(buffer, ch); + } + + return buffer.toString(); + } + + private int parseUpperCaseWord(StringBuffer buffer, String str, int index, int length) { + char ch = str.charAt(index++); + + // 首字母,必然存在且为大写。 + if (buffer.length() == 0) { + startSentence(buffer, ch); + } else { + startWord(buffer, ch); + } + + // 后续字母,必为小写。 + for (; index < length; index++) { + ch = str.charAt(index); + inWord(buffer, ch); + } + + return index - 1; + } + + private int parseLowerCaseWord(StringBuffer buffer, String str, int index) { + char ch = str.charAt(index++); + + // 首字母,必然存在且为小写。 + if (buffer.length() == 0) { + startSentence(buffer, ch); + } else { + startWord(buffer, ch); + } + + // 后续字母,必为小写。 + int length = str.length(); + + for (; index < length; index++) { + ch = str.charAt(index); + + if (Character.isLowerCase(ch)) { + inWord(buffer, ch); + } else { + break; + } + } + + return index - 1; + } + + private int parseTitleCaseWord(StringBuffer buffer, String str, int index) { + char ch = str.charAt(index++); + + // 首字母,必然存在且为大写。 + if (buffer.length() == 0) { + startSentence(buffer, ch); + } else { + startWord(buffer, ch); + } + + // 后续字母,必为小写。 + int length = str.length(); + + for (; index < length; index++) { + ch = str.charAt(index); + + if (Character.isLowerCase(ch)) { + inWord(buffer, ch); + } else { + break; + } + } + + return index - 1; + } + + private int parseDigitWord(StringBuffer buffer, String str, int index) { + char ch = str.charAt(index++); + + // 首字符,必然存在且为数字。 + if (buffer.length() == 0) { + startDigitSentence(buffer, ch); + } else { + startDigitWord(buffer, ch); + } + + // 后续字符,必为数字。 + int length = str.length(); + + for (; index < length; index++) { + ch = str.charAt(index); + + if (Character.isDigit(ch)) { + inDigitWord(buffer, ch); + } else { + break; + } + } + + return index - 1; + } + + protected boolean isDelimiter(char ch) { + return !Character.isUpperCase(ch) && !Character.isLowerCase(ch) + && !Character.isDigit(ch); + } + + protected abstract void startSentence(StringBuffer buffer, char ch); + + protected abstract void startWord(StringBuffer buffer, char ch); + + protected abstract void inWord(StringBuffer buffer, char ch); + + protected abstract void startDigitSentence(StringBuffer buffer, char ch); + + protected abstract void startDigitWord(StringBuffer buffer, char ch); + + protected abstract void inDigitWord(StringBuffer buffer, char ch); + + protected abstract void inDelimiter(StringBuffer buffer, char ch); + } + + /* ============================================================================ */ + /* 字符串分割函数。 */ + /* */ + /* 将字符串按指定分隔符分割。 */ + /* ============================================================================ */ + + /** + * 将字符串按空白字符分割。 + * + *

+ * 分隔符不会出现在目标数组中,连续的分隔符就被看作一个。如果字符串为null,则返回null。 + *

+     * StringUtil.split(null)       = null
+     * StringUtil.split("")         = []
+     * StringUtil.split("abc def")  = ["abc", "def"]
+     * StringUtil.split("abc  def") = ["abc", "def"]
+     * StringUtil.split(" abc ")    = ["abc"]
+     * 
+ *

+ * + * @param str 要分割的字符串 + * + * @return 分割后的字符串数组,如果原字符串为null,则返回null + */ + public static String[] split(String str) { + return split(str, null, -1); + } + + /** + * 将字符串按指定字符分割。 + * + *

+ * 分隔符不会出现在目标数组中,连续的分隔符就被看作一个。如果字符串为null,则返回null。 + *

+     * StringUtil.split(null, *)         = null
+     * StringUtil.split("", *)           = []
+     * StringUtil.split("a.b.c", '.')    = ["a", "b", "c"]
+     * StringUtil.split("a..b.c", '.')   = ["a", "b", "c"]
+     * StringUtil.split("a:b:c", '.')    = ["a:b:c"]
+     * StringUtil.split("a b c", ' ')    = ["a", "b", "c"]
+     * 
+ *

+ * + * @param str 要分割的字符串 + * @param separatorChar 分隔符 + * + * @return 分割后的字符串数组,如果原字符串为null,则返回null + */ + public static String[] split(String str, char separatorChar) { + if (str == null) { + return null; + } + + int length = str.length(); + + if (length == 0) { + return ArrayUtil.EMPTY_STRING_ARRAY; + } + + List list = new ArrayList(); + int i = 0; + int start = 0; + boolean match = false; + + while (i < length) { + if (str.charAt(i) == separatorChar) { + if (match) { + list.add(str.substring(start, i)); + match = false; + } + + start = ++i; + continue; + } + + match = true; + i++; + } + + if (match) { + list.add(str.substring(start, i)); + } + + return (String[]) list.toArray(new String[list.size()]); + } + + /** + * 将字符串按指定字符分割。 + * + *

+ * 分隔符不会出现在目标数组中,连续的分隔符就被看作一个。如果字符串为null,则返回null。 + *

+     * StringUtil.split(null, *)                = null
+     * StringUtil.split("", *)                  = []
+     * StringUtil.split("abc def", null)        = ["abc", "def"]
+     * StringUtil.split("abc def", " ")         = ["abc", "def"]
+     * StringUtil.split("abc  def", " ")        = ["abc", "def"]
+     * StringUtil.split(" ab:  cd::ef  ", ":")  = ["ab", "cd", "ef"]
+     * StringUtil.split("abc.def", "")          = ["abc.def"]
+     *  
+ *

+ * + * @param str 要分割的字符串 + * @param separatorChars 分隔符 + * + * @return 分割后的字符串数组,如果原字符串为null,则返回null + */ + public static String[] split(String str, String separatorChars) { + return split(str, separatorChars, -1); + } + + /** + * 将字符串按指定字符分割。 + * + *

+ * 分隔符不会出现在目标数组中,连续的分隔符就被看作一个。如果字符串为null,则返回null。 + *

+     * StringUtil.split(null, *, *)                 = null
+     * StringUtil.split("", *, *)                   = []
+     * StringUtil.split("ab cd ef", null, 0)        = ["ab", "cd", "ef"]
+     * StringUtil.split("  ab   cd ef  ", null, 0)  = ["ab", "cd", "ef"]
+     * StringUtil.split("ab:cd::ef", ":", 0)        = ["ab", "cd", "ef"]
+     * StringUtil.split("ab:cd:ef", ":", 2)         = ["ab", "cdef"]
+     * StringUtil.split("abc.def", "", 2)           = ["abc.def"]
+     * 
+ *

+ * + * @param str 要分割的字符串 + * @param separatorChars 分隔符 + * @param max 返回的数组的最大个数,如果小于等于0,则表示无限制 + * + * @return 分割后的字符串数组,如果原字符串为null,则返回null + */ + public static String[] split(String str, String separatorChars, int max) { + if (str == null) { + return null; + } + + int length = str.length(); + + if (length == 0) { + return ArrayUtil.EMPTY_STRING_ARRAY; + } + + List list = new ArrayList(); + int sizePlus1 = 1; + int i = 0; + int start = 0; + boolean match = false; + + if (separatorChars == null) { + // null表示使用空白作为分隔符 + while (i < length) { + if (Character.isWhitespace(str.charAt(i))) { + if (match) { + if (sizePlus1++ == max) { + i = length; + } + + list.add(str.substring(start, i)); + match = false; + } + + start = ++i; + continue; + } + + match = true; + i++; + } + } else if (separatorChars.length() == 1) { + // 优化分隔符长度为1的情形 + char sep = separatorChars.charAt(0); + + while (i < length) { + if (str.charAt(i) == sep) { + if (match) { + if (sizePlus1++ == max) { + i = length; + } + + list.add(str.substring(start, i)); + match = false; + } + + start = ++i; + continue; + } + + match = true; + i++; + } + } else { + // 一般情形 + while (i < length) { + if (separatorChars.indexOf(str.charAt(i)) >= 0) { + if (match) { + if (sizePlus1++ == max) { + i = length; + } + + list.add(str.substring(start, i)); + match = false; + } + + start = ++i; + continue; + } + + match = true; + i++; + } + } + + if (match) { + list.add(str.substring(start, i)); + } + + return (String[]) list.toArray(new String[list.size()]); + } + + /* ============================================================================ */ + /* 字符串连接函数。 */ + /* */ + /* 将多个对象按指定分隔符连接成字符串。 */ + /* ============================================================================ */ + + /** + * 将数组中的元素连接成一个字符串。 + *
+     * StringUtil.join(null)            = null
+     * StringUtil.join([])              = ""
+     * StringUtil.join([null])          = ""
+     * StringUtil.join(["a", "b", "c"]) = "abc"
+     * StringUtil.join([null, "", "a"]) = "a"
+     * 
+ * + * @param array 要连接的数组 + * + * @return 连接后的字符串,如果原数组为null,则返回null + */ + public static String join(Object[] array) { + return join(array, null); + } + + /** + * 将数组中的元素连接成一个字符串。 + *
+     * StringUtil.join(null, *)               = null
+     * StringUtil.join([], *)                 = ""
+     * StringUtil.join([null], *)             = ""
+     * StringUtil.join(["a", "b", "c"], ';')  = "a;b;c"
+     * StringUtil.join(["a", "b", "c"], null) = "abc"
+     * StringUtil.join([null, "", "a"], ';')  = ";;a"
+     * 
+ * + * @param array 要连接的数组 + * @param separator 分隔符 + * + * @return 连接后的字符串,如果原数组为null,则返回null + */ + public static String join(Object[] array, char separator) { + if (array == null) { + return null; + } + + int arraySize = array.length; + int bufSize = (arraySize == 0) ? 0 : ((((array[0] == null) ? 16 : array[0].toString() + .length()) + 1) * arraySize); + StringBuffer buf = new StringBuffer(bufSize); + + for (int i = 0; i < arraySize; i++) { + if (i > 0) { + buf.append(separator); + } + + if (array[i] != null) { + buf.append(array[i]); + } + } + + return buf.toString(); + } + + /** + * 将数组中的元素连接成一个字符串。 + *
+     * StringUtil.join(null, *)                = null
+     * StringUtil.join([], *)                  = ""
+     * StringUtil.join([null], *)              = ""
+     * StringUtil.join(["a", "b", "c"], "--")  = "a--b--c"
+     * StringUtil.join(["a", "b", "c"], null)  = "abc"
+     * StringUtil.join(["a", "b", "c"], "")    = "abc"
+     * StringUtil.join([null, "", "a"], ',')   = ",,a"
+     * 
+ * + * @param array 要连接的数组 + * @param separator 分隔符 + * + * @return 连接后的字符串,如果原数组为null,则返回null + */ + public static String join(Object[] array, String separator) { + if (array == null) { + return null; + } + + if (separator == null) { + separator = EMPTY_STRING; + } + + int arraySize = array.length; + + // ArraySize == 0: Len = 0 + // ArraySize > 0: Len = NofStrings *(len(firstString) + len(separator)) + // (估计大约所有的字符串都一样长) + int bufSize = (arraySize == 0) ? 0 : (arraySize * (((array[0] == null) ? 16 : array[0] + .toString().length()) + ((separator != null) ? separator.length() : 0))); + + StringBuffer buf = new StringBuffer(bufSize); + + for (int i = 0; i < arraySize; i++) { + if ((separator != null) && (i > 0)) { + buf.append(separator); + } + + if (array[i] != null) { + buf.append(array[i]); + } + } + + return buf.toString(); + } + + /** + * 将Iterator中的元素连接成一个字符串。 + *
+     * StringUtil.join(null, *)                = null
+     * StringUtil.join([], *)                  = ""
+     * StringUtil.join([null], *)              = ""
+     * StringUtil.join(["a", "b", "c"], "--")  = "a--b--c"
+     * StringUtil.join(["a", "b", "c"], null)  = "abc"
+     * StringUtil.join(["a", "b", "c"], "")    = "abc"
+     * StringUtil.join([null, "", "a"], ',')   = ",,a"
+     * 
+ * + * @param iterator 要连接的Iterator + * @param separator 分隔符 + * + * @return 连接后的字符串,如果原数组为null,则返回null + */ + public static String join(Iterator iterator, char separator) { + if (iterator == null) { + return null; + } + + StringBuffer buf = new StringBuffer(256); // Java默认值是16, 可能偏小 + + while (iterator.hasNext()) { + Object obj = iterator.next(); + + if (obj != null) { + buf.append(obj); + } + + if (iterator.hasNext()) { + buf.append(separator); + } + } + + return buf.toString(); + } + + /** + * 将Iterator中的元素连接成一个字符串。 + *
+     * StringUtil.join(null, *)                = null
+     * StringUtil.join([], *)                  = ""
+     * StringUtil.join([null], *)              = ""
+     * StringUtil.join(["a", "b", "c"], "--")  = "a--b--c"
+     * StringUtil.join(["a", "b", "c"], null)  = "abc"
+     * StringUtil.join(["a", "b", "c"], "")    = "abc"
+     * StringUtil.join([null, "", "a"], ',')   = ",,a"
+     * 
+ * + * @param iterator 要连接的Iterator + * @param separator 分隔符 + * + * @return 连接后的字符串,如果原数组为null,则返回null + */ + public static String join(Iterator iterator, String separator) { + if (iterator == null) { + return null; + } + + StringBuffer buf = new StringBuffer(256); // Java默认值是16, 可能偏小 + + while (iterator.hasNext()) { + Object obj = iterator.next(); + + if (obj != null) { + buf.append(obj); + } + + if ((separator != null) && iterator.hasNext()) { + buf.append(separator); + } + } + + return buf.toString(); + } + + /* ============================================================================ */ + /* 字符串查找函数 —— 字符或字符串。 */ + /* */ + /* 在字符串中查找指定字符或字符串。 */ + /* ============================================================================ */ + + /** + * 在字符串中查找指定字符,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.indexOf(null, *)         = -1
+     * StringUtil.indexOf("", *)           = -1
+     * StringUtil.indexOf("aabaabaa", 'a') = 0
+     * StringUtil.indexOf("aabaabaa", 'b') = 2
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChar 要查找的字符 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOf(String str, char searchChar) { + if ((str == null) || (str.length() == 0)) { + return -1; + } + + return str.indexOf(searchChar); + } + + /** + * 在字符串中查找指定字符,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.indexOf(null, *, *)          = -1
+     * StringUtil.indexOf("", *, *)            = -1
+     * StringUtil.indexOf("aabaabaa", 'b', 0)  = 2
+     * StringUtil.indexOf("aabaabaa", 'b', 3)  = 5
+     * StringUtil.indexOf("aabaabaa", 'b', 9)  = -1
+     * StringUtil.indexOf("aabaabaa", 'b', -1) = 2
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChar 要查找的字符 + * @param startPos 开始搜索的索引值,如果小于0,则看作0 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOf(String str, char searchChar, int startPos) { + if ((str == null) || (str.length() == 0)) { + return -1; + } + + return str.indexOf(searchChar, startPos); + } + + /** + * 在字符串中查找指定字符串,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.indexOf(null, *)          = -1
+     * StringUtil.indexOf(*, null)          = -1
+     * StringUtil.indexOf("", "")           = 0
+     * StringUtil.indexOf("aabaabaa", "a")  = 0
+     * StringUtil.indexOf("aabaabaa", "b")  = 2
+     * StringUtil.indexOf("aabaabaa", "ab") = 1
+     * StringUtil.indexOf("aabaabaa", "")   = 0
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStr 要查找的字符串 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOf(String str, String searchStr) { + if ((str == null) || (searchStr == null)) { + return -1; + } + + return str.indexOf(searchStr); + } + + /** + * 在字符串中查找指定字符串,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.indexOf(null, *, *)          = -1
+     * StringUtil.indexOf(*, null, *)          = -1
+     * StringUtil.indexOf("", "", 0)           = 0
+     * StringUtil.indexOf("aabaabaa", "a", 0)  = 0
+     * StringUtil.indexOf("aabaabaa", "b", 0)  = 2
+     * StringUtil.indexOf("aabaabaa", "ab", 0) = 1
+     * StringUtil.indexOf("aabaabaa", "b", 3)  = 5
+     * StringUtil.indexOf("aabaabaa", "b", 9)  = -1
+     * StringUtil.indexOf("aabaabaa", "b", -1) = 2
+     * StringUtil.indexOf("aabaabaa", "", 2)   = 2
+     * StringUtil.indexOf("abc", "", 9)        = 3
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStr 要查找的字符串 + * @param startPos 开始搜索的索引值,如果小于0,则看作0 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOf(String str, String searchStr, int startPos) { + if ((str == null) || (searchStr == null)) { + return -1; + } + + // JDK1.3及以下版本的bug:不能正确处理下面的情况 + if ((searchStr.length() == 0) && (startPos >= str.length())) { + return str.length(); + } + + return str.indexOf(searchStr, startPos); + } + + /** + * 在字符串中查找指定字符集合中的字符,并返回第一个匹配的起始索引。 如果字符串为null,则返回-1。 + * 如果字符集合为null或空,也返回-1。 + *
+     * StringUtil.indexOfAny(null, *)                = -1
+     * StringUtil.indexOfAny("", *)                  = -1
+     * StringUtil.indexOfAny(*, null)                = -1
+     * StringUtil.indexOfAny(*, [])                  = -1
+     * StringUtil.indexOfAny("zzabyycdxx",['z','a']) = 0
+     * StringUtil.indexOfAny("zzabyycdxx",['b','y']) = 3
+     * StringUtil.indexOfAny("aba", ['z'])           = -1
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChars 要搜索的字符集合 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOfAny(String str, char[] searchChars) { + if ((str == null) || (str.length() == 0) || (searchChars == null) + || (searchChars.length == 0)) { + return -1; + } + + for (int i = 0; i < str.length(); i++) { + char ch = str.charAt(i); + + for (int j = 0; j < searchChars.length; j++) { + if (searchChars[j] == ch) { + return i; + } + } + } + + return -1; + } + + /** + * 在字符串中查找指定字符集合中的字符,并返回第一个匹配的起始索引。 如果字符串为null,则返回-1。 + * 如果字符集合为null或空,也返回-1。 + *
+     * StringUtil.indexOfAny(null, *)            = -1
+     * StringUtil.indexOfAny("", *)              = -1
+     * StringUtil.indexOfAny(*, null)            = -1
+     * StringUtil.indexOfAny(*, "")              = -1
+     * StringUtil.indexOfAny("zzabyycdxx", "za") = 0
+     * StringUtil.indexOfAny("zzabyycdxx", "by") = 3
+     * StringUtil.indexOfAny("aba","z")          = -1
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChars 要搜索的字符集合 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOfAny(String str, String searchChars) { + if ((str == null) || (str.length() == 0) || (searchChars == null) + || (searchChars.length() == 0)) { + return -1; + } + + for (int i = 0; i < str.length(); i++) { + char ch = str.charAt(i); + + for (int j = 0; j < searchChars.length(); j++) { + if (searchChars.charAt(j) == ch) { + return i; + } + } + } + + return -1; + } + + /** + * 在字符串中查找指定字符串集合中的字符串,并返回第一个匹配的起始索引。 如果字符串为null,则返回-1。 + * 如果字符串集合为null或空,也返回-1。 + * 如果字符串集合包括"",并且字符串不为null,则返回str.length() + *
+     * StringUtil.indexOfAny(null, *)                     = -1
+     * StringUtil.indexOfAny(*, null)                     = -1
+     * StringUtil.indexOfAny(*, [])                       = -1
+     * StringUtil.indexOfAny("zzabyycdxx", ["ab","cd"])   = 2
+     * StringUtil.indexOfAny("zzabyycdxx", ["cd","ab"])   = 2
+     * StringUtil.indexOfAny("zzabyycdxx", ["mn","op"])   = -1
+     * StringUtil.indexOfAny("zzabyycdxx", ["zab","aby"]) = 1
+     * StringUtil.indexOfAny("zzabyycdxx", [""])          = 0
+     * StringUtil.indexOfAny("", [""])                    = 0
+     * StringUtil.indexOfAny("", ["a"])                   = -1
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStrs 要搜索的字符串集合 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOfAny(String str, String[] searchStrs) { + if ((str == null) || (searchStrs == null)) { + return -1; + } + + int sz = searchStrs.length; + + // String's can't have a MAX_VALUEth index. + int ret = Integer.MAX_VALUE; + + int tmp = 0; + + for (int i = 0; i < sz; i++) { + String search = searchStrs[i]; + + if (search == null) { + continue; + } + + tmp = str.indexOf(search); + + if (tmp == -1) { + continue; + } + + if (tmp < ret) { + ret = tmp; + } + } + + return (ret == Integer.MAX_VALUE) ? (-1) : ret; + } + + /** + * 在字符串中查找不在指定字符集合中的字符,并返回第一个匹配的起始索引。 如果字符串为null,则返回-1。 + * 如果字符集合为null或空,也返回-1。 + *
+     * StringUtil.indexOfAnyBut(null, *)             = -1
+     * StringUtil.indexOfAnyBut("", *)               = -1
+     * StringUtil.indexOfAnyBut(*, null)             = -1
+     * StringUtil.indexOfAnyBut(*, [])               = -1
+     * StringUtil.indexOfAnyBut("zzabyycdxx",'za')   = 3
+     * StringUtil.indexOfAnyBut("zzabyycdxx", 'by')  = 0
+     * StringUtil.indexOfAnyBut("aba", 'ab')         = -1
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChars 要搜索的字符集合 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOfAnyBut(String str, char[] searchChars) { + if ((str == null) || (str.length() == 0) || (searchChars == null) + || (searchChars.length == 0)) { + return -1; + } + + outer: for (int i = 0; i < str.length(); i++) { + char ch = str.charAt(i); + + for (int j = 0; j < searchChars.length; j++) { + if (searchChars[j] == ch) { + continue outer; + } + } + + return i; + } + + return -1; + } + + /** + * 在字符串中查找不在指定字符集合中的字符,并返回第一个匹配的起始索引。 如果字符串为null,则返回-1。 + * 如果字符集合为null或空,也返回-1。 + *
+     * StringUtil.indexOfAnyBut(null, *)            = -1
+     * StringUtil.indexOfAnyBut("", *)              = -1
+     * StringUtil.indexOfAnyBut(*, null)            = -1
+     * StringUtil.indexOfAnyBut(*, "")              = -1
+     * StringUtil.indexOfAnyBut("zzabyycdxx", "za") = 3
+     * StringUtil.indexOfAnyBut("zzabyycdxx", "by") = 0
+     * StringUtil.indexOfAnyBut("aba","ab")         = -1
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChars 要搜索的字符集合 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int indexOfAnyBut(String str, String searchChars) { + if ((str == null) || (str.length() == 0) || (searchChars == null) + || (searchChars.length() == 0)) { + return -1; + } + + for (int i = 0; i < str.length(); i++) { + if (searchChars.indexOf(str.charAt(i)) < 0) { + return i; + } + } + + return -1; + } + + /** + * 从字符串尾部开始查找指定字符,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.lastIndexOf(null, *)         = -1
+     * StringUtil.lastIndexOf("", *)           = -1
+     * StringUtil.lastIndexOf("aabaabaa", 'a') = 7
+     * StringUtil.lastIndexOf("aabaabaa", 'b') = 5
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChar 要查找的字符 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int lastIndexOf(String str, char searchChar) { + if ((str == null) || (str.length() == 0)) { + return -1; + } + + return str.lastIndexOf(searchChar); + } + + /** + * 从字符串尾部开始查找指定字符,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.lastIndexOf(null, *, *)          = -1
+     * StringUtil.lastIndexOf("", *,  *)           = -1
+     * StringUtil.lastIndexOf("aabaabaa", 'b', 8)  = 5
+     * StringUtil.lastIndexOf("aabaabaa", 'b', 4)  = 2
+     * StringUtil.lastIndexOf("aabaabaa", 'b', 0)  = -1
+     * StringUtil.lastIndexOf("aabaabaa", 'b', 9)  = 5
+     * StringUtil.lastIndexOf("aabaabaa", 'b', -1) = -1
+     * StringUtil.lastIndexOf("aabaabaa", 'a', 0)  = 0
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChar 要查找的字符 + * @param startPos 从指定索引开始向前搜索 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int lastIndexOf(String str, char searchChar, int startPos) { + if ((str == null) || (str.length() == 0)) { + return -1; + } + + return str.lastIndexOf(searchChar, startPos); + } + + /** + * 从字符串尾部开始查找指定字符串,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.lastIndexOf(null, *)         = -1
+     * StringUtil.lastIndexOf("", *)           = -1
+     * StringUtil.lastIndexOf("aabaabaa", 'a') = 7
+     * StringUtil.lastIndexOf("aabaabaa", 'b') = 5
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStr 要查找的字符串 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int lastIndexOf(String str, String searchStr) { + if ((str == null) || (searchStr == null)) { + return -1; + } + + return str.lastIndexOf(searchStr); + } + + /** + * 从字符串尾部开始查找指定字符串,并返回第一个匹配的索引值。如果字符串为null或未找到,则返回-1。 + *
+     * StringUtil.lastIndexOf(null, *, *)          = -1
+     * StringUtil.lastIndexOf(*, null, *)          = -1
+     * StringUtil.lastIndexOf("aabaabaa", "a", 8)  = 7
+     * StringUtil.lastIndexOf("aabaabaa", "b", 8)  = 5
+     * StringUtil.lastIndexOf("aabaabaa", "ab", 8) = 4
+     * StringUtil.lastIndexOf("aabaabaa", "b", 9)  = 5
+     * StringUtil.lastIndexOf("aabaabaa", "b", -1) = -1
+     * StringUtil.lastIndexOf("aabaabaa", "a", 0)  = 0
+     * StringUtil.lastIndexOf("aabaabaa", "b", 0)  = -1
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStr 要查找的字符串 + * @param startPos 从指定索引开始向前搜索 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int lastIndexOf(String str, String searchStr, int startPos) { + if ((str == null) || (searchStr == null)) { + return -1; + } + + return str.lastIndexOf(searchStr, startPos); + } + + /** + * 从字符串尾部开始查找指定字符串集合中的字符串,并返回第一个匹配的起始索引。 如果字符串为null,则返回-1。 + * 如果字符串集合为null或空,也返回-1。 + * 如果字符串集合包括"",并且字符串不为null,则返回str.length() + *
+     * StringUtil.lastIndexOfAny(null, *)                   = -1
+     * StringUtil.lastIndexOfAny(*, null)                   = -1
+     * StringUtil.lastIndexOfAny(*, [])                     = -1
+     * StringUtil.lastIndexOfAny(*, [null])                 = -1
+     * StringUtil.lastIndexOfAny("zzabyycdxx", ["ab","cd"]) = 6
+     * StringUtil.lastIndexOfAny("zzabyycdxx", ["cd","ab"]) = 6
+     * StringUtil.lastIndexOfAny("zzabyycdxx", ["mn","op"]) = -1
+     * StringUtil.lastIndexOfAny("zzabyycdxx", ["mn","op"]) = -1
+     * StringUtil.lastIndexOfAny("zzabyycdxx", ["mn",""])   = 10
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStrs 要搜索的字符串集合 + * + * @return 第一个匹配的索引值。如果字符串为null或未找到,则返回-1 + */ + public static int lastIndexOfAny(String str, String[] searchStrs) { + if ((str == null) || (searchStrs == null)) { + return -1; + } + + int searchStrsLength = searchStrs.length; + int index = -1; + int tmp = 0; + + for (int i = 0; i < searchStrsLength; i++) { + String search = searchStrs[i]; + + if (search == null) { + continue; + } + + tmp = str.lastIndexOf(search); + + if (tmp > index) { + index = tmp; + } + } + + return index; + } + + /** + * 检查字符串中是否包含指定的字符。如果字符串为null,将返回false。 + *
+     * StringUtil.contains(null, *)    = false
+     * StringUtil.contains("", *)      = false
+     * StringUtil.contains("abc", 'a') = true
+     * StringUtil.contains("abc", 'z') = false
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchChar 要查找的字符 + * + * @return 如果找到,则返回true + */ + public static boolean contains(String str, char searchChar) { + if ((str == null) || (str.length() == 0)) { + return false; + } + + return str.indexOf(searchChar) >= 0; + } + + /** + * 检查字符串中是否包含指定的字符串。如果字符串为null,将返回false。 + *
+     * StringUtil.contains(null, *)     = false
+     * StringUtil.contains(*, null)     = false
+     * StringUtil.contains("", "")      = true
+     * StringUtil.contains("abc", "")   = true
+     * StringUtil.contains("abc", "a")  = true
+     * StringUtil.contains("abc", "z")  = false
+     * 
+ * + * @param str 要扫描的字符串 + * @param searchStr 要查找的字符串 + * + * @return 如果找到,则返回true + */ + public static boolean contains(String str, String searchStr) { + if ((str == null) || (searchStr == null)) { + return false; + } + + return str.indexOf(searchStr) >= 0; + } + + /** + * 检查字符串是是否只包含指定字符集合中的字符。 + * + *

+ * 如果字符串为null,则返回false。 + * 如果字符集合为null则返回false。 但是空字符串永远返回true. + *

+ *
+     * StringUtil.containsOnly(null, *)       = false
+     * StringUtil.containsOnly(*, null)       = false
+     * StringUtil.containsOnly("", *)         = true
+     * StringUtil.containsOnly("ab", '')      = false
+     * StringUtil.containsOnly("abab", 'abc') = true
+     * StringUtil.containsOnly("ab1", 'abc')  = false
+     * StringUtil.containsOnly("abz", 'abc')  = false
+     * 
+ * + * @param str 要扫描的字符串 + * @param valid 要查找的字符串 + * + * @return 如果找到,则返回true + */ + public static boolean containsOnly(String str, char[] valid) { + if ((valid == null) || (str == null)) { + return false; + } + + if (str.length() == 0) { + return true; + } + + if (valid.length == 0) { + return false; + } + + return indexOfAnyBut(str, valid) == -1; + } + + /** + * 检查字符串是是否只包含指定字符集合中的字符。 + * + *

+ * 如果字符串为null,则返回false。 + * 如果字符集合为null则返回false。 但是空字符串永远返回true. + *

+ *
+     * StringUtil.containsOnly(null, *)       = false
+     * StringUtil.containsOnly(*, null)       = false
+     * StringUtil.containsOnly("", *)         = true
+     * StringUtil.containsOnly("ab", "")      = false
+     * StringUtil.containsOnly("abab", "abc") = true
+     * StringUtil.containsOnly("ab1", "abc")  = false
+     * StringUtil.containsOnly("abz", "abc")  = false
+     * 
+ * + * @param str 要扫描的字符串 + * @param valid 要查找的字符串 + * + * @return 如果找到,则返回true + */ + public static boolean containsOnly(String str, String valid) { + if ((str == null) || (valid == null)) { + return false; + } + + return containsOnly(str, valid.toCharArray()); + } + + /** + * 检查字符串是是否不包含指定字符集合中的字符。 + * + *

+ * 如果字符串为null,则返回false。 如果字符集合为null则返回true。 + * 但是空字符串永远返回true. + *

+ *
+     * StringUtil.containsNone(null, *)       = true
+     * StringUtil.containsNone(*, null)       = true
+     * StringUtil.containsNone("", *)         = true
+     * StringUtil.containsNone("ab", '')      = true
+     * StringUtil.containsNone("abab", 'xyz') = true
+     * StringUtil.containsNone("ab1", 'xyz')  = true
+     * StringUtil.containsNone("abz", 'xyz')  = false
+     * 
+ * + * @param str 要扫描的字符串 + * @param invalid 要查找的字符串 + * + * @return 如果找到,则返回true + */ + public static boolean containsNone(String str, char[] invalid) { + if ((str == null) || (invalid == null)) { + return true; + } + + int strSize = str.length(); + int validSize = invalid.length; + + for (int i = 0; i < strSize; i++) { + char ch = str.charAt(i); + + for (int j = 0; j < validSize; j++) { + if (invalid[j] == ch) { + return false; + } + } + } + + return true; + } + + /** + * 检查字符串是是否不包含指定字符集合中的字符。 + * + *

+ * 如果字符串为null,则返回false。 如果字符集合为null则返回true。 + * 但是空字符串永远返回true. + *

+ *
+     * StringUtil.containsNone(null, *)       = true
+     * StringUtil.containsNone(*, null)       = true
+     * StringUtil.containsNone("", *)         = true
+     * StringUtil.containsNone("ab", "")      = true
+     * StringUtil.containsNone("abab", "xyz") = true
+     * StringUtil.containsNone("ab1", "xyz")  = true
+     * StringUtil.containsNone("abz", "xyz")  = false
+     * 
+ * + * @param str 要扫描的字符串 + * @param invalidChars 要查找的字符串 + * + * @return 如果找到,则返回true + */ + public static boolean containsNone(String str, String invalidChars) { + if ((str == null) || (invalidChars == null)) { + return true; + } + + return containsNone(str, invalidChars.toCharArray()); + } + + /** + * 取得指定子串在字符串中出现的次数。 + * + *

+ * 如果字符串为null或空,则返回0。 + *

+     * StringUtil.countMatches(null, *)       = 0
+     * StringUtil.countMatches("", *)         = 0
+     * StringUtil.countMatches("abba", null)  = 0
+     * StringUtil.countMatches("abba", "")    = 0
+     * StringUtil.countMatches("abba", "a")   = 2
+     * StringUtil.countMatches("abba", "ab")  = 1
+     * StringUtil.countMatches("abba", "xxx") = 0
+     * 
+ *

+ * + * @param str 要扫描的字符串 + * @param subStr 子字符串 + * + * @return 子串在字符串中出现的次数,如果字符串为null或空,则返回0 + */ + public static int countMatches(String str, String subStr) { + if ((str == null) || (str.length() == 0) || (subStr == null) || (subStr.length() == 0)) { + return 0; + } + + int count = 0; + int index = 0; + + while ((index = str.indexOf(subStr, index)) != -1) { + count++; + index += subStr.length(); + } + + return count; + } + + /* ============================================================================ */ + /* 取子串函数。 */ + /* ============================================================================ */ + + /** + * 取指定字符串的子串。 + * + *

+ * 负的索引代表从尾部开始计算。如果字符串为null,则返回null。 + *

+     * StringUtil.substring(null, *)   = null
+     * StringUtil.substring("", *)     = ""
+     * StringUtil.substring("abc", 0)  = "abc"
+     * StringUtil.substring("abc", 2)  = "c"
+     * StringUtil.substring("abc", 4)  = ""
+     * StringUtil.substring("abc", -2) = "bc"
+     * StringUtil.substring("abc", -4) = "abc"
+     * 
+ *

+ * + * @param str 字符串 + * @param start 起始索引,如果为负数,表示从尾部查找 + * + * @return 子串,如果原始串为null,则返回null + */ + public static String substring(String str, int start) { + if (str == null) { + return null; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + + if (start > str.length()) { + return EMPTY_STRING; + } + + return str.substring(start); + } + + /** + * 取指定字符串的子串。 + * + *

+ * 负的索引代表从尾部开始计算。如果字符串为null,则返回null。 + *

+     * StringUtil.substring(null, *, *)    = null
+     * StringUtil.substring("", * ,  *)    = "";
+     * StringUtil.substring("abc", 0, 2)   = "ab"
+     * StringUtil.substring("abc", 2, 0)   = ""
+     * StringUtil.substring("abc", 2, 4)   = "c"
+     * StringUtil.substring("abc", 4, 6)   = ""
+     * StringUtil.substring("abc", 2, 2)   = ""
+     * StringUtil.substring("abc", -2, -1) = "b"
+     * StringUtil.substring("abc", -4, 2)  = "ab"
+     * 
+ *

+ * + * @param str 字符串 + * @param start 起始索引,如果为负数,表示从尾部计算 + * @param end 结束索引(不含),如果为负数,表示从尾部计算 + * + * @return 子串,如果原始串为null,则返回null + */ + public static String substring(String str, int start, int end) { + if (str == null) { + return null; + } + + if (end < 0) { + end = str.length() + end; + } + + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return EMPTY_STRING; + } + + if (start < 0) { + start = 0; + } + + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 取得长度为指定字符数的最左边的子串。 + *
+     * StringUtil.left(null, *)    = null
+     * StringUtil.left(*, -ve)     = ""
+     * StringUtil.left("", *)      = ""
+     * StringUtil.left("abc", 0)   = ""
+     * StringUtil.left("abc", 2)   = "ab"
+     * StringUtil.left("abc", 4)   = "abc"
+     * 
+ * + * @param str 字符串 + * @param len 最左子串的长度 + * + * @return 子串,如果原始字串为null,则返回null + */ + public static String left(String str, int len) { + if (str == null) { + return null; + } + + if (len < 0) { + return EMPTY_STRING; + } + + if (str.length() <= len) { + return str; + } else { + return str.substring(0, len); + } + } + + /** + * 取得长度为指定字符数的最右边的子串。 + *
+     * StringUtil.right(null, *)    = null
+     * StringUtil.right(*, -ve)     = ""
+     * StringUtil.right("", *)      = ""
+     * StringUtil.right("abc", 0)   = ""
+     * StringUtil.right("abc", 2)   = "bc"
+     * StringUtil.right("abc", 4)   = "abc"
+     * 
+ * + * @param str 字符串 + * @param len 最右子串的长度 + * + * @return 子串,如果原始字串为null,则返回null + */ + public static String right(String str, int len) { + if (str == null) { + return null; + } + + if (len < 0) { + return EMPTY_STRING; + } + + if (str.length() <= len) { + return str; + } else { + return str.substring(str.length() - len); + } + } + + /** + * 取得从指定索引开始计算的、长度为指定字符数的子串。 + *
+     * StringUtil.mid(null, *, *)    = null
+     * StringUtil.mid(*, *, -ve)     = ""
+     * StringUtil.mid("", 0, *)      = ""
+     * StringUtil.mid("abc", 0, 2)   = "ab"
+     * StringUtil.mid("abc", 0, 4)   = "abc"
+     * StringUtil.mid("abc", 2, 4)   = "c"
+     * StringUtil.mid("abc", 4, 2)   = ""
+     * StringUtil.mid("abc", -2, 2)  = "ab"
+     * 
+ * + * @param str 字符串 + * @param pos 起始索引,如果为负数,则看作0 + * @param len 子串的长度,如果为负数,则看作长度为0 + * + * @return 子串,如果原始字串为null,则返回null + */ + public static String mid(String str, int pos, int len) { + if (str == null) { + return null; + } + + if ((len < 0) || (pos > str.length())) { + return EMPTY_STRING; + } + + if (pos < 0) { + pos = 0; + } + + if (str.length() <= (pos + len)) { + return str.substring(pos); + } else { + return str.substring(pos, pos + len); + } + } + + /* ============================================================================ */ + /* 搜索并取子串函数。 */ + /* ============================================================================ */ + + /** + * 取得第一个出现的分隔子串之前的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null或未找到该子串,则返回原字符串。 + *

+     * StringUtil.substringBefore(null, *)      = null
+     * StringUtil.substringBefore("", *)        = ""
+     * StringUtil.substringBefore("abc", "a")   = ""
+     * StringUtil.substringBefore("abcba", "b") = "a"
+     * StringUtil.substringBefore("abc", "c")   = "ab"
+     * StringUtil.substringBefore("abc", "d")   = "abc"
+     * StringUtil.substringBefore("abc", "")    = ""
+     * StringUtil.substringBefore("abc", null)  = "abc"
+     * 
+ *

+ * + * @param str 字符串 + * @param separator 要搜索的分隔子串 + * + * @return 子串,如果原始串为null,则返回null + */ + public static String substringBefore(String str, String separator) { + if ((str == null) || (separator == null) || (str.length() == 0)) { + return str; + } + + if (separator.length() == 0) { + return EMPTY_STRING; + } + + int pos = str.indexOf(separator); + + if (pos == -1) { + return str; + } + + return str.substring(0, pos); + } + + /** + * 取得第一个出现的分隔子串之后的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null或未找到该子串,则返回原字符串。 + *

+     * StringUtil.substringAfter(null, *)      = null
+     * StringUtil.substringAfter("", *)        = ""
+     * StringUtil.substringAfter(*, null)      = ""
+     * StringUtil.substringAfter("abc", "a")   = "bc"
+     * StringUtil.substringAfter("abcba", "b") = "cba"
+     * StringUtil.substringAfter("abc", "c")   = ""
+     * StringUtil.substringAfter("abc", "d")   = ""
+     * StringUtil.substringAfter("abc", "")    = "abc"
+     * 
+ *

+ * + * @param str 字符串 + * @param separator 要搜索的分隔子串 + * + * @return 子串,如果原始串为null,则返回null + */ + public static String substringAfter(String str, String separator) { + if ((str == null) || (str.length() == 0)) { + return str; + } + + if (separator == null) { + return EMPTY_STRING; + } + + int pos = str.indexOf(separator); + + if (pos == -1) { + return EMPTY_STRING; + } + + return str.substring(pos + separator.length()); + } + + /** + * 取得最后一个的分隔子串之前的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null或未找到该子串,则返回原字符串。 + *

+     * StringUtil.substringBeforeLast(null, *)      = null
+     * StringUtil.substringBeforeLast("", *)        = ""
+     * StringUtil.substringBeforeLast("abcba", "b") = "abc"
+     * StringUtil.substringBeforeLast("abc", "c")   = "ab"
+     * StringUtil.substringBeforeLast("a", "a")     = ""
+     * StringUtil.substringBeforeLast("a", "z")     = "a"
+     * StringUtil.substringBeforeLast("a", null)    = "a"
+     * StringUtil.substringBeforeLast("a", "")      = "a"
+     * 
+ *

+ * + * @param str 字符串 + * @param separator 要搜索的分隔子串 + * + * @return 子串,如果原始串为null,则返回null + */ + public static String substringBeforeLast(String str, String separator) { + if ((str == null) || (separator == null) || (str.length() == 0) + || (separator.length() == 0)) { + return str; + } + + int pos = str.lastIndexOf(separator); + + if (pos == -1) { + return str; + } + + return str.substring(0, pos); + } + + /** + * 取得最后一个的分隔子串之后的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null或未找到该子串,则返回原字符串。 + *

+     * StringUtil.substringAfterLast(null, *)      = null
+     * StringUtil.substringAfterLast("", *)        = ""
+     * StringUtil.substringAfterLast(*, "")        = ""
+     * StringUtil.substringAfterLast(*, null)      = ""
+     * StringUtil.substringAfterLast("abc", "a")   = "bc"
+     * StringUtil.substringAfterLast("abcba", "b") = "a"
+     * StringUtil.substringAfterLast("abc", "c")   = ""
+     * StringUtil.substringAfterLast("a", "a")     = ""
+     * StringUtil.substringAfterLast("a", "z")     = ""
+     * 
+ *

+ * + * @param str 字符串 + * @param separator 要搜索的分隔子串 + * + * @return 子串,如果原始串为null,则返回null + */ + public static String substringAfterLast(String str, String separator) { + if ((str == null) || (str.length() == 0)) { + return str; + } + + if ((separator == null) || (separator.length() == 0)) { + return EMPTY_STRING; + } + + int pos = str.lastIndexOf(separator); + + if ((pos == -1) || (pos == (str.length() - separator.length()))) { + return EMPTY_STRING; + } + + return str.substring(pos + separator.length()); + } + + /** + * 取得指定分隔符的前两次出现之间的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null,则返回null。 + *

+     * StringUtil.substringBetween(null, *)            = null
+     * StringUtil.substringBetween("", "")             = ""
+     * StringUtil.substringBetween("", "tag")          = null
+     * StringUtil.substringBetween("tagabctag", null)  = null
+     * StringUtil.substringBetween("tagabctag", "")    = ""
+     * StringUtil.substringBetween("tagabctag", "tag") = "abc"
+     * 
+ *

+ * + * @param str 字符串 + * @param tag 要搜索的分隔子串 + * + * @return 子串,如果原始串为null或未找到分隔子串,则返回null + */ + public static String substringBetween(String str, String tag) { + return substringBetween(str, tag, tag, 0); + } + + /** + * 取得两个分隔符之间的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null,则返回null。 + *

+     * StringUtil.substringBetween(null, *, *)          = null
+     * StringUtil.substringBetween("", "", "")          = ""
+     * StringUtil.substringBetween("", "", "tag")       = null
+     * StringUtil.substringBetween("", "tag", "tag")    = null
+     * StringUtil.substringBetween("yabcz", null, null) = null
+     * StringUtil.substringBetween("yabcz", "", "")     = ""
+     * StringUtil.substringBetween("yabcz", "y", "z")   = "abc"
+     * StringUtil.substringBetween("yabczyabcz", "y", "z")   = "abc"
+     * 
+ *

+ * + * @param str 字符串 + * @param open 要搜索的分隔子串1 + * @param close 要搜索的分隔子串2 + * + * @return 子串,如果原始串为null或未找到分隔子串,则返回null + */ + public static String substringBetween(String str, String open, String close) { + return substringBetween(str, open, close, 0); + } + + /** + * 取得两个分隔符之间的子串。 + * + *

+ * 如果字符串为null,则返回null。 如果分隔子串为null,则返回null。 + *

+     * StringUtil.substringBetween(null, *, *)          = null
+     * StringUtil.substringBetween("", "", "")          = ""
+     * StringUtil.substringBetween("", "", "tag")       = null
+     * StringUtil.substringBetween("", "tag", "tag")    = null
+     * StringUtil.substringBetween("yabcz", null, null) = null
+     * StringUtil.substringBetween("yabcz", "", "")     = ""
+     * StringUtil.substringBetween("yabcz", "y", "z")   = "abc"
+     * StringUtil.substringBetween("yabczyabcz", "y", "z")   = "abc"
+     * 
+ *

+ * + * @param str 字符串 + * @param open 要搜索的分隔子串1 + * @param close 要搜索的分隔子串2 + * @param fromIndex 从指定index处搜索 + * + * @return 子串,如果原始串为null或未找到分隔子串,则返回null + */ + public static String substringBetween(String str, String open, String close, int fromIndex) { + if ((str == null) || (open == null) || (close == null)) { + return null; + } + + int start = str.indexOf(open, fromIndex); + + if (start != -1) { + int end = str.indexOf(close, start + open.length()); + + if (end != -1) { + return str.substring(start + open.length(), end); + } + } + + return null; + } + + /* ============================================================================ */ + /* 删除字符。 */ + /* ============================================================================ */ + + /** + * 删除所有在Character.isWhitespace(char)中所定义的空白。 + *
+     * StringUtil.deleteWhitespace(null)         = null
+     * StringUtil.deleteWhitespace("")           = ""
+     * StringUtil.deleteWhitespace("abc")        = "abc"
+     * StringUtil.deleteWhitespace("   ab  c  ") = "abc"
+     * 
+ * + * @param str 要处理的字符串 + * + * @return 去空白后的字符串,如果原始字符串为null,则返回null + */ + public static String deleteWhitespace(String str) { + if (str == null) { + return null; + } + + int sz = str.length(); + StringBuffer buffer = new StringBuffer(sz); + + for (int i = 0; i < sz; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + buffer.append(str.charAt(i)); + } + } + + return buffer.toString(); + } + + /* ============================================================================ */ + /* 替换子串。 */ + /* ============================================================================ */ + + /** + * 替换指定的子串,只替换第一个出现的子串。 + * + *

+ * 如果字符串为null则返回null,如果指定子串为null,则返回原字符串。 + *

+     * StringUtil.replaceOnce(null, *, *)        = null
+     * StringUtil.replaceOnce("", *, *)          = ""
+     * StringUtil.replaceOnce("aba", null, null) = "aba"
+     * StringUtil.replaceOnce("aba", null, null) = "aba"
+     * StringUtil.replaceOnce("aba", "a", null)  = "aba"
+     * StringUtil.replaceOnce("aba", "a", "")    = "ba"
+     * StringUtil.replaceOnce("aba", "a", "z")   = "zba"
+     * 
+ *

+ * + * @param text 要扫描的字符串 + * @param repl 要搜索的子串 + * @param with 替换字符串 + * + * @return 被替换后的字符串,如果原始字符串为null,则返回null + */ + public static String replaceOnce(String text, String repl, String with) { + return replace(text, repl, with, 1); + } + + /** + * 替换指定的子串,替换所有出现的子串。 + * + *

+ * 如果字符串为null则返回null,如果指定子串为null,则返回原字符串。 + *

+     * StringUtil.replace(null, *, *)        = null
+     * StringUtil.replace("", *, *)          = ""
+     * StringUtil.replace("aba", null, null) = "aba"
+     * StringUtil.replace("aba", null, null) = "aba"
+     * StringUtil.replace("aba", "a", null)  = "aba"
+     * StringUtil.replace("aba", "a", "")    = "b"
+     * StringUtil.replace("aba", "a", "z")   = "zbz"
+     * 
+ *

+ * + * @param text 要扫描的字符串 + * @param repl 要搜索的子串 + * @param with 替换字符串 + * + * @return 被替换后的字符串,如果原始字符串为null,则返回null + */ + public static String replace(String text, String repl, String with) { + return replace(text, repl, with, -1); + } + + /** + * 替换指定的子串,替换指定的次数。 + * + *

+ * 如果字符串为null则返回null,如果指定子串为null,则返回原字符串。 + *

+     * StringUtil.replace(null, *, *, *)         = null
+     * StringUtil.replace("", *, *, *)           = ""
+     * StringUtil.replace("abaa", null, null, 1) = "abaa"
+     * StringUtil.replace("abaa", null, null, 1) = "abaa"
+     * StringUtil.replace("abaa", "a", null, 1)  = "abaa"
+     * StringUtil.replace("abaa", "a", "", 1)    = "baa"
+     * StringUtil.replace("abaa", "a", "z", 0)   = "abaa"
+     * StringUtil.replace("abaa", "a", "z", 1)   = "zbaa"
+     * StringUtil.replace("abaa", "a", "z", 2)   = "zbza"
+     * StringUtil.replace("abaa", "a", "z", -1)  = "zbzz"
+     * 
+ *

+ * + * @param text 要扫描的字符串 + * @param repl 要搜索的子串 + * @param with 替换字符串 + * @param max maximum number of values to replace, or -1 if no maximum + * + * @return 被替换后的字符串,如果原始字符串为null,则返回null + */ + public static String replace(String text, String repl, String with, int max) { + if ((text == null) || (repl == null) || (with == null) || (repl.length() == 0) + || (max == 0)) { + return text; + } + + StringBuffer buf = new StringBuffer(text.length()); + int start = 0; + int end = 0; + + while ((end = text.indexOf(repl, start)) != -1) { + buf.append(text.substring(start, end)).append(with); + start = end + repl.length(); + + if (--max == 0) { + break; + } + } + + buf.append(text.substring(start)); + return buf.toString(); + } + + /** + * 将字符串中所有指定的字符,替换成另一个。 + * + *

+ * 如果字符串为null则返回null。 + *

+     * StringUtil.replaceChars(null, *, *)        = null
+     * StringUtil.replaceChars("", *, *)          = ""
+     * StringUtil.replaceChars("abcba", 'b', 'y') = "aycya"
+     * StringUtil.replaceChars("abcba", 'z', 'y') = "abcba"
+     * 
+ *

+ * + * @param str 要扫描的字符串 + * @param searchChar 要搜索的字符 + * @param replaceChar 替换字符 + * + * @return 被替换后的字符串,如果原始字符串为null,则返回null + */ + public static String replaceChars(String str, char searchChar, char replaceChar) { + if (str == null) { + return null; + } + + return str.replace(searchChar, replaceChar); + } + + /** + * 将字符串中所有指定的字符,替换成另一个。 + * + *

+ * 如果字符串为null则返回null。如果搜索字符串为null或空,则返回原字符串。 + *

+ * + *

+ * 例如: replaceChars("hello", "ho", "jy") = jelly。 + *

+ * + *

+ * 通常搜索字符串和替换字符串是等长的,如果搜索字符串比替换字符串长,则多余的字符将被删除。 如果搜索字符串比替换字符串短,则缺少的字符将被忽略。 + *

+     * StringUtil.replaceChars(null, *, *)           = null
+     * StringUtil.replaceChars("", *, *)             = ""
+     * StringUtil.replaceChars("abc", null, *)       = "abc"
+     * StringUtil.replaceChars("abc", "", *)         = "abc"
+     * StringUtil.replaceChars("abc", "b", null)     = "ac"
+     * StringUtil.replaceChars("abc", "b", "")       = "ac"
+     * StringUtil.replaceChars("abcba", "bc", "yz")  = "ayzya"
+     * StringUtil.replaceChars("abcba", "bc", "y")   = "ayya"
+     * StringUtil.replaceChars("abcba", "bc", "yzx") = "ayzya"
+     * 
+ *

+ * + * @param str 要扫描的字符串 + * @param searchChars 要搜索的字符串 + * @param replaceChars 替换字符串 + * + * @return 被替换后的字符串,如果原始字符串为null,则返回null + */ + public static String replaceChars(String str, String searchChars, String replaceChars) { + if ((str == null) || (str.length() == 0) || (searchChars == null) + || (searchChars.length() == 0)) { + return str; + } + + char[] chars = str.toCharArray(); + int len = chars.length; + boolean modified = false; + + for (int i = 0, isize = searchChars.length(); i < isize; i++) { + char searchChar = searchChars.charAt(i); + + if ((replaceChars == null) || (i >= replaceChars.length())) { + // 删除 + int pos = 0; + + for (int j = 0; j < len; j++) { + if (chars[j] != searchChar) { + chars[pos++] = chars[j]; + } else { + modified = true; + } + } + + len = pos; + } else { + // 替换 + for (int j = 0; j < len; j++) { + if (chars[j] == searchChar) { + chars[j] = replaceChars.charAt(i); + modified = true; + } + } + } + } + + if (!modified) { + return str; + } + + return new String(chars, 0, len); + } + + /** + * 将指定的子串用另一指定子串覆盖。 + * + *

+ * 如果字符串为null,则返回null。 负的索引值将被看作0,越界的索引值将被设置成字符串的长度相同的值。 + *

+     * StringUtil.overlay(null, *, *, *)            = null
+     * StringUtil.overlay("", "abc", 0, 0)          = "abc"
+     * StringUtil.overlay("abcdef", null, 2, 4)     = "abef"
+     * StringUtil.overlay("abcdef", "", 2, 4)       = "abef"
+     * StringUtil.overlay("abcdef", "", 4, 2)       = "abef"
+     * StringUtil.overlay("abcdef", "zzzz", 2, 4)   = "abzzzzef"
+     * StringUtil.overlay("abcdef", "zzzz", 4, 2)   = "abzzzzef"
+     * StringUtil.overlay("abcdef", "zzzz", -1, 4)  = "zzzzef"
+     * StringUtil.overlay("abcdef", "zzzz", 2, 8)   = "abzzzz"
+     * StringUtil.overlay("abcdef", "zzzz", -2, -3) = "zzzzabcdef"
+     * StringUtil.overlay("abcdef", "zzzz", 8, 10)  = "abcdefzzzz"
+     * 
+ *

+ * + * @param str 要扫描的字符串 + * @param overlay 用来覆盖的字符串 + * @param start 起始索引 + * @param end 结束索引 + * + * @return 被覆盖后的字符串,如果原始字符串为null,则返回null + */ + public static String overlay(String str, String overlay, int start, int end) { + if (str == null) { + return null; + } + + if (overlay == null) { + overlay = EMPTY_STRING; + } + + int len = str.length(); + + if (start < 0) { + start = 0; + } + + if (start > len) { + start = len; + } + + if (end < 0) { + end = 0; + } + + if (end > len) { + end = len; + } + + if (start > end) { + int temp = start; + + start = end; + end = temp; + } + + return new StringBuffer((len + start) - end + overlay.length() + 1) + .append(str.substring(0, start)).append(overlay).append(str.substring(end)).toString(); + } + + /* ============================================================================ */ + /* Perl风格的chomp和chop函数。 */ + /* ============================================================================ */ + + /** + * 删除字符串末尾的换行符。如果字符串不以换行结尾,则什么也不做。 + * + *

+ * 换行符有三种情形:"\n"、"\r"、"\r\n"。 + *

+     * StringUtil.chomp(null)          = null
+     * StringUtil.chomp("")            = ""
+     * StringUtil.chomp("abc \r")      = "abc "
+     * StringUtil.chomp("abc\n")       = "abc"
+     * StringUtil.chomp("abc\r\n")     = "abc"
+     * StringUtil.chomp("abc\r\n\r\n") = "abc\r\n"
+     * StringUtil.chomp("abc\n\r")     = "abc\n"
+     * StringUtil.chomp("abc\n\rabc")  = "abc\n\rabc"
+     * StringUtil.chomp("\r")          = ""
+     * StringUtil.chomp("\n")          = ""
+     * StringUtil.chomp("\r\n")        = ""
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 不以换行结尾的字符串,如果原始字串为null,则返回null + */ + public static String chomp(String str) { + if ((str == null) || (str.length() == 0)) { + return str; + } + + if (str.length() == 1) { + char ch = str.charAt(0); + + if ((ch == '\r') || (ch == '\n')) { + return EMPTY_STRING; + } else { + return str; + } + } + + int lastIdx = str.length() - 1; + char last = str.charAt(lastIdx); + + if (last == '\n') { + if (str.charAt(lastIdx - 1) == '\r') { + lastIdx--; + } + } else if (last == '\r') { + } else { + lastIdx++; + } + + return str.substring(0, lastIdx); + } + + /** + * 删除字符串末尾的指定字符串。如果字符串不以该字符串结尾,则什么也不做。 + *
+     * StringUtil.chomp(null, *)         = null
+     * StringUtil.chomp("", *)           = ""
+     * StringUtil.chomp("foobar", "bar") = "foo"
+     * StringUtil.chomp("foobar", "baz") = "foobar"
+     * StringUtil.chomp("foo", "foo")    = ""
+     * StringUtil.chomp("foo ", "foo")   = "foo "
+     * StringUtil.chomp(" foo", "foo")   = " "
+     * StringUtil.chomp("foo", "foooo")  = "foo"
+     * StringUtil.chomp("foo", "")       = "foo"
+     * StringUtil.chomp("foo", null)     = "foo"
+     * 
+ * + * @param str 要处理的字符串 + * @param separator 要删除的字符串 + * + * @return 不以指定字符串结尾的字符串,如果原始字串为null,则返回null + */ + public static String chomp(String str, String separator) { + if ((str == null) || (str.length() == 0) || (separator == null)) { + return str; + } + + if (str.endsWith(separator)) { + return str.substring(0, str.length() - separator.length()); + } + + return str; + } + + /** + * 删除最后一个字符。 + * + *

+ * 如果字符串以\r\n结尾,则同时删除它们。 + *

+     * StringUtil.chop(null)          = null
+     * StringUtil.chop("")            = ""
+     * StringUtil.chop("abc \r")      = "abc "
+     * StringUtil.chop("abc\n")       = "abc"
+     * StringUtil.chop("abc\r\n")     = "abc"
+     * StringUtil.chop("abc")         = "ab"
+     * StringUtil.chop("abc\nabc")    = "abc\nab"
+     * StringUtil.chop("a")           = ""
+     * StringUtil.chop("\r")          = ""
+     * StringUtil.chop("\n")          = ""
+     * StringUtil.chop("\r\n")        = ""
+     * 
+ *

+ * + * @param str 要处理的字符串 + * + * @return 删除最后一个字符的字符串,如果原始字符串为null,则返回null + */ + public static String chop(String str) { + if (str == null) { + return null; + } + + int strLen = str.length(); + + if (strLen < 2) { + return EMPTY_STRING; + } + + int lastIdx = strLen - 1; + String ret = str.substring(0, lastIdx); + char last = str.charAt(lastIdx); + + if (last == '\n') { + if (ret.charAt(lastIdx - 1) == '\r') { + return ret.substring(0, lastIdx - 1); + } + } + + return ret; + } + + /* ============================================================================ */ + /* 重复/对齐字符串。 */ + /* ============================================================================ */ + + /** + * 将指定字符串重复n遍。 + *
+     * StringUtil.repeat(null, 2)   = null
+     * StringUtil.repeat("", 0)     = ""
+     * StringUtil.repeat("", 2)     = ""
+     * StringUtil.repeat("a", 3)    = "aaa"
+     * StringUtil.repeat("ab", 2)   = "abab"
+     * StringUtil.repeat("abcd", 2) = "abcdabcd"
+     * StringUtil.repeat("a", -2)   = ""
+     * 
+ * + * @param str 要重复的字符串 + * @param repeat 重复次数,如果小于0,则看作0 + * + * @return 重复n次的字符串,如果原始字符串为null,则返回null + */ + public static String repeat(String str, int repeat) { + if (str == null) { + return null; + } + + if (repeat <= 0) { + return EMPTY_STRING; + } + + int inputLength = str.length(); + + if ((repeat == 1) || (inputLength == 0)) { + return str; + } + + int outputLength = inputLength * repeat; + + switch (inputLength) { + case 1: + + char ch = str.charAt(0); + char[] output1 = new char[outputLength]; + + for (int i = repeat - 1; i >= 0; i--) { + output1[i] = ch; + } + + return new String(output1); + + case 2: + + char ch0 = str.charAt(0); + char ch1 = str.charAt(1); + char[] output2 = new char[outputLength]; + + for (int i = (repeat * 2) - 2; i >= 0; i--, i--) { + output2[i] = ch0; + output2[i + 1] = ch1; + } + + return new String(output2); + + default: + + StringBuffer buf = new StringBuffer(outputLength); + + for (int i = 0; i < repeat; i++) { + buf.append(str); + } + + return buf.toString(); + } + } + + /** + * 扩展并左对齐字符串,用空格' '填充右边。 + *
+     * StringUtil.alignLeft(null, *)   = null
+     * StringUtil.alignLeft("", 3)     = "   "
+     * StringUtil.alignLeft("bat", 3)  = "bat"
+     * StringUtil.alignLeft("bat", 5)  = "bat  "
+     * StringUtil.alignLeft("bat", 1)  = "bat"
+     * StringUtil.alignLeft("bat", -1) = "bat"
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String alignLeft(String str, int size) { + return alignLeft(str, size, ' '); + } + + /** + * 扩展并左对齐字符串,用指定字符填充右边。 + *
+     * StringUtil.alignLeft(null, *, *)     = null
+     * StringUtil.alignLeft("", 3, 'z')     = "zzz"
+     * StringUtil.alignLeft("bat", 3, 'z')  = "bat"
+     * StringUtil.alignLeft("bat", 5, 'z')  = "batzz"
+     * StringUtil.alignLeft("bat", 1, 'z')  = "bat"
+     * StringUtil.alignLeft("bat", -1, 'z') = "bat"
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * @param padChar 填充字符 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String alignLeft(String str, int size, char padChar) { + if (str == null) { + return null; + } + + int pads = size - str.length(); + + if (pads <= 0) { + return str; + } + + return alignLeft(str, size, String.valueOf(padChar)); + } + + /** + * 扩展并左对齐字符串,用指定字符串填充右边。 + *
+     * StringUtil.alignLeft(null, *, *)      = null
+     * StringUtil.alignLeft("", 3, "z")      = "zzz"
+     * StringUtil.alignLeft("bat", 3, "yz")  = "bat"
+     * StringUtil.alignLeft("bat", 5, "yz")  = "batyz"
+     * StringUtil.alignLeft("bat", 8, "yz")  = "batyzyzy"
+     * StringUtil.alignLeft("bat", 1, "yz")  = "bat"
+     * StringUtil.alignLeft("bat", -1, "yz") = "bat"
+     * StringUtil.alignLeft("bat", 5, null)  = "bat  "
+     * StringUtil.alignLeft("bat", 5, "")    = "bat  "
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * @param padStr 填充字符串 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String alignLeft(String str, int size, String padStr) { + if (str == null) { + return null; + } + + if ((padStr == null) || (padStr.length() == 0)) { + padStr = " "; + } + + int padLen = padStr.length(); + int strLen = str.length(); + int pads = size - strLen; + + if (pads <= 0) { + return str; + } + + if (pads == padLen) { + return str.concat(padStr); + } else if (pads < padLen) { + return str.concat(padStr.substring(0, pads)); + } else { + char[] padding = new char[pads]; + char[] padChars = padStr.toCharArray(); + + for (int i = 0; i < pads; i++) { + padding[i] = padChars[i % padLen]; + } + + return str.concat(new String(padding)); + } + } + + /** + * 扩展并右对齐字符串,用空格' '填充左边。 + *
+     * StringUtil.alignRight(null, *)   = null
+     * StringUtil.alignRight("", 3)     = "   "
+     * StringUtil.alignRight("bat", 3)  = "bat"
+     * StringUtil.alignRight("bat", 5)  = "  bat"
+     * StringUtil.alignRight("bat", 1)  = "bat"
+     * StringUtil.alignRight("bat", -1) = "bat"
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String alignRight(String str, int size) { + return alignRight(str, size, ' '); + } + + /** + * 扩展并右对齐字符串,用指定字符填充左边。 + *
+     * StringUtil.alignRight(null, *, *)     = null
+     * StringUtil.alignRight("", 3, 'z')     = "zzz"
+     * StringUtil.alignRight("bat", 3, 'z')  = "bat"
+     * StringUtil.alignRight("bat", 5, 'z')  = "zzbat"
+     * StringUtil.alignRight("bat", 1, 'z')  = "bat"
+     * StringUtil.alignRight("bat", -1, 'z') = "bat"
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * @param padChar 填充字符 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String alignRight(String str, int size, char padChar) { + if (str == null) { + return null; + } + + int pads = size - str.length(); + + if (pads <= 0) { + return str; + } + + return alignRight(str, size, String.valueOf(padChar)); + } + + /** + * 扩展并右对齐字符串,用指定字符串填充左边。 + *
+     * StringUtil.alignRight(null, *, *)      = null
+     * StringUtil.alignRight("", 3, "z")      = "zzz"
+     * StringUtil.alignRight("bat", 3, "yz")  = "bat"
+     * StringUtil.alignRight("bat", 5, "yz")  = "yzbat"
+     * StringUtil.alignRight("bat", 8, "yz")  = "yzyzybat"
+     * StringUtil.alignRight("bat", 1, "yz")  = "bat"
+     * StringUtil.alignRight("bat", -1, "yz") = "bat"
+     * StringUtil.alignRight("bat", 5, null)  = "  bat"
+     * StringUtil.alignRight("bat", 5, "")    = "  bat"
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * @param padStr 填充字符串 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String alignRight(String str, int size, String padStr) { + if (str == null) { + return null; + } + + if ((padStr == null) || (padStr.length() == 0)) { + padStr = " "; + } + + int padLen = padStr.length(); + int strLen = str.length(); + int pads = size - strLen; + + if (pads <= 0) { + return str; + } + + if (pads == padLen) { + return padStr.concat(str); + } else if (pads < padLen) { + return padStr.substring(0, pads).concat(str); + } else { + char[] padding = new char[pads]; + char[] padChars = padStr.toCharArray(); + + for (int i = 0; i < pads; i++) { + padding[i] = padChars[i % padLen]; + } + + return new String(padding).concat(str); + } + } + + /** + * 扩展并居中字符串,用空格' '填充两边。 + *
+     * StringUtil.center(null, *)   = null
+     * StringUtil.center("", 4)     = "    "
+     * StringUtil.center("ab", -1)  = "ab"
+     * StringUtil.center("ab", 4)   = " ab "
+     * StringUtil.center("abcd", 2) = "abcd"
+     * StringUtil.center("a", 4)    = " a  "
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String center(String str, int size) { + return center(str, size, ' '); + } + + /** + * 扩展并居中字符串,用指定字符填充两边。 + *
+     * StringUtil.center(null, *, *)     = null
+     * StringUtil.center("", 4, ' ')     = "    "
+     * StringUtil.center("ab", -1, ' ')  = "ab"
+     * StringUtil.center("ab", 4, ' ')   = " ab "
+     * StringUtil.center("abcd", 2, ' ') = "abcd"
+     * StringUtil.center("a", 4, ' ')    = " a  "
+     * StringUtil.center("a", 4, 'y')    = "yayy"
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * @param padChar 填充字符 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String center(String str, int size, char padChar) { + if ((str == null) || (size <= 0)) { + return str; + } + + int strLen = str.length(); + int pads = size - strLen; + + if (pads <= 0) { + return str; + } + + str = alignRight(str, strLen + (pads / 2), padChar); + str = alignLeft(str, size, padChar); + return str; + } + + /** + * 扩展并居中字符串,用指定字符串填充两边。 + *
+     * StringUtil.center(null, *, *)     = null
+     * StringUtil.center("", 4, " ")     = "    "
+     * StringUtil.center("ab", -1, " ")  = "ab"
+     * StringUtil.center("ab", 4, " ")   = " ab "
+     * StringUtil.center("abcd", 2, " ") = "abcd"
+     * StringUtil.center("a", 4, " ")    = " a  "
+     * StringUtil.center("a", 4, "yz")   = "yayz"
+     * StringUtil.center("abc", 7, null) = "  abc  "
+     * StringUtil.center("abc", 7, "")   = "  abc  "
+     * 
+ * + * @param str 要对齐的字符串 + * @param size 扩展字符串到指定宽度 + * @param padStr 填充字符串 + * + * @return 扩展后的字符串,如果字符串为null,则返回null + */ + public static String center(String str, int size, String padStr) { + if ((str == null) || (size <= 0)) { + return str; + } + + if ((padStr == null) || (padStr.length() == 0)) { + padStr = " "; + } + + int strLen = str.length(); + int pads = size - strLen; + + if (pads <= 0) { + return str; + } + + str = alignRight(str, strLen + (pads / 2), padStr); + str = alignLeft(str, size, padStr); + return str; + } + + /* ============================================================================ */ + /* 反转字符串。 */ + /* ============================================================================ */ + + /** + * 反转字符串中的字符顺序。 + * + *

+ * 如果字符串为null,则返回null。 + *

+ *
+     * StringUtil.reverse(null)  = null
+     * StringUtil.reverse("")    = ""
+     * StringUtil.reverse("bat") = "tab"
+     * 
+ * + * @param str 要反转的字符串 + * + * @return 反转后的字符串,如果原字符串为null,则返回null + */ + public static String reverse(String str) { + if ((str == null) || (str.length() == 0)) { + return str; + } + + return new StringBuffer(str).reverse().toString(); + } + + /** + * 反转指定分隔符分隔的各子串的顺序。 + * + *

+ * 如果字符串为null,则返回null。 + *

+ *
+     * StringUtil.reverseDelimited(null, *, *)          = null
+     * StringUtil.reverseDelimited("", *, *)            = ""
+     * StringUtil.reverseDelimited("a.b.c", null, null) = "a.b.c"
+     * StringUtil.reverseDelimited("a.b.c", "", null)   = "a.b.c"
+     * StringUtil.reverseDelimited("a.b.c", ".", ",")   = "c,b,a"
+     * StringUtil.reverseDelimited("a.b.c", ".", null)  = "c b a"
+     * 
+ * + * @param str 要反转的字符串 + * @param separatorChars 分隔符,如果为null,则默认使用空白字符 + * @param separator 用来连接子串的分隔符,如果为null,默认使用空格 + * + * @return 反转后的字符串,如果原字符串为null,则返回null + */ + public static String reverseDelimited(String str, String separatorChars, String separator) { + if (str == null) { + return null; + } + + String[] strs = split(str, separatorChars); + + ArrayUtil.reverse(strs); + + if (separator == null) { + return join(strs, ' '); + } + + return join(strs, separator); + } + + /* ============================================================================ */ + /* 取得字符串的缩略。 */ + /* ============================================================================ */ + + /** + * 将字符串转换成指定长度的缩略,例如: 将"Now is the time for all good men"转换成"Now is the time for..."。 + * + *
    + *
  • + * 如果strmaxWidth短,直接返回; + *
  • + *
  • + * 否则将它转换成缩略:substring(str, 0, max-3) + "..."; + *
  • + *
  • + * 如果maxWidth小于4抛出IllegalArgumentException; + *
  • + *
  • + * 返回的字符串不可能长于指定的maxWidth。 + *
  • + *
+ * + *
+     * StringUtil.abbreviate(null, *)      = null
+     * StringUtil.abbreviate("", 4)        = ""
+     * StringUtil.abbreviate("abcdefg", 6) = "abc..."
+     * StringUtil.abbreviate("abcdefg", 7) = "abcdefg"
+     * StringUtil.abbreviate("abcdefg", 8) = "abcdefg"
+     * StringUtil.abbreviate("abcdefg", 4) = "a..."
+     * StringUtil.abbreviate("abcdefg", 3) = IllegalArgumentException
+     * 
+ * + * @param str 要检查的字符串 + * @param maxWidth 最大长度,不小于4,如果小于4,则看作4 + * + * @return 字符串缩略,如果原始字符串为null则返回null + */ + public static String abbreviate(String str, int maxWidth) { + return abbreviate(str, 0, maxWidth); + } + + /** + * 将字符串转换成指定长度的缩略,例如: 将"Now is the time for all good men"转换成"...is the time for..."。 + * + *

+ * 和abbreviate(String, int)类似,但是增加了一个“左边界”偏移量。 + * 注意,“左边界”处的字符未必出现在结果字符串的最左边,但一定出现在结果字符串中。 + *

+ * + *

+ * 返回的字符串不可能长于指定的maxWidth。 + *

+     * StringUtil.abbreviate(null, *, *)                = null
+     * StringUtil.abbreviate("", 0, 4)                  = ""
+     * StringUtil.abbreviate("abcdefghijklmno", -1, 10) = "abcdefg..."
+     * StringUtil.abbreviate("abcdefghijklmno", 0, 10)  = "abcdefg..."
+     * StringUtil.abbreviate("abcdefghijklmno", 1, 10)  = "abcdefg..."
+     * StringUtil.abbreviate("abcdefghijklmno", 4, 10)  = "abcdefg..."
+     * StringUtil.abbreviate("abcdefghijklmno", 5, 10)  = "...fghi..."
+     * StringUtil.abbreviate("abcdefghijklmno", 6, 10)  = "...ghij..."
+     * StringUtil.abbreviate("abcdefghijklmno", 8, 10)  = "...ijklmno"
+     * StringUtil.abbreviate("abcdefghijklmno", 10, 10) = "...ijklmno"
+     * StringUtil.abbreviate("abcdefghijklmno", 12, 10) = "...ijklmno"
+     * StringUtil.abbreviate("abcdefghij", 0, 3)        = IllegalArgumentException
+     * StringUtil.abbreviate("abcdefghij", 5, 6)        = IllegalArgumentException
+     * 
+ *

+ * + * @param str 要检查的字符串 + * @param offset 左边界偏移量 + * @param maxWidth 最大长度,不小于4,如果小于4,则看作4 + * + * @return 字符串缩略,如果原始字符串为null则返回null + */ + public static String abbreviate(String str, int offset, int maxWidth) { + if (str == null) { + return null; + } + + // 调整最大宽度 + if (maxWidth < 4) { + maxWidth = 4; + } + + if (str.length() <= maxWidth) { + return str; + } + + if (offset > str.length()) { + offset = str.length(); + } + + if ((str.length() - offset) < (maxWidth - 3)) { + offset = str.length() - (maxWidth - 3); + } + + if (offset <= 4) { + return str.substring(0, maxWidth - 3) + "..."; + } + + // 调整最大宽度 + if (maxWidth < 7) { + maxWidth = 7; + } + + if ((offset + (maxWidth - 3)) < str.length()) { + return "..." + abbreviate(str.substring(offset), maxWidth - 3); + } + + return "..." + str.substring(str.length() - (maxWidth - 3)); + } + + /** + * 比较两个字符串,取得两字符串开始不同的索引值。 + *
+     * StringUtil.indexOfDifference("i am a machine", "i am a robot")   = 7
+     * StringUtil.indexOfDifference(null, null)                         = -1
+     * StringUtil.indexOfDifference("", null)                           = -1
+     * StringUtil.indexOfDifference("", "")                             = -1
+     * StringUtil.indexOfDifference("", "abc")                          = 0
+     * StringUtil.indexOfDifference("abc", "")                          = 0
+     * StringUtil.indexOfDifference("abc", "abc")                       = -1
+     * StringUtil.indexOfDifference("ab", "abxyz")                      = 2
+     * StringUtil.indexOfDifference("abcde", "abxyz")                   = 2
+     * StringUtil.indexOfDifference("abcde", "xyz")                     = 0
+     * 
+ * + * @param str1 字符串1 + * @param str2 字符串2 + * + * @return 两字符串开始产生差异的索引值,如果两字符串相同,则返回-1 + */ + public static int indexOfDifference(String str1, String str2) { + if (StringUtil.equals(str1, str2)|| (StringUtil.isBlank(str1)) || (StringUtil.isBlank(str2))) { + return -1; + } + + int i; + + for (i = 0; (i < str1.length()) && (i < str2.length()); ++i) { + if (str1.charAt(i) != str2.charAt(i)) { + break; + } + } + + if ((i < str2.length()) || (i < str1.length())) { + return i; + } + + return -1; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + if (params == null || isEmpty(template)) { + return template; + } + return StrFormatter.format(template, params); + } + +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/TimeUtils.java b/fuint-utils/src/main/java/com/fuint/utils/TimeUtils.java new file mode 100644 index 0000000..7ea8a86 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/TimeUtils.java @@ -0,0 +1,82 @@ +package com.fuint.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 时间相关的工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class TimeUtils { + /** + * 日期转换为时间戳,时间戳为秒 + * + * @param day + * @param format + * @return + * @throws ParseException + */ + public static int date2timeStamp(String day, String format) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(format); + return Integer.parseInt("" + sdf.parse(day).getTime() / 1000); + } catch (ParseException e) { + e.printStackTrace(); + } + return 0; + } + + public static int date2timeStamp(Date date){ + return Integer.parseInt("" + date.getTime()/1000); + } + /** + * 时间戳(秒)转换为字符日期 + * + * @param seconds + * @param format + * @return + */ + public static String timeStamp2Date(int seconds, String format) { + if (seconds == 0) { + return null; + } + if (format == null || format.isEmpty()) { + format = "yyyy-MM-dd HH:mm:ss"; + } + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(new Date(Long.valueOf(seconds + "000"))); + } + + /** + * 获取当前系统时间戳(秒) + * + * @return + */ + public static int timeStamp() { + return Integer.parseInt(System.currentTimeMillis() / 1000 + ""); + } + + /** + * 判断指定日期是否在起始日期区间内 + * + * @param startDate + * @param endDate + * @param date + * @return boolean + */ + public static boolean isSection(Date startDate, Date endDate, Date date) { + if (startDate.getTime() <= date.getTime() && endDate.getTime() >= date.getTime()) { + return true; + } else { + return false; + } + } + + public static String formatDate(Date date, String format){ + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + } +} diff --git a/fuint-utils/src/main/java/com/fuint/utils/ValidationUtil.java b/fuint-utils/src/main/java/com/fuint/utils/ValidationUtil.java new file mode 100644 index 0000000..30047c7 --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/ValidationUtil.java @@ -0,0 +1,138 @@ +package com.fuint.utils; + +import org.apache.commons.lang.StringUtils; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 校验工具类 + * + * 统一返回值: true-校验成功(合法) false-校验失败(非法) + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class ValidationUtil { + + public static boolean isNumeric(String str){ + Pattern pattern = Pattern.compile("[0-9]*"); + Matcher isNum = pattern.matcher(str); + if ( !isNum.matches() ) { + return false; + } + return true; + } + + /** + * 空校验 + * + * @param param + * @return + */ + public static boolean validateEmpty(String param) { + return !StringUtils.isEmpty(param); + } + + /** + * 长度校验 + * + * @param param + * @param minLen + * @param maxLen + * @return + */ + public static boolean validateLength(String param, int minLen, int maxLen) { + if (StringUtils.isEmpty(param)) param = ""; + return param.length() >= minLen && param.length() <= maxLen; + } + + /** + * 密码格式校验 + * @param param + * @return + */ + public static boolean validatePwdPattern(String param) { + boolean flag = false; + try { + String check = "^(?![^a-zA-Z]+$)(?!\\D+$).{6,20}$"; + Pattern regex = Pattern.compile(check); + Matcher matcher = regex.matcher(param); + flag = matcher.matches(); + } catch (Exception e) { + flag = false; + } + return flag; + } + + /** + * 校验手机号 + * + * @param param + * @return + */ + public static boolean validateMobile(String param) { + boolean flag = false; + try { + String check = "^[1][3,4,5,7,8][0-9]{9}$"; + Pattern regex = Pattern.compile(check); + Matcher matcher = regex.matcher(param); + flag = matcher.matches(); + } catch (Exception e) { + flag = false; + } + return flag; + } + + /** + * 校验邮箱 + * + * @param param + * @return + */ + public static boolean validateEmail(String param) { + boolean flag = false; + try { + String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; + Pattern regex = Pattern.compile(check); + Matcher matcher = regex.matcher(param); + flag = matcher.matches(); + } catch (Exception e) { + flag = false; + } + return flag; + } + + /** + * 校验身份证号 + * @param param + * @return + */ + public static boolean validateIdCard(String param) { + if (StringUtils.isEmpty(param)) return false; + IDCard iv = new IDCard(); + return iv.isValidatedAllIdcard(param); + } + + /** + * 校验Url + * + * @param param + * @return + */ + public static boolean validateUrl(String param) { + boolean flag = false; + try { + String check = "^(http|https|ftp)\\://([a-zA-Z0-9\\.\\-]+(\\:[a-zA-Z0-9\\.&%\\$\\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.[a-zA-Z]{2,4})(\\:[0-9]+)?(/[^/][a-zA-Z0-9\\.\\,\\?\\'\\\\/\\+&%\\$#\\=~_\\-@]*)*$"; + Pattern regex = Pattern.compile(check); + Matcher matcher = regex.matcher(param); + flag = matcher.matches(); + } catch (Exception e) { + flag = false; + } + return flag; + } + + public static boolean isInteger(String str) { + Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); + return pattern.matcher(str).matches(); + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8e34e3e --- /dev/null +++ b/pom.xml @@ -0,0 +1,186 @@ + + + 4.0.0 + + com.fuint + fuint + pom + 1.0.0 + fuint project root + + fuint-utils + fuint-repository + fuint-application + fuint-framework + + + + org.springframework.boot + spring-boot-dependencies + 2.5.12 + + + + + UTF-8 + 1.8 + 2.9.0 + 4.0.2 + 8.0.25 + 3.1.0 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + org.springframework.boot + spring-boot-actuator + + + com.zaxxer + HikariCP + + + + javax.xml.soap + javax.xml.soap-api + 1.4.0 + + + + com.sun.xml.messaging.saaj + saaj-impl + 1.5.1 + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-generator + 3.1.0 + + + + io.swagger + swagger-annotations + 1.5.21 + + + + io.swagger + swagger-models + 1.5.21 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.2.5 + + + org.mybatis + mybatis + + + + + + org.springframework + spring-context-support + + + + net.sf.ehcache + ehcache + 2.10.2 + + + + com.esotericsoftware + kryo + ${kryo.version} + + + + org.springframework + spring-aop + + + org.aspectj + aspectjweaver + + + + mysql + mysql-connector-java + ${mysql.version} + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.session + spring-session-data-redis + + + + com.github.liyiorg + weixin-popular + 2.8.0 + + + org.tuckey + urlrewritefilter + 4.0.3 + + + + org.projectlombok + lombok + provided + + + + com.squareup.okhttp3 + okhttp + 3.8.1 + + + + com.aliyun + aliyun-java-sdk-core + 4.4.6 + + + diff --git a/sbin/kill.sh b/sbin/kill.sh new file mode 100644 index 0000000..0614ada --- /dev/null +++ b/sbin/kill.sh @@ -0,0 +1,8 @@ +#!/bin/sh +APP_NAME=fuint-server + +tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` +if [ ${tpid} ]; then + echo 'Kill Process!' + kill -9 $tpid +fi diff --git a/sbin/restart.sh b/sbin/restart.sh new file mode 100644 index 0000000..9533dbc --- /dev/null +++ b/sbin/restart.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +workdir=$(cd `dirname $0`;pwd) +cd $workdir || (echo "change to $workdir failed" && exit 1) + +./stop.sh || { echo "stop server failed" && exit 1; } +sleep 1 +./start.sh diff --git a/sbin/start.sh b/sbin/start.sh new file mode 100644 index 0000000..8eefbb9 --- /dev/null +++ b/sbin/start.sh @@ -0,0 +1,8 @@ +#!/bin/sh +rm -f tpid + +java -Dfile.encoding=UTF-8 -Xmx2048m -Xms2048m -Xss256k -Xmn1024m -jar $1 & + +echo $! > tpid + +echo Start Success! diff --git a/sbin/stop.sh b/sbin/stop.sh new file mode 100644 index 0000000..b0950c3 --- /dev/null +++ b/sbin/stop.sh @@ -0,0 +1,16 @@ +#!/bin/sh +APP_NAME=fuint-server + +tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` +if [ ${tpid} ]; then + echo 'Stop Process...' + kill -15 $tpid +fi +sleep 5 +tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` +if [ ${tpid} ]; then + echo 'Kill Process!' + kill -9 $tpid +else + echo 'Stop Success!' +fi diff --git a/sbin/yanhe.fuint b/sbin/yanhe.fuint new file mode 100644 index 0000000..b18aed9 --- /dev/null +++ b/sbin/yanhe.fuint @@ -0,0 +1,132 @@ +#!/bin/bash +# +# yanhe-fuint +# +# chkconfig: 2345 80 20 +# description: Starts and stops a single elasticsearch instance on this system +# + +### BEGIN INIT INFO +# Provides: yanhe-fuint +# Required-Start: $network $named +# Required-Stop: $network $named +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +### END INIT INFO + +# Source function library. +if [ -f /etc/rc.d/init.d/functions ]; then + . /etc/rc.d/init.d/functions +fi + +# Sets the default values for yanhe-fuint variables used in this script +FUINT_HOME="/opt/yanhe/fuint-server/target/" +LOG_DIR="/var/log/" +PID_DIR="/var/run/" + +prog="fuint-server" +pidfile="$PID_DIR/${prog}.pid" + +export FUINT_JAVA_OPTS +export JAVA_HOME + +lockfile=/var/lock/subsys/$prog + +checkJava() { + if [ -x "$JAVA_HOME/bin/java" ]; then + JAVA="$JAVA_HOME/bin/java" + else + JAVA=`which java` + fi + + if [ ! -x "$JAVA" ]; then + echo "Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME" + exit 1 + fi +} + +start() { + checkJava + # Ensure that the PID_DIR exists (it is cleaned at OS startup time) + if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then + mkdir -p "$PID_DIR" + fi + if [ -n "$pidfile" ] && [ ! -e "$pidfile" ]; then + touch "$pidfile" + fi + + cd $FUINT_HOME + echo -n $"Starting $prog: " + # if not running, start it up here, usually something like "daemon $exec" + java -Dfile.encoding=UTF-8 -Xmx2048m -Xms2048m -Xss256k -Xmn1024m -jar fuint-application.jar >> $LOG_DIR/yanhe-fuint.log + echo $! > $pidfile + retval=$? + echo + [ $retval -eq 0 ] && touch $lockfile + return $retval +} + +stop() { + echo -n $"Stopping $prog: " + # stop it here, often "killproc $prog" + killproc -p $pidfile -d 86400 $prog + retval=$? + echo + [ $retval -eq 0 ] && rm -f $lockfile + return $retval +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + # run checks to determine if the service is running or use generic status + status -p $pidfile $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + + +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac +exit $? diff --git a/screenshots/cashier.png b/screenshots/cashier.png new file mode 100644 index 0000000000000000000000000000000000000000..0e5517d2220677f92b2df4365439658ceab99a8f GIT binary patch literal 155908 zcmaI7Wk6fOvp0-8#U((CLxJD~hZc9Y-~@MfEACLBxRl}+AVrFVQXs{x6sN^qid!j^ zH~rt|-sk=B-uHaTo^xh?J3Bi&XJ>YjsI93)h)08mf`US*qAahAf`S1B*!eP8+c`M7OEI0ozc4X4*-9}Pfi(CuJmu^hos@&U z?eu~*^=*P(Y{YDtUP&`Z28tsA-0XZI41sR0?mpsyQcVBB6-T!JJ?3R%_z#J%ixks; z2?f^BW{~snwqp?H;p4X9;}c*I5#!+(77`TZ12PEk3Gngq3Gng@a`W+v^NENH2r&Gg ziwW7Ax2?UnuDs&^=?i%$#pLMg>nYC58xRn{6ClXr;qAc7FD54T4?{qJ8%e?K6Xfm- z3FLP7Vg7Ffc{?8)ZzoS*Cl7aqe~1uk4?kZiCZweQH3T=$|ABS)`9EqxDvUP};>pX; z!}o7U|4pc&@&8Zi=Jr3-KEAqk|5x7sPhcPYAWu79T{|BSKW`i4#Mv|d>&jDH&f5;+ z>*1~M;ocOPGfyN#WSyc81> zg2&0pR$NdlfxqBn+dX$*Y8M$0gwAJ+$CjC+jDt7!6QUnA9 zrqkc4+WQC?+MeXWChD^v7lCRcR=>{{OFQRkPSS4R6IuZY`T2D#`2(ZxZf4YBn!jzx{UmBS+P1?s3M^r@oje zBf(E|e4KxLGEGyJ6W(>v?0Uc8`uDzd<>cpsr|->70-u25)Lbe-e*OYX+r?hz>EuXwC0Z*qf=f_r|xZSuD72ODE&vza@4K)rP7<#nl;oGbhWei zMZMBH8lS#iIOt{QxTRz$@+t7EcsGB{P#!){zsYp_rtk6ntxvOu!pww*o1SAHG=|%(v>)O;>ttB!BVdGTECH)g!Dnz)7d!Nv?1!`-}NNR9XvihZeU<= zG7guMmpfS*Us+i>86Q7+dU{$JNBRboy1FL=1ABY>g#03Vq}~$};PB7maCkyO{u2_Q zt{Yy5ylS3SR_yHqR^afu{QQ-Zll=Vrla&<|c=yWq_zJw{Nmdq~ADfTl&Ch?T`yy{( zAS-V$va&K>S4RSeKb<^{!>d;6Do>E@rvrFG+)7<{4II95@>G|fa5BC+eu9(;Nxf2+ z5DBk?KaG#q)^$G_$dA|cAO#Jy4?ICaAn8}ePvEur`SB}HPbcFwCv~-<_V!QXYjAk& z$qJmbu1?NS?y0UeKdzuIrpQ!Y=4k~!h8$y{&C0({OOQes7|5L%7?{c%K8=?@t(4bx zS3|;0k5(#C>fo{YaR{VN;H4y=tJmbkP~deGNJ;X$$DdZm^WhuvMgw1g6(=jMeqq`UC~d#6?A3Mn7=*_%osJkKKHp{cncHFLnmA$UEoGv$A9beVByB0*c%k z51Je1z*|*`QZudZ@|`qiT7Ps(jQGa?xT@Nkwq-k+TsZ~?_6qRf(U3FLML9*bZkCK@ zsuq59)%&E*p3$ax__E9Y^Z7(Y=S=Fm5hn);rI;^aYp3XUo4G_RtE~bgvxSw;KyxFGN4y@GUm+BrBG4i|l%}bw*MJhO{b$6nUu!l6l7h z+1)p>pOcL#Hm$;hgH>7lTMAd~U1fVfZ)Qa9a81m|?%k;^ez|=@9dq|Dq_ApZbM5W- zmqR`Bct(9w>L>!A_=)8j=eLD=AxIdCkT{a0WQN7Gaz#cZk4t#CSIcDJSSbI$(evP77~rwgD-8t zHpz{UB?4qy7{U2z?Hh0-5BV|!qToh2HV<=+YrFfUdWmW+2z6P2QND#N{Tq>M9B4A$ z&IPGHo`_4*7ft*)Huxk|5p5S33m3O+lo>@_19yFo(64e;==8qt~}?v-7@4Y<^l zZ5Oi-@h(qiU$+sG)bsn<4f)g3AFJ$?T6adV5fb;3M^ZK~wD|D$B1^hKG{t20OVZGR z@36Az>CGoJUXJiLg6e-H&!Qa2c?E!MZzObIaFl>0$Gvwde-nO} z4ZRyce@ECj-zfm)3M&jPnRwWBx-jJ1r(aPcm@>R^=?{Y0Fpu1o^@-U*t8O3wvZ{C8 zl1s*t=Wh2Ev{T*QncOk?8Q1raQ(xnL`#0voM*ur0=lbREhq#mY>ImuiW9AoTsCksn z=N<_<&p@GK&Vta&CP*6_DStLSrD)pQw$WtSCKLLHxt<^*!i9t~+{z)nt$f>UG9Nqe zbn4g3C3SiU9Z6ah!zr5gR%gM{9+!8pAqP>of1gM?%mSG>p5o!Uj^6H{}g%^-)iQALU&>xQRAcp}d z<#%x=1?`Tl!pww`eaPC`AqCsfH~G zF>r>ynLwYnxgtJBs;Mp1H3~MZJTc20X29LNF{9Y|{PrW|+`JYErdXbPMP(Bg<9q#Lt2)&46 zg6|&)&{4^x8O(g(k(&%`oSmDi=vF+d0jmtAZfCR?Mz853gi&!RvGUQP==c~g zXeKAtv2=8mv;{f@=oCgPXTTIe077#WG0f;-Mh`0qa0SK%}1-*Eq>H7 zs;fWIJt@5FwJ!6~6YoD-QFdg%+6L4`zlMp4W9gLfc7)5iI=O(=)Dg1X0=k}(=R~2w ze=f&<;Jl{#vi?1Uiw_#KNrAFr%@6&2X#<|J5C3Dl8N@2s)vn1RNq)(?g!OO zb4;wChk64B+FI2#7os=!k-x@Xh1EPy8&q#_t$YSS&#!v6M5bwX1AJ?m_+2V2 zk!QW|fbA^n1Az>m)kAV+*>`@?fRPGmH`2O|HC|DT2 zx;1jx^(y`R_pry%m6f^hKNk#zw0-j5$gp&3EqN3E=jK<&o)3V>4kz!_L*uM1F|=&H zp*})Z%zQtWth*6kO7>^{fjelLbD>M57B_c&b(<3F0@r}b8TDgeJF!|To3n7I3+iMb zYK}S~z8y4-&22f>`W_Icvb$`~DhTCIYdbYs7(IQ7NWzLlWz3Nerbh(lq}$|A zKcC7}hlwTSK&u7&rbu;eK^`oi3GQk8MeAn~pjsmQkAo?fD6M=~g8R5{(LNROKktL> z=i=Jb5GCq+Q#mDRy?#s-6by0?<$T1^hZ8pmPv7DRH7FZ_#j{=`1nXut6UJ{Y zg9&h3P~UvA6FR!RLtEP2buAg1IX+5UrkU5Z2PfuDPs+&WjnW1FmDno@D1L>4Z4ECq zP{!>nxe6iU?{{H3eFW)v@ekE=GA6R{oLdBPE8We9n{fl10mXLuD$ySEoDJ$sUn?lAgA>h2z(uJx0c+Zov4SNe3L#_2C^%5d& zdp*yq!xnk4Rw#-!sC=J>5X)*&oGK2fva!^PuM-09S-UXT=dolWgmZb&v>FJ^!9M79 zPprf+!yO;mz*#MWEX6BS(97u0xzY|lF-y&=OX9&|Y2<*c&eBy(OOy^W;ebv~t#?^> z&LdQafKI{;n?+1w2OxpBMmas!f2TYeAB@Rt zH2)M#o;bTYJG=h$o0=*(={!@^BU7kvQJj%FyI*Rd3isc*!c_CkrHq2KS&hfVT|LJU ziTuqET%1U2U{Mq3X^45)AH|lBPY$(zbg5{zv)RZcOtUbR0&)`T*q{uCM5r>!CQfEo zY+xMneet(8vk8{*#mqlayU_C{rP1(XhvJ$UN79gnIOifA3JI+os3y(li6pU05 zL7N-*B+2QJ&S${3+0E7df$5lIJ-#S-P5n zdtEOLR<)o&;3?Vgg2|#4H|rm5_P7AV@`jvT)T<b1>zZLlBQSwz}Q)?3?8J)l+mTyfve>DDp_+e>Q$`S^C952S1J z=@RR8i9ybbPG@ddQ%)S6(wg0)r+Z%WDG$9qtMg#??>!G3MAOl-x)Pa~K%H82>?Okq zR-9g1Zvp+s7k0(?SLl1%27p|jhOjevtH8md8J=xyDdC+UR0sUT5W>DA1CnHvbk0qz zji54C0+RRoVwQbGthU%XpK%$pSxf@@l?`5=3HKE;KQpGpSZW15YzxVU!)a?J{Yt}j zdIno=A1+4)t9iT6n>4DmPM5D+ZdNqb%vCf+PFx-q@Tqu;+{$z|^D(W#(>?VQo=h%eghSVX-e~ z5!xxE<|`Y%fLyHHaXZR@>q0*p0}-g$uDclxKr34=}RT?+u4440aYWXU*y9henPT zL!zgJ)u*U6U3(?8h0DA}?#?DlckjYdp$$L%Q2Ph6;ry;htr^T)$QAF)fS&;r&*VYCNk@niStDfjo;+IsG1+QMVY#|4J_P~H8g<4 zwrzq8s1sO8gDlo50^x^)BCT~N5CUEe`uWio2U^-MDvt&l%CG{SR`eK2Qijx*^28O`8L}n9AGhlom*d zxHj4KxWRgqo~p9)K}PlSs>g?4%BRjg%L?>0Y(Fh8ZUN+&)2A!}uv4|W3}nv2ikp>? zi+6}nowTZB{GINd%5iRVg56igwIVz`O$uCIZGPj%bSI_fSg78ZN1x=3Mt$wLfa{}p z_cS~sv8*!(7D6z+;V6cWAD!sCK7I?C>u{k8hFLxG_&WS5ufO3gBElb$npaBtG(H_q z5hhGQh-Eoui)ksms3aMo!EO3ONhCP*z0La?_5_eJYGG)3*ii6acr{PqHRx3#?!){k zJ_fpxMPZM3beQG8h;WH_ZP|| z`kjmD3_jkR=2q_1bRr$bSIVv)f@K>2k6CN^vJ`Q$d;MXt(qiy&jm7VP7W7RtC-7fa z%0HxvO~K7e$H&OVZI9th=)jjbaLIG@*Q8S1u;hkck-HA@4^0{E1*T<27PRhIx}dJ< zN7eZ)TEf7nDZ{kCH*KT6j%vOxcF9PUC@jE^fg2hK*hS*9zdSTpg-!AZM+0jomWNlc z^abUSisR(>Tz}(we+nqkuI)xB*l=>PsIWLr0o7$|ah}m~@YduF{eefCqEfrzcf4@x z9Q;qmi^}2TsnS2f{mTEYdHivk-#Ty#|K#oZZfGm0;SKid++T?Mmo8v`<&Fv=AaL{p zAiGvIb5`J&BIh;QLL<*Z@k>LIW3J7qMzp}S73SKF#tr?DN;ckyVxJnXD|KAO><@aVjg#Pax&n#| z+$e}7O%tXdLmI=YC8{#|?r))>^&bVeH;Kx{l1*OHQy!0|kOY4W^@#Mcd^lht@FZ27Fm{z7qNdwfvmP5NA< zOQOk&mq}TybnNWJs_wq=u=}vhjS$_6XtY<>Z`iPlOqXCt5rR7PKH2W2WO;dr(jUqP z{^h-ok=BV$;N38EvMbHu1MM&%#Dp{CP@u zBSv?|FNTgAJvm{6Z&HMisZ)wjtgz&=)wGb5OGrjgu?GGK4dt1y#c)$wIvj7Qx_bg9 zZBM{OGn{05j?I*on)4gB8z2xX{WoGDQSCyjwXgxgjT<*-w($OVwrH8@m3VR7oN4Yq zqBLHEI0}=@b@qRmVCY*~g!Aw9uZ+NCxgmuR&A=Vm0kK^~0lkq)8Nm@7L%2V3*T>oi z^Pl~!&7YrKKX?2!hJvU8^N6)*T@BagYyXU>U;}$YFD#GfXlnqLQrXE{2nm~&>z9u$ zQvNy4{P3t8Y@!Cpkpz^XvIW`22pG9Y?s{g6cUHu-&t;$OQsg2wJf|1T_gmlj5UN%FMCe>J$3S1CyZ6ZPa=BJHtuWG~k;y2@>ur9^t z#FoGtr>?1e4QUbm9p8ECZnzr#{0zmB-lOwVgjZv~L5LOSGgB+@csw%oT?konQ|u*$ zf!7FW^kh}nV`i&p#pgEE*1`QSe@ztNZ|o*Osc%Ctu>7Z@IN61Bz#mjHSVa?y zmh%0`p1_FF&AvgCzCpL)K?2-)*z440`}!;Svp-RB1EI*|b~7Mn#U2Andw-y|eO4+R zts4hoWKoB*yD^WtvBw_L(`|K#tOcdHo>5xBx%~=xJnP`9brZf_@Qw|egQUGcM^If> zU`oXfhjl+`TrAQ(*nqLx1BZL@kNN3s*Bf7rE)pD-KLd-93;N0lxt}HcbvXV5$#Mph zQO_SPe)Kh8Kv}x7XEJ@2eqdH|kf35{{{BbY@+^%(1OJId$;JSW2(MvhVB1>$(ca93 zjod+P#qECtf0s$RCD*cON2w-YC*`-4Uz@T%*%4SY%@V!f-OZ*V3HYX;ZL}eiVESCg z$Jf28#aNr5Y?BsZ%B>QZ2+=P}XE`RYSeS)D>sFepXavK!#($1WQVHG#1E?5sS{ zW*LY~ zGmB#4d;}TMd6~6Y+jdCOv^eE8J&UY7Kf)M*M!#`*&(3W{QA>z5**XC|Iq-(Uc;0tr zJnWbQT#gyGW)sv!^W2^zu!z%>6Y>g{(6X$e1FdZgnW)p=b>##cmj0Q1Tit%8JmUPn ziJ}gIKw21O`iEpT_XM^Gv(w+QTe33_xaMsp$8DqY1-@m5<7U!VW{MZP4Rw&j>$s{N z?+39{pM1h+7{CRa?KJvy5wfAxccw0r8rf_`OYxQ1p%pyZ*t49l@R$3ScZpMi%m{Dy zh1LYQnaqBa)K1o5Vf3qXqm2w=<@a9oF?=&i<7yDXb_3>al4oO~;LIJ^ETfW8=N~gB zAO{Sa;w9NeJU|7rB0Z?c%&dh{g_r2LHQiuFPBI zLCLQ~kkS{#4&s=<6RO0Rv4u3Y?DF4osmdF&Or$fK;K{wlx>D2CwnB8~qtyRk?OU4S zrDv#P8G%?}eqxnTu8}5!>ESEAmCImGLi5$&w`U0#2s=DM$z*^P_xO&Y;Ppl-0!{fU14IAuN5c6GVv0mH4Ji81kbFcc9ee)@t^+q?bte{Z7rRav(;Qw$ePHe2p1 zsoshzfvl{;ML$(;tF4(Hiz%WR)kQ`jz*~+ZM>IPQ#Lwc}aq-c_LH9=7y4h?)U7Qp* z{!a(4LRw(Mj4^HQriz%QDeYS)O$XhJPrILg=W$u`8$8Z`RhNc}mo20|&KoVrHQRK( zpKFn}6kgBYAQ!@r(Q7-geS^))iPfaYV!(j*RSko_d0n$?mFG+)oUPZ}GA@r$S$`1| zo}PmrH?D@B%P*_XVlleq&h+@&KXcSOT+#O1dI*YCN)3t-m$QR z+FM-q9{kNuw(_cjLeay{0!6c#sv^X^3B6~Gw3!tnNyIA7B;j!_#%C9#9@GU{sNocb z5zJ0_d%8RBjQQJ{cn)Wc?Bbqqn2X|OwF(d;bz9j~U8a}cwpWLHYD7hIZX32q=#m)~ zK~Zwx;^(8-9+APyhN&#-WQP+d^A1x+!?Sslfc^K0ZL=v1Ft70pyxFnj!ui;jIM_;_ zT&8yJ$jqvuAUj^u2op24aTnrBvJ1zlCo&p^bw`M96{sh#u#Y<_aG5%M2BX%Wv3`0X zqC7skjoc-^t_=+fFPV~S4)c?Gk${VfYwO^HH+m&c!4y>{aK4nFoJ6ie&f%&|EZ_O9 zl%ZB|nusyV+5cHBel_bmukYMvnIAY<06P5;*8J^vDirA+f129zn`6+z8!I6y5n<#o z{lq4oeJnh8;UFpatN(IEfEXMJEPEOM z#;`6sx|VXtx7<|_T1bYB>m$sUAEh%JE-?>-o4>xoTll*k--~9&arA>f=U43*TG?;d z?`upea2DS|ahqn_tA*3;#5%w}&au%PYR5^rYH8wE4Wl#n{yl;Skj#-%DA$&Spf;5F zd2+-KeU~Plg;g-U;r!O+-Tk`KP3l3I^xIdWlxM%M@-bd$Ko}W4>6cWpJd3__rWD4& zAUF`soJ>gUTNWF^xESIFfXXD&SLiaZ%mykLsx+u)o!E*N$pfSn*<^Y~GIKLsi5Y8S zA`N3D%u!6^j9v#<#3Vx3Z^xAMo#~T1?U!@W;F}bcw3Qvo7&VsPBkh5AlqeHeygm?) zrDE4)mh6Nd_FxfKtKXpjqBfITfQ_^zu_hf+kwzcm+v<~cg<8m5r5+=Q(}Ybp6ad%y(+>o*xHuXx@SFiTYvPuP5=<2F6F_fw=cK;m7D$}KFR{E87dvCZAt+JJWOjxgF`;KW$eT|qi}RyZ-c+Owps=>E)tlj+?f z0r|00wLqylkouSNhy9_7HLJhFR%Tm0Uls1ie%(x?0aMPKUwoNzzzCID*9%|QwZWjK zfL>rf%47Ree7HCxK2Q0ces&0DX;=~fZtlv*aK9iK{}!=_ulat;Ns`DYRI`5L9r{DW zH?5z16SW9*NhP+#N47%sOxA9lTh`Wk5b*CpGhluK6>MYtJdl!<>q|VrfiZLa(N`+7 zwvN@l}w(z7vd=5kq$wS<#%N{#J^9L8W62AC%vXPU1?GwLzpKp#5AKtl&&?`vLv z_U_^=igCk`S&tm4fO1HO5IvEx|*8 z@UDMADX71rvEH7ocunAj;%JmQ>e80?j4VMy>~+E@u2_Gq*L!M}YA0u6hY{GI9d1)d zA+loUzhWZy2v#h<$!JDCEIs}NS7+bH#o#FqN#sHJw=LsS_DBZZhIQhvNiV*9{K$S} z$ro2?9Wex`Q}xBX_D3VYS0PCiY$r(TU(Ef$Vb5x{^=m5r6)b z^|*_qKp;`+xJED4gCv)_fawk5oNkPKshFO2lrFe;ieY^yfa^bsR7nu8&c8BkmcORX ziLsN;w2RM3?`vnnqngl%NJ$p%wGQcYY+#NA>$W$Je&sDO$mEq9GG4^QfO1%+j2;^2 z(WqNBUGB5glkuxH=joYI$HnHcniOM`Yz3}zsv`Ki1to|C1QOb~yd=)cvsk++>5(-* z)gO9T&&e>VOsT9NKb1;&z&2=YOhpjj*8)EXBmfb}(7p@%N=s19FC5;N8WS8>Yg>tVuFq&hKp{)pf>DLwl_I1f*Vc`>GDwd%CWHdmb;`Cccs4# z2)b!*KB6J1-chmqCHB!YtB6L}DxZ+>LPS6fOn~cg^XBUvPVZmt@TIYeH|6D>a7AW-wBZI-%N&Xkx0hl99k4T<4qI=iH=!1>=&8x#cQ~0 zMr178ZiE$0LX9}BUsX?(6d)?QUYHNn5d=_THuyEbT@*E z|D-cN{MTjoosRI&#lap#0f-|H&)od_T5@g9PdCC}w>QKryEW1$m$ymnbg8A9dqv{A zFki16tun6X&-eOUjS??j4YZ$gAk#JE07{2E6l;GW(!?}al>3|Kr@#t5c#q}=_H=w1 zg>asGKdw8fDUG|xFNTQuaCx!C7k_Bh%L;!n>D%kumWYmD#(Ly(JlHOv!|p`iUkVnj z4u}bp+i!{vK0golh;8d-+f^Ug?`2o&hKhMsAg(52%f~Vj2A;95i=BE;+tEFb6$|vA zj-R8O7cCXL_#HWd;vx$HhxJV>@)rA;>V@WM#VU>13e2kh`Z<&B{Aww#A^DXUK{|+m z;7n8sR}dZjZ5jp!FNl6d20LudUA}$qOslW8OyKf~ zz~$7MFoc~CT8oOmU{3&jR#(SpHlVA8;i1gL7kI;5Ad1uvjKB9lMi~U4t=NeF$o<4 zaM4>69B)qkjgbVci#ZGg4MNIdL&#?~`R}uu{DLpp;_{V^o&|cj6xr572TbQw!jq5W zi+_?ue3MeBbh;H{aUndblIm?*KK%WTJvOViQ_mgsj?9Xr(xkhW=nOqNLZ55ZVmgHQ ztWFQJdlU8Jex?8G&-)3lo+VV)3L^@hBf2gM-2#4odHE~t%aX)uJV-Amo$IG$BEc$m*iL|L@TaNV+OH$DyWGuyt1%!0&rTud?? z_s2!pk#>(;f8(-I?X62>mL3@0;Ka%>LCqfTR5=?p?k!lJm+vO7H}1=C;q%jsH95yc zF<7_l7$s@ZPK?rBH8#!gB=@YlQ~g=0?a5_D-uRM-qmp)JI-{wRt@rz$QqL6=R%dlz zxpCHjND9cDT@$KOEa}yZ|6`<)48;UT4#ybB1jR_QS8uOYFQEJC`wtW&Dv3E^7BGrw z;QD(yYVED2o_lvWUJpU&5x4jt|e&x91E`j>CZ?NY;%bXKXADO@3hF`Yd$%=Wq-Qdq^UaNhW4)Eb&Y~cRavZ z988xen8nICIy)bX3L~f9#EWLdQc4nQ(w4O5HEt^S@iEBktsd(ebO2>_E>`?W(9f=D zPVle0?1c)=)w@I3R;uyWIIy9)hOpBAC2@g8lRB%u#6fb*L*YUnu zJjc|p=YIS1Tl!YOJd}EV)eU*fw$%Re*Lb7(4xNiVJ*5#-m!2}CzC*R2SIxerOuQfm zB^`wF3#l)v;w{@CjDckvtUN4}m5?(2;o5Hz(?DsTbHj+u79jU}Jyn4aBb5VS2#tYI ztS2$$DL|{JttZR!4326%2Q*^J?rh6)+NLWi>Zl2G4z1NsyuVWG=IbY6`ZtW2bk5mX zr;QY434G;*abTIwm*cn_Vu+z5@VGhk&HpsSqEydYDSr#!{5pC6gI`p#Kymia{6~m4 zis)>FXXc*Ep#f;GJMd%Q+&7fK?C8oqlJ0D{cwV{qyvprsp1<4hQyQeHQy{vY#v2EV ztEp@p#arqjr@&CKVvzDM4$%xuo&c9n4M8f_E;FK&Q0eG93WIu)mF0{K;4zj?egu}f z!wlSyUJ_Dpexw8#QoZU9RE6`0FW3=qStQ?mRm5)tj*K4ontU^eGH3msm8j?y&%&-c z_cA$7Y>axI{M-t)2I#DiPhsAC#i74o{=I&0Djs2>7ugQ0R<5Vcu(s(wYi2%a?lAbd z(d_A>icGr8cW_2?-hz4!IsG=}@tQncG>i6SyT$Q<_|@?XFQC|1JF{3pG{n0nFOGlh z|N8ZOwy0pa)cG~cQNPBCb4WlDz3#}sMm%l+x5c&S{M;V=1@JhRZw^;*l*5-wa=0z- zd~?cj4XgSctdAIlJrz(3#Nl`y38~>|BTuJkc1y!4tl2Oj5du&R9HTs;iU-`5nBKCN z2((^_!F&S(4tQCAcP%8*@X?SbP1WJ43Dpi|omqwb6HOg}IZVgs7ss-7i88JKnb z^gR6?Qj%rqC#GsGsn`ev3z8gK1Kkr%yc{wtjfKYg*6R`s2t0|)NH0F$T67&vE75=U zJ;)T%(hD01{Kf=MN#mH8fDryj>dzk2At2uh3fJxBjI93#oeA?X?7DK9c-^=}NPz!^ z4=bi!uv=WUnk!r+kGA3~rxB6<*b;x9JFQcFosoq2cV=qhPi?5Dx;~v|KU73CeBju# z2h@~9p^|}TUD(>S0|3-$qR6qVxov*Y6B}eDdP=y@LgQ?i{v6p;&|1DkxS)y@)Ho(a zNDxfCQfq~*Zdb0?F18K;M!zwgo@3Bvrz|6RO}oc4dcxR3UOxiED0n4Q-$MEh^6}5Y z#l!W3!&|Zyn>MxqWk0t>sLGw`cYalY>^gUPm-N2rpGdU=>#<<(;hFc=Ykr8agD! zQOnpF)C7$XlbC(ti=AFL4mgfvTd9>3FiK2VT8aa>e4^zHq7%-VNvz~if=V4LGKHhV zQT*-U#kE2Hq|BHIULV7?ZRO9|N`=Mgq0u(V<`}4dePKqc_PHj*G1oM(R7aWE!lPH< zAnRS-iQ$z)KV?YiC;idpaYG!Tv^ehDRki6u9y}AIz07i>r;BQwP;iYNW_b>_Spmv>Yn@m7#knV;ZpI+uISj6UQMYBIRr8`$T;^JP>^ls0TvDvsPLP%0D@of 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
U%SV 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
@!?=G>Fw*T`|!0H z4{x9GM$E3Bq!SNiu&bF?Ool7~yz9QX{n6K6yY9Mv_6ID9s^FBnger>Vr_52HSw>}S zj@D3(-Gqkvjzfr82e^(-5YeP7mpTEj0D)x<>(lmQ`lfvSlk7N3*S)#CnRe5f87wV)WZ|16X}$FbK3n)A z;nuf5EyEfBy!tQt9fZpwbh=x9`qIZYW7Z~Gm2Q6NAHEj*418GZC)kQ@EI6Xx%I0#j z$9kk5UqxU!Jt4l23O1}sz_GZ1XbDmHvL?}Sp64w)*h&Lo-(>ye|AvZH1qDA&p%gP zRJC{ax*cn;pF8)~dGj9j3Zn#Ao={ql{U%Mhp@bXnJpXOVTg+^+PC577a>aP{)<3=c z=9_PF{)B+_;_`RiTK*2nTg&MsMzofH>R!VCU=&J@az}>sw?CD2tJuI#e(<%=WGDm%rf`jnIuZp34>EPTw&iK%lp%s#+}GI#=1l|{0)bYWub!$?d}YuO!7I-3&NIq zXCw{Y+r!?LmT}rrB=xFMo&zmA8XDt1cYM(_snb2i_i)*IJu`D?#-rcHzDeyRwu#dMA%3FaJNi~JS zr)-7uH)=_c1W}+kG+GEU7TkQalt`BTS6+Dq5$i2p?=_7!sk@xJrS8~hH<>;Vkl}+d zsR`=AZ!Vm3WKO2U{yqwq0IZuFupAfBE477GHLJeSIh(H+N*r z4Och6gy{qMVSIuUxsH0AwYel=kqfI4yLjkqWH*)B9Vu3wD-3_oCAtpOV(u0cpV+pj zW8-*$RM8z>5w6gZI_`J2pK3ql#2rGCuuKZsYmCn#oFHLMwM(clRaUoW|Ic^6KKro; zR;^m`qde1Tw_uCE%UGvCEB=1MB`mrjVhxlK!|ELD?M+WNyIc`g5du29Ny1{=gAA;i znkja)zj-3VIt&zR)+{w*0mZTn4Mqn6so-vi=v8onbj7GuHl8l30xw$AGAzEH`ob5! z@J#K@=V#6Yz{<JBOQh-aT{Y7fn7^5+cK**j>9c$thhP-dHR#X{s-97Q$!`t%$eG9?KVnf#Mhmis!B<{^s&M9SxP%$h=qZouct=1C`2D71<5xbBgV0;x+aqcuXU=%@C zKH-=ca);ZGdWVPI&RXVyAX0ToWq|NAj^$*=2HYeB#A+~%H;(HX3@n)@aT#rN!rNv9pPe<-3$uB!WX9AC6uLfNeV=Qf!S>l;}6qU{Ltvi7R-!* zNs67pss<@}4g|1WpuLi>kLXn&cQpXP!UmQ>+$2or4C@$v`^M6;B}+iIG|)-GSeS{` z{{q*rXnf9*@L}8 zdj+tb+qCm}AX&N{I|}x!%l*>RYgccny}Nejrsr#Iwscq8(FFqGjXhyCMH4C@l2 z`zOf5l6whxrn@|skTfixJhVwt<`SCagk*C`08eVoi7}1>052g5 zm!T-Epzv=0KYw%k_Jyy_>F*cb1$g5pL7-rnlwm2`f)}$aziL?hDTmMqm|@V>N5pJE zrm;v^42Q!mcNo}0IO2`~NQH?XAzX=~H!Kc2TRL*wgEIk3Sm@nSRP)pegspGDbtXS!; z-tiz2Yq*{#jAJ4li{-y}rYz4>52IY(Jg@{z-An^2kgg)?+!g|cnfF^I5* zCsl+Dt~gf7B0GRp_EeBHO)ufQfA{4t{}q82GOW8X754e()~(x-SDp2(Z)I(q5BT-` z%$>FHv(}r&8I~m`6C!>Wzg!l>vVPhxaFMY=u`H12{>~%Ip$Ke#`Hfij^5x3`sHAT% zU;f6`&BH3hOm}2h=5B>y{q5JLG$UO)5373`hJ|(9DA%x~F$O3Lz;FsS0ssnh*gi?9Lanm+Cg@^=M9@h-E4XiDGe<Nz&O~bHo;@1^1tY2MjNr=iI z0y~f@GncS@%!kDj_;@Xc`^ZtM32^`gx_z1RiYZk-+|Kh!edKbd%E62oe|^f&xH_3n zuyoC=4cbbkRB)T#egzO~`@&2+d&+PwA)SPQ-Kg~1_U-?B`CFN<`;y`xE#Yi!(vnbc zOsTi~jaU^bC85JDrf4e~>QB3~aV95YR$aK&g&-Bdlu)OW=ph>SYl&Y&gLmq!>;2q+?e5%?Aak zkD0J6Tyr0wO+xfFbfycgUMkN-rn+~zz2P9=7NjW@7B0G@w}C?z&ii_`l_If1vu5?k zA{Mpign|MdNT9QoN|13Y1+ExcWlu)0B9~xTHv8!4zy9kV|LY&0{F^V8mv4Ih`JGGe zyYIg1x2*owij5CEy>=sNTD3d1HX+^H#%v81%LG;wzg(t`C*CV?ybVo^)#nKP-jNgOCXhL?ayZ`}T;zXrsLUF=aoWJ>Z8XpKtOLG5_^ z!AziZ3j75aW3#Ddnq1n}p!5@}BrLz!8ie04fFdC%rb00T1tHXeT}ZExS|QV-&3a^B zZg-j(3~O^Y={s_3<=$t9%Gba(tP_;C<>bE6I&I4)Bm9<`0FN-{5-=$ba4L^ihk3-Z z@+JsdhP%h}+r8dgjDT-xX<= zg~2GZYI4er-{m3loAWLho1NfF^2rNrqn)fK6nH-&P%I=^@LdeG2b)NBM}n0}cx9nU zUvD1_D55)`0nLmJw4f|J*9H}0SCFe!*~+~un@jBsql5`yb&N491gjBDQg%%*u{`#-1E!(*H>3@6@NY~EiYhCHRM~|k><_ya| zIb2?|(nXu>>=kJ$4Qpa|4qp7+JjxKO z(eLnQ17aN%-663xRm?{DC5#L!46KT(L%fP%k9ki0{6PIl95^pCtW#7J zo|5Z98oEkecP3$(8uU67n_W>_S!zfSt_+N5O_bf?>D_hCQ@I_CVKta!f~BVkd-sjsh(7llBv zs3;sP6nHZsX;^OBxEKo!4+olD>w%*i>#wZ!iQ%Q#gav=SvXr2 zD3*{N|`m5@*lW~()=V&c7TuZmikhE&Ou|BjWw*&Cn3au#_90LWa@n1R z=O7GOsp(K1!_L3eR6&^I+evEO-Dk4|e|rWstdeQ$zoW5(Gk&*y`*rYNS~BXhG-WD< zN)r9C68MDM|9bn3pW(kadx?mbYT3H4p!u0=STt3Yxf=X9*)G)`@{9$u#UMZyYVC|v z0c??w<&K0!WLWSh1SO#u@*d5}p@9-OvqC$;h{d-IoqUcVCNhsVka$&Lz`IhWVliGN zLl&%#e$oqndi%JighsfGoo0BTY+NDmbVFKD9#3vwgux1i(43kIIYT7F|1=U zPI1KQjYOtnSU>!$FT+~#^&dA!v(}cCWtH7=-`sC}W8S=b9su!4tCmrI7i*dY zA6)oG_r&G~)t8l~*03fk3jN%O#YK0A*a{fr4l#z6imt~nmW5&5E)*l~u$xXXJQi`2 z%OP8IA8l{1J4r)!8tO2_y%Cue<5#EHE+NZmXvA$oVpuxL+)@B5kAoCeh6Y_Cy)wkP zmtOyCIop978x-%AN_B6H6Rjy3mZVPDiwQ;ylmg@uwDltxz+ma`x5TjS^BV<<(5F!l zXg6oB6l6Gd-j&lwyM&Bj4RGUVrwmvqyNAb6bx#{!9BQK6zWCT2KAcdN-G3IuSzp-y zj83d`gjN}ZTcKH@u#8pm-;W$ihABG5M9E5#+amy)kzV&S49kB0M}Gy7_0Zou`Hiw0 zHf~(-blJRlbLY-oHt&|zkN^3ewP#PZrF9{-I@-1X@M>6yOHk~W%1&o&N(sv5?+_*{ z3GK>1%ZR}Kk**bn6`MM7^re6JLHzjXfD|iyN%g`@AK&=N^RVo(1h~Q-1K&VrVRCYE zO>#{Qzu?JN{84;W;8`I*(9~$~;%Lmt$;ioB36~9cw=!ephLu16d39w~K^4w*TU2D` zlkQa!y1=mRt&Q3&C6;NzESmtbGUq(@r+?ah`_E$b62_uRN|IQ=&S>|~zPbJ7-z_{S zO<};M(T1@rWmsryz+f5f!vcmCrdki6ixq`ksIHG;8!z7^45O44CNmc5Tp?gsXKQQO zkex=_5Ol;H?=0y7Ut>OZ?f7^DitQw~8?Yuc#CHU-8mweeR-%N(>{y37h+?%gm`uuO zoOsWWQ{7ppovQiS&h1qaZ*a#9As;pNx;o7xj&Y+|Lcp?G03Al09vtE@C@7ifqKl;v zn@0hptP*EfeSDV?@XA~$6v~NM=p1#!w+-3o@ZyXnK1db$l?Bi%K!d*C4lw5^dfidQ z!seV1)37q=hF&bBSVA^{6_tb{b2GTaY$8<{W8xKxRw0vtG`&gv8;^Hs_p24;iU@}96frpZCFTI1|cYMFFtRL<8o)rJ6#e z%(rg;-STg4zr8s&nk2oBv!|Mxn!20pu@`RNzI^#NXY@~Mzb;9dhG9+B{5-KW$M0~8 zt*t>Q_29QGm<@>4iX1CKHU{)IM8+6mMQDpKEktH4x3@j#BnK=Uyy|4_IE-L1pSz>6 zQSO|~39?>fK5&({HiO1XW;*p_zgf9PWmR_DBmRXnFmVD+=nG7 z8GgMZt}#F?ml$@pEk4Pt48*W3M70RB`dqkD!?Fvhso5)j`2Lsv8UQQn>8HQ5<(7K@u@>B&e~eHLN;e%3Z>k%h~9tGr>=Z5WD6zEcz+xRt`CF zbmA+YFb@kkCj%^kD|32sQ8JuG%E>Rv5x=9eCK=ZvJZtb)MAwvaGtS{DuNmh~pH8XJ zY*WEn6#&<|0!`6qw=F=8%xnWMdh$#(YMG8;@m`;%H*Wvm@4WTR^23s)ug`9^+kf#3 zC_b8QDu48i>j1|_P+dvNV?AwLsM{nf2Pj@ zIN&vTT^M8lK*h0v`Vwb_W%(Tv7qI)r<^u=3(*jn&(z`78b!V+?x+(M#E_m`$1h`lc5Hlv1E6@oY+7?$*5hW<)=l^-VhYoa!0~r+}aK>1@$6nS@ei~+=~pW_5gE8 zQC^=zMlD_xvi@hB#5GO~i&un(Y6CeN3<=<5h#N`s)Jj%I2aR3@iq(J=Yr;06x{;6x z?+ufegt*5N$jt1|lmv^_iVjfxp8K_fgN_u|-cBl(S%?Ut=M(5uL&C)#b6LynYOy!+>v zZNR4@9*;=w1j>pbyh4MPk0yOviDM}Yt3+uf#K_TfU|8o7uOiqW5Dw+cPm{Q#fzlc* z=xZPutC`8}tp{6Md3O#@e?CVQVFrUNpjcr9DHp*MzjG;Ei`~Sy+8!?lT_f(1h|4oA z!-`2!s&}zdJ8i2sE$m67yhK=Tc5$b9;WaqIL3JyjJyFMEMdBoQV*t=VFTa{%mr%wm z)UcFBookt4DPtz$Qz(>ofo{&0rb-IFqz{XG+b{yp+<6?}YQSthPG{k9xE_ZGc*kEX zWKZw`9`uMl%AOY%9xpTxWzQMP4z^|o;popki1&lZz^-aE$yf=(0)nNf((FLs0+zL| zvd|t#f~qipfD|};lE#cHgHb27hjJY%dG9V<&)cL|xX zp^m0VtBXRa2_5oQULBT%v^j_lb}9)C2BjN^b1Oqa3v`~$unu+P=H_A+4Wn2zEVWTZ zuM!iICl}pc&+PB-e;WWRGc(fy6ic!VQl~reE@9B+FpXHzKst0JdvMU@@_0QSB$H$4 znH5RR!mJIpi;S*@zIeI}N?7L3!cIkWA90P)pN;^`rwz}~=~i|Ln*vRl@~p2we}Hup zwqghLkyno#4l^g#3=UaX6t7HL?(p#+SV5mSLG0CahwD8!mDH$w+;>JR%l>Y2M&A>eGQmGqtzzDlT$k(vSD%!D{~G4 zR)7ENuV-djqd~hx9@h<5yE$dt;WGOyw!z@BkI;5jHcQ_q!j+x1 z63SLA!YkIA19+9(+uKWj5_eeL;k4oPi&;#A>>DMXg{pht1-T@gqqGywniYyOtQpjx zgWu|7t_a$?7-}7(Q-Leyx@by zS2a~^q4Hi-wQFC^_t#bRNj9p~0H&7Ky@07&2rd}5Tq0Yke6j{r!fxHiEAtp&agCvno|^Cj8nPuP%};l-C^3D~FYCB!pf428oVr&uWzFN3-|X;Z2Am@q4N&uoG8 zb*PQTGPd-LdBWnD+XGbteq!sG`*aRV`@`-WlUBwl8MLS(baF_+T|(+1%#$^D8M5-Q z$vIB5xPFxvHb7!%j2eEiv~T=2yh>1SW+L8vbYaR*(78P3ra#y@5p)LXF$+G zJ-3|cZ=xV9lHHpv46ex9zy{|q5$kYk7@b(Mv4K&nHgvnA@(=GF*ig+&Ln;p=qRM+k z0v764Zh|W!Tc~42BGWUhD+MfT9Ifn90@;$Tq?b_fVoBE&!i2uj);D_m{=(QN$-|;VL!h&L=Hsf;Pjwuh-Hc9Y z;91f3rCf8D`H+t!`2-UvJcyYq^Y*M$gOuv=o;|xOej$~_`*li4YiGb^Ndg$0-szse zuxOVso{vmLA#M_4Q!|S0*+P&?Lvd_&TB)PL;D`$Fk>T>kLLN84n%B)$_Yeat3air6 zs4pj@R}MBwl^~0|8tRZ?am^hKq?NoT)a&K224-l`$9-5_&C)Z`T_;Dt(=0Fb4AuCB zm4uUNSk_E<)5)|#Mfke(x+N-(T784*>D&ekXe1cZ9V3E}E{HcB%NAT-My|-#K+$Ao zeER`bWmoc%tun*vB-Ncd36oKC?*)QI91AFxyQg@*C{LfrWTEcNNeVR~%N=bcV*?9z zCtJe|r6i=V9p^eC@DvuDqe9s6rEdn$dnO^6IDU^;7y+T^0pc5w{9M2@Z4 zKwh3k11Ocp;c8F8I)+(r$y=wX$^+Jx6sKfFuec4Xq2quish(1X=HOE$TgGHE z8Cv968Kou!m?~{>8udW3j0jrwi(9lP%j*(q!j3~7Om=Uk~}OHDrz?m^eK>KK0fg{-j_hJ z;-3Tn1t01|q+%bo_4fz*0{~W}k_Lcf**X{16jfA=0KZz2tf^j?w{G3Ky#3GZ+P@cp zrC?9duH8jD@{;Yg05L3!5Tu{@fRFv;lemR)JQj6Gwakb((m>w2C7J>REL!XG3JUhH zhxp1m%@R#s)i0zbwel69@-lFxJ}f02nKLXuCL{-$>xzg~wt!B_Y@@?bs&n;@9Sojc zxdDiS+gRfl##{hc`CN(*=eH{*VZ%67@yy%Knh1$$IhDXYSPf7KqU25*mci&C+|oN% zZFXRk%s3!b#qjpWj67^KFV3=1#LCqXk!w(5M`b>x@{IB)lQJyJkU7)bpNW|aXl<~$ zB&(%QaM5g1n(R)4{jyz=5sw$i6&kMw1)h{`=DH&xmEF=8AEHVOi!DyEkYUMyHRc9P zpPwU9!?QxM0I#r}P^k%jCVSmc#0vGODHe{U2zP}u9xevdTAk4rP6hHysTmO}31y%f zlO=an6%uN>;dZq(EUWY>(;5=KKtjsQHOjDnN~Ow%d=#~AA0QcBUR-sjM*~2t2H-Mqe3D8r0pN}g_{^kU z1%{v~1nBCwz0e;pCl@8xjG%l~qp94zd+)AYyU~iUyGB#6W8EH2)wYUVHJZE{WLG6V zAu8A`LCn~*(Ow~8mW}CIvUUznVx5)iwk^@D%i{|$u&SUSZym!f*k2(~S}q!BA>;5H*vbpsOLTw3p^7M26ru!$=VikzU7E9KFSS4Wjqx zdqA-cVB-wdgj#|tN|eEws}54!8)@_@=3yBcN=s?)&tRxDXthS|1)am#(x5~0d!F8r zKdy6}UwpDorv+M98ZQa;XvD&RnOq%CqF~dX8{>7M;=+=BSd%j>v$gMabH7!}%zPUW zOAvrtrKIrCm~w#+x zryXn;Wu@JOeC}Uk^hV^Oluo5U*BGI}wHLO_bz4Zr7#-;FfncQ`< z;bcX${p@&MZ;sY^sy@A~qN^o6E#<`G+T2FZ*_PzX*02&pcZ4guFVSsvW1$&001FET zju#FnPjNR8feX>A5FgMEB3=ggE+I-^S+ z5%B~HyaF(hk(3lyuhHlzO>w6k<<8Nt*ZaiG1Ds-wlNC!vu`XyGvJ>5;tuxgD!$MO7 zZ3dQ>8j~9hTAiVy*Pz#bzqG@sePaDeQ+l$YGXfTfJ)#2_Pa=?tPp3N~#@Ln}4 zbLyE9YjPhJ#=-)_vZ5DjPJd>}RzZ%q!c3`S#{jIn#@-040|z-;S=32p08*oUqg=p} z`r<}+vNZ_lh1}`h>yhya+nAQFpMOvmu~_tIfTn#ZV{>#>#g3xtT~!5n1?zS! zG3>3;RCQV~1l%TYcOUkGiRq&JNEswRd6MZ>>oi46H2=WCssL}>G#Yxy5o`|tnr2;% zFA%jw18gRR4ddozA^s8?mV-@u=EREIuoNHGDKXe3Gb}6zQ?Yf@%fQBx|)5`0*M;DOca~xYr#utX!P_%otXDXkr|^WV$se!^#{QLe>54 ze#Wm{V;(l^JzYSwa;JEWo_PD<5HAE1J3tv!NwVZF^~KY$$krez3~PiVRvNqu3@?7_ zCaIYP%QUeBKVn#KQ%y)2ek5WY5xMN1uun*k)w;Tv{Gs^Pks1!=0BFr$U!2j_)!Hhi zwz^TwB8Elm%FT@pgke{mVSP#s%W8>DA=-bEsX2cc4J-F}TZ`*#MeJnq>|FaV>xFxZ zx);~PVr_?#V_oT~P%s{-HT>ev#dnulW1q-}WdX8oiQOo-3SQJYDEHzd^IOrx=ADEm z$By92mXFr#SF)3fYHE;R6;|Zc?A}#bQL%$M33u$>_1s+I^f z?JKj56@V`(5l@JT?rC1d*MK!4$16T5`hq;&1__pS9Cryz4KiM79R_Wru{Wgwa4ALG zV0a%;OPg+V=;8I6itj^FXwa+1=NvkKvU@$%geGPkMZsM)oKVZOGRkzH6tJ@A%$f5x zpjGA&P^z(B^e&KYbu5zaO-VttV&7QKtpdDK!oO^$t%v<6FGpQR~QNLEfdlA(m7 zM{puw)vyj{8OnJ3Gxa>HV2xj>ZIE4H9f8|*$(rQkYODyWDmA`2j(uRfxhpzO{+0D+<(o(1rako%b-kFHSomk^C!!oJod#ReBCoKsx=gdJD zRzPrh#$0^VJ8lS`KIQNmJuJg4vvE zJ+(L^)Fp2qMi|pl{O(toVWEg+r5H^0!Jb<#tFz7`DSt##{o%i`gmonv)~g2!4|c|0 zIC-Gu`0N9Y90Qbo?FW)mf16^D#b*EZfa$m;*7aV!wo_`Wzf28lLLL_Vq}c~*R7o*4 z8qI`fMH-EgC{v?Z0ylVN3B6Q=Cy*$@xRKN6X2>B8v-oACsG_DC;4itNs-|+^{=4_% zdTxJpRpstoK#M9hMOC{sm6Zb)+qA3178t@|Uba5`tC3(q4akrRYC-aJZ7U$6Re+!c z_fQlTE!vhWh-0a!UW|=}yT-&ZJmF@WUc*WlKjAQ{ZCEL|NtjK56`>u%sLLa`Qaqx^ zeQ%`Qo8w%1)^l(B$=YEd?dY+P_uT2z9*>yM##njV-`j)?3!@aqDJYrG%5gTv2icea zwBUnCuxPRb0TwVRN6JXb)&{MkC#IpRup0a^`WAt<;a-czTXPC%;&H-~b=RlsMNPzy4_ z&`O!uR$y3t6o|!K4Loj?4b4%U?uv+&7CM?U|CygrEyzsnna#XAhcm3;!8vSp4h~bL zoa7#s*dRARheB=Qtoa$K07YS}{leVA;KGQkp7P?w^MPs=4~M$2qe|%~bQ8zA%DaSo zyyK+HDp@YQrurnSwdx4l)6iY$;O~cYqv`n9erN~#TAoNp7s8B2y+av^rg_&t8N*MGLX9SV<+&aGVe=%Xw1&x^#c#`3+x^*D8&YC`VBVt#il4xNokMTm$s zK28!AwGujdO$MXTd!Zp$*P`3B318iGNI$c|QP;3^wZUN0>2h1f9q|a#LqxF-P)_nV zS=~))W+iLxR3=WYVOi2ekKf}GZ01gYrtD++r`k=v2lsx`lOHJY`sWs0go+B3Y$ z4C}wkx{^FBIsOXkUWrHU#n`L-hs@3bv0|Sr4~que`0U9$G*@BORIgO847^m=RE+Gc zf+DhNcXds5B~@&@_V3>fh=sNWAZXQ9n!U*uu7ykrRV56{a3D`%P0{}X94abWvJLQQ zn`Rr(Ex2wgDgwyDC-8XNwkpjw47*u# zTfa%C|FwSS-3H_Lbf;JDTe)(>h}Njs-Vb%4cY-1t8kp*?EE%z!%6!5}OF|pk6#!5M zZG&RuH2fzv#=&ZkQ7fCpGTEp$HU}Es2(cuTn0zJmSya1(W;RAumaxtnxrUX7Q9PlX z#ZMK>Zc*GKv;>;@^yfhTi>htH*29>S9AXqJ<8(&PX`Yk}94j>I;qo?-Hve!2H}WU| zuQAbGJS-jqt`!vBr*qz$k6L_A+hN@0byK{|RcBcLP2lQU%EQ8eHhq>@A?E3^ZW(rA ztKdoji_%5q3*Dbiu1K!jfj!T=_wV1k14XADd)DpE+rMjX)t&-u&M{O}RZWgm%0dHa zi7jd|7cN2+D!h5k8eml0iV&ZcEW+Y%2|yS?7o31vMcbetEV>asb~fs$@oZ!yT7IKq9fhCpNJ!o#glcK))~y#@Zm2bTe`xf;al-F+dL!b>{W%$% zhgY6{^t5|SE(vqqtL0|*h8Cn)Yd4-cQEZ^WD)PaLQOHQ{tou^W` zm3>ecWLtuWR8wUDF%yYIu`*1_l9bLInPCYk#PTFCtl{Ek*1ypdkehRmVKwm(KOXGP z+6j+fRTxIM`#I!QNU#X9FtQ=kwxIms*?>|a_biM>jv<2z7q1qXAB%#Mz3q$Fujd6K zdq?@4VO{fiSk$R!k?b{lG#IvCRR9-~uo1ur!Y=o~vzo(|l8d}@<-UsK{+MLEZMtTQ(0qqVLJJWy`uwBDy&&@BcM)DE%jS#?E01~Ia&Jz1PRGncY@4vY#e^eMSuqIg>VleJVOT?H zDee5_l{&OWt?vEz9d+M(8Yk)KOG^>3cuS#a!~T^yD~B^yp57Ptj#7qSF8fb9bY!VgCHE#0PxQR$-u7PQ-eV5DRnNNyR#X`-D6c3rN;*#xOFho=_<4 z4P_JqVvV`oG#(PFLU==oh^`DEUM@5?L|mxFyM*j9Z_eWN&)^Q?tXXZX;^z$Onqydr zJ}im<=-CH=?o<`*sRGn0zzbp*J)taPHF&X$nuHa^?>B6a5laTG4W}zAD)Oo{$yHT* z2(Bp59X}UpI(Sf(S6P!+=qq7pVx9!BkbOZ_SQ0R^Di3i8Dnbon6cDT>OBNN$fVE`N zl4nViUj!GFunMs%EGjey0#Wz^HjY{W+tekYL)DGLl&cgaY?MVcc!X3wWgS^<4zi8HSGkH6qMC3R zNY?3|VZbZ=PPb(|{P66sD~$6k+?28};yX-nd6=q09)g7icOhGJ51&L?YyIMk&l%RI z)v&Gx!A6=iX^mRS0pb$j@#f&(uyc)^9P46p#o;=HOrqd*v))hpxNiqD>?uBfQ4 zTvtWIDd=lyG?kTkdw1;E0bf<4*{iS7jJ$3hC<&AVd{AYS&|$-;#IBHEm6-ABGh-=O zxTfglHH9c#VFieQwFm%e4IYaKvz8!WEkWu9p9`M~Y^<=bgoLaT8Ly^bSVjj6lYvvV zjXEZhEPtaXn95xZxX?E?<^eu3mMwBeyXaZ!_2!GN{A1ZeA02afJ+3jg*hLHrGyD#* z>4aDkI;p1*O;}oG_ym-Lbz~c53=3eXv{#$b>+owEv^WJC7#5#Mfvtrt&#k|E!?}zN zrz4HTyYf^ND;Kv3sh`lqr$5se==k8T#wnfd!q1(~Mn6(3;#N$xLT(k9Ot@mSN;RfP zB7YyYeL*?Mr`21PRzecp3*!|baV!rO*=g?3(UbF^$!I2jd$T;Dkj}u{%?G*Jy_JVz zh1u{NtOC^3@y$% zx&DmhbB1-TF{}xBST>;PY_j}~27MmFm0^!+RWbZ3K=`U+j|yb|g$FAg<7J^{-^!H} z%EArFHPsb)fLO^j8qJ={J(ZPJ09AYPDl2yYcI8#>sHqr)A5f~*XuAoA=9sxiqSS;K z0C4jfRHfFSI90@82_Wm)B}<-Nv;;l^$D(Hmu(mBC*aA9Mh-?f#Qh1{e5DS0`a4-r` zIF;zm;Ywjz4s{Qq%&=TRk&VTPqy~lT)L?cne0Wx>I3@@#bcl|5M8VrWCisPH_p#xe z;hZ#&$e;`uRt{Q6JLK3=qF7poYK%OMP=%t2Pv>#m`9@mf)0SE8Zmt{~&=$ zRd$Y6GGws{_qNcG9sLZ*t>Df|j(6EOO6fA4)cXvGWn?v>99o*zlXJ`boP#J`VNwHc zDMV`n>nA)Y$N06zb4PKDaCq43^^iIRa7DA#yuh($0VK(N)vy2*XU#7b0lZwS6-N&6 zgNkuOMz+uu>HeHyT^7Uo-ODdqFm3hfuQvd&rpv>^94em=T{AIj&0f9SPFx8GfQxE< zpP=jegj#zF_Qc6ofm}Ee1FPP*ePz5Zq-(XNqPjY7PXU^@R1<0dwkk9giy!_{ z@s_10&cFL^JfVcEO%^#c6mEr7;-P>Ac(r6(5m2jb8YW<^!E?>CP#Xe(Z6hdKL^a`> z!lJ?(5xF`6uu5zeWLQb?g{RQ4Qj99lay)>(&V%s3|s zLBWk#er`cL;mIEZ;A+drsmmEgIhmD&q2czr_h#0|akQk2oIZQvkk({W?C$zn6x~@nAq&Ma$?U3; z_vn}!d5t(J!y5Fcb_AKmKK&@81cqe~<_j_6Ry2yYk5Eh2u*~ulRiz>{DixtSE&piF znP+ldZRXBV#;`J*SUX|!!Ddde=3urviC7_AZsw=*jCkB0ZwSgl3e^XWHH!gOgyU7d zH`FsfqYL3`4DIb4wZaiGRK65wvr2UToMBDPus;6P?JvLi4ky7^cfGLi&EI8AmxmRA zYRe)4?}&czK{WjWmLYmwo?dk@09%&_B_kkM0*JA~5zjqTHR7t?SB`*H4hI5OIY3s0 zrm7kWz&*GrSVes~dv?HQ?|`qnx2mFa{ViWwz44)^v$Ej!!>p}OpHFpRVv9?_ZZImk z&^jd)LV*Y53L$Gv5!HbT!`ik6YCpiIMb9F|TC@#4ScqH1v50)FDfC$aSY?)=N5V3N zhUHM}?8X#%u$SK$j~iv_eY_+TNOljlww@bqPZPzcjYaiEJ?+BTpNkQb(>Y#$^5KwN zKDs@pRNI90*iJ}0cQh&ok;_CiVI7dHx^dbO0U+SO?NOJ)tRo- zm!>ypd;JG$TTJii4cZntB$+1X8~}=?qb48<#p0n29J1)b@){;(ST+~#2$Fzk=K1=Q z6@t=5kR{RUF|RAu7jGmaXM>OJ5;9*yA%m=BhF3--AQs;yJesk1eonZbd9X66Dx{i_ zPgG?TYYuG_9_czlKOWeR?Q)O6mpDBP3kt+gK4w&hhRYwG<>F|C%bS)zd~Qp5200xf zlrQ6EmQk0xxH#h)`wgWH2Hp4YeO#|Mm8^(>;&lA>pcVih65ViXID!a~5U!hsSC zFETBFSySaA^=m}-~M%sQF_ zRGMFcT1j#}D9P6BnC&US&iEBlEUUH8D)EG5IS)&acL}K^^derRk?QVUy7-yZ;e(Wk z1q=%<4NVNKP8xfu)IB)o2Ken#=bZ4|`7RzAFR zv}Z$kMi)-$VG#`x#=n4K4T}-?=;sXUav0XfFWvqoV#{Z7zS*AmS53&nLT0u0@ny@F zJ&wm6kI$R;_`F-;1_!P`-$M}gzyl9001(@_@$CEWH@t6npG9HD2^axbC4-~Nef!H9 zW|i|}o z{kT8ho5nxcop##Ue)8^Gp4dR?dc?4_jz+mLhj$V-G?Z3yz%l}>G8kPq-PE%(=jY=c zrLL$Jr7c&9U)NiIsKJq|FV*TBHh5K0$<&s<7XlG%M+Yho!gjk4q(N31EF?(s^{ zHyu`472S#xE<&u>$ulu11W9QJxcY@vvi9*jEUsat)6|^a^j_l#;8luotCyS&9$;9* zi|3zgYsCRyO_<%+#7UN%i4_RghTxWI@!^&-va5*4>m44>$jQhcGZxw1L;0Tkw0!T; zjPi#w!V1HJuMe*cZ$ZS8>p?&*_q!*Imot2G?cF?ji(R#(+x(FShQ%gJBq=*wT#~k&3-v z`aW&L@5b_R-~RpO@=?Bj<@)mSeN_cJfM8YbsLtD4Sy8zcXA|b_fSSfxKl{7)DpQOq{Rd*1gD#qtYH`?gBH`>QN$`rP8U*B z<<=a*a*18Sl=yIZKO0G?Ff30HMfWfdYER7$0)Pc^)`2@JYj4hzTb=&8I={>5^t<4# zUS)Mh)&0H^3RNh{TUH#^U}?$Gd7+*o3mv@F_Elt zLag%j>(}qkV?hc#_5f@la#3ZtrzUH~imnv|R#{nVS72ROR<>g8+E>dqE{NLXv0#=3FhebD|7Qg0M4rPm;Eh2`6MdXb)Y zQmr{et9V19BVh!^g-9@)G^{WistJgN12)lBEtJqEfh{mz52OjG64ZiTT%2KzQ0Fb_4N&yx9((Hgo--~CkaAD$ae|#EDg(%qBZGz9Sz0?qt+&z*Im##Y&ORs-TTHy zy~Ch8gc(_i&t3L49O%fc#{tj)SmP#?vG`vhYgoKCoRneV6r)Rt>{c1BBsn3GqgU+S z+Jlx+#3*KTw^|jeJI@>W_k;p$VvZ%#(xeVHAnYWx z3JTe+;*s#|k7msxpF2majEvK0a=@A}4OmtPI972_nkU~wlOnzD5Q0+=AXYfyVUUG; zitte&Y4gjwK4(~$$FOLx@IT>z^Cur)ofE$tTwj{__aykRx&g3~?o3!8+@K8VcRl!^f?)Fyz#fOYc?`kk-FoXix2e}-w`Dx`SVqQ^8C#yb{mGu&p4^gC zx`V=C3f9RXFuO|uq`Fpo>xT1yQe_XoZB^StWmykBgsX=kiOcJ@2{`)ICInmRD;f+YA%Zg~j)pu~6QVsUf()zuJq+>d zkS9^FT|&mLkYI6!)nI^_CKECZYk*tb zIl)Rc!t$i>k`PYs(X(e3XM`9^*<*Gb6+9|Yu8M`d9Z*OlZzn_>)-2hGbsA1$SWps% z7{dyAkz=)?q6H_EiKuKrRk*r*xC?4QDhFkX)t)iG`14)D%Vk)9u{9wN3-Kx`>CX6} zAlScf08?-a*6;EB03i&j$7K&bDD$sncdWYOj&I+Aw^iR>_3g*L4UmNZcF(P_<|3@k zn|o{70!J0=&4F4_f9TNnRsg9={Z`h~SzTpBw8~yx3v4Uv>GvNhE9-h-a~CEoAYcJ% z3BJyoixx5PS%aul#410k2nn(l;pJHwu$C0@im-_O#1a&-(nUF|Ve*pDsHJQ!phO2)ckgX`O!f9oY)MAKo;gSiB@;UiVtU zk`^*ZF~~yoovJq4B&4`e7S_NhR;jjk#9?%d>%4WYs9>}CY=Y03TWZkiN>f^N+7{Mb z7;h)kchur8Ar63UAr-5xjunMGRK|G;AC{bk@4JMCbrHjYTkPbS9|!EC=oZC{WSUhk zu{jh2d{BL1+}B_n!Tfu#U*0G50ALjtXHayVya*mqy^>v6Kf`Up!>vccN6mRJ`EK}v-jFw=xV#6xE~#2@4UyzU97`?}BZy@oe|vGcWom{c{a<*SmSO#+ zR$?AjlDrsfG0eiJGJYkgIoSOQeBF6J$1b8^cm49~fB2t&_`}!bwd(7K0ln^+cLze% z^>gRVoqIhT^XA>U>g?S+ckcZAozJa5b1xv&+7;iqp{(qe-@4)NZoo}Ks0e=u`1LeE z){3>8H+KbtLJ%R#CPd-Qx%1}qqCyTp&n_XkilB)TEV@#;cr&T-i{P_3!79AD5Z=+x zi!07S9-cp3y^i7#fDBb zfJj@zA+%{}jpKl`x(=P5>+S69IF!qVeW4QzJ*un)+Qixw&=C z1)u6UXeZ5`?GpC!d>J{?eQ<#Cuy}r7FEA`Gm4xKP@_2@G&aB>29HKAVgcV_cEegbX zL9x2iaKcx^N8(m@gsam~5%y3`=yr!tO9ze>$|x^?48CxF8e>>Mu@JH5Z*jXvIK#rK z5dNuha;9;*+y1Xx*CNB}?oR4vfYqI(S_D}NXvsJxGcXyzk^sJ_e*AY_zr^FNU;g2j zf4J)paQVa6?*f2Ayi(R&#ID3JanB=uLO^ zdIU-Uq(IZDnx7qtyIo0lXMqheb~!!4RMN1*k*)|QSgimbK_Mc#gt4)%uAomi0c-(( zE#UV9-r>{OJ|Q~Yy+?DLIGj+Pr&`Au7N?-T*JaS6b6T}!O);LcmTki zE?acukU?*#K>dAOZy<`L8l9tOfeo}xNYU=ppjf9(fU0SF38ksg%9j|+pfD_}+?8{0 z?T-U|{)F8JcdR*wOIQiJgvoJ+m4aHI2j^t_b8cDOQ~Yo$h03t0&*UK`pJKntBBJn}5UO-vGIO`QzXJ`(1ZE zxa{%A0j}oV$CnIR%T|B!`I%?V+`G1{3+lg(Y2UeFMOj(dZJRegwlQnP+Omxg0m~}; z-a{)s*nAHn6+g^An~j`@B?C7W7XBBY)*_5%!0o^yrd$zTakN^rZPB8ln~Q*1r6adW zr|FphSb$dn67#1J-5tDt&=JpYPoP?Uhr^A46{Z=fVK`E=vr~hu*%Z(xl!%WVUKO<2 zA}2^|N63OVc(_LmE7Il0lCZt5c4qB?TFk_vHoy2N8t&>Z1y2C6<}Ta()H4TeIs2_FpjJ#w_4!Ju@&EWhCmVcmGj1K;oQ&fzZl(hl;8Y>n6KRlzE8T^Vbv}wS zbfSbkFf6TZToBG@q_v4Q zpW_gRC=#&b$NX}LH4|d$Xgw3LSlbV$a!!+yk=)?=1b{UO!(s|nEOvJN!2m#&WVc#= zfzxvA$g`~UZ-!|Na;7`eu#$;k8U3CVKO$BLx9b3~hTDsK-eyR}Em$mICeTmA3FTmS z>drwC>)b5dC>*B51{R9d6Us+pdz#yel*+plIhM!Ew+iX)q`DcDxwjyiAce2V>+;GEMAXsI$Y%F_d^KGj)X5H{KR)=L9 zSNvwxmf0v`MRBrM)aGN5g+KKcvl(#9*GD6}%=l`F*=CNi&|aJET{z6qXlH!(4#O)K zjkTcZ7Qv|*7R58fBSx{6Fz#!>PC}>w8D51^!@{QoVWJq2l7zA0RKZr_YDap7J5N{? z0?Tq^8dEp|zY*>2&I2=R4;`rG5i`JdoD8nCS~;r$Hwg`D&7C4;3~X|}L$IZ;esZ|W z=1XVZD}`GrMWNmx8?i940V&ov-zemUcO_p2$yUpiGc2oOaJQ;8Ec}3&dU$rQ+lma! z?n56I7KW0QCnOWYVv+8J-041o49ny91HOB(W!Zxat7mw1&X1c_SQTL9VgHNV>&`Q= zj$lnl8-=rwS262o4;xyKa+NzDYC^&%RNm9v9tE5bv7l01{Sm;Jhn0%(4;Go8VNqt` zWgOCfdxrJWON(yweHN?lzrOp@bUv)^xSfG1Rch!;N-P(;q++A9!H%V`X=i-SSY`(@-RCTyf_eUs{zK6yU@IpbD{x@XCi4A;2sIF?i4Rnay$n z4PX}Tn%m$QjCMxZ#4r&{!d{oh1&DOSZ(H=zbUv*6#oPqrUiHf_%x4|grvRCBce5L-mS}Sx#j5<=U05I3@XC1 zuCfKsZ^~M=YSr2mE6O&#Uxt9SV&mH1-0|e*Rz{HkcWj7EP!L+Mw!k}c2^NQPR2EVz zGb32QuYg1i62p2|E(wWYkpnd_9mAqhP&MP34x@@5K8hb}v zBg*hpy-cz6D(mPWHUOH5SU6FY6@^Y&zB19@XVSJ@X-Q~R57SmOEM}9E0%zJ@jM10? zsn0j+^C8t5?ZcBd6LxkEs4GIK39&oJi|x<(Y1ky=9X`1@V`;`}stGd{(H#j^;O)TM z2YLH*5J?se`@#^vbL-E{I=TM6oEbdEkM;?v*2DHec)!3cKtQb7=xxB-(@Pxd)Nt|q zjF3lWSWq2K!>}yIMu)OYT82{yQoN@e_k6XC#F`pLCjGTfKttsfi_Iq4Y;1qhCS7~{ z>|%!X(hnBJK9hiC_7gaPVECizTC`u)5+ z9t6k&qF+mfd|<)m1*PwDll@$`C@@UDw{ zM{_%BNyDNJXku6lu^3osRp9Lqa`sMJ5_-I;#B^aC?Hdpmg+Y;hbd#l zW9`VL=qS3_QLwWWE!!(HhcAXxtJ>Oo}?&Xl?JkRs{y~&Fe)VA}dzc=I$LcoOFxu5%YKlk%FG_2?h z8dfx>srul9Q&ZdmNhF<`VIO1bQUXcGjRGbV^JmrWFG(La5Lb>a7hSMbRH?*E!O z59{p4?5*sGukSJlo3>`duU3Xu#I69mPM!J=wIKq(+W5n4z$sW8va?rZWtC(xnuUP1 zVfnVo(e*FCw(X_)i#Bc9vUl%q_x^V0&KD|P_-*C3ZHsQdylwAy|KYjiKjC-9)fPZ@U4gI);WWbv%G!B{JQm zCTN+4MLu^D+uh-K>S$v1hT+vQFb*%h0S;MecuQw07GYUXqrq)LbGMY@M_qooEU1Bb zu%;x2#d-;+F)RtPh)qceqsh`O23duC{4?tMz_3ijuv*$|1X%IyL8?LVd{&0lKC{C; zYLNFkvlR=}N8a^?7B*j}X->`2=9p|KD1Ie8fdE?;YFp;HFqq!wCo&ou2o3Z>p;ijO zqp3J8?GScIxOIb)-Q_CQIp67X7(6=XR$r)(6!#1k*l=qOP^==(vgkP=&-?xmvyK*V znld>Egr-xfUDf$-h#su%Hm#l_E?{0E@G5H zFqvEcSVsEK0x-cXyVEYhNx*(qqsbBzEiSuJu)7f3Y$l_{E*R~`KN>OtF?cA3^|R*R zCtzK8Z{|F#CpN}cHelDrY{agzt@0)3UZ1HRPrm!^6Sy@6p%vAPid@~I5$vE&T_V!;A>WdT}c0d95iri52m z6C%UHYA`T_`-DR?F|2zC6`z3$Tf7WphjSK&)joSc*d%YpAuOVsv5~4D8=`4*I@q5%yGQvTV}2)? z3lqR`(k`Rhg=1{IVO+hq=XbiZue2gVlTp!mV_^r2#A4Ix`D{XIcFq|-J4aI$9`8fZ zJ%i;W$7iaN7Yo~SFt`t!bZDeH_x9~wz4x`fdv|Wx_u5N;`N_`8 z?|ic1mEJYW251HSLu6`LO9dfgR!FUYSs`YvMVTGA)lDE)JwrW~n-}3QvTZ_~TAV&g zHY~nL*b$hSVL9S%Q3sD4b;t>pM@++^b^>NwriySA0nMK&rou@SQd33I;mozcx<&_X z_#sf>*%ZqY)vQ?)ELPTZ^Ax`}+9zaNgyihR@e@-VmXc*gEH1p$IYTH(xJpju6=E{? zH!$qtR(BIJES@_`88hUZzz-+4WIddQ)g)tApVhGVH6mEe(b(U28f1UaviZgEc7ty) zmn;`KzjC`SqgfOIJ`@V6LvzD8Q=+sY0)Ukfpfd0jN$+fQ4$AH~cz@0Umh0{tkA#j- z%%PxUMzExkFe3w@DkM=XwpXal2s7c`&#S_S2CBj^|I7mzR%+&G@3PI^H45x}P_!hg z)lP*&Q1^PxX4-6<#IiA{!OI zmW}<+TO|U0@anm;tv|#&s>?>0f>pBP>8G=Hl%Vq+OTz4u zt*iGgs@zt&6WG+Y%Gb8+UAAf4YkQY1tK7DC+iUY*{>#-BpZwdpy_?hnq0UgJx^rMz z=TKfAidbt=3PDN4khc~Qi#7z=Igl#=D{Kp92MSm{jA5lS-)INz5O!E*V_0$BiaFlJ zgcFNSLRugowxxV#siZRoA>D9vA%=7%C%^?Sx@|$Gx_6tq;~6u#(lmJtbeGcm;)s>Z zM^VW675xaVW6?#obekv^b@lLEcQ%Xyy`xiTqL;OP6 zn-g$AG()Ke542G{Z;Z|Gq8z_Pw^~rI#xUDxX-l zWkatzv2I${S}=e9{CR{dayYPh5MBjCc{lTJVih=qC?x?Fr&!3afMP*OI6CU4%)K;Y zn%gj=h9#G-9P(TllCUlt-R`R?n>Q;`Ql?Uf3ANB^Dt-;YqKlwP#T)$ak{}0>CJ0sT z2&wLr;s>P~)50lf6unY5lCS`=avdVJ*9mvTOn6cIuciVEV8a@)k40q1m>3kthEd6P zI)ijLhy6fE6Ok0f5ysQ_u4~J}kHi1Z&N^QT#m6swV7y zMvpt2EzoqG<@d2b_e5h3EUdLX;;_g{=>ecTBbthgiv4>!Z^T_#t$a8kz}1xwzD;;$ z0r?uvxzUR?Qq}nw3v57&m4VLp(5~u?&XAuaGPZzss-Z(ay6ia zMOG|wIjmjVLjsni2QUjsmhonfkz+m8J-FL2kdH(#@UVCjD zd@TCfqD70Id1?OoeS3fSo%NOLUa8o>Uz4$a*|N^g&SgfNY1h8ivX*woC0hgVtDZc| zg`pl~ST`>Y^~Bi~K~{Vx%5~e-?{)XW8V%$5eF2O25@sd_6FR0VSb$hSumau`Map!z zibGZ#BUpq}WZzWDQeSA>Zy3F!CRP*DT$}hTc~+k>Qv=<&@&b<3qmE(da&}pEE3nICh6KEcmZPB6}({709vn_^wD+ ztd50ohIQj4-zNmTvYt72rYLf5Zg_DR^BVf%2{R0`pa9$-68M8t#5tCRebUd|qxd;- zJhF#6p=Wiv_p?S*QIS$^C+n4}s||^kL*em_n6c|AcS`MSV~qsFuwn+M(-3vq1fy#d z9u$ky4h3P%<&3(1oeKBu!h+CZahY7BE|<|}i-}H)9k9*(M+2-p3|xq^fLB1n0IaAqq>>OA)^lZB3-qtO+`FM}(f>Vv{xcZT@U>^)^tET6 znZIb=^1Yw@)4Iy_mAjVj+O>TD{#RFR*znwjb^mbELJW&27CEr+K({E`+ks~pdt~*X zBw(duNywe#Y`>1f)f59OnN5n|Dw%OD8O6%?tAjy} zUB?iM?GrK&Iu>bDDAU8=eM`zAC@*nlSg)I%@Cc8(5w7q`n1&=1K>6`tCJHrO!`t51 zaW-K-ZbTBp;x*yaluZU!HdYcoN-tqlmeVIOEH;S{3D(HrG)}sxC#UIpJB5y3Z$iu> z<0!xtYbBHzRzCq2mV{%RVF6%`lx9?D;8YsoHQ_>XVeyT^jvIs0Y(ncf_kz&mNa$ST zfM(9EzFU;n5SQICI2kxrpO^V}8EB!7RgC_2hF*f78Av0*vBH-h$gq%O?N(@5{6M@G)7v4(U>@=uc03n6I?L?7?#uU#{w++ zb-o;i#lG)bKLx##Kk9Vm2=kIpx~; z_&r=}WA-Y7svndv)S}B06tA-D&>zaS2obLs$0FCgLzH9XU8#ZK@{m+w9^K+hI?OO6RplP&+j1A}* z#eN({u!v-_(+qB#*lcwmkhymH@*VP08Jy5(lcO1ac9_ zQpG72V^{=PiIzWX&#{fz&E;4UqU^3>Q@9iiN~TbCCkZP>%hpYj15%TlE21>+2w|g5!y91Y_nozR2+nf*KbZ?rrNf?bMBQsvr6y?*t;00K( zY2^gV&=ft7Sq&_+;e2y*G)nn0QtR`x#`HMD!Uj#paGYTcAYcJv?a}Pt6R~o|ln#HUnjL2m7Tj=R}azE}sve*o6Hwl)K%3ee=7UNh! z;8+!5|K(Yx=Jcns-gr^O07rMPZ>-zyaEt+BO*!yw3Wq|r+3hTXI`@y~rTY8}idVrU zieH9?b@th(mOd5D`}EsSvGwiu+S`{t_0-otkLW&~VXaQAyQ}XqzQqpWTX!YKmHjxE zxg@}13=F{P2Y^>Vv=FrjuS!Z#s3LzT!c|sD)+*X4B=A9Z7Vb9gtFJ%2vvSLZP2b!5 zo4pw2zNm8158-Uv-ql;yfA^F1m76wgc#ifIS&G)b|o<^*KMexda;n25wJMJnubx+E<6{FMS-*>F0NlC;3^JUZM*}JajRsN zN+w~E2cZoMw-K8_vioEgCG4@RDh5|J`e1j5H7p}nXq}bht1!SA{8!+Wjd&H|#{hjW z+=5Ec|2qB>lU?16U{O_wfTc*VIjKG8QF{qF!)l5%EY7n6r!?BMXuPQ~ij$wOH??1H zIv;Jm-rU|y34Yi}ctMJEN5q?|Ei-&_0j z_x|P||7L0Ib1J6*!#*wQIPMmRNOC5pnZAE}AtOS8%G01w3 zT_f`Xu&*+PQ(5qJz>(nVvP;U!2(QZ4X>;o9mD?6=fnsmp>YdxRY*~#{EbeYuU0GSS zZqxe8ZR zSO{5mpjd4!b|iCg8wGVj!}%li5=LbwSy^a^b_CUZ%Q~WQ@^v2S!0YYpA94|^IVw%6 zXOZp{*1+>dIl~Har)>m#lB-KAUL4{3gbTUPJz*WiMx8;c4=9#0a$v+eIWnm^J?9pB zM;T;AGFY^GAE2KG?d=qvK^392S6E%D_J&fatB`#X`wB~YAFN?HFevD9?`1%&kuK_Z zR!otlMWrfCQFSwU>#NDI9=@0GK@2PQSMU9<=j+k6pZ@IIY<>D4d4{j|EdBJU&*Q_A z?-CB_G5_Nxb8{-c6W6agDr`1Ve4`om5SM1<;tR3ki!*V5@}f3b=e$Y zkXxZI6&<9j;2+A$&^Ma>Z~FkRwDlE>7H!$Lp{}xS1K`!pyIbnE?5o_mZqtTMm6hvh zzD4%E>3=0zb!DHBtpVK)2w7+vMLU*M7WN=y_1q){tB2?n+a>HD#aR$YuzK-ye+?_% ziIbXWdzOb`8KbU|G`Gu>vRMvR)3*y*qB;YseAP6L1=kUN4}C82-34-u=Ab|eJK&cKz*I93q~@d5|2VB|$@#RGZ?GdW=OURHa-Uj*jt>k0{lp#TvU$j$VgP9_$*lcF>p_3De`KC9Lwtb@l;HudpLeJw_a_i;sUshD95NQ#7H_CfTrTbn);Et0|g5DtfSkD@Jc;09xFA0M(S3_{5w6s_Y9BWU- zh_AIZ-bu(5cWftg2aCeKD*@{QYj`r8tFO`&hZl$D@O?s@_7&k9g|`64C5{zum||9j zJ=$Gr7J^m8A!|${A3_oREMU>bF#wj&m5JG?ZcXV{6BpWAJ*FZ{BC&R)YK>uxCpuQ z2wjL=%a>OWY;npZiCkH{R;;`GcpcEKRXa*{?2zOuL@eM~StTUb)9?vQXviWRDhnGG zf4DWf?B5FNfnaH$)M^X%zPtz_Yr_^mt!?`@Y`D9na%aURz^l5AR1wxa4nOR1N_=1o zY1&BuskN-{nd(DSv6vZ)r1y(G7E-bj#!+dP&^!Asp(6EuQoAf3847&wq&twBvUw^c zWx9HmU|5Mfy?kC2%EoWyszZ^WTO4jtQcY;iXGLM$B$aEkwTT8r7v7PAaEdXkL{W(S z)ggaet_mSUajl(IgQ#J7;KwGn*}C(o|2dzFSg2yzSoujMD79PXK58CT^gajtL2Aub zL)x4`w3)RyH}e@^DDistt!5SaP&{PzcmIBABC@l>o zGG-_giy_uv>k{{P2#P|VHKe%}3XO-ui?RP18CGPP6$@Z}91&|*C!tbE@;3NItN_uE zl_&~v2*oU!?)`i##_JBa#G-+NnM;CZJ0@T$rc@~oMM|z?bBe0V)P|~iuEek`Vt*`l z(a9d-s7tWr3b{5xh#3W!Q4yE7U4qM*>v9QsF^e%5aV#pdIh`)&l;HY`GAsbB&wfQL z@25|lTKd$pXTN|C%V4wpx((idP4HfCHrFVX09j+iOcS{BIEwZ09x7ihvFoQH>P7%sE#wNB32bX zfMKPIj#O9Jbx;t48RPB&v)uzFVXguJt1G!B7ua=v3mbpL04vXF6a+)A(Z#$1MpwUJ z5sem$tIcJ^);)gz&QvkgCWuCaG=<=@^fP;dQxH5~QHJ$bKQ-LXmGvJ_o&EOTyw?+Z z6b);79+p8I7Kfd%uwxf12a^e3N#)9N8F1y0&Q$}@6-O>!F#=|7Shep}X?iM0E*wRe z^>{*`XZjQBUUeI{W^Y}E^h&FpoK)4;9xY7SeCOcKy}#WF#|tkM6ckVF!{%ug2QO*v z*|c5AXcpS#*EOA|UT6zDuqMQy1`2HGv9L5OPO*3#7W}2iZCEq;upIG$sq)%Tx{(QY zpEfy)My%X>b@#aPE>A2bjU+CinrpBEZV*axmwpV=V4#K%KmF zq@uLA0II^$J!e?H44a#Sb0`*CFJC+0EmE3oMK^qb1wP*bjRtc^sU(bd6H15`8i%3~ z_X<(6k{A|&)3{&Ug&d1dpP)~UkI%xeuJZA^P^Sy-(bSB-C4RFBhj!aiR4E5H!vp@J zN7dD3C!;%OSW!#NnCTK@1}EKdc4xoK0v}GnD9!&6MbTkPwTWwumOyU1%kH;a zwktfM%jgllx(w^A-005U0xtZ=Q_=RN?=5Y9w6q3!^K(=XFj3nN51B}~rLfsX>~OrgN|nhk(gRX;k^(6AzD#R~d3 zT9{l;s91lvxVUsv8KuGFaTo99E=l$TS$6@$vP()HFM|RQ@rv^+3T^0Fn zlRL3+myptBZjWL?h(34s41neGWZn;`5;iQsVllXi-Dyh{EMdJx)|Hbhm4}IlmwdTz zltY#XFBy$maEe_FuuR=uEP9l5EIeAAE{o%>WZZX(3s<9bg`kT(4G2~=c27+c77_uc zYMgihfTh4DXr;ntHZk3uIY-%mLgx6&Wrg9xYgp2hiO^x6x2oI0b_s(H8N(U@YE=w>35Zzg8m_l>(2ZO4V(jQY07_Mj%)^at+2d23W3UugfA_jmG*dF~Jy< zDn4hbOSHM1Hf+jpnmn$4qf3NqV!vqlN;53O?|Po?`Q5X0MhxrIr(&_5PaoiIxThqX zo`)3`t_ruW3T$DrHY^WkTy{Gl7rwCW0WQwDuv*-Uu895n_V0UjpM+ZgTqS5@K;
vlRN4t~wYDj8W(TKC4lWM#52xJ9S`^zx>58&#D*=0OTD?4iyN%mP% z{9olsgJo@;V72p*8K%19fw2u26CxH3q2LUQovWXiVV98k8t!$tGYL!4ZwXjj2LkSZ z2PsyfAe@SONT=8)Au~2iCs+)%FhwP(aSe+m60yu?6Aibqv+>M`SuGx;MWLry8LykS z6D9;K1TC+Z;!==a38Bycs|9JCn8dI~Tkz-V+7vbUH2<0Q3DMbLClO1^nPFRnZL?}v ziGr}naBoFup#4C^D?`b5xmoZ!7h9Lvm9ux-LAxrP<9Ks9J|3eIM!CUjYh@PPZBnWC7=qxzZ!Kq{N@ss+Cs zpbYBL%v^MFLMa*j3Ts$^O*mZVz5l>TI8X=1F8uTgwv{%a>yt%{~rYt4naJu%x688+Ecc zV&RO!lI2y`j{P-2)v?{jcJFS$Q*9%%tQ9M^>*^0{3$z=ymX&Q~aS&PY^goLKBRj=L znkM~;!Gf)Yc?pU|@qHICw*m98EYwNJ6W#HBtN-@2l5mz?!g~urS!0gNaxv=H1bTf! z%jV6WjhM-mYwr2+X%Mndz2sk0J)#kWVLLVFn7by;l8V*BB=I(f(PDoqIhg>BDGzmk=Q9q9Z*&pM0Yj*Wkd4&@mi$H4wuZ zDJ?Ap#Hs?0m3D)p6>+SN!9ZY%+x>TAnkC*zw{?Nlt2}qZJbA^fRQ`k*7F(oZ5yxV_ z+HumcO8eBQA>>yfFBh_cdl<(m@-v22^dN?XfOR?GHU`9y5cVE0Pa(sCCw;fV?P7hT z`E9ugr@I9nTZPdWvoI|x>J&VJO>jhG0{sE<;mT3LC6W z<$aYI)`g{s)y^1J^z5?_WLUH1VMUQ$T?ND%75cq!2rj%SEdZ`zRx0M&B;fiD0#`XQ zF8yKL>cdt4q!u^*p43(sR4?DPfBF8W_p>A!WJTFL#_#d$vaKEi zjsdw!O4{83c-7F*2)ZEbB*!_n<4QUI{FVwl#}jb$6lO0s!Hxaw()dcZrW!+7Po z?6S%Z3WOuPBC9*{sNn#+rp;HOYqL z$Qc&;tWcuB+?Wo-!dS50+krWv77JV$3>_bY49!jPyaw7OnbMzM9%_7d9T-i32F2F3zMsY0sA@TlKnOodWF z#3v#X2*dDIjHbblKZ$u^UtpIo#=T_HF5#z7osB|C82kJ_EFhr?T)Iu?{fuK>6|MsB zx|-lynf^@wL9THrY#R8h_-4k7f4+-WHLf^r;V$6e!^(+@{aXmM0CP6%t0>SOKJIxo z=@=YP3Bvh*gX6E0j{P-IuEKYYG&B@$Z%}DpMS?{YVO{o)r>O-o>wi5>@ygVrh@pXH z+3P5>fyfoQ-H~1~Hx`-Qjg}sHL^4TOw*}PN=OVirojYT^Oy+$U7SSuZVl<2fX~=Ux zOxY|^ECMRI}uSTi!8S%->b_$u7K`nzWuSo8%09y@Z*R-*-o<2?rt>8U(8fI3tQ>jZc8)syi)f>mW|gX*EyY@U>1(EC`2B zhvwjPFK)ylh820NFG3;~Q7qakob%XU>^YF1oc!Cpdspx4WS!8}o!AMD#C5i`hJN-J zaoLfA*`nCQkn(GDKGc6xz_%S9MGGYZ<)iAJJA-kQgy?3hq4_(){k|sg>FWkVEcO-F zu%hiWiamYlvl0^h^m8z*dwf`!lMkhz9Jffyf*O$)Trl7wd5c9}9y};^h8EA6Gv}4Z zUdeduo8Qd%ix(Me0dQ4SX?03i#gj_``)-=sM`SnzIr$^x_v}T00KVwN~rkp(%yWTcsS6KSH@!cBl_OhG% zu)<8tBFLg(8MS07O28EJIv__0=XTT2tU>E2rH+z{W#_Ux=U5!Ia%arLYLexRCgdxA z25{AUsw3dDUh!GO^>eL(B}>wbOAxe>W_1`S0t=0!7&F77{D5HfKuy@+-}7u9wm(a) zgyeL01V#Tan)V}+AYc`cEG!C(ORK8pN`s$y8#Lz2bPV!LEbFbgR$thx$5~%!9epf8 zvAElP9CdttX!h@aW!D>3@91i3Y6_Mw&v-TCm5>OCRn-~x<4B{TaPxz92?ZB54g!_R zPfiJ%y8!iDQhaGXc#eSbdi| z09A4g>!yVWR(ekyvHD%`zd$vb3c~PQ^~r}W36WaSrAO!}V&hWNmOxENMWL)GCt+$J zv|=Cm2}6TQ)ur%92K+b~&mTFk#;(JN8D_;o6^mQ3+V1q&S=1jBvBDgznCTtyD(qDY zam$rDu}3K7r-U$XlzxlusTLegXu`=k=*6;=?#}$~EZ`k$!?uUiu$p9fSj6`i1_Hh_ z3#?&HRdI)vv~YZ6jDbslSnb!zfpwn38rqvEExEm2k>B4uWzKBxnaA_6GFkKU9fyZh z_W_=VRZNIQ6suSpxp8mC%t;J(w+`Y|)xh8apRf3U<{UDtP>6+K$-JW(eUXSi$RaI* zkv04F@7ndoab@z`d-pCcfTG}yT^S+2vsA0?^9ueVuO=9q)rSSgRktKn!t%aQZik0( zGnVXOY&QrE=Xd3|*>eB1nxDV%KAwG_-FW^Rc;or!pTEK`S{bH2|NQ&EjK$u4{`v2J z{H1AFvG%1)e}{s*#IW)nPQ#il56eQYl{U1EB5VzNhDA=fWDDxT+gFicxmd~Qz3j&M zm8U;A&2Ve+T*R$k^-UZ`xKf&x*yyfXGk zp`+CJ%%&0o$g0%?o$3K~C?!)uRE25YTyDGqsh8(NO&KJ_sPL| zr&suh&w*C3l90RI8N+I6;T(%P7Ztg-wg+aq-)m?fyy{@l>Oir)heKC70!sj_kYqt! zICRNEv3=-iz&NZX%yfr>u-Vy_*DSR4oKH8G_dhG;VL2#W#u22FZ~*Ws!m2?Mv7jj2 z^J8nP1XYyfhiKJm9Sry`hr-st86SGF!r{e>F(&y|U%dO7tL_;Ql(EJKf|2nxdn=Y# zlxn-~yta4W>V5lmX|+|8d-nLpgMf-y6pl?68)i#uz_+b_cMG!zcfnKSwVU%>avd#R zcyib~h^Xqy$C_~JPpbL({f}c;enH4|>KlLd@3Gh~e{l-HDt6`lCt~0D27Lv<)VuGW zLNsfA|H_xCVbLSVdvRiG|6kOw9?^$2oncvIFB|k-ap3X{d+q~VByPbe>_fcz08fZn zAJFMcq)M+-*3>AwmFRvrjCh4t5w)t|X4T;XE0g9OJ9O;W%D+A~ui*p$RpFaQjvPM% zXN8R`wkOpd2f!*k2w3%aUAE-G%F5nA>?)2}$gs-RJ<;5Jy&c7?3v1!jbAiMwRuR(l zoSU+eFrCfJ5m0kiQ|Gf+-8o~t%)NymAr_ag@+<*k;4+ki?!c0%l+6lRKj9&%k&uxq zNx_0sK2J(kb$J+I6}d-U!a-EsmE~sUZD8*jSgy6Tq^cNT(cO7TYe$|%BGxDia`%$3 z?oW^_#;+K~@(+Zk*sPu8qGh`XM6c{oZFByj}8Lm?wA?qe=#$4FEruJr+xxe4hlAfn1&rIZD5n=`T zF5v*PH53<@#*eD-4I1{fFy5fkiVQ0-4oDQXozuFf3315|2vCsNdeZC_s?=*dj1E`1A}S>@cQ_90xN_m_=4}l`STw~ z@q&Nl@2QvY^DwMwfR&@yvkFcrz1wr#BH$8Psp!x2%LT4;VSp*$X(U;v&z~W@j(yZ`p<7FbpHtT8^vbH^1@*hJAS8Zu>;%FTeCUrKKeQXrs<5#k zDd|Y9Lh8Ap2QVxSR?L+}1k2$O0k3eZh}(-4%SE$Jr>Bl0V7N9I7aK>>($-=VFkUHH#Q;lz-8k-1DY_3W4LEC}h_yK5 z3miM2)qa_j8=KrgiKQgF9ocF z9UX%wZvbFv>O-e`A4`ih8w?!=%cTH-y3v9*tmbwyy2F!{XR)MPK5TC?DulL7vCC28 z`EVLuiJm)ScSQdL&B{Km)Lnasv{bHJKC8vl!|N3%OX?MM5c(JQg% z|2MqS`i)<_OVD)c`^db0`8+2XjB z%5cjYW|iPMJe^|<>nA?ID>P^!S{>FYb&OgmyYxBe*;3}1itDw)og?p@IJELaVPj!qW8=z(H|Hg7-~3z&1FUQYSG3EB6sx2T=NxX$&aT_~9NUh3 zZh5ouq1>kDx?k#gw%K%nyHsi-kHNqr1**=%^e4#trr)kBXDSxTSS)uPD#A9S(Us{* zW(+GO#qWbMkna>;?j7|4!{UggmO7oW3XIF|@JX)(naSl-4(6mc@mQ?3M7X=8yDO&J z9&XH6RAwF>^jV=E#IdGU>zTt7Kv%69b7IX4+t~#Afbmk4F)W;wW65i8YDQmH`}I6~ z-uW6;dw*Nc#q{+4xDN~74Tc@TAoF1%U~#l!MPWgyHKAbvPz@q#Sp)9NOZ;Pzuyuj& zhJWH*=!#isRZgC!eZmZl+}cnLhy`#J%+O4Jl>GMV%1NMA<<)OMJy`u0%L`tA{kLO9 ze*akN7%b21y@V8r7PyQfB549-a8y*9?YW9%htEwN>7j5-GKyGJTy(!DPfT`-<{2I$ z8Oo3so#Fcp?T>(1zx>7f|NZ@6aBb=bM4;aN#`7PaMY473eFUuk@qGfUD+E~2e|bKv zd#Tgs^kK;u*2SD@3!4Syj7tVwxlEgP1c7;~SlqVrzQI-}1EWj%YlrPEJ zv5GvS8&SYoxBSUJ`?Dvj(e0(xPTB;Q<$C*CiC@v=93z}aa(8itg}yR%r?-htmN0lUiJ8JFz6Z;500XL zL=+{}9Ve=?DbV(oHhV73L%uwf%m=4p8=+e!Vd3-%FLR6%LJi!rU8oMX@u~GS$%^!Y zX4b0+uOf0bu!@kmM-`l6+0!4=ILb#j!`t1UbwOZ|CInhf0l~sQC+q%CY7DY-W9Eb#qwWU-Pa>yz^J=hV? z@k1BsVCzD^xqQNJ3z~vA0#>X3Kv@5ias4^?Rp!X8SmPvOX|&b5G?5?xR#jDUa$$|O zsyzA4clK1jQ>ERrYx(km->&f!TKQAQ$5LanGAxJ3VKk-*ibL@1s@nYOt0FvmQ|?Ta zkQSy*LT9o{K%ldkc*2nMuz8Ti155=%%^I=(X?z`>}TqD<}T5OuWzB#xS&sjWo@o9!#XF?Nt{7Qr? zJ9Qq?2fL!n(VNU~DXS(|CS4^%Lu29YBk$BU&`N43JaYV<#-jjND;tw{Clvx;!pwk|}!lOCOJGljcjqyn-ZlZcH(!foSKhFGeWux}J|`^fX&>m3cV z@q^rg#q#=yW$~1muq~NmWJ)IdAg;QbDA_b$MgG*bDNeD7WKG#0s9`n9+n(_&P7N-w zBFC~0Mmr8qw#Lv|^e_ASI+nQI2v6!f(jL*i0 z=1?de6x`0SVKk0n8ceBHTO1eNi%Y8_Y+`)^u}&^@S4}E|W3~|udPj362lX1OUUN>b zS$s=#U{6FAJDTxW1_dsUM>Lx1M zbGpNy2Lcw*YqvLuE#^>fz<)YdqW!oEX13cUX%~TkeUq5U+fOp zT6pDOzW?!+*2FF$U4Q@GkKteduU$Y~-(&IOnDFzsrmtH^FrPNoo%{#XH(C(E0 zSSK2eq#XLukKTFn#G7x{zNtTcne3SoTb#8+QlJ|wlr(Cy1 zp})7f|bOy3@jJp#k}_y7L>`|tmPGb^kEKmNt3*vIeF z&LQGgEAcMeGlW}L-hcP^$*|5ovW7K159?yiLoB^q0&=|q z$TcTJse@OaPH(o`%{5RKB4p_Stl)dhK)rHwT{StAo|VUTH#E*$Ij^>1cgmZ`j~{ub z{GE4>1Jycl8ItGUF~Zv7ZI+Q%RQct%+jy~FNV3Rkz)1Eohj2jby`ixFpJ(-MaP{~OP+=6V%VTV z{swxp%@jSJTmY^%{EJl~M0HWnrwaGvppq6t1Xpkt40^?3sih#*Z-$ys$;v`DKL?!$ z*tqW+b=~$F`#E5#{BD+w33X%`&`&V$M@OdZ#(a7*F`@|`@_~n=5 z!!qzVX!)uA^Z2l)=V4iL9%<=w>Z_l8@{K3osD48Nu5SWxP3Ta<(wj$Yh*E%4NPOU= zH0J=0nR9dpev@PJB<(%~3~OFeZSAo`@4Rya*70{H-+AZFLrF=EjSUSelisXt+^#=f zg5In6DA#y04bDc~n7wt=M7^%O2EnREDO-S8I$K`*P0p~S8LH`QOnra9mo^FKvX8kl z*cucLX?u`9JOo$t0R$`4LM0(ogvJhk5N$_pzI;pYulTZ881s(>oxxx*J`*%9EeU{F zMWNuZR|FKfjjFro&!mJIWrAYaQ51K%UD*2wEXyd(msTkRA3+v#jUr-kh9z`LTZ02+ z@M`Ol$X!bM@IgVy^g7Knoscb+WF2jhNWD*h)+Kbhw-dp--rjsM)777TG2Phi!XdafdwTMej=c2rIKxV4SR%_v9tcK) zrNtA-u_Otrw5sn)M`EMU4LId>UbfpNO}3E(_TUv?>xgntr&)OXnm>|xVGZRx;;MgAwyFWQ-T>S>{FY7$ zm7mFOVrEf2tJ6#-U|moc>T~R`>y^8A9~(Q-khJnx!#jr#)gCR}URYRo5agex@|dtAoC9iv?$@hj6+lMtdPr;lD5Z`SqV0 zVu8cO9UTh+tSpz{BXDwVU+)qc#T~_#=l1j0+f!3r=rOsNX=!fHwdYUe=jdAUySg2i z-`78nmxLaN)8QN@>nJ)$iwlaSs*s6TBUWpxgjlDX_A&dl1OAb5nugftT^M;t>elszqeiU~JuL^vGD)!~fH2K*xUA`hQ7%z}w zNt!#Agh8iuN#HYZ<-Qz}h65I1h15mV0H_hX!(t-32M5-dBgX=Q)x~15@+ou@ z=oNezud3p{302Bw5!11dV1>8?E6(6BNpsl7&S zvisER8dg(6a%ZES7XaZv9={G+JJ{fprc+HwuoiY$F0rGdBhb;=IcmiI=jL{DVMWo@ zaK60>J-+SjmY#Nt&ZNt|knSRal^%DxJMWAQk8!7a5E#}ZgBHG1SX{jLWZZ_;8n}$5 zcsS63rivTrwO?RWYJ3w1BDdz8UVJO0IX)o;yAxia*IlF8Q?0EoK*XxjDzP>HqhALn zwe?yhe4?s&&&Yv2urzzdXPZliBM4m~Ygp~y`WcQS{23hbvu_zbj}J>;5(d5mz!P^boEee(mdQ4EZk0!eR#3`==R3#g-4T;8jjR9 z)ar0v;d1QD!BG}GU(M5R7w#6r$dV_d^>@!n^z z;8oA{&J81Kg@Iw6ynji^3PFir#r1bYETbjPunc37K-vXpZK1Y2P%870JLYLgZKz#l;g7 zW-J4>RT+JgK(Byc6;~A>DBW`nj%k2(ABN@ec#OtTc;4~pgt~M*DA@Em7d=nXc8f}| zn~`G0cL_g3u^xqCHOarvXq0fT`B62jKQzOd1>N3!?M)8^~C|Jz8+tBdb8b( zjw=K#lEL8uUyw?GGP^lPmx3BrVIy@tBT#KWx}u@+=u!AY(hB%QQlV;IL%E*jQ)pl1 z>3=kW6^DgAo?Tb+${M8}b#}cD#eFkxR^-Zi4*pY)(q*}rh-yfu&gW5dHC$z-pqgIg z>bV0$Gcha&*%&ynBK3+O%yY+*7dN9?g8sk~Hy5$O@`_Mum7$SR9JzpAk=HZi4Xzmt z4*L%Ze#Wqzm}voUMcJdKZnAf#vRzGNg+@p6^h8sdhThhK!V~W9IVo+SO(lU9^HFe1 zML!^7rXU^^Oc;qp5i^)FgP{=dTr7gC+$sA*2lx@oT4-G`$X;?CZoe{gGH?kH3xFel z7WaT}PR3j`eo)|Ow4Fc;1$P>w+H6qfH(xlPu50_ShuIpi`56h8#}Q;1$+$_lhO6zs zv8tG}p{g{#Psnl`22T#+xcWiDD=T&r`c7kDLx_UiHG8I&gc*^b#IfLBC#oiZX^l*j zMn>upud3kgi%SmxTJ3?7uxVz7CE!eF7ZI$m-y4P}c6^OEqSJ|}xvM0Gm8`IJqwFqY zSof+}Gig{x%V!yu?E7MV7cUU$xBJs(SoB*iUCO?B`qA@+d|21N_O-X){;1|H{X+wm z_CA26=YA;M5X7xP3Q>kdcx5)_n63eq=o$dA3K6k(1412bY-~uXEj&?p;zVIB608$P z8t46}zP_G~)G1iKp{_2Q#VTiS%`REBYF|d*1i2-0bfytBd+GEHtW0KVwTAK&N>CfT zyHn%y#c4+O%eMu;df7lH90Q#Zb?5yxECoX=4pE$1p@8LaI5RDlON_F?%hBm|Cp7oO zg1237QJhvukmdDb20Nyg_-$UniLyI#EKw9WKTN1tCev*fUq;tZTk>Yry)n#j--Luw z9H1oU7r)t+naKiUahtF^pNC?h*`1rQ+NLy+osQ;(u>3yU^GL=W zl>B^2!-_){p;q(E49jrUWV}yF82?uI1&sKD|7tKST0i^Qsn06!(XW3YAJ#vA?HM?} z_O-u#`}LZKBU|@lSjWj)U?$03iNJv-2tW|HX)@b&diw!gj`{eTNl8Gl3TqoyHZ<%$ zdg5qdEnwD)!lShfjY*A#s@i#na&itARP5WibLXN(uPs`%ZBgBp{mb`OR1{PdRF&?( zHF6y73_6_&`IU~DCv=2XaMP@36w7G27#FbsUD8=a*e`eqtq`+t&FplS6@(s#1Yn}W zd6h|6h*v{KKdLCxA&ZrSk^$W-O&BJ;!U{r-oJ$iN^$%lFh=}DE%`(J-Kl4dI78ffC z3AegcpUsVrlPI>NnHR|kvnunhIxw5xe^4ByZNmI~HUrwkHwuAa*;^z#)03xRY&MfQO&4ITyG>Bshm-Nq)~_k123pwCB}qUW!-Hw$eaw)gbp z^_(|$XZEDeOGsEy5)ONY$FLwA!#zF5uz(C{wVYyQSgrDQ!a+Q&JQB+n@Ld^KTCbcr zHy#<8&@9#{C;H-v4G3A0U@)k`s;~+;RwOd+*HqQlS5-u+juT!19_}e74NEir^9L|2 zcUr&~aEC8bRp^iSfnllcc_#t33=i}@3@gDfX40@MqW!ag)g%>xgqTMDn>BwW7*;g) zSMUAoKI z6l+xQAM~4b*l1Z!e)ldqrX+&p8oj8fNm1R0VX2a3N8)CpC`7!fQMhn)8*(f&R48Ui z#Y$`xN+Q;58kQttP1CZPThB0?`wi=4@tHYu&RI`I2YtRXXMFHVPIJ3^=K{wveu$xc znCOnUbv+MT(NV*?(36KlzIyUl99CSzf|4626C%SJh^#4&uY`lt*E%R~fxgmVg|ZN9 zLilBTXRQ95k!usmiMNiA^exWNX*KeaurDK+5e(8^VRdOFIPRZBp;S8(nbaa)RaI33 zVxfw)=f$xHXjlsGW$Zcddc#3@euKc;l;!-b1M|liV9~=pO~Z<{8!yr_=EY{#uySW& zSkdN~3z)f0A&QQ;j`gR{uwp&m`u6|+SD!sS^=PB&r{`f^f99oUaB;+9s0AhBTaN}< zWM+WkOi9p%7{dGwI=kJZ%rU*7%rPIXuTM^DsI6_NJ-QvZ)rzA>8yheS>%{h>g+~f& zcb`yw^xH)*zr23^`j;y!7p0Y*Ps2TBlgTS#yf&YktNyiu#bG##9*^QiC!7pB(oN^zA zl^Aj%y-X57#WxA*Q?7#~y9>YdqfK(Kl26K6@b|x5V7=1X zsy-b0)tqlW_DjQH05IdsnR97AA5bj!>Blm9n`tB=n@rf;jDgm9?dS8_G147Q&-SEW zOqcscosO}fh}k;>!@#iE&Y;Axs!7iZVHp^gu`nv4Ln2rU0@jg9y?GMNTE+6}$&VMx>Gu3Dz}D#+YVo77fd#K*XBjgYV4LeFkqf-LT5p zQkIw3l#{8h+ulBnVc`Q{z{kK4oms=O8E4Y4V$q90?Hzvj>#)SWG7M|RuZcaH=st~M zHNQ0fch4-H|I9N9*dpkH67i$^qt<;yta=?jc{$`dM+pnhNXXKmGb;xrcRl=-)E}=+ zN~%3{h@!9x3y<=%+Sz(idb?^{fcpJSZ6!gU8Fp@S|v)r341i*-N)!?JU011$R^ zOnz>n=so}^Bw3RaSAO-YzyAP5tiYLbXU_cnnZS~?z!E_7zEBK@Phg}wX;+kw3@_N` z<_|wSf8l)lh4yEmB9v)Z7%zh&mWaKCnqnEns$zSERhlb^cd^;nsWB;Or}7BtZpGD*RW)FGxIKC^L+rTN!nzT=2^s~n)0ilVcmb7jXo;F zk^|QDmvB9UAM>AC8iy^3Y`y-`XN9eLHXr9ntxR;60L!dPEWj&!z6mhon*FUDrJnTk z6DwA1fAho%z^D_oaQpUrHTV8bcTc>3 zkTWbgQ6u3UBNc=6BSI1*elvIg<$ zwlFMu5wIwnmGBB*1)`Dht09-EJmtRY-XK#ct1r=Q%^C=&7VpwvDg;@=VS4A3Sy%wEV09jQdkt$XZPL?9Y(u`{+ zt7b_YjTx>wJixJNo+DJ!ZKMX$DIebu*u#u1q4`s{WdteFP4j?V!uyqku|zW>&WV;b z9RK8fSYKq#nuis8=|2gwUiuxv792|xWJ{*UPa|9P9IoPsrPZUR#PVcxq%YBp-{jj7 zMt%*Tr8}HcPelC9MzmiQok+PiQ*Ei-v}MaSSUcfXW##(H z)tmMML{b5Wbd9-F$vmM%ZC^*ay9xeDnWJ-AE+!fYjTAT9k2WmclOuKK%;3XfRtAPt z2~Pu*EU7H%$t8LLt9(m*D7yPTt6`zx%Fj@%hz8wJ3r7(Zg*erC4CP;2aCnV#)Gr7& z$)u0}0YWUnI122_=(^LDoT9ovU=_**EIGka$=nSnr8r!e8GGAl<`IF|O^8ZX+}be3 zNS6JfN7YNP)g1k~;Z(=OL~AQ1s*|7`#&o}GJTY4l73ujPx?gSl9&#*W=?jH_LV_0#HRn>`pJn2bCo8m@lLP0VhPZTePtQeg8^%{Jgnybr1esKJv09$E^8rb zF|u_JYSq{C@q=-uRSy_au0+2%+qF|N45`7&&2FxN>aCs`7V7Kuh1*v!k2_X`?6NlH z;LCtg>tCL~?X}AFP!qyg<)%%Wwk%q-bJ6NKK>y~L) z*n#6M3aR}?Y5=REkRR(qHBqc0WLSV#Yk~v8HBK_SI~iP2WkC*76BdKUQBjqgGQ*0i z>@u}oj#M%LtC?~EjT45u&G}}Ne48*IWh@Nenj#s?{s3EptOHt_PKc2W-ov3-Y+=B6 z#>a?`@3b{4!JMU|DcXKM+T7d(r*@<9V*5px5lTZS=k@w2g+Ax4sl4eL7C@F$4EjZ& zSOe1;7WuKDCaka~L@cZhtsT4|44eUewP1-xIpX_eIHWnCVVPK(j2AUhvU^4_G9DQp z*Hocp21%6?A*;A}l5%Fa$$fnCxN>3^r~9KX)(ZI9zMT8-5;{evYsOwe{1&6-tH7|> zW5+<8KaT8-xj)acuQ~g9eOPDz8Pv8m`B ztfTTdN|P-fy*A@@$eCvxl97lo$@AZNUcMAPMS@$+t8#X{BH+F>1(d<_e%FDOG-d|?d0U7VO$&lwiggyTU?@nq>Fx>2hp5wuWvuSN;0 z7~o2iF@B(`K=}ZM^{9YlkTughh+)mpnj>?Y#-=s+{HZc5V;=hsJOzx+v9s=rF*X|x z%I%@6^sj-d=VLR2)~r6P*gvoRXSV)x8fcNK_0luH<8USIA>#ROUsr0ifLF|u&M>Q< z%T_t8?U_lCK*mVc((CK1_HQW3#%AV?7{<3@+3+1j@{uFSN6IH(&_p83US70l{muDb z+p_*I|8oBN$}Ri0A!I!>{~6pUe0%54b(Q-z?MF-MTj-sjJwmcGpmBoCUS_l13xRR_`_7=8JXqvq>ClQexjrTw|MWgEaFg5yH zF;X4dV*(uvRL2PP0QK^fA5k7QyTJ8oyLo?+UV z^qOQmzgy2L@|tWayelYc5X(>gA_lBGZ2SisL^xvCrHM+LB6=Ln_?r0V-`&k`j`5-H z?|Giju8=SgoHnU*$7;2b7D<@3_NDjx`8=QJv0tmIassI;Zr)_b!j04Etg=VPCdY2x z9Ix2>=T%tTJt(aC%gfZq=Gxq!3QIeY|H6&PsTNW4+AeFB?rmDC=f_&FBUg;LTh4N+ zh1+^0X(ZBZ8j+-J+GnVTrTt6t!o-#l*xK@)#IP2k%T>L3^X5l4S8lE(QpK@#n4;_{ zsDW77KMaavT+0JUah9*&`6SQ^EAi=77}jsC*$Cz`CBNiAW@h;+>z-RLT7g$D?kO&- zE-pP#Q(BJUci`6RR#)|&-KE=KX7inou>x2aaIZ7Sh?!Y#96dY+0_&gIoae+Qs`9Af zw{(E4qFN29sI%stOK3~L6;LW3!GbN%Vpx1I)QaKu44*HDrDBCTUpw`9e=!3;cr{S1b%HY;$4Q!WHp~fo4QjQWT3G?9WxQ zydF;%)!Wi9YzDNMAq#sI-@_=OUc-;mKw$lfsy1AC==}NC_S5T@xAN_4nY_aKGWEx= zgT|6<(;|Fb3}x|`lmXy3Qd>ev!pVf#u0A>vEx}pOq_84zF^ILP zsx?7kQ3$JDPaOq;MXhtr0I*We#oMVKu*U^fCh*FRS8#uo6&r8f)RBdb5R)40(dfbP z{P9hZ-an_pI-aDkv_Ew&VbbP)jbZh6xGx0(Nx8NxAvob~k@n_ZYsk(Bx*K@e-q4e~ z?Tnt|?{_b_5oyGMYjg%KsAG-ebowfuc?obXu)3#t28z z5cW~hC@3q8Vc|00C@x;EB(^5x~Nf$Vmm z6&1(IW__RAgjja}S?uxE&tKv%A5Up%z)7EV$6jl^O2dS}s~=+s%Opv9<|rtvy_9TH}h{E%)fcF zs-hBj<*ag6Wk!cuZo;pz-){=5-bh>ek|?a0*4vLEDu?+!?bqWk@O|A4d_iuub|!aa zpw00@&&_SUepLZr`PECudp|=xEbaPrAQoK>TM`^YI%HTEq0G!v|=^+o+Mf_=6bXIR`H={JsU8}{szr-j#CliSRSt%E6ac>+~8(? z2oYEEOv9Xy`+^Q2RtJcz4$5h;%v-=O(FxArN;PHa0*e=d%{V%U3X6ypB2yUB6&9t5 z0;ZV2%A-m!6vV=qdne743r74(P;Gw2k3)Eox*1~OPz4oqKYMD$>N!)e;+dmyc{QW3 z67|(g=6i}sRu!+Oo03P}l<#izCuHgF)Az2hh*}`9ntpW>4`S@(m00ZfKc@ZS<#oOQ z74j1V;iN$Gomtc!H*NKo;Ue!(_qydSl;56hYc8ES)zz?4Ps5TxWZ~@Rpg$Oncs5p4 z60T5R>7gtjR@Lc~dbazoShFu3S%H%nNn`B^5m`9@8Rz6A*6{;zHI^5JWnZR!Use9W zs)Mv%JLs&as;J6L9~!)t5BD?gw-}Z-uf)196_%D3w5_S{t=Aka0IbOLi0HMc6Xy4N zBi_9qnZ{6I_4YNW6W&HOxUzn+3M;W5mWH&t{!7|kCve3Dmmb&J#hA5fkL9J8o_lWl z_U(rVTL&1l{)5yOIK)jGH+fhLizU&)*XYsLj@9LtJ++g%-8?}3x*mAoj$VupYx8a0 zS+jA|^P6!b@YPi{ufJ+7E-S0vUtU&PT3Yj5Nx9W(-Em}B-?Fu5dWg>vp@3ZSY30_!gyI0jF>hp>7A|k1qua09cm3RF*S}n~sGPmJzvPD?!U9 z8^y2$Uo#m(xMtApAmueMfyLrhdJL>D_ zQp0){b+^wH#ab2yc@<61ivq-=`@k0ht*%|WR@FF`H-=^V(g)?CgE&1We4i<-~v zVO{^1Hlh|>h*#H>p+(%rR{*NLprt|ee^#b-Mpi^+U3GwJ?r0p zl7h^_qAztvj~yL%M~a^UL-^#APu8w~p!R`>?|>7081BFZiM4g>Gut&5cY zSHFXXaPNlimjkzoci(!|wdqKC>8d@Y)n$)Ac3`)2L)~k~jD%4(F#=09xZOB|(Cu~C zZK!(%1qzM}@`NoS)~GU45T=9%${3|6)_fI5ZE-W0aKVj97FaH7e?Ybbm?tESMXBz( z!Wu+Fh#@PAvUjr54H(8^aV<23ePdxUI4Y@%Kb<6&RA)$1jA7Mzs5y$c*%sNgtTpL@m&t_k4yLuI? zHB5JzjLFX+u|Qz~vHT;!U`hT*;~O_sQWy(y6(LiYUvbz@66a#tjuIxv zu((AQHz^ajE9*Z)JuJ+_ zLM&ZxV+yP7y6z9JlQ(4G+SR-3t>44){x5#!OUOUj>l2AiKgSsRaCQ6roO?mSG9_lMW-1a(#he6qSgWR>kM zD&70x{x@BvrDes%dyke|ORcM3EU$k3cg2rBw(sz<*U%Gg*g!zk+lXO#tPNC)c|(fI zUy?5|Vy$6y(Xm@jL4l)#60r2Sgc!}TTv$+HC0=NcbT+QAUsby!#*<$-NMU5a(TrCG*QL|KPE`76`WxE>+i*F;)Ga)Pl)=3t1$J|jSu|Q#k)}BPDoS6bK8PQ3m0+b7>X zdE%|#zx6)D)?+U{_R{uJ*AeTgJ+Od%D}&1s>w`e9Pf~FFZ+x#kl8N#5XLdfh{>h!| zStE%jpQPqpKrSpHS_I76wAor#TwCgTeU-Jmw5IlxY7}gxB_%ZaTK$Ko zwjX+|@~f101=QL=`3&qV$3e*ytjxS21>5iuv1q|c?lR&k%y>l-i?Ef7`3-YVer~*r zSB>oEMz#*Db|n~~Oe|VkS=60T3nS~zOis~M9CU?PQwB#3JK2a~*dMfu&60#kSfH>* z)RejeQ&?x?FEyjW%BnNZ=&OVqb3!Yz_&}i{u)1bc7Axszt~1F&oVe%(iPhzCcZ0}s zvnJ5F`i#OB^n|&Kw}ey`OA`VW<8PmPdD;25F0x65=g(uYhCsVOb9ByMJlD#{>M81e z84Mx9O1FeKdvFcEa_G{~r8R53=4lhl!!k8UU-vDJq~{Nh2Z1NMEoC8T&eEP0c_tISLgTG6pa;8psN!hp4M@L;90 zvg*&Qu(bKRJCjI)Gj`$YLQSDL?Y>l4yd^)M8reU*f)yko8OCRr}j-pLqKOV(Z;^L23Q#zy9Li z-hZ~dOvlwK&{$TSRRheix{g%8GI4A}N`Ah*r1%+X*ZctRsupV<-vLHZPt^5#ZUg*y zbBVRKxYkt)?^0G;?E0{_xTeJA`u_JfeS*ANWxeGpdwloi=eB?Ks~ZoqE{PblrKve= z#aypr8$7D=iZb*u<+UTPMqz!WK(ssh*vOzIwTF;J`3)uqd}(!QsK?yiju}k78JztY8C8F~niQg2<>JJRuf;fwL2vpw+Qy zP2dVu-=O@l+${U{C#5zdY*`G8jRnpmjdms1^fNS9q3L5#Sn80s(1UeH-TGWNqqMsh zd#b`}{!j3#4NvzJ!3&uF%0g_pmXJsGD%gdXb1V6Yex-9y)QP5ZNAZjaM76`1yiVA1N zKBx1~8pA?~G+(Rv#V+%`{`eP(tHmp<`ZRm@^css2F~65)_ln{Kc8&MGa3kz_LDSlK zN3I+(^?4f##B1L9(;614hjo3+7Mw!3%HS4JYu9y#tzUve#P}9>IxX$(w6wI-fUPv* z7Cb=E9HLmJX*Z%!`%F0~8D{J+w$G84q`|}%#SgibV9TQuuk~<|h zc;Wn4vy|pbh%1~xIQq(M``!rH!H#%|218?|cFdcHl?*D~6gHZM+W3E_HuV9)-rU;C zVptiiK7BSJhOwHBm=z^4gyOjjd47z+`2ZP~=Uy*_%ge(A7oh}t=l@(cO#_}?C zD`qHVoL^FV%EoJb`mr@w z9&62-OJG$S^vTaA2^a8$7q3qT~m$h>tQP4-H)!yIE0D>8x`8nHAQ5mu2w^ zOG_(gtbcp2r>o(3FFM~dAgn-krFt6bH7(WS`P-}QTF*`Q^tL8P?#jhk!rAq(Xu(B{W_*#RV(Ij3t*hHmcPvFz)rKtP5<0?5^2f?6 zBa*l`GJ(-6Be|U}9aOy!ZfX{`geHBAkakEIbLUyn<(M*I#M~1k78ybs6~y=zi(rNH zQ9?{}AX7*R3-p6%9}V6nfu%~S`;EG|!aC+2R7RDLm1bXaoq4r+UWN7bnbM-k606HF zgupTa*3-T*RZUkU4_27zcE?jkS=_w^DyE5>ym_R*}t*y+{}&Y%BT z>&f=OMFbWYv=dhXCm%Y0?p%Po%u36U!fN9#Q_MZP?dsL~q1XD~qeiN0x?ao8T8RS7 zWNMT!5$iS;b}u-XAHgsdSis7Pk~p!@6^=)!tPD1EmpoQs3WSxC4vp5F!UcY@8{;p#t2J*?~TB=+wlNv-e9P>TahH6gK@kXmU? zZ>OC&eR|g(Yk3)Fqq~ljfzGn-!RgA6mAkBe@4{(;r8PC1Dh@oe6Oi=`f{6(%P*_`^ zdlVGb)>^%la}fXw6joWS%LVUMUIvsZ-&4N%P)%8RX{pQlon22=yB>dP_n~JefK!JL zA3lnMKZr+Xd2ueZp=JIyzXks4;_(v{nbhR(LL8U9!c+ z70$+CxN5|uUr)mlZbX_}bzo)CKw(HH78UQqAQl@S4CxiH2w5zug>^_N(>)TT!tUUH zq~Ix|Sy^En081Xk7}hA?_*yciR?qOuJgesDjJ&#g*>C36SE%SH5(@)aSS;Di8d6ZP zWHZLy7oCU2L{{v?__)Sq4aS--zWi6`PHM5WfQp9#tZs6kH7C$6=;MP-Vc~Us7l~yJlr>-Kmv^!Xk-<#0rjpFa|&&p~g3DtR!GX3{N=Tdir!c=H9Ny-SHO( zP-9*6VItPlxy}odSRAGh{}*SuW5;V=^F=&?7B*1f@||LCo#kEM9V zKN@%M-5ZIB_JRVjAQ)sm5J`n~+#Lz}O6L_2>%^x7-A#HT7HlL_x{);+C>Wa&Sh^!* z`U(lviJ^5Y%>eWoq@4G>cvOq#5@Mn|{PQ9s3RZR>!K$}<4lD-WkBR)ysN6j2WH1h12llf4l;okVXvK+m~nd@aSB9t^vBtnrfi z$|X=(4P9B6*dQS(EC~)s5EPbuFA@s=KlfsDLfsTbn8q5npI&>#7$*FcUSWnD;rUjk zu|n%8f@Q}UI8^<(vcl=yM+ysol?VE2-4qzY=urPq#O>M3k9++5K=7u0tg6bHU%8~P z?)Q3FcLB@5)^~KV^`AH1dh2)Zq7OWc@(M0#O>5J30k8I~vcBos^Xe)PNY&L=>y`(9 zvSrJI;0dcAbd~QeuPNU2EOSheeS?p*)qqe!fWpF4!Nk1=2|OL%9KwS0SR?H22c zTPPf6b>UEBsmrzMJFA{@ZMyaNt)lJ4Dd78#q7wvJ1-FOE4W?A2e1xBE&{H_4INaCQ z*P+jHCRx>|bE{(}pMeY^+=S<~ga)XX&LVGUyVOS0cW=nS&VXJ^Mvr3|mT-`Yjpnfe z?#=KJ0mhotGlj+G=J>HHQ`jCU@GFWM#J2XHV=0VTDRlrWOdR#`Eh~~}WnOJaD?N(E zX!Rp=QbNOuByQh%dR_%bw^jOS!3#M(1Y%`B@-hS z@M^>kj*!_v7RM^lc|~EY@xIfsCf4eUEjUzoQXeX84K2SA&b)9Tg2D_xSE3P;Gk@Ce^kILBO?V_1$)OwvV-GQ*P=OtgVCiJ*8N@&i@N5_3oXRfna7@e z|KHw!>#cV&dPUGW9ZRE!{-Q1@zKaKA%w!D};6shX|YVIy;%b3elRU_f+kqg6=HQJsb=(WL+x= zj;JGmECLn<-s|3IgkK}SV#-~Skk`&)?te3r-C&+w39D<4fkFdXb<-bXDP|GtFL!s{ zWX%t|m?^|K7ELMaTAU?3ZVV9~_G$5QezCQIz?FZ5mx06rbOFM+rnfRXSl68E*e{3l zl^(&$ZkRTirZ<>P)6=IeA+Wj{^g%)sBbF+`Q4vvHk-`FQVa_``!U)B+4(5L}o*(tK zuWf2Ny%xOTuSj5_x&mRf?m}kxLbTJ@e2|J>QRNsQR@J^LP*_#bsYzhg)YS0sR22R< zCqCLVn*H(U$nD$J69qTaDrc3Q@AnVKYkn>%tiPbbS||_eKUp>8d6~6kRq;!Yz4X|# z&p!M9`~UjZ?@lsm-8cdQ>s8m0TdP*}>@IheRF@SUI#g3uR$2t|=tx<$t88~o&0|Fm z1F&jAWdWanSIDaEI<*><4nBWWXLU(;sXYa`g|F_xWF=cP*9pX2`Ug#Sd#$-7AY>)IVX>mYv|M!mR=Dn zY!~fzI1vxV4I$hVo|^tX>L=DRHF5g0S?{B2MBP~m){j=q$*QCSo9OQYa0vkG4BCDJgl`Q7IFS-o073eG24o@8nDSlz3q%Uw=86AD4?-k#G z+}vTWiVoyli)u>>>o2dct}c*=wM(xkIxn>L)EwHr{kfMIwSMvbzrO$blW+g}NI4q9 z>ata<%F4>i%gZ)ZmzCCRuQ^a%e89EET2}ogc)~-wi@*y$`2b+4_TlvpKl<$lQK zAu6o(%o0Afb0?;{Tdg~aii&D>xU6^36uu5?S!wZ(9i>nG0eO`|m1Lm zAXPk)&O+%-T)_>>EdUgfDr~4M3S{*;W)@`E{FV^gWyWox2?ds^Q6Bcq?m?(`r)N3t z2q+pP%(Dz4ubKx#B&qzAH)?67`Gh$4c?_fOwe6xnwj`)Hsb7w zVR!TD#D=K}OIN}$p|PWTMfd&{=IL%~ae?XX6v2wO(4o>;EnSxu$iqrDgvVo?p9Gd( zx`AtIf9PcE+O?X-4a5<*_QcDX9oh9ptNK_xZM5ww&V>FYJi2=IDmJ0O`Z6;L>$VhZ z7zvI9$r46LWWhZ*Xe=jbtVlla>mX%3 zs;SwI)0JJ-)(5Sw9eZvS*8s5A*J66;dgK&VXW0JmR?=BpAFHJZ7O?D@=e}CGd55)h zdueTL(VZQzxbC=WYhBgVJ4!)b?JnC>wh`m%unPBNxBosflgc$* zW*4x8Y-Y~Y>}+iEgSaIy-@!oUTNR__Wbp*+TNsPMrX}NmUT0hWjF-TI`rJ3?ayro zt@W7W$eyx2t6b&ZS!LZ*UViko>SCO({Qj*~)t^{hR_mV9>fN`B4(u)_9rYy3Y1j%2 zQtM&RS(xCCwAxv_^BJo2u%qmb3yD=*dS}O-JIJlt*I(bcbNBADGROXuz4?&|J62pk z71e2(RqQzK2=%lDHV%m4E5a6A!VcyNv4<*B>%e@IpN*6T3TEj+ER!0q-0n-%Rz@e) z!BG~%!gtbj9om z&`If|h^+1pyLFAlijQ`=jeK{r*PDCk(|~2nBosmc|6z-Ed}e0!@%Aex&tJT9ZuyxI zM%=lzth&sZOkaIWk6_I>LTXD$$Xdf1)$0Y48LnUr-X0sd9dx3?B2S1H&{J3;nQ_Vv zD_ekA&WecLulk#t2YukyWuMFsN3b#}>oth#s?u3iS@nF?zJ2>Lm#qU+IJ_=2oRh-~ zgNnfC`H)w<5A*AMSnX_Jz#q-aUW#EYMq!b}(kL_G&%bJ4`QsnwuZPv!^YKq^Gib$i zR+7-NK031?wt!mOtHA~CDR->`UKN+SKHR_mlOvcuRs7-pQY_kVYlrLBA4(5AMuUME zs#=f9q7Scsl4j#<-HyO|24h$|*FROVVdKV4U)@x?>duZD09ILT?dt%phihNoSzA%;gheVr(yI{GXWoYJ!tI^&q?i^te;>!7NA4&s+1j1L{iF@P3`tiXJE zSc#4han%TJCEb_M8Ydog*KepIR%p;dDed3|L2->zn4Nmo`&lE^JXQ}YnxwGoVkF`@ zI^zhDEvpk1)(pAgqlIRpZBBw8?4IQe?|S$l6IfsfsV-JmuG^hZW~O_wF|7JPr}J>d z$v`_!Wh01TiP48Ho@_e#a_YrUU@cbf69xjX^aSeLuIm#CG3HKb4ZA>Mk;3ZV7FSp# zux>MC-EIut4ypxCXC%HbP~|gMXcz609k2##FnqyT0mKSoA2k_pl_T>xc~#CTOcbSr zhVcs2S5?o0!m6su%v?4F5^H!Ecr_sB2+i^UFE{)6X26xe=Lr4T1AI<)PBc2a6vJAS z!usPo-}37wC?KjDeFu5L9EGH1i82$L~-<++q3}_wMOr%O!p4+?wBUdf}){(NB z@|sV;zrE?IDLGKR-&GE-@Z+bds~`VE&7;pEu&`KPE#|dTcKgE*tjCP^t*Eb_+4;=+ zr;0Ig9jh#tSj((;N_Uik$SQ?R5iF&}WsU+nhM+7Rz^XnA4FbZgzpsx*2m36YbOVpT z@Bxj`^^uP1i;oC`NrW2*HmJ8?(4GC<5&reOF)V{safM|vDZbe;tky(tye8SwMq7C;FbU$G~oO*J3DzK@Z9%la&^D=wW`|32dm z0b16YM`tgaUDmSNQdjw^Rpn)+#nqn_msVH19^CZFht+$^09boy_TT2B$F>5Ys7M1A z7e!v(!8W$yHii<8TyoSUNkg zLl=^&gBaDPFYqV~*aEQ>bOa0f96?}Kfg@Z17YeZV=}|1hBLc20eKbyp$eKITeP(J7 zU`n5vV**P!%(q_E4b+8-4i_FoR+XRdyY)^ z*o}$``0TWwzpyS=PyP?i_4bF(U2HwydhVhxa0SH`=9^z^ZD%!-kGEasF0%j@UO{7B zofX5W})_60(4T8n;`NVK9UJIeF>P zyl8YXS_Qx&WI1nw+(KZX!ir`t8=e{-$N^vt@}a@ZXlq^`pMwD`exP4KVD$$Ea{31c zmlW3G6c&oCzx&}kpUZXD?@6wQrDbFUGJsh*fs-J#exfU_2j67&5QSFt=0rh4s#`+h7FxoCDaP#QLR45xM*WR}rUX#UOw7?ESn;F= zWYYcxg6`-DSqO_&c8_PfvziTyS6DGFcsQhSm#=H54>|%>JKtHDIG*C z3GU(7fRZ<)4Ej1MoX&jvpil148B9-~%*(?(D^yvattwGr9duF(*7M*9mt{^}9Oxg& z9-az-ZJ!DS20L>G2l;{F908y!$e^!4VGYVl3Tu%H>x)~G^RQxws{kLkk%8Zi85unv z|NSRP?r@81GnPW0t+0x$uCi5I%F9cS;6&wWS1HZ|EI(4ZW!0;DcHDY=_vS~>9oUX} z3|sXQ?o`HI@0hdx$p>~m37+uihBuBKrOGPf`R>RBeybLYu5AUFbu3WCr=XpI1@M#6m~WEBg7fUmy3po3=XEHIZ)4`8tY z!bVb9gUKPRWT7?K1DDXCg&ZM;u$uJ(?v&L))sgi*(eT)aA+e$?>b{qi!@_!_`wdH| zlWN8pnpc0_&{nJUsJl7Y5hiWod*K~FWXQrachXmgEb0PH&2y+sy;WFTP181t6D+tB zNbtY}3GM`U0t6Tc?gV#t4X%R+_X!LZTnBf8ySozxmp#w>e+T=t*L8JwRadX7F1d?& zt`vP0#|V}8Nd8RMXj}B|0Q;fJ%;j`n^lrn_(tmEro6R+@qQX#^6e-M&iikw{LyR`G zz__PQ`%%rLCQm5Zc#Ij$c_f91{=4wA7?S-2Fgz1|_bV}h&1g0DU(`-Yq!Ct@oSeMG zotm1qwu1#CTLfUnqd0I^d#%@f{ITNK`Yqf}88uHnW^_R@98X0Qu&m&U+NNC)ppTe9 z^h2ehBzv#Oybt&YmSzRB+sdCQlI1Z#2hgv5`0P)-7^weB*xJ2x1I*ra(Vi4LnCwqG zS5}tP`>HC-E6X~4RM9qo9mO6ARlnrli97A>jV*iF`=xIIW3-QHI7q+;w@Qa<;I~|& zFKRDqNf(uNg0e@$V0MTd{?Rs+5JT!)QjY==5D+Q7c#^J%8E+2$ zi*OT$U9e7x-4=DC_Cp#@JVnWm2FT&24 zibTk@Y=5dm{M$Z-ujVecSu#SFuF2*o^o`B?;CBu1!5ysa=&jC#$I8zVzoWq9R&*}G&|5>0*KU}^(;^iqtIU+0tWxC8~-@hi79CWv7~d z_sCg|)rPN*pR_t9^fezZplFb}kd6w0OlPhDha!~y`8y%kvEE?Kegq?$T_(t7r>LT= zo(B1)t1d^T^mf48;d;#5ARa0V%6v9#r!XvWSK^IN>9W@`jt(keJgY`2RvbL(6ftBV zdDy4=&_MN+h*_%K)R3_19=a(G+L3g%LESwf4!v$-YGa#;!KS#%6rzfuQr61q0ZXw7 zl!g~HV`5ckfwFxtt{YdJ8&tu`a~RqpKjtEAn*xbuFlpGyBo$CtAlXKW__zHL zs5{W_Vx2#ZNX0DdWxtAUh8d(4$eI9zmsph#%uN6=6dOaeJ9~)SC{Z}Kks?{{n@>t?vxsC%_&qJph1V%L+nR4Fs4S3eig;8fVmoN`1 zZDj>!P%3$>#Tndh*^8-9J~)&y8oetenZG$cv{`wrs~k> zHJC@kn6!=);m>S%*3Z#Vu5I@f=4`cShmTL<_CfzxAb`YdeYh4v?cX$KRoGJZ2Sq9% z2)b#hUcoe5)}m5>WXknp0XwUMqZlj%oQX2m_|WmN0HK*R%PUfoN(<|`B1=543mosU z5|-Y1XN)}r4dGZA4-O6^(pn*+C=88_>TJ%CLFYocEKZ#h54>8dS=Z+3TldSW$>j76 ztJ$=`8vEIABy2QVjTZ7Enxf;a72>g_+k5=cOaw!u3_?({L$Bn|drX*1Ue(djGitG$ z4u>{r*&nhMk3($a2$ya?Ylakz_5?}PQNknR))=OzH&6lHtjn*8ZokA9Gq@lmDcX-i zbGU)(q+fKqF>l9n+j`6==#BfPA@2IIr9AYw1X2C``9+W(vLGxufT(Qepa7)0p>|8W z!|%<7Wdt2tsp4Y(R^_z=KYiKVQ%KMedvB2nRBR+oYt~~|KSPF94+vFiwF9+kx620{ zQb|c^Rvk}b3qMlw%}!ptXZ436yv0MR7q=x|Jbhb|pe`Bn?dKO33)ma2^x(juL;3<{ zy87fxTMGrQtZYda7xhI&H_!Yo+C=FZPrbva^1_?ue-Ne1veuu<0gSd8wv0eZN`}iN z9<_S(5SGcZjH@b%G44_?Y^;IM$9|b$AVOulH}*2t$;C_u=ZxA-o*8NNsmOu*x~oq= zY>ylR2cuj=#Js4w%S~FFPw~4Ek92^U1vA&g3?&cCC>W>~set)z(|;Ased^TTv+?-_mR#t4$L3y+@|2M|U-tO^dGLx!1z_3wx zW>{_<%X{ZXiSfARH=t$R{K{{LlsYhwRmWlJT~ngYVO#k1-`lRSu8b&!$1jh0F=d!v zhmQ7a0*fpBmsDPt-{w(g^Q0rW05>F zSka2*QDF^%v}Y6g!m6Q}k&&aw36}1Mtle+lcHB1u)>~}SIX*gZ_w)DNBIFuDxteE@ zb+H`S;;uTVM^yE)Sor)K2=Za`Swqwm(yc;!dWPrb_pj zjm9-2ehL2wts}cUI0T?oAJ@H&G9o5gxcsb!Cu2dJGRmi5Wy1BwN#%n9o<4yNNtWG1 zO5@13yw#`Nn4G)XfW0%yk1~dfci2=~S;lCZVXmltsIEa-&tZ_Fu7rd1 zT))ZYsE1G%`c~?i@uBC7M2U#wF6JG8!j~}g^=Hhv?-h`gx`pwo|71#F%>zb3N=FBSBF2k zI41xXe)Pn(71S1ZX@o>p*4Sjs3kvv%|2oOe9FBR5j>gzMjTuyKjOoy=2y$Z+R!E<$ z;IFZ9V*gEHdwm=b5C$8+t@1bMJY#+3uwgM)7XdFY6KV*5WVwzg%xmPR3Y)X?-N zrVB#OV&&^WbtP$njtRx3kff5FF6`9m(i9P3X&oOIo9_xK4F76rXnlg!w%|ClxnD0# znO48^*ufj6U+i z$U4u~g3Cwf2gg)tL^s(g@K-CUVOY02NxSm~+13iCjqXHuW(Lw2H$3%MClG)QsM2q2v&@&D`JyD!W>*NDhqt+q9vYjNe!W z!~6~+qRwpm!V&4(IJm5K;Q#;)y2^DvxB46*YO}j0B)@OJnj9xCccl57~UIIx2mjcZ0sG!3)L}XE&WmQrq4eU zt9G$I0#v9KCe$}_;hjIdy-D;B?7h7uTcQFKLKFhj1z*?w*ftxFcuxOiDtN;9ux6lt zKY#X>Vx=xTBl4nQ@CvH|uM^r~AW?$SDb2m4D8!X+YZoSi_f)FRJ ztWB!w{s_7#nHW*(kka%td+P1D8p-(B58ab^;qQ3<^+J>|prIu)B5-VtTKPZLguLz! z)5z#L2-mDSJb8K(Uf7u`${0w8lH-UR?5OIVxXoNzD*!*eFRH(2EG`158~?=OHEO08HW*T=KLZhm(YnQ*-`pF)Y|x?g{aVI_dBxntcz~aMa;|{#W50wS z2C{FUx-6m&^KWm@Z+aqRz7Etlv2i!t-(~#re^Fx#-U6xO#zx=K)+i|2Y^u9jMvSg-<@nqv+45__V|waJz%Dg$BYX?`Fu|-(ADW8#>%>0++ZEWq_pMO(XE{#d zrW3xc`>gd2AhJ4zU(Fzy(?Vb&{@pwMz=T*v$W^RtUM7y6q-6MDb#Dlo$*9Fs`!V#J z-34+A8F5d=qZa1gc$D4zO4 zgt>K+;K4gH3oZ&IZ4bnXWdncJT#Wve#8UEohX7KLj!?6*tZKNM zJptd9Rm8tl4?-35Z1^=ZMXi7mrYI4Hs_-YuhFPDAvovCkU5PTPDY?6Fn3J11JplWU8E&6pYS}K6ZVxIf(yCw{RFxQE`oFR_@lwaK*{WRf`#FaSJnW}e0906#lm6+D+X2oLT5gH4A|~3WKbBXUn3beYhC5? zZ`!izkgh-ERHe+6P;qKCUt_%zrhdElsnyFMr7h}6i{1-ixC7PDK#jE@G zh5aVG45NLOad`8Qv0ozUQ__)f-yOozm*K809YFMi5j0eU+b9wrV914sSXH=C14J~` zbTQg4`H?oOsoPRmf1{$NhA;CsIx2c(__l=VnfaA&6s7N~FA(488}4O=?1Z)|&#=ze zLTm4nTe}oRV_!3|EGbC3OISI)>I{XK;geD_=Y)GQ+NJaAuazuu zBF}^T+lvFt%I~-E1dLB2PORkGVNO3A#Ny;u3BB>Oo4$m()r}1Hnk=5dHN;ZVHF0{o zujNVAOKuI}O`4Fmlf1V*;uaZke6E(H53ux*!amA$04&Z$$(xyBsc>tz}VW?@wA;!X?YzBVY z8-{pXmZjn+4MYvS%TfB%XEVXS_501XGgj)-N@3_Uj?BjJh8A*Olmw8z#+Gr4QDqrV zJMxq5vFuw&xYdq89EJ=^^$&~qH!H6T{<_vv!P54jX^E0xSzkox+1o`#I%edph z)*HjYQ9#$GYX$*c-zouKD($s+*^c{AfI^f&4rVV96=>IRL2nm7V{t@S@m@6R(g0GyRyL8jh%FSmREJWx9ZI%=wb7p zJjQThJhnblQHi+Hr?-e|Sp}iJ5|Aobyg!fpUU-E~NnaH6Ns$&@25F_!BI)@t>LtV=_coiyTEv=KZ9MhRk30jOh}X*IQsXeFH6J=+fG0lx9>f<7|BV z5~I*ep@UyJ*|U%vsowiape;yKud>*}J$(1(E_qW$V_^}06d6>1{Qif~J9k0N;IEHW z?#86)5{^;g0C_n^EkZ%*fImi&fKW2D)8`nVCk{eQCR<=X<^zY|1eP5lo-!~Nk!cqj zSA|orySP)#QXJ$0DX|j6h5b+TG00nqfbHz`*$C$GFg}NC{bia5NTx#-dw~}Pq(8X zhcJ@EN<{NXoY4aFx;Qaa4~jy2MeEDl=8b@gx_>6lEqCTt26nx)IwuhSH-eUDH@#Di z#wQDQENi&C&;=)FcUGCU5;VWtk+FPQ!c3g}wWxJ64>7gHyilsY1y(HM z2skc{UCJv6nIToV8aR^UD44eVtYn%$OwdH=o&&VS?XQ`07Ox5R{}80JK{SC-lS26r zN&Cs>J1e4z@Ul}#V&!2^|7cPkRUkV5d-5t2)i)r#$D$s=HxyVfVgR)E7v9vwh+}Ji z+Pv2XTU^v9WaQ^XujJ$$sD=ijQuk5>lFer>mwR|-<%rm(9e0L{9g9qLiMD5ngQ{YQ zUimM#st;31H_btpTZe3N^xb%Z;h*Elt{eP@{)%Zn$ z4FKJ+uAaq-5DkHlNLGIYzYmT-$Q&60#dd1am0oAAhQ0`7!f_Iqgh~a4`~;AZrz*@d zrp!manEak4`3BTs1{-kr*dAg74Kz$cLX(x-^?9i%g?Dk?f0kHdx6(mS`i@ggD`=ys z5-_OJ@~*ZLPC$sj4J@ASN(^dE5>!Ot0+xQF*<&@YMb@XjK!yoaumI8AtH(3esbV@1 zS8>|A;n;E3``8p#v-V)1G}FFTX?d=`Z>{SCTl=efA~^7%#J34O2F#Kg6f=ZvdT%n> zqDLrW9at;Ro60D-5|Y{+#TIvi8n`20-}e{S+}idqb$#cq@#q?GoR9<9M-@+n+q9_g zhWSfPD2{(Anb)^`yksDY>0U1%^GafTW^(MWjwbi8itpe&8@RsVeE9tW^;{RV?{L?t ztNpyMzXVh04d48M?nieZX0@NBiC1cqEj7~5(C!~sY}aARDVzC~-8Y*M_gCV}>IixD zv`d?@EMZzbQ+Up)B?Hywz-HAt`s+fvR&HDLk|F&*YlDk&HYa7X0krpVd*yPwpXry~ zMhP|Vo$efc&hHDFqP_#tX;}j5uIPB^NLD6+rQk$4^TmdZ$4RA&5vThE!TK9Fc__#=!2)pfh8}&J>;0?@~+eOfkVqjmr8h(m)xtvFs|K zMy)5EcCc;qW6dLLcxrY8Ow1oNgT!?Bx8^R_7qF)VuS+(HTKJ}CYfz2Zg@nv6xVjqr zV_Ast5BE6AY7IS3>k;pFcufQXv(hZW#argepx3~gGiXl5_*+L7GfuGhh;iWE}Bglf=U#e0t$Nmnyf!<3jzHsf_7;-oY*mK%!UZqa*7lOwhV|#>Ov23 z#yYfUX47HPD@4$wlA0fj^FM*B2GdH|$DJcJO#@_eeCz-DZ(+Yt=RN$J#F^$=O@Z(r z^#3S(^zC{@MOZ9_Tgde@7#(1gi!CI?rX+`>r$KgmhghYI9>mQ`P`g!mB zqAoj*_o$D+JX8ju4ehQfq5V6{&EFVgYy_OZ1-l_(^VE{O0~0ESEgr>2EPKckv#YdMM>Bd z58IaBV`b)982h1x7-W|WW{NLfvfxl)7SO(_U~#$~m}-g;2AtZgzbuuiaL;tyo>p5$ zPe66mfr|f0Ow%oy7KvsWInKR-T9Fa|QM7kkta{-P3W#IG%;3Y4R+e_tcc2??II~KU zrhtVy5$~!@V%s0>DzD-XIw@g@YMf?d4nI13u`Vds6p1y%l1(KFN0HZUTRU7i;Sp2A zY0-DUb3h&hbOizZk2*^=AkHC>a3M+8twoKq4rSd~e-31V8ZBG264@ zhAE|cIKrB^f;IAVjBpe{QT&rK<x+0nmjFHNnswGYypsfx8bf66gwlFj|!klhr= z82iEVHvRsckFyCLykzNUxco;Q6!JeIcVx-mq8z)tM3h(e`{2&UPi|ltF0X*uoGQe`i883CUf?&#bG1_O8moO z%x!x}S&UKhV96;_9SfpNBsCF^t{&)h)%^BXIzbnbOt@ovGY4aFi=H)+tcWEfYM|zy zuSTdN`qD(>=;pu)reP})I@&S?c4nl`O^&>!mngC7*F3I~}mrr^~^+doA$LCJg z1ZN}3+>9%*2|5g=?UsSZNQNY!HeB>rNHJt zVG<9&4fOI7AIZ9jw8Z48>66u zsB-7dV95ZMM^kggO54wPN{ZTEqTxAaJkr}<`H7^W)V2xd(W?C-yT*Qxl$I0zyVGpT z?w|ZqILfI(H~u5+mnGY%;p~qJr=b;H(yJxb)`_oSkDm?8`20bcyV{xzSOO*OvsVVy z&jGNdx+KQ=+rQsS??tJe=1?@4dHC)?lTs?^;K!L-{B4nSfRc_F%|)q27{!F=h8e4-eF#_qr+J+apSU(NFijy)J1;U{T?QJHOWk+ zc;TJ7Qno=`b3-I7)3~8EX%dTrsj|P_Eu5KxXs~mJuD9xftvF4hLKO@9k=p=g*0J@L zG7It?d6)JPw-ys7G>-d`cjex5#HW|iy4b=gS6$PGP1N7#T)}&>+Rg^WH~K=sH?FvE z*^`{(ph0clX=v?=ctHrw>gd$!atZRhwT#|qy-8!^pbBoAP*ImBXiuUyHMaAz7}P;w zz_m=1z4G?@lCTO4|M@(a&NST2aCh;O?hteCpaeG;!2y-2@pc3gaCfWtK&wzNs%S4y zygH0mtpGgLPQ4>L$KRAC3&)pMp3DX38mjvacWRp@5VQk{$m|)0csEHHs=?*<-ad&M z{PK)1gBKci87Xn9gsTs!?d2Qp$Lquuly^fTpSAYCHBB4?NAn>Z)%jmk_%bLcO4~n` zs$|gq(#w+aDpbwV+OM+btQJkpvLR9CP3GU%PEGg=RckD0 zm)wZll5M(5_~++t#R%zQrfyCGRCzQ4Z?!OtOTKOT8M8~5)!$ZVHAIsZpI@qd{WDVk zv4CA2{XM^MnuCP(#Y;6RzjNvOb>PjVUwgRue79xH@)WZ^p2qmTs>4?!t6XaNtM_GY zS~Y5e5gfRLG10E+AdMq9^9U~R4q7Y#G!qMuNK(tw%A*-1uWKg<}uA)x7IWkn;Q_ z8$*b%o5c1ie6??n(I5~g&FR65WhtGuXnR9*U7v0{Jze-)q+?1nV8P+iV|VXQB=58z z&;5NOlhMCrrfc-hVsuquM6-u`k6h2t=by@uZT*(}v)1UZz}%z=*kQ&QTz?dl?v0K^ z9~zW>RRs`xzT?Affm&ZWfmJwK2P&V81lElIsZ&Vo~Au-&-Gu8dpo7Yeyw3<`ylcTNVvQaJKJxlp5D$Ez(CqcZByHsSF;rlyPcM= zkXz(5=sowwlXohrtM)b6a!Q*gd)_o>XZQI=t@i3+YzE( z1vF6bFFZJ`B%hqUj#jan86Mf^iyov>W-F5Rjcxw1-;g+b2vTFv%o>JM0ct>5c@h{q z_H8V0g;WKQ7DCS-m1ik{Lh?lI8@{3D%Jj1<*f76r0fvb!5a;p6UTx9@L0Jt=`v}IX zFic7cO`@#1?PZ`5?6S`0wc_RTx!qTZE-96ScW|lboIXGQHr9LwvQFmr6MG)ud!C+X zn11aQzh3S{GirYfSUW|HYJZ%bR#p|3XwCI3y4@FxwT>75iz4(2Px>ll0XwWhXR>u> zDb{MA3AE6_c8Iw?=GCi=%Jp)De{Kf}UJQJ3+c)El3H8ch!Rzp7sTHrM+0TFT7r27ceMqaxveG^887 zfz#}ay(raFjif`Uyix>itb`gI;J&kA0yUMA3(jm6DqL?ws=YLil&?vll)=oLMnT}7 zJpR;BEmUPEpZ3fXo{D(IB*t3zFZR#4Hx=PSpvN%EXTC|R?E_Nj-{0{2$`n9f-!ZH~ zgSJ--B5%~q)I4K`km)yWLuNsErk^L{2sec!5KXpjk^A@WCr*J@F1kJailWK+5UqM{ zS@o8-KQbz(j<#V~>m(goD^{N2mAvb7a8|1lm6gJi0=e~S7jWa0I}y}*bvm=T9t&9LRh2Z1EB zbL|atDK|FcmL%_;)c);F!>x&4KLeY)gPl=z% zT=_uMw+g=xy_1ojO{$@w-+gD5$*ym3A|rqIdPTL!(UxHc;gDaMU;}%-%)jJK62A>C zkCM2GCKRxh__*CA-1hCN;>91^ulv~4P}fK;6hrnA56BX|i)gz+3!M;`8m>SKpnflT zW3(+2N7&Z(EA#!qMpXASlT?FKk(#EgZAE`Kda!n&66Q+5KH9u3La(WBy}y#u>jHe@dc#KmM1mKvt#v!Iv|=AFM{&K*UU*0CKzT!13y`^gKV#Vkvb7Gnw;3sjLUzal($q5 zChTS{R+WpY=%v4iqP>$MVSBkM;ej+YSFi&3J-$s@5tBg=gl;^)#Qh9D;ngJ`SZ*&< z7v2rJ9go}k8Aa_Hfjkz1P0ShI7ZRqmnRgYe4Rt{DY(GflABttndafjc97Id?sLB4c z4~47$m10PEp!N?s8ZxP{23n6kOczIP;DOV!5-WwSUm;0-X#OE_v%Skmy*)-brQMC* zJkXt&_iy;N;45!`gZaemL+{>)+?J=OpXV>RxuTa2C*6brVap!5cZU-VOyagYez*1b z8{RvK9vDDX->I7woUsM*3KG_r_;+nX}Vg;>J6uU(*wDjSdftJ7>c^qR;?3-Vz zUpF*q9b9R71Esa}`_OdXUxiMb|7Uv{ZQjSYx`wij?&a+!9bN9IjFim6HC`D+eU`Yi z*S^uiJ2O!F+3VV=c~QH{1OGJ&)qtioVk+C?i&6V^B(;*P!qj-~ul_rqf}V%d)@Uu@ zEfw@{$IZAy$NhlVAHUO_SIYX?cHn=2D{GlmulmB_v-FO-=e<~k1*hs{z3NN7^{1@u ziFVd`8Qg4iNtFxX^@g%-fS{xB_L@(#^saxtS_-KHJ3D?NN2Zjxp-oc>I$Jvb1^}`u zE#+7lpTYvbJgbIfH)ZD#tFGj;kxB^jS}$eSRYd_xhw4okKQuJ@rze>S;S7pQHYy-AvrM**AMbZ9 zZtVN$#@1QSN&O^-FR7-1tdP*>4Lq;m*&a1<{z(I!=V>O62l+CIi?%!eA zu^I6oL3|N&PjKT(3AGxV4iY>ocbqwPXjPh z6W{IYtT&XJk`ni1?3J^Exw^opO|db+@t>(FxAO|P?8mlFY_0M%W-q9+)6mN>rwEB5 z&g3fijeqK2N~vPC{$4koEouBGOos2K3V#Ml4}TU$p(6`Ym>YfMB%;ag<%!nu7i8*e z>x$CG6sO9+*`yEKh8<9IWD-oK=zYnO_nL1=k2Kp{86tm|5)p>%TT~nRn%jOGZ?`Qx zEsZm!L-=*W+iX$1kZ!1ofzEB?B@r0~^QfIqhR-pC_$^6mm-O5h3OXwd?j|59KZe2% z(ph^Gx*i;E((gzma-+X9jhRjF7H+%@~3{f^}GHBaSX3{ zbOd1hK`|#1m;-4}eqMlR4bOn+$-OW)A8SNIYVtTIiHDj8>@JK z?52>A;7Ut(&}G12Wc^YYbvMQW%!Tzfd3rwJ_MfxLI&tn2`MvAD+i&yzM}7rANw!pU-dr&F72#w6gi?W~7^*C-K_Ngb10mj^?4=wlYIN`kekV0Tm`zIv)cT>OqeeYyQ zxs&(@0nlQ$f*5jf##v=NgeJHe+x_OjYvlIWpot5B29%^xijR+v0f6bvb5*%i#jbFE zrTrrfxcuQQBNIiuiSpA4{4kG$U*uRewLG$`90?4Yni_FvaF#uYMjy0y+n6Cvsho7@ z!NhC0qoow}y}Z~&p3{#fXt4rn9Zc3ublhL}##-hwPCdW2LA`-t^6k4jma+;d^!Z}s z(HyQr&%GQ`L{0bF4J4z<%qClgs*1kV*m5b)DkD;4Wgt<=cAA#$lbm*JP6g!RkMb{3 zHG{I}f7QQ#$)794-NuUC=RM1ze@wub3Rq3-e)HOGE%>wBoa*s2LjM9JzY3#9fc{vi zHdvdA6WWM7>?*tcT7$@1KrZ-1z7>K$nlBH>V8~1iMaTQ<*-t()Q%z_1*PK2xJn7Fi z?^!v;%q7bQ*N~*LV!|K@tmmc5Z zK#s_@Mh>|wlM?fZ5av$!)xqWEMN}6JC*D#-uClj2y1x*+{?cW?$581F>^E3flJl(9 zyLC^O%z8*>U$SIR8ao;$t#5KeH3IvhzKt{ZV8Y|Q3&PS{#i9Z6TwY%?f&UHUzHgcN z2K}LnTZ!|&)GdL55BE7bmS1vc$EdxW%cYh_e&1~J-BPA+ZjO4DNF9f3N3HQ3mgaBC z5XnGvLfn;jZk5htXXS8Rav%a#{;#IX$eg)MBCF7SEKVYK5c-HPM%dg79kP~H!t2Lv zv_|1DwCP0tk?=}vt-K_j^dd2E-JYJ@AiSWwr1(NAl|8K253M%SFs^=zsdy5LhQ;T5m2&K*svjuo}B`8 z>Gov$__h1xe*D4fUUj$+nZKBvk?_}KKWp?JxfvX|DTa{(Ya)I^!;Sz z%;ezR;NbP$VD)3aHgXVscxe1Wg^#X=_pZUJwN05?4TUw3@Izw)ANy53DIp~#t(OUb(Ssxl)#NH^JNzzTz#Kh1+GlLT@*zv01 zO&IV@#@-vjWNd?7olUVvK50-(NT5R%WT?r)VGd&mBZ9BJ-qRhE|IPGb?EN3{w(xFk zUOOU^baa6_badMq+m){#8~AIm3@&h|=i_OHV7Ro{Lox}g+E$fu-^BGCvKCOB$iAI$ zbNyr|_m^?l?>(%R_wAMe2bil15*~gdCrLBl-)&Y{5AO`75dP|Iu{U4Hu-eQ4*A>XO7(n|zzE_<|!1!qH` zai6N`Yn8e~^%bx9?5%H5;KaVrjmXNwFI>3msk_Rwp3ZI?N0NCUjISHQBEu%3gij!9 zi*3_~h0#t^?g8%r4*}oBaiNKWv{+(eV-MTC*_FHgcv}W)`QcjReOF*t03ODZ8|my) zqiM||%^*~$Aa8Bco4V7@^7 z_9|4oTVtoBRH}NGUu?%;V8#M}-@RLPQqh|Gt?WK_Z~EJ*9>%ywKy1JIgt|<N)^3zlShyQ;WMJg3bHA4w{Er&)$f4KZD@Qh0Qu_74Y>@$XQXd*c zroWVTj0(s%ZGYY10OME#h5Z}Ay4TJ`ifg_ifJ#`Oi-XSGEB|f0?fUvA2 zMF&FDCJ;?NQ45dWtO`fox$Uk9DA_gI_c&i}Hk1Bz*(dPCV)l8(eDZ1P**rp6iO7No zkDiZ6LLt1kKpyOoC0Dk59A{ykQs)Nrxd^w~$$y3)Y5zD2smQ>XzEAJ#{M+g2!J^Tq zo|d>ud#N&1IL~b>^ah4%f?!aW&K?-j6AMO%%DX0|L0CfAmq1OB+a1-Wy4SL~o{q4` zeb??tXYg)0@;)29dDtydO@%MHO$(xDw}_EPpP=u>1up(PZmy8+`9Crc>ssjVST1ls zsiP4HD)X@M0~prPI8jtOF06AgA)J}&VS+!g+5Txnqcombzn|?NpXt!->(v=h-G8P< zl12-$t0MJT7Sr~4X7}`sp@UB2TWZfYZduTM8PbU<8aQ}$U-Nem4E2c_H@j7y!+m2V zHDcc&#ZZ{fH;lie0f$8U&aOMoUHh$l9UBc>*E9dczBl_BI#keWAG?x`=@RiBgOu=L zVomd4rMAY@W<6^&AW3T&3ZX*CG2XG=7sJf@TZ2h zJ#EcHYe*+L2nIKs4tAjt>|C{OM{~SAO#J=`T}RRz6pb(0=klxV2s{3XZuDJZuLlBa zUd7_FR?ow^>_)3hI3r6$P)vaZO}E7e^w|jF9xdE>*EGpXXA2J6(|618lt33*h4aR$ zmo~_)SR?gE2K05Fxa%L5?z$f8xL76ZZ`(Y{51!qh&g*QScbiY;T2$V3_}-D?(ip9V z`Z(Ql5T8Umqra`Kut*CsN>yzKzWjR*YFUj&MpwD?Q4{s`BFbM8y{5&@g!Af%6U>Oe zy80RHsQ-2=WDEk{L?ySH{UOhO^vT*(`(cnyMsW4k$`;nyf6F5D;62gEcA)?IkPPbX z_MnUiJ)VU=v_d0Pa|C_US+&p;jB#EsR(4&`sU^AuyUzNQo!FV*Q?z^C^{HVY9vhng z&6`Nm42$0G&25fE&vEnzo(yh=@aedEUhL(bw>ObuSL#A*d4C&Ep#su&4&kz!s(4Ou zZX^GeaX`$s^f$8y&YvOER`(9p5#(x>=RJ0JwiEa>+}O*li{rtYugrLM9!l}9-R+)+ zv=0wvNNdzRa>h_FsaxkC;#vD$&Me7QL4NLt$5V|BNeh*$8|S zARlgwF7(2*4{`t}Tebd|aeL&L7F%)_qC@E9?_s&dH`OW(Z~^LDMb;wp*%>;E)uwWL z)f8(I1^4vO`E?$zawZ-tlMVzb9A0IZtz+#aa=zDnU5t9?RZmPdcPQ!?^1;|o1pMl> z(N(U2E>+k^^J_V7J3ONL>0)IwBHma($mg=ak6jKb=y-AQ8@`ctuZynV8v6vexJIkO zjvH5-cIaP=kt*DFIRfXZJIGKk1lv4!G2_yy^NI%`6b5DmzDdKwGh%!oo8U;xW<%O1 zw;R)?BHZI$S%30lpGURI_s?f)BUfV1qGq4k5)^UIGy^po&g|r?{?Lor78w6F#61oW z@fcsbgocPW5JXJ86ZX8*h6}IpwMSKf)w?I8)JzxjiFed!7KkIrxbWw>@LfR@;f3Yv zhqZ*PU6=ih_5N;Xq3Mr z3!`(by(u31cw*bYmN#t@v<5gf_2-hzPX?La_H5f2{6CEvjh<-yJP-j^o`r6`rl^oq zxD&T|1OKPUsiEE*+<}M|uIIr&c&-f_t zk~%=tLJo%w@a6tFqcqW(`@ly7x@DhsUU50s^1LnhW#kn&8)*D|ImUOp+BxCVLQ(Ar z-@9RnW|rC6D)za-x3e&GpfVZB`?=}IwZ}cab7)6J^ZA_~NSm4jd@@|fnGDqX-&laCt6>SHTSDKF@qY_WTW|y7jWtVN z@B8za&NcG)e)RELj$zxdDk1xCQ9cT*+PO5K7SCR~Ki z?~VL-;60{5LrQ2Z<1bHIvsF}R0i2fBPkC44=;BrFRHlhwtJctrafza*k$J= zsl?GQ{-lcwp&P2O7RE>$*ncy6At%Jnr;^J}=KP!plJww6)xSxR+=Z=4m8QJ2Ov}pE zT`Uu`&DHb@&2D|Cv9OD*ci!h{3r87^>6bBubfJScZL2r`KLEu*I=@OR!}i58ju-K8 zuEb)sJ2GMyJL;Hfw>Lhij#pZW+2yfZwZ&#L<}s{$&# z3_?vWEPCOg_tGY8_rfYpV|*T~Y>0KX&~#t06Q*D=7zlI*1D!r4=u-l+Pxk4Gj@Q>{ z*0rLc>DsEM>AI$^;#!}!TGWcVX6UPiR)i-UG_<{%R@A!sGNqOqu|uBlOY z;Hv?fL2K}TsV%C}9)WUDwu z9Z#1jn}U}VJ)~63V_5fuVL4+!>-f*U|G&Jk&vHGu5nIEvPSHK2>!mThRMJa;J|$g) zg;vtWN+p7bt}b|LB@P%Rt*ZsLOKe98XE@K$lt3^L44w!C0zQ}mzCb`HxB{?R1!&UY zWlGl(MgS=^VqQgU%Fx)VHub5dt-u10t!T#76s%1ddsn7DotjEd!76TQQ!7SS7o4)P z0=qPW9a!n=BN{h#d&*cbj6OPb3a>qt2CRas!r3cbbf9m_c$HJF^oka71FY`QpU<@M zKa2gVtOBekVpSrhCTtpl6W=SS%bJRNqH1grPK-J!3jrIOq6Bt?O)&}G$+oP0u5=W8MWU9rwT-i3Y^YJgj?rrn+* zqykt$s6pg0@MYyTpwG&b!8QSU`ViB)0J#vA5TCkM;GI(hRO~doM4!>uG6iTg1s^lT zAPn$rWd(vkgvXV%Zlrf4L+b!mw^(%7!2qX5p$X@<3l21%yKCMUufFI8c$s6R=B4@@ z(ORbR_6+UWZS$}RTy+DiR&`Op6`)dVaZUY9RTG3oYqUg&!rcg0K*6e_D|$q2hK6uN zo6*X0jlXM+PDRY2ZP){_5{s_EfwgE%qC;yOl919#f{>ZjONk?wB;bm88lzqes>Bn( z2^J>JVuvKn5nQEIk73;dhGjkR?9aYDZ~J7PIrL9IJN}GSIrvX+G|lXB_hH!#i-miP zV(A0Ou>g|>Yyt%!1+=P#$d%@RF(6`N14e1a7qlk=EQketK|m{?j`1K)t2nP9#abnN z!k`YGh$D<*!E>)c6l*V`3j?1nL9Y6UAZf;@w7Ur4g?pxmI87ly!LdGKPzYQa+d>N0 zXRM^BkYc6N2Edh;PHP5`GytsI@}SF)lmpc6ZvLy^&3^d1t0FD8DRZA#Ql@6D+kVYd zfmCLq3CAK7#4}*!nHuudy&LztGAvaHK?ya%VP_4n3)XQn!H|n%QbMiZ5<|2oLnJ}B zXm?CiMQjM5e5SKEK|&ALsX0wEIwpRO9IY?=p^8Zukvt` zftM+wMqFbYD+*|plGGHeq$E$nx_gFYoqywRzW-0h9hB*^!61uUo!m=>WF#f7vaoSQn*#UB^*P4c2^00}V^is_te|PM^W)p^dAZ(7#zO@@Tk3@b!h zJI!MRR)S-(kPvndM0E+4g?r(6OP78O(Tbh{S^|0nUJtyEfTaWiI#4WKDJlj~EUl;) z0h?q19lei6`H)J{NFUIm^weo%>b7B=SxJwh?j(SUL@utlBN8#W3g4PGX!vkyil54Y zNk+5!&Wxv%?~LCz(n(EGfK?%A4y-DQtjGXhK)PVpfTqRWL&7R8sG4duj|$xYXXD&! zf@a6HpRozkCJ9{J1)HkBeElE79k2+Eh&QpIZ;{cbgb=Y%+d?2oAWW^P0>&86;wWW< z7$;FN21JZlaY&1DSHT+104GGfqUM@lW$axHRHa$icLvA#jPyGg5EAVY0y@*L_|PJ1?|q1AE5x{H3*k&# z0VV};CZ0e3Y7#C4(~2e&OhH@-NM*>r8Q5(Ay;1@`%~iuHSIE`w?#(f!%EF#&Ajmx| za{-y|bw1P}b7u*0V6islf;*T}LE+kt*dar0#v1q-|X^p*!;mw+WEFrQpFpF|Z z#tt!AJr=dc2qj^hh;bQS;zNK;zKTT!;i`-unnH-T(aDU87luz!9tqNrA-r;+;=_by z!DCqWfMHqXB9eg(w7=1%NcbX;n!R zBZXZoK4im#r7^@ZSqTzYF?xlF^*U)-09dd40Id{-D3(uOMS?|;wN%uW4AR|^VYQGI zfkTyXdg?SVtTV>#Ga3*eRJG74RV1LQ4E|xz#~2qLMN|XC+Di&npT>^k!E|z$q5HH* zGHtAU@G2YqOeb~ONGlK$&M3i7#VE=?cMZ!aRJ-U{ca9kDPO0_W2My!W%m#7F87MwO zt8o|J<*s2xRdO*b#$vYsqj1H>p*1I3Rb!P9rx<%;49jL*_7I_fFBTu#a24ZDN*2X^D85H4aK%OUC}&tv=GdB}C+zbW*1d7M z11Oz;<2XXy@k4B=5OE98>js2~`wE-%VO23K4pqdSG@a2X94ur!%eGwUY{+n+S3z=x zHc@)*WbBHK628tfEQGAUZ*`xH6bsO*xT+OPtLP3bG9`+`kii`bIDLu?3s#dO-1yK! z9#6!lJ|VqpOk>wH76_8))rV(kz@1jmU^RICG@7$?y;le5Q}m@7_%50bp`ok{;P55j zC`6QFdNA3DVRbhkJHm31X~eR+Hyk@|8tm!=$UBkDChFk0nGcH%4^n)`p$f1okw~mn zVm~;6Cfddm))o`3f^{u&4T}%`MOA@l1W00FkZ?>DGCjduRJb1)j8!}kbSl1@^qw^a zV=4~|m(>c@l9>HL$nYljn-Z$AV-njXRg4Z2gDlU7bx)k`))O}@tNX^GGQ@(+-(WrQ zMu=h9`8Up6~|uFtSr z3QY|O7P20Bp9tqP`rq;c#I&6L6;<%iG;1XS4I;V z=rCL&oMP~UAs-p8XgH9G>J?#}Bq-)UKuO$WMs{RQ9=agmy%K|{}nbq}5H=f6A;Kd3`rp8xV`p|;<6`pGw*D3q;zhc=h|Tf39+Lj`$)Lzq%0ifWWZ%0$W$zN;_%?>D7q`((F2O69MP1b zt{3HjRZXjbD&sbUg16K57D5&oLV;u@G3AETDvd)GqgNzj(PojHR?JU|$`rzue$1!I zK3Q);yfj+i3oHR<>G-W-@#=U<@fFhmW)K=eVAx2*;=_d9hy>j=BZ3+CU;IQvMipN7 z;dWkq)}NEMO;ii@6C{B>vw=u4>60Op>u8-)- zxS{OLB@(w12xgL@C|WKy8jDu)^J2E0p)!!T#)NnZ5?Lb8S}dBsnxD(U<0?I`Ud_V_ zK5@nsTF=kH{;Sz6JYf~5JS?-`4a!R{^tWh>ta5d;dv>g0ojK{iAPi1j+>S46RVfDPIa;5S`75HwmGXk~Eqom6*# zs?%aOlC0zkAyyYl`y;68BLqWLi=$UMO$pHeL7JkJ3=Kb2Mu5WXMPDEgkZ0hD_+*S3 z$u4kiY zG@H%&bJ@wP)aH+>e!oAP!VP~e+UA!Qb8S)BindKkizz>>w`J9+-yellICIUPjZQAM zWpmkCKftFyC;6kquD5>tQ{^{R?`DyW5N8ZqS*urFFF!C4I&h;B2bX)~@Io z?BuS7PCVmv3Wt#k4FkYQ15DC^aw$iO@Kxm7pQc|;r;B4aOaR}+M`3Jd z@I=s6bT2yz)x`Q>Rn4oyZeX-7T5aTDcoSk*d_!_pC9kM)NXRuTl-&`pAQY5z*@`Pi zu0!;;0x|bsTp6_FbX+ef+KBA?U{IC~%Zem>fNTl1N6NKL_DG4z zwwT&8srK}=W%ssy(%1H~zpZUDDlJa>)ohP6DYZ=|ay_x0T+ig>Bw$x8ht~u&%=PE| zeUpG?3lJ*Ch+}yg*1cj_*1j85QKqWNJl)luHzur2g@o1huz+EWF{fy;L}||&8s16B z0$eE}vl95^nD{Oh5YiZ-?{#i!KqD4Vo!_nkS`kk|0|QUOG5R31B(y>`3t#Yf*KMY{ z8x@je>>4qO0;PyuaRCd1MPONJK%w+$U0zD=N?r$!rYQk^C7JvXLPYr(4okk1hVby1 ztjJ4%na6-u$>h+GWrY=$a19AV-3?8bnT^n-unXX<7ZHYCV?s``!l9ZonuL|jTwWPR zK938~l^axRV2L?6R0trGfcP&h$E~E2RP>}`EW_VHGHsxII24&t^k?Ax5x}d#q^@62 zIL!@wB^pyJX@nJ;Maq^Mo6BPiDzzp2z=N`Fxleke>|`z)Yswx zYX=%Jtliz~I0|YU0Zn4UI~Ul)wX4m!R@kwh3smuSFt#d7I&-oC!{Sy3a*8H~WF@UA zam$+VA(gc>U-<*lAS020H5KU9k`Y7JBk)%;GbJTdM;>%EX2*eRBG6Eh9%tAj2`fLB^}`}d&pe)RHFXs?=d$n?+=u7pqp*K&4mR=FT;5O1 z{55(TiD7wM=JQumumabFISXfHv)BArkzjdF_j{&cS;wDtJ!SaD6YIXUSv@S&u!vVt z1V}MpOPAiOpupZ>s-P9GfQ1wbkg6hKQ9&)eIKb0yP_idh)k2C?B_1SoYRp(UZMaNm z$zmgcjuH>>U;1ED13Z$8UB;9g2qS`)A7fsDwor`9#!ZMY*D#0Epi#sLQjKUT@;A~t(v#=w}j-hCu z%F;o2X7LzaAjS7(*?Z`TCuZqDmL52K=sDf*9m7IngL}BQo~dEIdRPNR@+@?9wO~Dl zF_{FbCRoK|!61{|;l;;nSiWO{fD^8ChJZ-0@TH4bm6*Cj4z<>0q_w5WXrW_jNnf7= z$XjjE`dH`)p_6+<25QR2^o98(gg_{B$FNPQ$$`d}SKt z5;6gc(s2^gKCPVgDR4v!8s!$*GGvGbZ^yeaKPnUnga(0O`KpxKCnl#09E{J7}B$*7>(noRRO4_)c)@6tTeW*$)=mC|3@PUD# zYz*iSnFcWJ#?bIv_<}fmcq|Zv@1uzEf zgmSgRgyCu;)-)mvZ%XcWYIE+Rgozl}+lgwKQ!)}&WLV^IQ*`{#!w6Yv<5T0z3B@wf zacf7pY{*tbnW{M8D^VfYK^emm-u9U7Ul;ky%)q{8yRdj6EEYSGd6d<=5=Bi})zK)= zGUUauqIOjoR!)Z5+C_~S+o)AZfUbD9JPqq!F)U_ma2q{b_npmsSiQYiZY8i0q^eM? zN=O*spcUXIcfqd!v5Fe!Sk9@W)lWvcq@7-IL97;tH*{`ozdimcz!PrDaM=OA7p>dK!fr!<#;I6y&(n5iAW+M47&?a z;bw3Z4%Msm;ZQwmY8(}Y-T7COEbIC|PeX=9_I4ylK(S&&Ln8_Tma;lRtFoLNOIm}# zc1!SgZo~&8JK$DpJFK{`Pfe(z+>9zpJ#Z5#BVF9b&QqjWD)Sn{m>ACwr1Tq!RhNk+ zRCCRwN?eF+s)>~&STP!)XjoFBQf`@Xrl^^)%Pq%ZM6-x9N+v7cM_5LMwj`60D@3eR z)EgzdM+~c6c-jq`LSOD%AF!I$!&(kjgsF`p7MI(DA}nOJ`?!8J!x5`EMwQz&ZHYVR zwURqrA=gT4W3D7iGX}>8s4zPwBA!Va*ychvsOSRP7<_UvDa$Q7*4_f9Rw6f+qV3Xg zh|<7OLBqh{5Q0HFmZdN2I!ajR-mLj5>=OUgqEV=+XS80fcMmti4a{D3A67eXNy{46 zSmV=g#IP7UN-%(lC0fl@B^fCx<7jP{#${zNGMHB6&1Ez!f(vw`m57Pj%^;Y}g}zl9MMSjBy^9>Ht*0j!BXo;p`(B=uR4OuQOk&?EsgE0OEzc{ghlFGR(jp2?gl_!_~M$FS}h!?O0h5puzz8*yus zAz^hrtV^Ap8>d!P6f5WifIzk0PNhqArBu>-wbE*-G^UM-+@G;ZiLFuvvQ8U%mupz4 zB}cRYgez@H(+3P7P5J;@ya25C;=w6 z2LcRo-&rRlbYj--?)5EHVF%d>ZzwhkS4->F`@>bCVUqwe+|0QZ-cSjLxaFQp7)$Wv z8cZUj@_j>aXXSTItn1er8`m)^H-<1JXEc_Z*4`b8#iVy}pM)T{#-NH@PX%1@Dh*MQ z54}d=9F`a5IW&k)-!UDi-_k{{9?Bslc9c{rh`HW2wn()Zf#; zfB*h|2@orr&B8N++27xWNR@r5-!FNi zg!h(VS@AEQtUIaj#0J{uG_8jf@7&xJtll7c#oJFDV|c|7YpmEM2Xw7#M()x}tLW@n zqDK|ca#Yy@HZ^A4c9`L9l9fhF78=#zLv$>1?WuIX4Y5YrcRMG43Q z090pI4E+SjS3VzbK7|!RMd97Yg5Rdq8oH~@SKYRH)m_J4s(k77#ApM9dkrxz>>fjg zT~xD>t2f^5OI53IO&L~lD0h8PDI`rFB#9AH~4*WceCgR8XtReyh9V%ZNL zFX4%~w*JTaCv*NDe{OPbUw=;ZMhWk&hGn@J7_39bt@5TBR#iy238V_v?GlyTIb12S zO|Xi3m)xlUG6CxWR;6pDfg*Y7#{^`Rs)9nBWVP5iJS{?d$D(_{k$^+VGnx!UZb{Z> zd_IWvd;$2#KtQ2{X4ywe*q1i+V}Mqyt^|7V16*-KqU9r!)ohfoyLnZFu&bjWTqTi* zYY0!%(Y+djgcGvdMXqXLKjex~;VSsDKXJFSOChhW+MrqkE5X3zbIN#*5-efR6=gZk zw53+6yL04UE+c`s|+Kl{_g;df`foav~2bF@1Ja?A;VY? zpj6NPet#?{`Qb2-COkHp7;SA$*u#Zk^@=uwkK{jSO zJAneBw^JJc$SN%jKvajZ;Zn&}&;mA9sv9VzurQrWvxXK_=orzcGoS=dDA*1$=mRFD z1WrJ-ryz8Z&p`o%l1b$9buz@FyzRiT0IP)40I)Jnj+I$ozX~@4vv6~(Rk#+I8jJN# zI@kC!!*%bjj}XIEDLLKiGAybi!~CP4#YBmiH5-qZO0`y1wvXx{uVKdun6cSTj5WYf zh0B4e@rn8}RMwc4q+;R}@*z~mafug8Ak>T!E~+mB>B?n+Ots}+2DX%I0|a|_6y7*F z$<=t#@{6GsUUE@F2go|76=_o2i=Y1KLtRvwB`e==1wYc=t4{d&scPzj3}i z!KU|~dG9++g~Fx5W~`%3jK-iB>A(Hwk!kQ0Naabj(x-#BeMprQUuQs9g6O?M%@;`B2}CjcT>K({XPQ2+gd>SmydkJ? z&wkJs;8rYOuu({8=d0AoJVN-XH%Em-E2U;c738S2sTYmq%i$(otC~nO>>inh zYlZub3<9{8NWR6=2zi$YyKqB-VUVK}pEM}@|Hk%WV zehmHKYqs^j+`qrA?cGthn`T(mKCJieh+S0$gG|1v=Y(c`%)B zQ7|`$%JgB!F|^=LlD|_Q zgVyY9@XZ?fu!t(%vdgo7rV9Mwt(xs|zcp^$WTHC5BnTp-K&aLhd9#XWf*)TL?uHl{ zJ-Km{b%ao(eUCGs@%QiV!@%z4BagSW0x(5^DfPevyFXDAZTm^idI_;8mjLwogt8M! zbVuFY4}o7#8(L2%)wce}S8`G|E42XzN~qIIQchAwaWk6BO8)*fGo~^Fsi$GxONO=Y z#_{8aj??oHd%$#l(;8NFJ*@bhkgHB?^&B|C3XHOFkmHriTSy}aDa=9uVPRL-48WFN z8Y`_1p#F|p7Uf)z)i5j~Svq4^T8jWJEVBS`6CfI==yHHQ5rGOtDh0K4G`}jxg38Ki zL^VXQO66u0ui#ifI2vg9zzwiI&aCgbsu>y#*Gl6xZqLTRMZ~IxVL2eIE{Y2`RH$5W zvXRx z^AmNAH@WtXIMova@Jc|)_Hqm&L{yqaU+(Y6crZH*DD!wI_;t2->b)R)DkJQS6B8rD5zSZ^E$ ze)Y~idcMP6cD}LsQNrqaSj%_Bu1+}URYh(WE$>mn8d%kgnShUx8l`CHz8UPDgQekt zV{xFOMbYVi@1nxUI<>{=1K4Vz;_d?|OK||gwucb@0S0w;Dp=5 zwKM|=)k$JIy^kqZBwlgrYa}GcgyNd1M>a*+2qBg@~CpLtv+L*3E&Q2ql zKU}NUhd1GLPYBFe6UC10YN2+mc9tP1sxegh&9CvX#5HcgT4PZmyI{rk4iqTGIs;OA zjHdZhlxUmb0oe7xU8e$|6e%KEKV zk_dS_=oq}Qr&Xosa(~Yp*t%vpg=E)U@D^|Xp!4>0IKeZvNw5kng+LSDmBQaX2k7+bes4Wd( zeN(2q*9{mNExIM^Qd81VJBQU&tke(qeN&I$Cs-?KI|&= z@9tiYVWH%{w&-Yx!?gD(2dXt1lZ)}OIniLy7Ot?{4tAzc8B~c8!_OF8ea3PKqmI(+ zQeqOVof3TT;!DV^AV>r<1tH=7eiitUlp#qgk!x$sqM;$$x4&m}6vqw|F>J)jeGLq@ z)P#hYIAn$Z0w$R;U~7FQ>#dV-%jM7+(cY8GLF_o$vw$Ykl*h2{t%h~}{D1$$`SWas z=O6z2`SZ_|H!r$Z)x(N!+Q;C4E2nxT!a>Hbiqy2CNTo>Wy)#_~hJ{G7ic3hcmP*yC zyA!jzjIok&TjTsnTSY%8T;~LQ1{P!R`GRO&N7p*@g9ZtV$oK$sjJOsuF&2<2!kll1 ziGgOehDP@GS{p*xH7hyn7QvP4v9C<;b!u2)4qN30KKh!0!*HE9HM}0}tIDYkug|ck zQ^X>#xo2l9^R1{z)Kl&BWR}QG6f40y*fTnHi&S{toSranO)xQx1Lt@Kvbxx_|7A0# zX8mnB2=&JmbVG93m`^6-yZDl_=Ag`AwB278YU!<}rY))q&CyChIIARxLT(_OJpE zddn1Vp{nT|usV@N1pc1lhTViKSN_)ku%Z=WCCs6`h7~yy zSPOWBE~<~fOD)hMw#Kujg-9Q>M+!d^**+@kj!IZX{cBV}n6?boUXW02+W#^_AR(00 zv;QR^N=M%Hqw}gSMs}_J?+(AzkFJND^b)z^vu)K=Pyb8kl}BF#V4P~k{`$z{{V|jE zD@^#00DSfIybP%2?}Ib=NToMQcn=xYolZ^bVZFZ@uyROOqS*w8s|sEXtPZRKT9M02 zqb{pFEDY#Imrv0&yTWO)BrI8Whq0oqWEm~1C9b&Z5D_X=XF<`A>6$DD&?6d@secy) zhCUe$@4A6Kax|=r9OyiO#O?%AFNFlGK+x%Q#pbW;GOXsVsjzznO)X@VD~HQ2Lbw=v z3|B#xYidqoya~I9qmD$LdVi`wu*O|;LQx*uu@VR|(aDstC;?J-dp}0Fcm{KV!PFXW z!WtvrD20TKe#JPZaiYdVtdzfJ65%jPLODPP9gJmPdPy2hWz__r%HOD}AJK>5*xyQf zrCiS>oE?3+UrMNwh%Ln&Tg2!u(Q^bsLagrq@9m56CidiW-}~~y!-^I^p|j8@!r#miptXmCd60pU;eisU{p0C0stp`kDZ%g3&Sr4xL*hGo`) zU@f5~t0)>wlf_}lX>kCO#YPBAHef;2r^rOOcxxW4+#W!pOq1m>anu}%89ZJPY?Gk>Xke{gLXGXJa zpWqoLz9%ZufM5%U2C?u=REkM$S(U?_$FLqahE?suT3!#UoWfPLbj9I{ z%aMU&DJNuJ{fc?qvCb&I+sBy}0og{J?xFSZp@Ch29&D~_xP?=<9W2)Pu(*chWJ?YK zp6_CUSGl5gh1~}bt5XUa5X43rRw!x<>|CLec*IAASz)|y~nwuZ$B4=ZiOYQEr-O3N^bj294%(g*-%Ff#uFWh`PYA{7)xsEhIH ze=4Vbobst8y_0m6h_O0;go`oTRAEMWPGc(S`LG@chSjVd*85Ed1VuH5V8Cf(VA0?V zI?Z)`1~np999bVg2ZBCODh@26j0M0XS0NULg)~|?Mni?VouM;U6gX8iUT7do8`DW> zC&a>DhXGav8FuMdbQHo)AC{5PPU}=ehH{{(Erw#d+=*|Iq!kbqQyYbZ-7XcQ!mi<7 zeJ)N|5TXo=wYo#kbZ5E&pe|jy6yMFs8*G}Fcr&hY*f~O2KT25Ufus|+$_^F3>?-(& zo5raw=egz*Mwv^2D^vJ8j}j9?Miq-)-TKs1KmO5=w`{!{m9qK#^yK7Le;&iIN@Y<> z$w}~H4XoV2HV#Y7QO%BNu)>@!rmCOieItj=hR!Jipp zC2J(k-lEjDUZN5scbAYvt`l~AsZ+1eG%)Km-k|HyPjTTbN3zk<1P_;C`Em;-NS`uQ`l4dvni^l%2vJ6$a z!Y|=N;i`n?{d8VT0znBq@2qkI>*(XdAw^gOMZceB3@cM#7AxGOn^z5ix&)67uC`82PUf@3Xt=eVTSbXnF@b$e5UonCA^GJAK=>yy3|hnR zleGX7K2?TGyrR2`Mo}zAS~1yEZFm%?Vo|%WGDAAmzPJEBmJr0?R}@V)rJ9h?V_0|0 zuxkD-;T7!v1oi|t`u#+wmON4@{n6r2lNtZS=54A z)THr=(L(JE7TVKv981KOJ*%v_&QitRz~n4m^c@h3#C1-wLj!j19`ow+;>&G);z8;I^v=4lc?@F-KP;Mf1kQwJaW z`+s~*K-Oc=Z=GDYaA9)mhN7Z0x140Qb@;$2q9T z$EZE3FkS?y*31mn&LYSRiaf$jw2?OKOPE=|acZqWs-n7=kze8aGMrgK5V-piKvZg; zO?i6aYbup85wtLDq!JKiTd=AGfuR~*-uA?ooutjZR84sO0$vUTYaqItQTB_MIA}$s zxvcrgE3X}V?6m`LZF`=>)wdq|*3tG?+Aq8Ukkyt?MWdoWs<4fIMudrs4pf8`oehhE zfg#W^VB_6v$o$1@^CrBSyvaS&{Uy;xC%VkAh>+TuWNh^9p>3tI4)-!{wM3;YFSeOAc7<(t)_V$y0AR9+|@u&T$bqDpZ z;+2;3!HRjoiB@7*P^sV*j>Qe7JMFUWPOQVe^*Tyf7|9)Tb~m)cLVy_@EgWD3w0}5KeN)MwS1a3(gtkHluO9aim;J@i73^HAk*8)Dj($O zI>E-NIe;N?_nuz$a5Ws-9XI#v8M#Q%k=eZ)04tM;qg@^uRSJ{t1Ye13jz zes1n;YHmJDur&*?WoAU*({iYxh83#QuU8}~0n^zn~kCcEbGA=NK z=ieWE?BKuu=F`(iW23~xW@vJpFO-CsE%e;;i zEAJ&fs8VqsY*H%j!FZM2m3T?}KRX((a zT75vY_BjCopboq%tqoxH_CToKevD2 zzhoeB>C&E|+1al;=0Bevy$CooZvt51Lp4*g9r+HN@*VT@fKgYjT-kp1+P1B1>ezPe z+S$3e{45+znRLnbt0AijOKf}TX)Q7nrzpO| z;XoACXM88va3Ixk2*6h*JA42>nTuC6Hc0G?YWM|3^}$AMzFgY&Rm|?)p$QxZL|!%Y z5rEa~ED)vkEx!k7+IDtZ3i%ZvmYN4p$|I#Zdv@;1+_i06o@#&Y`RAT%Z-1(NOFL}9 zvVF^ijy!-?$Lzd`ab)~b_0XR~s}I*|SQY1%V-zv$-q|o*)5<68hQ=Nq9HWv z1#MSTW+n%2S5-MURa~vq3JefuO^_+hvrG{O3W~*v7w#*^>%C7F+LFMqb|jOJmaRMRVa0<^xvC1Pd`@OX zmnUgSXg*MW}}5%zrxHyQm;x5xN?%LmLgiX z;H!#;sJI&B$u|K~;BXvZMggom7U12T88(W1BEl@;Yv^p+NHx=_+*LW0G0i<6%zpG$ z$LvS*_?X@HgDu;(b!_XH?@)K6wjSSY=C|eZXY=#hI;OX7dG7h6M~^<=zGX6>zcxR& zJvuiRMV#9D$`*jFt@*R_9r<~4cexzr94lO9j&H1Cm7T{Mb>V5SR#R82yMe7iG&2RT zk|cyIDY}JGtAiD|I(n2y)?@7#+817#M2?lsN}}O2)2f^;zHTuciy5(aQ$jWfxW;%A zD+IC3YHV@gi6bAN)f(eaVz^KevOV)fs9aKKr5el%R&jld4;DJc2vu&?P=)AjdK%W< zGOX@$1gEmu-CD%aF?fC>zA*D-q5p+rB5lAhXi@=oeu1*+gmNLDNk zbdoEwU5T_oB~pklw-%PKkFRKQ6=d0AVnBEiYFbzDu&@)uLPhD~rgsbm$BLyTfmRh~ z1EE-PsYTOUG$mNMoM?(+%l=f40sRa>uzH!Nfp#h=#s?f-UmKQ}af=8uPQJ5e&quS< z$gAduhCWKAX6HYeo$q+=0N@o&sf!d4X4Ikie8)6|gR?`a*$Z3RFXUC#%#2<{`emlf z)KF>

ED3we7-|3tP6Hz1EQ*LVgvmC{s0V2saHY>=3ic>ou0H?e0_K%yI*)QEH*g zq#Xdemb38>Dt-)otB-~r*=j5j>V^T?bUjpoIHKKcjunLalnulhKjvAtvjfP z6|d)2^3lxT;r%xUs2(kSBd@dDr2v`{H(U{>{rS{BcPfSQ5i2LA`hmVKmBZ45sMT<0vVQ zBAwUy`R*82A*c2Iw$~`iE!v~4-}$)}{oRw+U%&m{u$BGI3)YWc$n`#Ht?ljI*;7ic zzR*y^YE};`9&jKPmYJ$Ssw(M97KLQwNICNi+KZlvFGmWkMzGqB#dsDmtP^z<%N{K} z!A1*P^b$uXAXwbcu*B_HOT1?V$1vT{e4Py;3z-zc6NQKXODCuVJXgMWo38-FtHyxU zT_^ECkoJpmJTf%+?UDJ8*{^0(AI+waWWhW?`%!A^b59-U*mhv+JP<5~SRq8M_$5Rw z)1+76QxaiS9+_8u)>LDe4B8$psdLi+S#QnH?#YBI9LqtgYSs684J#CKSV$Yzfe*XK zhz)HGnW$Z>DupjuYE$~xuf2Bk-_QR3sS02{20PG2dbFJ}tjTGA9?#?|xFAt6QSo7o z_s|hVOYOLiW%}5P6(1~AIq8ZzI9ALy$n&v8DaQF2k6~?wB@%xat%`~`P>R~#dOlES z3t6hiu^ATFA0ezfzxj?y08^Z`m?;5wHmXi^51?Q^=tJtyDDy?@&7~ zT-ds0Hq|kko9>v+=jT(Y?dC-~OU<{pcU(iniWA4GD)11h(zC)9r zU=*`UX{pRW#kDDs^T$nFT%#8b1-q_|?QUnHya2Q{QTvpQ3#xVsA@egZY+^nvHqyz* z0eSq#45Y&1E{WcVwD2^nyYyjMZA!1v)hECGs3nc`DPud|m3z;emsVlhl9I*V!Kqzs za_PwFPvzbX`>?7)LOu}a%B*G>TG=HT5U_fG3W#;=RjUBMXaucRz^&ziCE`MdlN5r& z08y-Zgb}uPVInOtmW7Qe>`tqc9<8wo%405d^)HBzyGTO&`dQp5C<%52vZL_M>2;_z;QNENX5>EhxO9wXOz9 zb>NrE(<6D}k*8tZ1BT^aZP5%PU2HiyIWxBFmq6Cr^hZC@AGHcrPS#KVvS4L(4fbcx zJXyGddRTFSs$*`vYKAeZirCKR73RjwbPWz#&(KfvnP-SlScR!TZCuznqu5r2S~65) zBDE`HadtJZilc^0EEGhzVpgqHBwD;^O+(0HMyyV|gnQ7YT2yw1HLG98))1%BGxLMN z>qA3Bt5fhYG(u2?%qnF9IRdB}&0M@>svSRg?YXZm?nZoqa1a3~zMJ4GHL6}{ztAzA zhgk3;z}X&nu+CZM-40QM{G-pj6M!j zY@89rFsYKtrwYRsFRmOF>?$U@N!t!nl|vQ-KgYx_CXx_Q^D=oRbdC@oQxxX|18wVQV?9yw3Rx2dsb|a8?9oK-$S_&-N3Fz!OvP*r zrkz?CwX?eU!(&)?ol9ty8QhocddSwtW$}-TpK<5)u;Q**#e%@vp+Vj8(0qYzi~R~( zac-RmLHNIH_*l<};Om$Z)2Ybz$XsWmuuzN^5*)4atU|`9DmjH?R51%?RI>Cg!`GN( z1sKbsPGG!XU!~y>RrEuv!>dggmThGiygmqcHDs(thK8;H%|J50C-(ra8pZLwix&~8 z_N3s&+@6|G{rami3j#9)R}dEhzuGV3ed@x(!oupp z>gwu+*`d@Pb10SH`U7NOL+bQ})WtHzgym4VkyD|HVTH>g0op~wsvcYn*H%id!mtLp zge-1D#F?XpGASm!=bwMg;T`1+>$!Fa2^SVnbN7>mg<&KTD&ShUMjQ=RK1l&plO#tb zpy!LR^xAT;;P zC3Cd>=$4KPvnk1xIu`a$&kjKt84vCL1w@P)b7*>D@9Gcs&can@Ats!?Fb9Y=kKTrO zW2kZ>R@EqBRVC(%uoY@t5~s%b-mqE&w}?}1I|Q0608aLk>?^OmR%LfT`WodDE^r@K z9z#duWLE*HvY6AuKnsZ$dtp2$YFn>ZJ21d0AXHbP>fCm~sk7SwkPwsbdG_~b&u)VU zd)mJ4 z$aM+@r*h;@0K^i!Dz$yjJcNhyd(2B2s&GZW{&+k_#Tr7HW%F0!BiuNlLtjtpxl zR(KtT72^y`73EhxNqvGK1bimH<#|U`_}%ucldnu-2|r+0OmS!8Qi{ibw9N7ciwT)W zilrAOAl|zLSOxLj6~HNmP;6rGgws5t6GN$Mcpwii*UrM8?LfcsSc!{ETHJ|2iW!^f z!QB~Dbi%GF!;3tdBKJ9!@_bkuWLRHk6N)N^)y?7RZAPtrH&c<=9V3HPQ6VE(Gg@o$ z^$1+3P%aE3UKLtl)hbxj)o1zo)Dg_gNy|b!awS=;pA8QSeO#~-3DJmMMN+UZRvaK> z!zz+2mVnr$tXGO2_4NQ7GX%s!(>rUX69_iZua@#pmf+XJG z=4v#X{p6GE)~Ejd`PW{qt}jY+hH}Iy^1+c(K%@@n&nf9&nYzOAScyoHp~w(=+|kgG+0E*PR#h9$#33Yv zof*>{p3QeGsAlT(akE_Rp1_hd09l!CcuZs_BCrJ;p^z0HUugfleKvLW=>K*lhJ%ck z)(r_=i^zv-iYhx9R@k*wSXJ5h2BU-K#LGoCD#swpZM0AkVd0pe`OribzUFSR`sr;Z@oU%qE|h$Vo{|T0Is0o+lUVfKx$6}$(6)b(5nFKh!;7o zt<+K`hdUCi)KI3J8JacCUytk#F{wUeD`(RD4ss^0F(u*hAYvfincD(D=wqBLZ96~W3eF{Pb*t%T8>kbs4S zp8(YY)`NNA6;PVzd}@7|a!l+E*UqvKayvb6+Wr;>h&g)9=4TPLh6KwJ6pL$eHe7u& zM_-aa&C{?p#IXMO=D%&MC+Z#H)q8(zRu7AS%C?5i$ciHg$L3YKJx1stSu?(=LPXZf z1XaYTSU^~?hCfEcipQ6i3r2vl`M8eNFf63e!WJxV)kRfD0h1`Nko*h-OC>5sx>~|A zSh_|WYXH}@=3yaAG4xSRH!oDk@+O;=m$75Qa0W;f5G%l{NIZi$1x$w94kp}kU>IIy z%+&Np06rZH(~(U4eQc3a#&{6xyoWF>EJq?-T({!!@bJP9QbVfx)X~{tw91#un<7^g zJE^;dRokn&rmlOqd7CemJ;O>RN7afyou)YfQ&(|@7i3bYtH_|3$y1etQ7RnPgNfZYuBuV+R^T>=`VCgMHq3uF=Kg(9AHpVvKSaTJ@Yo0&hb^F-c;3>C*~N{&ThFUhTum%qYK;XMkV{ zZWZWMbVn>GU`po%s{&gn2pOSrQ69u{@=UuT)H+!x41Y`mhnYA4mX9M=pkY|Zv!R1B zjTUzCL}*g7RtK=#>M9T`SYuel7}mh*z}T3scQw`C?J5od`#S^_>hKe6K1w*j8r8P~ zVnvphS&9w=sc>z{Dd!j*13Ys+HLng0%`faJhbH2YNF1J2jUg1jL|wk(dqR66AC8YF zKaBv04KMs!HTPsPt)YwNrA+(|C{|TFidqdT+@xi7Q_($IDQC6DyVr+yuT%^II*Nrd{T;xngL1?HtvV2M^4mH9w%qyC6`ZdSR5@|%t!)gf@aXpK+XX}W zJv{j!0@h0WY{8KX^Oe-rEE%ke>x@QF|3U-EQ|^dJ$?N6 zeV7lu`9{r0Rr|0AthmmORjeS&;)ulv7Kg1~0aZG4Hn3J(0XKbKh$&z7=Q8W3-d#ORj8NIM{Y{Kav3EISG8xY^Sjqo{A)By$lKG49`$y` zJkGNap62-AABpW;sLGNZljjX0UZt+)89r_MidD9t^;)pn&TwjbHKnput8Le)iVvK^ z#u8a%NL1}Bye_=VZ~Hx5blX>Xe;(0l7P}?pDu4t4mG^J;=W#<7MUyeF8(0|3L-3OG z7}f?E79!TOG{5;re7T1!wI5Vn4=XdnLP7#4^rqwQU(s!}!VyAlyduofIoU$M!m^%9 z(rR5c8&&?4D zLSX5jI){K=`T1>Uapsf=;b(gVqTb^6tGD>eHHrd>Spinr%u0Y2%pLTE7nH_2@_v7w z;T6P%7#?PG%zD4|HI_zn^tGeUw?Fse=b!s=`&O(tD5c;Om=Ur(hP6S4_4Q3P^{|{H zf>=q47>jR=$yYkpt9p@QQG+d+qZU=jqdEu!%T{Z8WiW14ajbITV_;d9!MF|QSgej- z)39&`a|>mII;(Q;dvR%C6_az2YUwCsA+;(YV3qVGM65C2IwXsC&OzkFBtvXozcGfj zk*;60cx9HSzq|GG)a*yhP1+5iWOpQzOzs&RA4C9yxG-|592)Fe*5o+JTA|eRbgJXR zyn4yJxV$HlDc>c-3RN+zI>@SPv)V|*ipA_4V{Y%XE4B0Ps!`-s6bEK;owF@b%=p&! zxhp~<$7m1`h5;8j7tYp=1`7N7S$oMw53v9>GOO(l>jP?FK&k+!aE55}D~dSh@oYbz zW@k~#!bdje&t`x0*kjf8orUl9Ilq+6=Vs~QF|3U;tgmgVsfXn>U11}xz?k02YO-S> zh)Pzko%G!MQ+g7JDMC!|3>d%^t|tf0j|E(@fASxPtWb~#V^v|H8)Vrnb(AGma)uck zmP#mKk!pptNhuW6^f3~!2A1@JF@21}!lopPhlZ3x$a+-!T>BE18}*;4QLdWMt5Erp z8M>G<)zoYRoeO9{MX@~;e;>Hip2%RNo7#cJQFo6=GNH@_kSudyI{W!|x2l=UrC7ua z-Qg6j)39np_Gxwv z>s;Y-oWf8?6eqcZ+E2myDH86WS zQ7oHb%`g)?nlL+kD{-r^99a%kfSQm|1d3#u z-`*3dp-ObwOUpp7B9Zd@$?@^zj;=w#vx(5fg}l1;TU+KJAT%RpX44v0)lgwY!wNfd z30*X|@VXinvo^%Ary%EAYg9@hA?og-0iK(zsG!6D&))lnwv}gTgCe>?UIMBpt!SWb z#dbp9rpHjT6d3J?!kLtN)`MR+%PyuGCs4Cyh+Q*p`a?dX!JqQc0}{HDui7Rzj+Ce! z-F7Y#9@)L3Ek!qA%2iH<>ZBUGTwZ!-dW+OlcMZkT6ofQbXwNyn-|zm>KRZ?X?(3S# zmGxg%N=EQ^(ct&p|q7O&9PPWn2I3kGwJ!p<}+ zfGZ+Zh*Un`ly5ZZi$;Au3HeopNMdpKhnb>=YMj{3O z!T(YHpn)}Ed}*M788uHfU5MCj5b!W4Cb(An<*&^l5S^Uvh)Z)@R2Yg?Hj@0Z`AL

pZteGR@=IeSxAGyt*u>; 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 z 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 literal 0 HcmV?d00001 diff --git a/screenshots/coupon-list.png b/screenshots/coupon-list.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff41960a311e22f9d3b03231cad4e3c21d538d8 GIT binary patch literal 101590 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 z z0fZ%cm58$GX;eniO4lp2mN&r^%&_rs=q&dDhtT-?1he{-6js#Q3Q>i%iM_scqaNF2^p6>8Jp8W6>2IOs#K7mSmRCCC-%pzbyPWcn>%YB=|{KgY0aSt-@2LR z)_y|tKk#9j@jJ)Zr;|!X42mA}%61nMMwQ@zQx|pQq5oU0?G!bNI$s0vW0YU`yuRA# z8ARq;(kkOroTzivzcjYFo?q-SSsj43N1aqiayV7}+f!=- zeGIK1jEqVYC#angGlPzo6~zv`T=&C;{`_8CncU~zL+4CRcE~@ay?W+oGLrXYyY=FW z*GQ>&&Ap2)Ba0p`wu~GlB_!20FZPUlO4lZNAIYP2?;3femc0iCpF(|z?~aEhII0%X z-%?1e53Ye;TyMIrMw!F(lsZ$UFCUd0)9a$@lJ?|mcFf_1_(hJ|ajbWpB4Dy4(!mO5 z=UocUx0|uJAt^XS%IPmi{KTWr@b6pmq!a;Omc zI9s!h>$-c_71*_ zmUvQ}S|ATPZEWLOTr&5i?xBSmcBHUXKTtp4q#&DMId{Lkrc&KtqH>NKwZADde?1Mt zCf||3(T5%YjDD}H-Tiqf^x?)E-?4u{FN;iZH^8<(7F9cZZpq?-Lv6LV2fZWY+RgRZ zxAJnKirHk>I|@yI}b2&F1^tYS#mA7cHCh1e0AHSD@|hQW5W zSEu-Terz$&Kd$!k_}pA`;m8ApCuU+v3;A(vK9Ir<_SYUHCW^{F$B@J` zA6ptfjHg;Eo;ga>Mr-;1qu*eVx~!U>`7 z8k`XB%*_5v#Aq-qK<%4;^84m#r2^oF>vUPff;hvRdS182cg#Ajck;6kz18<1o7Qg}2X{Qtomu-+g74B=Vz5)_Gk-icPHF1YE$yfZ!>W=pv3U)Vppz6YgaA z4(sHs+>~@|;*h=aKE0xrb++~EK8&xx^}*ADc8P9@@WOGuqU(*`f{kI8MxH7k3ELPgz0C&py95w%14i#VYzo*SCPD%RO0?L%VuwFXNcsH{pv%( z`p$C=wz$>%OoFIcO?Rlv13&L!OO%0Jhz`BkbWxB^tc(lfG>SJC!tr87A1%;o<0?+Q<}Zk$y3$w zU_^$!DXrTSo6%Zf*ev+c%sFk33BsyF<;`->e)2zuF>P!5rHdu8mk&x@-BZ?X+w{=O zJz7tx{X*=0$BaIy^JDg1Q+IvCbYtsj-=;)(M;$HO)o*hpCCA z41^1oU1*^RTc~yI*4`SGNc47J!E4A*7Z3mH4{N3E$+*hY7O$Am9l*{ktN*q@@&(gUUq+ML%xPXEd@E>p@RZoa z1oaW^fnY?q(u{)-#f5e)U_NknD}gXIfU7Fm-u?7jSH`>7Mq`^_|5QYh3PPL1>(TCn z*S7r_xTl{+ngt<4S6tr~oJ*Izn@gG0P0u!81<||1 z8cbTYEVla8(L)yob@b%(J-lWrkI8IKYV%wVe0%=B0SzMzQ(}&_jgH$5JPac2&YYJi zIL^wLMr*eKFDL^zx?6*5d`?2=ZK8F>HM*)B8#}ej}DH&JJ;Dc-3FvKCKuyM=H|5e zkF?02Xuq8|-Bj`=T(w<8r?KdsW)7ers@_7X5T3|X>KsAy_I+#{v8Oh<{6E~ic{tST zAOC;Or&CS~)u$BMPMa2c6O(L}lU7th_A-nZW0I}GaN0P^Qd!4XDqFI}Fk_z6^ZEY%_+Hs?WaNVQ?FVrc2&Ch zE@LM;lcs?q*Zy2*RgyFlN}m~ZjwBqDE6S?`&tL-3lO^OS5{P9HCfTuwOrwkN2=bC}gHZG|HA`$yr9`5^&%H4^5) zhda}#>Ya|fG40G*>jGv2a9gHJB9Uf9o?X}O)47?lXj6Sr^%6-P< zevh4Zj*k(3D*chslX?y{O`+C}O&V;keNgYHJRjqsIEG?9i9$jKIPoFtr>sk<=0z1} zqx7s@8k)*oH;rEs+Y%8Zp?|RTnd@b5weO1r>ARW8&O=JvA*UYr)!K6{Po<$I)nrAK z-D}CGj-_!~rqL6xFGZME1SvC-nqk<1v{{suxlu}pnu4nyt47r334!J!cVGw+HFvaK ze04hJWNaUmA7$AUJ(mNB{T@MV6hJ5jAn|?SEpfHsJL7A3)mQmr>1y&A&WqFw$fIet zTG6oV)K2$ODG@@L_-ggk&L@q7XG}~g&bIZ+?P<2 zOA9SL-9w7>p59=T7N!-GsHWg>`Z7QQ-G%k6S_yyG7@t^OqR|+YgG+83FqFR>AgG^q zji&CUc@)&DP+lt~rWj`R(ui?H)r|}FJAhg)TXW$g)aq3Ff-u5%qdaq&hU@G33OD)- z!(T_jZm8|KTtR@^u)Rzx+%p;3ow!stct}rBv6R8uE-@DXG`t?>cN~g&r(w$Ln!+_) z5-$&no!x5()0}t3#&XWppSHg^7dEMQbY!FZ_S$QB3TwvOu>d2FKLba-hA9{Y?rq^W z7)`l7)(&&|SURyM;La9qo*wy%*W<@mdDOmC!y>_mX3VsTz$zR;jpgo1zN^!8LYthC z<9wxM7-NCfbQp3R+?|Kcl}kCP8IEuaJ|mJQtIveL&mJEPt$#Xn;LqrXwutPwx>_e^ zifcxK6^-}S&?NR)oAwp{?)pa74FXH4IcA}Gi7!ydI5+i!f`jpjJVXAiuRdG!YHZq$i=PD2Sv@lt6-)iUjP?j zAj+1Hzz^Nt7K+BHuqIvlSF{$bM~u3_^Nk|WSpz(D-4xkKS zS!8a;?j-VG)!4~`z}?;2I1;%pEDT?1pQBqNWsBc{?F z4A7XQc3!8(^PZ31m3N0)g5K_cdSg(#j}D7ovgj<4j?J(N_y~8LR$?Te6MP(&qxuwh z39^=OEk-zwZ2^&Dpci5zR(m$PRsKBi%=NM!Fx%o|xt z^_c5-!*r+4DwIvkr3E&)vmK+r)@X3RSRe;mwz|QG1=a&RI!k-q@RL;7aYv2es^ba% zjG`ULcGizx%L;Jltn>kHbK@g59r}K+wcQE57G{Fp#I!Nq`A{1r$}pKmm{f2s90;V9 ziiKK?&sbzI^N(48Pu{ujuI{_y5#nU?rdW6h1NlKg{@l!mI^7BADSS)b+g6shlA8Ez zKx&NKIkDDqN*<}J>7=YfgFN=!d}3YrvO={@mJYY?R%pZHSaMe`kxE-Q6DqDO05Xo@NhravIVBcF zqIVN~@=9Ryb9<({@f}gQM|0W3*&cy3b!yzaKAZuk%GN)Z0ULrfTVs%68F*J@Tlg^D zutz?M8XJe)TUxkPowsE>msv~`jj53I7<8C!ZNyk3t$xu6c+hlGvJ=;F&bA(9E}s^> z?!P9jv-dr_!}9xWxMQY8p7ndvOwI~AmhA=`!{u%!!8f)}=fGK(fo)LRHbuSe-7RL^ zBK8r%g~*O40>7lf0>p8|#Jki&WA&tsMG2?UjG&j@X4KVn3x^_ieXqWIK;m5BA=7=A z6b$-2dEEj<844}*r0;-;y;o$x)Flh|^7weN6}vYvW!(SP$s{uFwgOpK(e-4Yd|1$I za+xqwTR0dhc(9c;kr=*hFtX2y-yX78a7Zn@r3HINZtOJQA6NOHXR?@{yEFZ9=-~!l z%4FtL0akb@U>a4wQF?fzI!WqS)_In>I@iT3PqxglF#i$VwuFIAY4=#y)|kTiNMP~& z()FgxorZH_rn>@4o=!teie#X2O|cCRt!S58-`0D6yO9)O(+MHJ(iJ#!Mp?O#WD=XO z5|D@xH1qr8F`*5UA;sKWXRIwNBg~v)!Xla9 zGd)sdyrx@xpS+S|MGWp}veZt$$WDK}d3)7|eCPxc`j+>qNH@q>ae2h;ZOLrbC8yB~ zPAC_o?Ar+il4PzM^wPPY2f+i{xjN6Xo!3C?Q?h)jmqihRA6Qy+ujw zdAgehnQ@s4Zu4E!&SFP`yb<)J4xLEUw2XWpttHa6aG)lP=cWR#vT%Opoz zPAT*WKgeLAQxA|Q;tT99$Y}Hnps*2z(j8i9e*`6D$NgAgU?ifiSUj&#I`gn_@=8lf z^ToTnhv@}-1A$%dGn6_^%#)w|<2o0UC*Dk~72yd?@`BqAwPeq<~dz(Z3^&9PMfp;OGNo8S2)g2oATRdUJl4k`Zzty?LM`W6w16{hR_wSxn&d@rLYQs#xp$PK<6uo&o zeSS5O4xew|$#T@{1ml4j+xIu+A}w~wqX^|l#=208#r{p=l?R$ir>1Yc94QQ3ZBj`8 zF%cGU=P>O`W%~u>K5t0r;CiMK`JBcT6RF=mnp1lYM33McS>o7~RG0NY&r>kf-aUI? zREoSz>|B6DpMhUkUtUGC&sJ*mrLV!%HT)D=2-43ztT}OYv zReyshgoc|qlw`-U9sD};62jj(_G~)e-r(B(zPQvI*NWgb!N`lPSmgD%go&r`3Ob$V zbx=%}bXO?Dh{;|RVFyKVU@;Q~A>X6d46R?P6cE;_`o>;vwLb#{J7Od-JUxb)#xAQ~ z^R^E_Ej?a8HEr*=9-6kJ&qa1-R}R$$NIq!nFRD>E06ozsWHoUJuKCoFTmeu}5zqw> z%y%taMG1Cj`Cju%uZ79uaZ%}nQgQ+%%Kgymg^GnJ}7BbPp%KdVRmh)qgsPEXIg+pbblRjGR|jS-L-mo?$T z?&=)CyyoT)ZpYhGvojU*T&e33)=t#ja3rsb?t{v4&l#cKR{OfscU0?Uj0Io?hD;pM z59!cc08qq0n@t1*KKhU&#HY~+q}{o9pPjvc#rQVe}$Y! zSRw!`bmzc`sQB?N4G47$KmirT;pc#yP{XHT7uo9Pn~MaoJ?QtHxxvMPQsFiF zjI4PpgurUfOf;}rH~pF(C|!X#29D#Ciw1WyqQo)G7^_mL;zkGYK5v#8KJU1GWs@IZ z_%Qig9ipqBU-w8?61vl|{aG{%5GrQdt;}7!S1n!l%L`1x9kK?>zr9sG3O~AnE`S6c zF{t4v13}R??vn?fWNh_*l%D?`p6O1?x+n^bSA)Esc+@XOlSipW+*yWAnuDOe4O*zS z?fD!GD6~5O{FgSrpuyGB{@$JYXnrMzd3N7wFACTJIWGYoc3!C4qpS_M*c#JW@pv_f zBg469!GOPmHzc_8Z@esy=KL3LIvIn=9rvxsmma$}QXK5oV#Jh|95PIP^+hL?%H0}r9;vQHE zm=RVL1{qRnLPY&qt$BZs>Fdkd_ls|s_OhERP&Z+_UOxnc$UYwMCF1!?9kH<7yy>IxL|H(L)0};|nsS{#it~5k ziksUyi?&6_6C>yG%BNTvpbBg4S1ZHqre}AZ0$P3T%k+aBM4I`|2D@fE04Y?rsqRip z?L+jyYhydBt|A+Mh(W|4rju-}VZUAM{jEkY&Q!J7V_F#RqBC72Pci1M3#*HZu*x{w zsmu34(+RHgAucTVM=e;To$KBiD#wL|XE-92^AwuBbzhP;W&H@LebU>~6_aR%!J0Ox z7YVBu=-(|-JHs<_MiKdkjaZ?uf1xWkRy|`69|4%`*4(nj^dT~Bm#t^>Wb{kj1Cijc z;iO1G-O3V1kzb{gq4N82PPnYOyWyBZAUEK%`QF^!!aguy7jColNimdgAGB zfA8EgdPXAI=xfv=CX)gM z9Mv$iCW&v@zUTbu*GJs^kTy6AOEursnm5e=X%Izg%y1LCYe}Jzt%d)rZ>E-CW10kcoUk{W4DY zLP#LQ^_D;QwMEq=Y*DefO8lZ+lPf`4^jf4Hd57R)OuK`D^Q8*}$rm_0Qhq)+k)+jF zjxER;>favtRSoQTiym@Lx8_3s}YEZzSC5Zjhm*p$8 zTicYi&&E=4lxgm0qD1^-SbY%lIqr<&GBwmg9gP=U+od zC(ob{l^jlD|M*RbIF0fJ(g3j-Z>kYPax2o`xoNw zOwc5QAS*5*NsX*k+2a@X>9cCR4)nd1jNv>t@f0tknFj{w5?Axad4iWRU1RAP|7Y`Q;1*g!U`!vVJj`#*3)Fdi`aI$mI7J&j z)<9iL720g3yJ1P5y|=wJ@?z`uLQn%JZzQUMxdoSA#tbYSulWH!wUCT2*~B&*8uu$U zxv=fmx$ui}Je+^-o=|4yfDNp19S|6ATkMSohSn%VOJmvH63eq}>*aoKZs@g~cBR&s zSPltkqZuauFCIf{YdY{5X3ig+w)OzQK_oVBbI;Yg>c_@NFR3ENuUqb06sQPh2Pq+T zGY`;hrsk&C3<)D3w%cS5BX@!t!`wRndCNLQo4XV=8}PvYCREEQc9fid@ICxp5+JB? zraX96cC0Fx3}zSu45Jd3fT<)kHVBqgQ9!KbPE>9@tNyPjWxCvc6~(0TMKCLH}!W zWd#$WT=6!2J0n26;=>&U5b6P${j+TwTHkYHNuBvS=&O=vQ`PU}2~Q~3=42a8Q3<0~ zHyxFXv^qfzcC~}@xg}PF3$MCt_-8F_U%Q*{<9q-9aLzRnn%&&Ke}GqsIMF!kO3Ong z1`#j=Z4`B9yrYsR5RM!uDlDXG5)&h0c8SBFt)Z7}aA?|q@6Ip+XdY2-FFlO@Y_t(% zC~K;eFL-#j?d2n_)Kuw2C&0abKU-9#pzbDf^x)NU$%28kx**EyvuV8+P)n_Z%Rcih z;xRPb5;}Y0pFZeW)kLwi@(zobCp(R(ms!--#)KgpNy>k4GqyFap%gS*s%<&dK;z?)%@AaGr0NVuXikma=5X|B~|I$nK>VpH$IP=+PbFu0h<5(<*jH^j4PU6F5o;s zvj`si@6=Fu44q6Hd<*Z<1z7Vq^j)!&i*u(67qmQHj+eTN0FROCpN|5<-Q)5%XSQ+I z4d0lUDpEaosXcz>|IR9!H$sgg4f!K$yE-%&q#t zt9XC^*wZeBd&>uk>H=q?^WylJ$&_(h9Ej;yLN}0F?JEGZ7B1jZ=J99_jwG%Znoh>@n^xU2}j}mx$>Cpkv386>h(sYXwFL!X523XX6ezqv!idR3oQCM681} zF>G(4iygA;%76+@Upk+?m>mVMRBGUW0y9-5u(Le3D%r82lIWACll$QY4yCcn#w(iM zj@-_lJ;CMgsa8ltmg){hv-@&+Vdi$oh{0T5Bx5E<-BXCY4O>!9y2vIw#tt)Og#IN< zKS7YE^D{LD07P=zUj}#Li1WEN2w4IepNIhppJ{P86ZnYaeiVPHAy5n>@t9C#yh0nj zvqT5*t|w3vz&mF-6okkT2{zdnn*#EIxw$z3^Xz8pcZqJ;C8Y!L!bJ3#bLn-FhLEaP zua~U)#wmDOQ@5DL4!y;e_m^`5h-MeEjM;xeUmV=~SM){gvFax=9tVMC1s;8|iOR8* zS$d0I*1`wstx)biE`3}()cQAZF|b5vXpH;aRr|RhsM4MXUEA^OMfX@Xp6mxqJe*4< zGmWDxauwn*2+A9E1Q{UH$kvHo>5Q4)wG@)$Yr9$^WV9}Pa0lckR5?qztQ)zV1J;R|)>^hwqt>$gA!Ax!39LT*Vu?3mMc$iY@ukUKlrXtdU>wxxy#`YCPu3at zfpx}TWk*Yupr7hQD)x=C1@JIou$<$}f-@@L*DJ6?&m%_LxkI-g`uM_XX+gdrj!aVU z;C3>FPG=O044(i2i}?a<>-j5b^LJf<$3_uQ2(>eFLk9i}F{;VrkS- zNw=k455)+rWo7~eDt@xu==%BqjO3Ci?zf^4VFg;qgk0>)EdfF^KPD(yrBgp(y_bGTe^P|AGsCc~m|Ov0$@@P)7f_;P;ANdaWsmq+ z0VApjEsYiU2ME}(vMg3Oqog*Du9Z%61%r>#fqtsLX8ga;_G%fMoqCddI1~*-p6m#q zGLg4CnhnRRzksJTzOnD|B|R#7cmFwZi6W&w~}hxKEX1ZzJIXV zIVv=tG39d*cwb}Uu*QaAX7;Q`8D%I9X+*4x7VY_u8l1hCI1ez95o$D_V&nv4YI0`Z zU;JY1RCP8Du()Y}ER;^1e*P`rM?fSYMd|g~)Hgf!qn7*R2+Ngziat3RwtmQGox~-_ z!0%KM!p4e6;a^i0|2$u=Wr#!jxaPtDXJ_7jW5(#CJ;WyM;Tx+bP%qlKEAPO2>J^N) zVToMJ0>n(_r$Ajj9dO$}08Fcf`W5r%|L7IcDOTvC1;O59ufsZ%;u~MHYyaY`GS9}A zz{5&D#8{Cr7MAu7chG(#;^yDsLb^`Ia3kD0F1i(iP)liIOCM33$v$a#K6>ODHy%GZ zU`5==FwffXf;U3$*4KhUc8 zyWRF;$%BCYCL{oz`JK@brW|?j@^YnW~l!R@7%y3v0t3zCjQlH-Q2AZ8OVEZ%Jty%M#vdQgW;|D z@XB@zQjfN3pOjDcrKZD^wZLBr_}&z;mu;nbANOXHqHM~9)(s!96T|(kypy?@C4p;m z<3q(6QKeuv%2ib+bYm27Wf zR*4^(OP8$AijZ<@-()a4qI+Ai-0v6?9rz_8FnGAoE9eb%6?~dbrsX>aE=;&iP1!ti zPH=xvD)z&tv8b<~kqL;$A)9UEq~dO)6&PjF7MW^Jl}1-qxO>aCpSCUYcIh_QA0Z4? z?E=sPUDaf96KZ^Y(vo0XsY|kuylw7_An8*9Z>9i4l*lj9812q#98xe~j+jA?>-WB3*gK?TnJ3}$sZ=j43(4bfigTdLr{ z2*-AF_KW_cxwLZW0|!yAu+!H4K-9Xbe4~I(n!PKK9T9qlIXz5&cWhtPnP}2lMWu+_ z);Q}vU~41lN129G=PH1CWJEH^NPozCen9pgTy0Znd4NIntXko|67b-0Dz@w+z~5|Y za7YfjeVvxAn3(A1r?PRd&|f+TpfE7jbB8N);Ntw9 z>-&!_C&K%~VAEs$qtWUk(q1&RomsP1IQga3c_$MoNwDLM@vRBIO z46*LMB*C<`tzwmhLu{D^p=;VrMl{c~rkuSCXy*X4j~hYG%tEXf)YcXDEjoSdyXz-@ zX0q>Amn+TLSdN9Zwi@}P=dncPoDEG0mC6<^yOolyBMq%`n{TFf7HSBFc}(gCUAb?+ zTiTCn%(hEz+7BFD67U`whQ_*FlHyfrsRf)4M_(i@D}RY%hku=>{K@BJuZ9JR#Y%As zIms)EP)7<=Xz<{er(&kfT2Sg3t;H)JJcdT{c;=P}!=JZWsJY#agP`z?+t&{!V&jv2 zs;{vx_ZaPNNl1T$tMX_a^|L;#hTk}!ml_hqdf56oA} zkq=a z{^WOmPH1AQRZ*rOhn^biFsockYbXcf6RXr=z(&|AK-@!wV-}~DdFjysz;x`mfb9DX z)A3Ui$ggjWwVH}~&OTuhG+PDc4Cf2cc%JbDRp58uoqB&OmHT{T%YdZ<)wXei@sbqg zkAB^e^6}A&M<%{%`-fO?G+u4VG;E-)X&*u-rKefdrkh)v{JH&AwB|7q5Uh+l|aL2_l!lYVVZHa14vLQbXs$x5(s>&%G^aHp#M`L?3hK96~*cE>r z*YbrX`6-kAL{c1>pF0?rY3;$A2E&(M7moiR<**2BHT>kSwD>|A?Bj^ZA9rzH7`Mj; zYoI(hMH3a&m!3N8s+VzzY7S*_PqwJTij0oo&C?FJxlP1OJPAg#!kdVw&A5W=xUS#+ zq)P|>W<^X7_#6vMy1Y`>^~g(p}MQ-_uKE$#lxd)npp z?}9W?SwSvy!|#UGp4Mc#+Rf6oq_iT<0sG+%yoa!l3O=;9Zxnu9WTz~YvA%z`RN?#E z;O|RGUC4+`A*1Hod?Bzm8U=O!zbLg*r;S9rpEHqY0wSf^A^>x>?kAnyWZG=PHPd~! zK9gVmhd&gW0i2|Jhvpr0)le%&yQY|949sKA0>XT+$}Es8`OI6~)$B^n?2VTyUjFm$Ysdul_N(3 zYK2JmT+L~GK`W=cwp&hLgLm7yW8upZ>bHeO&L4q1@-JsYzApQ&Dx%8z?1Ewvv6dPx zFv&*>YN&6|eezZLB;=+Xx&=fifAt;wMQu_zDX6}FtIoMie;oz`fqI96w{E%jKv z{a+smpDL7CVE`iiSlircMStnQ%uczQ-xat&6|QDe0Pb6C#See`(?FJKf5D}xH6}V= zs(5jTYe`F!$y*o|`|i-e)HOBoU-kF@==^l3$>g5?ixwf7qaz}A@txSu{S{F!I)np= zf04&g3M%)OtgMSzoKRm{hz-?_rE=?i%!M4xgS&saa$NS5Z3G((KYcBu|LsS%Fh62v z<^3hRU*vrV-&?=t9VPoUe-0`DFH49{{Ns%AwZ}%QDv8h24}bJ_gw)1GG2PM<)BVBS zgrC(u4yaMG^KK7@U(%3_-Xg2qgu&-_`)`$!|m@%=>OFV4+C(< zUQb}V45udPROh)pO)Y}?Dr$)cSlE01hwm@8+c%2`d>0nJqii6B{}r%TPO;(m0 zXz13@kcU6Yj)lOg@^`=9l|u$yl88ba;y| z*~;#J-cq27Nmc`9M6IsinPuqe&?p+iLE8#-IGrxs8qeoH#5Uy!Z#3m$|OG+#3F8jh=sS?jN)E z&v&s`UJ{Qll4U^5{|^=zHwC4q#>WAt)-T08Adz-3;=k2o>Z1Zn3Pz86yp$Y_Yc)!+ zu^kv-_D3YZ+Wm)5d)z41HFlyLGg7bJ&HCocod4gxvp=v1{dL67pUJ*|4Ckafe>5gT zE;Czhqtlc21AVE(-n){pN_q_mv+r99R&oq2?i!|0`YEFCdGe~yRX>-8{_ezi-1D&X z6RBa}K@Jxr4C-n}^?ZjF+K}(>;T~0Fu`ys^U9Z6TxHA|w5 z@v}G4s8@3Uo5wzgYZ84ZwHW*T?M3pXF&+d(C3CfyUQTny90EhDW{!~eA8+~hSk!*w zh8P`S40);X0O!0%_csvtL~M5_Ih#_dglp#1O?#lPbcGn=Ju~ob93&3T+fr42wSfwR`+3o@mUM;RFSCT#$%mQG(~(i+HI5A}odXS}(~_ z*LK!c&}%|jot&P!;Wj!Cx~UcK7T<{TvdTvBjdBvBtqiGKo@p5R7`5&1s>Iwyuh##} zVf(u~@2dpn0tX25#MBx8s71U9XaDRF**`-?h?Z-D-0kzV(sq6oX@ZMXS z3qd4pN`C^L5@Nyebh1MwsN^+{CdR!=ifYOM4jpcDEFh;;rmEFT^Vo!zn_ul z8jx0C^Wz=K!e|S;eGMTlE4s5VQZQ%&JzduHJTb93OQ`RGkN>H@=U;)~z%*(OT-hb4 zw|AaB1}7kr1Y0&iHxPAU+_()*WKoML?JDU+b(7n}iXB~{=2}|jXv{>pWO2K6d&I8a zYHt4BLY&1ClMk?~u&A!e$+zkdS`P1*Jxp^1?RMJD>lWp!EFji6F5Y0cDl`X|j;~Tf zvB-LBFK90%SN?6V^d+s51g^H`+w`W;D*I|pE74^=enkL8&#Pl0wRw%cmnE&bEGkl#|^_z!uvFBsm&sjSpU3^tboPmn3%$qDPkxsJy$x`<{hN%{%nGQGK<4_r9A1dt0+GbHvj| zb*P7j_k^XRmI6^*pWxQRtlf<(p*!_#+HEjaRi3C>39AfQ^X}8&|G!&h;pZj@*W|r& z3u4Q2LfWJ<3>;nz7fDfErumV8QJj>Mx?vp@GF3<;Jb4C%mp4)&4BtD;$@?(QFQ z8ea=nU*07dOB^N)P!B-kDW63bz~kWG9kMU)lbnp^lC#JnJ(GUSx?|FgbH4~~ckcH8 zAj8zGCZhBvje+q*FDJaE_4^}k_GX6W#{|)}%NwPO(w%RvoOy3T36`ftQQHVanknUC zAcvqDt5q>0@iiv&UmUpCI0OS8E<20CxAemO(!T;;o#2(u`i}BeJPNaV0?}-1YHe$G z(17Ba*!Z6PS~|std5yEgq~hOf{zNpNb4(VQ#GBo0k>q}!j3x9rRp%M5kXZLW+*f@- zKJf10p~ceG-$iwQRvr1D{+)B^w_njSk9<*#_C+YvQOJ*FZJ)g`d?~(QzN@H%t zX<+%7VUu<1>tJ<=I*%O1ns27I{F#ZzSD^1N!#rT4?s7pMMTE+2U zH09o(TOR!(hgP^TjxaTA*uVVFGDWRRvZtpYLGdNdVfZVD+&}-{43ucQHp|u=@~z>% zyXz~u=qn=cp!JGo^<1qTTKD!5kZA2zkyvHF_MzU_MCq?L!7V_|BrQ-gW%sQ9;ua<1 zVH-HoA%Yc=@h;#!E)e^sWqm>7i{jh+VE&P(Woq_+w#8jS*Zyix0z02Z7Q5zV)NSA@ z=l%bZRO^(QMb82|sVSJi+9~K+9OFp0?vN%G<3Eg=z z)W<-HR32^wOMR%1wn`~JA3mX#hr;BM{3>SOOM!p4EC0On=Kc;kZRJlFZn-#J^ILs6 zR3Kj8%(tL%&G`>CCe$ufB-imtzIL6ua02dF?#&P5>w)AuSb4$H=;#Mun;g8P65Noc(H^xYqjlm+c8;iX z;I+0$G0-8NY4aF%`)`{3Nhv+pbJIM%ro7T|)4kJ;Q7u>2p5IlQsGFKCyZwyywRKr~ zN-&OhI8QQs_R`gnQ%1tHdTi;=~!;&c6`3c-QIIH zKDBWrvOiTVJ~7*HpVwn9{^$i!z_tdRV~@k zm*pODC7U-}j@Bx89tdPi4pL7%vK8|f4wjnfy0UW&NPU?TMwU}E1Q4rd4FZ}V3+>p1z)CZmn&ip+LU1TxLFrEMjp&_-3~ny zt?{V%+brS+kFI;^QW@~l?hdcA`~r5guTcQBW6#g-8_d*N74cL?g1P#Rc`dz-kp(K@ zu)fsxSWivcAMN|66w$LynD0kIX5OT&Rvtr^9G5KNWb0i%yE_*5-?fl&GX*|;rtMV7 zquB#R+N1v3KYd*CDyQ((`g6{9k<&I)!4n(cHHB!q=xM1o-Kuco;lAFhavjV4vbE`T z1+T)@RTSsl9&;oVw0j$}5=2gtTsefdW1G=7vXIV+ClPWAu-oq?A}5pr*2YD=Nxqj4 z&7m#taW|ETY;=o+$lPtpMWi5Hp#(&Zr)D5&axmG)VBG)VIWeT?<<+|0BO@h5DyQ7; zvX+SE^srj0bTq*wHMJy`j%qCJHQ=P)Ro)l8yYHUkp-j{|KS#kDHav08~WjhlJZ+*ymMK8_|ZvU^IxjjurZap zGg;C42p!6F*4TD;h)?Jl?Wm#peu?T=KOk`iQQj+m5D(qDRl~A8^tOb+Rac|AM)jy& zI@h9T?&QpaI`09m`iimcahGKt)2;kBTUT1zrt$C02=t8t1XJTTlo%&SIZ?+jdRj?O z(&)WOD{78*tD$8f74J{(WS~k7_sB>EW9)N3;V$1cF?In6IXQ)zt8pPguks<&TBoldE%h9i2-uTvn6-ql%1As z*om1i_x)CbJ5eTM%CkoDQuQ7w&C}W`hwsMb zuk$<&<0tUg6@0nZ@EOq|1te)Z#;ha{%MEPJcW@@92RzFOB;T{J502&=oS@q1Z%4v1 zKUS5>ogI_AlYgorVK1#~wxxEt@>s)sl3QeiR_#7QFt6%PMM4+GCAfI6N^;A8%|)Fx zT85;L)Vk~FL`;??5b5a^N_bisvb1pds;Md7SWAg|D(xiWs&riOl>9Mxf(tC-&#cBW z56E~T4_Uq0e=#0Eu3~XSX?1#47I2+Y6-38JHhemv3 z*W^g!VxsFGZQ-LaSUWqLM6%pRvhKSpL#JDDxeC4Z`0Zgs9W3jFV8v(tsWSSTRv;{d zgSohNAdi#fQy?gD6R&tPJq~E=Oog3VfdqpDuX&T?vUSdd*yrkn*CbazdLKCPkOX7& zR>Blu5k8Gl4IA?yF#+;=Mmfg!VJ@(^7!NG?R4Si6Fsn$83MfJ=M&G#5_t@Y1Y?%fw z(6DdTzogWz#uJ?sjPLuHKA>v$IJ}O1!QGO|tTpxG-Aa#3BpN-UX%^>uheTIRk~O); zqy{uC(23n$J5u1>)k?^Ho8B-chCJ+8vQuxmU_2pN-b^KV#*---%*Xr%?3RXA(4k;+-^83+<#D=phgeWbyW5z^6l!ZI$3v*z86KA(}@r`tojcx8+*JaV;Vlau{O8h8vyTZyVSo6|1Dywy{a{TH?*CN{LvXxg){C&&rQ`M%S#e za%CzIxD_-dWvrhgdp6BPqe5T|$DS+MsVQ+ek$p_Z?vLvn zT5>&8jMsF2bPGZJ6txB#^ft7rg>_Ae(j75HXvx`+Q>wJ*VphZOH&g3&Q)KmoM%j5et*>mxl^fgU2bB){(yr9h? zVFxLV)Ka71QIn6aCC{9i)?2Hw&y^t#)+wMfd|8zHeVZf{?QJq`AgutWl8;=P3+86&=K(QeQ%qGq$6`Pd}SIb zEs~KYEzNF)dkeeoId*s!a?^@r&W3J%)N7FI8|unXMDk1J%M|AmS3Ygbn5LqLb$UOr|GMR~;|0%Ic> zV3c}Ntt%kYPLEzVX&K!Ie;S7!V6QfW55#=1?=ds2-|i?^mL20WA45rp4jv#CBp*Sa?dX5&y9Jp#M}xHg;dK@?mD3%?qQbKSrl#f zGDknEg%Vd$;#@qGco?DIEt(>Ngr4?5l}<<X`yyqH}X@8cq&!G@+ak*#8l*x~@&7k#>OhJ_XHMudq&cpnvWunsK{vG=vLS&w|{pPCgycIdN7k_Y*-dxyewsx!$_xuOV%lw_w|BN|K!Uo z?}#{-r`W2*h*r+R5?<}m2=kpI+E@h>4((**`6{zNAkSjO996dgUhk_o;y&ego?LH# zpes&tEwfMAtGiv*Hd?LybeGQ3<5TsBtf2UnslMm^MPi@Ln$f5iXEDEM1wQxqMVLZ{ zlb|f>ApUH1m32}59A7B5nj7OZLiEmpnNQDduh&I%yIg2ldwo#@W5I~|RyLIo-dJ(A z0p*?U6+jS;3w(7xy+qXcN4Jrgo-?Zeyb(KMJ)&T9w|sYUB%SCVIq2SVe`QaN`9z6# zBm(uk0lkMsn;@{|OVD;9X;|DlEG%P}e_;GzQ@PY!$=Yb&2N~3xC(Ac`Jc;PbuMO(>XjMM&5_685u&OaPt@M4cYPc3Np0JeO$`}d;Q-~B z88)y}67^xejo;_g>s;{&aoI=%ePgPa;A&6Z&D zBqee#JaB2Ks}tAnryP84vEmbt2_XyLC_qxJVRLJ-7@UpY?q%k}Q`sUfYpUqv)C<$`XRpp? z&L72{v9+`326glu4(UEbiBpz&2DPPkZS`BmY|JdagwvVUmSak~Wq#jNV?1H8XS-jd zZGFQ;SUx3hmT7A560i3lyeu=iykSl-Zh6r0Hc5e%|%Bd1?GFqDYMmGS=qgt`Y(oBeKrJ zGSqWN1gFrLmB`s1PZA`!B;Q6WqEijE%%+I}5%9bUdTd?Lb~YMBr6+bKInon?EWT;$ z`7R#zT63;rIk;5KxobGjj03yM`K2r}Fn&ee0Jx(ruBn6c?!J8(?E_g|9|0}`ZzCzS zk3%T?G}-ghdUsWFvDZS!KKk*^puG#g9R3gK16ze!U_HJoexNMPh*!xkm=`mupXr{i zbjrinzsp?*3Ul^*SVi4GIYUXDXHYk~TlR=3PWyR26b?9yhVo~8Z`2;S--Nn{>&FIL z;MZ;wQW&!W`mDY%7!#x+wLOLWsK7%UBW?$p@T-&eiUF)_vSs81&qj z!slR)LfmH0j_E5#x?iUM==C-hiX1#MosIpdrG9W`1^-zt7H!a0{t;^ zL~X5_(?BQv`g?RwBS2Z2SI%SjsQZesQ}ol_7TKCvb4|A<+GBL!{L$`m`cCGU*Z^Bz zeM;S<$bZY~|87|H@CyBoSCa$3p}cqDvjQ_8#tTre#$xjoc@{8@ZqLZD+dz0tmPioE z;yO_G9&{Qs!ij8!GhD#E2rR3m*W|woEgHVr((>v=!!OJ&Q*Php*NluT8x6r)sdDbg zUi<;DCy&|qW*&^WK49?v2uOJk0gd_@Th)!9pQO3w6zP}coSQ&DUIdg~+#bI?%|NO$ zCp|Bq%{o@#{a~QLmJkUzZc&UMTYe$L!Z~K}p-~Mf`ix>usanIY08dbFHhA8o!y970 zIX0K=^1DaMEgq}X9h_)DN{?)Sa4Pv^I^b6{&Vu1QL~dz)IrEg=zFo3AIuLcaLjo=D z4(hJERoR%mk(qN@tOt@WuyVYKn74+TNl{`K}vMjkT` zcGwUr*EdgxoFJtSmqwl6X%DNB9&UMfH*}HewPE3QQ}9k78gBD$&mj}&fk1~JEF#tq zQPUk?iGa&SC3wZ4yPWh8qvRD{(+*TcYJhi)$b-!a7_S0QSU&v4%zHyYBH)4L3}0Ij zvmr!8$*AT#KnXgGesN}<-#3C20RK6DYy*|y6{|VO#IZ?soTho#WV^s#0&Rp*>QLdj zi`Eb@;CYMLS)|0O>ZimI*;4;eO0K!_r8>EcQ@l&pP+f1c%%a|9*8=VGe9=ndTYvK^WsAqhqnojQV`WX!yWtOIr%Rf! z`er!=@`EQy^TXU^GJML=nA>pAQ$A1K_C?8wEx|$(4AJp!1>A=%oWP<)MwcJ7Sh~SN znj2qdT^*n(EO1*H&tHT@5u^AWcG1>Bz!L0X`NiEo>-;naT+h3%rG~WnjHrr?mNm`J znVK60Ab$N`=wtgfEc4Fg9c<&u6k&Geyf>|{jcrM~*jiJLeDG;XPE|En_r243jz@Fz z7HPX9!kN>ByA()7$G9c8uMgSE`2*o~2UR3*l9so@!xZ38waUuZcItBd9n41J)uRWZ z*$3^zSR-4ivz6@1_@g=MxzU2shfCMy54_C%!rN{7;xbQK6a0ck>-6;uRl)DTb+Q4k_E z)I5CVw`gcg`kt(J7WH!m3~e^X#!$OIagS3UU9 zz94dV}%+%_Z456!oV~2@kA3d z8t->1V-9>f_v+0Ag4WRShSZJty@k*^I4_&}DO-tMh%mMbJQkL)h&t3prs(sYXWH|b zxlR>`_0=hjXHeRu(0`p!^%{ToLUWIKA^Uwa>HHB}eP(=}8iz())Ufk7{qX2vk%QCq zWdOVH!o-DpYq{U?Z_iWK%GWZAX6w|TPYeCKIR|IvR!PA0U*3LBx7Q`g$(~YIsr#no zayV_nha&IE9qOWiy2rKs2e!YDQA!%lbMbJQY8CRLo2M(O<7MJgE>5(qCJQ4E;HK#= z6IgbK$|C{0igISMFOf!(j0k0ELc&jpS_LanO_X2OVpn%sXUuTWx`H&{z*b?@ZM=KZ4O zc0s~<1Qq3zq4d#hG}e)tow}L<%N;CZez+*f00*(KPbk z!wUc=7;&0U@z)vAU2-_QJD- z+ju>se@X;HtT&A}CWkE@bpX&~F($f+%nDpp`&Rrg=#6g1LjM7r7WE!0O95ynqz>16 zRtxn5%dE2?V_~G+VMHcJ<$r8H3|s{N5GeI{O4We3=7?FZh+P4;rxGl?NQ5bUqeA2p z{R+T$^v?8S&}G_j)PnQooW*@hJiF8#mGKiP?w$o{>uPhAUyUO8sfm7=HN#q_Fq5!) zQAxJI`4lhC4jN9&K}F$*e;timKMJiy^&HoqM;3lTA;4oxB&!rZlO{(Rls{h9 z0yvkzu^rHPAbP51ga&|f4*_~Y!J3DpCL%=~vdUx2eVwOkA>QEA90*6RSfvy|PQJC= z!CltFy`~MhPUEetWxa4`d6$&imw)AOwh8}fG5 z!;u<1Jw>f_xZOTzYB%tRcXac08nRdgPpHj(3z-x>=d!q+srtfw$( zqWs;87!aP>fpRzQ)ij(~Xw&np;y(Zny=IJ7eQwXxxJ1kmz2!2zD5kas>ayAU$GC0c zfGNcovw-Nb;2kn{AKxO+txrEgDLEwKNw{v0FB4RyTt3DccVkPL)wE^28G><1zwAVx2VB4qOxF00aTbaK8Y*2AV^^fxudrb^^}p+=y#z6rLz91=6r5~D`4O$|$%38Utt z-WjIrQyAe{ph!b+TxS&xcy~^$Uu6?3em;!D7oO3GXfgvH5yPRD=5~)XvSiw)NliWZ z>7pWI|C-8`^~MdwG>ad%363umOMn^&@Q6D7)bYc+8N`C{?iXGoWej)h&YDX)M;U}l zYYcE=Krbkn#TMk%jQD}lb#mEC4XH;tC7$%l`!ay0Ws;lZ@#k>FPwKxrQ2cz`KVxjc zwH|MM6k_$(0gppKKr*WKV{k3$8o;C#4khSvjcb~=uQZ%mbo$PcGHd@}$RRT+o0huKyhmtyQy#BrNPgOMwz#goodn?7fC{~vU0K=$iZjuq8>ach z5LWT9B}Igot08?Nrx#vYQNB@)dbb&fg0`pLs+ZCc6Q+fXre{?_IcB@NE!F3v``is6 zK|?66LhT2(v<7twu=$)JndPqSR&{F9u3l2oS|~{ zviD{p_SAN_pWC^^m3hxp<2D)=p`7gXfM>=wY6`FT`HOpsEu-;iC~OHQkU3=H`5tmc zHrr9F-wwP7#O^9NKIP_-l2}_g*?(8Uku10p1f&Q2E9r+ww&*n9G_fzyXm++$DY+k9 zSZS#sIR(jOKJhbS3Z@;~0~mLa{S>0QyJoiWPJq+kiRe)?>5d=DgOBRlmXGZ;$50yF zNVMdl zUsCWZH+#3m9cr$K`0aLb>Bi1CNr|G>Utidyy&$I2zp?}1=HNUW@;|03-t_v6s+a)V z`O>T+*fX|mnW+p<2%!1v?)ZwI1MCJ&rOE8d2f3dq0e}o!lM9XLhX+>DD!6SP#`}Y!BHXQDS*y`sd!$zux&+LJQc|L};5&_C79W#YqzNSk4IEzvfvmBMtQaeKd#i z3$C>^WX0giamdRA@bpL_DJIOiXJ(D7ASL`65b4mg(m)8@H~T<@wuLF&pK5F=GE4`c z{*W~qjwWA7009AKM25H)2%V&i%M5WQC*h$>B_zooRp)>Eq=a=Y9X>%O-HQ|2w|(z?bpCh;xNJUG z$O71rrO9|=aQ#LT*%y^7tDdPO6j_V*eO8w~CfdI&g$tKu|5X0y<9nlj#*3XxUIQfhKcZoDx?`i|>|~yE+4-_x zF1EgVbAy=UgWIv{4no(5GT^9VnsGL0mzkYZ{ z{!fw5VPC_X=eGd)Uf|O?^p~BBvrdDSq4Pn(Bm^KkuU9ikVpL5W;P7#Xn$*cYJq#s& zy3mgb&~c0FRyqf8NX!R0c?Gm`fA@57Jqnz8HnY&0(qCDC>@p^f59P4NyNuBjj*NoH z(F5XU@Ml7&P*2Uy`vZSbVgmr#=*#OzSn~iziL+UE;iOyo-IROLf3xrB#D5b}yZw<< zMZ1L`2VyP&P;sN$jg3Id6z6g6Oa6R&RRHD+>ol^kQ!lAC zos^9Y*L&D(224HV`49BLgcb>%Sz*T7J zIDJ~ez@j}57#;$sV5cFAPrrvU0BwZsE=NS>^p7~2Z*r_?cM7NZn>4-HG!>tEdjLfI+WR@ar*6r8dbc##iKxjUjdT3{44p$ z3mq~8w)0&G97Bs17Km5O$d1n2*2kk$;7vJjJ2fu^VDk~_7ALD^gNTJq2JG(q>e`E# zoBUnLedQOZ`1U0L!p35_prNtN-jkoJA$l!zj1-0-%zM&C&e|BrOxIS77BqC5OgM7Q zhZ!Q0#fhf2<^&%o&HQ2GVt|GX8CwiwL<_^+hw2#1G{7~y(r4uP?+4~; z7H;TcXH*s@E^}b`H4Dp->zVy&!eGv$I^hMM*jR~Lr0a`Rko#Oc@3N8uxt&Bn*2LR& zsyuG*%4Ly%@{ELdN1O58fD6%RJ0{>0|7ZqLQVMO@LOz9bk&db{s+i zNKc6Cu^qlI^ZHDI;x>G>=bzx2`_YZ-v=N|Sm4#b9GE_D}1>iP*TGa#S`+FDGAOA51 z)K5t%rSlcLjNt2^I+EdO_}6_1@4zs9PS(qm2iJrL}2FL$OHl2RT<|| z;AXkaF{~OJwh9QvjsViH=@RfXWU#cTi)eltx2_^#c?k?p30>>P0Gvy@$W`2s7KO|# zC~$RMD6iByRZc*zh$X5+l2a{Tdx|)=f-`q;7e1Y#;pv(qJfes$@=047^J)GNO9b)< zHhqrIU)lSMuivXDM_XWsck-bnL)QS_<7NltjMIeUKpgVwseRQ*!=qWg+$6=Wr}ql{ zH&#us=O+0L@_BnMcl)SndZ9bx znktIj;oq2sWlq1cjP-}~j1HCegpKM$c(H>fw9pjiK8E^2V?MWO;bI8hH_|vz0=4!c zLNSzaUWR$oKs$t#adbe7oE>L zv~aWE!=Cqu1bBKMucFTvr9N;T)7GjM2KL*8V15b-I*!70Gbi7eWYKzG$->Sn7ly{u z&=_iIT@uT@%VdTf5rJHIbpG9;4~Ub$i@p$~{xASq=5T%U^7H2%{LM1RBKRD8~Hl+YaGmES4^v=0Mn=BKU34>NaNqS#_zwhZBN^O1S zyy*Y+17B(10u{mcLL0fQ!F!g&0#JZ!o+k7_%YZIWPk{bH zt1ta5Ke!gRXst<+;nT*S#S2a><~rig6L>Q;C??4}1=M6p3jS7>)Y8!llnl z_OH6KZ{MPOemjH;yG||N@#9YqzMqyk;UQ<M?ZC1>+ErSGp2q5~){ZMu0qQEr57A)21# zU`(@ksN`Bac~V1_}(?{U*fANZa7_~yqkNHpf1ql zgF2&Ov3FR9J)n0FHBp=uK}JYK z&kUYH7l9w}X>7E3z~goX4z~eRQehf5t7sYr0x>5$j?C_l80;nWvwQRR`WjtBT5HPB z4j8{q35qnnE%wNFx&AABn`<0$`K&sty76&g6n-xoEqERxM3vCYgAZnphdtZY&)yS)3Q z9!;2-xYfGZKg~}gqAz~%h>{)@pq3H{2`p?erfynbYgvYD9BiUZ_A8|!xn2PXxv<$i z-}*?za53efDXgn>W7VvE-sF}DEinyUB|I~2IQrW@_H8(_{EYwlvx7Z`>?a`gUV<1N z8}*#BG}IF8+M0#DX>cg#K6TILYR9`*2cB&{R_N5hwae*mSuPIulS|?;z_WByVz|*W z3w8QKUWIj7W=SPyD#2ncU5NIJs#mlKfCtb5&Ze>}XN85$X%QpdNtnoT+PyRPykhp` z);k0 z-BrG!=C8Y3sq7#Oo2iS`=w5#)oxA(huH0)7wag{3^P2Z%vW}9@oT9nrrtP&A_H&=f zka6INmy-;Pe4l{MvV$Zie**NSh+~^VrwZAv_;@|=GQm7o>T&A<9Ig?!$VDSu8 zVFK>ohDK6(Hs2LX`bnbGZBK?7)L#&*@0$MXkA#hW{YafY1iBJ zJHZhOMaWvgP#xCMsjBooGx7vj}ohn0tn}~bcsvEMv#969V)L$N7 zx2WM>0sSGr2F~^uTgh~xEw?9$_^;vzVFX@P+?~lJ(Rdv=jb0w;COE+Wp&HTSEEo)) z&#GT@un(aTRciA;)L-#3o#6XJcVzV|bXJ#vHU=~_v=yIGo7V7e4OA3My z+{-YxW)sm7y<-8G%aahX?_=Q!je}v`(1@oIhd+aV2pj7pc}*buL|< zseX(K?;5?vFVZ`#>2u78w#nnHywS2X+cSL<7w0Pv52dG`hPNmJui?^is-!Z8CA?3=_)WgONm;KSj5$d2BrGtMo z_WTYhKR3O}d@9LSG`n>7S3D{wSu5>FbYjWz#~NRAJEH5$b6YlXjgxgIGblTJn^fAZ zM2R&K`qxIDBS2hIm0s0q(N_Q5!{D!NE}@E+L&l*IUjzGry}0x3sfJIIg?iCbr&mxf z&P1>Z8lODfoeK(K++kd-JNqrUgutJm+DeH z8Bet(gIxH9(YYYE=+~ZI(xxySS)KQp$oQ#zPGrbl`O2hm6)HY62CacPV^Cdd@ShCM z)}>N;>9Rq++};1d%z#n+!GIh4(B8Vz&6+|e<7FmhHCv3o2o4*A7aQ-JTcy^hM_|DQ z$%*@*4#cyUm8zo`@eleg`^x6ARz0zYXzQ2*IJk#at=V2BhhB}X^7{3+fCFthN+q*x zBQr{ARV!S+e{Jh<(aV2NfwUm|W=&QLyS07G)Ou;gPUV==!ztf|-E9>V$+mP}cb67h zo=j!lYQDu^Hs$U5;0vErJP;m1rB4!a(ksvES8lqS*4ooLjD$b#y)9*Lk6;FPzP?IQ zes0h#w_f?nhGlJ3=~N*_e%UsATi3pnA~@dlb?%npBqD5l4faUUfC_pPX|9qSNL1m1#Wc>O1)@m+LVuxcy zC>9r6JX)!XleF}&+kwTwJcu3!F%wW8A)Km+mwW213@^xAtxQiiE~zLcQ`_CIOG&|0 zUDEnUYNjQY=)pIW7xDD+DIRD0RAG}UeRPRS+z36n;<2xsmZ;+0zdzxk$z)I9VtKH) zU|hpucJkvQW-c1G$z0^CTI5nSshJ(Op5mVzv=&wv;FUxeylp3U_1+Ucj!$i{>N_N9A|0& MZkt_sJ5OHtFPT4l%m4rY literal 0 HcmV?d00001 diff --git a/screenshots/create.png b/screenshots/create.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4e1b2b565b4740920d43231a0ce7fa6aeda878 GIT binary patch literal 140340 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�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 z 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 literal 0 HcmV?d00001 diff --git a/screenshots/f1.png b/screenshots/f1.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa0decab592e2eaf17084059211f8efccfdd48f GIT binary patch literal 208989 zcmeFZWmFtpw>8>PLP$a&!QCCwK;x1C!QGwU!5Vi*=<8<7hNkn*|kfD>35JLr?TSXsjDd0hC(|2Z!Y7~j3kLQeY6 zE)Ev_N4`A!q#@iq%dYSCc`&SC@BXAGn5_1!2x9?Wqku>WqAXBIGCX9JTML( zR!-7?H*)Z4c19*ViXx)_eirzPpZuePgAET0i?g#cvojmBwVf#ol$)FT?i{SFOkfWt zdsn!Fz6%rFp5i}e5HYqlv@^4DFtdh}-knk3z}nG)pB!B2f8BzW&3~U3ZvU^DfWcT? z^lez6%x~^)=|4Nl$o${$YGw7`d)qrG8vn2B{Xd@AUfI>gm_^ap-rCX55KNp2#ob5Q z@Ce%(>pNK6DO+1x{>O^)AFUm%?LS)EkP0htkkYD|!Huk)?dks6Uq*&U0&ef14>vTH z5aA~WXJ9rnGvavKm6ll=`h?49U4F!;~0BG!hER>p9L z{~T-dzm8@7ACJ9r1uGly$s)#fW=_UNqIT9+r2pJ9kJBA@bMA)t5yrP<G3f$C$yz4(h_h#3eN%L!Ek}@f}lKC4W9=AdQE+GV6)^Cq#9E z^jMx!j%>_=)uYKkK+0lVs}n45g}%0KQTJq#9<=s@x7x?lm!V-6ueDVQ7d;uL1$*5Ro`_m;YlG;Q!Tds zsLre3k}n*voUW27Mo`e*ky2XP`{lWN*-!ZqslLObgs3Pg2?>(^Bpln`YWQ@_mR)xo z4K)?4veI*Al9qs_yN8v&fj7Uv6h4=@VRQXq|AQ-z=l1E2qhoV^u6jyplU+}Y{qE6- zFN&PFwDOfx-_Cr~hj+KSjYdfUNr{PbyR~$5&XzMA-HSC!2$e`Jt@_$hg`$oG`{e0)xpF25_C$%(gbi_|m7Hbh9AJ_iRwzh{O z+E1{Tu1kKbXve0sVBn|T=r72HM2KOyClML7K`{@-mU!-by-j2=QH z_{loD#H?=426koH@!|cwH!2Ga4T*7a`$IM8kFA@3Hq9eK$oc0Qezxx*4Q&rPV`J@j zv*25Mj0y@EjcjENxd(M+YiX}>5Vh`S!ee7>k6$RGO~k|$%F3ZnmGSYE6>gga2wQ2q zXh(ZRQ+#{aTQ{z1C^J>s9~#>6W@n0yZXlF^Gd_Og1Q)_AYG!{lztkzWxrWxhyu1un zqs}jmH#d68z>E>p+J_CJawk0JMGh9SS z$aEsHi(pDo1*Q=mf^&-9qUWsVd9#>JJ!RtN(ZHiXk4ClKvskzA;L*a6$ zsR4-Bgydt`NOf(?LKF6q^O~~5df|Y4N?qpXT~KMExDUJ#|z|XC41b zZDg30kBrP7rg`MWix5$ z4svnv(O8F@n}InHo8QVK7ZLts@i`9AR?UcLdyWUwjarrOFK>SP=DSBtbw<;eKF2fg zqAmZqA1e{f(~B2sAs<48IWV8Z&r9j76dKjHrESz=EFxhnp*ZZGkWg7vL}aaG3co@B z?w$echq~FfDe8G0nOzNI|NFz-`P+s=F&&-4qF!9#SOALzGmrh2Dy(E6BV9PNQ~AXI z?THiLf?XbSKnGQBzIh=v2EB7FSV=MU7BtdDO?lU`Owyxs3P$L2I3+%Gx{l$S*iu;g-WLpiPZV;@b%5>(2 z?ZC>xgs0+j?%F6ti)4&#Y%F5PjK_RW*3x3omy%)6;W6yGELmME&~KP2D4=Q*+jcA5 zSn@f-VZQF3&}(*G_*6&|)hG4V!*+9Y|Iju&&-e(<-@i<=?Wn2z@r%CxUWURFPU4#+ z{Z_EBVfPy!TDYQhT;*F>=_qMk9V~ZWvqFA7ihfDz{iEOYk5s*rL|8OF4kv5PN~BFk zyCVnxhLro6tR0s?0>2jWi#0Qgx6vT6BR*?ZQnRJ@ebv=;;ixT%XP3Kw(#zxx{xl*y zUd@L|T!08L)FuAhJdTO6tD8=e$3oScRt{}Y}GTsSLazz>9*|fmQ!pIw+53^D&|82C7px} zoSEBHQhWAS4VV2cjjg5(Jkubj%~0iik#qg6yu!g&RMbGz^N*K!I!kDuH8YsuFwCxM z1_ml_c2Uinovz4@si~+l-M5SCy5da_zYS*ex<{7WN8_{>D7gq+p2Lf^xVUh8_nAkB zB+9xVv^O|$jiQd9$*Lt@&+ao5uaZ})=OZgqfAA5OcZ~qs&c!b-|(JlM$Eo+wKvREcpb5p z*qPawm?lWh!4drCDFkOxTx&+ocMv9-dLk_mL}`FA5zd9HF=nO0_2+o})l76Wm1tK7 zm2AR945he^ka;0vY8vZGrc9Doy)~le7mO;=%Srz4^!%5{s1HGcQ5mL`NLcnQsjT4h z+FuxEX^QAm7E;garP?y$Arv*B{ry+r<~YA_WDqX*HMEg|sh{v&A4ME_lMKv7LnU;K z*X?o=8oPz(&Wz3vgU|LAY4zvu-E$Cr9rl?avLs)rW~iXz(BCj`#7z2x!gYbPUWY2e zTt4dBorR6fVCVdUl9I{y@^o?pDl0nCwC8n=q}Yl@05^Ax6|*xBdW|+_&Ps7BT(CsS zukOf01mwVRn)Y_lcnM#lcKZG%Dk`dFGBHvPiOcEO-mfY>M8mYMfvxHI(vFc|Ey@LM zJ)&Cm{TwB_5L*+2rTW5dPF0(cz9$&uc&6lKdCqC`!X=*261M~uvwG+)jOo(=Eh8lqolfF=l6^h zcr#@K60eMv6{y)j9VL%p8Y`et;F=P$Y!r)-5TZF~5iH-zc;E4XG>CT0H zGAZ=k%MHFL!mL^sPY=r*-N$GbB4mi{>sMwzJ-m9rtma~uJ8dj|ekkS0X;4zI&TED& zvqN2@;29ou7`O-o%Q)aJmDCL62J73)=-^~-S^CA>-BwwNmU&9bwF~mui5#vCFca=R zy{%o0!tCxFn|sYKuv<`qz6Yb*YhO9&vPgNVe2=m$Nw_?5N&N3gA@U}Tkx{uFF4O!{ zEcFMElsG;MhRy1D5oV>z%LX=>3KEN*qi5pr*rTm5tC>|A>ip7<)mIgQ1cF}gbmuqg zcxsC{bR7gv;E-SK5$i`D9u3z;^YW_LiZm*=i$gmz{l0#bM!4vB%C=MbUx_yBUR_+J zy(F+0c&Wk?9LSy6789$KT{v3Nj3~`aFY4!$ooWcP)z6h&H`mfsu2Fsv-a=rDtII+g zvFzaJRyXomcZCVZV~uy?w?=A~UvG+R(41apyQ8fx2}F(9-*Dk6x2cROR&abMp&27| z!gOT=^C}+e^|wI}L zvXng!5i+%NCtCq>$gdMIm|GO>zVC0}C0{vjP+AWxlz$`tOUgpwL373$SkDsoVN-6D9Mo8H)F7)h8v86x)d%`YwEUP~+t9}O}PGWeVL zOQMH%c+mc^t}*+?SIjwOFPgnMZRXpo8W$rWAI3u{1Bn`aJMAhz_%>YP)! z8pdF*g>9OTX%3yMlIgt`k`+U6nuPeBCg;-|E^>G>me;nch=0x9$V?kwTj~FbA4DbF z47Ezk8Yv@)=QYvGzX-gX+>yh^#y`Ti2PtMV57~LtCqok1))un73?txNB@q;O!z^3o z0E2o?xWgQrPD;0Pvd#u$Vy*|1;88`Ml{SlYz9?X}`_Qs}5AMur>^Xr_Skt=xX2`nf zU@#SDwoBcJgx5rOorO6oXYC7?6Oog;4>WvG-J<-Qv&ewBQ@#1+-Rfw5O0y zQmH5s+FDk19~CPX)T~IBhY-6nIkNounm-?g?T3mNMvm=HR>`D<#C$kN708?e(fSEq zAw{0*G4{(9W;Iipul?p)T7z3wmr2y21T@xG?_>u^>u05va_(r99)=4=;bGg^eC-4zX$~I zJ9&PM%{^%|Nc+zuF6*s(puiQ8)HwCykz@YXgwO0Kn_cKvqE@Zm1l~3NGa+^JeaIxf9 zTdRd!ACFLcUM?<=&^JkTR@RWiG5w0BA;VgNkL&HLFtT%PdwM8^FA(u zD7rrGWQ&a`EF#Q*(K@}HZX17knv#zn3ZHG>Mj&3gNLqV-Kj8Bea7mPtJBO69+J zfKtbos;8nXZkPXeh%cu++49Bu>75IzsTEhm+7Op&*8`MqO+Y}kELGTFP~cu)rYO@) zVYV!GwCcDrcI$DR%l9K#Pv8qTp=fWBg|R?JAG5a3BS;N)o>EACILV&DYxl|aacYy0|+n9j%uGT*0Y<-NTOTAF>`8zl7fUL0N?bd`qR-S6Vo`SVo) zRWi1Q1d1fZxlonMB4SVTLEMgi+LI_}Cuh1!EutB~D6Hk?!M$92M&kxFZ z^OC;=+QkiYt)}LdI8W|i$}FQ_@#U~J^{V-a3t%+6 zI@Gk@k7KG;;{gi3+RFX)RInb@e3pb*Uc`R-^2l{h_>(*%E;MnBpCK6=H*p#sI*%F@qttscZaMjVl_E;5SsKiO1(<~d z5LUg8e%(V=Uu3%%=(B7@;d>K*a~02mkaa77EnR~u58<$*SY7h%FltZPPC*6?~kLo30l?pyLgzj z$oC|v*B@*&e&^!%!jmWxH}e-mf}O@MBy?hI!c$@#F; z(@r~(i}z6^fA8<$>8{GeZx3w^?!k?iPjH9Lh>w%82`&(A$2%}W=7FEgJguN}(}TR( zI(gT&nXeUeFm%N>Yl$BRYxMSZBvbtD+?1&()2-|cfRbrtrGkl2&GHdO9?L_u5C2qV zB0_6`H9R-Y3Siut2q-2boCujNZR5>!_bqFzyA;<-!oXAU`zm1i_6cg|Ah12Yd{;A~ zFL`6~XL?Ouo+i3I8IAEuvB*BK5kNO%V|;u4saEqO5{G+;s-15$R(<9lTu%O^1K#iu zv(FO+qBbP%S#?xwVOwvZrIktZiJq-adG56G7ldNWfV{eDJkVlM*xx8f^W4_hSnX*i z4z@3)>U>&Kz0Hvcs*UfqQ@1eH@0gG04mvtMbGvEWPMgY=CQ*63Y@c?&v_NfK^SG@@ zfVZni^)A1q<1q5UKYCp~P{Xw}<7<>fKgihKGwptT9_{b{Uz{?DT3PAEkC=Vn|SbC{BX*$^O~!zwDf5l*n* zW?fI|nG_x8iN?mrrlPqyL&!aPl!7os9cE@Haes`Jv2s$a9QdLbqbR?kIU)veI<~)f z=v5!{s`g>AN*MLb^~ZTWRQp5OG546Xs7W}VTSZ=x%>9b5=_hdK?D=54w`U@NsMsD2 zq;aH+Fd$x`tWs8486TH)h%doeZIBhpE6u)aA*)>h1dteB=@v->)_O*6pRA= z*)?FdOyG0)huUL=8ui}+8Nu6Wms1{mgu!2JpJQ~6!%d=)hqUV8Bf)?ye4)B0)$)gE zrpo`>bnFZ!C)E;cLRxI&L1ze_UmKt%XMKDC7q6>sR>>amVNg~gQd|f3bFOm-{WrC zL}5XgKW)<8zBAhh^z*aV6`KC*WNJCh-o1EkbZRN#G|y-AcKFvF%Re&Pt>>k&K4=jY zopMRy1d|mX&Rxrqj&vmM?$;Svx#*@UEzTKq9o4RNC z1+sFcUp^EP7<%J2kPNI(LG+?~D0R33VD!V7h*6cW^r06DQM&>pC80;9nFjOMX-Q14ZE!$Ujeqi`tyE3?AZGKd$Kzq05_5gA*f#MWubcPKN==X z{blSv&W{v%ugzb`k@^1HFk>dHGRk)$7sJd6$(BeIv$Er_aIavfTF8 zUMnZQ2dT@Y@ZK;g+l?w@q*%W$tx+Gz;Z!p=KqW*4wI_+y(Mxify|=lkth{t|6DvFm zc8ySYGT)DiS`Fm4fEZg|3XN}mNe?}RM%_h2&ea-;t)v~1%j-j+{`-<_%pNU%+_Bgi zb=>{JPdbB*lgilY`|j+v(`|aj-)}QSD;dKt2jvpVY>rm<6(mz4rS}ybSs&VPgH|AO zJ)x($52$?8%Fn#VBgjgKc}Ax)FD~1~UJaI?{Pa-!wrs;!ZNH|Kkg&P}(yR2~fUX(7 zwXu`#5rzbhl}GfGv~clx_j3;sfDf}%?ebPB4E{hNvkS^_kE|jYg9r>`Rg4KC8axC*e9Mrvwt#|6F$B&Z5=`YvUA3Hx&Q zr^0L&O8MR6ybjv?gMx;nIz&n1I1P$@rLvS_cVYTBDWKWJWLrPM$)3F3GS(0IbaXiB zhZ_9l#hm-K%Q-?l2xGMh6Tk~Ee7?n`%X%j7)6mbX)md4%IP&?>mJW?RCKZ)3O||?E z`b|$(_frtsVsZ)~>Dkq;Ld~1TPLe&tbv&-hMTEme;{7S`+2^&x%J8H;$^4bs8fe20 zQPbre68rjk)*&|?i>;{SWUsz(6bI`&FblU9ZoO`6V;;a|xUg!&{>22ZHcA)Ob<>S| zPT&NHV{av0I1-zDCbH0RX()3w5MB|_0|-nZO?~ayi@>{c&Uth zqu#}IrTYc|w1cPtxT%G}$w`vzY$RYr7Yp+An>UY5&n>tO4b_Nv*t_89boY8Y)HXsX zgfPuegTXqx^e-Zb+?GbR_@Aw<&No}lsG;GcmggR*f7dCqednO>*{HxOzenEl-3;>f zxVamn{AWaZTkpsS=(PAbkg%F}vPdW64j0QCbFMNat6`~F^{nTXP#hIK@v- z^s=KOd$qo$=li3-A5JBJyRX}Ngf;{%$OD~Q!Y zJHzzEN9X=6EpZFc%L%e;IN23dNS`lsATuRDMa~NaIx-Hgv3wTf`g?GiqW$ z7@n`(gXBh>>6)x=9y_2iBkXxBaF{j=txDOLW$zahCY0#4W9ni=h$n8@)xw)^;@M36 z`0@=7KuZamN%wlJ#b0OR37K5v&l*a)4N$r|mHPU%ak-*S1t^YCzE{Xy9H#osz%n6+ z+B?(0z!a*74yh^JB^J2;HghxMc_kDl71Qm&HI9vyfOCpkfYBQT`lC!ZZaaZ)8Ti;t z7a!c5PD`XD0V@VtvVF@7!Kz~~37OvTUV=o^%;V*e*9%+hWmyR#<0XZPw-`%)Pw{`M z|Nir}1t60TB4*>(u(#0trCkh>IQ(gk{>=TevZZsBd_EpKQu=@Z>H&a^xKBKmhhvoA zCMe7gu|&u(#VRWSoq8R;U|u*i|K*EYwU%x%y}TxjaK!W+=3T0eHH&TN`N6K?$e>T` zb<{ZEQxb5%3!c>V5k{@{)(hf>pVs0!eLwC&IA2JpQoUD`3C++BFJpQ$T2LppqiF_pmT=VoJ=h!hS3*64mmUfi;wh{(0YI1sxyZXl0dTM@4Ie9T)5g z9Tl@|YO#qflV-ztQD0xD&&=N>;Xz8Bagq2*!S2NfSZ0id7!M(a>5!+z za29}?n`0}yoj0|$^uDl?XuEex#e%?NH|g*cJ3?7WB1_x8h11Tki)cpfi2?+E>(v=X z%VO0h)>eWCnf>_HhlP_Hp%m130$DzEX(5Ta_SnGDTXyn#7vi?Dt`jxjIxtD9htA4j z<(8c#()7&oMc9|kU1u4kWivO&8ouEsiCMl?CxY4=x|;$aVXYazBQsP0uyLKYaJ>CS z!>9_c^D_)UZ+sO-703t*wDh0yH+k`nA?ZC~3zo8q&4A{Pf;QTp+nh7(j?=V6GVaCR zT#2=HNWPXgeYuARCBH1rzh7Egd;9bJ9KeWgGX(j+MGJfhIB!i>r8UYx$N2t=g<%Jm zfdOS@OfF3|n{TTer9X{; zwcr;)xk(YC23p_1_jkEmqO{aJ!Btii{4)my?u9m!d^Wu8RUkt+D*jv>Y1Ct zj}4{tFU=X|iiH~wJ_~|4=R|rvJ@S$Xes;QPK2;#0?>PVRa2QjY_yzo!C2yTA8+A}` zy3!)N_lIIHN@s{hjjR3cMFsi8KmDM~Q0!-W`GMqu_)UTLZ6qq{Ms~^l&1dDeW#5nT zyz;Bs7q8i-9a&F8{p?+_;%Ar;I+R*3T)7=li8p){+9bP=5Z^dtc1{7tz%($V66g^&Bnkt;HQ_~PtG?}ixN1>qrSobJI@z>g)!I?NGzTK+w)9*P*WZi!VS@_%d#`bR}6H^pk(F6^h zPD(1$CM%120PfAeW`C5E*0Tcwl(+NxpM49BO-(H-X7OK|><%B>{1nQ5M#G&YwUePw zBplhpSiR2&op+*WBl6^?=p!AB*D#7CNZO*kuWL$eVHgDs6qysz4-HU*H!F?0-OEjL zOih#IQsOu`>!l}pC7B7GF*ImCF@ykIM`c-97<0^MAaMpLT9EXe8qJeS&`Ir5Z~rV@ z1O;uXkW-JDFAudpn**~l*I=EN)dn)$L^#pR6em`Iz>D5%D+)g-iNbkihlj{$@Vy1m zQ{d^SPFK~Tp@ZxF$5dB3n+~FU6S(b$uc)&++9g6%qXz(;Om#DW&nohs@xd&(mC zt11zXk+cNMkamVs%s|&ykza#r1D;2}K8KrIjK#i{LnprOs4(MJQ90Dy9Nkb<>Yi+n zIt#%)C;>f)H#^&kloIV!A|~0*;{C4gmB`4>tE#|&Zc{Q!MO}}@J2^AtOJpD^lzEw4d8w8j4b2q} zv=<@?0EYMIU3ocO-HYD>3YGr&33h-Tg@HclOv3g60AEboIKbQTd$_oKba&aF1bt-$ zm&atF*k&SuebL38R3a?UoO9H5>c2P{_0v503$i(oEE48YCG<(lo?rF9L zR*1H@a$D{BjyO3{=}9y>_dd%C;*pgGtLd%rTYZ9%Z`Vl@fr6%QVyj8YW`Njb+w!uW z7X2QCc{p#O*0fJ)s0(pKOD3v7^p&>&A7^|5B+9aBhefG#sQ^JWgSIvMHKdk;LSAp| zYl0*om*TVZN%nHfr>f_Ka%+rhtIGe}{Bx(}3Wy0`VY*YLmH(>niuyrpW>L?;#6)Q+ zL4E<+iGqooa!j?RZGoNW#Ee$(IQd*R!Xx+l+V$TE(QA4rdysjBeGNupjwgkKf_jKQ zK##;?luvR&POe9^D=nkq45n9n`9+!)OB>+N56hd5E{=`L0UtQPrqhN$N0ksR9!m7W z7IY#<)e6?{02&1H3v0i<)Nr-lyrZ^Q$%@L!k6#M2Vgl{ysJc!joIt3ot55bZO`h5A zd{5u?N(f$W%7D+pZ_y+I0>B9OTY!%JaqH+PNV9lJ9RAxO%Rz!qDo)}VrFEgpOhEe( zKdOTCRMakv8+Fp3#r$OP2p~>L+*KP8sWPY(H=MGNcM6KJ$||t@Zb6@fts0(^_Ko(p zJ7~E1Bok&bGcsH+Z;(x`_tRfEsvIPNr2P0Zqq;pzogAS>*F zc7Dc!#7w4ofm+6M96pjr*Yxcfz;~n&aPHdHj(UhJ21tbs0%{}Ut_=$|wNJ|iz&`jA zamy^`U9uA;;nLyZ@uAni&Rw3AE0MEr3`er{;$sR^-YhP4N89T#XHr`<{E>1?`wQfP z-UIRSBRNtnw1bM=@mXHwmuH+Mnaoa+&y)}4yG7%@4*VtGkaYLQ#)4GcqHYg@Y=bdO zE_^$`5X_t$Ci{gmKqO^phY`y;huIm6m%N1vy5Eh#aQmu&@&38g=a#v;rW%( ziD>Y^jf$Tlk}&8%;x98J)KW~OO2E^gYyc~OTrk4F{6sS!>ReR%=oTlq(S5?f4qLNJ zNi~$%6Y&iS6oOggo?TCYw6I620o1zOEU79;ug(`!(Lg=33ShhF(BF0)K~f-_>?-$4 zOcelV_UvHEJdU`sAfJ(0FZS`&4hBf|`!AZ>-2hDh9=6GW|; zT3K0SBj`HxJUKxS3pQ1!>noV&Lk;Bu>&C|in4hq6&?0b08TnUPo|mD6=Ebea%gD}-hMxh_XuqnxBXe^%*Ut|yEjrc+8a!{W-$_ zP5bNi{|)&tl+dT3xVARI7c3@4VPPfB>6c-`)s=QDk}p8Wg|ajrW1@gK<7e3Re^fYY zs@%B~J%Q`aA|EF%>5FNpFS z|8>-XB&)WPQglkn&3-F-K|qz|l->2YZO#Z?!cSLYjq;`@-SI4-6t58=q*KbytrrU?wlXub+Gx!F~qy`+W>o4uleS z*ZYQ>7_zXL)k#*}zX3mAsa{NYQws$=EhaG`@ET?Ypn(4bCu@iyo$|t0MY`gC6SR%KTztHM zYTF9UqQ#|PJX>H|q)%q;mG^m61aT*RKLf~w#-c!wZ}UR}ALxM1DO>4Z3D~cOFoGKw zP2E0lS?<^v$r)=qpcgiAz=AB)Q4Y!Yd=L+@u(pn;0#-wd30kR|jd+Ro>Xop~omsH% z%!0LI!1y>>ICM%*49>YfzP5ux6zVgW*~*Pm6KdQW&u2Nz)W^$9)``|C?waL z1ts|S_=Tzku6{9;9dvYbh?`yKP+0R(%3d;<{q>>D{9ylgsW79i2yh?vZ|*@R0wkiT zV`F1e1Uz|+&VNp9?Tq9A85KncEZ{l8>VZpQVq%{Tqq2>(xVX5C%*qER5&}Jsg`0N_ z^WGmlXu@%tPBNVfHCG-g7hkVus@IXlqv| zK?i@Q=-k;$0S9qfTb=!^=JrRtb+^_5@_YQ)%xIdreMy7-a(KtN#|l$PFDgRUJnojR zED~Wh=)eam9$9w@LAP}DM@6LWW!G{rvLr&Mc-wX98K~2G3RXcSijOy0KS{u?@U{8n z6jN7E?=AZR-wTRQTd)6_HkiZupR3(^mP;Obyxp;ai4^DgZj1*I?K4bFOjcIbjFQa! zZYUJ$eWK>wj8d$|+utXMm}(P&h6!YsUb#_YYLDe~tA15XLQH&L~@ zBWYuEk>i-$tf{ryvBy%WdgHJ4#+?%-dlVGG-rL-h@#jpJPB{EHE{=_q_=|Imae~!` z=;f8~@bvO-CY-!g5^VQ`PMCGQtZl~2vHYj~&}eNqGC7=^zT|R{@XJL?U zbXz{)eE00D|3)l)NtH zNSPr1b~HVeWWU!#f2GtVJ{j>fKMMGjeO$4o6)>SmBeP}ig1OOor<=v<^ubhOSq|EsG)V{}i%~IS+8n3ht#|49XT4l8hH~#xiYpwFtxBCtaSP9X1_D$f8 z>*cPyw_0@e%2683#usP|AT=2w=GHDI1jA86Xv)#8rU^Ob;LTKAD3p&&R2x%~G~0aE zlhJKg$J;#sryM6?hWA`7>9J(-P-pcQm-X#Lu%JKmjt-!BVI!$U>x*FW81S^K2ZMUZ z4+Ueh(-Tlw>r7nVD9)f|?ON4&NmEt7&UEqDUT?bb$Fr+=`|)8r53yW%zx=vFOPTi6 z5`?K(`_8}jD}F+REl>;lSe;psPdgi>#&$MP_;cE=Gte-ztx&~;z+aQ<9Nux^W%JvL z$48IhFYom6rn}~NqTGr8z+w?Sc26hK>{pT0AB{X>Dt)H2)h9CcbRO3f)=dSeC*nCp z^hOqC*K=d922Oex5RLo39tfs%9Wjw{@};GSYWeiJ!`XUaT@S}zQrC}XY{+=snia7N z<7>6&vy*r1esS(A8d=M!vK5fZ$c+D{6u`MMf6&!>rIco$9%BlpMG82kuj209!efufH8&Dk?x~0Ok>AN!equG_l_Q^n7~ zs6jQQzBEz`J%LC%ElOVoAF(&h64$UAe~dY$)Z?C*{L72(aUHnR6I-15Kbni=cnxyi{%4fwWQ?QYW*e2H9J zV@D9VB-nIwswG2W%!t-}v6|G-(6Hxyd*%E1`QH!sA;swR&U*r$mk#dk?&rcz^*R}g zlck2CRAtlYfDXvduXr0CEI9}A*46Pw>+c4)GF5NQ}Fn3d}B)}kx|UU z0`fBKpCW|E_OA%Y`?tG$Naie?ZKryK%Tnm!p_A{vzw8I`us2=j`wA-z?@Sbvxf*+}zweJ$14l z{FM|Q)ZwXdL3t?$Z1$oHF&g0+QsA7Vtge3^{}=!60jS`3pnD#kM34=Qf|blW3Hl$CfWC@%TD7W;Vykod`l zwCta@?%>cbtRM6(5)u+*y<=|}>gV8vfJ`oJXyA**ED#&3p|AB^?MoOGxB^Ss_#acf zeZ*^DPHk9={f+o-kv*_j4|wEn_F73OXO@(1smosE%9g5#>UA9duZ+!mt?DqE^YZTC6lQ?=FK zcwPH_=Xg!DSDlePI;*&ZS(#rGA$P4liH4P1+PDW-;SW2h^a-FLaNJ)gJDjQ-N;&2_ zMGUAPZG1YzNwcWp$-Jq^>lIt%-81L)5%ot8X7AQr&%twKw zUOkh;X1CyZb=u8iUVE{jI|r5(R}|#aR*>ta+L5ag=n8AX{&4YCeZ9PNd$FYQS|2x0 zLcZW@aR?WOBYGG2THsO(qRm@<{B-im$ZDO9yprMAp-bSI&-@gHvq|5Di_W5uVMbLv zqJZ#?bH}GHUJi;aFrg?2R=SOO9vEUX|smsQ!Bm_1AKVg@Q)^ zltjv(M{+H2hzszX@HFH68{+LxPsgOz%A$X#>AaUQ+x%1!k(u*_#^PQ3Y#>Kd4YO&7 zCkDP~FNV7kQt$MlkxGT}H0{Tm86 zSL)2ic@6cubX1gz3ksrN^BCwd3Gx%8qW~C}@<`0yD5R!s#m-+X6gE<0_+qs(y_Y{M z);@%*_$Ify+5CDiM_BX~uc_PPhKa3A4Y>E(*ODcH>)^AhiJAJJ&grpJK8|O*eJ)P> zbt^0{{sgCHOXfBaTqb*&B0_aZNIq!3D`Bl%%erMWy z@B^t|oBqJCH*73RX2{6VEz^qFH+$NX zT*qMp1e+6YdwW^N2;|SJHOQoxi&ZUB-Jmv>H%zfN{gG+X(J9@%z-Oi~W}7D$5i>=X zrqu`U0j3W81Y*&5-qpb<;iDlbyJTru$9-C)X$J%A?|`i)?VHYDih|3i7^MciQw%Ctj3<48l;q3?+1JQBrf({}po(u(|DH_Yc7hd2226Qk3tO z{jtefh`uKUU}Lk6Rv@^iPEpZ!Nj)H56FJq{iuHVb$m&SmFW zDZ=iFod5kz27sdL=2y+wmBbk(-0&XZOwrKkMt5fyYDOsl&=5_Y+#z6?#4|R+Sq|H_FHyBMceRw&UnnKL9H07^QZSVAOYiewI4QX$m z6N>dX&C8+HjA=SEvUD%i4vw3TJH|!~oah)cvLuVG6l(`srlJX znJm$SOi-_%SlnK@E#NU7PMY7j#{LfZUw_$}s1S`P(5Col(EjzeFN)wn+bgnOe&WH+ zv4ZHRC}ijDISD=gsas=7va|n5Jf8UD18LGyzX)xl|9p?SR^}qPn_(s%+rXy$2vz zLl!VIRNBWnAIU>({D<;0k}_2uL9`_*@=28*d@2Z2#hQzb75;}n121px5W#HMIf+g2dJJzME07*(iJyxd%Bnbh-KW3mSgCPcMN& z_B;14h5w)Wng+~P5R1UJ@KpU^1qHh#Zkl)AptP=$IJn)QdWuh=BxjC6%AioS)?%m- zJGkGxk|;0#qdDKkc3R9NP3eY_{UGsaYAIB2cYx&YcD%sHh#!qNArsD7Cly-3c(V+) zJ)dHlHz%6)!gXJ`hsZ>u@P{(1DcCFh4!RU|){>T%uAd+vFuWWK=@4w-eG^9Z*xBFZB;SHxXIB)!@xXh8cA9y<<8bT6lqtw zvOU6HFk5CO5Z?T0%iFVLe0R)}<3^!mJ8YHZ;Ig;ANmQ;GSE}BmH0{*96xy#^GG=mc zS^aVeAzv@%9Ywfz4VS#KE?=hCbVCj^HC zcMtCF?!nzHxI=J<;64yMXbA2>26veW?(XjH4D!uB=Y7t4_WIVkfAOPh=&HKPuI_fI z%6p?;swfnFP%dE&M!6lxOkJc_L-U(c7~cP>v%cuH7*n(@aE2GpRkP9bR**g)xIA$i zzcmz?h9TPUm+a45fe^b^6=Tzz5#%+dNdE$y191^aQ+A);%!^u_B4l&qr3xr)WDwh7GOJi05OrxjNoeBc2;H)TH!j; z^c$B$dfUAP{mlZ}pS|TigGrQQ3t+AgHgwd2o5y}M-8Q#My6cab)#m>n%~(+dvYjUl+e4{*Lee0tnu)J zF{CbyyS?D*{LO*?qC1@5Tl4i7O+cNM$^_XAx4mneXlZcFwP)du-Mx(LxOh`ra54#`44;2r3#p^=P z{d-jqzr2byBEI*k4o}~&o9z0M1sL95$J0I}*tBPkFQ45u-(oan&aR%-g8NG;y6#9_ zw4Ko^X7{eqU>oglnPo_?Y)^ZSf%@hSjrcWtcaP66l$pZ0`2bk!@!TpWugX!YTD#Y` zYu?<6oBUSmVKDCK)~!zm>3HQ#PZjAnvUM<-hT}yzGk(dcTmBJYVmqyly*BiTb<=GA=FOAlDD*?0e>3fxrXa4%!9< zg2o*w<0Xp@oj5)!I8CVZ9oB2xf`N@iPOhWtV|tx0`*87;3h5)~mi*?kJE;!SPyShx zes3)E3&uR@T?OH<{%@U6Gb|Mp(?_am{P5o^5_;Lk^18|)kcs!IJ*lPz_}Oo5z@QdK zy@`jdzm$N<)6+K_Yq_VHU-{)fWQpBMTlqWO+jnD&W~G0C=+Y~V9;?bJ7E|S@Wk|R`#e$~5{PfdQYP@pH0d6&l-`tNo88!T4Ju%PSk?m1Vh z1K;=w^!qWu#Nydxv2Cl{HHeUQ$PhsB3sKoUcViC!s#UH2N$sc6`MnyDd~0=6%tg9o z6;I8$b^XH*=;xhhtdIq;Ilx#C-yHZPd+_wUN`7Mv7jg8Y$vh_-GGA_+dv|w^O5oeD zyYpiYBo4@hQ)-&cep*-@J|&ZPu)S}tn$Gci>k3D65De7tA1Q-?{C6fRgP2~9->i3N zN%MBY7)8p!atY%s%YvT1rQl_SYi^KkK>S%CZq1U$`cEE6P~iFI8_;|gRPeI^b6AEp z?Iqu4vM>-qhK6)ik2mn_R}N{D(%q<&$NF?opVK^Fo-vsSWE}4y-*e?n6eWiNS`PjC z7I&R~xsB%ay5KGsG`~*>$ggntL4I*@4*PMU}Dti7xE}i_Vtu?l=dVfRFJ3{_e!)=IeO1dB4llXz=)S zLnSK$DW84!jbEAy?`pzS`S0S&N(y0f#s5fhkptKg*CBRhaYa)G5oBaxWSft+ModSC zPWAmqkV~sPtB7YMmOt;0?LZIF;qHT-n+f)z{Jy@IJR@+_b}s$@2*N`kRV!2Le*Ik2 zv}&+#SMBUXJj1#;z2=kyiF`G&aDEoT1mCLv$_^z8Q9a$2daFt^cA_hFPhZEhiVyQ`ceXgq55 z)S5}VqRWP8y>GTeRx+uh$#&MH4f5(zE;fx zX36P)3<79{0)$U9XOCvNoE;SXMh`8T=0!Kxe&ura`KF&&j^j_4D0==mQ#6^CUu5vx zoaNZMqXlv0U4fP=jRU&f+V*N3A-rey^R!#_OI#grAZcO?;Wy$t|B}Ac=Y;){_$8Fd z6@^+9N36C#((jt#)%ZY`DQ|5-&jHb%%g~l7X02_1?VA<&sGW1>+J z(j8^~HVTk{uVQFDM<_dbJ)%tVGkB_w(zpBMKlc>1eKDS=jnn;DF$l3sI7B;I{NII& z54$AvwcJfSAZS`SJPe)1+Hk?pmTVSi>7Vt<3d=i8GT23mVPgi?ImPB@X+K%oOdwIJU@3oT~6Y4 z@8;vD=WjjM;Jc*UX1-;%yP9pw&n#NyQhVxDQ!-k0`$yj)9jNPaT!-Km_&PDOeoVbN z_2v5Xi)ZU~>Mv>{0loNG+xLcGI^u1AX$MV=rE-acU*q;&^HT(dOE0MzZ3_{6kjH@9 zT?1zNXi1OLptS9@YH!;zHCWOn_oK8_`_2r!B6nije)jL*Fo?9m8p|)<()qlq8zV(a z=R;)N@Rrf76$YqfD;jcz`8DTXtrvqC+yy+8xx4rJ;cjl8rr$TFqyDwx@(pmheBcxt zaNKoflvuY5)EnQQQme?>^y~P(i`pe3uSX3RfKP!MMsPvs*8(|J!R}- zZJeJVEE_GCRQHAq#5s1phuF`|$B;fRLdo#aT{(@4m>B%z@S$~Jwn zv?QDn$XUb5P>C`MP=bK_`Zx#IU5Z zvXq(G;kcF?uw`D!lf~UwwYrTXQd7KGd6)Ydf&IF;<4@|`Hh!kEqm{aVX@lfY3m?xn z7bgzJeTi5bS=hh+bhc_O#wsgmpkTH#!FpT_IKKB`^;_=T!|+0V8HdQeTn6n53(lx} ztmN!m4&1~#R`O5Rj9Pp3H{T2%`{R^EW?%82=FU9_$kM71oB=`Ut=U+W9;A7p}Tmn%=J8#Bg__HQPXmwoR~Hoy6eH&@lN z^Te{cd|UVQ!7?_1*e0|+x{trVG-c+k7PIrC2mxuOW<+XuP1I8xtsg-RGsL>KT9YIX2qonP z*J-Tx%^kR)N|gx6 zudtV0GM>)m%g$T;Gn37zWO`fiesT-~@>dmGK}Tohr&1xAf;9zN(n=Zy?D@Ge6)|T$ zqI|aw(i?kOFK*ie3Xu8P+w*nN(vQ-z6)_rBC8N6vP)*m2bHsJIw*#w{kJr0~4GO^Q zW1$24WNa&E=WZu8Zv9rg^?;?Q&f<;Nd2Wds^hheXN^=9?;6Uwy==V z_Mv_=`S3(0a`R~IaLLU4OE zxXXNrrwnAjX&WHjesR04q_mc~^=O#WYE_=&2KR%S4aWW&a}x_Y9TO}Um}D2N z;!ShTiLSJ+`sqzCD9k4Csrr9fD-LqkqVGC_5`CchXP?v_<^5IO*VI*~;b(UwEGrn@ z_1FagM+VjiKa536y1gZd+>-$1!2=>imehS5{3OdC!)F3s{)v+IT`%`p=~V{?nn_&G zxVL{759f9!vEtvN(F!JYBCN>vpsy z^Y{i8{%8P9$t{V;ox9-!@ju>lqP_OIv<1=qv654E(I#Vdw0(YC^uv1BQqFPuCcM8= zmA2MIl~Y(RL5?C0gZv%_^el~y7z2o6+SB+Z00MiC@Vfxo65Xz}3_2>s7b2swD2>H8S*X+>9OJJ5az~y0pUWNB^+4{i^ zQTgdsP`0PNXiYf>iVzq6uFrV8-y5VpZAiYc!l8w1>xF}<-pY_9fySC6zsL#0)sFOs zu1gg8zyrPD30~Fi{{16an}1Ksa-jc0*tTQeZ+w$k5#oSfaJt|3c|*vZxmEdO0B|HK z`Q>n^qu#9-L>06FkkISB9>nwVB{$-Zit***HTTG_U4}lFlvtDqLG%|o-39$ zpQTpmtv~5d+6C<|gFED=4{#*tFuZ(*~<_A~t4Ix1v-WgxE(^0vBn^zswfdp+DeIcX`1`oGF>#r zJ7e$DRtziv+Mz5U!tiS03#BO)98~p||EM1Kr6Q{$t=d?4Khb&RIK@}U)_d==)j5dz zl|?tGMUV>XF}N)d6(wye>-1R4`Cj2&WFpL)^>t(G6K7;o=S{`BP>sFVfGG%P5S#VI z?zVC8x*8Pv6cNCrrTzCBSdv|LTfH2}y&*z+5sT)R;oN3_oHAUa6IM44AM75`fmnaHOZNL?ZE3Iox2uaEfOokABvNYQ)_EWF1n^S@etke%EW-Ng<9cb z?GCR0{0g0_lwXF6k7YxP?N)NJ)6)|Fng#u z)lEed`5SE1S&$q?R6MKXYJ|E1XPr&Rfs4#RD_6N_Iix&F#*6H?zXxk(G6LX#05&ml zQhN%-=^j?l%UemUH9M!KAEp5c$Mxdqm{!xhXW8>6<&IUccf)_;_mV+vkKJDkw5mKh z$^I~85uPk0T(;&c&vN?9x(6Jf{gnOr&F~d?V(Q95qtu_!fEdy~E4GQxuMhZ@cJlZ3 zng&fRtDtcwQgT1=P~l>sB|U*oN|f!QJ|Dwj=x<&y7VA&m$B11?`}vRgXDP#s9=!{h zgxrCr_O#j!)VA=+Dgs4#%0BD)<@Ez*oQlRb%0d@4^X5pbtMHSe>Dh?s2jJ6*0G0B9 z!2Oh-uPD2mI(OUB@@AyoT(W<%DgT<#g(~ut0M&r7oMj#W9UkqrVz0D^bi71T{SxbsZv> z=ye6|Jp7pQ-EgGdvKL@!kN%NwkR1@<5!!=0WLHpw>k;?rnPd2Ya?N|7N$6hG= zR(9M_(_X)hsUI0BZYr|L`SGPwm_F3Ecdh;0OO)?%cv17A%-U%om#piTrH5>ph@)@9 zY2JN*FSQidAVtFGrPvv6&S4obMD;mv_sMO|BWWLjCRnz~bB*nAT~x&Sb`LOzCiGZU zkpPj7GzgLyZ6uoazmq+G=+zqyDpXwSd~MI$ef4wz-8K&y?qTwMpa|2sX+aL45l8>t z1H-DhIkQcFvg@@ytMcFx*jtztW30q)Pd7dDCeB4>@Z6()**YV{htkvPK z)@xnv2Q~50Nf2{d)wp((rZrK$Hpqpr?lA4>CWEj|KsqdGCgJei@sL1mv)|^fj?&uQ zb{i>v%k~Eq5qNnMk@DJe-;WQj}mbu;+;+?*yke>%oa;Bs?vN4+fwLvRt zV8T7EvZI>(fiXlDpxAr);jMWGygc?Yb)>tJ<8~@)blabl^>!JIf;JY%=ew#aH}!3H z3MHRo$!ytZ-Pmh$k#e7u5*ilapkeX5Ps9{^=ab;jz-Ka!mVGnooyvzM6=&afG zXn`KyC16lfEMf-F1G^z#mkMAX6*(2u@X>&@V(}rASCr?myaChNhJNWl3Khv~ujz zmacuMpOC4uUDs>I3Y$%kUsPd*-fg}^_y#0fBu_yiJpzzZB&tV9z^R9=9J^`JxO#Q2 zo2u?=dbF9cUwAi!O}A%lt7po{4}~c8l7w#^-pUoa3VqbrRiw-3X=VM+hG?CT<+E6> z!Xmg28C~?Bfem3^=GYcw&FiRTv+ub%w59y^q1@dXxFog(7i~0+`h`BRN=tcy=X#4a zoylS4Ptk(!_t7lQ&P>Gh^b|~>LU~tA`Gih66)E~eEwQiu({E=f!3y9`0e^KX`C8); zho>dWGiWM@%+U3^9qp`AmnX#Od13T=Z&he(AsMfKyHezfmA0e25TMbZMK7mL=+M=j zoD%U0_g%R8f1C^*mLNxELq$Q^f`Zz5h4E%L)9$zseL!Muc%P6~8Obpe8752~ zo%B9T6J&7;((*JST}|z!0_=xVlYSd?tf$%FGS_TT45LV$LG^cHw^orw<5U2st!}o- zH)tsvW48H}#SqcdzNKSsxv;lndUCZNcQA&ijOywkW}BP~*=BhiW!F}bWm?G+-8au{ z)ewgF^J8+%<;XF8(Lf&fu2R}qC09RxGm1Z*l9@>{z&2w#piiw0Fkdyndzq#&C%HpK zuK>5^(2eR>kw@`unG+(&Dt6i(9@)#z*zFrahG(sVAfXCrBM_J0Of?@egjSsW&(gKY zh;8!W4rxENIXb$|5dj8{uWY*7(Z@Yu#n&*M4gN2>A%;AkQ;NGDq3eH}%7rz7uPbR< zm)Dw|Gx&LQl#*js=1#$c{5zC7MNAwd0F2ELr1%k|fhJrwxob<{zVLnjj$TVx`SA(0RH7F?IDk5sB=qW6C4!U)#PxCNy z>x(2(SC28ncT7|*Kb{>}a>8WJf1_9mth6+dDZ`5a#Z6}ep?q>f`)*BH&6L$q4r6+j z*%BfPLnc<-IEqGs5P_&q9pB^8btgMT)0IO_hQbN`QA|bg~V2gqN~Y zsF{24Ng0;1c)nMVx24#j<+8AX9)cxoL6^=u{_N4J@%d1K*b$?I8qANU552B<&WB)E zqLsleM3p>0DU<>?Et%QwQ4f(IEeja+@w1%Z9LOerXqUuPbs(R59pj;%u}v1}@z4LX zyNpW;^Iv8T_vD7q`qBX~&4|GIo_EaZD^jDf=qKoxc~sG|o?LBD@jibBlLK2_SB7B* z?h>CncXY7nP&PMyhj5!&MyqpsYw2EOY zF0vBzp@}M0Wx0k%+iV5v_a=vjYsLqhKjrAdW0ri?KMAB?2ToX&j1x|C@Z@|7Uszdx z@z?SDfneLG$ex8s=vW43MLyL`laRV5GPnGw#g^b+KgGgpt!|#F(f8en&g1^_YkTTX zI~^}rY9RwCY#V$18@{`_9KXr^fCQsATI$73HO$VMxH}}XCtKQE;(wudy7N-B7n*Gf zc~vjb&U$%Q=qQkXfn05?x`!Zw-b-yA=0abZqF2J83A~b!{2mh$g-e7BTWv5>QjwW7 znx49@inn6!qF?*z^PU7>iV=@FC>unhb)>xQ)@gTs=GWwitIvR|FR1Nlj>DT@euN|O zX0%P?Z*z3%0nk_*C^LBS?Yy6A6}`Q;)??5QKYH@34c2`(L#W&^J*iAM2^)N*?!DAi zS-@##UB3k1lMDx~Pi_(Z1;8KiIhzyT@27B#qpbSV-$g9 zFccGI#)>=7=+W0`&J`1hXEJn4e4A%3%1)6-ELIE?F)t=7FGQd(!h4b9ppLTGfGJ~F zoFJ^7vIde9eZxp^ibYvgOI#It&f2yft8_*!5SRF*Pf{#4o->igKKcf^f>-bf<7P0B z;E?d``)Yi>U~iQRJ4qUzuU~k)tW;IjX1gZ%de~xpmkzW1^;ft#-M;=p%3yzO<-isn zm!v%y7Cs~;_??v&`QN-~b<#VB2xj}QFXvD~$4lZ+Z?mncD17l~xSsVEhQy~2$l(72 z8bl64^dVHcw2-7kj`<%%^AkzOr^hF(VG>WdS#?zs&?{g~-0cXXFzw3BHB*JsQN(+` z+3;ZJo1%lJ7z8sQlQ!?BtYqlm_9@=~!VV)h{DLk-7>rc_J7KZtG7-iQRsyHTOI#^x zt=78CJmy3wSl>B`CK;-#8nG=k8n3TR#OV|;9;^kqFILnz2s8gofo{j3qb$mvX~2a& zTUSSzob)}CVET0@PLH?7N1XX{SXqp>oq^)2c7X=BhlE^Qb$7|igatW_`7Z!j2sv1p z9xdTj_i(^NpYru$Kh=WR==a^(%O5XJp-V>HCuu$irmjCTDYJzX-M>*O3RV&h9_#Zj zhE&HK|7@}dv6SEXbg3{k8wjQJ}#gQ0B@v6R*e~)M+*XPBW4W zlpaYfi%*EdIID?n$&)s=4M3Y8!vlP@MYu@|_Z6^<>i7&LwMh=CL;hkh3N*@?5_I9| zc5Z(Nbss~@KG6i;Kk&%<6?w!97IB{=t%O%$WoBzO@Z;zZpXcBP6Xc8Ilj`X3*3_~u zCE^0;C;QYe!3>frssiZPA1H>LwqtCNcV%VT*hAW_cxr-|MXTFELD%OOWkHdgtnj>O zStj3S6UvVd^gM??&jt=V|4IpEZD+ltr2MNo;SvW8HP4pp8#Vu%z!F&UA(|Y(_>61> zmIXj)rt1(BON&(LiWT({oAHp>@3qLK@iU4CN;jo>Gd^H@n5K{az+ps|QG5X!GMbr3j?49;(` zJ-tsANYj<;2vbp-J?S!uM46Q2S#t~dY056k! z_y;0G0hQ|U0X=A812(#|a<(82Ko|ZWqT>d0cVf!F_Fs2vW-Kp(4AEx8`rZeSi=pd{ z-C(s_|M=Wh!|yra+seV5xP3*ubODdDCYtl-oycgU>PX1oFF(6P_nCo$>;A-K>d;jF zwHw4w3cK^g=LYOtw%Vft1NE31UJ1ldLVdqmFd$0|xfH_kG^LLGyQ5S7Q!&*(M4&|?{L?v7`*0R$p!V;tF0=VE%%fP(^5K~QxEp0V8~uP^ zlF^8;caN_(OHXs|GRyI^`Vz=5qwPcaF`}Q09$(9GY|#bgbkTu1 z2dozdx?gtflv6BV#R2iDT_M(FYBJlJIL}+hLuMn0u!aGGltbf{2k_^S9~n(ovA!Mo zZS-~p9|t0?KUN~wL7hh^?8^WO&p#>3GxeqqDJks#M0R65SUM!#)g&r|`HZqMHw9`O z0g9sJp$IX~SzFpXQVr%?%bRaVpwv4lcN@kUeM~_dc>wjd&Xvh1Pxe5KkGc1lmG5 zut6!`V%TZOT#6%<%?N9Vd=(_jG>hgZ)OZB^G%ZIlPqE7(kf2a6=I>|)Z5tN3*&w(z zKqd!ZmmG?d6)iY6xM`Ae%J~l?a2ZFpxvZeO5`5dG(|egzBXOgCz1kHH98Q&~?6aM@ z=JpMUVtu+51IjAQ3n8z+Fg;YuS4Yhaj35`nU;|8odShB)q4x3j4Rewa%2YIu%xLWv%ey8D!o`iQU&7X2IwT z;`&Ux8D-=*KYQ-HNEd>B#j+O%TCu?WDDO2?65zI$Fz}!mmbBGxv@I$sG;E39tyZ_S z@`%4ftw_k0VqpD4b``j;0mDu~5-iG+Tm?K~Q)Z=6-PsIsTKYD6t@7f!uPtM9!i%fU zQ#3USz(S_x^9jpUUq%;<4Og|rsSsEeed#6ZY~M_P#7Y;t@9APh5O4zxk;`N54#li~ zmTGxK2=`P2fZI}(G^&mZw-KkRG;G`WP-9XjO$#7mdBQHN*g%+<1oK=J`EHRM6^Ym- zq{##bH1?v2mIQKsn;rc&-n9`d1>ap7GoNQx`w)=>yr78QUeh4FyrFjW)-tfNCw0214d4zDVxtBBt^u^Cf1w zL|7d|vX+c_4?(`>J_drsNG4bKyVB2oakf2LXv}hSQjz;z1)cPRfQc=3xJ;CGfAoV) zk0C*!u5!J!@FklCL0-p)^Be=;!e(b`wTy-Z%kAGRhx2?_lJZkb zEQOp#EeafO!Z$NC1?=?<=QmkX1sGNH`vxd6MH;T^l<6e$RFpN~TE*yH(JL+KK z50k+6J`U^vP^DQ~3~!nx<<)nJpYLR#(5_wfWvmAMJ=#ylaB=hp z5gpThP5xLP@@Cc4?J&(AGyz>0Of>dbnIw6UG^Y*l=Nj>yMzhOi2c;^<$PlcmPXnJP zJ0-;JJE>Bp5cv6%wK%8b`ht!QJ*ipce_(Bvm6bb<8!XOZd}K-S!`D~0jjbakRsLe_ z9tg)K?`P<&VbaxOBZ^k>T^Xp3cC!9KfKl&@n&Z-K<4_NqCbtkZ*L?(azPknCM}l}z zL$=b*n3Swc`u2wrSE)pE(_z94U(5#OP;d~2Fn=-`Ch_Ycc1MPkiqiBXD>^JHyvnos zEI5mwEE(`)hqy=b`~NE!p`KC@oD$(lOv}B$^~ZcyibkGOdlL=)fdZ&lc4PV*bsz;c zAMa`c#n6&=E|hMVLruEs3zt6e@vnxjwrmVx925pAPK+%mSzuc-=WN!>kG<+=EIS2C zvP7&dJ#<9-g+R{=?3J9yz@jzGUU4gWM~gj;RRs61wV9@&$#wL@E^BFHApl(fp%>0o zfcRIskJ(}5;H){2ze)NrVTvogQYg2eZM9pXxN|?Af5QAZQne$1ibo`Lt(%9nsdHf( zqgh^?bhI?)>v9#^s)BYUiLKf`)_5h~%PZt>$9<9stKiuW+Ot(G;+e9B%Wzs;k>-); zrxibwYiAvQYjfV*!@tMfd)yNOB(B1L9uqd)5^K_)WeE6C$GQkb?r_*{=4IbUrt3)3 zBTTDk7f>MnEB_The4)>N#}^@uSx|#56jwk+cudrim_J_CP!PMQ*7rxaOV<^JLdR)a z>_M$!sOsHN>fgR?I#aCx2yqOysNijSmaOPf4u;joHoXwfOf$UmquJ_p@YX%7*+DR0TW^o1*2uAg5Gdk z;QG4p2&1C`SZijPCxIE{yJC}Dy+IOa>@49JP9>Te8F=R9QbQ*pysYM@*m`c#a)xr2 zk1OmkcD9CB7+@OkQbgZc|7|15I&HnNN?q{Nobc_!N)^H@t;Mzdv8b9OPHe}#llN5& zu#|+dU@Ui(&4cA+6;(a&ck1}(@>x;!%Wzc7uNu1F;IeD+10f$KR7^cc(!Q?GSrEhi zyYfXK84^o&H@9q}mfH(MA291|EH3VB1Tm+MG~|@kl#C#ENOVr%gyp+FV-iLrMg95X z+*HVf8X%8F@C6e+IuV5isGj0DwyRuO?W|lRNv~=42iLIx;|}-gr4tVY%ulLqP&|k~ z|J#)U^(wfgp0Z&AweAN2WJMi6LeW~T@Z&TODp~)6CbD~&%S=rl^PtqL*5VN0ljf=( z1C0+B=8>bpQJtSWTY5RHQ$w^EGN}^(k6N>QeVkEFEf}tN?%hf91-JY2z&D+a%_x-R zydV*M3u{o1Aw$G&h@$sEt%)V{H=lVnT6{Set&SIv&z$6-9fKW3XPUQE8u zkQMgpFW&QwcxU6AkAOH9VMu-;s{5%HKhBXL)e9=E?!PM zg^*fq?6;yAwfRDPQ+IWu$NJe6Rp~+GNFU)!H0iqqu0E^jQzPafsLfXyUv#o#S$x)_ zRqnG1V}9u{9F|NGGrrKDo~s>XAb^@F%RZI18!(_bf-oSM%!n>ujVy~jmR{B^)Dm3h zHB+^G>v19NU~ff}PZKO`%-%>PJ3pHyeZ!)`Ojd%b5Ym8HU{^8(_)_*Eal3Szs{PT1 z87%1JcVO&#-l2nvlD%*_v*LG7jV25<^?v($pO@>q?wr@s&dR1(?^O8yd}aMS*zFq0 zInN2iy!X&j@?y>XzG)l6N*yXxSK)?|I7~Yhq!Uo5Z*}y1&TY``_qMG<;@wMGAm4-w zXnFk{c3>@Blvo`Rq>Eeymb{TFjL^rf0PPzWX>JE~5w?0t>Ne7X&w`qMg_$z}B5nTN z${7^&;Eie$F{0IXG1hpJ{xwM1MJKk3O z^D?F-Gj1&k^cC;#iW+;7?JAGiT4z#R*0J9lJ9@6dar;M+sZHRqhO;K*#>ND*rIz^>xGrJ*On1 z43hzK_JQzV?So-}PimoV|Ig#%WSa>@=-adZXe0s8pV_5uLQKNH5(J zfop*359+VVTz-Or35r=z5#{-Cv99~HYfEB#rkxq#Y*b_e}E9FN?)W- zU-dzNo;og3#AHXftEjf6qOGE)#w4uQW0f4y?2Q%O%wUL+7>FnrHm7M$qW%4Z9@mr1 zhBpJ_BgscCOjFwQ^akZQB8EtEMibWOvZm$vTr=uv%tJY~DiScm=MZ#ORB3(+39#aK z0!LVjpac7O1GzTMve_B6@WzyWV#KrSUrhH&3k^1yNod2A=r zJ`A=X8&NM2mxWhI1*U1?ch_XQLm}{X<#)wn4tM|a#@CN&u z>Uq=H`vKwG=;=jgS0pD(NKl);Pdua6HXp2Bl|^5383RkpCupAh?%x5ve@wqPMTXEC zmQ!BqmLEj2j4DYAFYck0s)PJp>{q>f5vJ$DU4Wl!xWozUo>1Yg7}7EqK1Fp&NCF&U zB!Pj#TJ}+K^r8d57mOL);&q>nuODVxEp9{r{j`JX^^LTlSVI3(RkaO*rbM(`)g6P2 zo~5NKZtM)~7rOBAJ_{la7gbr3m`MgZ#-q-%k8_hs$u`&Sm59ff!TeRMSUFi3=RdSl zqC5Q@%%qoZ>p{7&9VUTx2$ieP{CF&RjTgVo2@fnC>2nV?$*MKF+AvbKy$N#{{}Kh; zx|v?1Fw8tOYjj)u>e^5{on(xr-6%8ZEf5VkEI9~^$u~AvWhE=`8rW#|Nh}Mt4nir( ziIl~Dj}7>Tq4B?;g**C^oPt&eTY4CN+Q%@p#4>mJkcIU{VcT6NR3(_tvw16p-;=8kP$T2pq6`gd=;Ed+S zzfQlJCfC_0n()WYp82UCWPUG9Z<~~^*xx`plc_lRW69#J_RZvF;x)rYa68Z5^tAKV z&Ffy`v>`7$jF#jIuWzR1PhhHih3V;7F*%cb7io_#(Gr=Um|pp?BvGxe)6VqNKQ^xVYC&=({$Ed^kjQ^atp`r>bUC z$*J}h0Wt+4f51H|01&?!xv}(`e9uyaa~+v3dTCX7*7yaSNwO z=L=>?6#O~j%8NL?P()!2kn!){+7*dc6_Jr6&3*Zo=;4xp4I7-D?P(q{+tB5pX64zj zIGcKbMl+h+mA}Wz3@Ff+80jO1{|yZfbN? z_Ma%GR}S30m7KMFq?nX+P7 z#ocX12aBdcfK9qM zv+D5z7wKT10fB(t33hA=v~mQh>K*Dqx%SLBk{{|`QOn=EFi7c=XX6))FT5o9b3a?o zBrKHlLGS0_OTP4%mHAoE8eC;>I!@EPbNoNJxmMCUo6Zyd5NqifW zHW6|D36J1Jz%v{1RRae|xy1G5nJsbBas91tkJ+Q_$Sn&j6*}#j`DZR@5NbLsXy!lo zY-#O?ina5ABB*wDtxP#b`A>8NKVguz%V^WgsbM9Vgv*!@mOOV=QL5}2^XltZ>>c@^ zhUv8Q-4+iOlMuI?YvPJ5s?;QzVk^4i3peTbZS$YI5pFEk=5r1LPwRHh5CGJFezObn zwzBNbe{@_+_40dXRcxm@*}ivDd63aM5Z^PQj1Xi0+n&}<2%0p|B@gvRilV*UdL7X} zMb}7PQ~kN|;=DmWBAXrLRLk2dyNF(%;pG$UQYr&Y@*!g8QF_~bp}ezC3IVL2P(beX#r&$7$L_nF#HB05vG<*IndFe215XwR<_pAh9rviZvS zs_DQ*?x>BE9-@4KNj({W1acRbRvQhU_2r3aM^4HyhO}LKx$o3XT3K|*T}f1PCcm+b zaTHNi8;Os92fmZ@t&5A@qBcJw5?Ihp9ZVkdV4^#=tVL*P_b@_KsYxvzsKq6z5njRO zf8uJ&-hb!)qHmZ{OLq9S{udK< z#gg}jPIHnUObpzHsZtm^g9`p&*e!C)U9vePd3%=mb;??7V&@NAI9s*~KNZ}8j^~7cEI-0SSM76O6uV$c z9y77Faj)BJZu_Co1?9ts_GxW=;=!VnrIQ1Q_oybwTFTbR8_{iS4 zXlA>~d`I{Qoe8p{jx!3-7m@H1nxiJ4o*kx;^WXa^RQKTT_j(AA@tev^?Hb~S{9(7m zQ7Fnh5*T*%UpJ4C!z@i<816;uLoGVK4o^_bv}MQrHdd-%_|n^t(udb7pg1&SR!toB zC(6=-&M$G>#yrzI7)YlGd`|!``j~1oX89#)v9idF8c8Qkd8h{~8kK}wY8uCdgX4#b zPEIL>1iGOm3nN-x)Y(w8`~2}p%Cz!BO)mEvZP$52Bx#_R62tahpb@H2($iCP$)}Xw zdKIDF{T!9-pkH2>SZJN~0)krDL38K0-Oc`2gLqodLbW}x9m0?ypkv!(9rSMOmE72vam*xV5VJsMRJg^Z}btUOTP3AMBAEv)R4$SXzBbCH)ymo-~ZA1(&^6 zPA|6msN_6yZ zb_@<>zWw5)#Ph!L==7EBm(t-l!ZERxRT@18 z3)Y7);7G)eVnZDCkdYfQl65jv-oOHw4I(#dFeKp<;Cnti2FZufc#yu0H|xpRFS@ zid(2#J4VX!O}bWLm)HNjVIt5P$4wDgrIvEt8H(eFO7920+ECWF?7cSrWf!HKz})_p z(s+yIm%|hG`g)cA{gmU}tINQ!D8uU6v%<=!xfQpOa{uIQZvEdU!|+x7e!V9#OG18H zLqw~Odk8(YT5|Pd3<|9@(mC#sl8rd({8yZD#+V-d(YNjbUQ^urq(zR43O9+T^-K|5 z)yDI~bE`fJjqCj;Q%bLrRNlF+?waFAyF(Bgl-HSm$MhlEL;rjFX~NB zce#dm2oyKiuRtDW0-})&_9D+HUXci_UM+NpzjOBo7Nl|N6^U5vUQ1M5=BVzNpJRe1Q&n>&z!?Lk>%Fct z9G=^V#=bSnDq%u!x`Js$;db2OZdG>eL1d(awt7i*|8Uz5ls9GBK@b_S3fNP0BJhf4 zEZpX~TrgEhqJ@?95Vs^p!W;i7;*xkxhlzt*tzo2X#|x;>&hl#7qp|S&>Y?m3kiNrB zr)K}!i#qdTqpkzLfcx@&Ou1K{>nKs}1}xlz^hGjxy#KFcYVkk_2zZNreY3`L=x`74TAD``61{ zI(|QOMLSG(iw_j?JIz#_Z3!y$fQuAXmpbxGP34{2fQJuevT5yjKcEvNjUXR>C%pM4 zn|YY)Yd@#Oh1$m@8+SyL4_f@mE&r3LBm(>^U8BgH`|{XIqPSVYg@{I0|j`6^4y>q zsOIH$z*)0f77Rs_dKxQEgb~}(O^hS-?r~Ie)f8HgX@Yr(=k&?{eIW8fKv1H818RcP z$6$Qb13E9qj~{dCD)KVJ(U&9C(E;#OT&!OQ>J|CzS$7m+XK0lxvn2id7s()scrYV- ze{b+6c$1rPSMN4>Mq{+|$1+YxbI3pA{XDe3acG~Fw6vmM?eO?nH`il z)NwU7TeN=q?T+{Q*Myquv-Sb|)Pw${#rQ9g)5+wkB(@SE;y?k-hI4gyU;E~@L7l7U zGG@(emrnb8#@|oLGl0bzr%MO8=^qNuj<*ptQ7>m~t`2n1edPTAQt()A@+o;?>(d(W zZCwuMFy~VB$sBz{cho&nM#5q{7Lu0+13`KH%hE4*D3>u{wVzZl)T$)#l+B#TMAU!GtxV29 z>Ioq@D*2nKnmoa6s|sH)^r;wT-+7zhh_YsZ;&V(;aT8IF-!iBAbBo{1sVn zb!^+Y&uGG=P*MJe)49DmfSGSZNJh{?`C7&p5S3V)MTMo_>Rma zJxHEg-}y&Q4M9c-nsiHb4T30{Hsr(cJ67DjDon;{>`iw=j1dLeJ_<*|LkZ#$o#;aH zNLMphPmcWD;A=o{-!(Ffl1f?;R%5U;3d6T4d>Ws)(^gl%ekJUFNEGB%k5ID|%=k^Z zKLk_8zlVs35PPH1*NrS&85ml2+0Yot6%ljidC1KWF@sLHxzAM*s_&Ils80Nq_g$IB zi|@*h_@1(}P}4;;(p-v9M8#H0{VjL1Uq@PqDlSu0OB<);4cJ)V!9OJ*Ii0w~rv@UE zRYMqwnM#cgM+MUwg5~~aJV#oMSJ{Kyt$){fxrEn+da<|aGX;b_;YxRk}goFi&&8=lG*{ZZGy{zmtmfqX* z!31EL`Sq=%Co2r#w2U7r2eVw`hy-QV^NQXShAz1vNw1r%g3Q**@+fyQARm2D8>((q53SctoWWHtU-ItH$pQ?F@udJ zve(K7-!{@+8SRtu#=w7kVqo`q#uu!)GchNxZ{xDlW7I}|cA0e!4(g||CWbsbXSd1b zZ?f@{w|;4!l>|<2H8JQvkwi}k>7_m#T&`3%`b;YJRHNZy>gP&hj!u< z)g{x@fqI5XLB?6{1>Z=h{mT^w6dgbF$1lPKnC1DNggrMqPIh-`wTs3F8wUMZ6@23r zLdi=5l^2wf0}X9Zo^lr5yH*LEuIT2v6|ZZQjj9ErW0RvV1{HPgpG(jXK7IU)RoTCAGK02K1Lq^ECH{=BltUOrf;`V#? zXLyj4!|!CPq#d0N?_XU;90$s_V#jD_7DVWD%q%>zL#>W-0;E2q8v;mV;P15L)x%|Q zOo`{3BU2!CX~a{16owGRFkl^rMq0m5Yopr-a9@S-!N@fEqg#K?<+o^|NEU-WOR2hl z$CcY)y{kL9!8{!jfy_-cq%63cbGpGMBK7mA<3HpGz15#RG*yDFkf&aSfG>`cJl745 zrZet})5OG)tos|l`sLeJ>X5o<+$>h3zad5zsvnADqpRwlT!2Fq0zjCIR%&Fm-1pZB ztF-qRR!bN*-8B2y8{lHTqCvQ}4CRta9bu{5RS0>er<|G=C-Im1P>9j=XsU9p;~|LD zmR!O-3b!T~7hmlyor$sGPTxz7)xQEw)Vr1g0z(F5QS|p~Z%CukL7(lQH5Zhf?d`Qz zPG(=XGy=AC-*6VAyn_EcwjwD-q6rxDWH>+PZ^TW2>(^sD zQ_$k48pP5?h9`nhfw4bGeEq@(id=*CX6A9A2!6z}CDpC>s1U`ZB&1hy-Y}dEhtOrb zn;Z@UZ(DFudc(Pd`tlk389}2$Z|so#eZBiXEqcM)k}DFMMxFqE>7)(x}-{cw8KSJzu z@PN;;RwqI{Dc0$WB{S zN>|(1u6J)2U97b$@+Qboiq=t(IZK+=3Jv|_=6SP>U}u{1V`i-w50waFLbb44!|liH zLAlvM*0`hy$AAkYxU0*q3wJJd3uO+4fhIl|5iqX#XUwmT4Dh;50bT+8!-~>_LC~Pm zK_CUOG6vus?PN$izR?VHQvj`P_P4rQg8}>X9qYaeib>Y?(p2>Th3p5j;_4Y~F**n< z<0(=$V?veg-(M{_!)~&S(O{okTM3JM;S$VIcL6O1lBkgK#?yNEuiyP5Z z95Jff!KMuNA5RDR@J=~wFI_8HgMnv(ZfaD~N_wysWQt$Ttl|E!u9$ zMeHt~FxlbVC98%mfh>LdC6HMmtuTQGBd;SWHe1>8*k2yP5(I+LfzrN`ws>b_n1@SS z_^s{tmFo1f$R6XV%edC_ky7Lr46@|a7grkM0M_ZJ98=klD^ny0Cf&B&9VmI7X|0iw z2CM&45=)e+;;DO8Ya;ZNsBw~-ek9d#;>}P(aD}o-p|Hi0rDMnl{FUs7k}$pW&6_rM zaCcnhq^#B*i{3sjeo*Xq^tlUteUQC)-WBz0T#MNiI9I?Sa%<{RBYqk@@_XKl4aQu3 zoN5&k+WmC{eD3*!ZMY14-H~w^sp%B@H0A>HZTPT+#LU!PyeStsyp#t6;wVnpLajgI znE9~JZF$jk*K?v&+#hN_VT!}t>A7%WZPqsx8QtTI-R85bVApg(4S${Oa-P@lnE1i{ z+s-V&a|nmH?d0hi_{yvM9>P5MdupxDJtcQF5>frzZHaSFYhJGSvHc;;AzQBYfW*`&iHI}yQ4|{ zrY+-Q#IPPve)ztJv@#Z`9j`282FR}u;zEk7+2(mO@q>On)ndqz6hV{|<@)J|sNd-) zPS*xg5*loNy}9YW^PfNEos&DZ@T}6mZQ>D4ycOKvBzf%Xi|pjrx2~u5*{O_qT@I*P z^6L`TLJLb>F+>SM7OT6ND|ajbuH>C*#Adp*a&yoNRCNIEPP-|0X0^u6+lJU(;l zKe>DCj{tqVe=Lt=aKnhN>g(zdNNK=HJ^hR@qN2moQ(+h#!MU{m*S`dKUqG+#cs8Oo zQ#D{FexFudvIM<$-Yv}Ghsy%>`v~Z!`E1?j7*1fpz?W_Id5$kDkR4Z8$^&u$jXx9Y zeH^~#ij)o0-5C{ARoe6c4cxktSn3E3hVKp9E}!-+bR9Axgo!&kVH=8_rA|~4%D?>} zg?y9;Bc_Dm;jBe2`jf-}Z4O3L?BzojNPmD(f_NHA&qRsqGvTRtc554sz!-6lVsD1Te_ z9tGaEu4qunt6@+eD@EUKJ2SfiA*I!`#;*E7mEVe7j4MQ~)ik%|3uq261jnsh#b!B( z2CqcG7%HFqzu@&0bIQ?*Plr06NaBz_KK(2(m8}3DoKi|-^P!Nx$2I0xO!j?zviOYE z6qjq`I_7_w0f`oY{WwVomOG!&XXlg??4+{5#HHKn7i9WScwn`$(3mu8+FPAv4VvFj1|FHBD8s&NY4 zIS$n+Hc`1g4Iy959;Ets%+sLn`!E*A$;tDh_vX+NIOSv~tv$1>h9$K}1Ed$8 zb$!W5>E{Bl+LVV}?{{<&2Q#fi*ugFn^M^D;_MSIpav3aU$FqXIxP`W@Ep$3G*x*=@ zsdC`){?YN@$9Uy2#&V(Y^Opf<0wVK2b^?mBC;QKjBBW6k9I%5milc>L`~yvYvj&I4 zlFe}W*Svn&3{bccn#=a!2+fE%yBs5~?9E&DY)qsk-h?jgT7|h)y>H>s=g`hin7lC! z16$>CvkE26Dh*i86OSeFu{DR_58a+Ln_XOm$F@6OvX?FyFmMfNt|n(A)4s*>_U7oW z=EA2JzssZk$k2oOyuAG=(44{ssNnZS9+c#7?U48NDgr^^_Zbnp-{&1c(*>b`TyTTLYW zmq$|C{zy9?G#FeZC~5AF+A9xbP7Pte3wUH{N#Iuy`VIwjJx_G{n8_^QzFU#x<=K^V z-dl;^Y1g&EFNs)6qp_l*g*Rs$|1XFnh>S1^N5{iZLudcR*=XgV+V|G}SnU?|W)X#m zT3T7Y<$V8ieF`>+t|OVy`n`E0pEA1HfW{NTcq0MRb?|Q^MSgYt&HCozo_#D4r%LXW zk_w?o(YNpr&nw8|iqkAO5=Z@HUvOw6e5At8KBL;b;8%pxwqQ~cD@g*wzmy9LYrQN; z3Hw>)Om}w9o>yy-?F~o9z-T&$JWt6%y7t`d!^5T0ZIrPz?c>rnL`#Blv0ov)DYB`< zyhVXR>MS(N(79T{xg54(9^2G@CkBhgvZw@d)xGNY7}tKsq%M8O$iA<#1hP_bY*8N< zSJWJA^F$d{1z2-ZOT+n`OC}SXb4d_J-`peu!dH-3sItHmqju^9pTG{tv&n;{=|F9P zlQY1?tT!n&PYFAuzW00oZbOt8#Zv7YT$NQfRq&;z15EYLv!t=aN<6`1f zBrg^-B#lqPH!JVQD@)rR^{0qOy?5_-cFfEGxZP-lEPP)+X-8^ffmLm7CmtTub#!vE zE1p*-yT+;?F0{0*biSK9h$$fiehqpfjX+AVgv@MvC*yOO_Kef#F8M(c=Y_2BnERnhSS%bOHlrein(vyzoZWu9SE^pDHrNnXsO!llDzT{(Qu-Tj z-pB;^9@#5@G87M`7W4LU+<0+b;SkP$bk_4I)K{6wMNe(5gYSnGs!sCRB zxF_0WWvA^ju|u+P_p_poX;WT}mf=#HaM7815O*hm_FAqT9bEL)vO@QN z;SP)X*@o#0*txUnwLcBSP42eXEtAK{DIAB(eAr<=L&6lm{cJrnIU*t*GVle}uKg^U z`CyhHH#~vc_a(k35-0xz)px=KEhE2`*<;1b+-J>sFGNB3w;x2@JWF7@bEg3{pIP4# z@<(n?m#fUEt&P-yHIsr9^|^2HM9cM1cqC(nCz}zJ5)>{eAu(I2cj&S50Y`UydYXfs zJ>Rcl#tOEUcJ}tC&f76>*Ie(m@0B~n{mGF{2;r)fQRFZi@-Q8AU~BVpjy<&Slg`Aa zCPvtIRir^I=Q<*^#vH3F_4ZCwIYv4_Q07{ZG)QSD#4*;ii8d*{e42(T@rMN3_j$1D zkIB_pE-@*ZZQljmGUoCOgpy60+O-?-Ml=BnNds4=PNGSk z5lW%4HDP1cCyscLLF1k3o9+hf09G>uh4)=0!p+Yl3IfaEJ7yA{MhdlG1*8uCHl9vF z1tqoSQz@*z0~q1z)?^C;s-^FIUTaV9w+B{RO5&2dHKR9&g!~Ro_r8`yG~!d1uIK7m ztTj`68M*9zU=D%dbSo%~{WFNy=i61U({_4|O7Ej;$OexP%xlBQw=k=X?}XpMY=jpL z#@hGa*H7}d5}Hzm0qu$C5FHL47Sp^@aQ^-y zQ9A;Tp0j3G+QY!7YyLYzlrg{#KupZav@hwqk)Wuy&A0S#QhrApVt&n`&zgO=F>*M; zbd^0LEOyCszm?&NMUx2Nal*W=;*efPAg6RD!}klEKA27_tWWbNYhIxv)DP)c^6 zGI5&M*myh4KIT1+0Xg3<%2`=m_50B*0Mj!K_WvuVK(WDMPBdE9F4|DFz*vkH>%2rj zGz!X#n@4q#@La?>+y%kq-dE8nxe$k zQmg<+B-5C=vixgp1FEtyvLK$Kq9WWrU<`<-*8>tj8Cm1uL)nl6)nlA{KgJ{f$27Rq zk9Sj6r(fY^8PD9;Z8=}Znq8uyXZG)upEIQ~Ez!X+B75hTj@Jdu7vE=p{uAxzp8nZ3 znGV;f3X-hl&UI_QtEa&7&ckw48{PVsAbPvIS-H6-v(f{foxEE44jA<6x&NYFjV%-B zBe(bQ;hsOi%0qp}qHK0eq2pC7#*Oq*Q|IdYD_9}F&0)Q}tLwXBF^mC&^Zk1mLGFKF zYf@iL;|(IaStt@Wv`zB}gLJp2PE^P-qb6UnD{U&ju|`NXrUf`kp_d1+L>Z^i-KG8j z*tiM~bveOH_s+NNIirb{e+>HE31z8?%lQTX5J)w!$}KkxIg(_h)$sQ1{7$T4&w8m% zke}SWB$UM8M@TDH9uDe~swf;=3EG#XgsNumkC+$j26~6ddU1dl!G_8#L zu=eOgOi7>o_Lbxh9Ly>A+e7`BvZwyadL_#nRWQ*brJ6e86$j`8{Mbs(JV?oQTtfTB zA|P4X-5*&|cRoPkJ$DImcnmyb)^`2eaupxFS8M+a#hlBn^7Fi7hb<6qe3r z?SZQ|_cB-g^{+F}&Gml2FC)e>&kR0)-rhB4a$B06O$LC!<-)9X4*M+l!+#6z%^S)0 z-~x%%PE|tNW%mA0IviEh8C>7jKl4izQd2jtr4@=u>NtPtV@;tQLp?O?1@~m?a-{&k z;P`rl)2mYq#?%`pnrPn^kqCQk0p*@`}IO zqTMbid+NmvW$MHFYVBEijd3v{#q*O?&LW+@fa7!WT$rZBIuP< zl9V5|+Gu|2LfCf`JwH_QZdg;?EXH#{1PgV^p?hR`&gagfyYb)bXY5qxj*9v|g6zHFJ3RQ~%#!+gpeZ};szMw~ z`VbFSJco~}hQ06jxDDxP5t&M4E<`gtozF#=J7NYiswK6{3y2ek(d(UQZC^+3v5i6)M?!){J3osI1(4PMLA0NW@Wjc2L6-AP@u2718rLL%qXG` zMTHzk^OukqIr$yjE-E>^>(-TL@CNj}-F|OBhDTV;Su5uow-N4YD^MZ&vhC1`@>6%* zhOuJ-!~r226o`*<&FeCx8IFN!O*TtiDkan-8m_2yhT|cb;&)fpNYru~@7J;quIs!? zkEWWqi+_e;cHjS;m?d`D>j@>gUgLr(fh5xZ_3HlUwEfc(W^%gf07H=`z?l>mHzy~K z(>9DwIyp$X53Hq8BCDe#L)|5XFq+y!7|KHZ30tTAQ^H1>jg7ls;yg$wgDYy>KhCsV zHr2BsNp+CiM2oK0&GQ02zbEDTb5Le$;;2NF+*v9;_*Q_0PdVC3E7U3Yy|Ui4Bg@0Z z_!JKCx|CPi)Rb&ZT|$cuKy^5i6LTcbFHdHkYg4zFe}$xAe?Va)FZ#qF#6Zd^60qpz4ED7tD zxkvF1xGI)5&M7E7-EYRMNz6JJJ4Bp&?-Ua4j&Te7UXGd*=pjtB>khtG&RMzJW4<{a zXsuM7JRn)*wpL4G4+5Jf6xs^a0h9}l?V|-O2{uDekzmrdCyp)s-|_z>_m7{XnlqyB z|A`(yY?#QKn)=rvo@N*!uQx$JLI9hlpJRfP%dfDAE=NfBS><`$>B)klJY9}c);9x> z_%Alo5o*lNj}{!m`KUrKWjc~TgW2WIuNl!`sAgu1rMpFqGB0mdnG6iaOr|@$lKs2p zycBnT?T0(rliFy!#UJNyJG(<+JIxw5>i^xVe-(T|R5Id1Fz$7wb!H{y!qlSl*8<>0 z1UBho8WP1jhJZ;LaL7wu<-$-nFk!vAXwacjorZR@6> zvzLX>DeVlv4*rbC!>O?lKlFc=^Wjaj@&7K?f9}@4e*GVMwg3JR;s1$R{`2%_;Lks> z*ZrT%0Zozcv>p*WeJSu9!5Y#Eqbxf_1Sg`AA&WjE0^xYjM8X=P9h@ox zXY}l?KXuNudoKl=KEZ}@W{Ni;Xl|2%sG5Bp#Lb@xAC|Njydvfcm2 zfo}-k3VDo;Xy&ch5F2C2fLPsVwgFD0*TfQGFIeOOtdv1^Bt%T3iTu!v3@5ohr-56- zRnuF6hTP74*WX3(Na%q2cH-W!YjC>!$&vmnbmaidhLSHuvc*1g(4g!%HN7QE$l4#2 z$V9F~707Ka?7Hw&6cEP7kktM6={tZl9O3%|Tdd-H^5E)tPq;D@okrC#9-fDbYy~^S zQO1w!r(Aw7H80nOM~ctMu^15t9iH#QU98K2faMR|T)G(crNo!#=2eC~8xOjgjZ>S4 zA(}L_Xz_^q8m9f#on%kL;L{*f*qZ&Z$NqoC`X}zsz&6ir_1Hy8n{extco;?i+KxbX zs&eVG%Vmnjz`Ew&sLfy z_id*(FG*M6D@S>VHS1ztmQJWuNy7xg@mo-NjYNv;oMD;k`gNs zq`Th!in+nLuE*J8wYoXjh!Bx*xUIy6+XHAgdqqvlMw2%31`iU z_L&LL%Hmgr6InNLgb(xXw3&A0abJxf@$OsnH53-u zkn%{9B>>{vOS^c26eb&Da?aWk28{DBc7)o#NuSr`P-@AU%!n4GGQ=~^cpJ^?tqGf{ z@8!4t^NC^Vxs~oOCj;0NlL;TYXee>}locpg`l2}%du`&)Z;mQeOMRC0n4HV5tyGw5 zja^PFeZ0o>ecvVLb#H^dx)gVQU379X9}5t1PB`=^Y(?yGC{SMD;k>sgDK2if9t68w zirwomk_cA;%?bC<2^1pgmv;wUa>bl1xx$FGUuWGXZDvKADSX>pE;MeR)oA9!j|_x6 z?sgQLR7oZzDSO0jadg>?pfZ9(hP{MNEUW0lt)7d!P2Farrr6wRp&I~F&~?MH{V3Ci z$y%DHVSLSV73BC?!zGN2k>XLcwumK{tCsc-i+U2N{KRS#0CtT?$eBZ z$7wVBHlSKNZEnFoDWV{K9cpVfVpqzaVSS@41Rmasq&;p*$+s|Q=OPN>3Y1x7X46NC zQCQ{`HuxfvW7O%G*sn6nHNgPikY?}z7=CA%5N^seTzqnx2+ z#9n>1Ob(`EChPx(4RS}T7?E)x?t1`GNB zpnvl_2N-Vrx$(;G4d9QWr0oQyP)(8t(HWx*a|=v`*74`Z#iJdMv4$HxS5#D}gRQcX)F=x6wqOP*KKQ@j&7KGWHu&Qr5N{a7H zMOkn1VD2WUSn7zBJZ$ykxHrspZeAe0+-dl^zTQbc`rekK3c4>Brit^f_!=UHzTan` zP;ri78ne?k5Tp_>lbGnf;hrmvmyuU4+>N4uspA>J$9E9P>rOi=^58Y0p(e9+rNDTt$tbJ>;_s0a--Royd^5|{1*;n*<1=SFW(KjYx9v-tj}RP!6gw!8n@XMtu5NZfodMbq>b?uVifs5J^KKGRcLxCzv7mOq2;jD&QBK4>e)sqCd<0qI#?;(Ii#=bgJmh^6k&)qla zax-eu4C)Jz-2O%WD!-LVZ4WQYLh4O>y6ny>Cml(^B8{!;`(qZIOaw9 z#R_>9%DH-!)a-QSPTnQJq#`xKl4rJ|&OmTO5tW(KaSuoGI8)?X zcbM5H$DhJ+{8VMz>1uSS5}EE+K_G1BI>tw=VoWCO?eRzyqZU(7WqBhx(lLyu8vMNk z7A&l(tqXQB@$3^KQ!wV3r`PGX)=h`#ai7Ey4Yo^+W8=l$)r+Qvn_EVHuAxkAhSn*kM)#?N zgpovA!xSOf&A%Id(7P9}n{0rf>n6LsmxXt*+k9us{j!b>9F-MANi$-&TWDYlWlt$Z zx}uZijtZdC=ZajIL{JoX-%2fXXX0oWY%bLJ5>u3)DO3=f&%6g*?AWx1%#S9-C&|q- zxz@xiB!nKjU1Q3AgXx+6YHAy!oxZAaJmjHtHr-O@`-etUYBdaldNYvoVQR*5;^eGu z1U?iw?J&2ai>JdwF8gk!Or$+f=0FD^K&}5-E(X?zv#2tgG&nh zO|}3rhvZ~4@M`*7lbcDY4sp)PutUw+&bQ5Z1llz?U)X?ul8eWGSaK-rF9Q!uM(Ht< z5o(;Gc6$a#Y7$`Ud{rQzQbOwaieh9No7WN=fDCeyEi9JSlFz1qVz@}Zck4ul`U#QC z+jQ(-YcZV={77Zd1wL<{5b>iB_*IuA9&LJuUM49*(w~Kab@5dG7Asv*KhEqH zRf{8?6;*fh(YUy|X+1}%tAQ=!8*6mg5UlWEgiVA^itj@vBCI>y$f0_1#+NzxqudRq zk;9^zU;zIlXIe2IhKc&*@WPuJToMX zj$DS2??Y`iLmUOhF*VKvV9CkaUw%uTY9*G^LKKJAe&2kTom{9AZjpA(%GUEa~E;JJS&bu#ntapgrKmpb&pA%C)bncXTHRerWr zwzonptve#LzL-yI2VDc|pILJ5^kXaAXn;O<Qs5tBsfZL>Z!`9^mb)ZMuW^o6xzUd>1Y6CeVhqah ze#jm+5TH;N^XeNcq8Z4m5%*09ovD4LB;8!NR3zX(q5qR_3tJt>r{V5p$7C(fcOu!s9zT}S*RxYuBGo%Ne6ywQ4LFxmqi}k z4xkznVjAcH$GldabcMdK?QWdAe@8P8zzjCR6nJR|uO0)U?deDO8xPk{u6kAaKG+|1 zE=mzcicN@w#Lt-M#}p_Kl&De+8{u2dZvF)_KYh>OZm*s6QabfviiQLxbB{cFuny+& zt|Lc*r0r*zo?l${w(Ns%tfe~IGMQjQT?1#3GT1Eeja|wg=oAN)isy<=1KVelQG$tf z3TZFNRM0{iwl4L8-&JS`1h8e}aL4;>>B>9C7bm!j-@S>qzZFGJxXF;WJe|(|(Y0;t zG?Sc0HQ1zjXRWiskGb7ha{zt3$+FpKqY9s&F8IDPBQRJ;Op*hdGCmgwbr2y6G1Y5` z`uJhHxJV|@VD)LVllPKj>_pq|b)HtvPOA|pZDO@YDo)Vy(C=<(ewDis@y67hGj)Mo zu*Q)mwM3&Ikgsq=?B^sV*2c!B25n$YFI{-QWk4{LQq}yB?7G_KqZKuOqg+e3qoAwnDBF1%yjVT1{P9zJXx3OJO?vp9)v4R(QUllP(iCs3CkL%vGhX4 zQNoZMSz6F_ThNaHv2i9xda5+GfNt{mq`>2&(C$8cA}MD?lN@^OcJ$R&f9~+i6eF7# z_m_{SxUeO>wj+#_yX7RVM`J^)PU1=y390`z>>;>gNC>ao5A|$9so#-DAcl|?O0kr~ z5Z5~S6eTWx_oH(=qqKH8}d-h4y-Wv&EjOqxzB+DZBSpm(ZAkz+++n zU|8$<7k99k|6QabOwB;QBF%I$EUmZp4O$kV8#L+ZX;fj7eaaqY(COa%X`s&_VYp@d znGB(D9B(|pkyO?Ani?RhP4+2MGZQX#+1L~m$5>J%*wJBA$(|H0HlCOb9J>SfP;844 z$RM%HANxdha%1k&Vq-eiHpo?+40rtIRF)4>v;7#4kMclYDti79axE%h7rO;i<&W)f z5qFzuah6|(W?2}FKg?g9N7nF%l=@@kbCSMw{oj$A@1DXn(+DF=yABS$&c6-B6SwYdxcp7O}W;NA`T63#fBy}}P zP68H0l`aPoP&TRweNKXDb$DC|-U?Z)C{2TtiaxEpHGLDag;ybuy{}u43^pKzqo$Cc zd8$}xVV<%W|p= zt~Fd#%LE^{c6|8Vj=imrHrfb7bV7i^N;ViqENakq1vL?T^Oe|G(WXhx^pf%73=O?y z;#6cowLf&eaNd`4_g&%YX?ATovC43~}Sk8&ST%WlkX${$wze9iZw z?G4VRAk;DUlRLmpuL)G*dEjJYL;H5(ja+<&Hx*zzYqQ866{jfcH-|c7OiJp|hBgfu zYrAzGpMGNX9}(8oq`2|Mow*z4Gr$4*;@ahlz&4D?yMDK4m+;Nce7KK|YZf;Vju#v{ zj$JxV9%GIY{g4(u{xlC&+ctyH=ERyX2=riaoCV8K*2e%C-R!V%6t9=xB{gh(t`!&A z{0=EP95GvO)tdb8P`ZvU>k%D>;KSyWjC9 zD1=LxQ%sf>D$Q%pw=^D)V!m;-;<sxX{OQIE7%i5j$^^Oo-! zS-KX5q4X)sZ}o9eYc7?VdAFpU#=~IP6;W_RB5xp5q9Qdh)hgN~)G2jb-1 zL-oqGljc@D+sVo9)r=(Sfr&PgpFh$v_uz+v3hC=I!?XCBA=BTR%lhiD|y8Fq)f^QBg=?kWyOIMk&qU*YS{= zl6+CGo*8Y%?dJE?C*0(TmWSqyS-+)qKI3?g@|41HjqCQhS2koVpR%euw3qze;TaK~ z$xa@QondzKt9xD&oB_#r&iQ&lC@*WssX6UCTz4~4IBmiGGSnh@coT!g>1mamoW{x0 z3KDWs$2U?1f_DVjPg!3+E7*HI(Pyms+1&;%mz=*Y-P{0~+D5V`wu+C7-9UXr#GCb2 z3^sNd4VwZ{;=O{8-t$e{g#i^oW3U#=pE&0!*&XId35ZY?1?^5y-(-B>r4E$u3g}v| zemuCVlR`ALvP6hvmm{WKHI&SwMrC1>;sqr%vdq!qgJ!4{69$86#;e4MNjHd9EC#J5 zWe~~~1tVg|B7J2`U64rIwXe8f+-Qr8Ho24szHx$(m8S3Eu}lm&C>L3*+-afMlrf z!ca%I*-uye%lZcd!za12&x@c);J_v{6Htt6nCKzP|4WSD%TRTNU6egrL&}<3-oR3| z@=@u@$gWWOuKl68^^~P+4F~zAvKiW+Y2UJWa9CvkjMWZa=ybbwZaE;WYI$@Ze{N(o z{dZW71(wj1>KW@iNVN7oNWRJxd3S=_J?;jI77_198#pR8xN(Z+Y?nRvX^Y%AIGq!8 z`kDdR#)ktR)acZuMXDGZzE;p-bLwCD&LA>1*;%`dCeKPourd7Q7UbnzNpmH}6Mh|p zjwx9Blya)I`EG_*>ObVrdu4ksw&mnZo&OboMs06?&Aw%7(lekYKUb`<4nVEjDme5S zcD*EC5ULG>-wW!lJuWc{2}k1dYi8+uJlyp@SOSH%K862(JbeRu++Vcyzipf}wr$&K zY}=UFwr!gYCbpeM6Wg}k*l+sY``q~ibAD%^wbx!-HB}!2AsYyz5$QK zhaxJU^wtiBDbz(djnaJR6Z0vFo#@Z--iKch?f-5$01qgO*2m70dDSDo*yhAX2uv6m z0rK%-37ACgk&&rYjrK4_NK8Ttm9EeNyzQyH=BP%jb9r(urq7=N_m&_a$wDv6UViSK z$SO3!vfHSIO_rzQ-Wbdjys;QMYA6PVE3KU`cE+xkBlqN@vGS;DvZ7FvVE>$8)P8Ay zo*Ykr@VtSmTa>!z*qYnEt@jZL#~1RU?ijg zauPc9=)hQ%e+JDWI1-3XU-^XJD_E6FTr@q49U8C)%>HV>{QaJDZV&ptxq zwX>tUl!%I%JG!9XTFtNuR!9j&4mv!M2j9BH~c&Mt|vKav} z4b77*>^N$abKJ9^Jr43N))g?64$xj4dS(?;7IVchz6kUTeRX|I*9i06pWTW(=TRKK zc~@Etq~%dmTc-;k?0%J`;M)8`yf7a!*UiY}_blG=$SsAa3OU~;i)!M)p0AKiuhjZ# z4p&w#@|hN~EKtNDa z38db&*s`&)VVeDPI0vk6E$069$;VDm<9)PuR$IiRV3u2co55j23d;@)gj9MOKa&E+ zFC=8soF_e_PO z#I3dctvIkm{cA~PuiH|tWlFqcQi*wpZtQkqDh%AD_v^$hkyaG5lMxSrw@XxLGc+~O zaW2uMMVv9s<{B@RGaTsGaFFC366v~M<9NyZ&X4?c2JumW{@Kjb^jlH~OsdOQdeHp+ zhNXoTl6azwF@_ZREJ}8k%|#p$EoE;$OuRm!%eu_ESyZ9h)kbp(b3OtPPaomDV}-q@ z2{GAe;ihMmlWZX)?colj?~Bnp(e}nP9)9v1W-UopkjW82I=h9?NJFD zB~jyG#iAl zABxAZN&w%hU-DuLTO!M)2|lXGb#_A3fP1wr>mL#K_?|PhNnoE6^5H&i8dI2bf=W3DmNNNw z+A6U6k2uT>abV*@6c|C(gpByYuPnmXeb(^)%s40B{k)M9R!{ZOBLDFbE46hx=>oVl$;aTi-H6QRHg@Y}I?;~9>!4j`qw`hP?y}3y*LL3J zS-{$JPI))bwg(%=5-cwoRCi^(F5@M)49@3(d-RgE7vB+rD%bI%OU{4(8U96`Pi&n( znwARAs=e}u>m>0uJqFv)mROVN;JMv@gKh$}P~Fy@_oknhHtW}2SL#0fp;f1Pc7NM5 z?-P7+XO(oiR&a5q5n@dfQ=;PQK-Af#TX<0T-k>6C>R7uZrufKt05ZF7HEIQ$a!U@? zxX}snp(&)#V}704$HfZd70wpBPR2g95o!rjYKhNF-IfmF&DnY3mu({l+u^J`t%Mz{oD9#K z%@z06^1Xp^WGnu=o*gfoz)MvkkLZs!xByx0mH4ROV>Or;f?RWhB@x98adG%y3dR9y zHe_XM1IP9*rx7O`9p%cvQt|{sFbmkM8@3XgKt* ziSGBx(lU67>#;7N{O38&R_noz4}<%gnS9SQ)GL1X0nYy&_)o?B5A~lwZzALb0o)Kp zpc)6vT~om()?&~*jqdoINUo&E5X13)0kKRk7P8aD_yQhr(|yElIJM4^%aAOz2(@6y zSa_CEH8Zhqi?j--&+WA>N|hYzBaW)2%BI7(uwn=cZREyWw}3aVgGz(;M2BjG!z#2c zF3>^+rJJ23JyP5(Rc6=(AG*m(v&M=dap^39KZ@P8lUg z%UMQ_k^3{7&1#a1V8dtbw!@Zu(aJFqC)@9$z5jZG1`^@##AS!q^(c)DUO0aKFKv&D_tPi5 z&FgX^fOztrP_m3r%3{+YY~omvsAGHWE1NJDyM~{^yCW^%^N9CD01H8j7g>PUqmSps z4@BmYDyb3#+WjCY|eW{DDI2eYb{O zeLUEMsP1fV$*$cP#ZTCb+{4vIDHd;Qr0FQTykg5kC(dGYN02s{&?3x~@54$jro-?9 zZ7J6;g=(vU0)J^rKqqFam!_x9c0&*$kAqj9rL^wLU0hpTFC($5OoE(3~f&d89D>!vrGvtU}KvT~qx=!reYhd%o-6kt+=$Y=f$4cnb9$al+ zatzaK3Ccus8$_}7#^x>^4n!T~u;UiX+$ZkfR_E&Li<$@@*)es5&F%-BEe)R57hwzz zKJT%MIC+BEqUV7z{=59iAZ|YShB5iGVEM0VyBfps2FZ#PhD4adLmUmoLkT4Hv!>i` zIh%~{D2k~MSS5YoX3ErAROSe@i*hRkij)Jpi|ce9TQ8HMagx2oeL@4e1mZp` z3Av+sabh~m7(;HcJxqJWMbsz-x_rAHtGuR~dE`5NA-5WrnF zH+ST7S00WvbF%PP=59001ZKB#5Bf-7mJM3zYO8IMq#Nioo%o_f5`J40RV7j#jLIzZ z1eHT}qK2K1<#jojUyoYJ*gr$E8p*lx^O2l=<+5ps??P(iXrkh0&flZ;HaB#?^o?CHnpT z=tj7MJ}3QIuteY1VT^tu*I_va+m3!Jip*s72m0}5S(H+=WW?P9c)(4s%a(sdQpeks zozK~kADgG4-R~osB*XmCcQrR^`7u`D$6lH82jKMaReSeOQ6SL1b7O(XSREu=da$bmhq42g~n z22m(Os6N|#NOuhwx?iM8iVHiFEe{|8Q6g(nWQou+84lbs+80pU3 z$0wuXqlf6+XOHCfH@p=vWT@2c?yapw=++apl%gb3q$I>c<;seJ{hr9jy*N0?`eNNGO`bHO13oVXaH277{&8|9MM}D%_fmiuT$eE>z zs(PeY(%E6Tm8bluyo$X3df?YyZhEbiS9@K+yeot*UafrXwX-`)t7v4 zpS*2A9Z&cmS(L)1^um*8q1~6gn9BZcQ&U8!H>y%7th1B(QM}llU|SZWvPz>8h?Q>> z7uiH5=|OpMB)uT14bL}EH(S<;n2kt`1ik0a*pgJ{HLAQPIKA`QzM{j*E}CQfEtX%g zHv-smilZ&pV|0Un9%p0qXnH44n1evy{;Cc+&o>$lU$stEa!H%Z4X5qiz>n;Vyx-y)T&y?Yr!S26)@o>JjB3f zYb`W;JZe`h2q~ovXHjD}(T2zY@zsI>{#CivWM_@+8`BjN^0Q28hqIXci%Cc48OEX@ zA+zZmBknD8&V;+$lJC}y#1pe7DyHtwo*WvPjQ2}GCCH;ut3hTcG8{Jfi{n+_Dma(| z+MF$=X_gwYi$?Kq^oYkPI%lrSILXPm-g8X33R zzWwot79JOeN9W>}=z-Hb_#f%PzPA z;pK2#QlQ*D(Ymr`aYhv8#YINp6MMwy5JP$Dl;A9!o9{x2r=F{&#cvNT%CNC?GA8D- z92Txp{ILH*+FL+DD2?n~fxu9sD0{54lhdN)=t_ph53Tt`PvgHu5$4C0u@uaeI!CM3 zOLKB}cPeW?fU2?c45FSRU;UX&%f{KV0J zp)Yh5jD~(+Y~`$@d99J}xti$8dwU1uitU^?wXg1T_AD>FB24KlY;Dkr$iBL=|E-`S zPiWTj-z@eF)_6F0XThL*?ib%&Ov=<*5I~*JuCe1kiQ?JnsrCBSFIYrbpE8eACaYHX zwRR!!2la@Dk}F?4_aEDCQg-j>zh{^DUny(IC#kWT?t|4Fni}nAXy z>+-Oc&X)a(>m{Q&L=7*it+&79KZVu`Ri zJO71n78N`i8?=>2G!N07+m;SVFV78E0wo_KSyQhKBbM9~ebkR@oy?945=`&F{Kpp7 zqqfS^+rQ~b!Zt%{dl(}ZbprPQto$6QP@kKQlQT!A@UHg=gPJIh~s=I>V9&G%+c6d zXw*!xo-|oB!GZ>-&>mEx;q2@%4y2O115&r7sTz>#7HdZe`mgu%B1zyxtl?)m>00%x zV`+;=WSEMBkD>SY%C2^P28-t0EBb9Jbo|(vdQ5-(T%X_a763y;edO?A;RTMzyu1y> z2VP2|P$*O;?0Jc^m^Y+88lPRIY%MO1hPgJawSIkYbkihzK4+sP&Bi_!eK3-m{A{nO zF(~viA7J|{|ACNN4KBH7Ke97ft?G1-P%AeCwqAt!6NP zS{$ql%p^a#Ur9=pZ`@7IszM7padgCl6O6*Kf05fD@(G%6sOu;|p!1@$#?6=pWFX2RNby%3lML3$dY)?}vlwa#u#k1T7qGYKx}}QI%-7bn$Rnsu ze>Dcc5?!q{x=pS1VYQ0N)}DYnqbpyj_j!P%Xj(k@Ci-0uH{xY$Xa8eS=W{|gP2Xi> zbj%IU{+!WauLEIpfh)du0kYjJtlb)#rO z@1=|o!q3Ix+?JxN-xJv!z{0QUQBj<9V{*)#EF|BKjnR$fnX#*x#76qhjnSEThCGmXTk0=;ZFzr#F27~> z9Igh?K-zf=h5($8z4v>h37SLD4*N^KN>H}Z`po2_?GXnfVwg=r69)iYCgpn$r>)`k zN&P04dx}&Zi6)hIp;C)A!wMp(Nra31jWUWYxC_yo%nLE1wD&|L3OkCdXk?n&l61tv zMvd027_e0Bjv;w*Io@rLzb4}vr6vK6ADr}WPnVe~bf0$K&Lrh;%67qF5s60wTn{tY3AkbKY{&%8P zO(drSsm|#YR#vgxhS_r+Wv$7$Y^ZGFgmm;$XwsX$O_mT5ck7L>?c;B&f#}HTzhil=Lz>$-mL{!?Nyp%IoqC1)qWb%u=3id>i{{ z5h(q}JKy?Wg_E^z%gQ{#I-(|PopFPj8bPW?_pw)|yKQmu_>R>8rpX_tCcEOCRxx9b zpk~&vLmYxl29|FpO$_d~S^L)V-UcU`w>4ehi{an@vv*FX+dc+vo2)8r!V8u+VfRv( zC+i#*Df=o=rIeKXwaKA95G{>lVv)|fiymm5h`0@p0nmc?(?a$6i!79`CXP}KcxR&M zytb!XEiLmRQS{$i%h(CsOlDDy8VYiO4vj+qym*EOGVt=pU@^**QhD`aItB zU<$Ob_3TH7tW-wb$pB~6iIhzR$>o}3@KBQEa2-5m0vGi!pL4w2N&}jUQJ9&d0VLle zu;a?mGB0M2t=}zqv!sC7D5&=ZM+9N&SrX(w7*Nl3o$eRH)H!{-y^ZM*;RfL3QEE zu@yft`f~>oT*G92cr6y6lHGF*wHnwU5(#aMGO{`Ei z?ADnUL$sux%7)m5s3{))&Q%emq05lKE@^q5i))ynskFGtus4v?-WWuD(br3Ciebi< zMJQRSN147KY5{Qv z1Xo8yTyzj<;K_5^*wfm&_ayTp7wW@{;=IGmD^S^bQ!8vq`yt%c0lOJ&(L_TUKDQ59hV#0&jNi-O^ZKS{p%!NEGsCU3EoIMAvs zo)Kcy3S?(WI8zL=6wGEZDoV69NQ}0;qXRKM41uKPZ(BTa&6VS!q@LDV`hE&JkIyL( z`mMMV0fqod-5>w`QH1_d!%go7`W$AvwP8Gd8>6bzc$Lub`S^s7cxz{+F@Ul6MyAgj z;CMBeYF*W_!8V?xhNwv6hATBCnqncfDLbr?Rg%mlxXzhwBJb6moN)f4l`RjX*gVSC zk3<=S;UOUue3JP4Q4A^7IJX`3{&>Uu22VZClH*xl`X_4g6@ z)Y>tS3U_LPAy@zC``tfLLyt*jKaD#&v`=EoN*i4@kTPwGq@dF|)01DkA{+G7s?zRU0ORJ+Rl`TmuuJrt_)s@Fi z+(WbF6!+B;dUG4SVqKGGjP(vkcqJ5jKD%9{K3D8>QC)(}6I+K}?UlGfYR0^LTIZvV zdz(4Ynkhsdx+yYax6x-KOyTI3-O~bQ$O(A!^?wW6{-gTJv2~*J*>mW^lvH^0W)aoF z(Fkh94OH`y@WLG4yRk4#1$ok1QOk~0Zrdq|%1;odT<5GG?>{|l`UG|Tuz7xH%rl7w z5xe4v4 zBDGFv=SnCN^IJLIm~N{r7GckgRw6Efk!gls%*Dz>le8?t#i^srQng0!DqkUr#-YHm z9FioCr%HPyu9}l}?9#g#zNArH{R%6$7i^lh(QyYAmh#Hw#oVcLKuxtuRbec^(L=N5 zsjIV5b`Dq;`Larx~`lJ$$Pr zodsRK|77RjWP|(zVZLJ*Qi??Mw?RjEMn}vHz3xlOfpGYkJd8qXV5!0s9#4j>C<3#H@W;KJfvm5H5sRmIAYs8P{eN{Oe_h9Q>X*-?3D zGjQo!iNd5HHYsVa4ta{Ubrj`dty@@B$lOOBgA8qc(kj`=1m7h#=HF;z~Ad}0h_)|kdLI$yZ z5{p`;XO zA=Xqy)5{{cFgqd}G5P|9&DrD*l^6Gp-(k}>uvx(xRffOise#0c^afQq=JdQ6FB$GL z@8@#?@x`m$m*o;eUgY-~_DK;{nn`KXQI%b(fc`13G~#&g++M{qF+vqSZ}-c{x;mEE zvsJHs!d1@+XjK5ED#AH#gPj>HY!n8;Y0Th(F}XeN60}k>>*)pOPEfu;g908F?M+c; zMf8q}BCh+Zav1df^+I--Pt-G56)D^$*Y;H%TThQ&UybUf{x$@_3Y3!3&xB29s4MA81dk zP{d~m7MNJ$X^z&+2`2tM5J&5r$_jBdd1A0gg15;kh)jm1#h+7XSK?1;Y*ej$j>;-W z)W0ttN6`G0R8agHMnpO!G^K7KnZ<@te(!y}fK!#?DP3HrUW&NGnQosRl9HPxUx=*= z4Fk7U;8;EW8zV~3dsB3fPz5^3C}*PdLv-h~&}?bKoHR=RXWtgF5TB5kEM zq52~57_665DMDhF30!|d3wXr&RI~`GBu^>1Zp7#+4J8R~mIyvSLp&;?+qT;tk&Dev z748|%>)?Z28eBNJrxN*JMR0U8*cnuDeNy5cXsW{5`pr?md%}mnXL0mqLM&)U$?@P-$0uqwR5{t&U8Sb8?r z$Xpz_{tBRQbS&k=hbSix((0QK2us;o3ANr56O0( zYiNLs`oYYYckCe_EmWtiRj1nev*L@x_<&6aN>z3C8Vk*~)}=#>NeAIml)=@a zN^+Zgo)jSB=?kbU@J9kX!`$Rd=??Ny_HP*^kIn|2y%RA8zh?bRd7g(2qkmTg2&2QT zG4tQP5n(stGu8ixoWMF^pw%{W_lQn1f^dPk?EuB^iAEY1SeXxGh6ug zu8wqJs=rDEbVlK2x^_IFbVM9T35dO?=Q~Ps9(Nk%&ba16cqQe9!! ziM`?Qdf~SI-fK2J6R367E8I2uccjuskzA(EbNu}guk#^ws^3;!zv2F2?eo^wxsdp|eJ;z6nM^srwS zoQnBj(8*)Z+5N=j+yUIs7xm^E`(U25h%UIK+O#M7@+m9scBWv-qP*EkMNd3**?ieSf&bYH zWuHxMDT341Eiam<Fh zBbkL!r#4mbDU1G1qmY8}cFGWLK;tJ@sFX9d=!I!D=WJBqp?>ktN6OJsY|JfaB*Yh| zqns8e_knR|YSL^!fa%L*&}&006^n0}v%eCYB6!D=oLtxY`32e_EK9b}Z?*S|t1FKJ zJ%(uouOEMMLrKfiIkv%0B`YY(gld1x)7`SAnV!#s@vdJ4{kyu_r@Fx9Gy^^gvRDc( zOOOLk0J+hWpu^~@V&B~SSc?1Xj>UXgQ&fQxoOnUwH{GsISzP3oHn~Jb5VzvmI6>L8 z?O~R;JQ}6>vuIvqsPJKG7`S(_vUkS^)^SN*F>ft z&dE`r!|LSj9~8-oINf5B9aSsG6V01CkUy>k`DOjAQcBfD)rOaTp3C0?3~)=cSp z07-~Y#qVwMB3mZ(l5RL}iYfO>41Q(NGQ87b&qH$XD5AahSXrWUB}m#Ua17p*zVHv4 zU4l88Tz9n2v%}19hk+wwVjx%eIJv_p5<^=+zWd1VlL^V5%GoO*`Zbxf=;16W4L+{h z)2Lq)IO{HVp|23uRZ3#e}^yhe$;G1{tAGTdNv1!b}!e8|?{_7M&4&2MHXi%O! zHJHKx_4D;e_{-gQ`u}BFzRPT|dXJP{B%12$+ZBaIV{Y{a z>D}|iYL={=h**q@6ylZTp^}`@;z?(+VFyc=GCsKNi(vrw2h4Q2{BnFj+hmj$edP(7%*;ZhNEG`m>ZFaTnx;a<~ z(0RlwL8QzuQeBd>`3P}xE6Vh9d5x(fGI9aYW92*@z|vQ{^PkrMDqehD+x~7bcn!7< zGS{-(cnjN`MwiGP3lmOuIv7vM5Nc~&KvO-AvHiOojkl-eBp>L-TRV(Id?NsU?QN`qZ^yUK{M!GkhF=Evwh zLyx)$18Kidze9MJHCrC=&J1dl;#w6&LX@Oa+j_4Tp79@yH_L%np&wB*!$ahw2h4s3 z9rQ=#vBX@CN9_%U)mJ-4%m#R<0OJ6W@P{h%ng|?TqPLgTe%(le zc7IHyCY0LrNO>A<|FAuLz1Km&c z$&PsErsp!O#+d`ta_v|ZOdz*};hu+W=YskQj_;=6XkQ<3&`W1TL8(@ioE0v&^YL&3 ziIbC)w6t`U+E_O~`V_o2r`}SJt`P5ODJO2ro};gO|6&7jYWW?JTq5b^fMRFktRwE! zt&;@d6qPv**Z!Ha$c8cJG z;gLpe{prZ>mEQT)Ytz;H;%WX2^tIM)T3x_1qmQ6q%MbIq7vyO8bx!@WwEaLqi&u+x2yN53qXMbf@O6L^-^5D2f==>8b+(^B7}}&F$QvU zk@_D>4kCq;#$%UW!l=N(;xy-0K*5_o8m^x@&$gx%Rj$S^K=R*v=P#p7SY#T4bTIA-%aty*M zP_6^7DKmyt65By*{%kgqrh|1FPc`@IfGO&947O9qdur~d0=J+)>-REmQd4iBUJfSi zH$^DAS&btj>T$PQ*#4{tDlqBVUD2?lCpQkg=?Nu!0iUI0oGw$x)3vBu(D9JyaT)6i zgZ9)Yk8J_$1ZPrc@DD?0^>8Z?#mDpUOzLVR%PV1JN*nQH9Jvc5(zgm?P^pCLbDeLI z^5m~yQBM``?5?`!Z`(%#-cR*$-ADEPK5H@?PrC0edqFKdNA+v+zL!=Fx4dtH&V6kJ z-7hG1UI;1`uLO&ww03n@Hve#SE_Bgm_0UF3o^y9N`jAA1okZ3@fkHDp4F$+Dm6?DS|gXS|EV zauQY=5-9aIlK8J&-y6ffCUP&kFu4w{RhMnJZt1oxyfkOD-&B9JJGeaRwp{Q(x3!oa zd2FE_2RrrH-F{&(#{Zs6+m82Nln=>?95D^yF~1{eb~(+zbUPo`&|b1&8Afjbag%d*qu^J1PZX2WgtsLfH&cgIcLk%py7| zPCss{22Y8RaAGE52iUjqp{HN-n~GSO!)VBrR)XqV7ovp4J{?bC# zs>?{VznB+90cB=ho*S;2qob0~)s_g9;v<-#0)3jS!}D~$FbN6Cv-f7VE&5O|dhC*m z5-~VAt8Dtw!TP`n>uL9qOCtPW>!RgC!d}R;T1gNZxJkqr_;+ugKk8vj=&ioT?TYg| zvyFlga$oiQRS5y#4BP#w0v-Tp=VeQ&$LB)%X376yg(6O{hU6MWS6C=P^+`jDaVF>H z3rK6v3Sa(*H`b2mtyadXN{Mg5u5;ZQmS2*GofQlhWSrXr!U;ciaU?RPf|{&J?qT<` z{&O$6=m6Aij5knn9Ef44y{z~yD4CLJo<-;_1?DkDvH6g@hLBrnp1lJS@Ou)Yq}6v_ z5r1{%uHJg$%Gk@D;@o2;Wh2qt3!vK}x>q5vhM zpR~bpIVAwD+1=6*B`mfPy8HCVauJiUfy&&Dkx~M&6YpfA8o?={@S!`EVaxz zyo07jaIZ+?d_FJ#_beTK?6_a|+{yX7Frv_^W@KO=)mBs~1gErw8^8B92cAl;4~i;N zj8b)AxS!vB*l;kKa`-sxxvti~F_QocZv;wEI_713cDD_Oy*2i%gPxIIN(J>cTsg^r zh#%{aP!8*cxQlpI0=Y`(+g`4G$qgMz(#ABzj8OWoZ{Bnb-0GitysUq(cX?5f7&B!P zZGHsdIC^Z@Ru(3*3cdb$tVLo&-|Y+-wcl=1+8AD!9|*6OAejp-`c4^uPY&G~clJC} znfRs8IJB2q!2SIBKCQ(_WNd6)q(e`@<4P-;CTOB70je+779JH4{`^81?o9*o-(>Ozxb5dEz z47dnw*G}vxmttZUDouFKO?IWp0G??l{bqL2y{fC1wJ<-49Q4ScVU@Tmf8?9Yhn*xB zlt+Tc@wiQO_79?0t$&m}+sK(z>ktz~i}EL1DtZxO`$Zs(Na+>#a?Gl1*~Ts&q7^Y} z&{aGs>o^8bvDjY%Ozh#dDMhQJ%f~UOP^jPxhUB0~h@!F}QE*AzCj_7|yx%9mx5$-6 znH)VDoWEW~LqOCX0vO&4vgeA`5y{N{`Q$ruZ@e@fZZI43kbzLur-6xY$&Li#Q|G(D z{m*i&&S2$x4L>iT^Yl-hs=s&HL4{P<>aH7i-2_S{A-hb>3wwMD#Cmi5-u1S-AA7ma zGq0l{0b~7tjv-G4iV=UwT4Gno1e2@k_*zg3Z$tzUJ(IRP*|9UH8Amm>c;JQ-3cg|) zjNr8_nHu$=$Vgj;k{kkD_mJf3RXi47SC7-my3a`gs38Nceg^{>a_V|Ebs`=<(z$j6 zY9Qns=k9rC9`oZ@?!p#N0#k_0As0))OrV84-(bHN=N|Bu@W#987MBu&oM=7fro*Y2 z0EH*>Kx;%oRaVk;2c-7PW~Jx+XJ8<#Q;|&HoVq^sOLTi1KvG%y_R%xuX7P6^zWg9< zELk)5m*`d!rB$_P&MIfk>Wl84+v2bX%E-V<@%thIuh?352CzeC+*ApfIA*~qsp6n6 zKtt5MrSBZ-Eu}m_sEbsxz?DZG9t|2k`@3i|EGU?ho2A3SNC&41*2Wjsab%5xJvf)3 z#DZR3gb|HQ^-W)5xBkoq$|+OAiageVMs^`B zV+NAkIDxNPH|`D7q=AtIvJ4(Itvj4TOxvC#@(IGxJJ)ZTC&PruG-=SVDanLJiKcPO z)P3#xW_R2{Kl+wWwxk=wi%ByJk2lo*YaPjm8BTE#2`=q6=w(!9ekGH}nhrH&*!vvf z{a1x-K{Kkdpqx5xykd5?ZOa4OS--Enp@k~Ya2SEtp3wila&W5Jga~TInh5)>l0&8W z6*M}81d@i0T#{Viz87-#$>?PnU;96?Tb@#Ut|H~IP=l$emXnj0xw+L(fLKlg3pr{i zkyWjcIwq-gV>IQ*J=Mibya9y?w9E0`cs2|!fJB&B)&=TYSeqk#V&Pu!AK4IY-? z8mJ0xKkJtyfOI?tqBlV;Nf{gPw>}`>x=IBqZPt!<+{g80`}a|o-`K+q9 z`w?eTe<{)H(I8e4oY4}Y%XQD@RhpgYII<4MNO(}#TGee7nv_K!7u(8zeG8nCoK8?o zN$P8`CM@)43NHsFkOChAxuTOF)}N1`mnQ06K69F;~Dnx(j-?B9nIQ|{z6L) z=NBFsAAkK@BSorO7V>ecQAy!TSO~tblo7)Fk=9 zRa4G0M2$8lRr%diUQlCZODi+_DL+Dxk75@-h_FJt+Q7hl`1Yr~+T(dm6>lTw68bLA z7_41Rdi!sko%X1TV-NiN@0I#98i>Xgd?2Ts2X)ifW-@&vYyQ}3f*eM+fb6qwiEJ(Q$)7<(ce2?PL3RL{u5{TkvqHK&u{y@{G(@`!UVaBwU$?Um^N_AmIpf9o3_~ zeY7Bw4A=5frb9lRZ-euYYOuv)piDHy@ewR5)65EH7XNMWtW-}va$ zBIBbJ;^z`Y{zS5o<32I6E4O=&OO&H-n|C-ZOlvG+g|HA;LsdyB<3^v+susEN!iAvI z+ER?P9GTY8{_F&}znMJm67W5{XAAjgnv)F?ZC%+HS3g&JBar}p`+qzS??9h+7jxR% zI9%7jU#;oal)W#E=n7Fd8F19R-=IQc)NL2PrW5P@uGZ^V^ic_IbX!`v!0GS%3RcPB zFDfFL5qOA#bPV0CaTOsK2?a?A+H$jsx1~s%X0p*k{4sZ5yQ{IYK$I+(fgzXJ!u1tI z`9u1aR6o|1bN{RR*fc7`hv=g=cuq#gMJZPpeV(fVi3zk4s;4`5y`~+;_=c=vE0uSr z=RQ~6LF=DaEJOy|-UQP5K3$K_I>N;OOlM1v+qdQYnemK^36M@4n<4vW>fK~F)O#Vs z|9Mo5_(H=n4Rn>@1gz!c^j7U={Z@ywW+>`G%GmV14#DH09Ci#HiP+$~Kamg=+28?r zus`6y&B`;hiY3PL@2n)^=qIJ(gEZujMa${&Fh}pAT>9%?w)LaAkpSe=mG-WBb=Ke0 zcQxfXa3CwjYVa_9#ZAu9fB^zr*CK4EoSvzohQi(dMHNQJgtY}8IRK(!r_U(RPrD2cSnG2_6W1L0*<#{OE_{n|u(OcOor4X!+ACw|0EoZyZ9f@Z1$ zwTd$D`{!gIzA5D}20FSGjJdu)U&zJA1c3!|IBd9f;>xW@PIS#G&42heyKL+N{z{D6792_-Z(OSD3Wfzavfv)T9@YLQ8YmO>-%fqz4)vv2*@o zmYvsz67t!Y2wV`Lec$1ENS0&uQUqHupE#gJCMoVfIJ7hRE$VLKm)DiqR|Ls+p-y^VVj7p}xkI#J=; zvHo30+^rtg8oBBv)ftWSTc|2W_LQ*-lu{llq6NxL^$MQkc`h1a$7YO8pK}Xg1l9lO z+CF}_|L4ND9a=&~diKYe>rCKk0zboqtEl|Xb zQnUuUR|j&1DKP`LsRlSldG2mp0bXUynEvXybqf9|_8>DYSx97D9e_23`;%$9En6cs zlVlMkqSC;fb`ww?E-r8!3{+_NyFMmgh|4}3wY_3^My(-(InAh0pI0WwPCd<2#g8{l zS>O-QVzmOE3!4Mf=^fw+V#3V2sVH({wf)J{`%r70RZhFe_hDmu>4(R8ZQsO=BFa!r zlLr?#MxBC??eicX6SJ~aI2ea2qVC0V<$l}4bTFgzo^6saDWUXhscxF3ov~ZIfla9@ z-!8I2BHfpXu=`XlF8-Ml|8LN=L$o?R^Q5~FE9&#o!Ma2^(~xNB6+lHEnWeu%s0hXY zpIBb}BIeJCq1C2~5tYzs);ByC>L$PMbR(K=9AP6e^J4!G(m*Z0-6D0tbxoi&7D(!x zbr$ET=V9Yat4kH?B!bmgk|WNr8`$7zvF>r8)%y1GvWkoi#$H@kUUVE4A1@yqJljqU zuOE^o4Mzh}K#XOtvli$UELuX1IANaW!YUxqtvu98lNcr}(=<>Y+Pbicbsz#KS3ON) z21wK?97=>XpHcDXU?+O_*0YV|z45Tay1Qt))g)TdsG~w2p_4&Q*KQ$@9ck9}s0}uJ zZJ4?bEHB~gk{YJuLL`HI@k8Hi< z1LqCeH@n3Pj83N$hM@;qH_tCsCM2KFw_2@Yv1nga3)^wLuFgkGcP;1up!6U+pK58$WjjbL5uTIKLlqy z-PtwUZZnxV>Z*f=9QRPWsV+*VT4>Pssa~cx_Im26F(g)4WRf188c8FSl_J5A#Mm}f zS*&yX`kp(_Lm# zvGJlV9GlIpG(}yl3-yROLKc&_w>3wdM2NiJ-$*St(o~olfIdv^zmg`|7&1bk<6ztq z^_N<)N=Aa=?1W|w85@;JvHFr&Sgc$8+uYpW9XYbM*?iGejp6T|F?HqY`qi_rzsmIi zp;@^4Kn@%aXN|s6aAu?=h6jhakSyU|E--<`ar`)GccK>K&~2QGMBNKRD`4&dVn;@M z2;ArN83?d2aJ^e$DmLJ2N5&8+6q?0Rc#w9Q9&1AxS6xL*u$s8qp-I=XXp{tMg=u$8EvPQtk_d<-6|R^Lx=VZF=A}(<|SV{*8l!|0N_x zT8lsX&{zKKVA{7&y61tf?s{tRKNx-Gz~C>Hymou#gOC5`FFd+z-|ZGJFrp}W{#9dx zAPAxtA)~bTQNR|C*E4ix0NqK6UYhdQQKb_hi4;>uMd~bTCkLZP zQSv+&+MIQgq}S?2|4@_Ewm^`==!WX-HL={-Vm%Y%|9juQb?`*gv#|8o;zt=AHF*Z1 z27z%FoMQBaU)sSI~>E>MCh#hx# zz$RG7gVt=9Q0J@WfWa`Fxg)-Be5Te~~ z4wTD-1LdgGadUotaF9@s#jR#*DP^V&hA<|vV6E9{Nho6pA*<_zA}iz~mv|we`x}k( zOM|0fjv2usU9?qam}xcZNo)$o4bDoQ>r!eWREwp}G|}1-S*#qU&TItUu2iov<{Z~| zoCJx9Fhm*C!t+r_X60XqrvYdr$|IdN>Wcpl`o7e*dql5Pnl_+RQBWj$fk+psVKUW) z=^lb!uvwV&>A(B;ufJpEzf;+%*h>AfAt6yb)2ZStm1H^)plKH%cf1uRx63?$}|EK93C%tUfLVQ)f!#<>s3myv7$?*9P$G5R^x)V zbhDKJ+j3*_TXZ}I`+Kac2ga!YEEs z^|K=FAotH=-l++uLYy?@*>N1TkC!hXO4XfO^hsv1PeZ_ZEMH90sa(O+Bph{hDpZVH zjw76P{DOs1jyh(O3cIORQbt+hvh*>IKvFrYGJAvyi9(q3$*$ZKnqf&8IVwoH2*jGy zA!f4+aT6PlBo%Y>)C-9d5Jz_X0CiKC35&>j4_T~xe0zD>J{OChERNRwe2zIYW;75% zxQwHglwxst>D+U+`JSIB9z;>nSZ*yHU8$`=%dd_&j^iRwF;@JJFh!&E%Eysn9H=89)#e==svk{B`QV-kX=j3o(M zs;;QO>^d-(D|Ob8P2B3$X-Y`oxHHR(4?X#Pk*P*N(U%MUbSHVs#FR1WF%!1xhviP^ z=~l}nRB9)8flx_(a%uLPa7AmGQSyQcGnP3*+nlNF#8@Ka97kY0;Cj8wZ!u;P9EufP z$1Z{Ns0NOFkV$yZ3$5SB+8-~Z-iVhAiEDfzOx~m=E3`y~wg0hL?|8Ucwa>-E;yFae zZiMUx8_n3co@~+M!YV*=(Shkase&NRtmI8pQJm2gI`Ao`-srTamljq>S@e==gK=X| z-;F)+Lx-_?l4v6!qi}(IZ498bkEQMf>z)H*7O zju{Ts-_qGm)1%%sqvKM~qnJXldO*h5Q}vpoLz}w4EqGazFI~2UXvMOYAg%I`fUhNt z*PzcCbSKm`dlU-3WyispVlrxK1%Ft`B%w!qwbey4jHaaNO>Pzx}4~&)$>b zi-ynr!9~NHPCVcI+`p*5Ik$B6=Kgz&uOBR`=>5f|C-u#J_cl~0E&kM5YgCV4Haakc z&{u0mZANSHLgLI8j;%SKMfPT}FTpwnmt4nN(i>JqV9_g=+DS2A5JDcAo>rl`*=%ub z!T`(GRFO-UbDpX%0c}tYj6dOovnS`Co>^YdX^o<<9uz)n57%Nq6RD`N^Hn}SENgx#=^CQh2@j>xmc_#bf-@+>IFyL zY1K}-?|EuttzK8(lOz@0YO&(EpuYr`MS^QaZX}Xa1YBy>8=aO>XL2yErfJ0shW$XS z(WyX-QAf8GL$|Nc5y>-!W6i^P*3_Ksug;^+oaz{=?x7Head&^XTGOE{yT*Q|B%J8v zUR^TP#;`K0Tq9Ge)?q&L56B7&z2InJv98frM-5XA+x)d&D0o&g*1AFF!=ELw`egayn`K3km5xuxv$J8;sy3lbfj2OO*xJ(2HE_sxC#F<%MzVGqftvE6w$5M+$e816p z&G2~WIJ{f>F>ztG)mrFuTs^g^&fF2A>^itRrP&4w2t%tfbKAo{)h4THYUWhbmjlIX zoTJ8K9imv9b0cinovT41Cd+Azy2W3gXhjV@D`NyRTx`S!fo}>uENa|o%_l=7v9a`A_e;=Aw-!t&7YxA5hYxAQm)u>t=a^*xS`+Bdw#3kXL$GoO)DoxvKk#fv{`S*%}x zv7PS5)pJAH3a>x{6CMU(v)L%-3rQQ2gVZ$kN}Mu2JwL~}Q2%Kj4HHNz;DbvLCarb{ z9QIU>;y4F7$_?{z463>kchw@)Pp)o~iuD+< z${<`2Q^tAfqRiS}CY<#XZ{vg463j>>JJ9e2tk}aw07IHgOr5jEQ&YSqW-3?bAm(uU z#;~xkuy`pW)0fDscyxHsF-U!L95+c~-}871_2F*jjnxnJR!iu(*z>Rh0;~lh)0COh zQbMYXpI=%t?W!5DR4m=h5gRvHq^rYOuo_1fAyLA)_6Fk1^~S-O8GRo}5`(@lAzX-&;sBI`b$a7rd@PO!!osVE$BeT9GU8Pj zPd6Jgt)@$<={{yUQ}GGa3&^0r2yE3!EwF0%$?-W|1RiPUIfs7sm?Nc!W}j}fS|&JfEdXc)C4ARWAts7J_*jLu zfI3fg;+>_DO@%^NcLJFTa-6UySE^aNu?|X!lsURu^Gt*>(8H#Ft0z0bro5wN^!1nu z&_j<0eWM@5#b*T*ys>v-aUAR$Lx>gVbPYxSes*Y0C10vo!%jJ0ltc}AwuNZ&lY zV#Vg)yl~=TwDOS$4x>l+|5k)(z1i<(G zPN#E5PL-yq>$>(OwLoU{-(tOj>y}}Mx+|UPzUl8x`lX~95gA0F0Ckymh1CH$LC4RQjw-f;Q3sLR=e%F zAeYZF@dufti3)i_ax7OzSJZi2$JsnG?!h3ibTC;+Iu{O%5TgQVssp;zd#v3ST0ug$ zDkD7wjA^gq*jN&+c7z!-0mL$WVRf7=Ug9WD{rbk>>FIr+ZJfAm^p|%GjrZMdHmCpM zXt?H1*8J?gqkFU6w|=C|R&T=L`Tb8Eym#&6y>r{f?a#`?jx9a$*Va{Q{e~f_KY;}T z;b7PEk|ZTahPhBi%f}Yxwr<)ozp$tqUvz&Ds5!7CO%Kk@oVRI<@4G7gDDLA^&=eFx zj+QD|JMIy^ps1q7Q*r#!v$vS)aAvitt#1xCmKQo5MV&yuLWdOX*`~cc}CHkFruf6*K`rOCSV~?T)q1+C1-LIkR z&Rw&^cm5uI@kg4_-BM<@FyszQSv;@+aNy7I@y24+$4#hY*LKmL-NZ~pD>&${m1cR1j}M{eGHboC~bm8a}4 z#o~oUcLEpd70nb00@ip8W`R@2^7%rkSX5C`-OQSHh3IJg3e;5%j*}z|LL=;0408~q zIPXB)va_vF>TfqzaV=tOG3q!3XTcF==<^<-s zm`Pu_JL@dgcaXKgj_V$v23-EQ1c(XY8_3r)K zr?$N*yOZrTh34YaulLoJug?cf#NN4MNB{BTJ9fNkm5NXQ#nHaQ0i(aXqg-3P31#K7 z{iUp5a8UJC?8#-U_2kUs8~s77f>68JW@((n6C)cJ78jfCRv3U>e$2RLG@{jM1F>>c zs7eDrpvXvFU?zAmmw)BEL}D% z9Tp26#EvC(2UB(aHcw3rUGcjoqZJ`BLqeT=K8=p09d;UPnvdR#_pkK+avzPAPrfDnlhu6(f=CoaEEgg~xDC=n}U5Pf6w^(yz zoE4N|k~d@WXPg_)qks4a`sR~pwaELNF?rQ54y=4; zP4)TY9mn<;VDS?N9e@ZS5FCjS!N;y2#z{Mg<66Cz3v->Q12ISoJwjEPvA}mtl!8$n z$L)4SAw|nEAv{T+s@E=`I?ExX7rD$2bM02bg{zl2jVqtgh%n;AxNAU!(dx}CcA;Ky z#Hc&1(_0elZtU*X^~y6*Znbc10wnJCF=r2Bto8J^?lAJ1MhiXuH8j11@>9p(zx&_N zLW;&-hRO&X`vH3LpHcLBv|}{ezPKAbwi~${&^cRBGJ~GpjUKL{mtTW&_KjLgK1b1Ryr>Db6< zb!CMMkm*Zcoh zd%0=QA!NSUI#929j-z#i^|B%OwLm`hZKh z4q3Eo$7p^*P1Ov1Rdf>8A&Auc(By7CmEGk9{2 z7*E4K!B+czw|D`e{?aRzO0`-Y8F^l1g<7qa&*!Z8 zRB@R)iV1t3w`J4jrRp+EICY&!JH@*g6@ABbKmvWSx>P6>i(vs}MAz8Y@ziq$hsSRi zp9HP+u3fwOp_3$gmKHr|H_qs?ZW)H-2+pdy(vV_f2@ji1+LU!h>zz!~u@Oy{t9)8^ z)vl!JM9vZ}qkff^RZnVHNZ*+;s&BpIDicATO;Uqb(M8(NG`vhl&&(Gyj4)hE!; z>Pqo-uSI|L9`xYfpqKqm1l|mX&^@0)&eiCHAJvuO8_oU%n3g!mI3C*W!%g zu}klKj!Fxa&<@DibS*f9C`xiq($emA&|0^SHr{SKi$Jhj+=^o8Ps+ zB8wLmK6Z2<0qP1aK(3>87GXGsQaVr`=yW=QgYG`lYn>{Jc@8n|@9n7VdA{d(hEr$p zO$ts)m@AxHDE8Wo%@2(8xlWs!ZsBfllvy$O5>x zo}fgr+Ho8${lP)=xX$*CJ3i8P?D*Q7$Lz0Y{Q{IHkZ=g)Dtf2@*O&Mplcj^#sm>=jAf`~KJnmH7XO_iBw1}DrAX;z)iOaP5gayML_A}+pOW^KiX z|LmTJe=8dJ;?1Wia10pE?Ltdm?KJlww6pK-qs^#_&;?-`O!Gzy7gF@qsQrT!UC=)} zy4c&Ql6ZPr?lho|Z8RDiH*T~qriFnm9It1%j_bKWbGfnE zuQXB?rAdJCp_#+j!F~`dFE1+|?7EJM%rWB$=K(=M=#LbK;yB_W)kIec(;p>Kl%{z? zo{ZzSpS>fbPNr_GW4}Y`_m&oyqfVd_5h=5VW1Wi_yY}vYlxggeMxarrC%BKXO4P@t zvo5O4>>g!n-#F`!T4lc3&&DoD?}fWLihe*dL}e~Yo>_Lh_wUf{pHVL}I`?g8`SWYH zrRcG*AoL3K+HQX_8bz;o1A6lF=&_?{^Ay_qRWyUpp0I{Oav#6t+#!m-7f z$4yt=@Wo2CPmlPS?mwwi#R-_a>eh(>bq4{vBE@|j#}{5N$9j8PsS1mqEKnG#agt6_ zra>YEIi&PM5RD(fkUu|_9C+~-hGd*F0`XwLK;V#BYoLw+D;$YIR zZmbylT&LY(Ot&GUUT`!8+a4S4NmXP8W1RheTyRAF!4a+Q(;M1ZGgi}IUzSMr*thI% z?foaublrGq58AEBGDSldpw8pRRZGzPQwVKDXLb9FQ66pFhL#>j^L11%p`}BpfzXES ztNq2pJJ8^xXz^);Y~k4A%wzl1ws!_mpC0iu-G5T4iW5+rdQ-tc-FAYmNO51s@#xl% zKtsfw2_a*PVZAxKb~u(X}Tp`@atHA(H9MLjTg~gtk4sl zW~ox!xI$SPVxnezeK7`gEo`!7PT3oTG2#?G$|lWs?V_%gny~3j?sodftTo6y4Tzl5 zkUzs4f9&QoqhmiE9Q|rk|IZn;b9IQW@r_zrg}Li0rkQx#^~E3jKP%09_og>rxLP^> z&T^xQ(6yyW-@fB5URV%9Mn^|yW@a{R+C<1Hi+u?p=I7@tmC9)xYq4Ho3&-mjEQu6T z9W4(PDXO*VG3%%p@A(c#q7y~A(eYNRm2!~3VO+FW>S0`6td16khlWRLjTMR=obgz! z*s@EUx=0c6-aJ0lRX2v{57s(q`pCkZOQ`IN?q-UryZW4cQ#l3`u)e#_mP z@A!SQu)pWlU;VkGH+=7pZ$RCfA4b3Y#rJ1z0C)ZFTfTPX7yk0i&vv@LL+<&tYd-bw zYc@{&(#Jpfp^Hzr|CR6UJtBJaQ$O=R&`0lh@6MO}r@>th9RBXj+dpz4x@%4I@#K3d z!EE)=U8i`qkL{R1QDi@3EncJ$9Bk+ELFi)?r7;&w1vE;b`6*@0%@-6Uhp8GZI-!12 zj5=y}@_tSsiX(yuUd^qg;_$H|_n4l$R^8aBSj@IspsGf(UhUK-HH_RNZ zXd1qVPzg2kKya~N;wC`(0kk}imJoUo>+H=v^o6|xZ@Jop_qm7f`N!J1@4tQ<>fZb+ zy6l~oWvgv_@BQ4Nsdv2o+-E)A>LL67_4Y@eTC=fm=^Ji%`Pd2fPhHx3L^SuvXCFY< zzU9)fm;9%}-lMf+JBD5}iuSH)J}zDoIL&Bf?JwA#=kjW?du#bRtK zxZT2W7Pm0XMmn>lRMRKao2fA)r(I9-tPcpIz5yAd=_I>C8s?;Cjwf>h=p&M+#zp!y zjulpZ=FU6KPp6@AjL_zv9eLuzM_a$X`+--FT(uL*!s+zxZ+)mPQ84<;=bL@ppPm>T zSy{UE!2PeEy#6MwThTi3jbE8h5FPkGdqPYW7B3)zASf1#Gcz-jlar@Z|5XX_!oorr zhU#$pGFtRizAV-+TrW^T*LA6)i@xikv`r{=CAiTD!50=6Rl;GKidEXtjMB+sAe!mk zCl6d+8OQ|%wNESV5Y#E;ODRt)L2ma_<1HJu<=k$&v7RJSiOBcn=N3Ah&~>#Bug(oJ zc`V$MnlR}=gNaDbKLrF8h{*}MbGJG@5Z&7*_b}Rw4)!RPTqIzfhuywfbhfCiQkfDB zN{+9NXp8jexX$&q&3-YUj=FPSr^ci_KR-}q$*H`APoR&zAHDKx=xTlIZ(f6jZbfhH zx}9vl1!Xh&CmJTqDt3&{T`QgE>OZ$-J$hK3Mrh0Na>nqPeiSXds0+szf9UOZUv$f- zw(45#&i8-vkAC+pzxJgY{_@SeB62rhd-PMEK6=AP|5(>{KXlK5A?Vy>6ESg8t&pC}M*A5RHU5eJ0wd5Q_B zF*1l7qTO!0uB&4RM6!hOqUXp&EG;ejLEt)`x;NnrbLP1|mt2wXW9?)|Y0xDnv>Uft zZI(J<6<~U=Opn!SaO`yv$3hwlAQiE^-t0|Z%W>CO5B1e}u{IGZ~ej}1G-i_cG(Tr z-TS$JeRA9D&+QeFyCvMYN4{I%cI~;kw)^FMCkSg!T=%Z4kIxax+upib0-k&53lE>< z{wMFh^=NnNRX4ocehRE&{%g(hJIhns=lhzDM~AmN(btbQ`Z@S>kg6Cx2QB?mRDNfd zU5yXz_(=Cn+b31g>aj2@Rq>KV9Jhn8P;kRxXWVh=baep)0eQ00i5yBf7f}>*&M}41 z!MSXuY&i7Voldz_@w^~OVydO~H3$gu3!X5RC*-ka>;KqtfoIx{L4rvbN12$h?=H>v zb@@oVs_vIXj^4T>HnuU{nl7kLbPKtb`(BP0bwAQNRA(G@*qS^?w7jeh>`|QGfZ(LmYnftzUU8!)kX#ag({i!>*Y`x?rTYR(lF=1$Es9LQaIdWuja`HK9 zRwPMs?AWnwY3ft|hKY?Vs~Ts-I8M`t=jSrQ ztnCf5WoLa2LYgIONE}ir8%%i6)rDDiLJ5Yn`aFENQPawrg}YyvtPQxlQ|biSf!_Ly=pR3gu6{S#`)RcJi|Chj zoXRiYxWBKBP$?F@3n1vY#lPV#2t9?wi~Mc(=HLI{)4%%ZFQL~w_?G|c8~UDayyc?* zVYYqhqH8{7>bwU(_sDg>@yV>(n^k`A`L$bS-)(-l=8?XF@_)bRv*@+I@m{lUw+H$7 zht2wzpW&kR@84f67RScMOc!DQCUej1>}N%}cg~d+-paodP4wew= zK!`{)Z&jhgkIJpXAZSPJG)ZAHmv^3d4qQ)>+YSev%58;` zIHBEmrqv{-Cm64hi$H5Tiq*p=LQ-N3?z6fwUTbjI8`#DDaWJbdpQK$_H;EyNNI)F( za2}zdbXq)B$EmRB=r&{uQCqs0r1+F#&oJ7t3q7$LZQg~JcBA$#bm{P^`~r>(ekG_B zuhs|f@hxV#0k9^LFY>qDxmUlne$VbF(Uzm1`wwHbcJy<%W|pLn+B5W8jn~ag+XuC7#JsD;2E zqxw4>&3n9^9D3^T$Yo=t!eA;=^%u%`>Z-q7LQ=+Zeo#x}&<$^xm;&i!)19NGjMc+E zK0mkEi2}!EnH;e+&Ayov%xb97&C3!s7<~7$zU1QvXS&LRs}U{Jo50{&&cJzAg)kyk z!=0`kn|@+F2UDQF`mRD!gU1-0(jgM%i6ao^Le@kY0J)>FIQ5VIGplh7*!-UBa%VrX z=eLj5?_Tbx$hj>){IQF!x_Lvto^kQIYp&n@-EVzhy84Zk<^MorBscJCm)|`S0W-Pdh(>pc}BQY`;MG=c-DmN6$({smKg=QsRx_^1)=QnNl z9B4N-34q|jb(}qO#}=a~bSM{@9E8XgoWZOfx|_}5krpV1317XYY-X0Y0NaGDaE#$f zp>UjOSm4Z7Ue}$q#uqjXRkX*tp=vDD247QPu5%cHM1gvXxFfm)yy{pFleV6>I_0YD z_IIP<*P#2~jTZkCz4CAEd+NDh=leei1>84(p_irI^}D}%_#L18P;WZyOMm$3D?j;{ z7elr8(@2rtiIb&$@BQL^?_DER@eikeNxOINR*~|`E3X_I8|$aX#$$SRcJ`r%9#Zjg zeHV_=%%N{b6F2U-5Y1@0ipedP2P>ah({9{@Q7gVjkBj%Eyo2Ec>KwoCT=di}^?9wb(q#CnUTnMN`0lK%d3tm#m8G6&ggUysl>v~cy*Eu>=j z>FF5&4DCX>+tJ}&sC^hs-DKZW&jn+b-2esLbKlX6G<)y8XXU~hUfvUoc=G<;Q#ZVR z4641~g~(Vq*;y`q=esUlBUSPE>0i>ZW5?8cb!uuVpU)rvSE8%NifyX5-uf;aqsGe9 zY~%LfQPj|K6~%!KPPBVXyKxUjt$5#Gz|Z08-Jw%JC-fy0r{1)&@TTVUU&Q%w7Jbc} zZ~ovPWLy0LW7GDp;w4Mbh(ke2A3AS|>w&wtVpRmkt&SVIjK}RxXLx9+TCWKmS~~In z&)%DW*;QTlo_jjO9qZO0)hwwbgb*MBLXJRSiQtha7-Z)&P3Lf$&Tx2t??6MbB$WBpfHn1#hz5XQ#@) zwRojXiKz{Z=YN#z<%i*}@i9h7BsLr?9o0o9qLwfyPBm6m4^8?a!IZU=K1Ny6usw4k z#c^qAJaI|tqJk9LI*Ulu^b9Mqgq|kEQ6Kbp`qNygl_itZRxg^FJLsdCP*=k!_ic%r z<+?eae4#wi#GDI~O(XuhD2%pv{Y#7AV3W0ABFO3iqz1M@5JZ#2YHLqV59k^LXEs~#E11UwwX$+$DN`;n zSAHyY5&~h@X3A!V%B0u)d|{?gC}>+Rq#p_|44GvmnwmRv&6KO5hOVydYHL3}G|*p| zYIagrw|53Sr1frf>f{yQdwy)xCImGysb*7Fq?th0{Tw1aWTq==P2=5I$x&zjN|X15 z;?BJy6#CwxA&E{#CRoOC=UBl@ePhw%%;YlblS|}KwWIcrO<0;Zm|B>|?z9P6+d8c( zYRmBU+3?%wna`sA?~es5-Z=wWhJw8DY|X?m-D>Zb`5)!W_kVuX#?7lX-uwTn`E)m2x` z_ea9eb;t84*Z!w^x$B8bI??dHKR)xGudLZo{q0Tb8_}TNm7C-zJ|S1+&LD_9^laC6 zc0AvF`I)!2Bsyz_C*W}myqDl%ppAvD;nfcVqO7FO|I%q)%Ibw7uX!~!fR3IO+*lmUn--U=EbH@8y@Af50=YOGl0{LqnY)Trc9^qa${U? zGNgAkdB>Qk(~XwuTwg3_Tk|Q?NZy%Y zG(PslsQ(Exxfm_}DgPiwh62B_@vG$ZlrjD#{>Y8)+H(IxkKX^#Q*Wx7JG%4L;Umwg z-5&j6Vfn9KnEn}EJe_;v%+y54Y{cg z=;h3f9cfgW_>VL1IrhLnc=7VyM(Dq(ZTXj1uKaSVdj>(|V*g+48yIwZ&b&3j(xJB> z9>-@Z$~(i91+|Lcp`O09ogn1ON3#eHLZN;-w!%rct}cwjS~N+Sm9}hh>4IE!dTORp zEYwON=jx$8Q!d&Vsnd=5e#%OIq@!C|Fl}e>#GTGD9qxONQG4Mt}#_@b6ks zVKvs^VPDUpTGh)J3YM1B(y?O{Injin;&i69JqQ9da5-nuvgeBB-(B8EbtpMBbw=8k zwitbJd~C|AB`r(OnAdZu>Uvqa(}ME11Ea2mqJXdN+bfeyIn{cHP&>QWisR1ORo45P zz_E;dbktqu2>OE`qtE@_TN5DeL~RI7oSaG$m~505BYfQ4gV0lG^kg|>{ltwxw)&x7d1mQQWm6797$URZP0_wHVG zk2#N#sz6t)`CvUUxv%FUb@sP)V=XN$YuB#bv17+mPd&A9<3{x|QmDx1^V_y18=LIllQoVX-?aYvEn336f8UlhLvMK2>(*cLG1Ka*v-5KK3H0Lr z@2rVi@M$%S7mxo3JdJ_(6qfBMXIpqx9(vSrw0OSB{8EnsY~0r7TvHhEn&;`sOXVI% zqDw|c82L3PkrIMaN?V$m2mN4OOLG)rj=pOnO7KXfTn$5unmBXaEXJO5+zK!9hmA@` z?3E*j=+a=L+Mrj>mgAWHc_Xeo8->=_Y#7J-{xb67qo#a;GS|x5O2Lq_{dy8Ll&Idk zR?>GIHQx6GIuQx*PNOG}qqWz)H38x@N+MJ_xiLUATbwX)(nJ=ai%aV`FSl>fqFZa))SMPv+W3tzP*8BBGJ{=H83!6{P^+3ix;bx(I;6smddMC3(AvJ zE9d`1VeIHvqULyKP&YQ&!6$1R-?+T@k%L;oduHO`1I0Hy>x$lv6~@y_r+dD<5{*pm zdmwJXr`0e9!pjuJxSju5jwJ=Hp`QKhF1gLnM?I9 zXe}1YlhtxaEsuxo&24-3zuMlE%i8X)$^2)RoM#zzK=l+aY4qEka)r|E`s6Olpr=|dQX|8z(k&LU4tTW)U@vxX<%TY)hgDl`YHiydaZK=Vx>ol=4UeA&C|QmXwh4#1u|7p>z{Pa)OH`>E?B< z3w642oT8;Cq6@X!?(tEFG7%L#$=SZ|QIZuiTE>2?VWA_u>g*YY-AGbW&m`;VYult1 zV_lgfLm_KX;25jJk!3Dt!oL#Lui#P>I5r~_j!-q^>$=;|$z<+*{pG3*Z(q6cNTKxj zU=i2#xb&a|n>4GF`Z~NdKK^&;sOR*H?K$56X7{3o;2j+u>(;H?zJ2?)ZQHKC`s!RRm(S{az*ZpTjs`yQEmA8IMO~(X0_DC|{eV&$ zhQhJ!npcbRu(S;`4+mZFTd5+;LAI-2SES6@Zny4hFB&#bo!AS*;c|(Y+^$oi#u3Ei z6l>dPq?e+kUv(cW>OrrwuA&A2(e5$|9EbH*LnNM6m2MJGvB zJfRo_?{>{F^<(^(Q5rPIq^AA3uKl*s)`MeSNO$)@n8Nl5@Uz@nW_0bot|X z!ot2Ux4LKCGB-wy!qOu%T8U!+tN^i=IlgM4_a^85K;OzMT~sO!d}UuFuDtMbE8|{y zBgIl0mHuVyOvA_C~sbBbEHE)tFWH56$UQyh77 z#<~g|HP>TAcjnW5*-eJBF>P_3Xp~@N3SW?m=?pSnnkl})x~(fcNqrdr008)f0)gXs zPLx0#_-Z`BsU<0MBoA`QWdCGwdOE+TyQi#^h1IAcl6_FtUM&&bM&1tskB5jmgq|o@ zzj)pSaWSl(pElkmA!41mTB{4LaZ%k694WY44h z!-t=F;NJC(p!1e(&!DZ(-2KG0A3J%+fukonuTuM*IP-aknSto)>e{ej!_!Yc{nS%W ztzEnJ#TQ=;g5b(4uT(yBBz8PMf8C8Nl??nW|T<)|xWefRfmtA)_f_{9Elv>l`q3 zj8GP8CJ3)=TZkIQQN~f-p>jzXJ~rFD{?ynpF*Yu&XAo0uQn8VNjQ=4D?T6Phh)t&; zlin3?kCKt=#<5WejIDY)m?a48x;f{u=%mF8E6%4pyqA{}U%b9ILjU^cZj@fL{>^lp@-wCB{#`qJ8$suT$NJHc{-^ezd&(H4ke|sc zQTxoi!86}{#xj}A;>C+koH%j(_;F<@M@B|C=Zh9CirVAM+oZonmhoHQls)(NAJi%n zV`n&CZ89pxW2e>Hj6JaLO|DnpT0Hm_cs`#6B+^+#si>7}rIM3M6XIHKl2?mK$5Bsi z|aAR%(-oBG8i5)dIC$ zHKNHn_KVaR9lb>zj7`R|zNGTVYM}^lpsrfxe!{qhPFzdcFwW{)*pni*Z~y=Rz%LpI z9M5NTag&skS$Zbft5G|lB^@m%oeV63ZOfjXnI4~pglJ2H$weSWiudl9za3M6QHIsjZWR z!>G-!Y1%8*SRp}KR0FJrAfXiH(2pEiOsH!d??{uvR03-UCao@N++B~0Di512=jEws zpYxtnidt695B5#x)j3OnFHKgL8VtFFvAUc6_I`=)Fyk1Z%Rh;p`yqPzb~JedTIQe^ zA47v4y7HEKX4Vq){>|wBdkp>c7+QM`3SQ7Vr>;iVTsdDpeOtb;@xiTgSJb5{5bC_; z-uw36T3^5C!5_ZyNwz(+=4;#6Y}@$xd+)vP8xQNQdRwnp^TB7-ri*TS_&&4GCcS>o zgGbTstv5Z`_pr`WR>WKPoa7#>k4<-X_xkngcNl^oShsFnZ*T9sO{W3?;LO3Y$V5_Y z`ofScGYuT8Rkc)|0O`X%%wL1Djq14^;NPPEi^BMRKGma7Jxd06w zMJN6pRWC%%6pg%&3LGt3gJK=t99p~*y|xcMS4LgS5g*b!+kI&HqWSXaJNV>7yN}FW zQJ1PfD81&IO}946kVbdEv5>*RWBr|1f4cM7LtA!Uv*{z7byvM3y`4*Sabji4>VCki*)_vGyOw;_Cp}k^I#G4@PkVddw{PFe-)kx> zb7zED!o7QL8AdN!q@$QF*VHA?tH7uu-q1{J7@fTN5U)TzBi>AvBEZI5Lc$sD$9(-k zKk^NUdi#3bs=uo$E)-WZQS6r5^=N64=%B9;eV=rfB`R7$qa1MvR~7EJo%vRe2Xb1f zBiEsygVwxWAtE4c^k!o6hhCHpQL#_2C1nYvKZO*rtOl!DuQ_nTjBrlk?m&f*fu1N5 z%No;YwvE-SrXM~=0e^T z9N#p~Rtl0mP(GDnMA@r44Eu1JkYrIhWI_S+=?GK&lFF{0u*BfUz6)*wMu>f~Y~QpT zS3_=shIrQZBs9=?a$0$^^-#p(t<;B)Spo_&Sal$jk7A^IHo1wpc8hn)8W4tz^du1x z1G+KTpb5p8vg+#rYFX#*4}mnxwI?TJb+G=gj^hP)`P#4VPsC}PF#YdQuP2Z#8>^p$ zdT?{eo+%zD-a@Php>jhzb5v zdEc?~C>3VV-V>&Nahg$5!H`}CfS4=W-fqsA(M6pN3*g(kW^O*Mf-S-=3IJqyUF$8# z0rCi~O&90Cl%C0I-`hM9+ECG8AMi?Q4Raru#aD7p;__RZ^vUY;0>QY_X+wm296@Wl z^np3aFvhKvH=ac?8h6(5IaNo?>B{XdW-j~w8RHBB6Z7(5lM2u~rls$ry1dP;z9i(b zZeA?>k0|8a5Q8vg9V|<-F*MWnNF&y2ICV$^@+=0gzbtuK{R$heD6AeLlnZFcmW05h zFZ&Cd>9(U#bZfD{K!9v1XQ{;`M9=H?+tnjc0O-$74w;XJEp4@ZVB!hkt2byXeipE@X?GQSRl(hXKZJ_nNXq`Lj{B)K^*FuyTz~2r) z_-9rif?m#>QbJj#Lb{}gNkY+hwI{Czl~_NXKd~ZG^q>n5SjdRPRNn2jPLx+Vu3Vg{ zKg#DgG(LeIpE0KI&1mdrx=!2a%vI)0t>{V^Q@~FOotW0~P@xMrKJW}$P3n%8Mez@t zG*)SOzD1=;Q>rCB@Lx|im&5a#Er>N2yN*KH`>?Z5dy(EEPJfmKgqmtB0owGM$~?2H zrG&)98G~f0gUwMcCmdL+Ic717U1o`G6)Ae};V#TbC< zZpIbf%z$jJET}!|Dypu5N#P8(0>J6?xyU6j!;axlypV_}#Nd;ePMFcKve9zwclOJ} z>-w8Fn6H7-~5;gTZ12=yZ5n%w3ouRlmomFFk0^paFO0VWzCsunN^&GjjH(y0VAEgm8= zq3dpZi73jgmojHmw_ElC+~8BAM(0@MvF{X{FvVLHYMsawPV0QD&`PXRg`2XMy=$Da zcEo(iT)yIV+xb1l$!RTBF7jy6?_MTFj}R-I7E7^Hxrq=ou^c zDPDVYni!45Pc1aOfUsnTOt<>O$jFhS&YUo~jt+?!?~;QSFN>+UkCM<44AMSn2z*<- z<G7SagurI z@$el^(U0YVtFJ<4)PIgO^t%FiaCk<#Rf)764y}P$p(>d*#7?SM1`E{MDba)<3WsD1 z1j)9FFm^!Ug%5wF+EV(xKYPV2C`ZQzI4nfOnAe7x*PXmp*ZfS@lIu}5DLpM^cJFic zPsb{*hK5PNMaR0C5tiZPH*u3z9-`6_nX*UZ9bj<`+y4a>gDq1S-I)H@jS6F#6ODh zd)&h^Ui1sqs{cCV&|-UI{hq>HZ?M3dX60`~(?fH2_rDkrp1Y@#d0zQ81l)K3#x%;yy{XdEm7LD3Ua%gJa|SW#&N2ZJ!wy&7VPJS2|}! zJ%U+&B|+>Tm^*`8(6=d9mQdchvZA7DRum&qUp�VnLVbz0PwB0h7|$AeS)K$r1OO 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 literal 0 HcmV?d00001 diff --git a/screenshots/f2.png b/screenshots/f2.png new file mode 100644 index 0000000000000000000000000000000000000000..eca2a9bccc26cca0f82b38474e297af45b277999 GIT binary patch literal 73989 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

F)fLBDGBi9qfdhgwVYAIXar0}twC1Hmz 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

#(X2R#5nk#FxG)ZOZ7(wZ7!Vor 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 literal 0 HcmV?d00001 diff --git a/screenshots/f4.png b/screenshots/f4.png new file mode 100644 index 0000000000000000000000000000000000000000..1fac08b017f700861ef2b3c8c6256eaa45402e9c GIT binary patch literal 85410 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%0Ak5GpxQO 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 literal 0 HcmV?d00001 diff --git a/screenshots/g1.png b/screenshots/g1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c42b2b6eac38d5572a4082ce8c437c20daec0d6 GIT binary patch literal 326546 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�d~xi(!QvHAy)Tk%xNMiXcqnst(eJ&d@1n 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

!CdH07g6a!dG zhiJP{D$XE})9BK6VFOH$k$TLsLf(xlHkR`sf7GUI>_!}E6TpboF^en+ddM6j(7By= zPh!aP`0(eyy$b&0kta{JYyNcJ>LQu>GUR!t`oo-u^0wF~pX+}xrYdMAIXcng-%BYk z8f1^=N_^4DD2*_6A5Rc$u?abyCa za#?3C(~1f8Ek0SL4>7>$XBZ>S^Q}Yi(&c5W)}(cnW?lHS8J5-TAR!u%XM={EV|G9h zR}RNR>;rS|NhA(``Ab@F7 zpFY)akPulM?@vxTd7qa;a+GxM?l!#Tj^3VZTVbKN6MiWemeDtt+^6n1MaT7mE{An5 za?2kX!NY3@Y)xKvLKkcmhY-9955wYuPFzl;3_V9?`Qf}8QAc#W77D?|8xvYpA8 zx_K8Vj&oLDbs2Sp5$^SbPcAEWgR54a*MU0ClvshrBENR zKa+a@1HUHc?$_(vr+{3_bxv95>IQBOH2dY4!@Sd*GRt&kj_t4b7K`=APi#`}n|c`Z z%)8vmlVz_4vVT^D2bj_1d@snF+-Sb}N_@D&!LKe8zUON@qmL}T0Z=yx^u5jeP2p@8 zv2Hhz&0OC>i#BsqR@rN@mwg;&&iun3P5s}upsZ*@m`#x|Kg_dbHI3)}H;im@0B00sTE0(;We82VCP(^W5PYx)FF;&#NPIm;Uy@vZUb*P&3aM3R z5N3}f)AAxL)}jq$nV(9s5!R&*?24GJEL=m!WhvoQZU^&QP^^a~xYG;u{GKn_Py!ep zSKJwxe;o7vp-DaiG4if}o=fJ9E1yuT2n+TzkT~JCwhWH{eQ_cQC{da6`P*?_5Onf) z#p`E**Ojv<_1Mp&BhB%rn%+vZUNT?BUMT9r2))Lj?_wY-X?gt0;n*sgY3W5ae2gW; zg@3O@ew1?yycrl*dc;J`i!;5m8d4V%GL|bc7KFQgjsC$DCLF1oBtN=sgRdY1wRm;&6T8OAv4D zIS_M%*2+B#Va1N<$*h1r)nL&{Br2gwEU`K8LDlz?a>}1OyxG`7z*wQNr0@Uwm)O{M zn8s$M($m9YqWl!Q46L7Y(m6G;DUMuFa!DZ%%I0$sG)dtRXZ z=vOIT%oJIME@7J~vh8h$gd<~S@>_6%Jjq797m>{UQDBDSWqzBe)Sd#RB$&R2&1(>U ze$aNUom9R*nFsdV7x}WTidb7>&CXI$Ugeku&s_71`PLZkJEXvzQK73X zZw}gA@my5{q_&$>wJb9~{y`9+8=D@A_{!(RY$!VSs}u2Qa`VT;yjgmL^hs0;4^-Hm z^w*mf`H^$gnE0~ z{fdn2`VMbL)C%G0F~1;#$eo9W{O;CEH-o3Raq5Bdk5nEVcZX7FWhKM)$s)#J3|Y!7 zV>jzLw$RFVG)Y76x5qowO_L}&t=~-T4;|O4ypczth|U0$8@BHS_1Be{l8_#&2C9e)FH_@RyuG&>&IBs5GPzGOoE|LGmV!*=Yw;IZe0 z-)U%t=W_Xtk~xSfYW+*1kknD)FuRIp$0}s#6?0)Gnq+V+>T=`<`f^z(rkpsj_+`sp z#HcP+Jg$pEsd^YWYS4OBO}8mX?WVM+sJbKW=Qic1@bllVkvrN8+ZVzQw&S45Cr#+m zg6)V{C~tDPm~hPJlR}Tz<%sW3E(ecRx!GfvKC_%B?>EjlqNW}c4fZ0b+}qZ027i5H zJU5NQa*4DsR36=@ikA%59DWZ9AR~43?H^`$B54p(5PsuB=FV)pTnGQppz^2Nvn?vK zdyQDV3W`j^yPvr!>x#}UUwT+R`OvPzc0B(o+QG7I_0(jl=chw9TIM&wv}<0XHWfB< zzPSv%Fy=Sg=%h#iJ=-HOKv8>Hj=Nwg4%)5#H2O5c$QvkWYnY(@Y$nTKP;Ho~2@cba zW`3+TwkB=ec!)b=i^MpBG^A|25_74&^lGTp{hdzAZ^yGllo`*{xV`f*>>M@eGft00FC zh{7brVtNxC#?+9U#VPAkEzU2MdNlos5mR_`dU~p?tn7Ppve-K?An7q0BQ|I#M9GnF zhh0a_N1Ve)`r-R4AJn^FDXaX_p{LyFic9#eqQEY1V|U`u1~fjsmsk^qJ3F;ACLyIt zG4?Zm8$8X-0Ck_pz*-8Wf_c(6iI6Bw*9GsZAO~f>bPVm4!DKM(a)#~RVB1qlga%Rw zv!XsAQUN^L5JK92KC>$Vx3%3+s(BrWL7Q@k~% zYuqy?VM6g^WE>L78g&EfDNL1SEm+r$m*id#fyTu@erPf3_)04@eGWMsC;kmF4e>Li zz6i)+?i93*sX0a8k@N8Iq`2fnv(A3&z4d;de`$2JjYKd!uhZ{-?fm^McwpGYI_v&t z{_6gGU*B#LT=IsX)6Girbi#@a1LCiNMbh)b1A;(%^oheC4j*h!jDK&qbK_?t$B$O= zd?xi-Yl7Vj_j;6FyA3Evh&3SdJUxQL`SWUS-pZ_n68euzE`>#@%q}SJ;#w%U9^k}9 z^y^4))sa5M1C_;z>PpOT(BfX1sRl(B8`=xerkL3upq^NN z2iJXNb#sfImy1#9EOwRZ<4)~LRn$-NS)qEQOiqRsAMW2}wQJNow{8m4A{ni$)-5n1>+%~_)!4(JaIxtQ>(4n}R99CKgeMAZY*(3T zxwz3q&}`dr>6-Z8H94|slaU6iFfrW^jN%2X3�`WbY++!;G?^7N7$kOLQCF(woFx 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%0Am#Ds< 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

Vj3m~rx;xls&AXW}6xMH-`{Z;A{T*fE1 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

=Dk6Q+V~)1L|tm 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%0D9aV$)ms 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 R%NKx;wz{5LiHddT{{nK6CcFRu literal 0 HcmV?d00001 diff --git a/screenshots/g5.png b/screenshots/g5.png new file mode 100644 index 0000000000000000000000000000000000000000..c196cb2d65938387ce72d3397f5a9aec31e6c3d8 GIT binary patch literal 183893 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 ODaonHR!F~m^S=NklSxAW literal 0 HcmV?d00001 diff --git a/screenshots/home.png b/screenshots/home.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc71811bf724d3e25cdbd9301813f9eca5233b9 GIT binary patch literal 99754 zcmeFYd00|w`#poQhP|`2QQMW7IZ#@fIW=23Ri>t>REkszB<6q!v@095)SS>9 zXj01@5>3DX%5p>{wL}CVQ8Yy)Q92 zlXLq~FsvizvtERTY|_>c3gRO0$0Wq4DSL zAOE;(o?5wY*U@^{tbJ!zV21LK>}u?P48HOD{l=gzY%7BCON-Z5HFP)vT%Jir@BvkX zOTOMy$I0rVE=XUf8XBcNq_$R#;*sy z`$#<^egRT#KN8{k-QlliEluEM{pIXm53F6*Wbtn|*|k0q`2B6Q*InGRlK9ure(kxu z4fe}luYWppg1zFe*B^cRh-CcN>r-zY{NE;e>;EegJ!k=QCPqBT6MyjfDWc~|$^h!G zvb>Sn-A+{tsLeM|u`%NEx`n4W4|@7abN@||M|K_rz!ZU;+MX<4jWbg!r-{Y1u4T+B zZcxO=P>mDQS3WPLsVya)YDfDXRqbZ>b43tcA`>Vk6IL+|pg0wzC01a`7QOT$JF6yf zj`qvG;2po$;`+-MpOS>WNCB>9;TlK{$GmDQexpfV>O8MW0LC?x_(;Obq1 zIHvtU=PLm>F+1&JRu?@y4b>@~PF{r=8*b{GOJH?n=@sQ!j#>C^&aE+%ss>_4(t4Xi zj@LJ&gQo_{G4j7GlOucYts*wZwzFPV?~dy%u#mnmKL4!lROJ?cQxmI9YLM_*&+YzD3bPk%&5sU~xnz$}@RfcefQfRRgJwDuq zCQo8dP}5k-_|d^m}ek7+9-p9=6YZ*OSqU7fo*jJ@>& zq_L$f^$gT?Xl!NPysXLUnLP1y@iedRb5Xs88T4LIZx%0_D{&{B zYg&}qJjf4y&w_V#EhTxBkT-4=H`G(~obIoAIG-KkZYp<0r3gVYs zOe#Cb<<>oh)6QH`h1d$Xwon6JlXy9r&!tinc1BqeC}FjLIzY$d>{f z!YDA@r*1ob47d$pA0oInW{{NvNa_QYc`+5$>^;^%O7#8pErT_x1o4e+uzP#?Q16Rj zvk&6`*ySA>xIQDaFG^Z#OWWYG@C+M+-Cx7eyR?!x4XKM;0G(RW!Djv7Qj}-Ga2y!= zzzUF!QSZT{ltRPMh+Hmc*t>zMs&WOKS(68tpf(`nS*`xph$|#ytKNd&9FPOb5nsq2pGoi@D}t~* z^06`g`nMqLWcLW^Dkx|^y2q*OFIaM|A2CBfO)^gMsvuQ_>I~lx&4(+f$;*zp4z{!I z5@R=DBUsQs22XEwiwHZNNz6YEe8Lz>V#yPNJ#&6;f(EpA-rotg_t3Uki3gLvHVbcEvd3RQ#zb|-tU*8jMIZ#GcdBB>Vi zZ0msh4X6;hpp6QOo!yTd@k7Zr7!5j$nFi&lc>Vxh6L6-=&pwUQQ8RWQK{dG0%Kq!RLDjMvXn z+cwHW($dG7Wxtozmw9Q|eG!WnP0vy^Sbf1TdD!gYwxkp!V-fy^zc+h|xk-v5);R}F zV~}%qb`vHAk^Iu$t~4?T*%zKV$L?{Ymv>9BEMaF+4#&^IT>eq`03bVYkpF@a53b( zQ{5@cpN~^ut2jqUR>Nj6vzcK*PZiK}&p8Ua?A3sA8^tIH$+=#7+qOyg7QsI)jk=GV z9JYY*GrbYz1UHD+NXOx@kvomg`<=4{J@gvyc>c}#Nw(H~mcR?c)$h;JmNG^DQ`X4u zY~$DSt|z@HTOsu3CTM()xTbM`1aRJgbtO zl-^l$#5aS*!%$!U9b+LW5s$$K^oci3;dQ23e`PsofT(j^SBpw%6LR7x00nK4FGM|JjA}%l|C>?N~=9Ifzme!*rSv z?CX@54>fa6`xs=m$B;3Y>rlR5pV*L>Kj0^>`eZ=VjiVT8YKlm!kdje9E6F{h5enUa z`-tj|m>S!DTQkENH|L}2?9Gh8D{+*UctmX;F{Hr(jIp%khH{Ui-1INNi9(Kza>%Id zCs#_wplB&Dg#J?!_<^*q!>br=s z@uI`zlGZnCYJ!Gx%+RXStBC#!{nh1^spctc|TF(Mx z>=OrE*ti%DbTGV_(|?N?! zuCb9I^Qs==!Jv(ThPihrwaaqaTa=g!(TufF9f*TJXu{7okldYok!^M|VqXD5jwFP1 zZe#0-<;v@RVPhBwP1o@5&>eMe&wk1oR&2(~MOzK^9A#nyog?H<%s`n`(D_h&D&`e_@?ek(Q$9#;fg&a8-E_+`Y;EbUsiu{65ZYh+Sj z*mnF&S_oHoc zcqQ}&h&?L3MIKaJyckI|)_OjVdnGiAQ2ahoHxkYayW8oP34lT+aKHQLtzla*tnpjo z!Xi9Jikw&JQlvl3^s5vTTEsD;MOhPA_RP3M$Y$J3J4*!&IV{)bYD3YbDNR&QdU&nx z6qn#Cnf#eM%2Z9prZD1Xp@R zIDIk9>RckLq^EEEG)M9v`EdBJiNN9{oR8W4ReTJwKH$qzHy z96gQkqIIE~g5r?^fn{26aR|{UrOkw%MyC0+EeE}dIoqpnG6F@cQ(hS1X_Rt>e8{Z0 z2$#am4v1~362FL=$q=lFWYqSC;xlt0WZKwqL`3CZLZsUT1fqjwR<=#i{OQDw5XWQt z{oKavEVdkG)iUa~gL5@Lfmmi99~P9@O#4SA3OcvOv3hDe5^e0#&au%rb!vDdHrYVJ2NwnkyXkPGl|0 zq7|A=-7mg|-|$^NKXTP0priJ24*>RR3j}}D7&f3!N|O>sH2ypN{n!JnF_^Cpp_Z1Z z5Wyo}fNXy2y%522y(qY#U9;mgq|6pv`|K52>&Qh!moY7*Dbd)<*L3MEZ?+R^rgXBl zb;R28*T}vR<0R3x3~bS5)Eo>L(7csax=IpxEbv;@sg}nInlBP_JduT_w?04ykMFhe z8kwCbPhBN-FfO`dvr3u{(Ai)^|)bKm1*CwZ6X+ z{!^ZQ_J%}OKwH>(n26%hmpRx6KsL<2Anl$`9LP3}5Q0_auwK>5T+#wqaFa0hIMBo# zj&f%-mDO*2(Um_r*lfF1S3e-NF8oXrG*)r?kdJ@Ksd6?b?fF}@ zfR&2FGq*@Nl?TfAh+Gi}($bp0u_@^EQa?mN-jqRXfoU<`#I?@^G8FAm%hceiUEvS|ZOZ(%RC!1i)7q*=LaRztsE`&KfR=nE*zLFYS5n8lzCI1-D;7V_%8MG- ztlw6s(54hBNa&z4{9=TH7aU|7-x6ijVxP2^Q=_$A`C*7Yg&qlucMBp4b|`p{j5)wV zV}`w!$l2Pe8KP0{W+IgHd)QbUE}_UH{i2%w=B{9*CHfv&B-AE%jP&JgAIDixdgd$C z<9A))gI1uM#RrvY?;X}`0 z4D~Jk@d}clZG=p)5yGUj>)h-Tz?fUX))|Jw=Bdr@!`hU);7rw_F8e@*!$2#Oc&sJm za~Y7m9XYL_g-rRKGu@CAe=}g*i4{fn&si5F%88#U>4A1=cD~+oqe)nPA@|y;`1YKn zk*P5WPM?VC>*}`vm2{5l3xBR2v@bEvh%36E~Jb4ig#Pu9a3^%?Nm; zy^NjdcTv^|MbuDB^{5NPamW%vH^+o!TXz4jR+}{!ZzDT^q<{iJ|MyMATuEO0)SKxgF>>j^Zt@vZa|5ow)s(yxJa>#3HFU51sFj zhWQNlL+!z2zRUE zgY!BhrxFp^WcIBBc|@K@~97rrJ1V$ zq_aepPB#Nt#4&ne7KA_Q$5iKAg>v>P%*nGgF0M`*MyN*Z&!q+~4>E=1g>!@0L0PWx zJ`zHBT_@eUO?v11&^P3Rwvu1lYKWZsxa=N(8(3qAMDG*9H(*CAEE=omtz~O8W#uuG zkDhJ$UN&|*2mU|Z0r)?=r_#fdINEZ}MShe3PNZt?TVv|%A>}OD;M>p56I`{>7%9tS zT;oYt+$?FSzp==VyyDwG@7~68U#&x6}s{vWyJzIFBIG@8$0 zb&DDI7X2^NcoHsMN4<|%Dh&uo229qIVoR$`Q76SqKsIfQjN;Cyhi}&Lu>mMtTwU!p z*dKj+j#;935V3$enPpPp?7b|>(mrC)wVOe`Q@@pK?^V}1f8qP*d~%7w0nr`^D_VDI z@2li8%F;D2G1ry!7_6^41vPbF!-}D7*5K-<(llWs8pWrB2niK-A5NVo)D~=CN!+(? zy`3+mZYF=;K)xJ1e{hx?6Vig70e3Y!PJ=h0M)35LFk6rBRrC5;?U2ksTP1Nnr_jjX zEFYmcV@{Q0BuH|w!c6=Yiw&HLAOARS&ep`y8^q3>DBODa>z@$AR49(YoxfM>bnllY ziye*26uf%`{!*_#idkI&$=^dgc|bOXr>;Y*79pj9k!0;j|4`>XfDasdSgnn&hOMC{ zaQP$UXKoD5l^XAbk&RO3<7RS*qg;AD#RY~QGPV;xx-|^eu-Q1 z7ZB#K*`%)uIG_(Z)>Vo|jiC_3hHM+v5HzjjJbTir3k+YDm##Z0ST;V7?h>1MsoyCrB|hVV6b${s&`kv`P$Y0ww?V@uTd`=amI=i;$9 zm&vXju*=e`P@HAeZg*3CKRtL1%84-2~Q{EpgaxvEKM6qG*aHA56F`X-vt z$FX5FuZfXuIy$cpfs;Yi!)w3YZAUC!$T6egu_q1tWul2WRfu-F4^6%art{F*t~1?R z4{9xS>)x*VZ5KHn#+Tuy-wT1JnE`1+byK!S(Id^elB3*2Arl0{?pX= zVvhZA-)ybE8*aCebC6At0N~qHJ{(!aKg^etTIc7lFiQgrlBPV(_9YSsBTdW}M!mak zfW0=oQ9eO%f8^KxkVu6ab9*JE(^E+j;f;B}k~y?T4e?Tr2iJC{u2(GzBkmP3>PNL* zENQw!&2En`4Mqd>gUXq~&Y9yev8WOCPQ@u!i|X-zl0-|{iJt9;VJ4Y};bZ3~4|}ou zw!7E!`Z!yu`O&Pv{oM;Rlvf9~VEsQhsOp zpg}CI3D{xcklDs=d#I5#DLVd7U>~^tKWuhiuFeL0NE#cE$~zWsYX@p_EA@2~*G2i1 z({q)cSu_K^!+sI#up78k(DA=9Q0+-uD_%bL_Rm&$9WR)#$*-XvpGN&w#X9Z%4!k$R zFgkEReP_YpK>sZ^BoLu7+(A)uK$$%k<*S_L=sb^kANxEfJ&WSOqU=t zxe1*LSUA&;#XA(HfRLp=WpmNAl{bq%ToK$O(y)^oo+%#2mp&hWPY4mz&BltYQtQ-h z>=eIdR!o!dJtMGxYy$=|JXgyf20y9r>K2A76bzteEhp@W!Y#{Gy<`jP3`Ns^k-s^v zSU8ON56e#PVT0@98|)Es{td?BOgF1aLxbfLf1`rjG7NT++cb$ZaXT%|gMl+R&;&Kt zHyi@D4^NzkzA`Fg%vvcNOT5qbgUuu$jOKwtx5jqcK%=PTvecDOPEtNs=B&ogj~%cu zpkYGADLXMrm_6!K-xH3nT(wP>pIG7SBqu6zrm4jZO3V34)$HZ03vqb8LelQZejjz+ zX^MM8qLJ&6Iz!|-6|;p*dAT7J)U0Sy7qHOz1ZgnFu$Q$^;mk4QD^9Y<)bx|B94ab6 zU2}^nNZ_i@HcZf6#OQ4rr_A1VmsyYhX5T2jfk)dR?2g~z3F&g}BR9UQzrRYa>A*%k zF19VI4IRQ_oUARFqMA}Sc#9Domq6T@ z1&z{;+fFqK6a>)3ZQ^Es_)BMb^HdU>o=SHLRYA6DR=+~0ok}uo0i_T;BB^R&FBU?( zDa}{Np7o3PRNWj8+6O-u*|0Chqtss@^saVX_gEF&w?R~QVclMu

0+!+c?a>g@* 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

#V5vcX}4VR9{*V<^b`z+1~AjJA= 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 RaS>|7+0$mH@cNg3{SRQC2A2Q; literal 0 HcmV?d00001 diff --git a/screenshots/login.png b/screenshots/login.png new file mode 100644 index 0000000000000000000000000000000000000000..54181f0850a453392b3e4557db65c313bc10ec01 GIT binary patch literal 264914 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 aY_&$qzDVD$0FqezNlr>xvR2&q`~L&1#gFX( literal 0 HcmV?d00001 diff --git a/screenshots/mp.jpg b/screenshots/mp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c10cb80c2ebc1bf6279fc728637743f45acc5b4b GIT binary patch literal 27233 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 T7;x-vYNk8?fAVi!SMdJ;64Z?W literal 0 HcmV?d00001 diff --git a/screenshots/qr.png b/screenshots/qr.png new file mode 100644 index 0000000000000000000000000000000000000000..1edbfca50d2eb0dc8217744cf59126dfc2cf513e GIT binary patch literal 36251 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

>}5_`gf(qo4Pbbzbq76{cLdVg{jf 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%0DoB6;HxI&HY6UIXD4%a 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 literal 0 HcmV?d00001

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%0A?0O16{6?4;OOz2aw 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 z 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