From 6a3a6bf6909176d4b7e308f1c4fbb5e568261fb1 Mon Sep 17 00:00:00 2001 From: jiangjianfeng Date: Mon, 20 Jun 2022 19:07:24 +0800 Subject: [PATCH] commit skyer service --- skyer-goods/.gitignore | 103 ++ skyer-goods/.gitlab-ci.yml | 11 + skyer-goods/charts/skyer-goods/Chart.yaml | 5 + skyer-goods/charts/skyer-goods/README.md | 81 ++ .../charts/skyer-goods/templates/_helpers.tpl | 28 + .../skyer-goods/templates/deployment.yaml | 121 ++ .../charts/skyer-goods/templates/service.yaml | 41 + skyer-goods/charts/skyer-goods/values.yaml | 128 ++ skyer-goods/docker/Dockerfile | 6 + skyer-goods/init-local-database.sh | 13 + skyer-goods/pom.xml | 346 +++++ .../autoconfigure/goods/EnableSkyerGoods.java | 16 + .../goods/GoodsAutoConfiguration.java | 55 + .../org/skyer/goods/GoodsApplication.java | 25 + .../api/controller/v1/BrandController.java | 88 ++ .../v1/CategoryAttributeController.java | 50 + .../api/controller/v1/CategoryController.java | 100 ++ .../controller/v1/GoodsShopController.java | 82 ++ .../api/controller/v1/GoodsSkuController.java | 134 ++ .../v1/InstallServiceController.java | 83 ++ .../api/controller/v1/MaterialController.java | 107 ++ .../v1/PriceItemSettingController.java | 202 +++ .../v1/SkuAttributeValueController.java | 75 + .../v1/SkuAttributeValueDraftController.java | 75 + .../api/controller/v1/SkuAuditController.java | 44 + .../v1/SkuAuditSettingController.java | 51 + .../api/controller/v1/SkuDraftController.java | 75 + .../api/controller/v1/SkuGroupController.java | 67 + .../v1/SpuAttrValueRelationController.java | 77 ++ .../controller/v1/SpuAttributeController.java | 86 ++ .../v1/SpuAttributeValueController.java | 77 ++ .../api/controller/v1/SpuController.java | 113 ++ .../v1/SpuInstallServiceController.java | 84 ++ .../controller/v1/SpuSonMumController.java | 83 ++ .../goods/api/dto/AttrListRequestDTO.java | 55 + .../org/skyer/goods/api/dto/AttributeDTO.java | 30 + .../skyer/goods/api/dto/BrandPageReqDTO.java | 38 + .../org/skyer/goods/api/dto/BrandReqDTO.java | 39 + .../api/dto/CategoryAttributeQueryDTO.java | 30 + .../api/dto/CategoryAttributeSaveDTO.java | 46 + .../dto/CategoryAttributeValueSaveDTO.java | 24 + .../skyer/goods/api/dto/CategoryQueryDTO.java | 38 + .../skyer/goods/api/dto/CategorySaveDTO.java | 52 + .../goods/api/dto/CategoryTreeQueryDTO.java | 19 + .../dto/CategoryUpdateByStatusFlagDTO.java | 24 + .../skyer/goods/api/dto/GoodsGroupReqDTO.java | 44 + .../goods/api/dto/GoodsGroupSkuReqDTO.java | 25 + .../skyer/goods/api/dto/GoodsPageReqDTO.java | 43 + .../org/skyer/goods/api/dto/GoodsReqDTO.java | 53 + .../skyer/goods/api/dto/GoodsRequestDTO.java | 63 + .../skyer/goods/api/dto/GoodsSkuPageDTO.java | 47 + .../skyer/goods/api/dto/GroupPageReqDTO.java | 21 + .../org/skyer/goods/api/dto/IdsReqDTO.java | 22 + .../skyer/goods/api/dto/LevelCategoryDTO.java | 34 + .../org/skyer/goods/api/dto/MaterialDTO.java | 71 + .../skyer/goods/api/dto/MaterialListDTO.java | 36 + .../org/skyer/goods/api/dto/PageReqDTO.java | 36 + .../skyer/goods/api/dto/SkuBatchAuditDTO.java | 21 + .../skyer/goods/api/dto/SkuBatchSaveDTO.java | 20 + .../goods/api/dto/SkuListRequestDTO.java | 75 + .../org/skyer/goods/api/dto/SkuUpdateDTO.java | 23 + .../skyer/goods/api/dto/SkuUpdateInfoDTO.java | 57 + .../org/skyer/goods/api/dto/SpuListDTO.java | 32 + .../org/skyer/goods/api/dto/StatusReqDTO.java | 28 + .../api/dto/UpdatePriceItemValueDTO.java | 37 + .../app/service/CategoryAttributeService.java | 10 + .../CategoryAttributeValueService.java | 10 + .../goods/app/service/CategoryService.java | 9 + .../app/service/InstallServiceService.java | 69 + .../app/service/MyEncryptionService.java | 33 + .../SkuAttributeValueDraftService.java | 10 + .../app/service/SkuAttributeValueService.java | 10 + .../app/service/SkuAuditSettingService.java | 10 + .../goods/app/service/SkuDraftService.java | 10 + .../skyer/goods/app/service/SkuEsService.java | 65 + .../goods/app/service/SkuPackageService.java | 10 + .../skyer/goods/app/service/SkuService.java | 114 ++ .../app/service/SpuAttributeService.java | 10 + .../app/service/SpuAttributeValueService.java | 10 + .../skyer/goods/app/service/SpuEsService.java | 66 + .../app/service/SpuInstallServiceService.java | 58 + .../service/SpuInstallServiceSkuService.java | 10 + .../SpuInstallServiceStoreService.java | 10 + .../goods/app/service/SpuSonMumService.java | 59 + .../app/service/SpuSonMumSkuService.java | 10 + .../app/service/SpuSonMumStoreService.java | 10 + .../impl/CategoryAttributeServiceImpl.java | 13 + .../CategoryAttributeValueServiceImpl.java | 13 + .../app/service/impl/CategoryServiceImpl.java | 21 + .../impl/InstallServiceServiceImpl.java | 218 +++ .../service/impl/MyEncryptionServiceImpl.java | 38 + .../SkuAttributeValueDraftServiceImpl.java | 13 + .../impl/SkuAttributeValueServiceImpl.java | 13 + .../impl/SkuAuditSettingServiceImpl.java | 13 + .../app/service/impl/SkuDraftServiceImpl.java | 13 + .../app/service/impl/SkuEsServiceImpl.java | 435 ++++++ .../service/impl/SkuPackageServiceImpl.java | 13 + .../app/service/impl/SkuServiceImpl.java | 1095 +++++++++++++++ .../service/impl/SpuAttributeServiceImpl.java | 13 + .../impl/SpuAttributeValueServiceImpl.java | 13 + .../app/service/impl/SpuEsServiceImpl.java | 345 +++++ .../impl/SpuInstallServiceServiceImpl.java | 400 ++++++ .../impl/SpuInstallServiceSkuServiceImpl.java | 13 + .../SpuInstallServiceStoreServiceImpl.java | 13 + .../service/impl/SpuSonMumServiceImpl.java | 375 +++++ .../service/impl/SpuSonMumSkuServiceImpl.java | 13 + .../impl/SpuSonMumStoreServiceImpl.java | 13 + .../goods/config/GoodsExtraDataManager.java | 36 + .../goods/config/GoodsSwaggerApiConfig.java | 60 + .../goods/domain/dto/AddSonMumSkuDTO.java | 19 + .../dto/AddSpuInstallServiceSkuDTO.java | 19 + .../org/skyer/goods/domain/dto/AuditDTO.java | 23 + .../goods/domain/dto/InstallServiceDTO.java | 53 + .../domain/dto/LevelRedisCategoryDTO.java | 41 + .../skyer/goods/domain/dto/MultiDelDTO.java | 21 + .../domain/dto/PageInstallServiceDTO.java | 15 + .../skyer/goods/domain/dto/PageSonMumDTO.java | 12 + .../domain/dto/PageSpuInstallServiceDTO.java | 19 + .../goods/domain/dto/ServiceZoneDTO.java | 35 + .../skyer/goods/domain/dto/SkuAuditDTO.java | 12 + .../domain/dto/SpuInstallServiceDTO.java | 45 + .../skyer/goods/domain/dto/SpuSonMumDTO.java | 42 + .../goods/domain/dto/TotalCategoryDTO.java | 20 + .../org/skyer/goods/domain/entity/Brand.java | 85 ++ .../skyer/goods/domain/entity/Category.java | 98 ++ .../domain/entity/CategoryAttribute.java | 98 ++ .../domain/entity/CategoryAttributeValue.java | 61 + .../skyer/goods/domain/entity/GoodsShop.java | 148 ++ .../goods/domain/entity/InstallService.java | 197 +++ .../skyer/goods/domain/entity/Material.java | 102 ++ .../org/skyer/goods/domain/entity/Sku.java | 184 +++ .../domain/entity/SkuAttrValueRelation.java | 133 ++ .../domain/entity/SkuAttributeValue.java | 77 ++ .../domain/entity/SkuAttributeValueDraft.java | 71 + .../goods/domain/entity/SkuAuditSetting.java | 79 ++ .../skyer/goods/domain/entity/SkuDraft.java | 107 ++ .../skyer/goods/domain/entity/SkuGroup.java | 174 +++ .../goods/domain/entity/SkuGroupSku.java | 140 ++ .../goods/domain/entity/SkuGroupStore.java | 133 ++ .../skyer/goods/domain/entity/SkuPackage.java | 69 + .../org/skyer/goods/domain/entity/Spu.java | 118 ++ .../domain/entity/SpuAttrValueRelation.java | 170 +++ .../goods/domain/entity/SpuAttribute.java | 86 ++ .../domain/entity/SpuAttributeValue.java | 65 + .../domain/entity/SpuInstallService.java | 220 +++ .../domain/entity/SpuInstallServiceSku.java | 151 ++ .../domain/entity/SpuInstallServiceStore.java | 136 ++ .../skyer/goods/domain/entity/SpuSonMum.java | 178 +++ .../goods/domain/entity/SpuSonMumSku.java | 166 +++ .../goods/domain/entity/SpuSonMumStore.java | 136 ++ .../domain/repository/BrandRepository.java | 52 + .../CategoryAttributeRepository.java | 24 + .../CategoryAttributeValueRepository.java | 19 + .../domain/repository/CategoryRepository.java | 67 + .../repository/InstallServiceRepository.java | 13 + .../domain/repository/MaterialRepository.java | 41 + .../SkuAttrValueRelationRepository.java | 13 + .../SkuAttributeValueDraftRepository.java | 22 + .../SkuAttributeValueRepository.java | 30 + .../repository/SkuAuditSettingRepository.java | 25 + .../domain/repository/SkuDraftRepository.java | 13 + .../domain/repository/SkuGroupRepository.java | 40 + .../repository/SkuGroupSkuRepository.java | 40 + .../repository/SkuGroupStoreRepository.java | 30 + .../repository/SkuPackageRepository.java | 18 + .../domain/repository/SkuRepository.java | 100 ++ .../SpuAttrValueRelationRepository.java | 35 + .../repository/SpuAttributeRepository.java | 30 + .../SpuAttributeValueRepository.java | 13 + .../SpuInstallServiceRepository.java | 13 + .../SpuInstallServiceSkuRepository.java | 13 + .../SpuInstallServiceStoreRepository.java | 13 + .../domain/repository/SpuRepository.java | 46 + .../repository/SpuSonMumRepository.java | 13 + .../repository/SpuSonMumSkuRepository.java | 13 + .../repository/SpuSonMumStoreRepository.java | 13 + .../goods/domain/service/BrandService.java | 49 + .../domain/service/CategoryManageService.java | 41 + .../domain/service/GoodsAttributeService.java | 8 + .../domain/service/GoodsShopService.java | 13 + .../goods/domain/service/MaterialService.java | 65 + .../goods/domain/service/SkuGroupService.java | 43 + .../domain/service/SkuGroupSkuService.java | 11 + .../domain/service/SkuGroupStoreService.java | 10 + .../goods/domain/service/SpuService.java | 76 + .../domain/service/impl/BrandServiceImpl.java | 134 ++ .../impl/CategoryManageServiceImpl.java | 359 +++++ .../impl/GoodsAttributeServiceImpl.java | 30 + .../service/impl/GoodsShopServiceImpl.java | 18 + .../service/impl/MaterialServiceImpl.java | 202 +++ .../service/impl/SkuGroupServiceImpl.java | 162 +++ .../service/impl/SkuGroupSkuServiceImpl.java | 15 + .../impl/SkuGroupStoreServiceImpl.java | 15 + .../domain/service/impl/SpuServiceImpl.java | 350 +++++ .../domain/vo/AllAttributeRelationResVO.java | 43 + .../domain/vo/AttributeAndValueResVO.java | 53 + .../goods/domain/vo/AttributeDetailResVO.java | 20 + .../goods/domain/vo/AttributePageResVO.java | 60 + .../goods/domain/vo/AttributeValueResVO.java | 30 + .../skyer/goods/domain/vo/BrandPageResVO.java | 67 + .../goods/domain/vo/CategoryAttributeVO.java | 51 + .../domain/vo/CategoryAttributeValueVO.java | 16 + .../goods/domain/vo/CategoryOldPageResVO.java | 56 + .../goods/domain/vo/CategoryOldResVO.java | 37 + .../skyer/goods/domain/vo/CategoryTreeVO.java | 50 + .../org/skyer/goods/domain/vo/CategoryVO.java | 56 + .../domain/vo/CheckGoodsAttributeResVO.java | 39 + .../goods/domain/vo/ChinaZoingRemoteVO.java | 46 + .../goods/domain/vo/CreateSkuListVo.java | 18 + .../goods/domain/vo/DetailSpecifResVO.java | 28 + .../goods/domain/vo/GoodsDetailResVO.java | 59 + .../skyer/goods/domain/vo/GoodsDetailsVO.java | 74 + .../skyer/goods/domain/vo/GoodsPageResVO.java | 80 ++ .../goods/domain/vo/GoodsSkuAuditPriceVO.java | 31 + .../goods/domain/vo/GoodsSkuAuditVO.java | 107 ++ .../goods/domain/vo/GoodsSkuDetailVO.java | 105 ++ .../skyer/goods/domain/vo/GoodsSkuPageVO.java | 106 ++ .../org/skyer/goods/domain/vo/GoodsSkuVO.java | 87 ++ .../skyer/goods/domain/vo/GroupPageResVO.java | 58 + .../goods/domain/vo/GroupStoreResVO.java | 32 + .../domain/vo/MainIdAttributeValueResVO.java | 40 + .../org/skyer/goods/domain/vo/MaterialVO.java | 74 + .../skyer/goods/domain/vo/OnlineShopVO.java | 93 ++ .../skyer/goods/domain/vo/PriceItemLov.java | 23 + .../skyer/goods/domain/vo/RpcGoodsResVO.java | 56 + .../skyer/goods/domain/vo/RpcOrderResVO.java | 87 ++ .../org/skyer/goods/domain/vo/SkuAuditVO.java | 17 + .../skyer/goods/domain/vo/SkuGroupResVO.java | 49 + .../goods/domain/vo/SkuGroupSkuResVO.java | 38 + .../skyer/goods/domain/vo/SkuInfoResVO.java | 41 + .../skyer/goods/domain/vo/SkuPackageVO.java | 33 + .../org/skyer/goods/domain/vo/SpuEsModel.java | 35 + .../goods/domain/vo/TotalCategoryResVO.java | 33 + .../infra/annocations/DatasourceType.java | 23 + .../infra/constant/CompanyConstants.java | 47 + .../skyer/goods/infra/constant/Constants.java | 330 +++++ .../constant/DataHierarchyDisplayStyle.java | 5 + .../goods/infra/constant/FndConstants.java | 344 +++++ .../infra/constant/HpfmMsgCodeConstants.java | 264 ++++ .../goods/infra/constant/HrConstants.java | 44 + .../goods/infra/constant/ObjectConstant.java | 103 ++ .../skyer/goods/infra/constant/RedisKey.java | 22 + .../goods/infra/convertor/BrandConvertor.java | 22 + .../infra/convertor/CategoryConvertor.java | 25 + .../infra/convertor/CommonConvertor.java | 80 ++ .../goods/infra/convertor/GoodsConvertor.java | 37 + .../infra/convertor/SkuGroupConvertor.java | 20 + .../goods/infra/enums/DBPoolTypeEnum.java | 63 + .../goods/infra/enums/DatabaseTypeEnum.java | 70 + .../infra/feign/ChinaZoingRemoteService.java | 39 + .../infra/feign/LovManageRemoteService.java | 111 ++ .../goods/infra/feign/LovRemoteService.java | 150 ++ .../infra/feign/OnlineShopRemoteService.java | 30 + .../infra/feign/UserDetailRemoteService.java | 36 + .../goods/infra/feign/dto/LovHeaderDto.java | 39 + .../goods/infra/feign/dto/LovValueDto.java | 40 + .../impl/ChinaZoingRemoteServiceImpl.java | 15 + .../impl/LovManageRemoteServiceImpl.java | 57 + .../feign/impl/LovRemoteServiceImpl.java | 52 + .../impl/OnlineShopRemoteServiceImpl.java | 23 + .../impl/UserDetailRemoteServiceImpl.java | 24 + .../goods/infra/handler/MessageHandler.java | 63 + .../skyer/goods/infra/mapper/BrandMapper.java | 19 + .../infra/mapper/CategoryAttributeMapper.java | 19 + .../mapper/CategoryAttributeValueMapper.java | 19 + .../goods/infra/mapper/CategoryMapper.java | 22 + .../goods/infra/mapper/GoodsShopMapper.java | 14 + .../infra/mapper/InstallServiceMapper.java | 13 + .../goods/infra/mapper/MaterialMapper.java | 21 + .../mapper/SkuAttrValueRelationMapper.java | 13 + .../mapper/SkuAttributeValueDraftMapper.java | 24 + .../infra/mapper/SkuAttributeValueMapper.java | 32 + .../infra/mapper/SkuAuditSettingMapper.java | 13 + .../goods/infra/mapper/SkuDraftMapper.java | 13 + .../goods/infra/mapper/SkuGroupMapper.java | 23 + .../goods/infra/mapper/SkuGroupSkuMapper.java | 17 + .../infra/mapper/SkuGroupStoreMapper.java | 13 + .../skyer/goods/infra/mapper/SkuMapper.java | 40 + .../goods/infra/mapper/SkuPackageMapper.java | 13 + .../mapper/SpuAttrValueRelationMapper.java | 13 + .../infra/mapper/SpuAttributeMapper.java | 13 + .../infra/mapper/SpuAttributeValueMapper.java | 13 + .../infra/mapper/SpuInstallServiceMapper.java | 13 + .../mapper/SpuInstallServiceSkuMapper.java | 13 + .../mapper/SpuInstallServiceStoreMapper.java | 13 + .../skyer/goods/infra/mapper/SpuMapper.java | 32 + .../goods/infra/mapper/SpuSonMumMapper.java | 13 + .../infra/mapper/SpuSonMumSkuMapper.java | 13 + .../infra/mapper/SpuSonMumStoreMapper.java | 13 + .../properties/DataHierarchyProperties.java | 19 + .../infra/properties/GoodsProperties.java | 118 ++ .../remote/api/RemoteCustomizeService.java | 39 + .../api/impl/RemoteCustomizeServiceImpl.java | 142 ++ .../repository/impl/BrandRepositoryImpl.java | 64 + .../impl/CategoryAttributeRepositoryImpl.java | 29 + .../CategoryAttributeValueRepositoryImpl.java | 31 + .../impl/CategoryRepositoryImpl.java | 214 +++ .../impl/InstallServiceRepositoryImpl.java | 17 + .../impl/MaterialRepositoryImpl.java | 66 + .../SkuAttrValueRelationRepositoryImpl.java | 17 + .../SkuAttributeValueDraftRepositoryImpl.java | 27 + .../impl/SkuAttributeValueRepositoryImpl.java | 33 + .../impl/SkuAuditSettingRepositoryImpl.java | 48 + .../impl/SkuDraftRepositoryImpl.java | 17 + .../impl/SkuGroupRepositoryImpl.java | 54 + .../impl/SkuGroupSkuRepositoryImpl.java | 62 + .../impl/SkuGroupStoreRepositoryImpl.java | 53 + .../impl/SkuPackageRepositoryImpl.java | 38 + .../repository/impl/SkuRepositoryImpl.java | 121 ++ .../SpuAttrValueRelationRepositoryImpl.java | 58 + .../impl/SpuAttributeRepositoryImpl.java | 129 ++ .../impl/SpuAttributeValueRepositoryImpl.java | 17 + .../impl/SpuInstallServiceRepositoryImpl.java | 17 + .../SpuInstallServiceSkuRepositoryImpl.java | 17 + .../SpuInstallServiceStoreRepositoryImpl.java | 17 + .../repository/impl/SpuRepositoryImpl.java | 64 + .../impl/SpuSonMumRepositoryImpl.java | 17 + .../impl/SpuSonMumSkuRepositoryImpl.java | 17 + .../impl/SpuSonMumStoreRepositoryImpl.java | 17 + .../org/skyer/goods/infra/util/Dates.java | 32 + .../goods/infra/util/EsBoolQueryUtil.java | 548 ++++++++ .../org/skyer/goods/infra/util/JsonUtils.java | 205 +++ .../org/skyer/goods/infra/util/ListUtils.java | 67 + .../org/skyer/goods/infra/util/Md5Utils.java | 24 + .../src/main/resources/application.yml | 165 +++ skyer-goods/src/main/resources/banner.txt | 10 + skyer-goods/src/main/resources/bootstrap.yml | 32 + .../src/main/resources/mapper/BrandMapper.xml | 63 + .../mapper/CategoryAttributeMapper.xml | 83 ++ .../mapper/CategoryAttributeValueMapper.xml | 22 + .../main/resources/mapper/CategoryMapper.xml | 117 ++ .../main/resources/mapper/GoodsShopMapper.xml | 19 + .../resources/mapper/InstallServiceMapper.xml | 22 + .../main/resources/mapper/MaterialMapper.xml | 34 + .../mapper/SkuAttrValueRelationMapper.xml | 18 + .../mapper/SkuAttributeValueDraftMapper.xml | 20 + .../mapper/SkuAttributeValueMapper.xml | 25 + .../mapper/SkuAuditSettingMapper.xml | 17 + .../main/resources/mapper/SkuDraftMapper.xml | 21 + .../main/resources/mapper/SkuGroupMapper.xml | 42 + .../resources/mapper/SkuGroupSkuMapper.xml | 25 + .../resources/mapper/SkuGroupStoreMapper.xml | 18 + .../src/main/resources/mapper/SkuMapper.xml | 99 ++ .../resources/mapper/SkuPackageMapper.xml | 11 + .../mapper/SpuAttrValueRelationMapper.xml | 21 + .../resources/mapper/SpuAttributeMapper.xml | 23 + .../mapper/SpuAttributeValueMapper.xml | 13 + .../mapper/SpuInstallServiceMapper.xml | 22 + .../mapper/SpuInstallServiceSkuMapper.xml | 19 + .../mapper/SpuInstallServiceStoreMapper.xml | 18 + .../src/main/resources/mapper/SpuMapper.xml | 103 ++ .../main/resources/mapper/SpuSonMumMapper.xml | 20 + .../resources/mapper/SpuSonMumSkuMapper.xml | 20 + .../resources/mapper/SpuSonMumStoreMapper.xml | 17 + .../messages/messages_hpfm_en_US.properties | 186 +++ .../messages/messages_hpfm_zh_CN.properties | 187 +++ .../src/main/resources/static/js/babel.min.js | 25 + skyer-order/.gitignore | 103 ++ skyer-order/.gitlab-ci.yml | 5 + skyer-order/charts/skyer-order/Chart.yaml | 5 + skyer-order/charts/skyer-order/README.md | 81 ++ .../charts/skyer-order/templates/_helpers.tpl | 28 + .../skyer-order/templates/deployment.yaml | 95 ++ .../charts/skyer-order/templates/service.yaml | 41 + skyer-order/charts/skyer-order/values.yaml | 120 ++ skyer-order/docker/Dockerfile | 6 + skyer-order/init-local-database.sh | 13 + skyer-order/pom.xml | 474 +++++++ skyer-order/sql/sord_process_define.sql | 49 + .../autoconfigure/order/EnableSkyerOrder.java | 16 + .../order/OrderAutoConfiguration.java | 53 + .../org/skyer/order/OrderApplication.java | 29 + .../v1/AfterSaleHeaderController.java | 156 +++ .../v1/AfterSaleItemController.java | 41 + .../v1/AfterSaleItemLineController.java | 56 + .../v1/AfterSaleLogisticsController.java | 77 ++ .../v1/AfterSalesReasonController.java | 98 ++ .../api/controller/v1/CouponController.java | 78 ++ .../controller/v1/DeliveryLogController.java | 77 ++ .../api/controller/v1/ItemController.java | 77 ++ .../api/controller/v1/ItemLineController.java | 47 + .../v1/ItemLinePriceController.java | 77 ++ .../controller/v1/ItemPriceController.java | 88 ++ .../controller/v1/ItemSnapshotController.java | 77 ++ .../controller/v1/OperateLogController.java | 76 + .../api/controller/v1/OrderController.java | 170 +++ .../controller/v1/OrderReportController.java | 58 + .../api/controller/v1/PriceController.java | 77 ++ .../v1/ProcessDefineController.java | 93 ++ .../controller/v1/ReceiverInfoController.java | 77 ++ .../api/controller/v1/RelatedController.java | 77 ++ .../controller/v1/ServiceLogController.java | 75 + .../controller/v1/ThirdItemController.java | 23 + .../controller/v1/ThirdOrderController.java | 67 + .../ThirdPartyAfterSaleHeaderController.java | 75 + .../v1/ThirdPartyOrderController.java | 77 ++ .../v1/ThirdReceiverInfoController.java | 23 + .../api/dto/AccountCheckingOrderDTO.java | 47 + .../api/dto/AccountCheckingOrderQueryDTO.java | 22 + .../skyer/order/api/dto/AddRefundOnlyDTO.java | 32 + .../skyer/order/api/dto/AfterItemAddDTO.java | 28 + .../order/api/dto/AfterItemDeleteDTO.java | 25 + .../skyer/order/api/dto/AfterSaleItemDTO.java | 18 + .../order/api/dto/AfterSaleItemLineDTO.java | 19 + .../api/dto/AfterSaleReceiveInfoDTO.java | 39 + .../skyer/order/api/dto/AuditRefundDTO.java | 32 + .../order/api/dto/BatchStringListDTO.java | 18 + .../org/skyer/order/api/dto/IdListDTO.java | 23 + .../skyer/order/api/dto/ItemConfirmDTO.java | 27 + .../skyer/order/api/dto/ItemSearchDTO.java | 52 + .../skyer/order/api/dto/OperateLogDTO.java | 33 + .../org/skyer/order/api/dto/OrderBaseDTO.java | 37 + .../skyer/order/api/dto/OrderBaseInfoDTO.java | 79 ++ .../order/api/dto/OrderBuyerInfoDTO.java | 66 + .../skyer/order/api/dto/OrderCancelDTO.java | 33 + .../skyer/order/api/dto/OrderDetailDTO.java | 23 + .../order/api/dto/OrderDetailSearchDTO.java | 15 + .../org/skyer/order/api/dto/OrderItemDTO.java | 74 + .../org/skyer/order/api/dto/OrderPageDTO.java | 15 + .../order/api/dto/OrderPaymentInfoDTO.java | 42 + .../order/api/dto/OrderRefundInfoDTO.java | 116 ++ .../org/skyer/order/api/dto/OrderSaleDTO.java | 25 + .../skyer/order/api/dto/OrderSaleDateDTO.java | 19 + .../skyer/order/api/dto/OrderTableDTO.java | 30 + .../org/skyer/order/api/dto/PageReqDTO.java | 36 + .../skyer/order/api/dto/ProcessDefineDTO.java | 36 + .../order/api/dto/ProcessDefinePageDTO.java | 16 + .../order/api/dto/QueryPreempPageDTO.java | 49 + .../skyer/order/api/dto/ReceiverInfoDTO.java | 48 + .../order/api/dto/RefundAuditPageDTO.java | 60 + .../skyer/order/api/dto/RefundGoodsDTO.java | 35 + .../skyer/order/api/dto/RefundInfoDTO.java | 47 + .../order/api/dto/RefundLogisticsDTO.java | 38 + .../api/dto/RefundOnlyAuditStartDTO.java | 28 + .../order/api/dto/RefundOnlyPageDTO.java | 38 + .../skyer/order/api/dto/RefundPageDTO.java | 47 + .../skyer/order/api/dto/RefundSearchDTO.java | 13 + .../api/dto/ReturnRefundAuditStartDTO.java | 30 + .../order/api/dto/SaleItemReportDTO.java | 23 + .../order/api/dto/ShopIdsAndSkuCodesDTO.java | 19 + .../skyer/order/api/dto/StatsStockoutDTO.java | 24 + .../skyer/order/api/dto/SuspendOrderDTO.java | 20 + .../order/api/dto/ThirdOrderBaseInfoDTO.java | 76 + .../order/api/dto/ThirdOrderBuyerInfoDTO.java | 64 + .../api/dto/ThirdOrderDiscountInfoDTO.java | 23 + .../order/api/dto/ThirdOrderItemDTO.java | 79 ++ .../api/dto/ThirdOrderPaymentInfoDTO.java | 44 + .../order/api/dto/ThirdOrderTableDTO.java | 27 + .../order/api/dto/ThirdPartyAfterSaleDTO.java | 44 + .../api/dto/ThirdPartyAfterSalePageDTO.java | 36 + .../api/dto/ThirdPartyReceiveInfoDTO.java | 61 + .../api/dto/ThirdPartyRefundBaseInfo.java | 63 + .../skyer/order/api/dto/UpdateRefundDTO.java | 48 + .../order/api/dto/UpdateWarehouseDTO.java | 26 + .../api/dto/WarehouseWarrantDetailDTO.java | 30 + .../api/dto/WarehouseWarrantLogisticsDTO.java | 19 + .../api/dto/WarehouseWarrantSaveDTO.java | 72 + .../skyer/order/api/es/OrderAuditEsModel.java | 235 ++++ .../org/skyer/order/api/es/OrderEsModel.java | 243 ++++ .../order/api/es/SearchOrderAuditEsParam.java | 100 ++ .../order/api/es/SearchOrderEsParam.java | 167 +++ .../order/api/es/SearchStockoutEsParam.java | 90 ++ .../order/api/es/SearchThirdOrderEsParam.java | 60 + .../org/skyer/order/api/es/SpuEsModel.java | 29 + .../skyer/order/api/es/ThirdOrderEsModel.java | 105 ++ .../skyer/order/api/vo/AfterSaleDetailVO.java | 26 + .../order/api/vo/AfterSaleItemLineVO.java | 43 + .../skyer/order/api/vo/AfterSaleItemVO.java | 55 + .../org/skyer/order/api/vo/AmountInfoVO.java | 23 + .../skyer/order/api/vo/CopyOrderItemVO.java | 69 + .../org/skyer/order/api/vo/CopyOrderVO.java | 39 + .../org/skyer/order/api/vo/OrderDetailVO.java | 15 + .../skyer/order/api/vo/OrderGoodsLineVO.java | 14 + .../org/skyer/order/api/vo/OrderInfoVO.java | 88 ++ .../order/api/vo/OrderItemLinePageVO.java | 87 ++ .../skyer/order/api/vo/OrderItemLineVO.java | 43 + .../skyer/order/api/vo/OrderItemPageVO.java | 87 ++ .../org/skyer/order/api/vo/OrderPageVo.java | 133 ++ .../skyer/order/api/vo/OrderSaleDateVO.java | 41 + .../skyer/order/api/vo/OrderSaleReportVO.java | 46 + .../order/api/vo/OrderStatusTotalVO.java | 21 + .../org/skyer/order/api/vo/OrderTotalVO.java | 34 + .../org/skyer/order/api/vo/PaymentInfoVO.java | 27 + .../skyer/order/api/vo/PriceTypeListVO.java | 20 + .../order/api/vo/ProcessDefineDetailsVO.java | 41 + .../order/api/vo/ProcessDefinePageVO.java | 34 + .../skyer/order/api/vo/ReceiverInfoVO.java | 45 + .../skyer/order/api/vo/RefundBaseInfoVO.java | 108 ++ .../skyer/order/api/vo/RefundBuyerInfoVO.java | 25 + .../skyer/order/api/vo/RefundDetailsVO.java | 30 + .../skyer/order/api/vo/RefundItemLineVO.java | 63 + .../order/api/vo/RefundLogisticsInfoVO.java | 32 + .../skyer/order/api/vo/RefundOnlyPageVO.java | 71 + .../org/skyer/order/api/vo/RefundPageVO.java | 86 ++ .../skyer/order/api/vo/RefundSearchVO.java | 85 ++ .../order/api/vo/RefundsLogisticsVO.java | 25 + .../skyer/order/api/vo/RpcOrderAmountVO.java | 18 + .../skyer/order/api/vo/RpcOrderInfoVO.java | 27 + .../skyer/order/api/vo/SaleItemReportVO.java | 50 + .../skyer/order/api/vo/ShopSkuStockoutVO.java | 19 + .../skyer/order/api/vo/StatsStockoutVO.java | 26 + .../skyer/order/api/vo/StockoutPageVo.java | 114 ++ .../skyer/order/api/vo/ThirdAmountInfoVO.java | 32 + .../org/skyer/order/api/vo/ThirdItemVO.java | 60 + .../order/api/vo/ThirdOrderDetailVO.java | 24 + .../skyer/order/api/vo/ThirdOrderInfoVO.java | 87 ++ .../skyer/order/api/vo/ThirdOrderPageVo.java | 101 ++ .../ThirdPartyAfterSaleHeaderDetailsVO.java | 49 + .../api/vo/ThirdPartyAfterSalePageVO.java | 62 + .../order/api/vo/ThirdPaymentInfoVO.java | 27 + .../order/api/vo/ThirdReceiverInfoVO.java | 45 + .../skyer/order/api/vo/UnfinishedTotalVO.java | 30 + .../skyer/order/api/vo/WaitDealTotalVO.java | 30 + .../api/vo/WarehouseWarrantResultVO.java | 33 + .../org/skyer/order/app/dto/BaseListDTO.java | 12 + .../org/skyer/order/app/dto/CalAmountDTO.java | 25 + .../org/skyer/order/app/dto/NeedOrderDTO.java | 20 + .../skyer/order/app/dto/OrderDetailDTO.java | 28 + .../org/skyer/order/app/dto/OrderInfoDTO.java | 44 + .../skyer/order/app/dto/OrderLineWorkDTO.java | 31 + .../app/dto/OutboundDeliveryOrderDTO.java | 98 ++ .../dto/OutboundDeliveryOrderDetailDTO.java | 27 + .../order/app/dto/PackItemAmountDTO.java | 29 + .../skyer/order/app/dto/ResultDetailDTO.java | 55 + .../skyer/order/app/dto/ResultRecordDTO.java | 100 ++ .../order/app/dto/SaleOrderOrderApiDTO.java | 20 + .../order/app/dto/SplitItemAmountDTO.java | 34 + .../app/service/AfterSaleHeaderService.java | 50 + .../app/service/AfterSaleItemLineService.java | 10 + .../app/service/AfterSaleItemService.java | 10 + .../service/AfterSaleLogisticsService.java | 10 + .../service/AfterSaleReceiverInfoService.java | 10 + .../app/service/AfterSalesReasonService.java | 27 + .../order/app/service/CouponService.java | 10 + .../order/app/service/DeliveryLogService.java | 10 + .../order/app/service/HeaderService.java | 109 ++ .../app/service/ItemLinePriceService.java | 19 + .../order/app/service/ItemLineService.java | 44 + .../order/app/service/ItemPriceService.java | 32 + .../skyer/order/app/service/ItemService.java | 41 + .../app/service/ItemSnapshotService.java | 37 + .../order/app/service/OperateLogService.java | 10 + .../order/app/service/OrderEsService.java | 46 + .../app/service/OrderLogisticsService.java | 10 + .../order/app/service/OrderReportService.java | 44 + .../skyer/order/app/service/OrderService.java | 49 + .../skyer/order/app/service/PriceService.java | 18 + .../app/service/ProcessDefineService.java | 22 + .../app/service/ReceiverInfoService.java | 10 + .../order/app/service/RedisUserService.java | 19 + .../order/app/service/RelatedService.java | 10 + .../order/app/service/ServiceLogService.java | 10 + .../order/app/service/SourceLogService.java | 10 + .../order/app/service/StockoutEsService.java | 33 + .../order/app/service/ThirdHeaderService.java | 34 + .../order/app/service/ThirdItemService.java | 10 + .../app/service/ThirdOrderEsService.java | 26 + .../ThirdPartyAfterReceiverInfoService.java | 10 + .../ThirdPartyAfterSaleHeaderService.java | 10 + .../ThirdPartyAfterSaleItemService.java | 10 + .../app/service/ThirdPartyOrderService.java | 10 + .../ThirdPartyReturnLogisticsService.java | 10 + .../app/service/ThirdReceiverInfoService.java | 10 + .../app/service/WarehousingNoticeService.java | 10 + .../app/service/component/OrderWorkTask.java | 75 + .../component/ReturnAndRefundWorkTask.java | 44 + .../impl/AfterSaleHeaderServiceImpl.java | 252 ++++ .../impl/AfterSaleItemLineServiceImpl.java | 13 + .../impl/AfterSaleItemServiceImpl.java | 13 + .../impl/AfterSaleLogisticsServiceImpl.java | 13 + .../AfterSaleReceiverInfoServiceImpl.java | 13 + .../impl/AfterSalesReasonServiceImpl.java | 60 + .../app/service/impl/CouponServiceImpl.java | 13 + .../service/impl/DeliveryLogServiceImpl.java | 13 + .../app/service/impl/HeaderServiceImpl.java | 781 +++++++++++ .../impl/ItemLinePriceServiceImpl.java | 48 + .../app/service/impl/ItemLineServiceImpl.java | 324 +++++ .../service/impl/ItemPriceServiceImpl.java | 85 ++ .../app/service/impl/ItemServiceImpl.java | 194 +++ .../service/impl/ItemSnapshotServiceImpl.java | 127 ++ .../service/impl/OperateLogServiceImpl.java | 13 + .../app/service/impl/OrderEsServiceImpl.java | 384 ++++++ .../impl/OrderLogisticsServiceImpl.java | 13 + .../service/impl/OrderReportServiceImpl.java | 145 ++ .../app/service/impl/OrderServiceImpl.java | 269 ++++ .../app/service/impl/PriceServiceImpl.java | 37 + .../impl/ProcessDefineServiceImpl.java | 92 ++ .../service/impl/ReceiverInfoServiceImpl.java | 13 + .../service/impl/RedisUserServiceImpl.java | 30 + .../app/service/impl/RelatedServiceImpl.java | 13 + .../service/impl/ServiceLogServiceImpl.java | 13 + .../service/impl/StockoutEsServiceImpl.java | 341 +++++ .../service/impl/ThirdHeaderServiceImpl.java | 221 +++ .../service/impl/ThirdItemServiceImpl.java | 13 + .../service/impl/ThirdOrderEsServiceImpl.java | 236 ++++ ...hirdPartyAfterReceiverInfoServiceImpl.java | 13 + .../ThirdPartyAfterSaleHeaderServiceImpl.java | 13 + .../ThirdPartyAfterSaleItemServiceImpl.java | 13 + .../impl/ThirdPartyOrderServiceImpl.java | 13 + .../ThirdPartyReturnLogisticsServiceImpl.java | 13 + .../impl/ThirdReceiverInfoServiceImpl.java | 13 + .../impl/WarehousingNoticeServiceImpl.java | 13 + .../service/saga/OrderForwardSagaService.java | 99 ++ .../saga/ReturnAndRefundSagaService.java | 75 + .../saga/ReturnGoodsWarehouseSagaService.java | 71 + .../service/saga/StockSendSagaService.java | 37 + .../saga/ThirdOrderForWardSagaService.java | 115 ++ .../ThirdPartyAfterSaleSagaReturnService.java | 119 ++ .../service/saga/ThirdRefundSagaService.java | 107 ++ .../skyer/order/app/statemachine/BizBean.java | 49 + .../order/app/vo/ChannelSaleOrderVO.java | 43 + .../order/app/vo/PackageLogisticsVO.java | 50 + .../org/skyer/order/app/vo/PackageSku.java | 21 + .../skyer/order/app/vo/TransferRecordVO.java | 17 + .../org/skyer/order/app/vo/WorkExecuteVO.java | 26 + .../java/org/skyer/order/config/Events.java | 30 + .../order/config/OrderExtraDataManager.java | 34 + .../order/config/OrderSwaggerApiConfig.java | 38 + .../order/config/StateMachineConfig.java | 41 + .../java/org/skyer/order/config/States.java | 30 + .../order/domain/entity/AfterSaleHeader.java | 208 +++ .../order/domain/entity/AfterSaleItem.java | 141 ++ .../domain/entity/AfterSaleItemLine.java | 108 ++ .../domain/entity/AfterSaleLogistics.java | 70 + .../domain/entity/AfterSaleReceiverInfo.java | 121 ++ .../order/domain/entity/AfterSalesReason.java | 82 ++ .../org/skyer/order/domain/entity/Coupon.java | 233 ++++ .../order/domain/entity/DeliveryLog.java | 155 +++ .../org/skyer/order/domain/entity/Header.java | 245 ++++ .../org/skyer/order/domain/entity/Item.java | 194 +++ .../skyer/order/domain/entity/ItemLine.java | 217 +++ .../order/domain/entity/ItemLinePrice.java | 80 ++ .../skyer/order/domain/entity/ItemPrice.java | 81 ++ .../order/domain/entity/ItemSnapshot.java | 428 ++++++ .../skyer/order/domain/entity/OperateLog.java | 76 + .../order/domain/entity/OrderLogistics.java | 299 ++++ .../org/skyer/order/domain/entity/Price.java | 70 + .../order/domain/entity/ProcessDefine.java | 67 + .../order/domain/entity/ReceiverInfo.java | 289 ++++ .../skyer/order/domain/entity/Related.java | 142 ++ .../skyer/order/domain/entity/ServiceLog.java | 72 + .../order/domain/entity/ThirdHeader.java | 149 ++ .../skyer/order/domain/entity/ThirdItem.java | 125 ++ .../entity/ThirdPartyAfterReceiverInfo.java | 102 ++ .../entity/ThirdPartyAfterSaleHeader.java | 109 ++ .../entity/ThirdPartyAfterSaleItem.java | 89 ++ .../order/domain/entity/ThirdPartyOrder.java | 169 +++ .../entity/ThirdPartyReturnLogistics.java | 70 + .../domain/entity/ThirdReceiverInfo.java | 106 ++ .../domain/entity/WarehousingNotice.java | 75 + .../repository/AfterSaleHeaderRepository.java | 223 +++ .../AfterSaleItemLineRepository.java | 62 + .../repository/AfterSaleItemRepository.java | 48 + .../AfterSaleLogisticsRepository.java | 21 + .../AfterSaleReceiverInfoRepository.java | 20 + .../AfterSalesReasonRepository.java | 13 + .../domain/repository/CouponRepository.java | 13 + .../repository/DeliveryLogRepository.java | 13 + .../domain/repository/HeaderRepository.java | 96 ++ .../repository/ItemLinePriceRepository.java | 29 + .../domain/repository/ItemLineRepository.java | 139 ++ .../repository/ItemPriceRepository.java | 37 + .../domain/repository/ItemRepository.java | 55 + .../repository/ItemSnapshotRepository.java | 31 + .../repository/OperateLogRepository.java | 14 + .../repository/OrderLogisticsRepository.java | 13 + .../domain/repository/PriceRepository.java | 29 + .../repository/ProcessDefineRepository.java | 45 + .../repository/ReceiverInfoRepository.java | 29 + .../domain/repository/RelatedRepository.java | 13 + .../repository/ServiceLogRepository.java | 13 + .../repository/ThirdHeaderRepository.java | 20 + .../repository/ThirdItemRepository.java | 23 + ...ThirdPartyAfterReceiverInfoRepository.java | 19 + .../ThirdPartyAfterSaleHeaderRepository.java | 53 + .../ThirdPartyAfterSaleItemRepository.java | 21 + .../repository/ThirdPartyOrderRepository.java | 13 + .../ThirdPartyReturnLogisticsRepository.java | 19 + .../ThirdReceiverInfoRepository.java | 24 + .../WarehousingNoticeRepository.java | 13 + .../infra/annocations/DatasourceType.java | 23 + .../order/infra/common/BaisonClient.java | 85 ++ .../order/infra/common/CommonConstants.java | 634 +++++++++ .../order/infra/common/LogInterceptor.java | 51 + .../skyer/order/infra/common/LovSettings.java | 58 + .../skyer/order/infra/constant/Constants.java | 329 +++++ .../infra/convertor/CommonConvertor.java | 78 ++ .../infra/convertor/HeaderConvertor.java | 58 + .../convertor/ItemSnapshotConvertor.java | 23 + .../convertor/OrderAuditEsConvertor.java | 30 + .../infra/convertor/OrderEsConvertor.java | 31 + .../infra/convertor/OrderItemConvertor.java | 50 + .../convertor/OrderItemLineConvertor.java | 150 ++ .../convertor/ReceiverInfoConvertor.java | 22 + .../infra/convertor/RefundConvertor.java | 71 + .../convertor/SplitIemAmountConvertor.java | 34 + .../infra/convertor/ThirdHeaderConvertor.java | 138 ++ .../ThirdPartyAfterSaleConvertor.java | 57 + .../infra/enums/AfterSaleOrderException.java | 61 + .../infra/enums/BaiSonServiceTypeEnum.java | 90 ++ .../order/infra/enums/DBPoolTypeEnum.java | 62 + .../order/infra/enums/OrderItemEnum.java | 227 +++ .../order/infra/enums/OrderItemLineEnum.java | 206 +++ .../order/infra/enums/OrderStatusEnum.java | 231 ++++ .../order/infra/enums/PriceTypeEnum.java | 60 + .../order/infra/enums/ReturnRefundEnum.java | 64 + .../infra/feign/GoodsSkuRemoteService.java | 34 + .../infra/feign/GoodsStockRemoteService.java | 27 + .../infra/feign/LogisticsRemoteService.java | 30 + .../infra/feign/LovManageRemoteService.java | 118 ++ .../order/infra/feign/LovRemoteService.java | 148 ++ .../infra/feign/OnlineShopRemoteService.java | 26 + .../order/infra/feign/SpuRemoteService.java | 19 + .../infra/feign/TenantRemoteService.java | 28 + .../infra/feign/UserDetailRemoteService.java | 36 + .../order/infra/feign/dto/OnlineShopDTO.java | 33 + .../order/infra/feign/dto/SearchGiftDTO.java | 25 + .../order/infra/feign/dto/SearchOrderDTO.java | 41 + .../in/OutboundDeliveryOrderDetailDTO.java | 39 + .../OutboundDeliveryOrderDetailLineDTO.java | 25 + .../odo/in/OutboundDeliveryOrderInfoDTO.java | 128 ++ .../odo/out/OutboundDeliveryOrder.java | 93 ++ .../entity/lov/header/in/LovHeaderDto.java | 39 + .../entity/lov/header/in/LovValueDto.java | 40 + .../preemption/exe/in/DetailListData.java | 14 + .../preemption/exe/in/PreemptionDTO.java | 33 + .../preemption/exe/out/PreemptionVO.java | 13 + .../select/logistics/postage/in/Address.java | 22 + .../postage/in/CalcPostageChargeDTO.java | 38 + .../postage/in/LogicWarehouseVO2.java | 50 + .../logistics/postage/in/PackageSku.java | 30 + .../select/logistics/postage/in/Position.java | 20 + .../select/logistics/postage/in/SkuData.java | 16 + .../logistics/postage/out/PackageSku.java | 31 + .../postage/out/PackageSkuLogistics.java | 40 + .../feign/entity/self/tenants/TenantDTO.java | 27 + .../feign/impl/GoodsSkuRemoteServiceImpl.java | 27 + .../impl/GoodsStockRemoteServiceImpl.java | 20 + .../impl/LogisticsRemoteServiceImpl.java | 20 + .../impl/LovManageRemoteServiceImpl.java | 57 + .../feign/impl/LovRemoteServiceImpl.java | 51 + .../impl/OnlineShopRemoteServiceImpl.java | 21 + .../feign/impl/SpuRemoteServiceImpl.java | 17 + .../feign/impl/TenantRemoteServiceImpl.java | 22 + .../impl/UserDetailRemoteServiceImpl.java | 24 + .../skyer/order/infra/feign/vo/GiftSkuVO.java | 32 + .../order/infra/feign/vo/GoodsPageResVO.java | 80 ++ .../order/infra/feign/vo/OrderSkuVO.java | 18 + .../order/infra/feign/vo/PromoSkuVO.java | 18 + .../order/infra/feign/vo/RpcGoodsResVO.java | 86 ++ .../infra/feign/vo/SkuUsableStockVO.java | 18 + .../infra/mapper/AfterSaleHeaderMapper.java | 61 + .../infra/mapper/AfterSaleItemLineMapper.java | 48 + .../infra/mapper/AfterSaleItemMapper.java | 38 + .../mapper/AfterSaleLogisticsMapper.java | 13 + .../mapper/AfterSaleReceiverInfoMapper.java | 13 + .../infra/mapper/AfterSalesReasonMapper.java | 13 + .../order/infra/mapper/CouponMapper.java | 13 + .../order/infra/mapper/DeliveryLogMapper.java | 13 + .../order/infra/mapper/HeaderMapper.java | 50 + .../order/infra/mapper/ItemLineMapper.java | 30 + .../infra/mapper/ItemLinePriceMapper.java | 13 + .../skyer/order/infra/mapper/ItemMapper.java | 24 + .../order/infra/mapper/ItemPriceMapper.java | 13 + .../infra/mapper/ItemSnapshotMapper.java | 13 + .../order/infra/mapper/OperateLogMapper.java | 13 + .../infra/mapper/OrderLogisticsMapper.java | 13 + .../skyer/order/infra/mapper/PriceMapper.java | 13 + .../infra/mapper/ProcessDefineMapper.java | 25 + .../infra/mapper/ReceiverInfoMapper.java | 13 + .../order/infra/mapper/RelatedMapper.java | 13 + .../order/infra/mapper/ServiceLogMapper.java | 13 + .../order/infra/mapper/ThirdHeaderMapper.java | 13 + .../order/infra/mapper/ThirdItemMapper.java | 13 + .../ThirdPartyAfterReceiverInfoMapper.java | 13 + .../ThirdPartyAfterSaleHeaderMapper.java | 25 + .../mapper/ThirdPartyAfterSaleItemMapper.java | 13 + .../infra/mapper/ThirdPartyOrderMapper.java | 13 + .../ThirdPartyReturnLogisticsMapper.java | 13 + .../infra/mapper/ThirdReceiverInfoMapper.java | 13 + .../infra/mapper/WarehousingNoticeMapper.java | 13 + .../properties/DataHierarchyProperties.java | 19 + .../infra/properties/OrderProperties.java | 118 ++ .../remote/api/RemoteCustomizeService.java | 39 + .../api/impl/RemoteCustomizeServiceImpl.java | 141 ++ .../impl/AfterSaleHeaderRepositoryImpl.java | 1228 +++++++++++++++++ .../impl/AfterSaleItemLineRepositoryImpl.java | 86 ++ .../impl/AfterSaleItemRepositoryImpl.java | 63 + .../AfterSaleLogisticsRepositoryImpl.java | 39 + .../AfterSaleReceiverInfoRepositoryImpl.java | 36 + .../impl/AfterSalesReasonRepositoryImpl.java | 22 + .../repository/impl/CouponRepositoryImpl.java | 17 + .../impl/DeliveryLogRepositoryImpl.java | 17 + .../repository/impl/HeaderRepositoryImpl.java | 103 ++ .../impl/ItemLinePriceRepositoryImpl.java | 61 + .../impl/ItemLineRepositoryImpl.java | 259 ++++ .../impl/ItemPriceRepositoryImpl.java | 71 + .../repository/impl/ItemRepositoryImpl.java | 159 +++ .../impl/ItemSnapshotRepositoryImpl.java | 49 + .../impl/OperateLogRepositoryImpl.java | 17 + .../impl/OrderLogisticsRepositoryImpl.java | 17 + .../repository/impl/PriceRepositoryImpl.java | 53 + .../impl/ProcessDefineRepositoryImpl.java | 88 ++ .../impl/ReceiverInfoRepositoryImpl.java | 47 + .../impl/RelatedRepositoryImpl.java | 17 + .../impl/ServiceLogRepositoryImpl.java | 17 + .../impl/ThirdHeaderRepositoryImpl.java | 42 + .../impl/ThirdItemRepositoryImpl.java | 38 + ...dPartyAfterReceiverInfoRepositoryImpl.java | 37 + ...irdPartyAfterSaleHeaderRepositoryImpl.java | 219 +++ ...ThirdPartyAfterSaleItemRepositoryImpl.java | 42 + .../impl/ThirdPartyOrderRepositoryImpl.java | 17 + ...irdPartyReturnLogisticsRepositoryImpl.java | 38 + .../impl/ThirdReceiverInfoRepositoryImpl.java | 39 + .../impl/WarehousingNoticeRepositoryImpl.java | 17 + .../order/infra/util/CollectorsUtil.java | 179 +++ .../org/skyer/order/infra/util/Dates.java | 33 + .../order/infra/util/EsBoolQueryUtil.java | 548 ++++++++ .../org/skyer/order/infra/util/JsonUtils.java | 204 +++ .../org/skyer/order/infra/util/ListUtil.java | 65 + .../skyer/order/infra/util/ObjectUtils.java | 62 + .../order/infra/util/OrderTagsUtils.java | 63 + .../infra/util/ToBigDecimalFunction.java | 9 + .../org/skyer/order/saga/IOrderService.java | 7 + .../order/saga/impl/IOrderServiceImpl.java | 9 + .../statemachine/AbstractEventProcessor.java | 74 + .../statemachine/AbstractStateProcessor.java | 49 + .../order/statemachine/EventDoAction.java | 32 + .../skyer/order/statemachine/FsmOrder.java | 19 + .../order/statemachine/OrderEventsEnum.java | 43 + .../order/statemachine/OrderExtraData.java | 41 + .../order/statemachine/OrderProcessor.java | 28 + .../order/statemachine/OrderStateEvent.java | 32 + .../order/statemachine/OrderStatusEnum.java | 46 + .../order/statemachine/ServiceResult.java | 22 + .../order/statemachine/StateActionStep.java | 37 + .../order/statemachine/StateContext.java | 18 + .../order/statemachine/StateProcessor.java | 8 + .../skyer/order/statemachine/TestClass.java | 15 + .../service/PreemptionAction.java | 36 + .../src/main/resources/application.yml | 177 +++ skyer-order/src/main/resources/banner.txt | 10 + skyer-order/src/main/resources/bootstrap.yml | 33 + .../mapper/AfterSaleHeaderMapper.xml | 381 +++++ .../mapper/AfterSaleItemLineMapper.xml | 136 ++ .../resources/mapper/AfterSaleItemMapper.xml | 106 ++ .../mapper/AfterSaleLogisticsMapper.xml | 18 + .../mapper/AfterSaleReceiverInfoMapper.xml | 37 + .../mapper/AfterSalesReasonMapper.xml | 20 + .../resources/mapper/DeliveryLogMapper.xml | 20 + .../main/resources/mapper/HeaderMapper.xml | 210 +++ .../main/resources/mapper/ItemLineMapper.xml | 86 ++ .../resources/mapper/ItemLinePriceMapper.xml | 21 + .../src/main/resources/mapper/ItemMapper.xml | 60 + .../main/resources/mapper/ItemPriceMapper.xml | 20 + .../resources/mapper/ItemSnapshotMapper.xml | 41 + .../resources/mapper/OperateLogMapper.xml | 20 + .../resources/mapper/OrderLogisticsMapper.xml | 30 + .../src/main/resources/mapper/PriceMapper.xml | 19 + .../resources/mapper/ProcessDefineMapper.xml | 38 + .../resources/mapper/ReceiverInfoMapper.xml | 29 + .../main/resources/mapper/RelatedMapper.xml | 19 + .../resources/mapper/ServiceLogMapper.xml | 20 + .../resources/mapper/ThirdHeaderMapper.xml | 31 + .../main/resources/mapper/ThirdItemMapper.xml | 33 + .../ThirdPartyAfterReceiverInfoMapper.xml | 29 + .../ThirdPartyAfterSaleHeaderMapper.xml | 85 ++ .../mapper/ThirdPartyAfterSaleItemMapper.xml | 23 + .../mapper/ThirdPartyOrderMapper.xml | 21 + .../ThirdPartyReturnLogisticsMapper.xml | 20 + .../mapper/ThirdReceiverInfoMapper.xml | 29 + .../mapper/WarehousingNoticeMapper.xml | 20 + .../messages/messages_hpfm_en_US.properties | 182 +++ .../messages/messages_hpfm_zh_CN.properties | 183 +++ .../src/main/resources/order-send.bpmn | 56 + .../src/main/resources/static/js/babel.min.js | 25 + .../src/test/java/org/skyer/order/EsTest.java | 71 + .../java/org/skyer/order/OrderEsTest.java | 65 + skyer-stock/.gitignore | 103 ++ skyer-stock/.gitlab-ci.yml | 1 + skyer-stock/charts/skyer-stock/Chart.yaml | 5 + skyer-stock/charts/skyer-stock/README.md | 81 ++ .../charts/skyer-stock/templates/_helpers.tpl | 28 + .../skyer-stock/templates/deployment.yaml | 119 ++ .../charts/skyer-stock/templates/service.yaml | 41 + skyer-stock/charts/skyer-stock/values.yaml | 130 ++ skyer-stock/docker/Dockerfile | 6 + skyer-stock/init-local-database.sh | 13 + skyer-stock/pom.xml | 344 +++++ skyer-stock/sql/sstock_adjust_detail.sql | 43 + skyer-stock/sql/sstock_adjust_record.sql | 42 + skyer-stock/sql/sstock_change_log.sql | 47 + skyer-stock/sql/sstock_goods_stock_detail.sql | 39 + .../sql/sstock_outbound_delivery_order.sql | 74 + .../sstock_outbound_delivery_order_detail.sql | 39 + skyer-stock/sql/sstock_result_detail.sql | 35 + skyer-stock/sql/sstock_result_record.sql | 72 + skyer-stock/sql/sstock_shop_warehouse.sql | 34 + skyer-stock/sql/sstock_storage_area.sql | 52 + skyer-stock/sql/sstock_warehouse.sql | 44 + skyer-stock/sql/sstock_warehouse_result.sql | 62 + .../sql/sstock_warehouse_result_detail.sql | 35 + skyer-stock/sql/sstock_warehouse_warrant.sql | 66 + .../sql/sstock_warehouse_warrant_detail.sql | 38 + .../sstock_warehouse_warrant_logistics.sql | 33 + skyer-stock/sql/注意 | 1 + .../autoconfigure/stock/EnableSkyerStock.java | 16 + .../stock/StockAutoConfiguration.java | 55 + .../org/skyer/stock/StockApplication.java | 25 + .../controller/v1/AdjustRecordController.java | 66 + .../controller/v1/ChangeLogController.java | 41 + .../controller/v1/GoodsStockController.java | 41 + .../v1/OutboundDeliveryOrderController.java | 46 + .../controller/v1/ResultRecordController.java | 51 + .../controller/v1/StorageAreaController.java | 90 ++ .../controller/v1/WarehouseController.java | 40 + .../v1/WarehouseResultController.java | 50 + .../v1/WarehouseWarrantController.java | 60 + .../stock/api/dto/AdjustDetailsReqDTO.java | 30 + .../skyer/stock/api/dto/AdjustPageReqDTO.java | 39 + .../stock/api/dto/AdjustRecordReqDTO.java | 39 + .../skyer/stock/api/dto/AdjustSagaDTO.java | 13 + .../org/skyer/stock/api/dto/AuditReqDTO.java | 29 + .../skyer/stock/api/dto/BatchRemoveDTO.java | 24 + .../org/skyer/stock/api/dto/CodeAndIdDTO.java | 12 + .../stock/api/dto/EsStockVersionDTO.java | 11 + .../skyer/stock/api/dto/ExeAllocationDTO.java | 10 + .../skyer/stock/api/dto/GoodsStockDTO.java | 45 + .../stock/api/dto/LogisticsResultDTO.java | 28 + .../org/skyer/stock/api/dto/NeedOrderDTO.java | 19 + .../api/dto/OutboundDeliveryOrderDTO.java | 96 ++ .../dto/OutboundDeliveryOrderDetailDTO.java | 30 + .../OutboundDeliveryOrderDetailLineDTO.java | 25 + .../api/dto/OutboundDeliveryOrderInfoDTO.java | 129 ++ .../api/dto/OutboundDeliveryOrderPageDTO.java | 48 + .../org/skyer/stock/api/dto/PageReqDTO.java | 36 + .../api/dto/ReplenishmentPreemptionDTO.java | 17 + .../skyer/stock/api/dto/ResultRecordDTO.java | 101 ++ .../stock/api/dto/ResultRecordPageDTO.java | 45 + .../java/org/skyer/stock/api/dto/ShopDTO.java | 30 + .../stock/api/dto/StockChangeListDTO.java | 48 + .../org/skyer/stock/api/dto/StockEsDTO.java | 61 + .../skyer/stock/api/dto/StockQueryReqDTO.java | 47 + .../skyer/stock/api/dto/StorageAreaDTO.java | 64 + .../stock/api/dto/StorageAreaListReqDTO.java | 22 + .../stock/api/dto/WarehouseQueryReqDTO.java | 34 + .../api/dto/WarehouseResultPageQueryDTO.java | 34 + .../api/dto/WarehouseWarrantDetailDTO.java | 25 + .../api/dto/WarehouseWarrantLogisticsDTO.java | 15 + .../api/dto/WarehouseWarrantPageQueryDTO.java | 33 + .../api/dto/WarehouseWarrantResultDTO.java | 82 ++ .../api/dto/WarehouseWarrantSaveDTO.java | 63 + .../stock/config/StockExtraDataManager.java | 36 + .../stock/config/StockSwaggerApiConfig.java | 41 + .../stock/domain/entity/AdjustDetail.java | 85 ++ .../stock/domain/entity/AdjustRecord.java | 82 ++ .../skyer/stock/domain/entity/ChangeLog.java | 106 ++ .../stock/domain/entity/GoodsStockDetail.java | 76 + .../domain/entity/OutboundDeliveryOrder.java | 198 +++ .../entity/OutboundDeliveryOrderDetail.java | 89 ++ .../stock/domain/entity/ResultDetail.java | 65 + .../stock/domain/entity/ResultRecord.java | 166 +++ .../stock/domain/entity/ShopWarehouse.java | 59 + .../stock/domain/entity/StorageArea.java | 114 ++ .../skyer/stock/domain/entity/Warehouse.java | 87 ++ .../stock/domain/entity/WarehouseResult.java | 142 ++ .../domain/entity/WarehouseResultDetail.java | 66 + .../stock/domain/entity/WarehouseWarrant.java | 159 +++ .../domain/entity/WarehouseWarrantDetail.java | 78 ++ .../entity/WarehouseWarrantLogistics.java | 54 + .../repository/AdjustDetailRepository.java | 36 + .../repository/AdjustRecordRepository.java | 41 + .../repository/ChangeLogRepository.java | 24 + .../GoodsStockDetailRepository.java | 17 + ...OutboundDeliveryOrderDetailRepository.java | 24 + .../OutboundDeliveryOrderRepository.java | 24 + .../repository/ResultDetailRepository.java | 29 + .../repository/ResultRecordRepository.java | 37 + .../repository/ShopWarehouseRepository.java | 21 + .../repository/StorageAreaRepository.java | 48 + .../repository/WarehouseRepository.java | 64 + .../WarehouseResultDetailRepository.java | 22 + .../repository/WarehouseResultRepository.java | 24 + .../WarehouseWarrantDetailRepository.java | 32 + .../WarehouseWarrantLogisticsRepository.java | 13 + .../WarehouseWarrantRepository.java | 33 + .../domain/service/AdjustRecordService.java | 55 + .../domain/service/ChangeLogService.java | 60 + .../service/ComputeAvailableStockService.java | 19 + .../service/OutboundDeliveryOrderService.java | 39 + .../domain/service/ResultRecordService.java | 51 + .../stock/domain/service/StockEsService.java | 42 + .../domain/service/StorageAreaService.java | 50 + .../service/WarehouseResultService.java | 41 + .../domain/service/WarehouseService.java | 29 + .../service/WarehouseWarrantService.java | 40 + .../service/impl/AdjustRecordServiceImpl.java | 292 ++++ .../service/impl/ChangeLogServiceImpl.java | 125 ++ .../ComputeAvailableStockServiceImpl.java | 49 + .../OutboundDeliveryOrderServiceImpl.java | 186 +++ .../service/impl/ResultRecordServiceImpl.java | 223 +++ .../service/impl/StockEsServiceImpl.java | 330 +++++ .../service/impl/StorageAreaServiceImpl.java | 190 +++ .../impl/WarehouseResultServiceImpl.java | 156 +++ .../service/impl/WarehouseServiceImpl.java | 113 ++ .../impl/WarehouseWarrantServiceImpl.java | 174 +++ .../domain/service/saga/StockService.java | 24 + .../saga/impl/ExeStockServiceImpl.java | 47 + .../saga/impl/SkuQtyAdjustServiceImpl.java | 42 + .../service/saga/impl/StockServiceImpl.java | 52 + .../stock/domain/vo/AdjustDetailResVO.java | 43 + .../domain/vo/AdjustRecordPageResVO.java | 68 + .../stock/domain/vo/AdjustRecordResVO.java | 27 + .../stock/domain/vo/AreaInfoDetailsVO.java | 27 + .../stock/domain/vo/GoodsStockResVO.java | 58 + .../stock/domain/vo/LogisticsResultVO.java | 33 + .../org/skyer/stock/domain/vo/OdoQtyVO.java | 20 + .../vo/OutboundDeliveryOrderInfoVO.java | 129 ++ .../vo/OutboundDeliveryOrderListVO.java | 102 ++ .../stock/domain/vo/ResultRecordInfoVO.java | 116 ++ .../stock/domain/vo/ResultRecordListVO.java | 83 ++ .../stock/domain/vo/ResultRecordQtyVO.java | 13 + .../skyer/stock/domain/vo/RpcGoodsResVO.java | 48 + .../stock/domain/vo/StockChangeListVO.java | 82 ++ .../skyer/stock/domain/vo/StockChangeVO.java | 20 + .../stock/domain/vo/StorageAreaListVO.java | 64 + .../stock/domain/vo/WarehouseQueryResVO.java | 36 + .../domain/vo/WarehouseResultInfoVO.java | 75 + .../stock/domain/vo/WarehouseResultQtyVO.java | 15 + .../stock/domain/vo/WarehouseResultVO.java | 55 + .../vo/WarehouseWarrantInfoLogisticsVO.java | 15 + .../domain/vo/WarehouseWarrantInfoVO.java | 99 ++ .../domain/vo/WarehouseWarrantQtyVO.java | 17 + .../stock/domain/vo/WarehouseWarrantVO.java | 70 + .../infra/annocations/DatasourceType.java | 23 + .../stock/infra/constant/ObjectConstant.java | 250 ++++ .../convertor/AdjustRecordConvertor.java | 17 + .../infra/convertor/CommonConvertor.java | 80 ++ .../infra/convertor/StockEsConvertor.java | 20 + .../infra/feign/GoodsSkuRemoteService.java | 30 + .../feign/SkyerPlatformRemoteService.java | 31 + .../infra/feign/UserDetailRemoteService.java | 36 + .../feign/impl/GoodsSkuRemoteServiceImpl.java | 24 + .../impl/SkyerPlatformRemoteServiceImpl.java | 20 + .../impl/UserDetailRemoteServiceImpl.java | 24 + .../infra/mapper/AdjustDetailMapper.java | 13 + .../infra/mapper/AdjustRecordMapper.java | 28 + .../stock/infra/mapper/ChangeLogMapper.java | 24 + .../infra/mapper/GoodsStockDetailMapper.java | 16 + .../OutboundDeliveryOrderDetailMapper.java | 27 + .../mapper/OutboundDeliveryOrderMapper.java | 32 + .../infra/mapper/ResultDetailMapper.java | 22 + .../infra/mapper/ResultRecordMapper.java | 31 + .../infra/mapper/ShopWarehouseMapper.java | 21 + .../stock/infra/mapper/StorageAreaMapper.java | 32 + .../stock/infra/mapper/WarehouseMapper.java | 59 + .../mapper/WarehouseResultDetailMapper.java | 21 + .../infra/mapper/WarehouseResultMapper.java | 24 + .../mapper/WarehouseWarrantDetailMapper.java | 34 + .../WarehouseWarrantLogisticsMapper.java | 13 + .../infra/mapper/WarehouseWarrantMapper.java | 29 + .../properties/DataHierarchyProperties.java | 19 + .../infra/properties/StockProperties.java | 118 ++ .../remote/api/RemoteCustomizeService.java | 39 + .../api/impl/RemoteCustomizeServiceImpl.java | 142 ++ .../impl/AdjustDetailRepositoryImpl.java | 65 + .../impl/AdjustRecordRepositoryImpl.java | 55 + .../impl/ChangeLogRepositoryImpl.java | 42 + .../impl/GoodsStockDetailRepositoryImpl.java | 25 + ...oundDeliveryOrderDetailRepositoryImpl.java | 32 + .../OutboundDeliveryOrderRepositoryImpl.java | 34 + .../impl/ResultDetailRepositoryImpl.java | 38 + .../impl/ResultRecordRepositoryImpl.java | 53 + .../impl/ShopWarehouseRepositoryImpl.java | 25 + .../impl/StorageAreaRepositoryImpl.java | 58 + .../impl/WarehouseRepositoryImpl.java | 74 + .../WarehouseResultDetailRepositoryImpl.java | 27 + .../impl/WarehouseResultRepositoryImpl.java | 31 + .../WarehouseWarrantDetailRepositoryImpl.java | 33 + ...rehouseWarrantLogisticsRepositoryImpl.java | 18 + .../impl/WarehouseWarrantRepositoryImpl.java | 35 + .../stock/infra/util/EsBoolQueryUtil.java | 534 +++++++ .../src/main/resources/application.yml | 168 +++ skyer-stock/src/main/resources/banner.txt | 10 + skyer-stock/src/main/resources/bootstrap.yml | 46 + .../resources/mapper/AdjustDetailMapper.xml | 22 + .../resources/mapper/AdjustRecordMapper.xml | 80 ++ .../main/resources/mapper/ChangeLogMapper.xml | 141 ++ .../mapper/GoodsStockDetailMapper.xml | 23 + .../OutboundDeliveryOrderDetailMapper.xml | 37 + .../mapper/OutboundDeliveryOrderMapper.xml | 102 ++ .../resources/mapper/ResultDetailMapper.xml | 20 + .../resources/mapper/ResultRecordMapper.xml | 122 ++ .../resources/mapper/ShopWarehouseMapper.xml | 20 + .../resources/mapper/StorageAreaMapper.xml | 91 ++ .../main/resources/mapper/WarehouseMapper.xml | 101 ++ .../mapper/WarehouseResultDetailMapper.xml | 21 + .../mapper/WarehouseResultMapper.xml | 87 ++ .../mapper/WarehouseWarrantDetailMapper.xml | 18 + .../WarehouseWarrantLogisticsMapper.xml | 12 + .../mapper/WarehouseWarrantMapper.xml | 63 + .../messages/messages_hpfm_en_US.properties | 182 +++ .../messages/messages_hpfm_zh_CN.properties | 183 +++ .../src/main/resources/static/js/babel.min.js | 25 + 1104 files changed, 69394 insertions(+) create mode 100644 skyer-goods/.gitignore create mode 100644 skyer-goods/.gitlab-ci.yml create mode 100644 skyer-goods/charts/skyer-goods/Chart.yaml create mode 100644 skyer-goods/charts/skyer-goods/README.md create mode 100644 skyer-goods/charts/skyer-goods/templates/_helpers.tpl create mode 100644 skyer-goods/charts/skyer-goods/templates/deployment.yaml create mode 100644 skyer-goods/charts/skyer-goods/templates/service.yaml create mode 100644 skyer-goods/charts/skyer-goods/values.yaml create mode 100644 skyer-goods/docker/Dockerfile create mode 100644 skyer-goods/init-local-database.sh create mode 100644 skyer-goods/pom.xml create mode 100644 skyer-goods/src/main/java/org/skyer/autoconfigure/goods/EnableSkyerGoods.java create mode 100644 skyer-goods/src/main/java/org/skyer/autoconfigure/goods/GoodsAutoConfiguration.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/GoodsApplication.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/BrandController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryAttributeController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsShopController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsSkuController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/InstallServiceController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/MaterialController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/PriceItemSettingController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueDraftController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditSettingController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuDraftController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuGroupController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttrValueRelationController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeValueController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuInstallServiceController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuSonMumController.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/AttrListRequestDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/AttributeDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandPageReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeQueryDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeSaveDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeValueSaveDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryQueryDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategorySaveDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryTreeQueryDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryUpdateByStatusFlagDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupSkuReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsPageReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsRequestDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsSkuPageDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/GroupPageReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/IdsReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/LevelCategoryDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialListDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/PageReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchAuditDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchSaveDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuListRequestDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateInfoDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/SpuListDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/StatusReqDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/api/dto/UpdatePriceItemValueDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeValueService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/InstallServiceService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/MyEncryptionService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueDraftService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAuditSettingService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuDraftService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuEsService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuPackageService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SkuService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeValueService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuEsService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceSkuService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceStoreService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumSkuService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumStoreService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeValueServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/InstallServiceServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/MyEncryptionServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueDraftServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAuditSettingServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuDraftServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuEsServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuPackageServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeValueServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuEsServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceSkuServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceStoreServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumSkuServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumStoreServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/config/GoodsExtraDataManager.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/config/GoodsSwaggerApiConfig.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSonMumSkuDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSpuInstallServiceSkuDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/AuditDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/InstallServiceDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/LevelRedisCategoryDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/MultiDelDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageInstallServiceDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSonMumDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSpuInstallServiceDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/ServiceZoneDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/SkuAuditDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuInstallServiceDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuSonMumDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/dto/TotalCategoryDTO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/Brand.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/Category.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttribute.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttributeValue.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/GoodsShop.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/InstallService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/Material.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/Sku.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttrValueRelation.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValue.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValueDraft.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAuditSetting.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuDraft.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroup.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupSku.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupStore.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuPackage.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/Spu.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttrValueRelation.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttribute.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttributeValue.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceSku.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceStore.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMum.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumSku.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumStore.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/BrandRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeValueRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/InstallServiceRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/MaterialRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttrValueRelationRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueDraftRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAuditSettingRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuDraftRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupSkuRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupStoreRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuPackageRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttrValueRelationRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeValueRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceSkuRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceStoreRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumSkuRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumStoreRepository.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/BrandService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/CategoryManageService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsAttributeService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsShopService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/MaterialService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupSkuService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupStoreService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/SpuService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/BrandServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/CategoryManageServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsAttributeServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsShopServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/MaterialServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupSkuServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupStoreServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SpuServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/AllAttributeRelationResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeAndValueResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeDetailResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributePageResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeValueResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/BrandPageResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeValueVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldPageResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryTreeVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CheckGoodsAttributeResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/ChinaZoingRemoteVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/CreateSkuListVo.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/DetailSpecifResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailsVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsPageResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditPriceVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuDetailVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuPageVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupPageResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupStoreResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/MainIdAttributeValueResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/MaterialVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/OnlineShopVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/PriceItemLov.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcGoodsResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcOrderResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuAuditVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupSkuResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuInfoResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuPackageVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/SpuEsModel.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/domain/vo/TotalCategoryResVO.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/annocations/DatasourceType.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/CompanyConstants.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/Constants.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/DataHierarchyDisplayStyle.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/FndConstants.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/HpfmMsgCodeConstants.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/HrConstants.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/ObjectConstant.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/constant/RedisKey.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/convertor/BrandConvertor.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CategoryConvertor.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CommonConvertor.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/convertor/GoodsConvertor.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/convertor/SkuGroupConvertor.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/enums/DBPoolTypeEnum.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/enums/DatabaseTypeEnum.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/ChinaZoingRemoteService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovManageRemoteService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovRemoteService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/OnlineShopRemoteService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/UserDetailRemoteService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovHeaderDto.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovValueDto.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/ChinaZoingRemoteServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovManageRemoteServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovRemoteServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/OnlineShopRemoteServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/UserDetailRemoteServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/handler/MessageHandler.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/BrandMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeValueMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/GoodsShopMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/InstallServiceMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/MaterialMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttrValueRelationMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueDraftMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAuditSettingMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuDraftMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupSkuMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupStoreMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuPackageMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttrValueRelationMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeValueMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceSkuMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceStoreMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumSkuMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumStoreMapper.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/properties/DataHierarchyProperties.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/properties/GoodsProperties.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/RemoteCustomizeService.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/impl/RemoteCustomizeServiceImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/BrandRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeValueRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/InstallServiceRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/MaterialRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttrValueRelationRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueDraftRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAuditSettingRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuDraftRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupSkuRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupStoreRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuPackageRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttrValueRelationRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeValueRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceSkuRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceStoreRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumSkuRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumStoreRepositoryImpl.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/util/Dates.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/util/EsBoolQueryUtil.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/util/JsonUtils.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/util/ListUtils.java create mode 100644 skyer-goods/src/main/java/org/skyer/goods/infra/util/Md5Utils.java create mode 100644 skyer-goods/src/main/resources/application.yml create mode 100644 skyer-goods/src/main/resources/banner.txt create mode 100644 skyer-goods/src/main/resources/bootstrap.yml create mode 100644 skyer-goods/src/main/resources/mapper/BrandMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/CategoryAttributeMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/CategoryAttributeValueMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/CategoryMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/GoodsShopMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/InstallServiceMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/MaterialMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuAttrValueRelationMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuAttributeValueDraftMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuAttributeValueMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuAuditSettingMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuDraftMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuGroupMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuGroupSkuMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuGroupStoreMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SkuPackageMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuAttrValueRelationMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuAttributeMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuAttributeValueMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuInstallServiceMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuInstallServiceSkuMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuInstallServiceStoreMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuSonMumMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuSonMumSkuMapper.xml create mode 100644 skyer-goods/src/main/resources/mapper/SpuSonMumStoreMapper.xml create mode 100644 skyer-goods/src/main/resources/messages/messages_hpfm_en_US.properties create mode 100644 skyer-goods/src/main/resources/messages/messages_hpfm_zh_CN.properties create mode 100644 skyer-goods/src/main/resources/static/js/babel.min.js create mode 100644 skyer-order/.gitignore create mode 100644 skyer-order/.gitlab-ci.yml create mode 100644 skyer-order/charts/skyer-order/Chart.yaml create mode 100644 skyer-order/charts/skyer-order/README.md create mode 100644 skyer-order/charts/skyer-order/templates/_helpers.tpl create mode 100644 skyer-order/charts/skyer-order/templates/deployment.yaml create mode 100644 skyer-order/charts/skyer-order/templates/service.yaml create mode 100644 skyer-order/charts/skyer-order/values.yaml create mode 100644 skyer-order/docker/Dockerfile create mode 100644 skyer-order/init-local-database.sh create mode 100644 skyer-order/pom.xml create mode 100644 skyer-order/sql/sord_process_define.sql create mode 100644 skyer-order/src/main/java/org/skyer/autoconfigure/order/EnableSkyerOrder.java create mode 100644 skyer-order/src/main/java/org/skyer/autoconfigure/order/OrderAutoConfiguration.java create mode 100644 skyer-order/src/main/java/org/skyer/order/OrderApplication.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/AfterSaleHeaderController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/AfterSaleItemController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/AfterSaleItemLineController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/AfterSaleLogisticsController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/AfterSalesReasonController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/CouponController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/DeliveryLogController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ItemController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ItemLineController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ItemLinePriceController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ItemPriceController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ItemSnapshotController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/OperateLogController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/OrderController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/OrderReportController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/PriceController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ProcessDefineController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ReceiverInfoController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/RelatedController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ServiceLogController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ThirdItemController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ThirdOrderController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ThirdPartyAfterSaleHeaderController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ThirdPartyOrderController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/controller/v1/ThirdReceiverInfoController.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AccountCheckingOrderDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AccountCheckingOrderQueryDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AddRefundOnlyDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AfterItemAddDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AfterItemDeleteDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AfterSaleItemDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AfterSaleItemLineDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AfterSaleReceiveInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/AuditRefundDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/BatchStringListDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/IdListDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ItemConfirmDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ItemSearchDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OperateLogDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderBaseDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderBaseInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderBuyerInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderCancelDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderDetailDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderDetailSearchDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderItemDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderPageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderPaymentInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderRefundInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderSaleDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderSaleDateDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/OrderTableDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/PageReqDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ProcessDefineDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ProcessDefinePageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/QueryPreempPageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ReceiverInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundAuditPageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundGoodsDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundLogisticsDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundOnlyAuditStartDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundOnlyPageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundPageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/RefundSearchDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ReturnRefundAuditStartDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/SaleItemReportDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ShopIdsAndSkuCodesDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/StatsStockoutDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/SuspendOrderDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdOrderBaseInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdOrderBuyerInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdOrderDiscountInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdOrderItemDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdOrderPaymentInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdOrderTableDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdPartyAfterSaleDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdPartyAfterSalePageDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdPartyReceiveInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/ThirdPartyRefundBaseInfo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/UpdateRefundDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/UpdateWarehouseDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/WarehouseWarrantDetailDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/WarehouseWarrantLogisticsDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/dto/WarehouseWarrantSaveDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/OrderAuditEsModel.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/OrderEsModel.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/SearchOrderAuditEsParam.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/SearchOrderEsParam.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/SearchStockoutEsParam.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/SearchThirdOrderEsParam.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/SpuEsModel.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/es/ThirdOrderEsModel.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/AfterSaleDetailVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/AfterSaleItemLineVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/AfterSaleItemVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/AmountInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/CopyOrderItemVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/CopyOrderVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderDetailVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderGoodsLineVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderItemLinePageVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderItemLineVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderItemPageVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderPageVo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderSaleDateVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderSaleReportVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderStatusTotalVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/OrderTotalVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/PaymentInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/PriceTypeListVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ProcessDefineDetailsVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ProcessDefinePageVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ReceiverInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundBaseInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundBuyerInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundDetailsVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundItemLineVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundLogisticsInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundOnlyPageVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundPageVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundSearchVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RefundsLogisticsVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RpcOrderAmountVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/RpcOrderInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/SaleItemReportVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ShopSkuStockoutVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/StatsStockoutVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/StockoutPageVo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdAmountInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdItemVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdOrderDetailVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdOrderInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdOrderPageVo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdPartyAfterSaleHeaderDetailsVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdPartyAfterSalePageVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdPaymentInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/ThirdReceiverInfoVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/UnfinishedTotalVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/WaitDealTotalVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/api/vo/WarehouseWarrantResultVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/BaseListDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/CalAmountDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/NeedOrderDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/OrderDetailDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/OrderInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/OrderLineWorkDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/OutboundDeliveryOrderDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/OutboundDeliveryOrderDetailDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/PackItemAmountDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/ResultDetailDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/ResultRecordDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/SaleOrderOrderApiDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/dto/SplitItemAmountDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/AfterSaleHeaderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/AfterSaleItemLineService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/AfterSaleItemService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/AfterSaleLogisticsService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/AfterSaleReceiverInfoService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/AfterSalesReasonService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/CouponService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/DeliveryLogService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/HeaderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ItemLinePriceService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ItemLineService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ItemPriceService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ItemService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ItemSnapshotService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/OperateLogService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/OrderEsService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/OrderLogisticsService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/OrderReportService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/OrderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/PriceService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ProcessDefineService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ReceiverInfoService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/RedisUserService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/RelatedService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ServiceLogService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/SourceLogService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/StockoutEsService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdHeaderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdItemService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdOrderEsService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdPartyAfterReceiverInfoService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdPartyAfterSaleHeaderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdPartyAfterSaleItemService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdPartyOrderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdPartyReturnLogisticsService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/ThirdReceiverInfoService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/WarehousingNoticeService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/component/OrderWorkTask.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/component/ReturnAndRefundWorkTask.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/AfterSaleHeaderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/AfterSaleItemLineServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/AfterSaleItemServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/AfterSaleLogisticsServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/AfterSaleReceiverInfoServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/AfterSalesReasonServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/CouponServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/DeliveryLogServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/HeaderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ItemLinePriceServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ItemLineServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ItemPriceServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ItemServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ItemSnapshotServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/OperateLogServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/OrderEsServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/OrderLogisticsServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/OrderReportServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/OrderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/PriceServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ProcessDefineServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ReceiverInfoServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/RedisUserServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/RelatedServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ServiceLogServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/StockoutEsServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdHeaderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdItemServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdOrderEsServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdPartyAfterReceiverInfoServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdPartyAfterSaleHeaderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdPartyAfterSaleItemServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdPartyOrderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdPartyReturnLogisticsServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/ThirdReceiverInfoServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/impl/WarehousingNoticeServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/OrderForwardSagaService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/ReturnAndRefundSagaService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/ReturnGoodsWarehouseSagaService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/StockSendSagaService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/ThirdOrderForWardSagaService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/ThirdPartyAfterSaleSagaReturnService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/service/saga/ThirdRefundSagaService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/statemachine/BizBean.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/vo/ChannelSaleOrderVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/vo/PackageLogisticsVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/vo/PackageSku.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/vo/TransferRecordVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/app/vo/WorkExecuteVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/config/Events.java create mode 100644 skyer-order/src/main/java/org/skyer/order/config/OrderExtraDataManager.java create mode 100644 skyer-order/src/main/java/org/skyer/order/config/OrderSwaggerApiConfig.java create mode 100644 skyer-order/src/main/java/org/skyer/order/config/StateMachineConfig.java create mode 100644 skyer-order/src/main/java/org/skyer/order/config/States.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/AfterSaleHeader.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/AfterSaleItem.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/AfterSaleItemLine.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/AfterSaleLogistics.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/AfterSaleReceiverInfo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/AfterSalesReason.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/Coupon.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/DeliveryLog.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/Header.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/Item.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ItemLine.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ItemLinePrice.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ItemPrice.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ItemSnapshot.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/OperateLog.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/OrderLogistics.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/Price.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ProcessDefine.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ReceiverInfo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/Related.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ServiceLog.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdHeader.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdItem.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdPartyAfterReceiverInfo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdPartyAfterSaleHeader.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdPartyAfterSaleItem.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdPartyOrder.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdPartyReturnLogistics.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/ThirdReceiverInfo.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/entity/WarehousingNotice.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/AfterSaleHeaderRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/AfterSaleItemLineRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/AfterSaleItemRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/AfterSaleLogisticsRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/AfterSaleReceiverInfoRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/AfterSalesReasonRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/CouponRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/DeliveryLogRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/HeaderRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ItemLinePriceRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ItemLineRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ItemPriceRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ItemRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ItemSnapshotRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/OperateLogRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/OrderLogisticsRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/PriceRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ProcessDefineRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ReceiverInfoRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/RelatedRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ServiceLogRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdHeaderRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdItemRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdPartyAfterReceiverInfoRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdPartyAfterSaleHeaderRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdPartyAfterSaleItemRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdPartyOrderRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdPartyReturnLogisticsRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/ThirdReceiverInfoRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/domain/repository/WarehousingNoticeRepository.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/annocations/DatasourceType.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/common/BaisonClient.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/common/CommonConstants.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/common/LogInterceptor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/common/LovSettings.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/constant/Constants.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/CommonConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/HeaderConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/ItemSnapshotConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/OrderAuditEsConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/OrderEsConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/OrderItemConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/OrderItemLineConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/ReceiverInfoConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/RefundConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/SplitIemAmountConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/ThirdHeaderConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/convertor/ThirdPartyAfterSaleConvertor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/AfterSaleOrderException.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/BaiSonServiceTypeEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/DBPoolTypeEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/OrderItemEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/OrderItemLineEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/OrderStatusEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/PriceTypeEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/enums/ReturnRefundEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/GoodsSkuRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/GoodsStockRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/LogisticsRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/LovManageRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/LovRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/OnlineShopRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/SpuRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/TenantRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/UserDetailRemoteService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/dto/OnlineShopDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/dto/SearchGiftDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/dto/SearchOrderDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/generate/odo/in/OutboundDeliveryOrderDetailDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/generate/odo/in/OutboundDeliveryOrderDetailLineDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/generate/odo/in/OutboundDeliveryOrderInfoDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/generate/odo/out/OutboundDeliveryOrder.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/lov/header/in/LovHeaderDto.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/lov/header/in/LovValueDto.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/preemption/exe/in/DetailListData.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/preemption/exe/in/PreemptionDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/preemption/exe/out/PreemptionVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/in/Address.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/in/CalcPostageChargeDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/in/LogicWarehouseVO2.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/in/PackageSku.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/in/Position.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/in/SkuData.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/out/PackageSku.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/select/logistics/postage/out/PackageSkuLogistics.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/entity/self/tenants/TenantDTO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/GoodsSkuRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/GoodsStockRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/LogisticsRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/LovManageRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/LovRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/OnlineShopRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/SpuRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/TenantRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/impl/UserDetailRemoteServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/vo/GiftSkuVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/vo/GoodsPageResVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/vo/OrderSkuVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/vo/PromoSkuVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/vo/RpcGoodsResVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/feign/vo/SkuUsableStockVO.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/AfterSaleHeaderMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/AfterSaleItemLineMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/AfterSaleItemMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/AfterSaleLogisticsMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/AfterSaleReceiverInfoMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/AfterSalesReasonMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/CouponMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/DeliveryLogMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/HeaderMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ItemLineMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ItemLinePriceMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ItemMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ItemPriceMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ItemSnapshotMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/OperateLogMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/OrderLogisticsMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/PriceMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ProcessDefineMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ReceiverInfoMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/RelatedMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ServiceLogMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdHeaderMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdItemMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdPartyAfterReceiverInfoMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdPartyAfterSaleHeaderMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdPartyAfterSaleItemMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdPartyOrderMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdPartyReturnLogisticsMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/ThirdReceiverInfoMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/mapper/WarehousingNoticeMapper.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/properties/DataHierarchyProperties.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/properties/OrderProperties.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/remote/api/RemoteCustomizeService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/remote/api/impl/RemoteCustomizeServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/AfterSaleHeaderRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/AfterSaleItemLineRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/AfterSaleItemRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/AfterSaleLogisticsRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/AfterSaleReceiverInfoRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/AfterSalesReasonRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/CouponRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/DeliveryLogRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/HeaderRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ItemLinePriceRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ItemLineRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ItemPriceRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ItemRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ItemSnapshotRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/OperateLogRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/OrderLogisticsRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/PriceRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ProcessDefineRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ReceiverInfoRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/RelatedRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ServiceLogRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdHeaderRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdItemRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdPartyAfterReceiverInfoRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdPartyAfterSaleHeaderRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdPartyAfterSaleItemRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdPartyOrderRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdPartyReturnLogisticsRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/ThirdReceiverInfoRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/repository/impl/WarehousingNoticeRepositoryImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/CollectorsUtil.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/Dates.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/EsBoolQueryUtil.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/JsonUtils.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/ListUtil.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/ObjectUtils.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/OrderTagsUtils.java create mode 100644 skyer-order/src/main/java/org/skyer/order/infra/util/ToBigDecimalFunction.java create mode 100644 skyer-order/src/main/java/org/skyer/order/saga/IOrderService.java create mode 100644 skyer-order/src/main/java/org/skyer/order/saga/impl/IOrderServiceImpl.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/AbstractEventProcessor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/AbstractStateProcessor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/EventDoAction.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/FsmOrder.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/OrderEventsEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/OrderExtraData.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/OrderProcessor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/OrderStateEvent.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/OrderStatusEnum.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/ServiceResult.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/StateActionStep.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/StateContext.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/StateProcessor.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/TestClass.java create mode 100644 skyer-order/src/main/java/org/skyer/order/statemachine/service/PreemptionAction.java create mode 100644 skyer-order/src/main/resources/application.yml create mode 100644 skyer-order/src/main/resources/banner.txt create mode 100644 skyer-order/src/main/resources/bootstrap.yml create mode 100644 skyer-order/src/main/resources/mapper/AfterSaleHeaderMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/AfterSaleItemLineMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/AfterSaleItemMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/AfterSaleLogisticsMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/AfterSaleReceiverInfoMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/AfterSalesReasonMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/DeliveryLogMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/HeaderMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ItemLineMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ItemLinePriceMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ItemMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ItemPriceMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ItemSnapshotMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/OperateLogMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/OrderLogisticsMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/PriceMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ProcessDefineMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ReceiverInfoMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/RelatedMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ServiceLogMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdHeaderMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdItemMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdPartyAfterReceiverInfoMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdPartyAfterSaleHeaderMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdPartyAfterSaleItemMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdPartyOrderMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdPartyReturnLogisticsMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/ThirdReceiverInfoMapper.xml create mode 100644 skyer-order/src/main/resources/mapper/WarehousingNoticeMapper.xml create mode 100644 skyer-order/src/main/resources/messages/messages_hpfm_en_US.properties create mode 100644 skyer-order/src/main/resources/messages/messages_hpfm_zh_CN.properties create mode 100644 skyer-order/src/main/resources/order-send.bpmn create mode 100644 skyer-order/src/main/resources/static/js/babel.min.js create mode 100644 skyer-order/src/test/java/org/skyer/order/EsTest.java create mode 100644 skyer-order/src/test/java/org/skyer/order/OrderEsTest.java create mode 100644 skyer-stock/.gitignore create mode 100644 skyer-stock/.gitlab-ci.yml create mode 100644 skyer-stock/charts/skyer-stock/Chart.yaml create mode 100644 skyer-stock/charts/skyer-stock/README.md create mode 100644 skyer-stock/charts/skyer-stock/templates/_helpers.tpl create mode 100644 skyer-stock/charts/skyer-stock/templates/deployment.yaml create mode 100644 skyer-stock/charts/skyer-stock/templates/service.yaml create mode 100644 skyer-stock/charts/skyer-stock/values.yaml create mode 100644 skyer-stock/docker/Dockerfile create mode 100644 skyer-stock/init-local-database.sh create mode 100644 skyer-stock/pom.xml create mode 100644 skyer-stock/sql/sstock_adjust_detail.sql create mode 100644 skyer-stock/sql/sstock_adjust_record.sql create mode 100644 skyer-stock/sql/sstock_change_log.sql create mode 100644 skyer-stock/sql/sstock_goods_stock_detail.sql create mode 100644 skyer-stock/sql/sstock_outbound_delivery_order.sql create mode 100644 skyer-stock/sql/sstock_outbound_delivery_order_detail.sql create mode 100644 skyer-stock/sql/sstock_result_detail.sql create mode 100644 skyer-stock/sql/sstock_result_record.sql create mode 100644 skyer-stock/sql/sstock_shop_warehouse.sql create mode 100644 skyer-stock/sql/sstock_storage_area.sql create mode 100644 skyer-stock/sql/sstock_warehouse.sql create mode 100644 skyer-stock/sql/sstock_warehouse_result.sql create mode 100644 skyer-stock/sql/sstock_warehouse_result_detail.sql create mode 100644 skyer-stock/sql/sstock_warehouse_warrant.sql create mode 100644 skyer-stock/sql/sstock_warehouse_warrant_detail.sql create mode 100644 skyer-stock/sql/sstock_warehouse_warrant_logistics.sql create mode 100644 skyer-stock/sql/注意 create mode 100644 skyer-stock/src/main/java/org/skyer/autoconfigure/stock/EnableSkyerStock.java create mode 100644 skyer-stock/src/main/java/org/skyer/autoconfigure/stock/StockAutoConfiguration.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/StockApplication.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/AdjustRecordController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/ChangeLogController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/GoodsStockController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/OutboundDeliveryOrderController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/ResultRecordController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/StorageAreaController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/WarehouseController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/WarehouseResultController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/controller/v1/WarehouseWarrantController.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/AdjustDetailsReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/AdjustPageReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/AdjustRecordReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/AdjustSagaDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/AuditReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/BatchRemoveDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/CodeAndIdDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/EsStockVersionDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/ExeAllocationDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/GoodsStockDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/LogisticsResultDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/NeedOrderDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/OutboundDeliveryOrderDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/OutboundDeliveryOrderDetailDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/OutboundDeliveryOrderDetailLineDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/OutboundDeliveryOrderInfoDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/OutboundDeliveryOrderPageDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/PageReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/ReplenishmentPreemptionDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/ResultRecordDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/ResultRecordPageDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/ShopDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/StockChangeListDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/StockEsDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/StockQueryReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/StorageAreaDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/StorageAreaListReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseQueryReqDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseResultPageQueryDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseWarrantDetailDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseWarrantLogisticsDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseWarrantPageQueryDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseWarrantResultDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/api/dto/WarehouseWarrantSaveDTO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/config/StockExtraDataManager.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/config/StockSwaggerApiConfig.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/AdjustDetail.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/AdjustRecord.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/ChangeLog.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/GoodsStockDetail.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/OutboundDeliveryOrder.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/OutboundDeliveryOrderDetail.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/ResultDetail.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/ResultRecord.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/ShopWarehouse.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/StorageArea.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/Warehouse.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/WarehouseResult.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/WarehouseResultDetail.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/WarehouseWarrant.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/WarehouseWarrantDetail.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/entity/WarehouseWarrantLogistics.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/AdjustDetailRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/AdjustRecordRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/ChangeLogRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/GoodsStockDetailRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/OutboundDeliveryOrderDetailRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/OutboundDeliveryOrderRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/ResultDetailRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/ResultRecordRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/ShopWarehouseRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/StorageAreaRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/WarehouseRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/WarehouseResultDetailRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/WarehouseResultRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/WarehouseWarrantDetailRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/WarehouseWarrantLogisticsRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/repository/WarehouseWarrantRepository.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/AdjustRecordService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/ChangeLogService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/ComputeAvailableStockService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/OutboundDeliveryOrderService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/ResultRecordService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/StockEsService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/StorageAreaService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/WarehouseResultService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/WarehouseService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/WarehouseWarrantService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/AdjustRecordServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/ChangeLogServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/ComputeAvailableStockServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/OutboundDeliveryOrderServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/ResultRecordServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/StockEsServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/StorageAreaServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/WarehouseResultServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/WarehouseServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/impl/WarehouseWarrantServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/saga/StockService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/saga/impl/ExeStockServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/saga/impl/SkuQtyAdjustServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/service/saga/impl/StockServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/AdjustDetailResVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/AdjustRecordPageResVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/AdjustRecordResVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/AreaInfoDetailsVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/GoodsStockResVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/LogisticsResultVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/OdoQtyVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/OutboundDeliveryOrderInfoVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/OutboundDeliveryOrderListVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/ResultRecordInfoVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/ResultRecordListVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/ResultRecordQtyVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/RpcGoodsResVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/StockChangeListVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/StockChangeVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/StorageAreaListVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseQueryResVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseResultInfoVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseResultQtyVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseResultVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseWarrantInfoLogisticsVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseWarrantInfoVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseWarrantQtyVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/domain/vo/WarehouseWarrantVO.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/annocations/DatasourceType.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/constant/ObjectConstant.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/convertor/AdjustRecordConvertor.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/convertor/CommonConvertor.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/convertor/StockEsConvertor.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/feign/GoodsSkuRemoteService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/feign/SkyerPlatformRemoteService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/feign/UserDetailRemoteService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/feign/impl/GoodsSkuRemoteServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/feign/impl/SkyerPlatformRemoteServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/feign/impl/UserDetailRemoteServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/AdjustDetailMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/AdjustRecordMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/ChangeLogMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/GoodsStockDetailMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/OutboundDeliveryOrderDetailMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/OutboundDeliveryOrderMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/ResultDetailMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/ResultRecordMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/ShopWarehouseMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/StorageAreaMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/WarehouseMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/WarehouseResultDetailMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/WarehouseResultMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/WarehouseWarrantDetailMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/WarehouseWarrantLogisticsMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/mapper/WarehouseWarrantMapper.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/properties/DataHierarchyProperties.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/properties/StockProperties.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/remote/api/RemoteCustomizeService.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/remote/api/impl/RemoteCustomizeServiceImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/AdjustDetailRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/AdjustRecordRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/ChangeLogRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/GoodsStockDetailRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/OutboundDeliveryOrderDetailRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/OutboundDeliveryOrderRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/ResultDetailRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/ResultRecordRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/ShopWarehouseRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/StorageAreaRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/WarehouseRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/WarehouseResultDetailRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/WarehouseResultRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/WarehouseWarrantDetailRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/WarehouseWarrantLogisticsRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/repository/impl/WarehouseWarrantRepositoryImpl.java create mode 100644 skyer-stock/src/main/java/org/skyer/stock/infra/util/EsBoolQueryUtil.java create mode 100644 skyer-stock/src/main/resources/application.yml create mode 100644 skyer-stock/src/main/resources/banner.txt create mode 100644 skyer-stock/src/main/resources/bootstrap.yml create mode 100644 skyer-stock/src/main/resources/mapper/AdjustDetailMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/AdjustRecordMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/ChangeLogMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/GoodsStockDetailMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/OutboundDeliveryOrderDetailMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/OutboundDeliveryOrderMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/ResultDetailMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/ResultRecordMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/ShopWarehouseMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/StorageAreaMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/WarehouseMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/WarehouseResultDetailMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/WarehouseResultMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/WarehouseWarrantDetailMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/WarehouseWarrantLogisticsMapper.xml create mode 100644 skyer-stock/src/main/resources/mapper/WarehouseWarrantMapper.xml create mode 100644 skyer-stock/src/main/resources/messages/messages_hpfm_en_US.properties create mode 100644 skyer-stock/src/main/resources/messages/messages_hpfm_zh_CN.properties create mode 100644 skyer-stock/src/main/resources/static/js/babel.min.js diff --git a/skyer-goods/.gitignore b/skyer-goods/.gitignore new file mode 100644 index 0000000..b4ce6f3 --- /dev/null +++ b/skyer-goods/.gitignore @@ -0,0 +1,103 @@ +#====================================================================================================================== +#========================================= gitignore的基础用法 ========================================= +#====================================================================================================================== +# 一.基础语法 +# .gitignore配置文件的一些通用技巧 [参考:https://git-scm.com/docs/gitignore] +# 1.空白行不匹配任何文件,所以可以作为可读性的分隔符,同时两端的空格将会被忽略. +# 2.使用[#]开头,将会注释掉整行,使其不进行匹配操作,如果需要匹配#开头,可以使用转义字符[\]. +# 3.1匹配模式以[/]结尾,表示想要匹配一个目录及其子文件.(比如[foo/]会匹配foo目录及其下面的路径.) +# 3.2匹配模式不包含[/],将会全局匹配该文件. +# 4.通配符 +# [*]: 匹配除[/]以外的任何内容,也就意味着[*]不能跨目录. +# [?]: 匹配除[/]和[[]以及[]]以外的任何一个字符. +# [**]: 匹配所有的内容,或者说匹配任意目录下的内容. +# 示例: +# 1.[**/foo/bar] 将会匹配所有直接在foo目录下的bar,无论foo处在何处. +# 2.[foo/**]则表示匹配foo目录下的所有文件和目录. +# 3.[a/**/b]则可以匹配a/b, a/c/b, a/c/d/b,即此处的[**]可以表示0个或多个. +# !!! 需要注意的是,除上面示例的用法外,剩余的[**]都是无效的.. +# 5.可以通过前缀[!]来表示不忽略某些文件,比如可以通过[!a]来确保文件a不会被忽略,即时前面已经声明了忽略其父目录,该模式优先级高于普通忽略模式. +# 二.常用命令 +# 1.git -rm [https://git-scm.com/docs/git-rm] +# 删除文件索引,或者同时删除文件索引和物理文件.可以使用通配符. +# 2.git-check-ignore [https://git-scm.com/docs/git-check-ignore] +# 调试.gitignore文件 +# 三.注意事项 +# 1.如果文件已经被git管理,那么后续添加的忽略模式将不会生效,具体解决方法,参考<<二.常用命令>>. + +#======================================================================================================================= +#============================== java忽略文件 ===================================== +#===================== https://github.com/github/gitignore/blob/master/Java.gitignore ================== +#======================================================================================================================= +# 编译后的class文件,忽略所有以[.class]结尾的文件 +*.class + +# 日志文件,忽略所有以[.log]结尾的文件. +*.log + +# BlueJ 文件,忽略所有以[.ctxt]结尾的文件. +*.ctxt + +# Mobile Tools for Java (J2ME),忽略[.mtj.tmp/]目录及其子文件. +.mtj.tmp/ + +# 打包文件,忽略所有以[.jar]或[.war]或[.nar]或[.ear]或[.zip]或[.tar.gz]或[rar]结尾的文件. +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# 虚拟机崩溃日志,忽略所有以[hs_err_pid]开头的文件.[see http://www.java.com/en/download/help/error_hotspot.xml] +hs_err_pid* +#======================================================================================================================= +#============================== maven忽略文件 =================================== +#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ================== +#======================================================================================================================= +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) +!/.mvn/wrapper/maven-wrapper.jar +#======================================================================================================================= +#============================== IDE环境忽略文件 ================================== +#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ================== +#======================================================================================================================= +#----------------IDEA------------- +.idea/* +.idea/compiler.xml +.idea/encodings.xml +.idea/modules.xml +*.iml +#======================================================================================================================= +#============================== other环境忽略文件 ================================ +#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ================== +#======================================================================================================================= +*.sw? +.#* +*# +*~ +.classpath +.project +.settings/ +bin +build +target +dependency-reduced-pom.xml +*.sublime-* +/scratch +.gradle +Guardfile +README.html +*.iml +.idea +*/.DS_Store +.DS_Store \ No newline at end of file diff --git a/skyer-goods/.gitlab-ci.yml b/skyer-goods/.gitlab-ci.yml new file mode 100644 index 0000000..a4cb8cf --- /dev/null +++ b/skyer-goods/.gitlab-ci.yml @@ -0,0 +1,11 @@ +include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/ce450dff-5aa0-47a1-b397-6f0a71aed0c2/content.yaml + +#include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/3db66342-8915-49a4-b4e0-c0e57c08c657/content.yaml +# +##include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/b2617c66-8f9a-4dca-9e4a-977a83404093/content.yaml +## +###include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/a814fa4b-e039-4a7d-8bcf-e060b751925d/content.yaml +### +####include: http://api.baogicloud.com/devops/v1/projects/204888765897510912/ci_contents/pipelines/0cfdcff6-6fe6-43dd-a5d0-9db2c866a451/content.yaml +#### +#####include: http://api.baogicloud.com/devops/v1/projects/187577360164982784/ci_contents/pipelines/903880b5-824b-42c1-9088-2f59c0598f7e/content.yaml \ No newline at end of file diff --git a/skyer-goods/charts/skyer-goods/Chart.yaml b/skyer-goods/charts/skyer-goods/Chart.yaml new file mode 100644 index 0000000..0521077 --- /dev/null +++ b/skyer-goods/charts/skyer-goods/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for Kubernetes +name: skyer-goods +version: 0.1.0 diff --git a/skyer-goods/charts/skyer-goods/README.md b/skyer-goods/charts/skyer-goods/README.md new file mode 100644 index 0000000..a7e731a --- /dev/null +++ b/skyer-goods/charts/skyer-goods/README.md @@ -0,0 +1,81 @@ +# skyer Base Service +基于Spring Cloud Goods的微服务商品中心服务 +## Introduction + +## Add Helm chart repository + +``` bash +helm repo add skyer https://chart.skyer.com.cn/skyer/c7n +helm repo update +``` + +## Installing the Chart + +```bash +$ helm install c7n/skyer-platform --name skyer-platform +``` + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. + +## Uninstalling the Chart + +```bash +$ helm delete skyer-platform +``` + +## Configuration + +Parameter | Description | Default +--- | --- | --- +`replicaCount` | pod运行数量 | `1` +`image.repository` | 镜像库地址 | `registry.skyer.com.cn/skyer/skyer-platform` +`image.pullPolicy` | 镜像拉取策略 | `IfNotPresent` +`preJob.timeout` | job超时时间 | `300` +`preJob.image` | job镜像库地址 | `registry.cn-hangzhou.aliyuncs.com/skyer-tools/dbtool:0.6.4` +`metrics.path` | 收集应用的指标数据路径 | `/actuator/prometheus` +`metrics.group` | 性能指标应用分组 | `spring-boot` +`logs.parser` | 日志收集格式 | `spring-boot` +`deployment.managementPort` | 服务管理端口 | `8101` +`ingress.enabled` | 是否创建k8s ingress | `false` +`env.open.SPRING_DATASOURCE_URL` | 数据库连接地址 | `jdbc:mysql://localhost/base_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true` +`env.open.SPRING_DATASOURCE_USERNAME` | 数据库用户名 | `skyer` +`env.open.SPRING_DATASOURCE_PASSWORD` | 数据库密码 | `password` +`env.open.SPRING_REDIS_HOST` | redis主机地址 | `localhost` +`env.open.SPRING_REDIS_PORT` | redis端口 | `6379` +`env.open.SPRING_REDIS_DATABASE` | redis db | `1` +`env.open.EUREKA_CLIENT_SERVICEURL_DEFAULTZONE` | 注册服务地址 | `http://register-server:8000/eureka/` +`service.enabled` | 是否创建k8s service | `false` +`service.type` | service类型 | `ClusterIP` +`service.port` | service端口 | `8100` +`service.name` | service名称 | `skyer-platform` +`resources.limits` | k8s中容器能使用资源的资源最大值 | `3Gi` +`resources.requests` | k8s中容器使用的最小资源需求 | `2Gi` + +### SkyWalking Configuration +Parameter | Description +--- | --- +`javaagent` | SkyWalking 代理jar包(添加则开启 SkyWalking,删除则关闭) +`skywalking.agent.application_code` | SkyWalking 应用名称 +`skywalking.agent.sample_n_per_3_secs` | SkyWalking 采样率配置 +`skywalking.agent.namespace` | SkyWalking 跨进程链路中的header配置 +`skywalking.agent.authentication` | SkyWalking 认证token配置 +`skywalking.agent.span_limit_per_segment` | SkyWalking 每segment中的最大span数配置 +`skywalking.agent.ignore_suffix` | SkyWalking 需要忽略的调用配置 +`skywalking.agent.is_open_debugging_class` | SkyWalking 是否保存增强后的字节码文件 +`skywalking.collector.backend_service` | SkyWalking OAP 服务地址和端口配置 + +```bash +$ helm install c7n/skyer-platform \ + --set env.open.SKYWALKING_OPTS="-javaagent:/agent/skywalking-agent.jar -Dskywalking.agent.application_code=skyer-platform -Dskywalking.agent.sample_n_per_3_secs=-1 -Dskywalking.collector.backend_service=oap.skywalking:11800" \ + --name skyer-platform +``` + +## 验证部署 +```bash +curl -s $(kubectl get po -n c7n-system -l skyer.io/release=skyer-platform -o jsonpath="{.items[0].status.podIP}"):8081/actuator/health | jq -r .status +``` +出现以下类似信息即为成功部署 + +```bash +UP +``` \ No newline at end of file diff --git a/skyer-goods/charts/skyer-goods/templates/_helpers.tpl b/skyer-goods/charts/skyer-goods/templates/_helpers.tpl new file mode 100644 index 0000000..92e3d91 --- /dev/null +++ b/skyer-goods/charts/skyer-goods/templates/_helpers.tpl @@ -0,0 +1,28 @@ +{{/* vim: set filetype=mustache: */}} +{{- /* +service.labels.standard prints the standard service Helm labels. +The standard labels are frequently used in metadata. +*/ -}} + +{{- define "service.image" -}} +{{- printf "%s:%s" .Values.image.repository (default (.Chart.Version) .Values.image.tag) -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "app.deployment.apiVersion" -}} +{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} +{{- print "apps/v1beta2" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + + +{{- define "service.labels.kubesphere" -}} +app: {{ .Release.Name | quote }} +app.kubernetes.io/name: {{ .Values.kubesphere.app.name | quote }} +app.kubernetes.io/version: {{ .Values.kubesphere.app.version | quote }} +version: {{ .Values.kubesphere.app.version | quote }} +{{- end -}} \ No newline at end of file diff --git a/skyer-goods/charts/skyer-goods/templates/deployment.yaml b/skyer-goods/charts/skyer-goods/templates/deployment.yaml new file mode 100644 index 0000000..27741cf --- /dev/null +++ b/skyer-goods/charts/skyer-goods/templates/deployment.yaml @@ -0,0 +1,121 @@ +apiVersion: {{ include "app.deployment.apiVersion" . }} +kind: Deployment +metadata: + name: {{ .Release.Name }} + labels: +{{ include "service.labels.kubesphere" . | indent 4 }} + annotations: + deployment.kubernetes.io/revision: '1' + kubesphere.io/creator: {{ .Values.kubesphere.app.creator | quote }} + servicemesh.kubesphere.io/enabled: '{{ .Values.kubesphere.app.servicemesh }}' +spec: + strategy: + type: {{ .Values.deploymentUpdate.type }} + {{- if eq .Values.deploymentUpdate.type "RollingUpdate" }} + rollingUpdate: + maxSurge: {{ .Values.deploymentUpdate.maxSurge }} + maxUnavailable: {{ .Values.deploymentUpdate.maxUnavailable }} + {{- else }} + rollingUpdate: null + {{- end}} + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: +{{ include "service.labels.kubesphere" . | indent 6 }} + template: + metadata: + annotations: + sidecar.istio.io/inject: '{{ .Values.kubesphere.app.servicemesh }}' + labels: +{{ include "service.labels.kubesphere" . | indent 8 }} + spec: + volumes: + - name: host-time + hostPath: + path: /etc/localtime + type: '' + - name: data + {{- if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim | default ( .Release.Name ) }} + {{- else }} + emptyDir: {} + {{- end }} + containers: + - name: {{ .Release.Name }} + image: {{ include "service.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- range $name, $value := .Values.env.open }} + {{- if ne (len ($value | quote)) 0 }} + - name: {{ $name | quote }} + value: {{ $value | quote }} + {{- end }} + {{- end }} + ports: + - name: http-{{ .Values.service.port }} + containerPort: {{ .Values.service.port }} + protocol: TCP + {{- if not (empty .Values.deployment.managementPort) }} + - name: http-{{ .Values.deployment.managementPort }} + containerPort: {{ .Values.deployment.managementPort }} + protocol: TCP + {{- end }} + readinessProbe: + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + exec: + command: + - /bin/sh + - -c + - > + nc -z localhost {{ .Values.env.open.SERVER_PORT }} + && curl -s --fail localhost:{{ .Values.env.open.MANAGEMENT_SERVER_PORT }}/actuator/health + livenessProbe: + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + exec: + command: + - /bin/sh + - -c + - > + nc -z localhost {{ .Values.env.open.SERVER_PORT }} + && curl -s --fail localhost:{{ .Values.env.open.MANAGEMENT_SERVER_PORT }}/actuator/health + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: host-time + readOnly: true + mountPath: /etc/localtime + - mountPath: /Charts + name: data + {{- if not (empty .Values.persistence.subPath) }} + subPath: {{ .Values.persistence.subPath }} + {{- end }} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + restartPolicy: Always + terminationGracePeriodSeconds: 30 + dnsPolicy: ClusterFirst + serviceAccountName: default + serviceAccount: default + securityContext: {} + schedulerName: default-scheduler +{{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} +{{- end }} +{{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} +{{- end }} +{{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} +{{- end }} \ No newline at end of file diff --git a/skyer-goods/charts/skyer-goods/templates/service.yaml b/skyer-goods/charts/skyer-goods/templates/service.yaml new file mode 100644 index 0000000..9cd5099 --- /dev/null +++ b/skyer-goods/charts/skyer-goods/templates/service.yaml @@ -0,0 +1,41 @@ +{{- if .Values.service.enabled }} +kind: Service +apiVersion: v1 +metadata: + name: {{ .Release.Name }} + labels: +{{ include "service.labels.kubesphere" . | indent 4 }} + annotations: + kubesphere.io/creator: {{ .Values.kubesphere.app.creator }} + kubesphere.io/serviceType: {{ .Values.kubesphere.app.serviceType | quote }} + {{- if .Values.kubesphere.app.ingress }} + service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids: '' + service.beta.kubernetes.io/qingcloud-load-balancer-type: '0' + {{- end }} + servicemesh.kubesphere.io/enabled: '{{ .Values.kubesphere.app.servicemesh }}' +spec: + ports: + - name: http-{{ .Values.service.port }} + protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} + {{- if not (empty .Values.service.nodePort) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + {{- if not (empty .Values.deployment.managementPort) }} + - name: http-{{ .Values.deployment.managementPort }} + protocol: TCP + port: {{ .Values.deployment.managementPort }} + targetPort: {{ .Values.deployment.managementPort }} + {{- if not (empty .Values.deployment.nodePort) }} + nodePort: {{ .Values.deployment.nodePort }} + {{- end }} + {{- end }} + selector: +{{ include "service.labels.kubesphere" . | indent 4 }} + type: {{ .Values.service.type | quote }} + sessionAffinity: None + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + {{- end }} \ No newline at end of file diff --git a/skyer-goods/charts/skyer-goods/values.yaml b/skyer-goods/charts/skyer-goods/values.yaml new file mode 100644 index 0000000..ff506d0 --- /dev/null +++ b/skyer-goods/charts/skyer-goods/values.yaml @@ -0,0 +1,128 @@ +## 实例运行数量 +replicaCount: 1 + +## 设置默认的 image、imageTag 和 imagePullPolicy。 +image: + repository: harbor.k8s9.com/k8s9-skyer-ebc/skyer-goods + pullPolicy: IfNotPresent + +deployment: + managementPort: 8311 + nodePort: + +kubesphere: + app: + name: ebc + version: v1 + creator: admin + servicemesh: true + # statelessservice statefulservice + serviceType: statelessservice + ingress: false + +## Deployment 更新策略 +deploymentUpdate: + type: RollingUpdate + maxUnavailable: 25% + maxSurge: 25% + +## Pod 节点分配 +## ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} +tolerations: [] +affinity: {} +## 实例运行时的环境变量 +env: + open: + # 本实例服务端口 + SERVER_PORT: 8310 + # 本实例管理端口 + MANAGEMENT_SERVER_PORT: 8311 + + # 是否启用配置中心 + SPRING_CLOUD_CONFIG_ENABLED: false + # 配置中心地址 + SPRING_CLOUD_CONFIG_URI: http://skyer-config:8010 + + # Redis 主机地址 + SPRING_REDIS_HOST: skyer-redis + # Redis 端口 + SPRING_REDIS_PORT: 6379 + # Redis db 固定数据不可更改 + SPRING_REDIS_DATABASE: 1 + + # 数据库连接地址 + SPRING_DATASOURCE_URL: jdbc:mysql://skyer-mysql:3306/skyer_goods?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true&serverTimezone=Asia/Shanghai + # 数据库用户名 + SPRING_DATASOURCE_USERNAME: root + # 数据库密码 + SPRING_DATASOURCE_PASSWORD: 123456 + + # 注册服务地址 + EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://skyer-register:8000/eureka/ + + EUREKA_INSTANCE_PREFER_IP_ADDRESS: true + + # 项目级API是否必须检查项目参数 + SKYER_GATEWAY_FILTER_COMMON_REQUEST_CHECK_PROJECT: true + # 组织级API是否必须检查组织参数 + SKYER_GATEWAY_FILTER_COMMON_REQUEST_CHECK_ORGANIZATION: true + # 是否启用标准的权限检查 + SKYER_GATEWAY_FILTER_COMMON_REQUEST_ENABLE: true + # 是否统计API访问情况 + SKYER_GATEWAY_FILTER_COLLECT_SPAN_ENABLED: true + # 是否打印 JWT + SKYER_GATEWAY_HELPER_ENABLE_JWT_LOG: false + # 主键加密配置 encrypt(主键加密) to_string(主键变字符串类型) do_nothing(关闭加密) + SKYER_REQUEST_ENCRYPT_MODE: encrypt + LOG_LEVEL: info + SKYER_GATEWAY_AUTHENTICATE_REDIS: true + + # 百分比使用物理内存,预留一部分用于堆外内存以及外部程序 + JAVA_OPTS: >- + -XX:MaxRAMPercentage=80.0 + +## Liveness 和 Readiness 探针相关配置 +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/ +livenessProbe: + initialDelaySeconds: 180 + periodSeconds: 30 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 +readinessProbe: + initialDelaySeconds: 5 + periodSeconds: 15 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + +## 资源请求和限制相关配置 +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## +resources: + limits: + cpu: 900m + memory: 2Gi + requests: + cpu: 100m + memory: 2Gi + +## service 相关设置 +## ref: http://kubernetes.io/docs/user-guide/services/ +## +service: + enabled: true + # LoadBalancer ClusterIP + type: ClusterIP + port: 8310 + nodePort: + +persistence: + enabled: false + ## A manually managed Persistent Volume and Claim + ## Requires persistence.enabled: true + ## If defined, PVC must be created manually before volume will be bound + # existingClaim: + # subPath: diff --git a/skyer-goods/docker/Dockerfile b/skyer-goods/docker/Dockerfile new file mode 100644 index 0000000..d9129d1 --- /dev/null +++ b/skyer-goods/docker/Dockerfile @@ -0,0 +1,6 @@ +FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:0.10.0 +RUN mkdir /skyer && chown -R www-data:www-data /skyer +COPY --chown=www-data:www-data app.jar /skyer/skyer-goods.jar +WORKDIR /skyer +USER 33 +CMD java $JAVA_OPTS $SKYWALKING_OPTS -jar /skyer/skyer-goods.jar \ No newline at end of file diff --git a/skyer-goods/init-local-database.sh b/skyer-goods/init-local-database.sh new file mode 100644 index 0000000..8ed6dca --- /dev/null +++ b/skyer-goods/init-local-database.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +mkdir -p target +if [ ! -f target/skyer-tool-liquibase.jar ] +then + curl https://nexus.skyer.com.cn/repository/skyer-release/io/skyer/skyer-tool-liquibase/0.8.1.RELEASE/skyer-tool-liquibase-0.8.1.RELEASE.jar -o target/skyer-tool-liquibase.jar +fi + +java -Dspring.datasource.url="jdbc connection url" \ + -Dspring.datasource.username=username \ + -Dspring.datasource.password=password \ + -Ddata.drop=false -Ddata.init=init \ + -Ddata.dir=src/main/resources \ + -jar target/skyer-tool-liquibase.jar diff --git a/skyer-goods/pom.xml b/skyer-goods/pom.xml new file mode 100644 index 0000000..2688957 --- /dev/null +++ b/skyer-goods/pom.xml @@ -0,0 +1,346 @@ + + + 4.0.0 + + + org.skyer + skyer-parent + 1.0.0-SNAPSHOT + + skyer-goods + + + + 1.18.16 + 1.3.1.Final + + + + + org.skyer.starter + skyer-starter-core + + + org.skyer.starter + skyer-starter-mybatis-mapper + + + org.skyer.starter + skyer-starter-export + + + org.skyer.starter + skyer-starter-feign-replay + + + org.skyer.starter + skyer-starter-websocket + + + org.skyer.starter + skyer-starter-config-client + + + org.skyer.starter + skyer-starter-metric + + + org.skyer.starter + skyer-starter-keyencrypt + + + + + org.skyer.boot + skyer-boot-iam + + + org.skyer.boot + skyer-boot-platform + + + org.skyer.boot + skyer-boot-message + + + org.skyer.boot + skyer-boot-scheduler + + + + org.skyer.boot + skyer-boot-customize + + + + + + org.skyer.boot + skyer-boot-api-customize + + + + + + + + + + + + + mysql + mysql-connector-java + true + + + com.oracle + ojdbc7 + true + + + com.microsoft.sqlserver + sqljdbc4 + true + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + + org.springframework.boot + spring-boot-starter-undertow + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter-websocket + + + + com.squareup.retrofit2 + retrofit + + + com.squareup.retrofit2 + converter-jackson + + + + + org.apache.commons + commons-lang3 + + + org.apache.commons + commons-collections4 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + + + org.mybatis + mybatis-typehandlers-jsr310 + 1.0.2 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.spockframework + spock-core + test + + + org.spockframework + spock-spring + test + + + cglib + cglib-nodep + test + + + + com.jcraft + jsch + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + true + + + org.springframework.cloud + spring-cloud-config-client + true + + + + org.projectlombok + lombok + true + + + cn.hutool + hutool-all + 5.7.2 + + + org.skyer.starter + skyer-starter-saga + + + org.skyer.boot + skyer-boot-search + 1.0.0-SNAPSHOT + + + + + app + + + src/main/java + + **/*.properties + + true + + + src/main/resources + + **/** + + + saml/*.jks + + true + + + src + + **/*.sh + + true + + + + + org.apache.maven.plugins + maven-resources-plugin + + + xlsx + xls + ttf + ttc + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + ${project.build.sourceEncoding} + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + ${maven.javadoc.skip} + + + + attach-javadocs + package + + jar + + + + + -Xdoclint:none + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + false + + + + + repackage + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*Test.java + **/*Spec.java + + + + + + + + diff --git a/skyer-goods/src/main/java/org/skyer/autoconfigure/goods/EnableSkyerGoods.java b/skyer-goods/src/main/java/org/skyer/autoconfigure/goods/EnableSkyerGoods.java new file mode 100644 index 0000000..b645de3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/autoconfigure/goods/EnableSkyerGoods.java @@ -0,0 +1,16 @@ +package org.skyer.autoconfigure.goods; + +import java.lang.annotation.*; + +import org.springframework.context.annotation.Import; + +/** + * @author bojiangzhou 2018/10/25 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import(GoodsAutoConfiguration.class) +public @interface EnableSkyerGoods { + +} diff --git a/skyer-goods/src/main/java/org/skyer/autoconfigure/goods/GoodsAutoConfiguration.java b/skyer-goods/src/main/java/org/skyer/autoconfigure/goods/GoodsAutoConfiguration.java new file mode 100644 index 0000000..7349667 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/autoconfigure/goods/GoodsAutoConfiguration.java @@ -0,0 +1,55 @@ +package org.skyer.autoconfigure.goods; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.skyer.goods.infra.properties.DataHierarchyProperties; +import org.skyer.goods.infra.properties.GoodsProperties; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.annotation.EnableAsync; + +import org.skyer.resource.annoation.EnableSkyerResourceServer; + +import org.skyer.core.jackson.annotation.EnableObjectMapper; +import org.skyer.core.util.CommonExecutor; + +/** + * @author bojiangzhou 2018/10/25 + */ +@ComponentScan(value = {"org.hippius.wd", "org.skyer.goods.api", "org.skyer.goods.app", + "org.skyer.goods.config", "org.skyer.goods.domain", "org.skyer.goods.infra"}) +@EnableFeignClients({"org.skyer.goods", "org.skyer", "org.skyer.plugin"}) +@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true) +@EnableSkyerResourceServer +@EnableObjectMapper +@EnableAsync +@EnableConfigurationProperties({GoodsProperties.class, DataHierarchyProperties.class}) +public class GoodsAutoConfiguration { + + /** + * 通用线程池 + */ + @Bean + @Qualifier("commonAsyncTaskExecutor") + public ThreadPoolExecutor commonAsyncTaskExecutor() { + int coreSize = CommonExecutor.getCpuProcessors(); + int maxSize = coreSize * 8; + ThreadPoolExecutor executor = + new ThreadPoolExecutor(coreSize, maxSize, 30, TimeUnit.MINUTES, new LinkedBlockingQueue<>(16), + new ThreadFactoryBuilder().setNameFormat("CommonExecutor-%d").build(), + new ThreadPoolExecutor.CallerRunsPolicy()); + + CommonExecutor.displayThreadPoolStatus(executor, "HpfmCommonExecutor"); + CommonExecutor.hookShutdownThreadPool(executor, "HpfmCommonExecutor"); + + return executor; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/GoodsApplication.java b/skyer-goods/src/main/java/org/skyer/goods/GoodsApplication.java new file mode 100644 index 0000000..b2d709b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/GoodsApplication.java @@ -0,0 +1,25 @@ +package org.skyer.goods; + +import org.skyer.autoconfigure.goods.EnableSkyerGoods; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * Skyer平台服务启动类 主要包含平台通用功能 + * + * @author xianzhi.chen@hand-china.com 2018年6月7日下午6:09:44 + */ +@EnableSkyerGoods +@EnableDiscoveryClient +@SpringBootApplication +public class GoodsApplication { + + public static void main(String[] args) { + try { + SpringApplication.run(GoodsApplication.class, args); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/BrandController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/BrandController.java new file mode 100644 index 0000000..90a9be5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/BrandController.java @@ -0,0 +1,88 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.BrandPageReqDTO; +import org.skyer.goods.api.dto.BrandReqDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.api.dto.StatusReqDTO; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.service.BrandService; +import org.skyer.goods.domain.vo.BrandPageResVO; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品品牌管理 + * @description + * @Author wusc + * @create 2021/6/24 9:41 上午 + */ +@RestController("BrandController.v1") +@RequestMapping(value = "/v1/goods/brand") +@Api(tags = GoodsSwaggerApiConfig.GOODS_BRAND) +public class BrandController { + + @Autowired + private BrandService brandService; + + + @ApiOperation(value = "商品品牌查询") + @PostMapping("/page") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + public ResponseEntity> pageBrand(@Valid @RequestBody BrandPageReqDTO brandPageReqDTO){ + return Results.success( brandService.pageBrand(brandPageReqDTO)); + } + + + @ApiOperation(value = "商品品牌查询") + @PostMapping("/list") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + public ResponseEntity> listBrand(@Valid @RequestBody BrandPageReqDTO brandPageReqDTO){ + return Results.success( brandService.listBrand(brandPageReqDTO)); + } + + @ApiOperation(value = "创建商品品牌") + @PostMapping("/brand") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + public ResponseEntity createBrand(@Valid @RequestBody BrandReqDTO brandReqDTO){ + brandService.saveOrUpdateBrand(brandReqDTO); + return Results.success("操作成功"); + } + + @ApiOperation(value = "编辑商品品牌") + @PutMapping("/brand") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + public ResponseEntity updateBrand(@Valid @RequestBody BrandReqDTO brandReqDTO){ + brandService.saveOrUpdateBrand(brandReqDTO); + return Results.success("操作成功"); + } + + + @ApiOperation(value = "删除商品品牌") + @PatchMapping("/batch-delete-brand") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + public ResponseEntity deleteByIds(@RequestBody IdsReqDTO idsReqDTO) { + brandService.deleteBrand(idsReqDTO.getIds()); + return Results.success("操作成功"); + } + + @ApiOperation(value = "更新状态") + @PatchMapping("/status") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + public ResponseEntity updateStatus(@Valid @RequestBody StatusReqDTO statusReqDTO){ + brandService.updateBrandStatus(statusReqDTO.getIds(),statusReqDTO.getStatus()); + return Results.success("操作成功"); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryAttributeController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryAttributeController.java new file mode 100644 index 0000000..e1adc60 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryAttributeController.java @@ -0,0 +1,50 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.core.base.BaseController; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.CategoryAttributeQueryDTO; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.repository.CategoryAttributeRepository; +import org.skyer.goods.domain.vo.CategoryAttributeVO; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +/** + * 商品分类属性表 管理 API + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@RestController("categoryAttributeController.v1") +@RequestMapping("/v1/category/attributes") +@Api(tags = GoodsSwaggerApiConfig.GOODS_CATEGORY_ATTRIBUTE) +public class CategoryAttributeController extends BaseController { + + @Autowired + private CategoryAttributeRepository categoryAttributeRepository; + + @ApiModelProperty(value = "查询商品分类属性表") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/list/category/attribute") + public ResponseEntity> queryCategoryAttribute( + @RequestBody CategoryAttributeQueryDTO param){ + //控制 没有分类id 返回空 + if(ObjectUtils.isEmpty( param.getCategoryId() )){ + return Results.success(new ArrayList<>()); + } + List categoryAttributeList = categoryAttributeRepository.listIncludedValue(param); + return Results.success(categoryAttributeList); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryController.java new file mode 100644 index 0000000..4a2c863 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/CategoryController.java @@ -0,0 +1,100 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.api.dto.CategorySaveDTO; +import org.skyer.goods.api.dto.CategoryTreeQueryDTO; +import org.skyer.goods.api.dto.CategoryUpdateByStatusFlagDTO; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.repository.CategoryRepository; +import org.skyer.goods.domain.service.CategoryManageService; +import org.skyer.goods.domain.vo.CategoryTreeVO; +import org.skyer.goods.domain.vo.CategoryVO; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; + +/** + * 商品分类表 管理 API + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@RestController("categoryController.v1") +@RequestMapping("/v1/categorys") +@Api(tags = GoodsSwaggerApiConfig.GOODS_CATEGORY) +public class CategoryController extends BaseController { + + @Autowired + private CategoryRepository categoryRepository; + + @Autowired + private CategoryManageService categoryManageService; + + @ApiOperation(value = "保存商品分类表") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/save") + public ResponseEntity save(@RequestBody @Valid CategorySaveDTO category) { + categoryManageService.save(category); + return Results.success(); + } + +// @ApiOperation(value = "修改商品分类表") +// @Permission(level = ResourceLevel.ORGANIZATION) +// @PostMapping("/update") +// public ResponseEntity update(@RequestBody Category category) { +// categoryRepository.updateByPrimaryKeySelective(category); +// return Results.success(category); +// } + @ApiOperation(value = "修改商品状态") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/update/status") + public ResponseEntity updateByStatusFlag( + @RequestBody @Valid CategoryUpdateByStatusFlagDTO categoryUpdateByStatusFlagDTO){ + categoryManageService.updateByStatusFlag(categoryUpdateByStatusFlagDTO); + return Results.success(); + } + + @ApiOperation(value = "批量删除商品分类表") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @DeleteMapping("/batch/delete") + public ResponseEntity batchDelete( + @Encrypt @ApiParam(value = "商品分类ids", required = true) @RequestBody List ids){ + + categoryManageService.batchDelete(ids); + + return Results.success(); + } + + @ApiOperation(value = "查询分类列表") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/page") + public ResponseEntity> page( + @RequestBody CategoryQueryDTO categoryQueryDTO ){ + Page categoryPage = categoryManageService.pageIncludedAttr(categoryQueryDTO); + return Results.success(categoryPage); + } + + @ApiOperation(value = "获取分类树") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/tree") + public ResponseEntity> tree( + @RequestBody CategoryTreeQueryDTO queryDTO){ + + List categoryTree = categoryManageService.getCategoryTree(queryDTO); + + return Results.success(categoryTree); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsShopController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsShopController.java new file mode 100644 index 0000000..8dd8903 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsShopController.java @@ -0,0 +1,82 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.ApiOperation; +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.util.Results; +import org.skyer.goods.domain.entity.GoodsShop; +import org.skyer.goods.domain.service.GoodsShopService; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 商品在店铺中的上下架关系表 管理 API + * + * @author chenzz + * @date 2021-06-25 13:36:41 + */ +@RestController("goodsShopController.v1") +@RequestMapping("/v1/goodsshops") +public class GoodsShopController extends BaseController { + + @Autowired + private GoodsShopService goodsShopService; + + /** + * 列表 + */ + @ApiOperation(value = "商品在店铺中的上下架关系表列表") + @GetMapping + public ResponseEntity list(GoodsShop goodsShop, @ApiIgnore @SortDefault(value = GoodsShop.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = goodsShopService.pageAndSort(pageRequest, goodsShop); + return Results.success(list); + } + + + /** + * 详细 + */ + @ApiOperation(value = "商品在店铺中的上下架关系表明细") + @RequestMapping("/{id}") + public ResponseEntity detail(@PathVariable Long id) { + GoodsShop goodsShop = goodsShopService.selectByPrimaryKey(id); + return Results.success(goodsShop); + } + + /** + * 创建 + */ + @ApiOperation(value = "创建商品在店铺中的上下架关系表") + @PostMapping + public ResponseEntity create(@RequestBody GoodsShop goodsShop) { + goodsShopService.insertSelective(goodsShop); + return Results.success(goodsShop); + } + + /** + * 修改 + */ + @ApiOperation(value = "修改商品在店铺中的上下架关系表") + @PutMapping + public ResponseEntity update(@RequestBody GoodsShop goodsShop) { + goodsShopService.updateByPrimaryKeySelective(goodsShop); + return Results.success(goodsShop); + } + + /** + * 删除 + */ + @ApiOperation(value = "删除商品在店铺中的上下架关系表") + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + goodsShopService.deleteByPrimaryKey(id); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsSkuController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsSkuController.java new file mode 100644 index 0000000..5a384be --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/GoodsSkuController.java @@ -0,0 +1,134 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.*; +import org.skyer.goods.app.service.SkuEsService; +import org.skyer.goods.app.service.SkuService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.vo.GoodsSkuDetailVO; +import org.skyer.goods.domain.vo.GoodsSkuPageVO; +import org.skyer.goods.domain.vo.RpcGoodsResVO; +import org.skyer.goods.domain.vo.RpcOrderResVO; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +/** + * 商品sku表 管理 API + * + * @author zhanglb 2021-12-28 + */ +@RestController("goodsSkuController.v1") +@RequestMapping("/v1/goods/sku") +@Api(tags = GoodsSwaggerApiConfig.GOODS_SKU) +public class GoodsSkuController extends BaseController { + + @Autowired + private SkuService skuService; + + @Autowired + private SkuEsService skuEsService; + + + @ApiOperation(value = "商品sku列表(分页)") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/page") + public ResponseEntity> list(@Valid @RequestBody GoodsSkuPageDTO goodsSkuPageDTO) throws Exception { + Page list = skuEsService.listPage(goodsSkuPageDTO); + return Results.success(list); + } + + @ApiOperation(value = "sku明细") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping("/{id}") + public ResponseEntity detail(@Encrypt @PathVariable Long id,boolean isEdit) { + GoodsSkuDetailVO goodsSku = skuService.getDetail(id,isEdit); + return Results.success(goodsSku); + } + + @ApiOperation(value = "根据商品id获取已经生成的sku") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping("/goods/{spuId}") + public ResponseEntity> goodsSkuDetail(@PathVariable @Encrypt Long spuId) { + List list = skuService.getSkuAndAttributeDataByGoodsId(spuId); + return Results.success(list); + } + + @ApiOperation(value = "删除商品sku(多个)") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @DeleteMapping + public ResponseEntity deleteByIds(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) { + skuService.deleteByIds(idsReqDTO.getIds()); + return Results.success("操作成功"); + } + + @ApiOperation(value = "创建商品sku") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping + public ResponseEntity create(@RequestBody SkuBatchSaveDTO skuBatchSaveDTO) { + skuService.saveSku(skuBatchSaveDTO); + return Results.success("操作成功"); + } + + @ApiOperation(value = "编辑sku") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PutMapping("/update") + public ResponseEntity update(@RequestBody SkuUpdateDTO updateDTO) { + skuService.updateSku(updateDTO); + return Results.success("编辑成功"); + } + + @ApiModelProperty(value = "根据skuCode查询sku--用于远程调用") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @PostMapping("/list/goods") + public ResponseEntity> getGoodsList(@RequestBody List skuCodeList) { + return Results.success(skuService.queryRPCGoodsList(skuCodeList)); + } + + + @ApiModelProperty(value = "套餐下商品的List") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @PostMapping("/meals-goods-list") + public ResponseEntity> getMealsGoodsList(@RequestBody List skuCodeList) { + return Results.success(skuService.getMealsGoodsList(skuCodeList)); + } + + @ApiModelProperty(value = "根据skuCode查询订单skuVO--用于远程调用") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @PostMapping("/order/sku/list") + public ResponseEntity> queryOrderRpcList(@RequestBody List skuCodeList) { + return Results.success(skuService.queryOrderRpcList(skuCodeList)); + } + + @ApiOperation(value = "批量提交审批") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PutMapping("/batchAudit") + public ResponseEntity batchAudit(@RequestBody SkuBatchAuditDTO skuBatchAuditDTO) { + skuService.batchAudit(skuBatchAuditDTO); + return Results.success("提交成功"); + } + + @ApiOperation(value = "刷新es数据") + @GetMapping("/es-test") + @Permission(level = ResourceLevel.ORGANIZATION,permissionPublic = true) + public ResponseEntity esTest() throws Exception { + skuEsService.delSkuEsAll(); + skuEsService.skuStatusUp(); + return Results.success(); + } + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/InstallServiceController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/InstallServiceController.java new file mode 100644 index 0000000..baaa779 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/InstallServiceController.java @@ -0,0 +1,83 @@ +package org.skyer.goods.api.controller.v1; + +import cn.hutool.core.lang.Dict; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.app.service.InstallServiceService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.dto.InstallServiceDTO; +import org.skyer.goods.domain.dto.MultiDelDTO; +import org.skyer.goods.domain.dto.PageInstallServiceDTO; +import org.skyer.goods.domain.entity.InstallService; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 安装服务 管理 API + * + * @author chenzz 2021-08-18 15:42:47 + */ +@RestController("installServiceSiteController.v1") +@RequestMapping("/v1/install-services") +@Api(tags = GoodsSwaggerApiConfig.GOODS_INSTALL_SERVICE) +public class InstallServiceController extends BaseController { + + @Autowired + private InstallServiceService installServiceService; + + @ApiOperation(value = "安装服务列表") + @Permission(level = ResourceLevel.SITE) + @GetMapping + public ResponseEntity> list(PageInstallServiceDTO installService, @ApiIgnore @SortDefault(value = InstallService.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = installServiceService.page(pageRequest, installService); + return Results.success(list); + } + + @ApiOperation(value = "安装服务明细") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{id}") + public ResponseEntity detail(@Encrypt @PathVariable Long id) { + Dict detail = installServiceService.detail(id); + return Results.success(detail); + } + + @ApiOperation(value = "创建安装服务") + @Permission(level = ResourceLevel.ORGANIZATION) + @PostMapping + public ResponseEntity create(@RequestBody InstallServiceDTO service) { + validObject(service); + boolean result = installServiceService.create(service); + return result ? Results.success("添加成功") : Results.error("添加失败"); + } + + @ApiOperation(value = "修改安装服务") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping + public ResponseEntity update(@RequestBody InstallServiceDTO service) { + // validObject(service); + boolean result = installServiceService.update(service); + return result ? Results.success("修改成功") : Results.error("修改失败"); + } + + @ApiOperation(value = "删除安装服务") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping + public ResponseEntity batchRemove(@ApiParam("主键ID") @RequestBody MultiDelDTO idsReqDTO) { + Boolean result = installServiceService.batchRemove(idsReqDTO.getIds()); + return result ? Results.success("操作成功") : Results.error("删除出错!"); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/MaterialController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/MaterialController.java new file mode 100644 index 0000000..0113c45 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/MaterialController.java @@ -0,0 +1,107 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.api.dto.MaterialDTO; +import org.skyer.goods.api.dto.MaterialListDTO; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.service.MaterialService; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +@RestController("materialController.v1") +@RequestMapping("/v1/goods/material") +@Api(tags = GoodsSwaggerApiConfig.GOODS_MATERIAL) +public class MaterialController { + + @Autowired + private MaterialService materialService; + + @ApiOperation(value = "分页获取信息") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping("/list") + public ResponseEntity pageList(MaterialListDTO materialListDTO, PageRequest pageRequest) { + return Results.success(materialService.pageList(pageRequest, materialListDTO)); + } + + /** + * 详细 + */ + @ApiOperation(value = "商品素材明细") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping("/{id}") + public ResponseEntity detail(@PathVariable("id") @Encrypt Long id) { + return Results.success(materialService.getDetail(id)); + } + + /** + * 详细2 + */ + @ApiOperation(value = "根据id获取商品素材明细") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping("/details") + public ResponseEntity showDetails(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) { + return Results.success(materialService.getDetail(id)); + } + + /** + * 新增/添加 + */ + @ApiOperation("新增") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/add") + public ResponseEntity add(@Validated @RequestBody MaterialDTO materialDTO) { + return Boolean.TRUE.equals(materialService.add(materialDTO)) ? Results.success() : Results.error(); + } + + /** + * 修改 + */ + @ApiOperation("修改") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PutMapping("/edit") + public ResponseEntity edit(@Validated @RequestBody MaterialDTO materialDTO) { + if (materialDTO.getId() != null && materialDTO.getId() > 0) { + return Boolean.TRUE.equals(materialService.edit(materialDTO)) ? Results.success() : Results.error(); + } else { + // 修改必须设置id + return Results.error(); + } + } + + /** + * 删除 + */ + @ApiOperation("删除") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @DeleteMapping("/delete") + public ResponseEntity deleteById(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) { + return Boolean.TRUE.equals(materialService.deleteById(id)) ? Results.success() : Results.error(); + } + + @ApiOperation(value = "批量删除") + @PatchMapping("/batch-delete") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity deleteByIds(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) { + Boolean result = materialService.deleteByIds(idsReqDTO.getIds()); + return Boolean.TRUE.equals(result) ? Results.success("操作成功") : Results.error("删除出错!"); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/PriceItemSettingController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/PriceItemSettingController.java new file mode 100644 index 0000000..8e688d5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/PriceItemSettingController.java @@ -0,0 +1,202 @@ +package org.skyer.goods.api.controller.v1; + +import cn.hutool.core.util.ObjectUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.boot.platform.lov.constant.LovConstants; +import org.skyer.boot.platform.lov.dto.LovDTO; +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; +import org.skyer.core.exception.CommonException; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.UpdatePriceItemValueDTO; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.infra.constant.Constants; +import org.skyer.goods.infra.feign.LovManageRemoteService; +import org.skyer.goods.infra.feign.LovRemoteService; +import org.skyer.goods.infra.feign.dto.LovHeaderDto; +import org.skyer.goods.infra.feign.dto.LovValueDto; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 租户价格项 设置 API + * + * @author chenzz + * @date 2021-07-06 + */ +@RestController("priceItemSettingController.v1") +@RequestMapping("/v1/price/item/setting") +@Api(tags = GoodsSwaggerApiConfig.GOODS_PRICE_SETTING) +public class PriceItemSettingController extends BaseController { + + @Autowired + LovRemoteService lovRemoteService; + + @Autowired + LovManageRemoteService lovManageRemoteService; + + /** + * 租户价格项值集查询 PRICE.ITEM.TYPE + **/ + @ApiOperation(value = "租户价格项值集查询(分页)") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping("/page") + public ResponseEntity> pagePriceItemSetting(PageRequest pageRequest) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + + ResponseEntity> mapResponseEntity = lovRemoteService.queryAllLovValue(Constants.HPFM_LOV_VALUES_PRICE_ITEM, tenantId, null, tenantId); + List body = mapResponseEntity.getBody(); + + int pageSize = pageRequest.getSize(); + int pageIndex = pageRequest.getPage() + 1; + List pageList = body.stream().skip((pageIndex) * pageSize).limit(pageSize).collect(Collectors.toList()); + + int totalPage = (body.size() + pageSize - 1) / pageSize; + Page pageVOS = new Page<>(pageList, new PageInfo(totalPage, pageSize), body.size()); + return Results.success(pageVOS); + } + + /** + * 租户价格项值集查询 PRICE.ITEM.TYPE + **/ + @ApiOperation(value = "租户价格项值集查询(所有数据列表)") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @GetMapping + public ResponseEntity> getPriceItemSetting() { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + + ResponseEntity> mapResponseEntity = lovRemoteService.queryAllLovValue(Constants.HPFM_LOV_VALUES_PRICE_ITEM, tenantId, null, tenantId); + List body = mapResponseEntity.getBody(); + return Results.success(body); + } + + @ApiOperation(value = "值集头创建") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/add-head") + public ResponseEntity saveHeadPriceItemSetting(@ApiParam("值集名称") @RequestParam String lovName) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + ResponseEntity lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, Constants.HPFM_LOV_VALUES_PRICE_ITEM); + if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode())) { + throw new CommonException("该值集头已经存在"); + } + LovHeaderDto lovDTO = new LovHeaderDto(); + lovDTO.setTenantId(tenantId); + lovDTO.setLovCode(Constants.HPFM_LOV_VALUES_PRICE_ITEM); + lovDTO.setLovName(lovName); + lovDTO.setMustPageFlag(1); + lovDTO.setEnabledFlag(1); + lovDTO.setLovTypeCode(LovConstants.LovTypes.IDP); + return lovManageRemoteService.addLovHeader(tenantId, lovDTO); + } + + @ApiOperation(value = "值集value创建") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/addValue") + public ResponseEntity saveValuePriceItemSetting(@RequestBody UpdatePriceItemValueDTO dto) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + String lovCode = Constants.HPFM_LOV_VALUES_PRICE_ITEM; + ResponseEntity lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, lovCode); + if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode())) { + LovDTO lov = lovDTOResponseEntity.getBody(); + if (null != lov) { + LovValueDto lovValueDto = new LovValueDto(); + lovValueDto.setLovId(lov.getLovId()); + lovValueDto.setLovCode(lovCode); + lovValueDto.setValue(dto.getValue()); + lovValueDto.setMeaning(dto.getMeaning()); + lovValueDto.setDescription(dto.getDescription()); + // 设置启用,禁用标志 + if (ObjectUtil.isNotNull(dto.getEnabledFlag())) { + lovValueDto.setEnabledFlag(dto.getEnabledFlag()); + } else { + lovValueDto.setEnabledFlag(1); + } + lovValueDto.setOrderSeq(dto.getOrderSeq()); + lovValueDto.setTenantId(tenantId); + return lovManageRemoteService.addLovValues(tenantId, lovValueDto); + } else { + throw new CommonException("值集头不存在"); + } + } else { + throw new CommonException("值集头不存在"); + } + } + + @ApiOperation(value = "值集value修改") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping("/value-update") + public ResponseEntity updatePriceItemValueSettings(@RequestBody UpdatePriceItemValueDTO dto) { + // 查询租户信息 + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + String lovCode = Constants.HPFM_LOV_VALUES_PRICE_ITEM; + // 根据租户和lovCode获取值集头信息 + ResponseEntity lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, lovCode); + LovDTO lov = lovDTOResponseEntity.getBody(); + if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode()) && null != lov) { + // 查询租户下loveCode, value匹配的值集 + ResponseEntity> listResponseEntity = lovManageRemoteService.listValuesByLovId(tenantId, lov.getLovId(), dto.getValue(), null); + List body = listResponseEntity.getBody(); + if (HttpStatus.OK.equals(listResponseEntity.getStatusCode()) && !CollectionUtils.isEmpty(body)) { + LovValueDto lovValueDto = body.get(0); + lovValueDto.setMeaning(dto.getMeaning()); + lovValueDto.setDescription(dto.getDescription()); + // 设置可用、禁用标志 + if (ObjectUtil.isNotNull(dto.getEnabledFlag())) { + lovValueDto.setEnabledFlag(dto.getEnabledFlag()); + } + lovValueDto.setOrderSeq(dto.getOrderSeq()); + return lovManageRemoteService.updateLovValuesByPrimaryKey(tenantId, lovValueDto); + } else { + throw new CommonException("值集值不存在"); + } + } else { + throw new CommonException("值集头不存在"); + } + } + + @ApiOperation(value = "值集value删除") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping("/value-delete/{valueCode}") + public ResponseEntity deletePriceItemValueSettings(@PathVariable("valueCode") String valueCode) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + String lovCode = Constants.HPFM_LOV_VALUES_PRICE_ITEM; + ResponseEntity lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, lovCode); + LovDTO lov = lovDTOResponseEntity.getBody(); + if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode()) && null != lov) { + ResponseEntity> listResponseEntity = lovManageRemoteService.listValuesByLovId(tenantId, lov.getLovId(), valueCode, null); + List body = listResponseEntity.getBody(); + if (HttpStatus.OK.equals(listResponseEntity.getStatusCode()) && !CollectionUtils.isEmpty(body)) { + LovValueDto lovValueDto = body.get(0); + List lovValueDtos = new ArrayList<>(); + lovValueDtos.add(lovValueDto); + return lovManageRemoteService.batchDeleteLovValuesByPrimaryKey(tenantId, lovValueDtos); + } else { + throw new CommonException("值集值不存在"); + } + } else { + throw new CommonException("值集头不存在"); + } + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueController.java new file mode 100644 index 0000000..899e87a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueController.java @@ -0,0 +1,75 @@ +package org.skyer.goods.api.controller.v1; + +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.goods.domain.repository.SkuAttributeValueRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.skyer.mybatis.helper.SecurityTokenHelper; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +/** + * sku属性关联表 管理 API + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +@RestController("skuAttributeValueSiteController.v1") +@RequestMapping("/v1/sku-attribute-values") +public class SkuAttributeValueController extends BaseController { + + @Autowired + private SkuAttributeValueRepository skuAttributeValueRepository; + + @ApiOperation(value = "sku属性关联表列表") + @Permission(level = ResourceLevel.SITE) + @GetMapping + public ResponseEntity> list(SkuAttributeValue skuAttributeValue, @ApiIgnore @SortDefault(value = SkuAttributeValue.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = skuAttributeValueRepository.pageAndSort(pageRequest, skuAttributeValue); + return Results.success(list); + } + + @ApiOperation(value = "sku属性关联表明细") + @Permission(level = ResourceLevel.SITE) + @GetMapping("/{id}") + public ResponseEntity detail(@PathVariable Long id) { + SkuAttributeValue skuAttributeValue = skuAttributeValueRepository.selectByPrimaryKey(id); + return Results.success(skuAttributeValue); + } + + @ApiOperation(value = "创建sku属性关联表") + @Permission(level = ResourceLevel.SITE) + @PostMapping + public ResponseEntity create(@RequestBody SkuAttributeValue skuAttributeValue) { + validObject(skuAttributeValue); + skuAttributeValueRepository.insertSelective(skuAttributeValue); + return Results.success(skuAttributeValue); + } + + @ApiOperation(value = "修改sku属性关联表") + @Permission(level = ResourceLevel.SITE) + @PutMapping + public ResponseEntity update(@RequestBody SkuAttributeValue skuAttributeValue) { + skuAttributeValueRepository.updateByPrimaryKeySelective(skuAttributeValue); + return Results.success(skuAttributeValue); + } + + @ApiOperation(value = "删除sku属性关联表") + @Permission(level = ResourceLevel.SITE) + @DeleteMapping + public ResponseEntity remove(@RequestBody SkuAttributeValue skuAttributeValue) { + skuAttributeValueRepository.deleteByPrimaryKey(skuAttributeValue); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueDraftController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueDraftController.java new file mode 100644 index 0000000..a6daa3e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAttributeValueDraftController.java @@ -0,0 +1,75 @@ +package org.skyer.goods.api.controller.v1; + +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.domain.entity.SkuAttributeValueDraft; +import org.skyer.goods.domain.repository.SkuAttributeValueDraftRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.skyer.mybatis.helper.SecurityTokenHelper; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +/** + * sku属性关联草稿表 管理 API + * + * @author zhanglongbing@ebc.com 2021-12-29 11:23:43 + */ +@RestController("skuAttributeValueDraftSiteController.v1") +@RequestMapping("/v1/sku-attribute-value-drafts") +public class SkuAttributeValueDraftController extends BaseController { + + @Autowired + private SkuAttributeValueDraftRepository skuAttributeValueDraftRepository; + + @ApiOperation(value = "sku属性关联草稿表列表") + @Permission(level = ResourceLevel.SITE) + @GetMapping + public ResponseEntity> list(SkuAttributeValueDraft skuAttributeValueDraft, @ApiIgnore @SortDefault(value = SkuAttributeValueDraft.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = skuAttributeValueDraftRepository.pageAndSort(pageRequest, skuAttributeValueDraft); + return Results.success(list); + } + + @ApiOperation(value = "sku属性关联草稿表明细") + @Permission(level = ResourceLevel.SITE) + @GetMapping("/{id}") + public ResponseEntity detail(@PathVariable Long id) { + SkuAttributeValueDraft skuAttributeValueDraft = skuAttributeValueDraftRepository.selectByPrimaryKey(id); + return Results.success(skuAttributeValueDraft); + } + + @ApiOperation(value = "创建sku属性关联草稿表") + @Permission(level = ResourceLevel.SITE) + @PostMapping + public ResponseEntity create(@RequestBody SkuAttributeValueDraft skuAttributeValueDraft) { + validObject(skuAttributeValueDraft); + skuAttributeValueDraftRepository.insertSelective(skuAttributeValueDraft); + return Results.success(skuAttributeValueDraft); + } + + @ApiOperation(value = "修改sku属性关联草稿表") + @Permission(level = ResourceLevel.SITE) + @PutMapping + public ResponseEntity update(@RequestBody SkuAttributeValueDraft skuAttributeValueDraft) { + skuAttributeValueDraftRepository.updateByPrimaryKeySelective(skuAttributeValueDraft); + return Results.success(skuAttributeValueDraft); + } + + @ApiOperation(value = "删除sku属性关联草稿表") + @Permission(level = ResourceLevel.SITE) + @DeleteMapping + public ResponseEntity remove(@RequestBody SkuAttributeValueDraft skuAttributeValueDraft) { + skuAttributeValueDraftRepository.deleteByPrimaryKey(skuAttributeValueDraft); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditController.java new file mode 100644 index 0000000..e224ceb --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditController.java @@ -0,0 +1,44 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.app.service.SkuService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.dto.AuditDTO; +import org.skyer.goods.domain.dto.SkuAuditDTO; +import org.skyer.goods.domain.vo.SkuAuditVO; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; + +/** + * SKU审核管理s + * @author lixiaoyang + * @date 2021/12/30 10:58 + */ +@RestController("skuAuditController.v1") +@RequestMapping("/v1/sku/audit") +@Api(tags = GoodsSwaggerApiConfig.GOODS_SKU_AUDIT_MANAGER) +public class SkuAuditController { + @Autowired + private SkuService skuService; + + @ApiOperation(value = "SKU审核详情") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @PostMapping("/detail") + public ResponseEntity detail( @RequestBody SkuAuditDTO dto) { + return Results.success(skuService.getAuditDetail(dto)); + } + + @ApiOperation(value = "SKU审核操作") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @PostMapping + public ResponseEntity audit( @RequestBody AuditDTO dto) { + return Results.success(skuService.skuAudit(dto)); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditSettingController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditSettingController.java new file mode 100644 index 0000000..294b46a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuAuditSettingController.java @@ -0,0 +1,51 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import org.skyer.core.base.BaseController; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.app.service.SkuAuditSettingService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.entity.SkuAuditSetting; +import org.skyer.goods.domain.repository.SkuAuditSettingRepository; +import org.skyer.swagger.annotation.Permission; + +/** + * 商品SKU审核 管理 API + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +@RestController("skuAuditSettingSiteController.v1") +@RequestMapping("/v1/sku-audit-settings") +@Api(tags = GoodsSwaggerApiConfig.GOODS_SKU_AUDIT_SETTING) +public class SkuAuditSettingController extends BaseController { + + @Autowired + private SkuAuditSettingRepository skuAuditSettingRepository; + @Autowired + private SkuAuditSettingService auditSettingService; + + @ApiOperation(value = "商品SKU审核设置明细") + @Permission(level = ResourceLevel.SITE) + @GetMapping("/default") + public ResponseEntity detail() { + SkuAuditSetting skuAuditSetting = skuAuditSettingRepository.selectDefault(); + return Results.success(skuAuditSetting); + } + + @ApiOperation(value = "修改商品SKU审核设置") + @Permission(level = ResourceLevel.SITE) + @PutMapping("/update") + public ResponseEntity update(@RequestBody SkuAuditSetting skuAuditSetting) { + skuAuditSettingRepository.updateDefault(skuAuditSetting); + return Results.success(skuAuditSetting); + } + + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuDraftController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuDraftController.java new file mode 100644 index 0000000..8ba7caa --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuDraftController.java @@ -0,0 +1,75 @@ +package org.skyer.goods.api.controller.v1; + +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.domain.entity.SkuDraft; +import org.skyer.goods.domain.repository.SkuDraftRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.skyer.mybatis.helper.SecurityTokenHelper; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 商品规格草稿表 管理 API + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +@RestController("skuDraftSiteController.v1") +@RequestMapping("/v1/sku-drafts") +public class SkuDraftController extends BaseController { + + @Autowired + private SkuDraftRepository skuDraftRepository; + + @ApiOperation(value = "商品规格草稿表列表") + @Permission(level = ResourceLevel.SITE) + @GetMapping + public ResponseEntity> list(SkuDraft skuDraft, @ApiIgnore @SortDefault(value = SkuDraft.FIELD_SKU_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = skuDraftRepository.pageAndSort(pageRequest, skuDraft); + return Results.success(list); + } + + @ApiOperation(value = "商品规格草稿表明细") + @Permission(level = ResourceLevel.SITE) + @GetMapping("/{skuId}") + public ResponseEntity detail(@PathVariable Long skuId) { + SkuDraft skuDraft = skuDraftRepository.selectByPrimaryKey(skuId); + return Results.success(skuDraft); + } + + @ApiOperation(value = "创建商品规格草稿表") + @Permission(level = ResourceLevel.SITE) + @PostMapping + public ResponseEntity create(@RequestBody SkuDraft skuDraft) { + validObject(skuDraft); + skuDraftRepository.insertSelective(skuDraft); + return Results.success(skuDraft); + } + + @ApiOperation(value = "修改商品规格草稿表") + @Permission(level = ResourceLevel.SITE) + @PutMapping + public ResponseEntity update(@RequestBody SkuDraft skuDraft) { + skuDraftRepository.updateByPrimaryKeySelective(skuDraft); + return Results.success(skuDraft); + } + + @ApiOperation(value = "删除商品规格草稿表") + @Permission(level = ResourceLevel.SITE) + @DeleteMapping + public ResponseEntity remove(@RequestBody SkuDraft skuDraft) { + skuDraftRepository.deleteByPrimaryKey(skuDraft); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuGroupController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuGroupController.java new file mode 100644 index 0000000..92c8cc1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SkuGroupController.java @@ -0,0 +1,67 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import org.skyer.core.domain.Page; +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.api.dto.GoodsGroupReqDTO; +import org.skyer.goods.api.dto.GroupPageReqDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.service.SkuGroupService; +import org.skyer.goods.domain.vo.GroupPageResVO; +import org.skyer.goods.domain.vo.SkuGroupResVO; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import org.skyer.core.iam.ResourceLevel; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; + +/** + * Sku组合表 管理 API + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Api(tags = GoodsSwaggerApiConfig.GOODS_GROUP) +@RestController("skuGroupController.v1") +@RequestMapping("/v1/sku-groups") +public class SkuGroupController extends BaseController { + @Autowired + private SkuGroupService skuGroupService; + + @ApiOperation(value = "创建或者更新sku组合") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + @PostMapping("/sku-group") + public ResponseEntity createOrUpdateSkuGroup(@RequestBody GoodsGroupReqDTO goodsGroupReqDTO){ + skuGroupService.createOrUpdateSkuGroup(goodsGroupReqDTO); + return Results.success("操作成功"); + } + + @ApiOperation(value = "sku组合查询") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @GetMapping("/detail/{groupId}") + public ResponseEntity skuGroupDetail(@Encrypt @PathVariable("groupId") Long groupId) { + SkuGroupResVO skuGroupResVO = skuGroupService.skuGroupDetail(groupId); + return Results.success(skuGroupResVO); + } + + @ApiOperation(value = "商品组合分页") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @PostMapping("/page") + public ResponseEntity> pageGroup(@RequestBody GroupPageReqDTO groupPageReqDTO) { + return Results.success(skuGroupService.pageGroup(groupPageReqDTO)); + } + + @ApiOperation(value = "删除商品组合") + @Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true) + @DeleteMapping("/group") + public ResponseEntity delGroup(@RequestBody IdsReqDTO idsReqDTO) { + skuGroupService.delGroup(idsReqDTO); + return Results.success("操作成功"); + } + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttrValueRelationController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttrValueRelationController.java new file mode 100644 index 0000000..ccd11d5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttrValueRelationController.java @@ -0,0 +1,77 @@ +package org.skyer.goods.api.controller.v1; + +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.domain.entity.SpuAttrValueRelation; +import org.skyer.goods.domain.repository.SpuAttrValueRelationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.skyer.mybatis.helper.SecurityTokenHelper; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 商品和属性值关联关系 管理 API + * + * @author wushaochuan 2021-07-19 09:18:33 + */ +@RestController("goodsAttrValueRelationController.v1") +@RequestMapping("/v1/{organizationId}/goods-attr-value-relations") +public class SpuAttrValueRelationController extends BaseController { + + @Autowired + private SpuAttrValueRelationRepository spuAttrValueRelationRepository; + + @ApiOperation(value = "商品和属性值关联关系列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping + public ResponseEntity> list(SpuAttrValueRelation spuAttrValueRelation, @ApiIgnore @SortDefault(value = SpuAttrValueRelation.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = spuAttrValueRelationRepository.pageAndSort(pageRequest, spuAttrValueRelation); + return Results.success(list); + } + + @ApiOperation(value = "商品和属性值关联关系明细") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{id}") + public ResponseEntity detail(@PathVariable Long id) { + SpuAttrValueRelation spuAttrValueRelation = spuAttrValueRelationRepository.selectByPrimaryKey(id); + return Results.success(spuAttrValueRelation); + } + + @ApiOperation(value = "创建商品和属性值关联关系") + @Permission(level = ResourceLevel.ORGANIZATION) + @PostMapping + public ResponseEntity create(@RequestBody SpuAttrValueRelation spuAttrValueRelation) { + validObject(spuAttrValueRelation); + spuAttrValueRelationRepository.insertSelective(spuAttrValueRelation); + return Results.success(spuAttrValueRelation); + } + + @ApiOperation(value = "修改商品和属性值关联关系") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping + public ResponseEntity update(@RequestBody SpuAttrValueRelation spuAttrValueRelation) { + SecurityTokenHelper.validToken(spuAttrValueRelation); + spuAttrValueRelationRepository.updateByPrimaryKeySelective(spuAttrValueRelation); + return Results.success(spuAttrValueRelation); + } + + @ApiOperation(value = "删除商品和属性值关联关系") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping + public ResponseEntity remove(@RequestBody SpuAttrValueRelation spuAttrValueRelation) { + SecurityTokenHelper.validToken(spuAttrValueRelation); + spuAttrValueRelationRepository.deleteByPrimaryKey(spuAttrValueRelation); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeController.java new file mode 100644 index 0000000..327d5ca --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeController.java @@ -0,0 +1,86 @@ +package org.skyer.goods.api.controller.v1; + +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.domain.entity.SpuAttribute; +import org.skyer.goods.domain.repository.SpuAttributeRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.skyer.mybatis.helper.SecurityTokenHelper; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 属性表 管理 API + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@RestController("spuAttributeController.v1") +@RequestMapping("/v1/spu-attributes") +public class SpuAttributeController extends BaseController { + + @Autowired + private SpuAttributeRepository spuAttributeRepository; + + @ApiOperation(value = "属性表列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping + public ResponseEntity> list(SpuAttribute spuAttribute, @ApiIgnore @SortDefault(value = SpuAttribute.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = spuAttributeRepository.pageAndSort(pageRequest, spuAttribute); + return Results.success(list); + } + + @ApiOperation(value = "属性表明细") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{id}") + public ResponseEntity detail(@PathVariable Long id) { + SpuAttribute spuAttribute = spuAttributeRepository.selectByPrimaryKey(id); + return Results.success(spuAttribute); + } + + @ApiOperation(value = "创建属性表") + @Permission(level = ResourceLevel.ORGANIZATION) + @PostMapping + public ResponseEntity create(@RequestBody SpuAttribute spuAttribute) { + validObject(spuAttribute); + spuAttributeRepository.insertSelective(spuAttribute); + return Results.success(spuAttribute); + } + + @ApiOperation(value = "修改属性表") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping + public ResponseEntity update(@RequestBody SpuAttribute spuAttribute) { + SecurityTokenHelper.validToken(spuAttribute); + spuAttributeRepository.updateByPrimaryKeySelective(spuAttribute); + return Results.success(spuAttribute); + } + + @ApiOperation(value = "删除属性表") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping + public ResponseEntity remove(@RequestBody SpuAttribute spuAttribute) { + SecurityTokenHelper.validToken(spuAttribute); + spuAttributeRepository.deleteByPrimaryKey(spuAttribute); + return Results.success(); + } + + @ApiOperation(value = "删除商品属性") + @PatchMapping("/batch-delete-attribute") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity deleteByIds(@RequestBody IdsReqDTO idsReqDTO) { + spuAttributeRepository.deleteAttribute(idsReqDTO.getIds()); + return Results.success("操作成功"); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeValueController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeValueController.java new file mode 100644 index 0000000..8af81c5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuAttributeValueController.java @@ -0,0 +1,77 @@ +package org.skyer.goods.api.controller.v1; + +import org.skyer.core.util.Results; +import org.skyer.core.base.BaseController; +import org.skyer.goods.domain.entity.SpuAttributeValue; +import org.skyer.goods.domain.repository.SpuAttributeValueRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.skyer.mybatis.helper.SecurityTokenHelper; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.swagger.annotation.Permission; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 属性值表 管理 API + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@RestController("spuAttributeValueController.v1") +@RequestMapping("/v1/spu-attribute-values") +public class SpuAttributeValueController extends BaseController { + + @Autowired + private SpuAttributeValueRepository spuAttributeValueRepository; + + @ApiOperation(value = "属性值表列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping + public ResponseEntity> list(SpuAttributeValue spuAttributeValue, @ApiIgnore @SortDefault(value = SpuAttributeValue.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = spuAttributeValueRepository.pageAndSort(pageRequest, spuAttributeValue); + return Results.success(list); + } + + @ApiOperation(value = "属性值表明细") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{id}") + public ResponseEntity detail(@PathVariable Long id) { + SpuAttributeValue spuAttributeValue = spuAttributeValueRepository.selectByPrimaryKey(id); + return Results.success(spuAttributeValue); + } + + @ApiOperation(value = "创建属性值表") + @Permission(level = ResourceLevel.ORGANIZATION) + @PostMapping + public ResponseEntity create(@RequestBody SpuAttributeValue spuAttributeValue) { + validObject(spuAttributeValue); + spuAttributeValueRepository.insertSelective(spuAttributeValue); + return Results.success(spuAttributeValue); + } + + @ApiOperation(value = "修改属性值表") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping + public ResponseEntity update(@RequestBody SpuAttributeValue spuAttributeValue) { + SecurityTokenHelper.validToken(spuAttributeValue); + spuAttributeValueRepository.updateByPrimaryKeySelective(spuAttributeValue); + return Results.success(spuAttributeValue); + } + + @ApiOperation(value = "删除属性值表") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping + public ResponseEntity remove(@RequestBody SpuAttributeValue spuAttributeValue) { + SecurityTokenHelper.validToken(spuAttributeValue); + spuAttributeValueRepository.deleteByPrimaryKey(spuAttributeValue); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuController.java new file mode 100644 index 0000000..329609c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuController.java @@ -0,0 +1,113 @@ +package org.skyer.goods.api.controller.v1; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.api.dto.GoodsRequestDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.api.dto.StatusReqDTO; +import org.skyer.goods.app.service.SpuEsService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.service.SpuService; +import org.skyer.goods.domain.vo.GoodsDetailsVO; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; + +/** + * 商品管理 + * + * @description + * @Author wusc + * @create 2021/6/24 10:36 上午 + */ +@RestController("GoodsController.v1") +@RequestMapping(value = "/v1/goods/manager") +@Api(tags = GoodsSwaggerApiConfig.GOODS_MANAGER) +public class SpuController { + + @Autowired + private SpuService spuService; + @Autowired + private SpuEsService spuEsService; + + @ApiOperation(value = "商品页面查询") + @PostMapping("/page") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity> pageGoods(@Valid @RequestBody GoodsPageReqDTO goodsPageReqDTO) throws Exception { + if (StringUtils.isNotBlank(goodsPageReqDTO.getName())) { + return Results.success(spuEsService.querySpuEs(goodsPageReqDTO)); + } + return Results.success(spuService.pageGoods(goodsPageReqDTO)); + } + + @ApiOperation(value = "查询spu的商品List") + @PostMapping("/goods-list-spu") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity> queryGoodsBySpuList(@RequestBody List spuCodeList) { + return Results.success(spuService.queryGoodsBySpuList(spuCodeList)); + } + + + @ApiOperation(value = "更新商品") + @PutMapping("/goods") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity updateGoods(@Valid @RequestBody GoodsRequestDTO goodsRequestDTO) { + spuService.insertOrUpdateGoods(goodsRequestDTO); + return Results.success("操作成功"); + } + + @ApiOperation("创建商品") + @PostMapping("/goods") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity createGoods(@Valid @RequestBody GoodsRequestDTO goodsRequestDTO) { + spuService.insertOrUpdateGoods(goodsRequestDTO); + return Results.success("操作成功"); + } + + @ApiOperation(value = "删除商品") + @PatchMapping("/batch-delete-goods") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity deleteByIds(@RequestBody IdsReqDTO idsReqDTO) { + spuService.deleteByIds(idsReqDTO.getIds()); + return Results.success("操作成功"); + } + + @ApiOperation(value = "查询商品详情") + @GetMapping("/detail/{id}") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity queryDetail(@ApiParam("主键ID") @Encrypt @PathVariable("id") Long id) { + GoodsDetailsVO goodsDetailsVO = spuService.getDetailsById(id); + return Results.success(goodsDetailsVO); + } + + @ApiOperation(value = "修改商品状态") + @PatchMapping("/goods") + @Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true) + public ResponseEntity updateGoodsStatus(@Valid @RequestBody StatusReqDTO statusReqDTO) { + spuService.updateGoodsStatus(statusReqDTO.getIds(), statusReqDTO.getStatus()); + return Results.success("操作成功"); + } + + @ApiOperation(value = "商品批量上传ES测试") + @GetMapping("/es-test") + @Permission(level = ResourceLevel.ORGANIZATION, permissionPublic = true) + public ResponseEntity esTest() throws IOException { + spuEsService.productStatusUp(); + return Results.success(); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuInstallServiceController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuInstallServiceController.java new file mode 100644 index 0000000..7a1e3b3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuInstallServiceController.java @@ -0,0 +1,84 @@ +package org.skyer.goods.api.controller.v1; + +import cn.hutool.core.lang.Dict; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.app.service.SpuInstallServiceService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.dto.PageSpuInstallServiceDTO; +import org.skyer.goods.domain.dto.SpuInstallServiceDTO; +import org.skyer.goods.domain.entity.SpuInstallService; +import org.skyer.goods.domain.entity.SpuSonMum; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 商品安装服务 管理 API + * + * @author chenzz 2021-08-18 16:42:11 + */ +@RestController("spuInstallServiceSiteController.v1") +@RequestMapping("/v1/spu-install-services") +@Api(tags = GoodsSwaggerApiConfig.GOODS_SPU_INSTALL_SERVICE) +public class SpuInstallServiceController extends BaseController { + + @Autowired + private SpuInstallServiceService spuInstallServiceService; + + @ApiOperation(value = "商品安装服务列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping + public ResponseEntity> list(PageSpuInstallServiceDTO serviceDTO, @ApiIgnore @SortDefault(value = SpuInstallService.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = spuInstallServiceService.page(pageRequest, serviceDTO); + return Results.success(list); + } + + @ApiOperation(value = "商品安装服务明细") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{id}") + public ResponseEntity detail(@Encrypt @PathVariable Long id) { + Dict installService = spuInstallServiceService.detail(id); + return Results.success(installService); + } + + @ApiOperation(value = "创建商品安装服务") + @Permission(level = ResourceLevel.ORGANIZATION) + @PostMapping + public ResponseEntity create(@RequestBody SpuInstallServiceDTO dto) { + validObject(dto); + boolean result = spuInstallServiceService.create(dto); + return result ? Results.success() : Results.error(); + } + + @ApiOperation(value = "修改商品安装服务") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping + public ResponseEntity update(@RequestBody SpuInstallServiceDTO dto) { + validObject(dto); + boolean result = spuInstallServiceService.update(dto); + return result ? Results.success() : Results.error(); + } + + @ApiOperation(value = "删除商品安装服务") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping + public ResponseEntity batchRemove(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) { + Boolean result = spuInstallServiceService.batchRemove(idsReqDTO.getIds()); + return result ? Results.success("操作成功") : Results.error("删除出错!"); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuSonMumController.java b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuSonMumController.java new file mode 100644 index 0000000..a6fe78e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/controller/v1/SpuSonMumController.java @@ -0,0 +1,83 @@ +package org.skyer.goods.api.controller.v1; + +import cn.hutool.core.lang.Dict; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.skyer.core.base.BaseController; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.core.util.Results; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.app.service.SpuSonMumService; +import org.skyer.goods.config.GoodsSwaggerApiConfig; +import org.skyer.goods.domain.dto.PageSonMumDTO; +import org.skyer.goods.domain.dto.SpuSonMumDTO; +import org.skyer.goods.domain.entity.SpuSonMum; +import org.skyer.mybatis.pagehelper.annotation.SortDefault; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.pagehelper.domain.Sort; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.skyer.swagger.annotation.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 子母商品 管理 API + * + * @author chenzz 2021-08-16 15:04:38 + */ +@RestController("spuSonMumController.v1") +@RequestMapping("/v1/spu-son-mums") +@Api(tags = GoodsSwaggerApiConfig.GOODS_SPU_SON_MUM) +public class SpuSonMumController extends BaseController { + + @Autowired + private SpuSonMumService spuSonMumService; + + @ApiOperation(value = "子母商品列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping + public ResponseEntity> list(PageSonMumDTO spuSonMum, @ApiIgnore @SortDefault(value = SpuSonMum.FIELD_ID, + direction = Sort.Direction.DESC) PageRequest pageRequest) { + Page list = spuSonMumService.page(pageRequest, spuSonMum); + return Results.success(list); + } + + @ApiOperation(value = "子母商品明细") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{id}") + public ResponseEntity detail(@Encrypt @PathVariable Long id) { + Dict spuSonMum = spuSonMumService.detail(id); + return Results.success(spuSonMum); + } + + @ApiOperation(value = "创建子母商品") + @Permission(level = ResourceLevel.ORGANIZATION) + @PostMapping + public ResponseEntity create(@RequestBody SpuSonMumDTO spuSonMumDTO) { + validObject(spuSonMumDTO); + boolean result = spuSonMumService.create(spuSonMumDTO); + return result ? Results.success("添加成功") : Results.error("添加失败"); + } + + @ApiOperation(value = "修改子母商品") + @Permission(level = ResourceLevel.ORGANIZATION) + @PutMapping + public ResponseEntity update(@RequestBody SpuSonMumDTO spuSonMumDTO) { + validObject(spuSonMumDTO); + boolean result = spuSonMumService.update(spuSonMumDTO); + return result ? Results.success("修改成功") : Results.error("修改失败"); + } + + @ApiOperation(value = "删除子母商品") + @Permission(level = ResourceLevel.ORGANIZATION) + @DeleteMapping + public ResponseEntity batchRemove(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) { + Boolean result = spuSonMumService.batchRemove(idsReqDTO.getIds()); + return result ? Results.success("操作成功") : Results.error("删除出错!"); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/AttrListRequestDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/AttrListRequestDTO.java new file mode 100644 index 0000000..4301964 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/AttrListRequestDTO.java @@ -0,0 +1,55 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import java.util.List; + +import org.skyer.goods.domain.entity.SpuAttributeValue; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @author: lzh + * @date: 2021-12-28 + * @description: + */ +@Data +@ApiModel("spu属性列表入参") +public class AttrListRequestDTO { + + @ApiModelProperty("id") + @Encrypt + private Long id; + + @ApiModelProperty("属性编码") + private String code; + + @ApiModelProperty("是否用于生产sku") + private Boolean isSku; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty(value = "1-系统默认属性 2-分类属性 0-商品属性 3附加属性") + private Integer type; + + @ApiModelProperty(value = "属性类别 1单选2复选3文本4下拉") + private Integer submissionsType; + + @ApiModelProperty("属性名称") + @NotBlank(message = "属性名称不可为空") + private String attributeName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("属性值") + private List values; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/AttributeDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/AttributeDTO.java new file mode 100644 index 0000000..d4a5257 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/AttributeDTO.java @@ -0,0 +1,30 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotNull; + +/** + * @description sku属性 + * @Author zhanglongbing@ebc.com + * @create 2021/12/27 + */ +@Data +public class AttributeDTO { + + @ApiModelProperty("attributeId") + @Encrypt + private Long attributeId; + + @ApiModelProperty("类型") + private Integer attributeType; + + @ApiModelProperty("属性名称") + private String attributeName; + + @ApiModelProperty("属性值") + private String attributeValue; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandPageReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandPageReqDTO.java new file mode 100644 index 0000000..b0d7c7c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandPageReqDTO.java @@ -0,0 +1,38 @@ +package org.skyer.goods.api.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; + +/** + * @description + * @Author wusc + * @create 2021/6/24 9:50 上午 + */ +@Data +@ApiModel("商品品牌查询条件") +public class BrandPageReqDTO extends PageReqDTO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("品牌状态") + private Integer status; + + @ApiModelProperty("品牌编码") + private String code; + + @ApiModelProperty("租户Id") + @JsonIgnore + private Long tenantId; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandReqDTO.java new file mode 100644 index 0000000..09ef9ce --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/BrandReqDTO.java @@ -0,0 +1,39 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @description + * @Author wusc + * @create 2021/6/24 9:59 上午 + */ +@Data +@ApiModel("新增或者编辑商品品牌") +public class BrandReqDTO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("品牌编码") + private String code; + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("品牌logo") + private String logo; + + @ApiModelProperty("制造商") + private String manufacturer; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("备注") + private String remark; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeQueryDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeQueryDTO.java new file mode 100644 index 0000000..1693c90 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeQueryDTO.java @@ -0,0 +1,30 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +@Data +@ApiModel(value ="商品分类属性查询对象") +public class CategoryAttributeQueryDTO { + @Encrypt + @ApiModelProperty("分类属性id") + private Long id; + + @Encrypt + @ApiModelProperty(value = "分类id,null返回空集", required = true) + private Long categoryId; + + @ApiModelProperty(value = "表单方式 1单选2复选3文本4下拉") + private Integer formType; + + @ApiModelProperty(value = "是否用于生成sku true是 false否") + private Boolean skuFlag; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "来源类型 0新增 1系统 2分级分类") + private Integer sourceType; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeSaveDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeSaveDTO.java new file mode 100644 index 0000000..2919714 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeSaveDTO.java @@ -0,0 +1,46 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("商品分类属性") +public class CategoryAttributeSaveDTO { +// @Encrypt +// @ApiModelProperty("id") +// private Long id; +// +// @Encrypt +// @ApiModelProperty(value = "分类id sgoo_category.id",required = true) +// private Long categoryId; + + @ApiModelProperty(value = "属性名称") + private String name; + + @ApiModelProperty(value = "属性编码") + private String code; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "表单方式 1单选2复选3文本4下拉") + private Integer formType; + + @ApiModelProperty(value = "是否用于生成sku true是 false否") + private Boolean skuFlag; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "来源类型") + private Integer sourceType; + + @ApiModelProperty(value = "属性值列表") + private List attributeValueList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeValueSaveDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeValueSaveDTO.java new file mode 100644 index 0000000..fa71aca --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryAttributeValueSaveDTO.java @@ -0,0 +1,24 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("分类属性值") +public class CategoryAttributeValueSaveDTO { + +// @Encrypt +// @ApiModelProperty("id") +// private Long id; +// +// @Encrypt +// @ApiModelProperty(value = "属性id sgoo_category_attribute.id") +// private Long attributeId; + + @ApiModelProperty(value = "属性值") + private String value; + + @ApiModelProperty(value = "排序") + private Long sort; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryQueryDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryQueryDTO.java new file mode 100644 index 0000000..e8adfde --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryQueryDTO.java @@ -0,0 +1,38 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.starter.keyencrypt.core.Encrypt; + + +@Data +@ApiModel("商品分类查询") +public class CategoryQueryDTO extends PageRequest { + @Encrypt + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty(value = "分类编码") + private String code; + + @ApiModelProperty(value = "分类名称") + private String name; + + @Encrypt + @ApiModelProperty(value = "父id 0,代表一级") + private Long parentId; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "类目等级") + private Integer level; + + @ApiModelProperty(value = "是否叶子类目 true是 false否") + private Boolean subFlag; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategorySaveDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategorySaveDTO.java new file mode 100644 index 0000000..aba5f9e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategorySaveDTO.java @@ -0,0 +1,52 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.List; + +@Data +@ApiModel("商品分类保存") +public class CategorySaveDTO { + @Encrypt + @ApiModelProperty("id 为空代表新增") + private Long id; + + @ApiModelProperty(value = "分类编码") + @Pattern(regexp = "^[A-Za-z0-9]*$") + private String code; + + @NotNull + @Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9]+$") + @ApiModelProperty(value = "分类名称") + private String name; + + @Encrypt + @ApiModelProperty(value = "父id 0,代表一级") + private Long parentId; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "类目等级 一级开始 默认1") + private Integer level; + + @ApiModelProperty(value = "是否叶子类目 false否 true是") + private Boolean subFlag; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "商品属性表(包含属性值)") + private List attributeList; + + @ApiModelProperty(value = "版本号") + private Long objectVersionNumber; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryTreeQueryDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryTreeQueryDTO.java new file mode 100644 index 0000000..c82b7cf --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryTreeQueryDTO.java @@ -0,0 +1,19 @@ +package org.skyer.goods.api.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("商品分类树筛选条件") +public class CategoryTreeQueryDTO { + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "是否叶子类目 true是 false否") + private Boolean subFlag; + + @ApiModelProperty(value = "是否移除子孙没有叶子分类的普通分类 true移除 false不移除") + private Boolean removeNotSubFlag; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryUpdateByStatusFlagDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryUpdateByStatusFlagDTO.java new file mode 100644 index 0000000..3bcf03c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/CategoryUpdateByStatusFlagDTO.java @@ -0,0 +1,24 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("商品分类修改状态") +public class CategoryUpdateByStatusFlagDTO { + @Encrypt + @ApiModelProperty(value = "id", required = true) + @NotNull + private Long id; + + @ApiModelProperty(value = "状态 true启用 false禁用", required = true) + @NotNull + private Boolean statusFlag; + + @ApiModelProperty(value = "版本号") + private Long objectVersionNumber; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupReqDTO.java new file mode 100644 index 0000000..1c803b9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupReqDTO.java @@ -0,0 +1,44 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/8/13 10:11 上午 + */ +@ApiModel("商品组合") +@Data +public class GoodsGroupReqDTO { + + @ApiModelProperty("id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "spuId") + @Encrypt + private Long spuId; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("套餐名") + private String groupName; + + + @ApiModelProperty("店铺id") + @Encrypt + private List storeIdList; + + @ApiModelProperty("是否全部店铺") + private Boolean isAllStore; + + @ApiModelProperty("组合商品sku") + private List goodsGroupSkuReqDTOS; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupSkuReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupSkuReqDTO.java new file mode 100644 index 0000000..f7f0744 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsGroupSkuReqDTO.java @@ -0,0 +1,25 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.math.BigDecimal; + +/** + * skuId 数量 + * @description + * @Author wusc + * @create 2021/8/13 10:43 上午 + */ +@ApiModel("商品组合sku") +@Data +public class GoodsGroupSkuReqDTO { + @ApiModelProperty("skuId") + @Encrypt + private Long skuId; + + @ApiModelProperty("数量") + private BigDecimal num; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsPageReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsPageReqDTO.java new file mode 100644 index 0000000..bef2288 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsPageReqDTO.java @@ -0,0 +1,43 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/24 11:33 上午 + */ +@Data +public class GoodsPageReqDTO extends PageReqDTO{ + + @ApiModelProperty("主键id") + @Encrypt + private String id; + + + @ApiModelProperty("spu编码") + private String spuCode; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品类别") + private Integer type; + + @ApiModelProperty("目录编码") + @Encrypt + private List categoryIdList; + + @ApiModelProperty(value = "状态") + private Integer status; + + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsReqDTO.java new file mode 100644 index 0000000..36877e4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsReqDTO.java @@ -0,0 +1,53 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @description + * @Author wusc + * @create 2021/6/24 10:44 上午 + */ +@Data +@ApiModel("新增或者编辑商品") +public class GoodsReqDTO { + + @ApiModelProperty("主键id") + @Encrypt + private Long id; + + @ApiModelProperty("商品编码") + private String code; + + @ApiModelProperty("类别") + @NotNull(message = "类别不能为空") + private Integer type; + + @ApiModelProperty("商品名称") + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty("类别id") + @NotNull(message = "类别id不能为空") + @Encrypt + private Long categoryId; + + @ApiModelProperty("品牌Id") + @Encrypt + private Long brandId; + + @ApiModelProperty("素材Id") + @Encrypt + private Long materialId; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("状态") + private Integer status; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsRequestDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsRequestDTO.java new file mode 100644 index 0000000..13e3739 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsRequestDTO.java @@ -0,0 +1,63 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import java.util.List; + +import org.skyer.goods.domain.entity.SpuAttributeValue; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @author: lzh + * @date: 2021-12-28 + * @description: + */ +@Data +@ApiModel("添加编辑商品参数") +public class GoodsRequestDTO { + @ApiModelProperty("主键id") + @Encrypt + private Long id; + + @ApiModelProperty("商品编码") + @NotBlank(message = "编码不能为空") + private String spuCode; + + @ApiModelProperty("类别") + @NotNull(message = "类别不能为空") + private Integer type; + + @ApiModelProperty("商品名称") + @NotBlank(message = "名称不能为空") + private String name; + + @ApiModelProperty("类别id") + @NotNull(message = "商品类别不能为空") + @Encrypt + private Long categoryId; + + @ApiModelProperty("品牌Id") + @Encrypt + private Long brandId; + + @ApiModelProperty("素材Id") + @Encrypt + private Long materialId; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty("属性") + private List attrs; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsSkuPageDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsSkuPageDTO.java new file mode 100644 index 0000000..c793882 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GoodsSkuPageDTO.java @@ -0,0 +1,47 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * 商品规格表 + * + * @author chenzz 2021-07-06 10:35:43 + */ +@ApiModel("商品SKU") +@Data +public class GoodsSkuPageDTO extends PageRequest { + + @ApiModelProperty(value = "商品名称") + private String spuName; + + @ApiModelProperty(value = "商品编码") + private String spuCode; + + @ApiModelProperty(value = "商品类别") + private String spuType; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty("目录编码") + @Encrypt + private List categoryIdList; + + @ApiModelProperty(value = "0草稿 1被驳回 2审核中 3已生效 4已生效(修改中) ") + private List status; + + @ApiModelProperty(value = "sku名称") + private String skuName; + + @ApiModelProperty(value = "skuCode") + private String skuCode; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/GroupPageReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GroupPageReqDTO.java new file mode 100644 index 0000000..1dbaac7 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/GroupPageReqDTO.java @@ -0,0 +1,21 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @description + * @Author wusc + * @create 2021/8/16 5:15 下午 + */ +@Data +@ApiModel("分组传入参数") +public class GroupPageReqDTO extends PageReqDTO{ + + @ApiModelProperty(value = "spu编码") + private String spuCode; + + @ApiModelProperty("spu名称") + private String spuName; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/IdsReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/IdsReqDTO.java new file mode 100644 index 0000000..04f80de --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/IdsReqDTO.java @@ -0,0 +1,22 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/30 11:20 上午 + */ +@Data +@ApiModel("删除id") +public class IdsReqDTO { + + @ApiModelProperty("主键id") + @Encrypt + private List ids; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/LevelCategoryDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/LevelCategoryDTO.java new file mode 100644 index 0000000..fcfc2d5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/LevelCategoryDTO.java @@ -0,0 +1,34 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @description + * @Author wusc + * @create 2021/6/25 5:29 下午 + */ +@Data +public class LevelCategoryDTO { + + /** + * 分类等级 + */ + @ApiModelProperty("分类等级") + private Integer level; + + /** + * 分类id + */ + @ApiModelProperty("分类id") + @Encrypt + private Long id; + + /** + * 分类名称 + */ + @ApiModelProperty("分类名称") + private String name; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialDTO.java new file mode 100644 index 0000000..3b3cd5a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialDTO.java @@ -0,0 +1,71 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +@Getter +@Setter +@ToString +@ApiModel("商品素材") +public class MaterialDTO { + + @ApiModelProperty("id,添加时不需要设置") + @Encrypt + private Long id; + + /** + * 编码 + */ + @ApiModelProperty("编码") + private String code; + + /** + * 素材名称 + */ + @ApiModelProperty("素材名称") + @NotNull + private String materialName; + + /** + * 主图 + */ + @ApiModelProperty("主图") + private List mainImage; + + /** + * 详情图 + */ + @ApiModelProperty("详情图") + private List detailImage; + + + /** + * 详情内容 + */ + @ApiModelProperty("详情内容") + private String detailHtml; + + /** + * 备注 + */ + @ApiModelProperty("备注") + private String remark; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialListDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialListDTO.java new file mode 100644 index 0000000..213ee6a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/MaterialListDTO.java @@ -0,0 +1,36 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +@Getter +@Setter +@ToString +@ApiModel("商品素材") +public class MaterialListDTO { + + /** + * 编码 + */ + @ApiModelProperty("编码") + private String code; + + /** + * 素材名称 + */ + @ApiModelProperty("素材名称") + private String materialName; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/PageReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/PageReqDTO.java new file mode 100644 index 0000000..62e9c34 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/PageReqDTO.java @@ -0,0 +1,36 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; + +import java.io.Serializable; + +/** + * @description + * @Author wusc + * @create 2021/6/23 2:58 下午 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "分页请求类") +public class PageReqDTO implements Serializable { + + @ApiModelProperty(value = "每页条数", example = "10") + private Integer size; + + @ApiModelProperty(value = "当前页数", example = "1") + private Integer page; + + public PageInfo createPage() { + int page = this.page == null || this.page < 0 ? 0: this.page; + int size = this.size == null || this.size < 0 ? 10: this.size; + return new PageInfo(page, size); + } +} + diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchAuditDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchAuditDTO.java new file mode 100644 index 0000000..787e0d9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchAuditDTO.java @@ -0,0 +1,21 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + + +/** + * + * @author zhanglb + */ +@Data +public class SkuBatchAuditDTO { + + @ApiModelProperty("skuId列表") + @Encrypt + List skuIds; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchSaveDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchSaveDTO.java new file mode 100644 index 0000000..982ee8b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuBatchSaveDTO.java @@ -0,0 +1,20 @@ +package org.skyer.goods.api.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +public class SkuBatchSaveDTO { + @ApiModelProperty(value = "SKU列表") + private List skuList; + + @ApiModelProperty(value = "true保存为草稿 false提交") + private Boolean flag; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuListRequestDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuListRequestDTO.java new file mode 100644 index 0000000..ba202a0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuListRequestDTO.java @@ -0,0 +1,75 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.domain.entity.SkuPackage; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * @description + * @Author zhanglongbing@ebc.com + * @create 2021/12/27 + */ +@Data +public class SkuListRequestDTO { + @ApiModelProperty("spuId") + @Encrypt + @NotNull(message = "spuId不能为空") + private Long spuId; + + @ApiModelProperty("skuCode") + @NotBlank(message = "skuCode不能为空") + private String skuCode; + + @ApiModelProperty("sku名称") + @NotBlank(message = "skuName不能为空") + private String skuName; + + @ApiModelProperty("商品重量") + private BigDecimal weight; + + @ApiModelProperty("商品长度") + private BigDecimal length; + + @ApiModelProperty("商品宽度") + private BigDecimal width; + + @ApiModelProperty("商品高度") + private BigDecimal height; + + @ApiModelProperty("成本价") + private BigDecimal costPrice; + + @ApiModelProperty("销售价") + private BigDecimal salesPrice; + + @ApiModelProperty("活动价") + private BigDecimal activityPrice; + + @ApiModelProperty("市场价") + private BigDecimal marketPrice; + + @ApiModelProperty("分销价") + private BigDecimal distributionPrice; + + @ApiModelProperty("批发价") + private BigDecimal wholesalePrice; + + @ApiModelProperty("结算价") + private BigDecimal clearingPrice; + + @ApiModelProperty("原始属性列表") + private List skuAttributeList; + + @ApiModelProperty("附加属性列表") + private List otherAttributeList; + + @ApiModelProperty("套餐信息 sku明细") + @Encrypt + private List skuDetailList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateDTO.java new file mode 100644 index 0000000..c9b039f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateDTO.java @@ -0,0 +1,23 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.domain.entity.Sku; + + +/** + * + * @author zhanglb + */ +@Data +public class SkuUpdateDTO { + + @ApiModelProperty(value = "sku更改信息") + private SkuUpdateInfoDTO sku; + + @ApiModelProperty(value = "true保存为草稿 false提交") + private Boolean flag; + + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateInfoDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateInfoDTO.java new file mode 100644 index 0000000..52411df --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SkuUpdateInfoDTO.java @@ -0,0 +1,57 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author zhanglongbing + */ +@Data +public class SkuUpdateInfoDTO { + + @ApiModelProperty("id") + @Encrypt + @NotNull(message = "id不能为空") + private Long id; + @ApiModelProperty(value = "skuCode") + private String skuCode; + @ApiModelProperty(value = "sku名称") + private String skuName; + @ApiModelProperty(value = "成本价") + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价") + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价") + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价") + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价") + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价") + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价") + private BigDecimal clearingPrice; + @ApiModelProperty(value = "商品重量") + private BigDecimal weight; + @ApiModelProperty(value = "商品长度") + private BigDecimal length; + @ApiModelProperty(value = "商品宽度") + private BigDecimal width; + @ApiModelProperty(value = "商品高度") + private BigDecimal height; + + @ApiModelProperty("原始属性列表") + private List skuAttributeList; + + @ApiModelProperty("附加属性列表") + private List otherAttributeList; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/SpuListDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SpuListDTO.java new file mode 100644 index 0000000..bc4ce59 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/SpuListDTO.java @@ -0,0 +1,32 @@ +package org.skyer.goods.api.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.skyer.goods.domain.entity.Spu; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author wusc 2021-01-07 17:53 + */ +@ApiModel("SPU集合") +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Data +public class SpuListDTO { + public SpuListDTO(){} + public SpuListDTO(Spu spu){ + this.spuList = new ArrayList(){{add(spu);}}; + } + public SpuListDTO(List spuList){ + this.spuList = spuList; + } + @ApiModelProperty("spu集合") + private List spuList; + + private Boolean deleteFlag; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/StatusReqDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/StatusReqDTO.java new file mode 100644 index 0000000..85fd493 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/StatusReqDTO.java @@ -0,0 +1,28 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/24 10:18 上午 + */ +@Data +@ApiModel("用于编辑状态") +public class StatusReqDTO { + + @ApiModelProperty("主键id") + @NotEmpty(message = "主键id不能为空") + @Encrypt + private List ids; + + @ApiModelProperty("状态") + private Integer status; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/api/dto/UpdatePriceItemValueDTO.java b/skyer-goods/src/main/java/org/skyer/goods/api/dto/UpdatePriceItemValueDTO.java new file mode 100644 index 0000000..604000b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/api/dto/UpdatePriceItemValueDTO.java @@ -0,0 +1,37 @@ +package org.skyer.goods.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("更新值集") +@Data +public class UpdatePriceItemValueDTO { + + + @ApiModelProperty("value编码") + String value; + + @ApiModelProperty("value含义") + String meaning; + + @ApiModelProperty("排序标识") + Integer orderSeq; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("生效标识") + private Integer enabledFlag; + + + //==================== + + // @ApiModelProperty("值集值ID") + // private Long lovValueId; + // + // @ApiModelProperty("值集ID") + // private Long lovId; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeService.java new file mode 100644 index 0000000..4920928 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 商品分类属性表应用服务 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryAttributeService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeValueService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeValueService.java new file mode 100644 index 0000000..852a3b3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryAttributeValueService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 商品分类属性值表应用服务 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryAttributeValueService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryService.java new file mode 100644 index 0000000..0874fc4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/CategoryService.java @@ -0,0 +1,9 @@ +package org.skyer.goods.app.service; + +/** + * 商品分类表应用服务 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryService { +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/InstallServiceService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/InstallServiceService.java new file mode 100644 index 0000000..06d5fdc --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/InstallServiceService.java @@ -0,0 +1,69 @@ +package org.skyer.goods.app.service; + +import cn.hutool.core.lang.Dict; +import org.skyer.core.domain.Page; +import org.skyer.goods.domain.dto.InstallServiceDTO; +import org.skyer.goods.domain.dto.PageInstallServiceDTO; +import org.skyer.goods.domain.entity.InstallService; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * 安装服务应用服务 + * + * @author chenzz 2021-08-18 15:42:47 + */ +public interface InstallServiceService { + + /** + * 列表 + * + * @param installServiceDTO + * @return + */ + List list(PageInstallServiceDTO installServiceDTO); + + /** + * 分页 + * + * @param pageRequest + * @param installServiceDTO + * @return + */ + Page page(PageRequest pageRequest, PageInstallServiceDTO installServiceDTO); + + /** + * 详情 + * + * @param id + * @return + */ + Dict detail(Long id); + + /** + * 添加,创建 + * + * @param dto + * @return + */ + Boolean create(@RequestBody InstallServiceDTO dto); + + /** + * 更新,修改 + * + * @param dto + * @return + */ + Boolean update(@RequestBody InstallServiceDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return + */ + Boolean batchRemove(List ids); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/MyEncryptionService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/MyEncryptionService.java new file mode 100644 index 0000000..6275f6e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/MyEncryptionService.java @@ -0,0 +1,33 @@ +package org.skyer.goods.app.service; + +/** + * 加密工具(针对字符串,id等进行加密) + * + * @author chenzz + */ +public interface MyEncryptionService { + + /** + * 加密字符串 + * + * @param text + * @return + */ + String encrypt(String text); + + /** + * 加密id + * + * @param id + * @return + */ + String encrypt(Long id); + + /** + * 加密id + * + * @param id + * @return + */ + String encrypt(Integer id); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueDraftService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueDraftService.java new file mode 100644 index 0000000..6269061 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueDraftService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * sku属性关联草稿表应用服务 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:23:43 + */ +public interface SkuAttributeValueDraftService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueService.java new file mode 100644 index 0000000..9bfdaee --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAttributeValueService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * sku属性关联表应用服务 + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +public interface SkuAttributeValueService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAuditSettingService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAuditSettingService.java new file mode 100644 index 0000000..b7d6830 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuAuditSettingService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 商品SKU审核应用服务 + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +public interface SkuAuditSettingService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuDraftService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuDraftService.java new file mode 100644 index 0000000..a4c8731 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuDraftService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 商品规格草稿表应用服务 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +public interface SkuDraftService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuEsService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuEsService.java new file mode 100644 index 0000000..8f97c58 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuEsService.java @@ -0,0 +1,65 @@ +package org.skyer.goods.app.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsSkuPageDTO; +import org.skyer.goods.domain.entity.Sku; +import org.skyer.goods.domain.vo.GoodsSkuPageVO; + +import java.io.IOException; +import java.util.List; +import java.util.function.Supplier; + +/** + * @author zhanglb + */ +public interface SkuEsService { + + + /** + * 创建skuList异步saga任务 + * @param skuList skuList + * @return List + */ + List syncSkuListEsSage(List skuList); + + /** + * 消费异步saga任务 + * @param skuListJsonStr skuListJsonStr + * @return List + * @throws IOException 转换异常 + */ + List syncSkuListEsSageTask(String skuListJsonStr) throws IOException; + + /** + * 批量删除es数据 到saga + * @param skuList skuList + * @return List + */ + List syncDelSkuListEsSage(List skuList); + + /** + * 批量删除es数据 + * @param skuListJsonStr skuListJsonStr + * @return List + * @throws IOException 删除异常 + */ + List syncDelSkuListEsSageTask(String skuListJsonStr) throws IOException; + + /** + * 清空sku所有记录 + */ + void delSkuEsAll() throws Exception; + + /** + * es查询sku列表 + * @param goodsSkuPageDTO skuPage + * @return Page + */ + Page listPage(GoodsSkuPageDTO goodsSkuPageDTO) throws Exception; + + /** + * 批量导入sku的所有数据 + * @throws IOException 导入异常 + */ + void skuStatusUp() throws IOException; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuPackageService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuPackageService.java new file mode 100644 index 0000000..2de640f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuPackageService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 应用服务 + * + * @author zhanglongbing@ebc.com 2022-03-03 10:45:30 + */ +public interface SkuPackageService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuService.java new file mode 100644 index 0000000..7329b58 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SkuService.java @@ -0,0 +1,114 @@ +package org.skyer.goods.app.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.*; +import org.skyer.goods.domain.dto.AuditDTO; +import org.skyer.goods.domain.dto.SkuAuditDTO; +import org.skyer.goods.domain.vo.*; +import org.skyer.mybatis.pagehelper.domain.PageRequest; + +import java.util.List; + +/** + * 商品规格表应用服务 + * + * @author chenzz 2021-07-06 10:35:43 + */ +public interface SkuService { + + /** + * sku商品分页,返回商品的资料 + * @param goodsSku + * @return + */ + Page listPage( GoodsSkuPageDTO goodsSku); + + /** + * 查看商品详情 + * @param id skuId + * @param isEdit 是否编辑 + * @return + */ + GoodsSkuDetailVO getDetail(Long id, boolean isEdit); + + /** + * 保存sku + * + * @param skuBatchSaveDTO + * @return + */ + Boolean saveSku(SkuBatchSaveDTO skuBatchSaveDTO); + + /** + * 删除sku + * + * @param ids + * @return + */ + Boolean deleteByIds(List ids); + + /** + * 变更sku信息 + * + * @param updateDTO + * @return + */ + boolean updateSku(SkuUpdateDTO updateDTO); + + /** + * 批量提交数据 + * + * @param batchAuditDTO + * @return + */ + int batchAudit(SkuBatchAuditDTO batchAuditDTO); + + + /** + * 根据商品id获取sku列表和属性列表 + * + * @param spuId + * @return + */ + List getSkuAndAttributeDataByGoodsId(Long spuId); + + + /** + * 查询rpc商品 + * + * @param skuCodeList + * @return + */ + List queryRPCGoodsList(List skuCodeList); + + + /** + * 查询套餐内的详情 + * @param skuCodeList + * @return + */ + List getMealsGoodsList(List skuCodeList); + /** + * 查询订单RpcVo + * @param skuCodeList skuList + * @return List + */ + List queryOrderRpcList(List skuCodeList); + + + /** + * 获取审核详情 + * + * @author lixiaoyang + * @date 2021/12/30 11:11 + */ + SkuAuditVO getAuditDetail(SkuAuditDTO dto); + + /** + * SKU审核操作 + * + * @author lixiaoyang + * @date 2021/12/30 14:44 + */ + Boolean skuAudit(AuditDTO dto); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeService.java new file mode 100644 index 0000000..ab864be --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 属性表应用服务 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +public interface SpuAttributeService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeValueService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeValueService.java new file mode 100644 index 0000000..fb64341 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuAttributeValueService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 属性值表应用服务 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +public interface SpuAttributeValueService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuEsService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuEsService.java new file mode 100644 index 0000000..2a6940d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuEsService.java @@ -0,0 +1,66 @@ +package org.skyer.goods.app.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.api.dto.SpuListDTO; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.vo.GoodsPageResVO; + +import java.io.IOException; +import java.util.List; +import java.util.function.Supplier; + +/** + * 查询或者更新es + * + * @description + * @Author lzh + * @create 2022/1/6 + */ +public interface SpuEsService { + + /** + * 生成spu集合数据,同步到es + * @param spuListDTO 包含spu列表的DTO + */ + SpuListDTO syncSpuEsSage(SpuListDTO spuListDTO); + + /** + * saga task消费同步es数据 + * @param spuListJSONStr spuListDTO的json串 + * @return SpuListDTO + * @throws IOException + */ + SpuListDTO syncSpuEsSageTask(String spuListJSONStr) throws IOException; + + /** + * 将spu数据存入es + * + * @param + */ + void createOrUpdateSpuEs(Spu spu); + + /** + * 查询商品 + * @param goodsPageReqDTO + * @return + */ + Page querySpuEs(GoodsPageReqDTO goodsPageReqDTO) throws Exception; + + /** + * 删除es数据 + */ + void delSpuEs(List spuList); + + /** + * 清空库存所有记录 + */ + void delSpuEsAll(); + + /** + * 批量导入商品数据 + * @return + * @throws IOException + */ + void productStatusUp() throws IOException; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceService.java new file mode 100644 index 0000000..7a7d4db --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceService.java @@ -0,0 +1,58 @@ +package org.skyer.goods.app.service; + +import cn.hutool.core.lang.Dict; +import org.skyer.core.domain.Page; +import org.skyer.goods.domain.dto.PageSpuInstallServiceDTO; +import org.skyer.goods.domain.dto.SpuInstallServiceDTO; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * 商品安装服务应用服务 + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceService { + /** + * 分页 + * + * @param pageRequest + * @param spuInstallService + * @return + */ + Page page(PageRequest pageRequest, PageSpuInstallServiceDTO spuInstallService); + + /** + * 详情 + * + * @param id + * @return + */ + Dict detail(Long id); + + /** + * 添加,创建 + * + * @param spuInstallServiceDTO + * @return + */ + Boolean create(@RequestBody SpuInstallServiceDTO spuInstallServiceDTO); + + /** + * 更新,修改 + * + * @param spuInstallServiceDTO + * @return + */ + Boolean update(@RequestBody SpuInstallServiceDTO spuInstallServiceDTO); + + /** + * 批量删除 + * + * @param ids + * @return + */ + Boolean batchRemove(List ids); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceSkuService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceSkuService.java new file mode 100644 index 0000000..c1f785f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceSkuService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 商品安装服务sku表应用服务 + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceSkuService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceStoreService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceStoreService.java new file mode 100644 index 0000000..2037023 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuInstallServiceStoreService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 商品安装服务售卖门店应用服务 + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceStoreService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumService.java new file mode 100644 index 0000000..a460769 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumService.java @@ -0,0 +1,59 @@ +package org.skyer.goods.app.service; + +import cn.hutool.core.lang.Dict; +import org.skyer.core.domain.Page; +import org.skyer.goods.domain.dto.PageSonMumDTO; +import org.skyer.goods.domain.dto.SpuSonMumDTO; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * 子母商品应用服务 + * + * @author chenzz 2021-08-16 15:04:38 + */ +public interface SpuSonMumService { + + /** + * 分页 + * + * @param pageRequest + * @param spuSonMum + * @return + */ + Page page(PageRequest pageRequest, PageSonMumDTO spuSonMum); + + /** + * 详情 + * + * @param id + * @return + */ + Dict detail(Long id); + + /** + * 添加,创建 + * + * @param spuSonMumDTO + * @return + */ + Boolean create(@RequestBody SpuSonMumDTO spuSonMumDTO); + + /** + * 更新,修改 + * + * @param spuSonMumDTO + * @return + */ + Boolean update(@RequestBody SpuSonMumDTO spuSonMumDTO); + + /** + * 批量删除 + * + * @param ids + * @return + */ + Boolean batchRemove(List ids); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumSkuService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumSkuService.java new file mode 100644 index 0000000..ebf80c8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumSkuService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 子母商品sku表应用服务 + * + * @author chenzz 2021-08-17 15:49:14 + */ +public interface SpuSonMumSkuService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumStoreService.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumStoreService.java new file mode 100644 index 0000000..5a0b250 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/SpuSonMumStoreService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.app.service; + +/** + * 子母商品售卖门店应用服务 + * + * @author chenzz 2021-08-16 15:04:38 + */ +public interface SpuSonMumStoreService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeServiceImpl.java new file mode 100644 index 0000000..3ba9f20 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.CategoryAttributeService; +import org.springframework.stereotype.Service; +/** + * 商品分类属性表应用服务默认实现 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@Service +public class CategoryAttributeServiceImpl implements CategoryAttributeService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeValueServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeValueServiceImpl.java new file mode 100644 index 0000000..0520573 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryAttributeValueServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.CategoryAttributeValueService; +import org.springframework.stereotype.Service; +/** + * 商品分类属性值表应用服务默认实现 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@Service +public class CategoryAttributeValueServiceImpl implements CategoryAttributeValueService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..5209f11 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/CategoryServiceImpl.java @@ -0,0 +1,21 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.core.exception.CommonException; +import org.skyer.goods.app.service.CategoryService; +import org.skyer.goods.domain.entity.Category; +import org.skyer.goods.domain.repository.CategoryRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +/** + * 商品分类表应用服务默认实现 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@Service +public class CategoryServiceImpl implements CategoryService { +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/InstallServiceServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/InstallServiceServiceImpl.java new file mode 100644 index 0000000..5febfb5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/InstallServiceServiceImpl.java @@ -0,0 +1,218 @@ +package org.skyer.goods.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.app.service.InstallServiceService; +import org.skyer.goods.app.service.MyEncryptionService; +import org.skyer.goods.domain.dto.InstallServiceDTO; +import org.skyer.goods.domain.dto.PageInstallServiceDTO; +import org.skyer.goods.domain.dto.ServiceZoneDTO; +import org.skyer.goods.domain.entity.InstallService; +import org.skyer.goods.domain.repository.InstallServiceRepository; +import org.skyer.goods.domain.vo.ChinaZoingRemoteVO; +import org.skyer.goods.infra.feign.ChinaZoingRemoteService; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 安装服务应用服务默认实现 + * + * @author chenzz 2021-08-18 15:42:47 + */ +@Service +public class InstallServiceServiceImpl implements InstallServiceService { + + @Autowired + private InstallServiceRepository installServiceRepository; + + @Autowired + private ChinaZoingRemoteService chinaZoingRemoteService; + + @Autowired + private MyEncryptionService myEncryptionService; + + @Override + public List list(PageInstallServiceDTO installServiceDTO) { + // 根据条件查找 + return installServiceRepository.selectByCondition(Condition.builder(InstallService.class) + .andWhere(Sqls.custom() + .andLike(InstallService.FIELD_SERVICE_CODE, installServiceDTO.getServiceCode(), true) + .andLike(InstallService.FIELD_NAME, installServiceDTO.getName(), true) + .andEqualTo(InstallService.FIELD_DELETE_FLAG, false)) + .build()); + } + + @Override + public Page page(PageRequest pageRequest, PageInstallServiceDTO installServiceDTO) { + Page page = PageHelper.doPageAndSort(pageRequest, () -> installServiceRepository.selectByCondition(Condition.builder(InstallService.class) + .andWhere(Sqls.custom() + .andLike(InstallService.FIELD_SERVICE_CODE, installServiceDTO.getServiceCode(), true) + .andLike(InstallService.FIELD_NAME, installServiceDTO.getName(), true) + .andEqualTo(InstallService.FIELD_DELETE_FLAG, false)) + .build())); + + List pageListContent = page.getContent(); + if (CollUtil.isNotEmpty(pageListContent)) { + List dictList = pageListContent.stream().map(xx -> { + Dict item = Dict.create(); + + item.set("id", myEncryptionService.encrypt(xx.getId())); + item.set("name", xx.getName()); + item.set("money", xx.getMoney()); + item.set("installServiceCode", xx.getServiceCode()); + item.set("peopleAmount", xx.getPeopleAmount()); + item.set("type", xx.getType()); + item.set("remark", xx.getRemark()); + item.set("createdBy", xx.getCreatedBy()); + item.set("creationDate", DateUtil.formatDateTime(xx.getCreationDate())); + + String serviceZone = xx.getServiceZone(); + if (StrUtil.isNotEmpty(serviceZone)) { + + List listServiceZone = JSONUtil.toList(serviceZone, ServiceZoneDTO.class); + + List listDict = listServiceZone.stream().map(ooo -> { + Dict itemDict = Dict.create().parseBean(ooo); + + ResponseEntity showDetails = chinaZoingRemoteService.showDetails(ooo.getCityId()); + if (HttpStatus.OK.equals(showDetails.getStatusCode())) { + ChinaZoingRemoteVO detailsBody = showDetails.getBody(); + if (null != detailsBody) { + itemDict.set("cityDetail", Dict.create() + .set("levelThreeAreaName", detailsBody.getLevelThreeAreaName()) + .set("levelTwoAreaName", detailsBody.getLevelTwoAreaName()) + .set("levelOneAreaName", detailsBody.getLevelOneAreaName()) + ); + } else { + itemDict.set("cityDetail", null); + } + } + + return itemDict; + }).collect(Collectors.toList()); + + item.set("serviceZone", listDict); + } + + return item; + }).collect(Collectors.toList()); + return new Page<>(dictList, new PageInfo(page.getTotalPages(), page.getSize()), page.getTotalElements()); + } + + return new Page<>(new ArrayList<>(), new PageInfo(0, page.getSize()), 0); + } + + @Override + public Dict detail(Long id) { + InstallService installService = installServiceRepository.selectByPrimaryKey(id); + + if (ObjectUtil.isNotNull(installService)) { + Dict dict = Dict.create(); + + dict.set("id", myEncryptionService.encrypt(installService.getId())); + dict.set("name", installService.getName()); + dict.set("money", installService.getMoney()); + dict.set("installServiceCode", installService.getServiceCode()); + dict.set("peopleAmount", installService.getPeopleAmount()); + dict.set("type", installService.getType()); + dict.set("remark", installService.getRemark()); + dict.set("createdBy", installService.getCreatedBy()); + dict.set("objectVersionNumber", installService.getObjectVersionNumber()); + dict.set("creationDate", DateUtil.formatDateTime(installService.getCreationDate())); + + String serviceZone = installService.getServiceZone(); + if (StrUtil.isNotEmpty(serviceZone)) { + List listServiceZone = JSONUtil.toList(serviceZone, ServiceZoneDTO.class); + + List listDict = listServiceZone.stream().map(ooo -> { + Dict itemDict = Dict.create().parseBean(ooo); + + ResponseEntity showDetails = chinaZoingRemoteService.showDetails(ooo.getCityId()); + if (HttpStatus.OK.equals(showDetails.getStatusCode())) { + ChinaZoingRemoteVO detailsBody = showDetails.getBody(); + if (null != detailsBody) { + itemDict.set("cityDetail", Dict.create() + .set("levelThreeAreaName", detailsBody.getLevelThreeAreaName()) + .set("levelTwoAreaName", detailsBody.getLevelTwoAreaName()) + .set("levelOneAreaName", detailsBody.getLevelOneAreaName()) + ); + } else { + itemDict.set("cityDetail", null); + } + } + + return itemDict; + }).collect(Collectors.toList()); + + dict.set("serviceZone", listDict); + } + return dict; + } + return Dict.create().parseBean(installService); + } + + @Override + public Boolean create(InstallServiceDTO dto) { + if (CollUtil.isEmpty(dto.getServiceZone())) { + throw new CommonException("没有设置服务区域!"); + } + InstallService installService = new InstallService(); + BeanUtils.copyProperties(dto, installService); + + if (StrUtil.isEmpty(dto.getServiceCode())) { + installService.setServiceCode(RandomUtil.randomString(6) + RandomUtil.randomNumbers(3) + RandomUtil.randomString(2)); + } + + // 获取租户的id + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + installService.setServiceZone(JSONUtil.parse(dto.getServiceZone()).toString()); + installService.setDeleteFlag(false); + installService.setTenantId(tenantId); + + return installServiceRepository.insert(installService) > 0; + } + + @Override + public Boolean update(InstallServiceDTO dto) { + InstallService installService = new InstallService(); + BeanUtils.copyProperties(dto, installService); + + if (CollUtil.isNotEmpty(dto.getServiceZone())) { + installService.setServiceZone(JSONUtil.parse(dto.getServiceZone()).toString()); + } + + return installServiceRepository.updateByPrimaryKeySelective(installService) > 0; + } + + @Override + public Boolean batchRemove(List ids) { + List installServiceList = installServiceRepository.selectByCondition(Condition.builder(InstallService.class) + .andWhere(Sqls.custom() + .andIn(InstallService.FIELD_ID, ids, true)) + .build()); + + return installServiceRepository.batchDelete(installServiceList) > 0; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/MyEncryptionServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/MyEncryptionServiceImpl.java new file mode 100644 index 0000000..7ebde3f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/MyEncryptionServiceImpl.java @@ -0,0 +1,38 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.MyEncryptionService; +import org.skyer.starter.keyencrypt.core.EncryptProperties; +import org.skyer.starter.keyencrypt.core.EncryptionService; +import org.skyer.starter.keyencrypt.core.IEncryptionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MyEncryptionServiceImpl implements MyEncryptionService { + @Autowired + private EncryptProperties encryptProperties; + + private IEncryptionService encryptionService = null; + + private IEncryptionService getEncryptionService() { + if (encryptionService == null) { + encryptionService = new EncryptionService(encryptProperties); + } + return encryptionService; + } + + @Override + public String encrypt(String text) { + return getEncryptionService().encrypt(text, ""); + } + + @Override + public String encrypt(Long id) { + return encrypt(String.valueOf(id)); + } + + @Override + public String encrypt(Integer id) { + return encrypt(String.valueOf(id)); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueDraftServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueDraftServiceImpl.java new file mode 100644 index 0000000..e1059a9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueDraftServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SkuAttributeValueDraftService; +import org.springframework.stereotype.Service; +/** + * sku属性关联草稿表应用服务默认实现 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:23:43 + */ +@Service +public class SkuAttributeValueDraftServiceImpl implements SkuAttributeValueDraftService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueServiceImpl.java new file mode 100644 index 0000000..021beb3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAttributeValueServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SkuAttributeValueService; +import org.springframework.stereotype.Service; +/** + * sku属性关联表应用服务默认实现 + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +@Service +public class SkuAttributeValueServiceImpl implements SkuAttributeValueService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAuditSettingServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAuditSettingServiceImpl.java new file mode 100644 index 0000000..87cc2d6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuAuditSettingServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SkuAuditSettingService; +import org.springframework.stereotype.Service; +/** + * 商品SKU审核应用服务默认实现 + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +@Service +public class SkuAuditSettingServiceImpl implements SkuAuditSettingService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuDraftServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuDraftServiceImpl.java new file mode 100644 index 0000000..152352a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuDraftServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SkuDraftService; +import org.springframework.stereotype.Service; +/** + * 商品规格草稿表应用服务默认实现 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +@Service +public class SkuDraftServiceImpl implements SkuDraftService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuEsServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuEsServiceImpl.java new file mode 100644 index 0000000..8ad4f7d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuEsServiceImpl.java @@ -0,0 +1,435 @@ +package org.skyer.goods.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.*; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.goods.api.dto.GoodsSkuPageDTO; +import org.skyer.goods.app.service.SkuEsService; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.entity.Sku; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.repository.*; +import org.skyer.goods.domain.vo.GoodsSkuPageVO; +import org.skyer.goods.domain.vo.SpuEsModel; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.util.EsBoolQueryUtil; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.skyer.saga.saga.SagaDefinition; +import org.skyer.saga.saga.annotation.Saga; +import org.skyer.saga.saga.annotation.SagaTask; +import org.skyer.saga.saga.producer.StartSagaBuilder; +import org.skyer.saga.saga.producer.TransactionalProducer; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +import static org.skyer.goods.domain.entity.Sku.*; + +/** + * @author zhanglb + */ +@Slf4j +@Service +public class SkuEsServiceImpl implements SkuEsService { + + @Autowired + private RestHighLevelClient client; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private SkuRepository skuRepository; + @Autowired + private SpuRepository spuRepository; + @Autowired + private MaterialRepository materialRepository; + @Autowired + private SkuAttributeValueRepository skuAttributeValueRepository; + @Autowired + private TransactionalProducer transactionalProducer; + + + @Override + @Saga(description = "同步skuList到saga", code = "sync-sku-list-es") + public List syncSkuListEsSage(List skuList) { + List skuCodeList = skuList.stream().map(Sku::getSkuCode).collect(Collectors.toList()); + List skuEsList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_SKU_CODE,skuCodeList)).build()); + + return transactionalProducer.applyAndReturn( + StartSagaBuilder.newBuilder() + .withSagaCode("sync-sku-list-es").withLevel(ResourceLevel.ORGANIZATION) + .withRefType("listSku") + .withSourceId(1L), + build -> { + build.withPayloadAndSerialize(skuEsList) + .withRefId(skuEsList.hashCode() + " time:" + System.currentTimeMillis()); + return skuEsList; + }); + } + + @SagaTask(description = "同步skuList到es sage task", + code = "sync-sku-es-list-sage-task", + sagaCode = "sync-sku-list-es", + concurrentLimitNum = 2, + concurrentLimitPolicy = SagaDefinition.ConcurrentLimitPolicy.NONE, + seq = 1) + @Override + public List syncSkuListEsSageTask(String skuListJsonStr) throws IOException { + List skuList = JSON.parseArray(skuListJsonStr, Sku.class); + BulkRequest bulkRequest = new BulkRequest(); + skuList.forEach(x -> { + //构造保存请求 + String jsonString = JSON.toJSONString(x); + IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SKU_INDEX); + indexRequest.id(x.getId().toString()); + indexRequest.source(jsonString, XContentType.JSON); + bulkRequest.add(indexRequest); + }); + client.bulk(bulkRequest, RequestOptions.DEFAULT); + return skuList; + } + + + + + + + @Override + public Page listPage(GoodsSkuPageDTO goodsSkuPageDTO) throws Exception { + + // 判断索引库是否存在 + if (!isExistsIndex(ObjectConstant.EsKey.SKU_INDEX)){ + return new Page<>(); + } + + if (CollUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())) { + goodsSkuPageDTO.setCategoryIdList(categoryRepository.getLaterCategoryId(goodsSkuPageDTO.getCategoryIdList())); + } + Page skuPage = new Page<>(); + int size = goodsSkuPageDTO.getSize(); + skuPage.setSize(size); + skuPage.setNumber(goodsSkuPageDTO.getPage() + 1); + SearchRequest searchRequest = this.buildSearchRequest(goodsSkuPageDTO); + try { + SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT); + SearchHits hits = search.getHits(); + long totalElements = hits.getTotalHits().value; + skuPage.setTotalElements(totalElements); + int total = (int) totalElements; + int page = total / size; + skuPage.setTotalPages(page); + List esSkuList = Arrays.stream(hits.getHits()).map(s -> JSON.parseObject(s.getSourceAsString()).toJavaObject(Sku.class)).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(esSkuList)){ + List skuIdList = esSkuList.stream().map(Sku::getId).collect(Collectors.toList()); + //查询数据库获取最新数据 + List skuList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_ID,skuIdList)).orderByDesc(AuditDomain.FIELD_CREATION_DATE).build()); + skuPage.setContent(this.getPageList(skuList)); + }else { + skuPage.setContent(new ArrayList<>()); + } + } catch (IOException e) { + e.printStackTrace(); + } + return skuPage; + } + + + private List getPageList(List skuList) { + List pageList = new ArrayList<>(); + if (CollUtil.isNotEmpty(skuList)) { + // 找出所有的商品数据 + Set goodsIds = skuList.stream().map(Sku::getSpuId).collect(Collectors.toSet()); + List spuList = spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom() + .andIn(org.skyer.goods.domain.entity.Spu.ID, goodsIds, true) + .andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false)) + .build()); + // 找出所有素材 + Set materialIds = spuList.stream().map(Spu::getMaterialId).collect(Collectors.toSet()); + List materialList = materialRepository.selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andIn("id", materialIds, true) + .andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false)) + .build()); + //属性 + List skuIdList = skuList.stream().map(Sku::getId).collect(Collectors.toList()); + List skuAttrValueRelationList = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andIn(SkuAttributeValue.FIELD_SKU_ID, skuIdList, true)) + .build()); + + //组装返回数据 + Map categoryMap = Maps.newHashMap(); + skuList.forEach(o -> { + GoodsSkuPageVO skuPageVO = new GoodsSkuPageVO(); + //复制id 价格等信息 + BeanUtils.copyProperties(o, skuPageVO); + //找到与sku匹配的spu + Spu tempSpu = spuList.stream().filter(xx -> xx.getId().longValue() == o.getSpuId().longValue()).findFirst().orElse(null); + if (ObjectUtil.isNotNull(tempSpu)) { + //设置sku属性字段 + skuPageVO.setMaterialId(tempSpu.getMaterialId()); + skuPageVO.setSpuName(tempSpu.getName()); + skuPageVO.setSpuType(tempSpu.getType()); + skuPageVO.setCategoryCode(tempSpu.getCategoryCode()); + skuPageVO.setSpuCode(tempSpu.getSpuCode()); + if (ObjectUtil.isNotNull(tempSpu.getRemark())) { + skuPageVO.setGoodsRemark(tempSpu.getRemark()); + } + + String categoryName = categoryMap.get(tempSpu.getCategoryId()); + if (StringUtils.isEmpty(categoryName)){ + categoryName = categoryRepository.getCategoryNameById(tempSpu.getCategoryId()); + categoryMap.put(tempSpu.getCategoryId(),categoryName); + } + skuPageVO.setCategoryName(categoryName); + //匹配素材 + if (ObjectUtil.isNotNull(tempSpu.getMaterialId())) { + skuPageVO.setMaterialId(tempSpu.getMaterialId()); + Material tempMaterial = materialList.stream().filter(xx -> xx.getId().longValue() == skuPageVO.getMaterialId().longValue()).findFirst().orElse(null); + if (ObjectUtil.isNotNull(tempMaterial)) { + skuPageVO.setMaterialMainImages(Arrays.asList(Optional.ofNullable(tempMaterial.getMainImage()).orElse("").split(","))); + skuPageVO.setMaterialName(tempMaterial.getMaterialName()); + } + } + //查询属性值 是带入初始属性 否放入到额外属性 + List skuAttrValueRelationLists= skuAttrValueRelationList.stream().filter(xx -> xx.getSkuId().longValue() == o.getId().longValue()).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(skuAttrValueRelationLists)) { + List originalAttributeList = skuAttrValueRelationLists.stream().filter(SkuAttributeValue::getIsSku).collect(Collectors.toList()); + skuPageVO.setSkuAttributeList(originalAttributeList); + + List attachedAttributeList = skuAttrValueRelationLists.stream().filter(f -> !f.getIsSku()).collect(Collectors.toList()); + skuPageVO.setOtherAttributeList(attachedAttributeList); + } + } + pageList.add(skuPageVO); + }); + } + return pageList; + } + + @Override + @Saga(description = "删除skuList到saga", code = "sync-del-sku-list-es") + public List syncDelSkuListEsSage(List skuList) { + return transactionalProducer.applyAndReturn( + StartSagaBuilder.newBuilder() + .withSagaCode("sync-del-sku-list-es").withLevel(ResourceLevel.ORGANIZATION) + .withRefType("listSku") + .withSourceId(1L), + build -> { + build.withPayloadAndSerialize(skuList) + .withRefId(skuList.hashCode() + " time:" + System.currentTimeMillis()); + return skuList; + }); + } + + @SagaTask(description = "同步skuList到es sage task", + code = "sync-del-sku-es-list-sage-task", + sagaCode = "sync-del-sku-list-es", + concurrentLimitNum = 2, + concurrentLimitPolicy = SagaDefinition.ConcurrentLimitPolicy.NONE, + seq = 1) + @Override + public List syncDelSkuListEsSageTask(String skuListJsonStr) throws IOException { + List skuList = JSON.parseArray(skuListJsonStr, Sku.class); + List keys = Lists.newArrayList(); + skuList.forEach(item -> keys.add(String.valueOf(item.getId()))); + DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SKU_INDEX); + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder = EsBoolQueryUtil.inStringQuery(queryBuilder, "id", keys); + request.setQuery(queryBuilder); + request.setTimeout(TimeValue.timeValueMinutes(2)); + client.deleteByQuery(request, RequestOptions.DEFAULT); + return skuList; + } + + @Override + public void delSkuEsAll() throws Exception { + if (isExistsIndex(ObjectConstant.EsKey.SKU_INDEX)) { + DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SKU_INDEX); + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + request.setQuery(queryBuilder); + request.setTimeout(TimeValue.timeValueMinutes(2)); + client.deleteByQuery(request, RequestOptions.DEFAULT); + } + } + + + @Override + public void skuStatusUp() throws IOException { + List skuList = skuRepository.selectAll(); + BulkRequest bulkRequest = new BulkRequest(); + skuList.forEach(x -> { + //构造保存请求 + IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SKU_INDEX); + indexRequest.id(x.getId().toString()); + String jsonString = JSON.toJSONString(x); + indexRequest.source(jsonString, XContentType.JSON); + bulkRequest.add(indexRequest); + }); + BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT); + } + + + /** + * 获取ES查询编辑器 + * + * @param goodsSkuPageDTO + * @return + */ + private SearchRequest buildSearchRequest(GoodsSkuPageDTO goodsSkuPageDTO) { + BoolQueryBuilder builder = QueryBuilders.boolQuery(); + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())|| + ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuName()) || + ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuCode()) || + ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuType())) { + List spuIds = this.esQuerySpuIds(goodsSkuPageDTO); + if (ObjectUtil.isEmpty(spuIds)){ + builder = EsBoolQueryUtil.andTermQuery(builder, "spuId", "-1"); + }else { + builder = EsBoolQueryUtil.inTermQuery(builder, "spuId", spuIds); + } + } + + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSkuCode())) { + builder = EsBoolQueryUtil.andStringQuery(builder, "skuCode",goodsSkuPageDTO.getSkuCode()); + } + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSkuName())) { + builder.must(QueryBuilders.matchPhraseQuery("skuName",goodsSkuPageDTO.getSkuName())); + } + if (Objects.nonNull(goodsSkuPageDTO.getSetFlag())) { + builder = EsBoolQueryUtil.andTermQuery(builder, "setFlag", goodsSkuPageDTO.getSetFlag()); + } + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getStatus())) { + builder = EsBoolQueryUtil.inTermQuery(builder, "status", goodsSkuPageDTO.getStatus()); + } + + + searchSourceBuilder.query(builder); + // 排序 + searchSourceBuilder.sort("creationDate",SortOrder.DESC); + searchSourceBuilder.trackTotalHits(true); + EsBoolQueryUtil.page(searchSourceBuilder, goodsSkuPageDTO.getPage(), goodsSkuPageDTO.getSize()); + return new SearchRequest(new String[]{ObjectConstant.EsKey.SKU_INDEX}, searchSourceBuilder); + } + + /** + * 在es中查询复核条件的spuId + * + * @param goodsSkuPageDTO 查询条件 + * @return spuIdList + */ + private List esQuerySpuIds(GoodsSkuPageDTO goodsSkuPageDTO) { + + BoolQueryBuilder builder = QueryBuilders.boolQuery(); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())) { + builder = EsBoolQueryUtil.inTermQuery(builder, "categoryId", goodsSkuPageDTO.getCategoryIdList()); + } + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuName())) { + builder.must(QueryBuilders.matchPhraseQuery("name",goodsSkuPageDTO.getSpuName())); + } + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuCode())) { + builder = EsBoolQueryUtil.andStringQuery(builder, "spuCode",goodsSkuPageDTO.getSpuCode()); + } + if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuType())) { + builder = EsBoolQueryUtil.andStringQuery(builder, "type", goodsSkuPageDTO.getSpuType()); + } + + searchSourceBuilder.size(9000); + searchSourceBuilder.query(builder); + searchSourceBuilder.trackTotalHits(true); + SearchRequest searchRequest = new SearchRequest(ObjectConstant.EsKey.SPU_INDEX); + searchRequest.source(searchSourceBuilder); + searchRequest.scroll(TimeValue.timeValueMinutes(2L)); + + List spuIds = Lists.newArrayList(); + try { + // 执行检索请求 + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + String scrollId = searchResponse.getScrollId(); + + SearchHits hits = searchResponse.getHits(); + if (hits.getHits() != null && hits.getHits().length > 0) { + for (SearchHit hit : hits.getHits()) { + SpuEsModel spu = JSON.parseObject(hit.getSourceAsString()).toJavaObject(SpuEsModel.class); + spuIds.add(spu.getId()); + } + } + while (true) { + // 5、循环创建SearchScrollRequest + SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); + //6、再指定scroll的生存时间,若不指定它会归零 + scrollRequest.scroll(TimeValue.timeValueMinutes(2L)); + //7、执行查询获取结果 + SearchResponse scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT); + //8、判断是否查询到了数据输出 + SearchHit[] scrollHits = scrollResp.getHits().getHits(); + if (scrollHits != null && scrollHits.length > 0) { + for (SearchHit hit : hits) { + SpuEsModel spu = JSON.parseObject(hit.getSourceAsString()).toJavaObject(SpuEsModel.class); + spuIds.add(spu.getId()); + } + } else { + //9、若无数据则退出 + break; + } + } + //10、创建ClearScrollRequest + ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); + //11、指定scrollId + clearScrollRequest.addScrollId(scrollId); + //12、删除scrollId + ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT); + //13、根据它返回判断删除成功没 + clearScrollResponse.isSucceeded(); + } catch (IOException e) { + e.printStackTrace(); + } + return spuIds; + } + + /** + * 判断一个索引是否存在 + * @param indexName + * @return + */ + private boolean isExistsIndex(String indexName) throws Exception{ + GetIndexRequest request = new GetIndexRequest(indexName); + return client.indices().exists(request, RequestOptions.DEFAULT); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuPackageServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuPackageServiceImpl.java new file mode 100644 index 0000000..b51c42f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuPackageServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SkuPackageService; +import org.springframework.stereotype.Service; +/** + * 应用服务默认实现 + * + * @author zhanglongbing@ebc.com 2022-03-03 10:45:30 + */ +@Service +public class SkuPackageServiceImpl implements SkuPackageService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuServiceImpl.java new file mode 100644 index 0000000..d04bc02 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SkuServiceImpl.java @@ -0,0 +1,1095 @@ +package org.skyer.goods.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; + +import org.skyer.core.cache.ProcessCacheValue; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.api.dto.*; +import org.skyer.goods.app.service.SkuEsService; +import org.skyer.goods.app.service.SkuService; +import org.skyer.goods.domain.dto.AuditDTO; +import org.skyer.goods.domain.dto.SkuAuditDTO; +import org.skyer.goods.domain.entity.*; +import org.skyer.goods.domain.repository.*; +import org.skyer.goods.domain.vo.*; +import org.skyer.goods.infra.util.Md5Utils; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.skyer.goods.domain.entity.Sku.*; + +/** + * 商品规格表应用服务默认实现 + * + * @author chenzz 2021-07-06 10:35:43 + */ +@Slf4j +@Service +public class SkuServiceImpl implements SkuService { + + @Autowired + private SkuRepository skuRepository; + @Autowired + private SkuAttributeValueRepository skuAttributeValueRepository; + @Autowired + private SkuDraftRepository skuDraftRepository; + @Autowired + private SkuAttributeValueDraftRepository skuAttributeValueDraftRepository; + @Autowired + private SkuAuditSettingRepository skuAuditSettingRepository; + @Autowired + private SpuRepository spuRepository; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private MaterialRepository materialRepository; + @Autowired + private BrandRepository brandRepository; + @Autowired + private SkuEsService skuEsService; + @Autowired + private SkuPackageRepository skuPackageRepository; + + @Override + public Page listPage(GoodsSkuPageDTO goodsSkuPageDTO) { + if (CollUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())) { + goodsSkuPageDTO.setCategoryIdList(categoryRepository.getLaterCategoryId(goodsSkuPageDTO.getCategoryIdList())); + } + Page pageList = skuRepository.pageSku(goodsSkuPageDTO); + List skuList = pageList.getContent(); + List pageVOS = new ArrayList<>(); + if (CollUtil.isNotEmpty(skuList)) { + // 找出所有的商品数据 + Set goodsIds = skuList.stream().map(Sku::getSpuId).collect(Collectors.toSet()); + List spuList = spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom() + .andIn(org.skyer.goods.domain.entity.Spu.ID, goodsIds, true) + .andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false)) + .build()); + // 找出所有素材 + Set materialIds = spuList.stream().map(Spu::getMaterialId).collect(Collectors.toSet()); + List materialList = materialRepository.selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andIn("id", materialIds, true) + .andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false)) + .build()); + //组装返回数据 + skuList.forEach(o -> { + GoodsSkuPageVO skuPageVO = new GoodsSkuPageVO(); + //复制id 价格等信息 + BeanUtils.copyProperties(o, skuPageVO); + //找到与sku匹配的spu + Spu tempSpu = spuList.stream().filter(xx -> xx.getId().longValue() == o.getSpuId().longValue()).findFirst().orElse(null); + if (ObjectUtil.isNotNull(tempSpu)) { + //设置sku属性字段 + skuPageVO.setMaterialId(tempSpu.getMaterialId()); + skuPageVO.setSpuName(tempSpu.getName()); + skuPageVO.setSpuCode(tempSpu.getSpuCode()); + if (ObjectUtil.isNotNull(tempSpu.getRemark())) { + skuPageVO.setGoodsRemark(tempSpu.getRemark()); + } + String categoryName = categoryRepository.getCategoryNameById(tempSpu.getCategoryId()); + skuPageVO.setCategoryName(categoryName); + //匹配素材 + if (ObjectUtil.isNotNull(tempSpu.getMaterialId())) { + skuPageVO.setMaterialId(tempSpu.getMaterialId()); + Material tempMaterial = materialList.stream().filter(xx -> xx.getId().longValue() == skuPageVO.getMaterialId().longValue()).findFirst().orElse(null); + if (ObjectUtil.isNotNull(tempMaterial)) { + skuPageVO.setMaterialMainImages(Arrays.asList(Optional.ofNullable(tempMaterial.getMainImage()).orElse("").split(","))); + skuPageVO.setMaterialName(tempMaterial.getMaterialName()); + } + } + //查询属性值 是带入初始属性 否放入到额外属性 + List skuAttrValueRelationList = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andEqualTo(SkuAttributeValue.FIELD_SKU_ID, o.getId(), true)) + .build()); + + if (CollUtil.isNotEmpty(skuAttrValueRelationList)) { + List originalAttributeList = skuAttrValueRelationList.stream().filter(SkuAttributeValue::getIsSku).collect(Collectors.toList()); + skuPageVO.setSkuAttributeList(originalAttributeList); + + List attachedAttributeList = skuAttrValueRelationList.stream().filter(f -> !f.getIsSku()).collect(Collectors.toList()); + skuPageVO.setOtherAttributeList(attachedAttributeList); + } + } + pageVOS.add(skuPageVO); + }); + } + return new Page<>(pageVOS, new PageInfo(pageList.getTotalPages(), pageList.getSize()), pageList.getTotalElements()); + } + + + @Override + public GoodsSkuDetailVO getDetail(Long id, boolean isEdit) { + Sku sku = skuRepository.selectByPrimaryKey(id); + GoodsSkuDetailVO goodsSkuVO = new GoodsSkuDetailVO(); + if (ObjectUtil.isNotEmpty(sku)) { + BeanUtils.copyProperties(sku, goodsSkuVO); + //如果是审核被驳回 需要去副本里寻找数据 + if (isEdit && Sku.STATUS_TAKE_EFFECT_REJECTED.equals(sku.getStatus())) { + SkuDraft skuDraft = skuDraftRepository.selectByPrimaryKey(sku.getId()); + if (ObjectUtil.isNotEmpty(skuDraft)) { + //把草稿里的属性覆盖给vo显示 + BeanUtils.copyProperties(skuDraft, goodsSkuVO); + } + } + + Spu spu = spuRepository.selectByPrimaryKey(sku.getSpuId()); + + if (ObjectUtil.isNotNull(spu)) { + //设置sku属性字段 + goodsSkuVO.setMaterialId(spu.getMaterialId()); + goodsSkuVO.setSpuName(spu.getName()); + goodsSkuVO.setSpuCode(spu.getSpuCode()); + if (ObjectUtil.isNotNull(spu.getRemark())) { + goodsSkuVO.setGoodsRemark(spu.getRemark()); + } + String categoryName = categoryRepository.getCategoryNameById(spu.getCategoryId()); + goodsSkuVO.setCategoryName(categoryName); + + //匹配素材 + if (ObjectUtil.isNotNull(spu.getMaterialId())) { + goodsSkuVO.setMaterialId(spu.getMaterialId()); + Material material = materialRepository.selectByPrimaryKey(spu.getMaterialId()); + if (ObjectUtil.isNotNull(material)) { + goodsSkuVO.setMaterialName(material.getMaterialName()); + goodsSkuVO.setMaterialMainImages(Arrays.asList(Optional.ofNullable(material.getMainImage()).orElse("").split(","))); + goodsSkuVO.setImageList(Arrays.asList(Optional.ofNullable(material.getDetailImage()).orElse("").split(","))); + } + } + //查询属性值 是带入初始属性 否放入到额外属性 + List skuAttrValueRelationList = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andEqualTo(SkuAttributeValue.FIELD_SKU_ID, sku.getId(), true)) + .build()); + if (CollUtil.isNotEmpty(skuAttrValueRelationList)) { + List originalAttributeList = skuAttrValueRelationList.stream().filter(SkuAttributeValue::getIsSku).collect(Collectors.toList()); + List attachedAttributeList = skuAttrValueRelationList.stream().filter(f -> !f.getIsSku()).collect(Collectors.toList()); + //如果是审核被驳回 需要去副本里寻找数据 + if (isEdit && Sku.STATUS_TAKE_EFFECT_REJECTED.equals(sku.getStatus())) { + List oldSkuAttributeList = skuAttributeValueDraftRepository.selectByCondition(Condition.builder(SkuAttributeValueDraft.class) + .andWhere(Sqls.custom().andEqualTo(SkuAttributeValueDraft.FIELD_SKU_ID, sku.getId())).build()); + if (ObjectUtil.isNotEmpty(oldSkuAttributeList)) { + //处理原始属性 + if (ObjectUtil.isNotEmpty(originalAttributeList)) { + originalAttributeList.forEach(item -> { + SkuAttributeValueDraft skuAttributeValue = oldSkuAttributeList.stream().filter(f -> f.getId().equals(item.getId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(skuAttributeValue)) { + BeanUtils.copyProperties(skuAttributeValue, item); + } + }); + } + //处理额外属性 + if (ObjectUtil.isNotEmpty(attachedAttributeList)) { + attachedAttributeList.forEach(item -> { + SkuAttributeValueDraft skuAttributeValue = oldSkuAttributeList.stream().filter(f -> f.getId().equals(item.getId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(skuAttributeValue)) { + BeanUtils.copyProperties(skuAttributeValue, item); + } + }); + } + } + } + goodsSkuVO.setOtherAttributeList(attachedAttributeList); + goodsSkuVO.setSkuAttributeList(originalAttributeList); + } + //品牌 + Brand brand = brandRepository.selectByPrimaryKey(spu.getBrandId()); + if (ObjectUtil.isNotNull(brand)) { + goodsSkuVO.setBrandName(brand.getName()); + } + //套餐sku明细 + if (SET_FLAG_TRUE.equals(sku.getSetFlag())){ + List skuPackageList = skuPackageRepository.selectByCondition(Condition.builder(SkuPackage.class) + .andWhere(Sqls.custom().andEqualTo(SkuPackage.FIELD_SKU_ID,sku.getId())).build()); + if(ObjectUtil.isNotEmpty(skuPackageList)){ + List skuIds = skuPackageList.stream().map(SkuPackage::getPackageSkuId).collect(Collectors.toList()); + List skuList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_ID,skuIds)).build()); + List spuIds = skuList.stream().map(Sku::getSpuId).collect(Collectors.toList()); + List spuList = spuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_ID,spuIds)).build()); + List skuDetailList = skuPackageList.stream().map(skuPackage->{ + Sku skuDetail = skuList.stream().filter(f->f.getId().equals(skuPackage.getPackageSkuId())).findAny().orElse(null); + SkuPackageVO packageVO = new SkuPackageVO(); + if (ObjectUtil.isNotNull(skuDetail)){ + packageVO.setId(skuPackage.getId()); + packageVO.setSkuCode(skuDetail.getSkuCode()); + packageVO.setSkuName(skuDetail.getSkuName()); + packageVO.setCostPrice(skuDetail.getCostPrice()); + packageVO.setSalesPrice(skuDetail.getSalesPrice()); + packageVO.setNum(skuPackage.getNum()); + Spu spuDetail =spuList.stream().filter(f->f.getId().equals(skuDetail.getSpuId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(spuDetail)){ + packageVO.setSpuName(spuDetail.getName()); + packageVO.setSpuCode(spuDetail.getSpuCode()); + } + } + return packageVO; + }).collect(Collectors.toList()); + goodsSkuVO.setSkuDetailList(skuDetailList); + } + } + } + } + return goodsSkuVO; + } + + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public Boolean saveSku(SkuBatchSaveDTO skuBatchSaveDTO) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + //sku + List skuReqDTOList = skuBatchSaveDTO.getSkuList(); + if (ObjectUtil.isEmpty(skuReqDTOList)){ + throw new CommonException("请先生成sku列表"); + } + List codeList = skuReqDTOList.stream().map(SkuListRequestDTO::getSkuCode).filter(StringUtils::isNotEmpty).collect(Collectors.toList()); + long count = codeList.stream().distinct().count(); + if (count skuList = skuReqDTOList.stream().map(x -> { + + // 查看是否重复 + String md5ByLong=""; + if(!SET_FLAG_TRUE.equals(skuBatchSaveDTO.getSetFlag())){ + List skuAttributeValueList = x.getSkuAttributeList(); + List valueIdList; + if (ObjectUtil.isNotEmpty(skuAttributeValueList)) { + valueIdList = skuAttributeValueList.stream().map(AttributeDTO::getAttributeValue).filter(ObjectUtil::isNotNull).collect(Collectors.toList()); + } else { + valueIdList = new ArrayList<>(); + } + md5ByLong = Md5Utils.createMd5ByLong(valueIdList); + Sku oldSku = skuRepository.checkHaveSameSku(x.getSpuId(), md5ByLong); + if (ObjectUtil.isNotEmpty(oldSku)) { + throw new CommonException("当前属性已经生成sku:" + oldSku.getSkuCode()); + } + } + + if (ObjectUtil.isNotEmpty(x.getSkuCode())) { + Sku oldSkuCode = skuRepository.checkHaveSameSkuCode(x.getSkuCode()); + if (ObjectUtil.isNotNull(oldSkuCode)) { + throw new CommonException("当前skuCode已经生成sku:" + oldSkuCode.getSkuCode()); + } + } + Sku sku = new Sku(); + BeanUtils.copyProperties(x, sku); + sku.setMd5CheckValue(md5ByLong); + sku.setStatus(status); + sku.setSetFlag(skuBatchSaveDTO.getSetFlag()); + sku.setAuditCommitBy(userDetails.getUserId()); + return sku; + }).collect(Collectors.toList()); + //sku数据存储 获取sku存储id + skuRepository.batchInsertSelective(skuList); + List attributeValueList = new ArrayList<>(); + skuList.forEach(sku -> { + //处理原始属性 + List originalAttributeList = sku.getSkuAttributeList(); + if (ObjectUtil.isNotEmpty(originalAttributeList)) { + originalAttributeList.forEach(item -> { + SkuAttributeValue skuAttributeValue = new SkuAttributeValue(); + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setSkuId(sku.getId()); + skuAttributeValue.setIsSku(true); + attributeValueList.add(skuAttributeValue); + }); + } + //处理额外属性 + List attachedAttributeList = sku.getOtherAttributeList(); + if (ObjectUtil.isNotEmpty(attachedAttributeList)) { + attachedAttributeList.forEach(item -> { + SkuAttributeValue skuAttributeValue = new SkuAttributeValue(); + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setSkuId(sku.getId()); + skuAttributeValue.setIsSku(false); + attributeValueList.add(skuAttributeValue); + }); + } + }); + //套餐商品数据处理 + if (Sku.SET_FLAG_TRUE.equals(skuBatchSaveDTO.getSetFlag())){ + List addSkuPackageList = new ArrayList<>(); + skuList.forEach(sku -> { + List skuPackageList = sku.getSkuDetailList(); + if (ObjectUtil.isNotEmpty(skuPackageList)){ + skuPackageList.forEach(skuPackage -> { + skuPackage.setSkuId(sku.getId()); + skuPackage.setNum(skuPackage.getNum()==null?1:skuPackage.getNum()); + }); + addSkuPackageList.addAll(skuPackageList); + } + }); + skuPackageRepository.batchInsertSelective(addSkuPackageList); + } + //sku的属性存储 + skuAttributeValueRepository.batchInsertSelective(attributeValueList); + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + @Override + public void afterCommit() { + //数据保存到es + skuEsService.syncSkuListEsSage(skuList); + } + }); + return true; + } + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public Boolean deleteByIds(List ids) { + //判断是否可以删除 + List skuList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(Sku.FIELD_ID, ids, true)).build()); + + if (CollUtil.isEmpty(skuList)) { + throw new CommonException("查询不到sku"); + } + + List noDeleteList = skuList.stream().filter(f -> f.getStatus() > Sku.STATUS_REJECTED).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(noDeleteList)) { + StringJoiner stringJoiner = new StringJoiner(","); + noDeleteList.forEach(sku -> stringJoiner.add(sku.getSkuCode())); + throw new CommonException("SKU不可删除:" + stringJoiner); + } + //todo 判断是否有库存 + + //todo 判断是否有订单 + + List skuIdList = skuList.stream().map(Sku::getId).collect(Collectors.toList()); + List skuAttributeValues = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andIn(SkuAttributeValue.FIELD_SKU_ID, skuIdList, true)).build()); + List skuPackageList = skuPackageRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andIn(SkuPackage.FIELD_SKU_ID, skuIdList, true)).build()); + //删除属性和sku + skuAttributeValueRepository.batchDeleteByPrimaryKey(skuAttributeValues); + skuPackageRepository.batchDeleteByPrimaryKey(skuPackageList); + skuRepository.batchDeleteByPrimaryKey(skuList); + skuEsService.syncDelSkuListEsSage(skuList); + return true; + } + + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public boolean updateSku(SkuUpdateDTO updateDTO) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + SkuUpdateInfoDTO sku = updateDTO.getSku(); + if (StringUtils.isNotEmpty(sku.getSkuCode())) { + //去重校验 + Sku oldSkuCode = skuRepository.checkHaveSameSkuCodeWithOutSkuId(sku.getSkuCode(), sku.getId()); + if (ObjectUtil.isNotNull(oldSkuCode)) { + throw new CommonException("当前skuCode已经生成sku:" + sku.getSkuCode()); + } + } + //获取未更新之前的数据 + Sku oldSku = skuRepository.selectByPrimaryKey(sku.getId()); + //获取审核流程配置 + SkuAuditSetting skuAuditSetting = skuAuditSettingRepository.selectDefault(); + if (ObjectUtil.isNotNull(oldSku)) { + //状态如果为草稿 + if (Sku.STATUS_DRAFT.equals(oldSku.getStatus()) || Sku.STATUS_REJECTED.equals(oldSku.getStatus())) { + BeanUtils.copyProperties(sku, oldSku); + //判断是否提交审核 false为提交 + if (Boolean.FALSE.equals(updateDTO.getFlag())) { + //变更审核状态 + oldSku.setAuditCommitBy(userDetails.getUserId()); + oldSku.setAuditCommitDate(new Date()); + oldSku.setStatus(SkuAuditSetting.STATUS_ON.equals(skuAuditSetting.getUpdateAuditStatus()) ? STATUS_UNDER_REVIEW : STATUS_TAKE_EFFECT); + }else { + oldSku.setStatus(STATUS_DRAFT); + } + skuRepository.updateByPrimaryKeySelective(oldSku); + skuEsService.syncSkuListEsSage(Collections.singletonList(oldSku)); + // 变更属性表属性 + return this.updateSkuAttributeInfo(sku); + } + // 判断是否有审核流程 + if (SkuAuditSetting.STATUS_ON.equals(skuAuditSetting.getUpdateAuditStatus())) { + //判断是否监测价格 + if (SkuAuditSetting.STATUS_ON.equals(skuAuditSetting.getUpdatePriceStatus()) && this.isPriceChange(oldSku, sku)) { + return this.handleAuditSku(sku, oldSku, userDetails); + } else if (SkuAuditSetting.STATUS_ON.equals(skuAuditSetting.getUpdatePropertyStatus()) && this.isAttributeChange(oldSku, sku)) { + //属性改变 状态变更 + return this.handleAuditSku(sku, oldSku, userDetails); + } else { + //没有审核流程 直接更新sku数据 直接变成已生效 + BeanUtils.copyProperties(sku, oldSku); + oldSku.setStatus(STATUS_TAKE_EFFECT); + skuRepository.updateByPrimaryKeySelective(oldSku); + skuEsService.syncSkuListEsSage(Collections.singletonList(oldSku)); + // 变更属性表属性 + return this.updateSkuAttributeInfo(sku); + } + } else { + //没有审核流程 直接更新sku数据 直接变成已生效 + BeanUtils.copyProperties(sku, oldSku); + oldSku.setStatus(STATUS_TAKE_EFFECT); + skuRepository.updateByPrimaryKeySelective(oldSku); + skuEsService.syncSkuListEsSage(Collections.singletonList(oldSku)); + // 变更属性表属性 + return this.updateSkuAttributeInfo(sku); + } + } else { + throw new CommonException("查询不到数据"); + } + } + + /** + * 处理需要审核的sku + * + * @param sku 更新的数据 + * @param oldSku 旧数据 + * @return + */ + private boolean handleAuditSku(SkuUpdateInfoDTO sku, Sku oldSku, CustomUserDetails userDetails) { + if (STATUS_TAKE_EFFECT.equals(oldSku.getStatus())) { + // 保存新的数据到draft表 + SkuDraft skuDraft = new SkuDraft(); + BeanUtils.copyProperties(sku, skuDraft); + skuDraft.setSkuId(oldSku.getId()); + skuDraft.setShowFlag(1); + //数据存入到副本 + skuDraftRepository.insert(skuDraft); + List attributeValueList = new ArrayList<>(); + //处理原始属性 + List originalAttributeList = sku.getSkuAttributeList(); + if (ObjectUtil.isNotEmpty(originalAttributeList)) { + originalAttributeList.forEach(item -> { + SkuAttributeValueDraft skuAttributeValue = new SkuAttributeValueDraft(); + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setSkuId(sku.getId()); + skuAttributeValue.setIsSku(true); + attributeValueList.add(skuAttributeValue); + }); + } + //处理额外属性 + List attachedAttributeList = sku.getOtherAttributeList(); + if (ObjectUtil.isNotEmpty(attachedAttributeList)) { + attachedAttributeList.forEach(item -> { + SkuAttributeValueDraft skuAttributeValue = new SkuAttributeValueDraft(); + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setSkuId(sku.getId()); + skuAttributeValue.setIsSku(false); + attributeValueList.add(skuAttributeValue); + }); + } + skuAttributeValueDraftRepository.batchInsertSelective(attributeValueList); + } else if (STATUS_TAKE_EFFECT_REJECTED.equals(oldSku.getStatus())) { + //更新副本里的旧数据 + SkuDraft oldSkuDraft = skuDraftRepository.selectByPrimaryKey(oldSku.getId()); + List oldSkuAttributeList = skuAttributeValueDraftRepository.selectByCondition(Condition.builder(SkuDraft.class) + .andWhere(Sqls.custom().andEqualTo(SkuAttributeValueDraft.FIELD_SKU_ID, oldSku.getId())).build()); + if (ObjectUtil.isNotEmpty(oldSkuDraft)) { + BeanUtils.copyProperties(sku, oldSkuDraft); + skuDraftRepository.updateByPrimaryKeySelective(oldSkuDraft); + } + if (ObjectUtil.isNotEmpty(oldSkuAttributeList)) { + //处理原始属性 + List originalAttributeList = sku.getSkuAttributeList(); + if (ObjectUtil.isNotEmpty(originalAttributeList)) { + originalAttributeList.forEach(item -> { + SkuAttributeValueDraft skuAttributeValue = oldSkuAttributeList.stream().filter(f -> f.getId().equals(item.getId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(skuAttributeValue)) { + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setSkuId(sku.getId()); + skuAttributeValue.setIsSku(true); + } + }); + } + //处理额外属性 + List attachedAttributeList = sku.getOtherAttributeList(); + if (ObjectUtil.isNotEmpty(attachedAttributeList)) { + attachedAttributeList.forEach(item -> { + SkuAttributeValueDraft skuAttributeValue = oldSkuAttributeList.stream().filter(f -> f.getId().equals(item.getId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(skuAttributeValue)) { + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setSkuId(sku.getId()); + skuAttributeValue.setIsSku(false); + } + }); + } + skuAttributeValueDraftRepository.batchUpdateByPrimaryKeySelective(oldSkuAttributeList); + } + } + //变更sku状态数据 + oldSku.setAuditCommitBy(userDetails.getUserId()); + oldSku.setAuditCommitDate(new Date()); + oldSku.setStatus(STATUS_REVISING); + return skuRepository.updateOptional(oldSku, Sku.FIELD_STATUS, FIELD_AUDIT_COMMIT_DATE) > 0; + } + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public int batchAudit(SkuBatchAuditDTO batchAuditDTO) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + List skuIds = batchAuditDTO.getSkuIds(); + List skuList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_ID, skuIds, true)).build()); + if (ObjectUtil.isNotEmpty(skuList)) { + //判断状态是否能够更改 + //把状态变更为下一级 + skuList.forEach(m -> { + if (STATUS_DRAFT.equals(m.getStatus()) || STATUS_REJECTED.equals(m.getStatus())) { + m.setStatus(STATUS_UNDER_REVIEW); + } else if (STATUS_TAKE_EFFECT_REJECTED.equals(m.getStatus())) { + m.setStatus(STATUS_REVISING); + } else { + throw new CommonException("skuCode:" + m.getSkuCode() + " 不可提交"); + } + m.setAuditCommitBy(userDetails.getUserId()); + m.setAuditCommitDate(new Date()); + }); + skuRepository.batchUpdateByPrimaryKeySelective(skuList); + skuEsService.syncSkuListEsSage(skuList); + } else { + throw new CommonException("查询不到数据"); + } + return 0; + } + + /** + * 变更 sku的属性 + * + * @param updateSku + */ + private boolean updateSkuAttributeInfo(SkuUpdateInfoDTO updateSku) { + List attributeValueList = new ArrayList<>(); + //处理原始属性 + List originalAttributeList = updateSku.getSkuAttributeList(); + if (ObjectUtil.isNotEmpty(originalAttributeList)) { + originalAttributeList.forEach(item -> { + SkuAttributeValue skuAttributeValue = new SkuAttributeValue(); + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setIsSku(true); + attributeValueList.add(skuAttributeValue); + }); + } + + //处理额外属性 + List attachedAttributeList = updateSku.getOtherAttributeList(); + if (ObjectUtil.isNotEmpty(attachedAttributeList)) { + attachedAttributeList.forEach(item -> { + SkuAttributeValue skuAttributeValue = new SkuAttributeValue(); + BeanUtils.copyProperties(item, skuAttributeValue); + skuAttributeValue.setIsSku(false); + attributeValueList.add(skuAttributeValue); + }); + } + //sku的属性存储 + return !skuAttributeValueRepository.batchUpdateByPrimaryKeySelective(attributeValueList).isEmpty(); + } + + /** + * 判断sku价格是否变动 + * + * @param oldSku + * @param updateSku + * @return + */ + private boolean isPriceChange(Sku oldSku, SkuUpdateInfoDTO updateSku) { + + if (ObjectUtil.isNull(oldSku) || ObjectUtil.isNull(updateSku)) { + return true; + } + if (oldSku.getCostPrice().compareTo(updateSku.getCostPrice()) != 0) { + return true; + } + if (oldSku.getSalesPrice().compareTo(updateSku.getSalesPrice()) != 0) { + return true; + } + if (oldSku.getActivityPrice().compareTo(updateSku.getActivityPrice()) != 0) { + return true; + } + if (oldSku.getMarketPrice().compareTo(updateSku.getMarketPrice()) != 0) { + return true; + } + if (oldSku.getDistributionPrice().compareTo(updateSku.getDistributionPrice()) != 0) { + return true; + } + return oldSku.getWholesalePrice().compareTo(updateSku.getWholesalePrice()) != 0; + } + + /** + * 判断属性是否有变动 + * + * @param oldSku + * @param updateSku + * @return + */ + private boolean isAttributeChange(Sku oldSku, SkuUpdateInfoDTO updateSku) { + // 判断属性值是否变动 + if (ObjectUtil.isNull(oldSku) || ObjectUtil.isNull(updateSku)) { + return true; + } + + if (oldSku.getWeight().compareTo(updateSku.getWeight()) != 0) { + return true; + } + if (oldSku.getLength().compareTo(updateSku.getLength()) != 0) { + return true; + } + if (oldSku.getWidth().compareTo(updateSku.getWidth()) != 0) { + return true; + } + if (oldSku.getHeight().compareTo(updateSku.getHeight()) != 0) { + return true; + } + + //根据oldSku 查询出旧的两个List + List oldSkuAttributeValueList = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andEqualTo(SkuAttributeValue.FIELD_SKU_ID, oldSku.getId())).build()); + + //循环对比值是否更改 + List skuAttributeList = updateSku.getSkuAttributeList(); + List otherAttributeList = updateSku.getOtherAttributeList(); + if (ObjectUtil.isEmpty(skuAttributeList) || ObjectUtil.isEmpty(otherAttributeList)) { + return true; + } + //数据值不同的数组 + List differentList = new ArrayList<>(); + oldSkuAttributeValueList.forEach(item -> { + SkuAttributeValue skuAttributeValue = skuAttributeList.stream().filter(f -> f.getId().equals(item.getId()) && !f.getAttributeValue().equals(item.getAttributeValue())).findAny().orElse(null); + if (ObjectUtil.isNotNull(skuAttributeValue)) { + differentList.add(skuAttributeValue); + } + SkuAttributeValue skuAttributeValue1 = otherAttributeList.stream().filter(f -> f.getId().equals(item.getId()) && !f.getAttributeValue().equals(item.getAttributeValue())).findAny().orElse(null); + if (ObjectUtil.isNotNull(skuAttributeValue1)) { + differentList.add(skuAttributeValue1); + } + }); + return ObjectUtil.isNotEmpty(differentList); + } + + + @Override + public List getSkuAndAttributeDataByGoodsId(Long spuId) { + + List skuList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andEqualTo(Sku.FIELD_SPU_ID, spuId, true)).build()); + + List goodsSkuPageVos = new ArrayList<>(); + if (CollUtil.isNotEmpty(skuList)) { + Set skuIds = skuList.stream().map(Sku::getId).collect(Collectors.toSet()); + // 找出所有的商品数据 + Set goodsIds = skuList.stream().map(Sku::getSpuId).collect(Collectors.toSet()); + List spuList = spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom() + .andIn(Spu.ID, goodsIds, true) + .andEqualTo(Spu.DELETE_FLAG, false)) + .build()); + // 找出所有素材 + Set materialIds = spuList.stream().map(Spu::getMaterialId).collect(Collectors.toSet()); + List materialList = materialRepository.selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andIn("id", materialIds, true) + .andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false)).build()); + //找出所有属性 + List skuAttrValueRelationList = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class) + .andWhere(Sqls.custom().andIn(SkuAttributeValue.FIELD_SKU_ID, skuIds, true)).build()); + //找出所有sku明细 + List skuPackageList = skuPackageRepository.selectByCondition(Condition.builder(SkuPackage.class) + .andWhere(Sqls.custom().andIn(SkuPackage.FIELD_SKU_ID, skuIds, true)).build()); + List skuDetailLists = new ArrayList<>(); + List spuDetailLists = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(skuPackageList)){ + List detailSkuIds = skuPackageList.stream().map(SkuPackage::getPackageSkuId).collect(Collectors.toList()); + skuDetailLists = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(Sku.FIELD_ID, detailSkuIds, true)).build()); + List spuIds = skuDetailLists.stream().map(Sku::getSpuId).collect(Collectors.toList()); + spuDetailLists = spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom().andIn(Spu.ID, spuIds, true)).build()); + } + //组装返回数据 + List finalSkuDetailLists = skuDetailLists; + List finalSpuDetailLists = spuDetailLists; + skuList.forEach(o -> { + GoodsSkuDetailVO skuDetailVO = new GoodsSkuDetailVO(); + //复制id 价格等信息 + BeanUtils.copyProperties(o, skuDetailVO); + //找到与sku匹配的spu + Spu tempSpu = spuList.stream().filter(xx -> xx.getId().longValue() == o.getSpuId().longValue()).findFirst().orElse(null); + if (ObjectUtil.isNotNull(tempSpu)) { + //设置sku属性字段 + skuDetailVO.setMaterialId(tempSpu.getMaterialId()); + skuDetailVO.setSpuName(tempSpu.getName()); + skuDetailVO.setSpuCode(tempSpu.getSpuCode()); + if (ObjectUtil.isNotNull(tempSpu.getRemark())) { + skuDetailVO.setGoodsRemark(tempSpu.getRemark()); + } + String categoryName = categoryRepository.getCategoryNameById(tempSpu.getCategoryId()); + skuDetailVO.setCategoryName(categoryName); + //匹配素材 + if (ObjectUtil.isNotNull(tempSpu.getMaterialId())) { + skuDetailVO.setMaterialId(tempSpu.getMaterialId()); + Material tempMaterial = materialList.stream().filter(xx -> xx.getId().longValue() == skuDetailVO.getMaterialId().longValue()).findFirst().orElse(null); + if (ObjectUtil.isNotNull(tempMaterial)) { + skuDetailVO.setMaterialMainImages(Arrays.asList(Optional.ofNullable(tempMaterial.getMainImage()).orElse("").split(","))); + } + } + //匹配属性 + if (CollUtil.isNotEmpty(skuAttrValueRelationList)) { + + List skuAttributeValues = skuAttrValueRelationList.stream().filter(f->f.getSkuId().equals(o.getId())).collect(Collectors.toList()); + + List originalAttributeList = skuAttributeValues.stream().filter(SkuAttributeValue::getIsSku).collect(Collectors.toList()); + skuDetailVO.setSkuAttributeList(originalAttributeList); + + List attachedAttributeList = skuAttributeValues.stream().filter(f -> !f.getIsSku()).collect(Collectors.toList()); + skuDetailVO.setOtherAttributeList(attachedAttributeList); + } + + if (SET_FLAG_TRUE.equals(o.getSetFlag())){ + //遍历组装套餐sku明细 + List skuDetailList = skuPackageList.stream().map(skuPackage->{ + Sku skuDetail = finalSkuDetailLists.stream().filter(f->f.getId().equals(skuPackage.getPackageSkuId())).findAny().orElse(null); + SkuPackageVO packageVO = new SkuPackageVO(); + if (ObjectUtil.isNotNull(skuDetail)){ + packageVO.setId(skuPackage.getId()); + packageVO.setSkuCode(skuDetail.getSkuCode()); + packageVO.setSkuName(skuDetail.getSkuName()); + packageVO.setCostPrice(skuDetail.getCostPrice()); + packageVO.setSalesPrice(skuDetail.getSalesPrice()); + packageVO.setNum(skuPackage.getNum()); + Spu spuDetail = finalSpuDetailLists.stream().filter(f->f.getId().equals(skuDetail.getSpuId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(spuDetail)){ + packageVO.setSpuName(spuDetail.getName()); + packageVO.setSpuCode(spuDetail.getSpuCode()); + } + } + return packageVO; + }).collect(Collectors.toList()); + skuDetailVO.setSkuDetailList(skuDetailList); + } + + } + goodsSkuPageVos.add(skuDetailVO); + }); + } + return goodsSkuPageVos; + } + + + @Override + public List queryRPCGoodsList(List skuCodeList) { + return skuRepository.queryRPCGoodsList(skuCodeList); + } + + @Override + public List getMealsGoodsList(List skuCodeList) { + skuCodeList = skuCodeList.stream().distinct().collect(Collectors.toList()); + List rpcOrderResVOList = Lists.newArrayList(); + List mainSkuList = skuRepository.getSkuListBySkuCode(skuCodeList); + List mainIdList = mainSkuList.parallelStream().map(Sku::getId).collect(Collectors.toList()); + mainIdList.forEach(mainId->{ + List skuPackages = skuPackageRepository.querySkuPackageByMainId(mainId); + List sonSkuList = skuRepository.getSkuListBySkuId(skuPackages.parallelStream().map(SkuPackage::getPackageSkuId).collect(Collectors.toList())); + List sonSkuCodeList = sonSkuList.parallelStream().map(Sku::getSkuCode).collect(Collectors.toList()); + List rpcORderResVOS = this.queryOrderRpcList(sonSkuCodeList); + Map skuIdRpcGoodsResVoMap = rpcORderResVOS.stream().collect(Collectors.toMap(RpcOrderResVO::getSkuId, Function.identity(), (o1, o2) -> o1)); + rpcOrderResVOList.addAll(skuPackages.stream().map(skuPackage -> { + RpcOrderResVO rpcOrderResVO = skuIdRpcGoodsResVoMap.get(skuPackage.getPackageSkuId()); + rpcOrderResVO.setNum(skuPackage.getNum()); + rpcOrderResVO.setMainSkuCode(skuRepository.selectByPrimaryKey(skuPackage.getSkuId()).getSkuCode()); + return rpcOrderResVO; + }).collect(Collectors.toList())); + }); + return rpcOrderResVOList; + } + + @Override + public List queryOrderRpcList(List skuCodeList) { + if(ObjectUtil.isEmpty(skuCodeList)){ + return new ArrayList<>(); + } + //查询sku 与spu的基础信息 + List skuGoodsList = skuRepository.queryOrderRpcList(skuCodeList); + skuGoodsList.forEach(skuGood->{ + //把品牌id转换为品牌数据 + if (ObjectUtil.isNotEmpty(skuGood.getBrandInfo())){ + Brand brand = brandRepository.selectByPrimaryKey(Long.valueOf(skuGood.getBrandInfo())); + skuGood.setBrandInfo(ObjectUtil.isNull(brand)?"":JSON.toJSONString(brand)); + }else { + skuGood.setBrandInfo(""); + } + //把素材id 转换为素材数据 + if (ObjectUtil.isNotEmpty(skuGood.getMaterialInfo())){ + Material material = materialRepository.selectByPrimaryKey(Long.valueOf(skuGood.getMaterialInfo())); + skuGood.setMaterialInfo(ObjectUtil.isNull(material)?"":JSON.toJSONString(material)); + }else { + skuGood.setMaterialInfo(""); + } + //根据分类id 转化为分类数据 + if (ObjectUtil.isNotEmpty(skuGood.getCategoryInfo())){ + Category category = categoryRepository.selectByPrimaryKey(Long.valueOf(skuGood.getCategoryInfo())); + skuGood.setCategoryInfo(ObjectUtil.isNull(category)?"":JSON.toJSONString(category)); + }else { + skuGood.setCategoryInfo(""); + } + //根据skuId 查询属性列表 + List skuAttributeValues = skuAttributeValueRepository.queryAllBySkuId(skuGood.getSkuId()); + if (ObjectUtil.isNotEmpty(skuAttributeValues)){ + skuGood.setAttributeInfo(JSON.toJSONString(skuAttributeValues)); + }else { + skuGood.setAttributeInfo(""); + } + + }); + return skuGoodsList; + } + + + + + + @Override + @ProcessCacheValue + public SkuAuditVO getAuditDetail(SkuAuditDTO dto) { + SkuAuditVO vo = new SkuAuditVO(); + Long id = dto.getId(); + GoodsSkuAuditVO thisSkuVO = new GoodsSkuAuditVO(); + Sku sku = skuRepository.selectByPrimaryKey(id); + if (ObjectUtils.isEmpty(sku)) { + throw new CommonException("SKU未找到"); + } + // 获取spu信息 + Long spuId = sku.getSpuId(); + Spu spu = spuRepository.selectByPrimaryKey(spuId); + // 设置spu信息 + thisSkuVO.setSpuName(spu.getName()); + thisSkuVO.setSpuCode(spu.getSpuCode()); + + //获取分类名 + Long categoryId = spu.getCategoryId(); + String categoryName = categoryRepository.getCategoryNameById(categoryId); + thisSkuVO.setCategoryName(categoryName); + + // 获取品牌信息 + Long brandId = spu.getBrandId(); + if(ObjectUtil.isNotNull(brandId)){ + Brand brand = brandRepository.selectByPrimaryKey(brandId); + thisSkuVO.setBrandName(brand.getName()); + } + + + // 获取素材信息 + Long materialId = spu.getMaterialId(); + Material material = materialRepository.selectByPrimaryKey(materialId); + thisSkuVO.setMaterialName(material.getMaterialName()); + thisSkuVO.setMainImage(material.getMainImage()); + thisSkuVO.setDetailHtml(material.getDetailHtml()); + thisSkuVO.setDetailImage(material.getDetailImage()); + + //参数转换 + BeanUtils.copyProperties(sku, thisSkuVO); + GoodsSkuAuditPriceVO priceVO = new GoodsSkuAuditPriceVO(); + BeanUtils.copyProperties(sku, priceVO); + thisSkuVO.setPriceVO(priceVO); + List skuAttributeValues = skuAttributeValueRepository.queryAllBySkuId(id); + if (!ObjectUtils.isEmpty(skuAttributeValues)) { + List skuAttributeValueTrueList = skuAttributeValues.stream() + .filter(SkuAttributeValue::getIsSku).collect(Collectors.toList()); + + List skuAttributeList = doCopyData(skuAttributeValueTrueList); + + List skuAttributeValueFalseList = skuAttributeValues.stream() + .filter(model -> !model.getIsSku()).collect(Collectors.toList()); + + List otherAttributeList = doCopyData(skuAttributeValueFalseList); + + thisSkuVO.setSkuAttributeList(skuAttributeList); + thisSkuVO.setOtherAttributeList(otherAttributeList); + + } + vo.setThisSkuVO(thisSkuVO); + Integer status = sku.getStatus(); + + GoodsSkuAuditVO draftSkuVO = new GoodsSkuAuditVO(); + //套餐sku明细 + if (SET_FLAG_TRUE.equals(sku.getSetFlag())){ + List skuPackageList = skuPackageRepository.selectByCondition(Condition.builder(SkuPackage.class) + .andWhere(Sqls.custom().andEqualTo(SkuPackage.FIELD_SKU_ID,sku.getId())).build()); + if(ObjectUtil.isNotEmpty(skuPackageList)){ + List skuIds = skuPackageList.stream().map(SkuPackage::getPackageSkuId).collect(Collectors.toList()); + List skuList = skuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_ID,skuIds)).build()); + List spuIds = skuList.stream().map(Sku::getSpuId).collect(Collectors.toList()); + List spuList = spuRepository.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andIn(FIELD_ID,spuIds)).build()); + List skuDetailList = skuPackageList.stream().map(skuPackage->{ + Sku skuDetail = skuList.stream().filter(f->f.getId().equals(skuPackage.getPackageSkuId())).findAny().orElse(null); + SkuPackageVO packageVO = new SkuPackageVO(); + if (ObjectUtil.isNotNull(skuDetail)){ + packageVO.setId(skuPackage.getId()); + packageVO.setSkuCode(skuDetail.getSkuCode()); + packageVO.setSkuName(skuDetail.getSkuName()); + packageVO.setCostPrice(skuDetail.getCostPrice()); + packageVO.setSalesPrice(skuDetail.getSalesPrice()); + packageVO.setNum(skuPackage.getNum()); + Spu spuDetail =spuList.stream().filter(f->f.getId().equals(skuDetail.getSpuId())).findAny().orElse(null); + if (ObjectUtil.isNotNull(spuDetail)){ + packageVO.setSpuName(spuDetail.getName()); + packageVO.setSpuCode(spuDetail.getSpuCode()); + } + } + return packageVO; + }).collect(Collectors.toList()); + thisSkuVO.setSkuDetailList(skuDetailList); + draftSkuVO.setSkuDetailList(skuDetailList); + } + } + + + if (status < STATUS_REVISING) { + // 新增审核直接返回 + return vo; + } + + + //参数转换 + BeanUtils.copyProperties(thisSkuVO, draftSkuVO); + SkuDraft skuDraft = skuDraftRepository.selectByPrimaryKey(id); + // 副本不为空时对副本进行赋值 + if (!ObjectUtils.isEmpty(skuDraft)) { + //参数转换 + BeanUtils.copyProperties(skuDraft, draftSkuVO); + GoodsSkuAuditPriceVO priceTwoVO = new GoodsSkuAuditPriceVO(); + BeanUtils.copyProperties(skuDraft, priceTwoVO); + draftSkuVO.setPriceVO(priceTwoVO); + List skuAttributeValueDrafts = skuAttributeValueDraftRepository.queryAllBySkuId(id); + if (!ObjectUtils.isEmpty(skuAttributeValueDrafts)) { + List skuAttributeValueDraftTrueList = skuAttributeValueDrafts.stream() + .filter(SkuAttributeValueDraft::getIsSku).collect(Collectors.toList()); + + List skuAttributeListTwo = doCopyData(skuAttributeValueDraftTrueList); + + List skuAttributeValueDraftFalseList = skuAttributeValueDrafts.stream() + .filter(model -> !model.getIsSku()).collect(Collectors.toList()); + + List otherAttributeListTwo = doCopyData(skuAttributeValueDraftFalseList); + + draftSkuVO.setSkuAttributeList(skuAttributeListTwo); + draftSkuVO.setOtherAttributeList(otherAttributeListTwo); + } + } + + vo.setDraftSkuVO(draftSkuVO); + return vo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean skuAudit(AuditDTO dto) { + Long id = dto.getId(); + Sku sku = skuRepository.selectByPrimaryKey(id); + if (ObjectUtils.isEmpty(sku)) { + throw new CommonException("未找到对应的SKU"); + } + // 审核意见 + String auditIdea = dto.getAuditIdea(); + sku.setAuditIdea(auditIdea); + sku.setAuditCommitDate(new Date()); + Integer status = sku.getStatus(); + if (STATUS_UNDER_REVIEW.equals(status) || STATUS_REVISING.equals(status)) { + List skuAttributeValues = new ArrayList<>(); + if (Boolean.TRUE.equals(dto.getFlag())) { + // 审核通过 + if (STATUS_REVISING.equals(status)) { + SkuDraft skuDraft = skuDraftRepository.selectByPrimaryKey(id); + if (!ObjectUtils.isEmpty(skuDraft)) { + //参数转换 + BeanUtils.copyProperties(skuDraft, sku); + // 删除副本数据 + skuDraftRepository.deleteByPrimaryKey(skuDraft); + } + // 获取副本属性数据 + List skuAttributeValueDrafts = skuAttributeValueDraftRepository.queryAllBySkuId(id); + skuAttributeValueDrafts.forEach(model -> { + SkuAttributeValue skuAttributeValue = new SkuAttributeValue(); + //参数转换 + BeanUtils.copyProperties(model, skuAttributeValue); + skuAttributeValues.add(skuAttributeValue); + }); + if (!skuAttributeValues.isEmpty()) { + // 删除属性副本数据 + skuAttributeValueDraftRepository.batchDeleteByPrimaryKey(skuAttributeValueDrafts); + } + } + // 设置已生效 + sku.setStatus(STATUS_TAKE_EFFECT); + } else { + if (STATUS_UNDER_REVIEW.equals(status)) { + // 设置已驳回 + sku.setStatus(STATUS_REJECTED); + } else { + // 设置已生效(已驳回) + sku.setStatus(STATUS_TAKE_EFFECT_REJECTED); + } + } + skuRepository.updateByPrimaryKeySelective(sku); + skuEsService.syncSkuListEsSage(Collections.singletonList(sku)); + if (!skuAttributeValues.isEmpty()) { + // 删除当前属性跟值 + skuAttributeValueRepository.deleteBySkuId(id); + // 将副本属性赋值给当前属性 + skuAttributeValueRepository.batchInsertSelective(skuAttributeValues); + } + } else { + throw new CommonException("SKU状态不正常,无法操作"); + } + return true; + } + + /** + * 执行参数转换 + * + * @author lixiaoyang + * @date 2021/12/30 14:23 + */ + private List doCopyData(List dataList) { + Stream stream = dataList.stream().map(model -> { + AttributeDTO attributeDTO = new AttributeDTO(); + //参数转换 + BeanUtils.copyProperties(model, attributeDTO); + return attributeDTO; + }); + return stream.collect(Collectors.toList()); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeServiceImpl.java new file mode 100644 index 0000000..5c3a342 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SpuAttributeService; +import org.springframework.stereotype.Service; +/** + * 属性表应用服务默认实现 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@Service +public class SpuAttributeServiceImpl implements SpuAttributeService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeValueServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeValueServiceImpl.java new file mode 100644 index 0000000..20d7fe8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuAttributeValueServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SpuAttributeValueService; +import org.springframework.stereotype.Service; +/** + * 属性值表应用服务默认实现 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@Service +public class SpuAttributeValueServiceImpl implements SpuAttributeValueService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuEsServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuEsServiceImpl.java new file mode 100644 index 0000000..a85593e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuEsServiceImpl.java @@ -0,0 +1,345 @@ +package org.skyer.goods.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.stream.CollectorUtil; +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.skyer.core.domain.Page; +import org.skyer.core.iam.ResourceLevel; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.api.dto.SpuListDTO; +import org.skyer.goods.app.service.SpuEsService; +import org.skyer.goods.domain.entity.Brand; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.entity.SpuAttribute; +import org.skyer.goods.domain.repository.BrandRepository; +import org.skyer.goods.domain.repository.CategoryRepository; +import org.skyer.goods.domain.repository.MaterialRepository; +import org.skyer.goods.domain.repository.SpuRepository; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.goods.domain.vo.SpuEsModel; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.util.EsBoolQueryUtil; +import org.skyer.goods.infra.util.ListUtils; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.skyer.saga.saga.SagaDefinition; +import org.skyer.saga.saga.annotation.Saga; +import org.skyer.saga.saga.annotation.SagaTask; +import org.skyer.saga.saga.producer.StartSagaBuilder; +import org.skyer.saga.saga.producer.TransactionalProducer; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * @author: lzh + * @date: 2022-01-06 + * @description: + */ +@Service +@Slf4j +public class SpuEsServiceImpl implements SpuEsService { + @Autowired + private RestHighLevelClient client; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private BrandRepository brandRepository; + @Autowired + private MaterialRepository materialRepository; + @Autowired + private SpuRepository spuRepository; + @Autowired + private TransactionalProducer transactionalProducer; + + /** + * + * @param spuListDTO 含有spuList的数据 + */ + @Override + @Saga(description = "同步商品到es", code = "sync-spu-es", inputSchemaClass = SpuListDTO.class) + public SpuListDTO syncSpuEsSage(SpuListDTO spuListDTO){ + return transactionalProducer.applyAndReturn( + StartSagaBuilder.newBuilder() + .withSagaCode("sync-spu-es").withLevel(ResourceLevel.ORGANIZATION) + .withPayloadAndSerialize(spuListDTO).withRefType("listSpuDTO"), + build -> { + build.withPayloadAndSerialize(spuListDTO) + .withRefId(spuListDTO.hashCode() + " time:" + System.currentTimeMillis()); + return spuListDTO; + }); + } + + @Override + @SagaTask(description = "同步商品到es sage task", + code = "sync-spu-es-sage-task", + sagaCode = "sync-spu-es", + concurrentLimitNum = 2, + concurrentLimitPolicy = SagaDefinition.ConcurrentLimitPolicy.NONE, + seq = 1) + public SpuListDTO syncSpuEsSageTask(String spuListDTOStr) throws IOException { + + SpuListDTO spuListDTO = JSON.parseObject(spuListDTOStr, SpuListDTO.class); + List spuList = spuListDTO.getSpuList(); + List esModels = ListUtils.listConvert(spuList, SpuEsModel.class); + if (spuListDTO.getDeleteFlag().equals(true)){ + List keys = Lists.newArrayList(); + spuList.forEach(item->{ + keys.add(String.valueOf(item.getId())); + }); + DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SPU_INDEX); + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder = EsBoolQueryUtil.inStringQuery(queryBuilder, "id", keys); + request.setQuery(queryBuilder); + request.setTimeout(TimeValue.timeValueMinutes(2)); + client.deleteByQuery(request, RequestOptions.DEFAULT); + }else { + BulkRequest bulkRequest = new BulkRequest(); + esModels.forEach(x -> { + //构造保存请求 + String jsonString = JSON.toJSONString(x); + IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SPU_INDEX); + indexRequest.id(x.getId().toString()); + indexRequest.source(jsonString, XContentType.JSON); + bulkRequest.add(indexRequest); + }); + client.bulk(bulkRequest, RequestOptions.DEFAULT); + } + return spuListDTO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createOrUpdateSpuEs(Spu spu) { + try { + String spuStr = JSON.toJSONString(spu); + IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SPU_INDEX); + indexRequest.id(spu.getId().toString()); + indexRequest.source(spuStr, XContentType.JSON); + client.index(indexRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + log.error(spu.getName()+"ES创建或修改异常", e); + } + } + + + @Override + public Page querySpuEs(GoodsPageReqDTO goodsPageReqDTO) throws Exception { + + // 判断索引库是否存在 + if (!isExistsIndex(ObjectConstant.EsKey.SPU_INDEX)){ + return new Page<>(); + } + + log.info("Spu查询es"); + Page vos = new Page<>(); + int size = goodsPageReqDTO.getSize(); + vos.setSize(size); + vos.setNumber(goodsPageReqDTO.getPage() + 1); + // 构建Es检索请求 + SearchRequest searchRequest = buildSearchRequest(goodsPageReqDTO); + try { + // 执行检索请求 + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + SearchHits hits = searchResponse.getHits(); + Long totalElements = hits.getTotalHits().value; + int total = totalElements.intValue(); + int page = total / size; + List goodsSpuResList =buildSearchResult(searchResponse,goodsPageReqDTO); + vos.setContent(goodsSpuResList); + vos.setTotalElements(goodsSpuResList.size()); + vos.setTotalPages(page); + } catch (IOException e) { + e.printStackTrace(); + } + return vos; + } + + + @Override + public void delSpuEs(List spuList) { + List keys = Lists.newArrayList(); + spuList.forEach(item->{ + keys.add(String.valueOf(item.getId())); + }); + DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SPU_INDEX); + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder = EsBoolQueryUtil.inStringQuery(queryBuilder, "id", keys); + request.setQuery(queryBuilder); + request.setTimeout(TimeValue.timeValueMinutes(2)); + try { + client.deleteByQuery(request, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void delSpuEsAll() { + DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SPU_INDEX); + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + request.setQuery(queryBuilder); + request.setTimeout(TimeValue.timeValueMinutes(2)); + try { + client.deleteByQuery(request, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void productStatusUp() throws IOException { + List spuList = spuRepository.selectAll(); + List esModels = ListUtils.listConvert(spuList, SpuEsModel.class); + try { + BulkRequest bulkRequest = new BulkRequest(); + esModels.forEach(x->{ + //构造保存请求 + IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SPU_INDEX); + indexRequest.id(x.getId().toString()); + String jsonString = JSON.toJSONString(x); + indexRequest.source(jsonString, XContentType.JSON); + bulkRequest.add(indexRequest); + }); + client.bulk(bulkRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 准备检索请求 + * @param goodsPageReqDTO + * @return + */ + private SearchRequest buildSearchRequest(GoodsPageReqDTO goodsPageReqDTO) { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + // 构建bool-query + BoolQueryBuilder builder = QueryBuilders.boolQuery(); +// // 过滤已删除 +// builder.filter(QueryBuilders.matchQuery("deleteFlag",false)); + if (Objects.nonNull(goodsPageReqDTO.getSpuCode())) { + builder.must(QueryBuilders.termQuery("spuCode",goodsPageReqDTO.getSpuCode())); + } + if (Objects.nonNull(goodsPageReqDTO.getName())) { + builder.must(QueryBuilders.matchPhraseQuery("name",goodsPageReqDTO.getName())); + } + if (Objects.nonNull(goodsPageReqDTO.getType())) { + builder.filter(QueryBuilders.matchQuery("type",goodsPageReqDTO.getType())); + } + if (Objects.nonNull(goodsPageReqDTO.getSetFlag())) { + builder.filter(QueryBuilders.matchQuery("setFlag",goodsPageReqDTO.getSetFlag())); + }else { + builder.mustNot(QueryBuilders.matchQuery("setFlag",Spu.SET_FLAG_TRUE)); + } +// if (Objects.nonNull(goodsPageReqDTO.getStatus())) { +// builder.filter(QueryBuilders.matchQuery("status",goodsPageReqDTO.getStatus())); +// } + if (CollUtil.isNotEmpty(goodsPageReqDTO.getCategoryIdList())) { + List laterCategoryId = categoryRepository.getLaterCategoryId(goodsPageReqDTO.getCategoryIdList()); + builder = EsBoolQueryUtil.inTermQuery(builder, "categoryId", laterCategoryId); + } + // 封装所有的查询条件 + searchSourceBuilder.query(builder); +// // 排序 +// searchSourceBuilder.sort("creationDate",SortOrder.DESC); + // 分页 + EsBoolQueryUtil.page(searchSourceBuilder, goodsPageReqDTO.getPage(), goodsPageReqDTO.getSize()); + searchSourceBuilder.trackTotalHits(true); + return new SearchRequest(new String[]{ObjectConstant.EsKey.SPU_INDEX},searchSourceBuilder); + } + + /** + * 构建结果集 + * @param response + * @return + */ + private List buildSearchResult(SearchResponse response,GoodsPageReqDTO goodsPageReqDTO) { + List resultList = Lists.newArrayList(); + Map categoryMap = Maps.newHashMap(); + //1、返回的所有查询到的商品 + SearchHits hits = response.getHits(); + if (hits.getHits() != null && hits.getHits().length > 0){ + for (SearchHit hit : hits.getHits()) { +// GoodsPageResVO goodsPageResVO = new GoodsPageResVO(); + SpuEsModel spu = JSON.parseObject(hit.getSourceAsString()).toJavaObject(SpuEsModel.class); +// BeanUtils.copyProperties(spu,goodsPageResVO); +// goodsPageResVO.setCode(spu.getSpuCode()); + resultList.add(spu); + } + } + List collect = resultList.stream().map(SpuEsModel::getId).collect(Collectors.toList()); + if (CollUtil.isEmpty(collect)){ + return Collections.emptyList(); + } + List spuList = spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom() + .andIn(Spu.ID, collect) + .andEqualTo(Spu.STATUS, goodsPageReqDTO.getStatus(), true) + .andEqualTo(Spu.DELETE_FLAG, false)) + .orderByDesc("creationDate").build()); + List vos = ListUtils.listConvert(spuList, GoodsPageResVO.class); + vos.forEach(x->{ + + String categoryName = categoryMap.get(x.getCategoryId()); + if (StringUtils.isBlank(categoryName)){ + categoryName = categoryRepository.getCategoryNameById(x.getCategoryId()); + categoryMap.put(x.getCategoryId(),categoryName); + } + x.setCategoryName(categoryName); + Material material = materialRepository.selectByPrimaryKey(x.getMaterialId()); + if (material !=null) { + x.setMainImage(Arrays.asList(Optional.ofNullable(material.getMainImage()).orElse("").split(","))); + x.setMaterialName(material.getMaterialName()); + } + Brand brand = brandRepository.selectByPrimaryKey(x.getBrandId()); + if (brand != null){ + x.setBrandName(brand.getName()); + } + }); + return vos; + } + + + /** + * 判断一个索引是否存在 + * @param indexName + * @return + */ + private boolean isExistsIndex(String indexName) throws Exception{ + GetIndexRequest request = new GetIndexRequest(indexName); + return client.indices().exists(request, RequestOptions.DEFAULT); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceServiceImpl.java new file mode 100644 index 0000000..d89455a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceServiceImpl.java @@ -0,0 +1,400 @@ +package org.skyer.goods.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.app.service.MyEncryptionService; +import org.skyer.goods.app.service.SpuInstallServiceService; +import org.skyer.goods.domain.dto.PageSpuInstallServiceDTO; +import org.skyer.goods.domain.dto.SpuInstallServiceDTO; +import org.skyer.goods.domain.entity.*; +import org.skyer.goods.domain.repository.InstallServiceRepository; +import org.skyer.goods.domain.repository.SpuInstallServiceRepository; +import org.skyer.goods.domain.repository.SpuInstallServiceSkuRepository; +import org.skyer.goods.domain.repository.SpuInstallServiceStoreRepository; +import org.skyer.goods.domain.vo.OnlineShopVO; +import org.skyer.goods.infra.feign.OnlineShopRemoteService; +import org.skyer.goods.infra.mapper.SkuMapper; +import org.skyer.goods.infra.mapper.SpuMapper; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品安装服务应用服务默认实现 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@Slf4j +@Service +public class SpuInstallServiceServiceImpl implements SpuInstallServiceService { + @Autowired + private SpuMapper spuMapper; + + @Autowired + private SkuMapper skuMapper; + + @Autowired + private InstallServiceRepository installServiceRepository; + + @Autowired + private SpuInstallServiceRepository spuInstallServiceRepository; + + @Autowired + private SpuInstallServiceSkuRepository spuInstallServiceSkuRepository; + + @Autowired + private SpuInstallServiceStoreRepository spuInstallServiceStoreRepository; + + @Autowired + private OnlineShopRemoteService onlineShopRemoteService; + + @Override + public Page page(PageRequest pageRequest, PageSpuInstallServiceDTO spuInstallService) { + + Page page = PageHelper.doPageAndSort(pageRequest, () -> spuInstallServiceRepository.selectByCondition(Condition.builder(SpuInstallService.class) + .andWhere(Sqls.custom() + .andLike(SpuInstallService.FIELD_SPU_CODE, spuInstallService.getSpuCode(), true) + .andLike(SpuInstallService.FIELD_SPU_NAME, spuInstallService.getSpuName(), true) + .andLike(SpuInstallService.FIELD_INSTALL_SERVICE_CODE, spuInstallService.getInstallServiceCode(), true) + .andLike(SpuInstallService.FIELD_INSTALL_SERVICE_NAME, spuInstallService.getInstallServiceName(), true) + .andEqualTo(SpuInstallService.FIELD_DELETE_FLAG, false)) + .build())); + + List pageListContent = page.getContent(); + if (CollUtil.isNotEmpty(pageListContent)) { + // List spuCodes = pageListContent.stream().map(xx -> xx.getSpuCode()).collect(Collectors.toList()); + + List dictList = pageListContent.stream().map(xx -> { + Dict item = Dict.create(); + + item.set("spuCode", xx.getSpuCode()) + .set("spuId", myEncryptionService.encrypt(xx.getSpuId())) + .set("id", myEncryptionService.encrypt(xx.getId())) + .set("spuName", xx.getSpuName()) + .set("installServiceId", myEncryptionService.encrypt(xx.getInstallServiceId())) + .set("installServiceCode", xx.getInstallServiceCode()) + .set("installServiceName", xx.getInstallServiceName()) + .set("isAllStore", xx.getIsAllStore()) + .set("remark", xx.getRemark()) + .set("categoryId", xx.getCategoryId()) + .set("createdBy", xx.getCreatedBy()) + .set("creationDate", DateUtil.formatDateTime(xx.getCreationDate())); +// item.set("categoryText", categoryOldService.getCategoryNameByListId(xx.getCategoryId())); + + // 套餐商品 + List spuInstallServiceSkuList = spuInstallServiceSkuRepository.selectByCondition(Condition.builder(SpuInstallServiceSku.class) + .andWhere(Sqls.custom() + .andEqualTo(SpuInstallServiceSku.FIELD_SPU_CODE, xx.getSpuCode())) + .build()); + item.set("skuCount", spuInstallServiceSkuList.size()); + + // 售卖店铺 + List spuInstallServiceStoreList = spuInstallServiceStoreRepository.selectByCondition(Condition.builder(SpuInstallServiceStore.class) + .andWhere(Sqls.custom() + .andEqualTo(SpuInstallServiceStore.FIELD_SPU_CODE, xx.getSpuCode())) + .build()); + item.set("storeCount", spuInstallServiceStoreList.size()); + + + return item; + }).collect(Collectors.toList()); + return new Page<>(dictList, new PageInfo(page.getTotalPages(), page.getSize()), page.getTotalElements()); + } + + return new Page<>(new ArrayList<>(), new PageInfo(0, page.getSize()), 0); + } + + @Autowired + private MyEncryptionService myEncryptionService; + + @Override + public Dict detail(Long id) { + SpuInstallService spuInstallService = spuInstallServiceRepository.selectByPrimaryKey(id); + if (ObjectUtil.isNotNull(spuInstallService)) { + Dict dict = Dict.create(); + + dict.set("objectVersionNumber", spuInstallService.getObjectVersionNumber()); + dict.set("id", myEncryptionService.encrypt(spuInstallService.getId())); + dict.set("spuId", myEncryptionService.encrypt(spuInstallService.getSpuId())); + dict.set("spuCode", spuInstallService.getSpuCode()); + dict.set("installServiceId", myEncryptionService.encrypt(spuInstallService.getInstallServiceId())); + dict.set("installServiceCode", spuInstallService.getInstallServiceCode()); + dict.set("installServiceName", spuInstallService.getInstallServiceName()); + dict.set("spuName", spuInstallService.getSpuName()); + dict.set("isAllStore", spuInstallService.getIsAllStore()); + dict.set("remark", spuInstallService.getRemark()); + dict.set("categoryId", String.valueOf(spuInstallService.getCategoryId())); + // String categoryText = categoryOldService.getCategoryNameByListId(spuInstallService.getCategoryId()); + //dict.set("categoryText", categoryText); + + dict.set("creationDate", DateUtil.formatDateTime(spuInstallService.getCreationDate())); + + //---------------------- + SpuInstallServiceSku InstallServiceSkuQuery = new SpuInstallServiceSku(); + InstallServiceSkuQuery.setSpuCode(spuInstallService.getSpuCode()); + List spuInstallServiceSkuList = spuInstallServiceSkuRepository.select(InstallServiceSkuQuery); + List dictList = spuInstallServiceSkuList.stream().map(xx -> { + Dict itemDict = Dict.create(); + // itemDict.set("id", String.valueOf(xx.getId())); + itemDict.set("id", myEncryptionService.encrypt(xx.getId())); + + itemDict.set("skuId", myEncryptionService.encrypt(xx.getSonSkuId())); + itemDict.set("skuCode", xx.getSonSkuCode()); + // sku详情 + itemDict.set("spuCode", spuInstallService.getSpuCode()); + itemDict.set("spuName", spuInstallService.getSpuName()); + // itemDict.set("categoryName", categoryText); + Sku sku = skuMapper.selectByPrimaryKey(xx.getSonSkuId()); + itemDict.set("price", sku.getSalesPrice()); + return itemDict; + }).collect(Collectors.toList()); + dict.set("spuInstallServiceSkus", dictList); + + // 售卖店铺 + SpuInstallServiceStore InstallServiceStoreQuery = new SpuInstallServiceStore(); + InstallServiceStoreQuery.setSpuCode(spuInstallService.getSpuCode()); + List spuInstallServiceStoreList = spuInstallServiceStoreRepository.select(InstallServiceStoreQuery); + List dictStoreList = spuInstallServiceStoreList.stream().map(xx -> { + Dict itemDict = Dict.create(); + + itemDict.set("id", myEncryptionService.encrypt(xx.getStoreId())); + // 店铺编码 + itemDict.set("code", xx.getStoreCode()); + // sku详情 + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(xx.getStoreId()); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + // 店铺名称 + itemDict.set("name", body.getName()); + itemDict.set("storeDescription", body.getDescription()); + + itemDict.set("channelTypeMeaning", body.getChannelTypeMeaning()); + itemDict.set("onlineStoreTypeMeaning", body.getOnlineStoreTypeMeaning()); + + itemDict.set("typeCode", body.getChannelTypeCode()); + itemDict.set("storeType", body.getOnlineStoreTypeCode()); + + } + return itemDict; + }).collect(Collectors.toList()); + dict.set("spuInstallServiceStores", dictStoreList); + return dict; + } + return Dict.create().parseBean(spuInstallService); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean create(SpuInstallServiceDTO spuInstallServiceDTO) { + if (!spuInstallServiceDTO.getIsAllStore() && CollUtil.isEmpty(spuInstallServiceDTO.getSpuStoreIds())) { + // 如果不是适用于所有店铺且店铺没有设置值,返回错误 + throw new CommonException("没有设置店铺!"); + } + // ------------------------------- + InstallService queryEntity = new InstallService(); + queryEntity.setServiceCode(spuInstallServiceDTO.getInstallServiceCode()); + InstallService installServiceOne = installServiceRepository.selectOne(queryEntity); + + Spu spu = spuMapper.selectOne((new Spu()).setSpuCode(spuInstallServiceDTO.getSpuCode())); + if (ObjectUtil.isNotNull(spu) && ObjectUtil.isNotNull(installServiceOne)) { + // 获取租户的id + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + // 1. 添加主表数据 + SpuInstallService spuInstallService = new SpuInstallService(); + spuInstallService.setSpuCode(spuInstallServiceDTO.getSpuCode()); + spuInstallService.setInstallServiceId(installServiceOne.getId()); + spuInstallService.setInstallServiceName(installServiceOne.getName()); + spuInstallService.setInstallServiceCode(spuInstallServiceDTO.getInstallServiceCode()); + spuInstallService.setSpuId(spu.getId()); + spuInstallService.setCategoryId(spu.getCategoryId()); + spuInstallService.setSpuName(spu.getName()); + spuInstallService.setRemark(spuInstallServiceDTO.getRemark()); + spuInstallService.setIsAllStore(spuInstallServiceDTO.getIsAllStore()); + spuInstallService.setTenantId(tenantId); + spuInstallService.setDeleteFlag(false); + int rowsResult1 = spuInstallServiceRepository.insert(spuInstallService); + log.info("rows1={}", rowsResult1); + // 添加对应的sku数据 + for (String ss : spuInstallServiceDTO.getSonSkuCodes()) { + Sku skuQuery = new Sku(); + skuQuery.setSkuCode(ss); + Sku sku = skuMapper.selectOne(skuQuery); + if (ObjectUtil.isNull(sku)) { + throw new CommonException("sku编码不存在,请检查!"); + } + SpuInstallServiceSku itemSku = new SpuInstallServiceSku(); + itemSku.setSpuCode(spu.getSpuCode()); + itemSku.setSpuId(spu.getId()); + itemSku.setSonSkuId(sku.getId()); + itemSku.setSonSkuCode(ss); + itemSku.setTenantId(tenantId); + itemSku.setDeleteFlag(false); + + int rowsResult2 = spuInstallServiceSkuRepository.insert(itemSku); + log.info("rows2={}", rowsResult2); + } + // 添加适用店铺 + // 需要使用远程调用 + for (Long ll : spuInstallServiceDTO.getSpuStoreIds()) { + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(ll); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + SpuInstallServiceStore spuInstallServiceStore = new SpuInstallServiceStore(); + spuInstallServiceStore.setSpuCode(spuInstallServiceDTO.getSpuCode()); + spuInstallServiceStore.setStoreId(ll); + spuInstallServiceStore.setStoreCode(body.getCode()); + spuInstallServiceStore.setTenantId(tenantId); + spuInstallServiceStore.setDeleteFlag(false); + + int rowsResult3 = spuInstallServiceStoreRepository.insert(spuInstallServiceStore); + log.info("rows3={}", rowsResult3); + } + } + + return true; + } + return false; + } + + @Override + public Boolean update(SpuInstallServiceDTO spuInstallServiceDTO) { + if (!spuInstallServiceDTO.getIsAllStore() && CollUtil.isEmpty(spuInstallServiceDTO.getSpuStoreIds())) { + // 如果不是适用于所有店铺且店铺没有设置值,返回错误 + throw new CommonException("没有设置店铺!"); + } + // ------------------------------- + + Spu spu = spuMapper.selectOne((new Spu()).setSpuCode(spuInstallServiceDTO.getSpuCode())); + if (ObjectUtil.isNotNull(spu)) { + // 获取租户的id + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + // 1. 修改主表数据 + SpuInstallService spuInstallService = new SpuInstallService(); + spuInstallService.setId(spuInstallServiceDTO.getId()); + if (StrUtil.isNotEmpty(spuInstallServiceDTO.getInstallServiceCode())) { + InstallService queryEntity = new InstallService(); + queryEntity.setServiceCode(spuInstallServiceDTO.getInstallServiceCode()); + InstallService installServiceOne = installServiceRepository.selectOne(queryEntity); + + spuInstallService.setInstallServiceId(installServiceOne.getId()); + spuInstallService.setInstallServiceName(installServiceOne.getName()); + spuInstallService.setInstallServiceCode(spuInstallServiceDTO.getInstallServiceCode()); + } + spuInstallService.setObjectVersionNumber(spuInstallServiceDTO.getObjectVersionNumber()); + spuInstallService.setRemark(spuInstallServiceDTO.getRemark()); + spuInstallService.setIsAllStore(spuInstallServiceDTO.getIsAllStore()); + int rowsResult1 = spuInstallServiceRepository.updateByPrimaryKeySelective(spuInstallService); + log.info("rows1={}", rowsResult1); + // 先删除原来数据 + SpuInstallServiceSku InstallServiceSkuQuery = new SpuInstallServiceSku(); + InstallServiceSkuQuery.setSpuCode(spuInstallServiceDTO.getSpuCode()); + List spuInstallServiceSkuList = spuInstallServiceSkuRepository.select(InstallServiceSkuQuery); + + int rowsResult11 = spuInstallServiceSkuRepository.batchDelete(spuInstallServiceSkuList); + log.info("rowsResult211={}", rowsResult11); + + // 添加对应的sku数据 + for (String ss : spuInstallServiceDTO.getSonSkuCodes()) { + Sku skuQuery = new Sku(); + skuQuery.setSkuCode(ss); + Sku sku = skuMapper.selectOne(skuQuery); + if (ObjectUtil.isNull(sku)) { + throw new CommonException("sku编码不存在,请检查!"); + } + SpuInstallServiceSku itemSku = new SpuInstallServiceSku(); + itemSku.setSpuCode(spu.getSpuCode()); + itemSku.setSpuId(spu.getId()); + itemSku.setSonSkuId(sku.getId()); + itemSku.setSonSkuCode(ss); + itemSku.setTenantId(tenantId); + itemSku.setDeleteFlag(false); + + int rowsResult2 = spuInstallServiceSkuRepository.insert(itemSku); + log.info("rows2={}", rowsResult2); + } + + // 先删除原来数据 + SpuInstallServiceStore InstallServiceStoreQuery = new SpuInstallServiceStore(); + InstallServiceStoreQuery.setSpuCode(spuInstallServiceDTO.getSpuCode()); + List spuInstallServiceStoreList = spuInstallServiceStoreRepository.select(InstallServiceStoreQuery); + + int rowsResult22 = spuInstallServiceStoreRepository.batchDelete(spuInstallServiceStoreList); + log.info("rowsResult22={}", rowsResult22); + + // 添加适用店铺 + // 需要使用远程调用 + for (Long ll : spuInstallServiceDTO.getSpuStoreIds()) { + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(ll); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + SpuInstallServiceStore spuInstallServiceStore = new SpuInstallServiceStore(); + spuInstallServiceStore.setSpuCode(spuInstallServiceDTO.getSpuCode()); + spuInstallServiceStore.setStoreId(ll); + spuInstallServiceStore.setStoreCode(body.getCode()); + spuInstallServiceStore.setTenantId(tenantId); + spuInstallServiceStore.setDeleteFlag(false); + + int rowsResult3 = spuInstallServiceStoreRepository.insert(spuInstallServiceStore); + log.info("rows3={}", rowsResult3); + } + } + + return true; + } + return false; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean batchRemove(List ids) { + List spuInstallServices = spuInstallServiceRepository.selectByCondition(Condition.builder(SpuInstallService.class) + .andWhere(Sqls.custom() + .andIn(SpuInstallService.FIELD_ID, ids, true) + .andEqualTo(SpuInstallService.FIELD_DELETE_FLAG, false)) + .build()); + + if (CollUtil.isNotEmpty(spuInstallServices)) { + for (SpuInstallService mm : spuInstallServices) { + // 删除对应的sku + SpuInstallServiceSku InstallServiceSkuQuery = new SpuInstallServiceSku(); + InstallServiceSkuQuery.setSpuCode(mm.getSpuCode()); + List spuInstallServiceSkuList = spuInstallServiceSkuRepository.select(InstallServiceSkuQuery); + + int resultRows1 = spuInstallServiceSkuRepository.batchDelete(spuInstallServiceSkuList); + log.info("resultRows1={}", resultRows1); + + // 删除对应的店铺 + SpuInstallServiceStore InstallServiceStoreQuery = new SpuInstallServiceStore(); + InstallServiceStoreQuery.setSpuCode(mm.getSpuCode()); + List spuInstallServiceStoreList = spuInstallServiceStoreRepository.select(InstallServiceStoreQuery); + + int resultRows2 = spuInstallServiceStoreRepository.batchDelete(spuInstallServiceStoreList); + log.info("resultRows2={}", resultRows2); + } + int resultRows3 = spuInstallServiceRepository.batchDelete(spuInstallServices); + return resultRows3 > 0; + } + + return false; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceSkuServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceSkuServiceImpl.java new file mode 100644 index 0000000..d12812b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceSkuServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SpuInstallServiceSkuService; +import org.springframework.stereotype.Service; +/** + * 商品安装服务sku表应用服务默认实现 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@Service +public class SpuInstallServiceSkuServiceImpl implements SpuInstallServiceSkuService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceStoreServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceStoreServiceImpl.java new file mode 100644 index 0000000..3a99ac5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuInstallServiceStoreServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SpuInstallServiceStoreService; +import org.springframework.stereotype.Service; +/** + * 商品安装服务售卖门店应用服务默认实现 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@Service +public class SpuInstallServiceStoreServiceImpl implements SpuInstallServiceStoreService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumServiceImpl.java new file mode 100644 index 0000000..8a4a5a4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumServiceImpl.java @@ -0,0 +1,375 @@ +package org.skyer.goods.app.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.app.service.MyEncryptionService; +import org.skyer.goods.app.service.SpuSonMumService; +import org.skyer.goods.domain.dto.AddSonMumSkuDTO; +import org.skyer.goods.domain.dto.PageSonMumDTO; +import org.skyer.goods.domain.dto.SpuSonMumDTO; +import org.skyer.goods.domain.entity.*; +import org.skyer.goods.domain.repository.SpuSonMumRepository; +import org.skyer.goods.domain.repository.SpuSonMumSkuRepository; +import org.skyer.goods.domain.repository.SpuSonMumStoreRepository; +import org.skyer.goods.domain.vo.OnlineShopVO; +import org.skyer.goods.infra.feign.OnlineShopRemoteService; +import org.skyer.goods.infra.mapper.SkuMapper; +import org.skyer.goods.infra.mapper.SpuMapper; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 子母商品应用服务默认实现 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@Slf4j +@Service +public class SpuSonMumServiceImpl implements SpuSonMumService { + + @Autowired + private SpuMapper spuMapper; + + @Autowired + private SkuMapper skuMapper; + + @Autowired + private SpuSonMumRepository spuSonMumRepository; + + @Autowired + private SpuSonMumSkuRepository spuSonMumSkuRepository; + + @Autowired + private SpuSonMumStoreRepository spuSonMumStoreRepository; + + @Autowired + private OnlineShopRemoteService onlineShopRemoteService; + + @Override + public Page page(PageRequest pageRequest, PageSonMumDTO spuSonMum) { + + Page page = PageHelper.doPageAndSort(pageRequest, () -> spuSonMumRepository.selectByCondition(Condition.builder(SpuSonMum.class) + .andWhere(Sqls.custom() + .andLike(SpuSonMum.FIELD_SPU_CODE, spuSonMum.getSpuCode(), true) + .andLike(SpuSonMum.FIELD_SPU_NAME, spuSonMum.getSpuName(), true) + .andEqualTo(SpuSonMum.FIELD_DELETE_FLAG, false)) + .build())); + + List pageListContent = page.getContent(); + if (CollUtil.isNotEmpty(pageListContent)) { + // List spuCodes = pageListContent.stream().map(xx -> xx.getSpuCode()).collect(Collectors.toList()); + + List dictList = pageListContent.stream().map(xx -> { + Dict item = Dict.create(); + + item.set("spuCode", xx.getSpuCode()) + .set("spuId", myEncryptionService.encrypt(xx.getSpuId())) + .set("id", myEncryptionService.encrypt(xx.getId())) + .set("spuName", xx.getSpuName()) + .set("isAllStore", xx.getIsAllStore()) + .set("remark", xx.getRemark()) + .set("categoryId", xx.getCategoryId()) + .set("createdBy", xx.getCreatedBy()) + .set("creationDate", DateUtil.formatDateTime(xx.getCreationDate())); +// item.set("categoryText", categoryOldService.getCategoryNameByListId(xx.getCategoryId())); + + // 套餐商品 + List spuSonMumSkuList = spuSonMumSkuRepository.selectByCondition(Condition.builder(SpuSonMumSku.class) + .andWhere(Sqls.custom() + .andEqualTo(SpuSonMumSku.FIELD_SPU_CODE, xx.getSpuCode())) + .build()); + item.set("skuCount", spuSonMumSkuList.size()); + + // 售卖店铺 + List spuSonMumStoreList = spuSonMumStoreRepository.selectByCondition(Condition.builder(SpuSonMumStore.class) + .andWhere(Sqls.custom() + .andEqualTo(SpuSonMumStore.FIELD_SPU_CODE, xx.getSpuCode())) + .build()); + item.set("storeCount", spuSonMumStoreList.size()); + + + return item; + }).collect(Collectors.toList()); + return new Page<>(dictList, new PageInfo(page.getTotalPages(), page.getSize()), page.getTotalElements()); + } + + return new Page<>(new ArrayList<>(), new PageInfo(0, page.getSize()), 0); + } + + @Autowired + private MyEncryptionService myEncryptionService; + + @Override + public Dict detail(Long id) { + SpuSonMum spuSonMum = spuSonMumRepository.selectByPrimaryKey(id); + if (ObjectUtil.isNotNull(spuSonMum)) { + Dict dict = Dict.create(); + // dict.set("id", String.valueOf(spuSonMum.getId())); + dict.set("objectVersionNumber", spuSonMum.getObjectVersionNumber()); + dict.set("id", myEncryptionService.encrypt(spuSonMum.getId())); + dict.set("spuId", myEncryptionService.encrypt(spuSonMum.getSpuId())); + dict.set("spuCode", spuSonMum.getSpuCode()); + dict.set("spuName", spuSonMum.getSpuName()); + dict.set("isAllStore", spuSonMum.getIsAllStore()); + dict.set("remark", spuSonMum.getRemark()); + dict.set("categoryId", myEncryptionService.encrypt(spuSonMum.getCategoryId())); +// String categoryText = categoryOldService.getCategoryNameByListId(spuSonMum.getCategoryId()); +// dict.set("categoryText", categoryText); + + dict.set("creationDate", DateUtil.formatDateTime(spuSonMum.getCreationDate())); + + //---------------------- + SpuSonMumSku sonMumSkuQuery = new SpuSonMumSku(); + sonMumSkuQuery.setSpuCode(spuSonMum.getSpuCode()); + List spuSonMumSkuList = spuSonMumSkuRepository.select(sonMumSkuQuery); + List dictList = spuSonMumSkuList.stream().map(xx -> { + Dict itemDict = Dict.create(); + // itemDict.set("id", String.valueOf(xx.getId())); + itemDict.set("id", myEncryptionService.encrypt(xx.getId())); + + itemDict.set("skuId", myEncryptionService.encrypt(xx.getSonSkuId())); + itemDict.set("skuCode", xx.getSonSkuCode()); + itemDict.set("amount", xx.getAmount()); + // spu详情 + itemDict.set("spuCode", spuSonMum.getSpuCode()); + itemDict.set("spuName", spuSonMum.getSpuName()); +// itemDict.set("categoryName", categoryText); + Sku sku = skuMapper.selectByPrimaryKey(xx.getSonSkuId()); + itemDict.set("price", sku.getSalesPrice()); + return itemDict; + }).collect(Collectors.toList()); + dict.set("spuSonMumSkus", dictList); + + // 售卖店铺 + SpuSonMumStore sonMumStoreQuery = new SpuSonMumStore(); + sonMumStoreQuery.setSpuCode(spuSonMum.getSpuCode()); + List spuSonMumStoreList = spuSonMumStoreRepository.select(sonMumStoreQuery); + List dictStoreList = spuSonMumStoreList.stream().map(xx -> { + Dict itemDict = Dict.create(); + + itemDict.set("id", myEncryptionService.encrypt(xx.getStoreId())); + // 店铺编码 + itemDict.set("code", xx.getStoreCode()); + // sku详情 + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(xx.getStoreId()); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + // 店铺名称 + itemDict.set("name", body.getName()); + itemDict.set("storeDescription", body.getDescription()); + + itemDict.set("channelTypeMeaning", body.getChannelTypeMeaning()); + itemDict.set("onlineStoreTypeMeaning", body.getOnlineStoreTypeMeaning()); + + itemDict.set("typeCode", body.getChannelTypeCode()); + itemDict.set("storeType", body.getOnlineStoreTypeCode()); + + } + return itemDict; + }).collect(Collectors.toList()); + dict.set("spuSonMumStores", dictStoreList); + return dict; + } + return Dict.create().parseBean(spuSonMum); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean create(SpuSonMumDTO spuSonMumDTO) { + if (!spuSonMumDTO.getIsAllStore() && CollUtil.isEmpty(spuSonMumDTO.getSpuStoreIds())) { + // 如果不是适用于所有店铺且店铺没有设置值,返回错误 + throw new CommonException("没有设置店铺!"); + } + // ------------------------------- + Spu spu = spuMapper.selectOne((new Spu()).setSpuCode(spuSonMumDTO.getSpuCode())); + if (ObjectUtil.isNotNull(spu)) { + // 获取租户的id + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + // 1. 添加主表数据 + SpuSonMum spuSonMum = new SpuSonMum(); + spuSonMum.setSpuCode(spuSonMumDTO.getSpuCode()); + spuSonMum.setSpuId(spu.getId()); + spuSonMum.setCategoryId(spu.getCategoryId()); + spuSonMum.setSpuName(spu.getName()); + spuSonMum.setRemark(spuSonMumDTO.getRemark()); + spuSonMum.setIsAllStore(spuSonMumDTO.getIsAllStore()); + spuSonMum.setTenantId(tenantId); + spuSonMum.setDeleteFlag(false); + int rowsResult1 = spuSonMumRepository.insert(spuSonMum); + log.info("rows1={}", rowsResult1); + // 添加对应的sku数据 + for (AddSonMumSkuDTO mm : spuSonMumDTO.getSonMumSkuDTOS()) { + Sku skuQuery = new Sku(); + skuQuery.setSkuCode(mm.getSonSkuCode()); + Sku sku = skuMapper.selectOne(skuQuery); + if (ObjectUtil.isNull(sku)) { + throw new CommonException("sku编码不存在,请检查!"); + } + SpuSonMumSku itemSku = new SpuSonMumSku(); + itemSku.setSpuCode(spu.getSpuCode()); + itemSku.setSpuId(spu.getId()); + itemSku.setAmount(mm.getAmount()); + itemSku.setSonSkuId(sku.getId()); + itemSku.setSonSkuCode(mm.getSonSkuCode()); + itemSku.setTenantId(tenantId); + itemSku.setDeleteFlag(false); + + int rowsResult2 = spuSonMumSkuRepository.insert(itemSku); + log.info("rows2={}", rowsResult2); + } + // 添加适用店铺 + // 需要使用远程调用 + for (Long ll : spuSonMumDTO.getSpuStoreIds()) { + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(ll); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + SpuSonMumStore spuSonMumStore = new SpuSonMumStore(); + spuSonMumStore.setSpuCode(spuSonMumDTO.getSpuCode()); + spuSonMumStore.setStoreId(ll); + spuSonMumStore.setStoreCode(body.getCode()); + spuSonMumStore.setTenantId(tenantId); + spuSonMumStore.setDeleteFlag(false); + + int rowsResult3 = spuSonMumStoreRepository.insert(spuSonMumStore); + log.info("rows3={}", rowsResult3); + } + } + + return true; + } + return false; + } + + @Override + public Boolean update(SpuSonMumDTO spuSonMumDTO) { + if (!spuSonMumDTO.getIsAllStore() && CollUtil.isEmpty(spuSonMumDTO.getSpuStoreIds())) { + // 如果不是适用于所有店铺且店铺没有设置值,返回错误 + throw new CommonException("没有设置店铺!"); + } + // ------------------------------- + Spu spu = spuMapper.selectOne((new Spu()).setSpuCode(spuSonMumDTO.getSpuCode())); + if (ObjectUtil.isNotNull(spu)) { + // 获取租户的id + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Long tenantId = userDetails.getTenantId(); + // 1. 修改主表数据 + SpuSonMum spuSonMum = new SpuSonMum(); + spuSonMum.setId(spuSonMumDTO.getId()); + spuSonMum.setObjectVersionNumber(spuSonMumDTO.getObjectVersionNumber()); + spuSonMum.setRemark(spuSonMumDTO.getRemark()); + spuSonMum.setIsAllStore(spuSonMumDTO.getIsAllStore()); + int rowsResult1 = spuSonMumRepository.updateByPrimaryKeySelective(spuSonMum); + log.info("rows1={}", rowsResult1); + // 先删除原来数据 + SpuSonMumSku sonMumSkuQuery = new SpuSonMumSku(); + sonMumSkuQuery.setSpuCode(spuSonMumDTO.getSpuCode()); + List spuSonMumSkuList = spuSonMumSkuRepository.select(sonMumSkuQuery); + + int rowsResult11 = spuSonMumSkuRepository.batchDelete(spuSonMumSkuList); + log.info("rowsResult211={}", rowsResult11); + + // 添加对应的sku数据 + for (AddSonMumSkuDTO mm : spuSonMumDTO.getSonMumSkuDTOS()) { + Sku skuQuery = new Sku(); + skuQuery.setSkuCode(mm.getSonSkuCode()); + Sku sku = skuMapper.selectOne(skuQuery); + if (ObjectUtil.isNull(sku)) { + throw new CommonException("sku编码不存在,请检查!"); + } + SpuSonMumSku itemSku = new SpuSonMumSku(); + itemSku.setSpuCode(spu.getSpuCode()); + itemSku.setSpuId(spu.getId()); + itemSku.setAmount(mm.getAmount()); + itemSku.setSonSkuId(sku.getId()); + itemSku.setSonSkuCode(mm.getSonSkuCode()); + itemSku.setTenantId(tenantId); + itemSku.setDeleteFlag(false); + + int rowsResult2 = spuSonMumSkuRepository.insert(itemSku); + log.info("rows2={}", rowsResult2); + } + + // 先删除原来数据 + SpuSonMumStore sonMumStoreQuery = new SpuSonMumStore(); + sonMumStoreQuery.setSpuCode(spuSonMumDTO.getSpuCode()); + List spuSonMumStoreList = spuSonMumStoreRepository.select(sonMumStoreQuery); + + int rowsResult22 = spuSonMumStoreRepository.batchDelete(spuSonMumStoreList); + log.info("rowsResult22={}", rowsResult22); + + // 添加适用店铺 + // 需要使用远程调用 + for (Long ll : spuSonMumDTO.getSpuStoreIds()) { + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(ll); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + SpuSonMumStore spuSonMumStore = new SpuSonMumStore(); + spuSonMumStore.setSpuCode(spuSonMumDTO.getSpuCode()); + spuSonMumStore.setStoreId(ll); + spuSonMumStore.setStoreCode(body.getCode()); + spuSonMumStore.setTenantId(tenantId); + spuSonMumStore.setDeleteFlag(false); + + int rowsResult3 = spuSonMumStoreRepository.insert(spuSonMumStore); + log.info("rows3={}", rowsResult3); + } + } + + return true; + } + return false; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean batchRemove(List ids) { + List spuSonMums = spuSonMumRepository.selectByCondition(Condition.builder(SpuSonMum.class) + .andWhere(Sqls.custom() + .andIn(SpuSonMum.FIELD_ID, ids, true) + .andEqualTo(SpuSonMum.FIELD_DELETE_FLAG, false)) + .build()); + + if (CollUtil.isNotEmpty(spuSonMums)) { + for (SpuSonMum mm : spuSonMums) { + // 删除对应的sku + SpuSonMumSku sonMumSkuQuery = new SpuSonMumSku(); + sonMumSkuQuery.setSpuCode(mm.getSpuCode()); + List spuSonMumSkuList = spuSonMumSkuRepository.select(sonMumSkuQuery); + + int resultRows1 = spuSonMumSkuRepository.batchDelete(spuSonMumSkuList); + log.info("resultRows1={}", resultRows1); + + // 删除对应的店铺 + SpuSonMumStore sonMumStoreQuery = new SpuSonMumStore(); + sonMumStoreQuery.setSpuCode(mm.getSpuCode()); + List spuSonMumStoreList = spuSonMumStoreRepository.select(sonMumStoreQuery); + + int resultRows2 = spuSonMumStoreRepository.batchDelete(spuSonMumStoreList); + log.info("resultRows2={}", resultRows2); + } + int resultRows3 = spuSonMumRepository.batchDelete(spuSonMums); + return resultRows3 > 0; + } + + return false; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumSkuServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumSkuServiceImpl.java new file mode 100644 index 0000000..1b3f194 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumSkuServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SpuSonMumSkuService; +import org.springframework.stereotype.Service; +/** + * 子母商品sku表应用服务默认实现 + * + * @author chenzz 2021-08-17 15:49:14 + */ +@Service +public class SpuSonMumSkuServiceImpl implements SpuSonMumSkuService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumStoreServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumStoreServiceImpl.java new file mode 100644 index 0000000..9d9e296 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/app/service/impl/SpuSonMumStoreServiceImpl.java @@ -0,0 +1,13 @@ +package org.skyer.goods.app.service.impl; + +import org.skyer.goods.app.service.SpuSonMumStoreService; +import org.springframework.stereotype.Service; +/** + * 子母商品售卖门店应用服务默认实现 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@Service +public class SpuSonMumStoreServiceImpl implements SpuSonMumStoreService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/config/GoodsExtraDataManager.java b/skyer-goods/src/main/java/org/skyer/goods/config/GoodsExtraDataManager.java new file mode 100644 index 0000000..65a1292 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/config/GoodsExtraDataManager.java @@ -0,0 +1,36 @@ +package org.skyer.goods.config; + + +import org.skyer.common.SkyerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; + +import org.skyer.core.swagger.SkyerRouteData; +import org.skyer.swagger.annotation.SkyerExtraData; +import org.skyer.swagger.swagger.extra.ExtraData; +import org.skyer.swagger.swagger.extra.ExtraDataManager; + +/** + * 服务基本信息 + * + * @author gaokuo.dai@hand-china.com 2018年7月20日下午4:49:12 + */ +@SkyerExtraData +public class GoodsExtraDataManager implements ExtraDataManager { + + @Autowired + private Environment environment; + + @Override + public ExtraData getData() { + SkyerRouteData routeData = new SkyerRouteData(); + routeData.setName(environment.getProperty("skyer.service.current.name", "sgoo")); + routeData.setPath(environment.getProperty("skyer.service.current.path", "/sgoo/**")); + routeData.setServiceId( + environment.getProperty("skyer.service.current.service-name", "skyer-goods")); + routeData.setPackages("org.skyer.goods.api,org.skyer.plugin.goods"); + extraData.put(ExtraData.ZUUL_ROUTE_DATA, routeData); + return extraData; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/config/GoodsSwaggerApiConfig.java b/skyer-goods/src/main/java/org/skyer/goods/config/GoodsSwaggerApiConfig.java new file mode 100644 index 0000000..cf1560d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/config/GoodsSwaggerApiConfig.java @@ -0,0 +1,60 @@ +package org.skyer.goods.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.service.Tag; +import springfox.documentation.spring.web.plugins.Docket; + +/** + *

+ * Swagger Api 描述配置 + *

+ * + * @author qingsheng.chen 2018/7/30 星期一 14:26 + */ +@Configuration +public class GoodsSwaggerApiConfig { + + public static final String GOODS_CATEGORY = "Goods Category"; + public static final String GOODS_CATEGORY_ATTRIBUTE = "Goods Category Attribute"; + public static final String GOODS_BRAND = "goods-brand"; + public static final String GOODS_MANAGER = "goods-manager"; + public static final String GOODS_ATTRIBUTE = "goods-attribute"; + public static final String GOODS_ATTRIBUTE_RELATION = "goods-attribute-relation"; + public static final String GOODS_MATERIAL = "goods-material"; + public static final String GOODS_SPECIFICATIONS = "goods-specifications"; + public static final String GOODS_SKU = "goods-sku"; + public static final String GOODS_PRICE = "goods-price"; + public static final String GOODS_PRICE_SETTING = "goods-price-setting"; + public static final String GOODS_GROUP = "goods group"; + public static final String GOODS_SPU_SON_MUM = "goods-spu-son"; + public static final String GOODS_INSTALL_SERVICE = "goods-install-service"; + public static final String GOODS_SPU_INSTALL_SERVICE = "goods-spu-install-service"; + public static final String GOODS_SKU_AUDIT_SETTING = "goods-sku-audit-setting"; + public static final String GOODS_SKU_AUDIT_MANAGER = "goods-sku-audit-manager"; + + @Autowired + public GoodsSwaggerApiConfig(Docket docket) { + docket.tags( + new Tag(GOODS_CATEGORY, "商品分类管理"), + new Tag(GOODS_CATEGORY_ATTRIBUTE, "商品分类属性管理"), + new Tag(GOODS_BRAND, "商品品牌"), + new Tag(GOODS_MANAGER, "商品管理"), + new Tag(GOODS_ATTRIBUTE, "商品属性"), + new Tag(GOODS_MATERIAL, "商品素材管理"), + new Tag(GOODS_SPECIFICATIONS, "商品规格管理"), + new Tag(GOODS_SKU, "商品SKU"), + new Tag(GOODS_PRICE, "商品价格管理"), + new Tag(GOODS_PRICE_SETTING, "商品价格项设置"), + new Tag(GOODS_PRICE, "商品价格管理"), + new Tag(GOODS_SPU_SON_MUM, "子母商品管理"), + new Tag(GOODS_INSTALL_SERVICE, "安装服务管理"), + new Tag(GOODS_SPU_INSTALL_SERVICE, "商品安装服务管理"), + new Tag(GOODS_ATTRIBUTE_RELATION, "商品属性关联"), + new Tag(GOODS_GROUP, "商品组合"), + new Tag(GOODS_SKU_AUDIT_MANAGER, "商品SKU审核管理"), + new Tag(GOODS_SKU_AUDIT_SETTING, "商品SKU审核设置") + ); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSonMumSkuDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSonMumSkuDTO.java new file mode 100644 index 0000000..e0f41ce --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSonMumSkuDTO.java @@ -0,0 +1,19 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +public class AddSonMumSkuDTO { + + @ApiModelProperty(value = "子商品sku_code",required = true) + @NotBlank + private String sonSkuCode; + + @ApiModelProperty(value = "数量",required = true) + @NotNull + private Long amount; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSpuInstallServiceSkuDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSpuInstallServiceSkuDTO.java new file mode 100644 index 0000000..e730c08 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AddSpuInstallServiceSkuDTO.java @@ -0,0 +1,19 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +public class AddSpuInstallServiceSkuDTO { + + @ApiModelProperty(value = "子商品sku_code",required = true) + @NotBlank + private String sonSkuCode; + + @ApiModelProperty(value = "数量",required = true) + @NotNull + private Long amount; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AuditDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AuditDTO.java new file mode 100644 index 0000000..7d6265f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/AuditDTO.java @@ -0,0 +1,23 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import org.skyer.starter.keyencrypt.core.Encrypt; +/** + * 审核动作 + * @author lixiaoyang + * @date 2022/1/4 13:37 + */ +@Data +public class AuditDTO { + + @Encrypt + private Long id; + + @ApiModelProperty(value = "true 通过 false驳回") + private Boolean flag; + + @ApiModelProperty(value = "审核意见") + private String auditIdea; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/InstallServiceDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/InstallServiceDTO.java new file mode 100644 index 0000000..d702cc6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/InstallServiceDTO.java @@ -0,0 +1,53 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 子母商品 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@ApiModel("安装服务") +@Data +public class InstallServiceDTO { + + @ApiModelProperty("主键id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "安装服务编码", required = true) + // @NotEmpty(message = "安装服务编码不能为空") + private String serviceCode; + + @ApiModelProperty(value = "服务名称", required = true) + @NotEmpty(message = "服务名称不能为空") + private String name; + + @ApiModelProperty(value = "安装类别", required = true) + @NotEmpty(message = "安装类别不能为空") + private String type; + + @ApiModelProperty(value = "配备安装人数") + @NotNull(message = "配备安装人数不能为空") + private Long peopleAmount; + + @ApiModelProperty(value = "费用") + @NotNull(message = "费用不能为空") + private BigDecimal money; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "服务地区,json数据") + private List serviceZone; + + private Long objectVersionNumber; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/LevelRedisCategoryDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/LevelRedisCategoryDTO.java new file mode 100644 index 0000000..bc3e523 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/LevelRedisCategoryDTO.java @@ -0,0 +1,41 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/29 10:08 上午 + */ +@Data +public class LevelRedisCategoryDTO { + + /** + * 主键id + */ + @ApiModelProperty("主键id") + @Encrypt + private Long id; + + /** + * 分类级别 + */ + @ApiModelProperty("分类级别") + private Integer level; + + /** + * 分类名称 + */ + @ApiModelProperty("分类名称") + private String name; + + /** + * 下级类目 + */ + @ApiModelProperty("下级分类") + private List sonLevelCategory; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/MultiDelDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/MultiDelDTO.java new file mode 100644 index 0000000..2070c9c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/MultiDelDTO.java @@ -0,0 +1,21 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * @description + * @Author chenzz + * @create 2021/8/19 10:04 上午 + */ +@Data +@ApiModel("删除id") +public class MultiDelDTO { + + @ApiModelProperty("主键id") + private List ids; +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageInstallServiceDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageInstallServiceDTO.java new file mode 100644 index 0000000..d39f1e1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageInstallServiceDTO.java @@ -0,0 +1,15 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class PageInstallServiceDTO { + + @ApiModelProperty(value = "安装服务编码") + private String serviceCode; + + @ApiModelProperty(value = "服务名称") + private String name; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSonMumDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSonMumDTO.java new file mode 100644 index 0000000..61e0715 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSonMumDTO.java @@ -0,0 +1,12 @@ +package org.skyer.goods.domain.dto; + +import lombok.Data; + +@Data +public class PageSonMumDTO { + + private String spuCode; + + private String spuName; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSpuInstallServiceDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSpuInstallServiceDTO.java new file mode 100644 index 0000000..150546d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/PageSpuInstallServiceDTO.java @@ -0,0 +1,19 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class PageSpuInstallServiceDTO { + + private String spuCode; + + private String spuName; + + @ApiModelProperty(value = "安装服务编码") + private String installServiceCode; + + @ApiModelProperty(value = "安装服务名称") + private String installServiceName; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/ServiceZoneDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/ServiceZoneDTO.java new file mode 100644 index 0000000..cb46484 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/ServiceZoneDTO.java @@ -0,0 +1,35 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 子母商品 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@ApiModel("服务地区DTO") +@Data +public class ServiceZoneDTO { + + @ApiModelProperty("国家id") + private Long countryId; + + @ApiModelProperty("国家") + private String countryName; + + @ApiModelProperty("省id") + private Long provinceId; + + @ApiModelProperty("省") + private String provinceName; + + @ApiModelProperty("城市id") + private Long cityId; + + @ApiModelProperty("城市") + private String cityName; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SkuAuditDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SkuAuditDTO.java new file mode 100644 index 0000000..d28a3cb --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SkuAuditDTO.java @@ -0,0 +1,12 @@ +package org.skyer.goods.domain.dto; + +import lombok.Data; + +import org.skyer.starter.keyencrypt.core.Encrypt; + +@Data +public class SkuAuditDTO { + + @Encrypt + private Long id; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuInstallServiceDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuInstallServiceDTO.java new file mode 100644 index 0000000..9e28b58 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuInstallServiceDTO.java @@ -0,0 +1,45 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 子母商品 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@ApiModel("商品安装服务") +@Data +public class SpuInstallServiceDTO { + + @ApiModelProperty("主键id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "spu编码(主)", required = true) + @NotBlank + private String spuCode; + + @ApiModelProperty(value = "是否适用于全部店铺") + private Boolean isAllStore; + + @ApiModelProperty(value = "安装服务code") + private String installServiceCode; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "商品sku明细") + private List sonSkuCodes; + + @ApiModelProperty(value = "售卖门店,店铺ID") + @Encrypt + private List spuStoreIds; + + private Long objectVersionNumber; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuSonMumDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuSonMumDTO.java new file mode 100644 index 0000000..06df376 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/SpuSonMumDTO.java @@ -0,0 +1,42 @@ +package org.skyer.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 子母商品 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@ApiModel("子母商品") +@Data +public class SpuSonMumDTO { + + @ApiModelProperty("主键id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "spu编码(主)", required = true) + @NotBlank + private String spuCode; + + @ApiModelProperty(value = "是否适用于全部店铺") + private Boolean isAllStore; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "商品sku明细") + private List sonMumSkuDTOS; + + @ApiModelProperty(value = "售卖门店,店铺ID") + @Encrypt + private List spuStoreIds; + + private Long objectVersionNumber; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/dto/TotalCategoryDTO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/TotalCategoryDTO.java new file mode 100644 index 0000000..9767d64 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/dto/TotalCategoryDTO.java @@ -0,0 +1,20 @@ +package org.skyer.goods.domain.dto; + +import lombok.Data; + +/** + * @description + * @Author wusc + * @create 2021/6/28 10:04 上午 + */ +@Data +public class TotalCategoryDTO { + /** + * 分类级别 + */ + private Integer level; + /** + * 数量 + */ + private Integer num; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Brand.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Brand.java new file mode 100644 index 0000000..1002d44 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Brand.java @@ -0,0 +1,85 @@ +package org.skyer.goods.domain.entity; + + +import com.fasterxml.jackson.annotation.JsonInclude; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import lombok.experimental.Accessors; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.MultiLanguage; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; + +/** + *

+ * 商品品牌表 + *

+ * + * @author wusc + * @since 2021-06-24 + */ +@ModifyAudit +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +@Data +@EqualsAndHashCode(callSuper = false) +@Table(name="sgoo_brand") +@ApiModel(description="商品品牌表") +public class Brand extends AuditDomain { + + public static String NAME = "name"; + + public static final String DELETE_FLAG = "deleteFlag"; + public static final String CODE = "code"; + public static final String TENANT_ID = "tenantId"; + @ApiModelProperty("表ID,主键,供其他表做外键") + @Id + @GeneratedValue + @Encrypt + private Long id; + + @ApiModelProperty(value = "编码") + private String code; + + @ApiModelProperty(value = "logo") + private String logo; + + @ApiModelProperty(value = "生成商") + private String manufacturer; + + @ApiModelProperty(value = "品牌名称") + private String name; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "状态1,启用;0禁用") + private Integer status; + + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + + @ApiModelProperty(value = "租户Id") + @Encrypt + private Long tenantId; + + public Brand(){ + this.deleteFlag = false; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag == null ? false : deleteFlag; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Category.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Category.java new file mode 100644 index 0000000..24c6aaa --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Category.java @@ -0,0 +1,98 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 商品分类表 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@ApiModel("商品分类表") +@VersionAudit +@ModifyAudit +@Data +@EqualsAndHashCode(callSuper = true) +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_category") +public class Category extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_CODE = "code"; + public static final String FIELD_NAME = "name"; + public static final String FIELD_PARENT_ID = "parentId"; + public static final String FIELD_STATUS_FLAG = "statusFlag"; + public static final String FIELD_LEVEL = "level"; + public static final String FIELD_SUB_FLAG = "subFlag"; + public static final String FIELD_SORT = "sort"; + public static final String FIELD_REMARK = "remark"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + @Encrypt + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + + @ApiModelProperty(value = "分类编码") + private String code; + + @ApiModelProperty(value = "分类名称") + private String name; + + @Encrypt + @ApiModelProperty(value = "父id 默认0,代表一级",required = true) + @NotNull + private Long parentId; + + @ApiModelProperty(value = "状态 1启用 0禁用 默认1",required = true) + @NotNull + private Boolean statusFlag; + + @ApiModelProperty(value = "类目等级 一级开始 默认1",required = true) + @NotNull + private Integer level; + + @ApiModelProperty(value = "是否叶子类目 0否 1是,默认0",required = true) + @NotNull + private Boolean subFlag; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "备注") + private String remark; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + @ApiModelProperty(value = "下级分类", hidden = true) + @Transient + private List children; + + @ApiModelProperty(value = "分类属性", hidden = true) + @Transient + private List attributeList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttribute.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttribute.java new file mode 100644 index 0000000..0f6cb44 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttribute.java @@ -0,0 +1,98 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import lombok.Data; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * 商品分类属性表 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@ApiModel("商品分类属性表") +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_category_attribute") +public class CategoryAttribute { + + public static final String FIELD_ID = "id"; + public static final String FIELD_CATEGORY_ID = "categoryId"; + public static final String FIELD_NAME = "name"; + public static final String FIELD_CODE = "code"; + public static final String FIELD_SORT = "sort"; + public static final String FIELD_FORM_TYPE = "formType"; + public static final String FIELD_SKU_FLAG = "skuFlag"; + public static final String FIELD_STATUS_FLAG = "statusFlag"; + public static final String FIELD_REMARK = "remark"; + public static final String FIELD_SOURCE_TYPE = "sourceType"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @Encrypt + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + + @Encrypt + @ApiModelProperty(value = "分类id sgoo_category.id",required = true) + @NotNull + private Long categoryId; + + @ApiModelProperty(value = "属性名称") + private String name; + + @ApiModelProperty(value = "属性编码") + private String code; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "表单方式 1单选2复选3文本4下拉 默认3",required = true) + @NotNull + private Integer formType; + + @ApiModelProperty(value = "是否用于生成sku 1是 0 否 默认0",required = true) + @NotNull + private Boolean skuFlag; + + @ApiModelProperty(value = "状态 1启用 0禁用 默认1",required = true) + @NotNull + private Boolean statusFlag; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "来源类型", required = true) + private Integer sourceType; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + @ApiModelProperty(value = "属性值", hidden = true) + @Transient + private List attributeValueList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttributeValue.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttributeValue.java new file mode 100644 index 0000000..ef65eb9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/CategoryAttributeValue.java @@ -0,0 +1,61 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +/** + * 商品分类属性值表 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@ApiModel("商品分类属性值表") +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_category_attribute_value") +public class CategoryAttributeValue { + + public static final String FIELD_ID = "id"; + public static final String FIELD_ATTRIBUTE_ID = "attributeId"; + public static final String FIELD_VALUE = "value"; + public static final String FIELD_SORT = "sort"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @Encrypt + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + + @Encrypt + @ApiModelProperty(value = "属性id sgoo_category_attribute.id",required = true) + @NotNull + private Long attributeId; + + @ApiModelProperty(value = "属性值") + private String value; + + @ApiModelProperty(value = "排序") + private Long sort; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/GoodsShop.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/GoodsShop.java new file mode 100644 index 0000000..5bdf5b8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/GoodsShop.java @@ -0,0 +1,148 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 商品在店铺中的上下架关系表 + * + * @author chenzz 2021-07-06 10:35:45 + */ +@ApiModel("商品在店铺中的上下架关系表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_goods_shop") +public class GoodsShop extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_GOODS_ID = "spuId"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_SHOP_ID = "shopId"; + public static final String FIELD_STATUS = "status"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "商品id") + private Long spuId; + @ApiModelProperty(value = "spu") + private String spuCode; + @ApiModelProperty(value = "店铺id") + private Long shopId; + @ApiModelProperty(value = "状态,上下架。1上架,0下架") + private Integer status; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + public GoodsShop() { + this.deleteFlag = 0; + } + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return 商品id + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + /** + * @return spu + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 店铺id + */ + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + /** + * @return 状态,上下架。1上架,0下架 + */ + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + /** + * @return 删除状态 + */ + public Integer getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/InstallService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/InstallService.java new file mode 100644 index 0000000..8f9c94b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/InstallService.java @@ -0,0 +1,197 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 安装服务 + * + * @author chenzz 2021-08-18 15:42:47 + */ +@ApiModel("安装服务") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_install_service") +public class InstallService extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SERVICE_CODE = "serviceCode"; + public static final String FIELD_NAME = "name"; + public static final String FIELD_TYPE = "type"; + public static final String FIELD_PEOPLE_AMOUNT = "peopleAmount"; + public static final String FIELD_MONEY = "money"; + public static final String FIELD_REMARK = "remark"; + public static final String FIELD_SERVICE_ZONE = "serviceZone"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "安装服务编码", required = true) + @NotBlank + private String serviceCode; + @ApiModelProperty(value = "服务名称", required = true) + @NotBlank + private String name; + @ApiModelProperty(value = "安装类别", required = true) + @NotBlank + private String type; + @ApiModelProperty(value = "配备安装人数", required = true) + @NotNull + private Long peopleAmount; + @ApiModelProperty(value = "费用", required = true) + @NotNull + private BigDecimal money; + @ApiModelProperty(value = "备注", required = true) + @NotBlank + private String remark; + @ApiModelProperty(value = "服务地区,json数据", required = true) + @NotBlank + private String serviceZone; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return 安装服务编码 + */ + public String getServiceCode() { + return serviceCode; + } + + public void setServiceCode(String serviceCode) { + this.serviceCode = serviceCode; + } + + /** + * @return 服务名称 + */ + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * @return 安装类别 + */ + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + /** + * @return 配备安装人数 + */ + public Long getPeopleAmount() { + return peopleAmount; + } + + public void setPeopleAmount(Long peopleAmount) { + this.peopleAmount = peopleAmount; + } + + /** + * @return 费用 + */ + public BigDecimal getMoney() { + return money; + } + + public void setMoney(BigDecimal money) { + this.money = money; + } + + /** + * @return 备注 + */ + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + /** + * @return 服务地区,json数据 + */ + public String getServiceZone() { + return serviceZone; + } + + public void setServiceZone(String serviceZone) { + this.serviceZone = serviceZone; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Material.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Material.java new file mode 100644 index 0000000..28dd6d6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Material.java @@ -0,0 +1,102 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.sun.org.apache.xpath.internal.operations.Bool; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +@VersionAudit +@ModifyAudit +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +@Data +@EqualsAndHashCode(callSuper = false) +@Table(name = "sgoo_material") +public class Material extends AuditDomain { + + + public static final String FIELD_ID = "id"; + public static final String FIELD_CODE = "code"; + public static final String FIELD_DETAIL_HTML = "detailHtml"; + public static final String FIELD_DETAIL_IMAGE = "detailImage"; + public static final String FIELD_MAIN_IMAGE = "mainImage"; + public static final String FIELD_MATERIAL_NAME = "materialName"; + public static final String FIELD_REMARK = "remark"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + + public Material() { + this.deleteFlag = false; + } + + @ApiModelProperty("表ID,主键,供其他表做外键") + @Id + @GeneratedValue + @Encrypt + private Long id; + + /** + * 编码 + */ + @ApiModelProperty("编码") + @NotNull + private String code; + + /** + * 素材名称 + */ + @ApiModelProperty("素材名称") + @NotNull + private String materialName; + + /** + * 主图 + */ + @ApiModelProperty("主图") + private String mainImage; + + /** + * 详情图 + */ + @ApiModelProperty("详情图") + private String detailImage; + + /** + * 详情内容 + */ + @ApiModelProperty("详情内容") + private String detailHtml; + + /** + * 备注 + */ + @ApiModelProperty("备注") + private String remark; + + @JsonIgnore + @ApiModelProperty("删除标识") + private Boolean deleteFlag; + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag == null ? false : deleteFlag; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Sku.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Sku.java new file mode 100644 index 0000000..11fd658 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Sku.java @@ -0,0 +1,184 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; + + + +import org.skyer.goods.api.dto.AttributeDTO; +import org.skyer.mybatis.domain.AuditDomain; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; + +/** + * 商品规格表 + * + * @author zhanglongbing@ebc.com 2021-12-27 14:48:20 + */ +@ApiModel("商品规格表") +@VersionAudit +@ModifyAudit +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku") +public class Sku extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_ID = "spuId"; + public static final String FIELD_SKU_CODE = "skuCode"; + public static final String FIELD_SHOW_FLAG = "showFlag"; + public static final String FIELD_ATTRIBUTE_VALUE = "attributeValue"; + public static final String FIELD_MD5_CHECK_VALUE = "md5CheckValue"; + public static final String FIELD_SKU_NAME = "skuName"; + public static final String FIELD_COST_PRICE = "costPrice"; + public static final String FIELD_SALES_PRICE = "salesPrice"; + public static final String FIELD_ACTIVITY_PRICE = "activityPrice"; + public static final String FIELD_MARKET_PRICE = "marketPrice"; + public static final String FIELD_DISTRIBUTION_PRICE = "distributionPrice"; + public static final String FIELD_WHOLESALE_PRICE = "wholesalePrice"; + public static final String FIELD_CLEARING_PRICE = "clearingPrice"; + public static final String FIELD_WEIGHT = "weight"; + public static final String FIELD_LENGTH = "length"; + public static final String FIELD_WIDTH = "width"; + public static final String FIELD_HEIGHT = "height"; + public static final String FIELD_STATUS = "status"; + public static final String FIELD_AUDIT_IDEA = "auditIdea"; + public static final String FIELD_AUDIT_COMMIT_DATE = "auditCommitDate"; + public static final String FIELD_AUDIT_COMMIT_BY = "auditCommitBy"; + + /** + * 套餐标识:1-套餐 + */ + @Transient + public static final Integer SET_FLAG_TRUE = 1; + /** + * 草稿 + */ + @Transient + public static final Integer STATUS_DRAFT = 0; + /** + * 被驳回 + */ + @Transient + public static final Integer STATUS_REJECTED = 1; + /** + * 审核中 + */ + @Transient + public static final Integer STATUS_UNDER_REVIEW = 2; + /** + * 已生效 + */ + @Transient + public static final Integer STATUS_TAKE_EFFECT = 3; + /** + * 已生效(修改中) + */ + @Transient + public static final Integer STATUS_REVISING = 4; + /** + * 已生效(已驳回) + */ + @Transient + public static final Integer STATUS_TAKE_EFFECT_REJECTED = 5; + + + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "商品id") + private Long spuId; + @ApiModelProperty(value = "skuCode") + private String skuCode; + @ApiModelProperty(value = "显示标志,1显示,0不显示", required = true) + @NotNull + private Integer showFlag; + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + @ApiModelProperty(value = "唯一性校验") + private String md5CheckValue; + @ApiModelProperty(value = "sku名称") + private String skuName; + @ApiModelProperty(value = "成本价", required = true) + @NotNull + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价", required = true) + @NotNull + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价", required = true) + @NotNull + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价", required = true) + @NotNull + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价", required = true) + @NotNull + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价", required = true) + @NotNull + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价", required = true) + @NotNull + private BigDecimal clearingPrice; + @ApiModelProperty(value = "商品重量", required = true) + @NotNull + private BigDecimal weight; + @ApiModelProperty(value = "商品长度", required = true) + @NotNull + private BigDecimal length; + @ApiModelProperty(value = "商品宽度", required = true) + @NotNull + private BigDecimal width; + @ApiModelProperty(value = "商品高度", required = true) + @NotNull + private BigDecimal height; + @ApiModelProperty(value = "状态 0草稿1审核中 2被驳回 3已生效 4已生效(修改中) 5已生效(被驳回)", required = true) + @NotNull + private Integer status; + @ApiModelProperty(value = "审核意见") + private String auditIdea; + @ApiModelProperty(value = "审核提交时间") + private Date auditCommitDate; + @ApiModelProperty(value = "最后提交人id") + private Long auditCommitBy; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + @ApiModelProperty(value = "spu类别") + @Transient + private Integer spuType; + @ApiModelProperty("原始属性列表") + @Transient + private List skuAttributeList; + @ApiModelProperty("附加属性列表") + @Transient + private List otherAttributeList; + @ApiModelProperty("套餐信息 sku明细") + @Transient + private ListskuDetailList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttrValueRelation.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttrValueRelation.java new file mode 100644 index 0000000..a32d425 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttrValueRelation.java @@ -0,0 +1,133 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 商品sku和属性值关系表 + * + * @author chenzz 2021-07-06 10:35:44 + */ +@ApiModel("商品sku和属性值关系表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_attr_value_relation") +public class SkuAttrValueRelation extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_GOODS_SKU_ID = "goodsSkuId"; + public static final String FIELD_SKU = "sku"; + public static final String FIELD_ATTRIBUTE_VALUE_ID = "attributeValueId"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + public SkuAttrValueRelation() { + this.deleteFlag = false; + } + + @ApiModelProperty("id主键") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "sku表id") + private Long goodsSkuId; + @ApiModelProperty(value = "sku") + private String sku; + @ApiModelProperty(value = "属性值表id") + private Long attributeValueId; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return id主键 + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + /** + * @return sku表id + */ + public Long getGoodsSkuId() { + return goodsSkuId; + } + + public void setGoodsSkuId(Long goodsSkuId) { + this.goodsSkuId = goodsSkuId; + } + /** + * @return sku + */ + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + /** + * @return 属性值表id + */ + public Long getAttributeValueId() { + return attributeValueId; + } + + public void setAttributeValueId(Long attributeValueId) { + this.attributeValueId = attributeValueId; + } + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag == null ? false : deleteFlag; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValue.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValue.java new file mode 100644 index 0000000..b5396cd --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValue.java @@ -0,0 +1,77 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import lombok.Data; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * sku属性关联表 + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +@ApiModel("sku属性关联表") +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_attribute_value") +public class SkuAttributeValue { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SKU_ID = "skuId"; + public static final String FIELD_ATTRIBUTE_ID = "attributeId"; + public static final String FIELD_ATTRIBUTE_NAME = "attributeName"; + public static final String FIELD_ATTRIBUTE_VALUE = "attributeValue"; + public static final String FIELD_ATTRIBUTE_TYPE = "attributeType"; + public static final String FIELD_IS_SKU = "isSku"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("属性值") + @Id + @Encrypt + @GeneratedValue + private Long id; + @ApiModelProperty(value = "",required = true) + @Encrypt + @NotNull + private Long skuId; + @Encrypt + @ApiModelProperty(value = "属性ID") + private Long attributeId; + @ApiModelProperty(value = "属性名称",required = true) + @NotBlank + private String attributeName; + @ApiModelProperty(value = "属性值",required = true) + @NotBlank + private String attributeValue; + @ApiModelProperty(value = "类型: 系统属性0 分类属性 1 商品属性2 附加属性3") + private Integer attributeType; + @ApiModelProperty(value = "是否用于生成sku",required = true) + @NotNull + private Boolean isSku; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValueDraft.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValueDraft.java new file mode 100644 index 0000000..fbbc1a9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAttributeValueDraft.java @@ -0,0 +1,71 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * sku属性关联草稿表 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:35:38 + */ +@ApiModel("sku属性关联草稿表") +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_attribute_value_draft") +public class SkuAttributeValueDraft { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SKU_ID = "skuId"; + public static final String FIELD_ATTRIBUTE_ID = "attributeId"; + public static final String FIELD_ATTRIBUTE_NAME = "attributeName"; + public static final String FIELD_ATTRIBUTE_VALUE = "attributeValue"; + public static final String FIELD_ATTRIBUTE_TYPE = "attributeType"; + public static final String FIELD_IS_SKU = "isSku"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("属性值") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "", required = true) + @NotNull + private Long skuId; + @ApiModelProperty(value = "属性ID") + private Long attributeId; + @ApiModelProperty(value = "属性名称", required = true) + @NotBlank + private String attributeName; + @ApiModelProperty(value = "属性值", required = true) + @NotBlank + private String attributeValue; + @ApiModelProperty(value = "类型: 系统属性0 分类属性 1 商品属性2 附加属性3") + private Integer attributeType; + @ApiModelProperty(value = "是否用于生成sku", required = true) + @NotNull + private Boolean isSku; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAuditSetting.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAuditSetting.java new file mode 100644 index 0000000..6b48bcf --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuAuditSetting.java @@ -0,0 +1,79 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import lombok.Data; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 商品SKU审核 + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +@ApiModel("商品SKU审核") +@VersionAudit +@ModifyAudit +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_audit_setting") +public class SkuAuditSetting extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_CREATED_AUDIT_STATUS = "createdAuditStatus"; + public static final String FIELD_UPDATE_AUDIT_STATUS = "updateAuditStatus"; + public static final String FIELD_UPDATE_PRICE_STATUS = "updatePriceStatus"; + public static final String FIELD_UPDATE_PROPERTY_STATUS = "updatePropertyStatus"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "创建审核状态 1开启 0关闭",required = true) + @NotNull + private Integer createdAuditStatus; + @ApiModelProperty(value = "更改审核状态 1开启 0关闭",required = true) + @NotNull + private Integer updateAuditStatus; + @ApiModelProperty(value = "更改价格状态 1开启 0关闭") + private Integer updatePriceStatus; + @ApiModelProperty(value = "更改属性状态 1开启 0关闭") + private Integer updatePropertyStatus; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + /** + * 关闭状态 + */ + @Transient + public static final Integer STATUS_OFF = 0; + /** + * 开启状态 + */ + @Transient + public static final Integer STATUS_ON = 1; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuDraft.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuDraft.java new file mode 100644 index 0000000..ba0b346 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuDraft.java @@ -0,0 +1,107 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import lombok.Data; + +import org.skyer.mybatis.domain.AuditDomain; + +import java.math.BigDecimal; + +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 商品规格草稿表 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +@ApiModel("商品规格草稿表") +@Data +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_draft") +public class SkuDraft { + + public static final String FIELD_SKU_ID = "skuId"; + public static final String FIELD_SKU_CODE = "skuCode"; + public static final String FIELD_SHOW_FLAG = "showFlag"; + public static final String FIELD_COST_PRICE = "costPrice"; + public static final String FIELD_SALES_PRICE = "salesPrice"; + public static final String FIELD_ACTIVITY_PRICE = "activityPrice"; + public static final String FIELD_MARKET_PRICE = "marketPrice"; + public static final String FIELD_DISTRIBUTION_PRICE = "distributionPrice"; + public static final String FIELD_WHOLESALE_PRICE = "wholesalePrice"; + public static final String FIELD_CLEARING_PRICE = "clearingPrice"; + public static final String FIELD_WEIGHT = "weight"; + public static final String FIELD_LENGTH = "length"; + public static final String FIELD_WIDTH = "width"; + public static final String FIELD_HEIGHT = "height"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long skuId; + @ApiModelProperty(value = "sku") + private String skuCode; + @ApiModelProperty(value = "显示标志,1显示,0不显示", required = true) + @NotNull + private Integer showFlag; + @ApiModelProperty(value = "成本价", required = true) + @NotNull + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价", required = true) + @NotNull + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价", required = true) + @NotNull + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价", required = true) + @NotNull + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价", required = true) + @NotNull + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价", required = true) + @NotNull + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价", required = true) + @NotNull + private BigDecimal clearingPrice; + @ApiModelProperty(value = "商品重量", required = true) + @NotNull + private BigDecimal weight; + @ApiModelProperty(value = "商品长度", required = true) + @NotNull + private BigDecimal length; + @ApiModelProperty(value = "商品宽度", required = true) + @NotNull + private BigDecimal width; + @ApiModelProperty(value = "商品高度", required = true) + @NotNull + private BigDecimal height; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroup.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroup.java new file mode 100644 index 0000000..b205ad3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroup.java @@ -0,0 +1,174 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Sku组合表 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@ApiModel("Sku组合表") +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_group") +public class SkuGroup extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_SKU_GROUP_CODE = "skuGroupCode"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + public static final String FIELD_PRICE = "price"; + public static final String FIELD_MD5_CHECK_VALUE = "md5CheckValue"; + public static final String FIELD_GROUP_NAME = "groupName"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "商品id") + private Long spuId; + @ApiModelProperty(value = "sku") + private String skuGroupCode; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + @ApiModelProperty(value = "价格 多个价格使用json串保存") + private String price; + @ApiModelProperty(value = "唯一性校验") + private String md5CheckValue; + @ApiModelProperty(value = "套餐名称") + private String groupName; + @ApiModelProperty(value = "是否适用于全部店铺") + private Boolean isAllStore; + @ApiModelProperty("备注") + private String remark; + + public SkuGroup() { + this.deleteFlag = ObjectConstant.DeleteFlag.NO; + } + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + /** + * @return 商品id + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + /** + * @return 删除状态 + */ + public Integer getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + } + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * @return 价格 多个价格使用json串保存 + */ + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + /** + * @return 唯一性校验 + */ + public String getMd5CheckValue() { + return md5CheckValue; + } + + public void setMd5CheckValue(String md5CheckValue) { + this.md5CheckValue = md5CheckValue; + } + + public String getSkuGroupCode() { + return skuGroupCode; + } + + public void setSkuGroupCode(String skuGroupCode) { + this.skuGroupCode = skuGroupCode; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public Boolean getIsAllStore() { + return isAllStore; + } + + public void setIsAllStore(Boolean isAllStore) { + this.isAllStore = isAllStore; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupSku.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupSku.java new file mode 100644 index 0000000..145d491 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupSku.java @@ -0,0 +1,140 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.math.BigDecimal; + +/** + * Sku组合和sku关联表 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@ApiModel("Sku组合和sku关联表") +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_group_sku") +public class SkuGroupSku extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + public static final String FIELD_SKU_ID = "skuId"; + public static final String FIELD_SKU_GROUP_ID = "skuGroupId"; + + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + public SkuGroupSku() { + this.deleteFlag = 0; + } + + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + @ApiModelProperty(value = "skuid") + private Long skuId; + @ApiModelProperty(value = "sku组合商品") + private Long skuGroupId; + @ApiModelProperty(value = "数量") + private BigDecimal num; + @ApiModelProperty("spuId") + private Long spuId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + /** + * @return 删除状态 + */ + public Integer getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + } + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * @return skuid + */ + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + /** + * @return sku组合商品 + */ + public Long getSkuGroupId() { + return skuGroupId; + } + + public void setSkuGroupId(Long skuGroupId) { + this.skuGroupId = skuGroupId; + } + + public BigDecimal getNum() { + return num; + } + + public void setNum(BigDecimal num) { + this.num = num; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupStore.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupStore.java new file mode 100644 index 0000000..2f2a792 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuGroupStore.java @@ -0,0 +1,133 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Sku组合和店铺表 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@ApiModel("Sku组合和店铺表") +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_group_store") +public class SkuGroupStore extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + public static final String FIELD_SPU_ID = "spuId"; + public static final String FIELD_STORE_ID = "storeId"; + public static final String FIELD_SKU_GROUP_ID = "skuGroupId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + public SkuGroupStore() { + this.deleteFlag = ObjectConstant.DeleteFlag.NO; + } + + @ApiModelProperty("id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + @ApiModelProperty(value = "商品id") + private Long spuId; + @ApiModelProperty(value = "店铺id") + private Long storeId; + @ApiModelProperty(value = "sku组合商品") + private Long skuGroupId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + /** + * @return 删除状态 + */ + public Integer getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + } + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * @return 商品id + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + /** + * @return 店铺id + */ + public Long getStoreId() { + return storeId; + } + + public void setStoreId(Long storeId) { + this.storeId = storeId; + } + /** + * @return sku组合商品 + */ + public Long getSkuGroupId() { + return skuGroupId; + } + + public void setSkuGroupId(Long skuGroupId) { + this.skuGroupId = skuGroupId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuPackage.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuPackage.java new file mode 100644 index 0000000..a2c7e8c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SkuPackage.java @@ -0,0 +1,69 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import lombok.Data; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * + * + * @author zhanglongbing@ebc.com 2022-03-03 10:45:30 + */ +@ApiModel("") +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_sku_package") +@Data +public class SkuPackage { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SKU_ID = "skuId"; + public static final String FIELD_PACKAGE_SKU_ID = "packageSkuId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "主表id",required = true) + @NotNull + private Long skuId; + @ApiModelProperty(value = "套餐内skuId",required = true) + @NotNull + @Encrypt + private Long packageSkuId; + @ApiModelProperty(value = "套餐内sku数量",required = true) + @NotNull + private Long num; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Spu.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Spu.java new file mode 100644 index 0000000..555a878 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/Spu.java @@ -0,0 +1,118 @@ +package org.skyer.goods.domain.entity; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.MultiLanguage; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +/** + *

+ * 商品表 + *

+ * + * @author chenzz + * @since 2021-06-25 + */ +@ModifyAudit +@JsonInclude(JsonInclude.Include.NON_NULL) +@Accessors(chain = true) +@Data +@EqualsAndHashCode(callSuper = false) +@Table(name = "sgoo_spu") +@ApiModel(description = "商品表") +public class Spu extends AuditDomain { + + + public static final String ID = "id"; + + public static final String NAME = "name"; + + public static final String CATEGORY_ID = "categoryId"; + + public static final String TENANT_ID = "tenantId"; + + public static final String DELETE_FLAG = "deleteFlag"; + + public static final String BRAND_ID = "brandId"; + + public static final String SPU_CODE = "spuCode"; + + public static final String MATERIAL_ID = "materialId"; + + public static final String STATUS = "status"; + + /** + * 套餐标识:1-套餐 + */ + @Transient + public static final Integer SET_FLAG_TRUE = 1; + + + @ApiModelProperty("表ID,主键,供其他表做外键") + @Id + @GeneratedValue + @Encrypt + private Long id; + + @ApiModelProperty(value = "编码") + private String brandCode; + + @ApiModelProperty(value = "品牌id") + private Long brandId; + + @ApiModelProperty(value = "分类编码") + private String categoryCode; + + @ApiModelProperty(value = "分类id") + private Long categoryId; + + @ApiModelProperty(value = "素材编码") + private String materialCode; + + @ApiModelProperty(value = "素材id") + private Long materialId; + + @ApiModelProperty(value = "商品名称") + private String name; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "spu") + private String spuCode; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "类型1.实物2虚拟") + private Integer type; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + + + public Spu(){ + this.deleteFlag = false; + } + + public void setDeleteFlag() { + this.deleteFlag = deleteFlag == null ? false : deleteFlag; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttrValueRelation.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttrValueRelation.java new file mode 100644 index 0000000..bdd5978 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttrValueRelation.java @@ -0,0 +1,170 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * 商品和属性值关联关系 + * + * @author wushaochuan 2021-07-19 09:18:33 + */ +@ApiModel("商品和属性值关联关系") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_attr_value_relation") +public class SpuAttrValueRelation extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_GOODS_ID = "spuId"; + public static final String FIELD_ATTRIBUTE_VALUE_ID = "attributeValueId"; + public static final String FIELD_ATTRIBUTE_ID = "attributeId"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + public static final String FIELD_ATTRIVUTE_INPUT_VALUE = "attributeInputValue"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id主键") + @Id + @GeneratedValue + @Encrypt + private Long id; + @ApiModelProperty(value = "商品id") + @Encrypt + private Long spuId; + @ApiModelProperty(value = "属性值表id") + @Encrypt + private Long attributeValueId; + @ApiModelProperty(value = "属性id") + @Encrypt + private Long attributeId; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + @ApiModelProperty(value = "用户填写的属性值") + private String attributeInputValue; + + @ApiModelProperty(value = "属性code") + private String attributeCode; + @ApiModelProperty(value = "属性类别类别 1单选2复选3文本4下拉") + private Integer type; + + public SpuAttrValueRelation() { + this.deleteFlag = 0; + } +// + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return id主键 + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + /** + * @return 商品id + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + /** + * @return 属性值表id + */ + public Long getAttributeValueId() { + return attributeValueId; + } + + public void setAttributeValueId(Long attributeValueId) { + this.attributeValueId = attributeValueId; + } + /** + * @return 属性id + */ + public Long getAttributeId() { + return attributeId; + } + + public void setAttributeId(Long attributeId) { + this.attributeId = attributeId; + } + /** + * @return 删除状态 + */ + public Integer getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag == null ? 0 : deleteFlag; + } + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * @return 用户填写的属性值 + */ + public String getAttributeInputValue() { + return attributeInputValue; + } + + public void setAttributeInputValue(String attributeInputValue) { + this.attributeInputValue = attributeInputValue; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getAttributeCode() { + return attributeCode; + } + + public void setAttributeCode(String attributeCode) { + this.attributeCode = attributeCode; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttribute.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttribute.java new file mode 100644 index 0000000..09be4da --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttribute.java @@ -0,0 +1,86 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 属性表 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@ApiModel("属性表") +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_attribute") +@Data +public class SpuAttribute extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_NAME = "name"; + public static final String FIELD_SORT = "sort"; + public static final String FIELD_CODE = "code"; + public static final String FIELD_REMARK = "remark"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TYPE = "type"; + public static final String FIELD_IS_SKU = "isSku"; + public static final String FIELD_STATUS = "status"; + public static final String FIELD_SUBMISSIONS_TYPE = "submissionsType"; + public static final String FIELD_SPU_ID = "spuId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id") + @Id + @GeneratedValue + @Encrypt + private Long id; + @ApiModelProperty(value = "属性名称") + private String name; + @ApiModelProperty(value = "排序") + private Integer sort; + @ApiModelProperty(value = "编码") + private String code; + @ApiModelProperty(value = "备注") + private String remark; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "1-系统默认属性 2-分类属性 0-商品属性 3附加属性") + private Integer type; + @ApiModelProperty(value = "是否用于生成sku") + private Boolean isSku; + @ApiModelProperty(value = "状态") + private Integer status; + @ApiModelProperty(value = "属性类别 1单选2复选3文本4下拉") + private Integer submissionsType; + @ApiModelProperty(value = "", required = true) + @NotNull + private Long spuId; + + @Transient + private List values; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttributeValue.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttributeValue.java new file mode 100644 index 0000000..18b8528 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuAttributeValue.java @@ -0,0 +1,65 @@ +package org.skyer.goods.domain.entity; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotBlank; + +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 属性值表 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@ApiModel("属性值表") +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_attribute_value") +@Data +public class SpuAttributeValue extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_ATTRIBUTE_ID = "attributeId"; + public static final String FIELD_VALUE = "value"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_SORT = "sort"; + public static final String FIELD_SPU_ID = "spuId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("id主键") + @Id + @GeneratedValue + @Encrypt + private Long id; + @ApiModelProperty(value = "属性id") + private Long attributeId; + @ApiModelProperty(value = "属性值") + private String value; + @ApiModelProperty(value = "删除状态") + private Integer deleteFlag; + @ApiModelProperty(value = "排序") + private Integer sort; + @ApiModelProperty(value = "spuId") + private Long spuId; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallService.java new file mode 100644 index 0000000..01acad4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallService.java @@ -0,0 +1,220 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 商品安装服务 + * + * @author chenzz 2021-08-19 17:35:48 + */ +@ApiModel("商品安装服务") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_install_service") +public class SpuInstallService extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_ID = "spuId"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_SPU_NAME = "spuName"; + public static final String FIELD_IS_ALL_STORE = "isAllStore"; + public static final String FIELD_CATEGORY_ID = "categoryId"; + public static final String FIELD_INSTALL_SERVICE_ID = "installServiceId"; + public static final String FIELD_INSTALL_SERVICE_CODE = "installServiceCode"; + public static final String FIELD_INSTALL_SERVICE_NAME = "installServiceName"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_REMARK = "remark"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "spu_id(主)", required = true) + @NotNull + private Long spuId; + @ApiModelProperty(value = "spu编码(主)", required = true) + @NotBlank + private String spuCode; + @ApiModelProperty(value = "商品名称", required = true) + @NotBlank + private String spuName; + @ApiModelProperty(value = "是否适用于全部店铺") + private Boolean isAllStore; + @ApiModelProperty(value = "目录id") + private Long categoryId; + @ApiModelProperty(value = "安装服务id") + private Long installServiceId; + @ApiModelProperty(value = "安装服务code") + private String installServiceCode; + @ApiModelProperty(value = "安装服务名称") + private String installServiceName; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "备注") + private String remark; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return spu_id(主) + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + /** + * @return spu编码(主) + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 商品名称 + */ + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + /** + * @return 是否适用于全部店铺 + */ + public Boolean getIsAllStore() { + return isAllStore; + } + + public void setIsAllStore(Boolean isAllStore) { + this.isAllStore = isAllStore; + } + + /** + * @return 目录id + */ + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + /** + * @return 安装服务id + */ + public Long getInstallServiceId() { + return installServiceId; + } + + public void setInstallServiceId(Long installServiceId) { + this.installServiceId = installServiceId; + } + + /** + * @return 安装服务code + */ + public String getInstallServiceCode() { + return installServiceCode; + } + + public void setInstallServiceCode(String installServiceCode) { + this.installServiceCode = installServiceCode; + } + + /** + * @return 安装服务名称 + */ + public String getInstallServiceName() { + return installServiceName; + } + + public void setInstallServiceName(String installServiceName) { + this.installServiceName = installServiceName; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 备注 + */ + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceSku.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceSku.java new file mode 100644 index 0000000..96d0330 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceSku.java @@ -0,0 +1,151 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 商品安装服务sku表 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@ApiModel("商品安装服务sku表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_install_service_sku") +public class SpuInstallServiceSku extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_ID = "spuId"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_SON_SKU_ID = "sonSkuId"; + public static final String FIELD_SON_SKU_CODE = "sonSkuCode"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "spu_id(主)", required = true) + @NotNull + private Long spuId; + @ApiModelProperty(value = "spu编码(主)", required = true) + @NotBlank + private String spuCode; + @ApiModelProperty(value = "子商品sku_id", required = true) + @NotNull + private Long sonSkuId; + @ApiModelProperty(value = "子商品sku_code", required = true) + @NotBlank + private String sonSkuCode; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return spu_id(主) + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + /** + * @return spu编码(主) + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 子商品sku_id + */ + public Long getSonSkuId() { + return sonSkuId; + } + + public void setSonSkuId(Long sonSkuId) { + this.sonSkuId = sonSkuId; + } + + /** + * @return 子商品sku_code + */ + public String getSonSkuCode() { + return sonSkuCode; + } + + public void setSonSkuCode(String sonSkuCode) { + this.sonSkuCode = sonSkuCode; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceStore.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceStore.java new file mode 100644 index 0000000..faebd36 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuInstallServiceStore.java @@ -0,0 +1,136 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 商品安装服务售卖门店 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@ApiModel("商品安装服务售卖门店") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_install_service_store") +public class SpuInstallServiceStore extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_STORE_ID = "storeId"; + public static final String FIELD_STORE_CODE = "storeCode"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "spuCode", required = true) + @NotBlank + private String spuCode; + @ApiModelProperty(value = "店铺id", required = true) + @NotNull + private Long storeId; + @ApiModelProperty(value = "店铺代码", required = true) + @NotBlank + private String storeCode; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return spuCode + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 店铺id + */ + public Long getStoreId() { + return storeId; + } + + public void setStoreId(Long storeId) { + this.storeId = storeId; + } + + /** + * @return 店铺代码 + */ + public String getStoreCode() { + return storeCode; + } + + public void setStoreCode(String storeCode) { + this.storeCode = storeCode; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMum.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMum.java new file mode 100644 index 0000000..0e201a2 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMum.java @@ -0,0 +1,178 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 子母商品 + * + * @author chenzz 2021-08-17 15:49:14 + */ +@ApiModel("子母商品") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_son_mum") +public class SpuSonMum extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_ID = "spuId"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_SPU_NAME = "spuName"; + public static final String FIELD_IS_ALL_STORE = "isAllStore"; + public static final String FIELD_CATEGORY_ID = "categoryId"; + public static final String FIELD_REMARK = "remark"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "spu_id(主)", required = true) + @NotNull + private Long spuId; + @ApiModelProperty(value = "spu编码(主)", required = true) + @NotBlank + private String spuCode; + @ApiModelProperty(value = "商品名称", required = true) + @NotBlank + private String spuName; + @ApiModelProperty(value = "是否适用于全部店铺") + private Boolean isAllStore; + @ApiModelProperty(value = "目录id") + private Long categoryId; + @ApiModelProperty(value = "备注") + private String remark; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return spu_id(主) + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + /** + * @return spu编码(主) + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 商品名称 + */ + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + /** + * @return 是否适用于全部店铺 + */ + public Boolean getIsAllStore() { + return isAllStore; + } + + public void setIsAllStore(Boolean isAllStore) { + this.isAllStore = isAllStore; + } + + /** + * @return 目录id + */ + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + /** + * @return 备注 + */ + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumSku.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumSku.java new file mode 100644 index 0000000..bc78572 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumSku.java @@ -0,0 +1,166 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 子母商品sku表 + * + * @author chenzz 2021-08-17 15:49:14 + */ +@ApiModel("子母商品sku表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_son_mum_sku") +public class SpuSonMumSku extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_ID = "spuId"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_SON_SKU_ID = "sonSkuId"; + public static final String FIELD_SON_SKU_CODE = "sonSkuCode"; + public static final String FIELD_AMOUNT = "amount"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "spu_id(主)", required = true) + @NotNull + private Long spuId; + @ApiModelProperty(value = "spu编码(主)", required = true) + @NotBlank + private String spuCode; + @ApiModelProperty(value = "子商品sku_id", required = true) + @NotNull + private Long sonSkuId; + @ApiModelProperty(value = "子商品sku_code", required = true) + @NotBlank + private String sonSkuCode; + @ApiModelProperty(value = "数量", required = true) + @NotNull + private Long amount; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return spu_id(主) + */ + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + /** + * @return spu编码(主) + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 子商品sku_id + */ + public Long getSonSkuId() { + return sonSkuId; + } + + public void setSonSkuId(Long sonSkuId) { + this.sonSkuId = sonSkuId; + } + + /** + * @return 子商品sku_code + */ + public String getSonSkuCode() { + return sonSkuCode; + } + + public void setSonSkuCode(String sonSkuCode) { + this.sonSkuCode = sonSkuCode; + } + + /** + * @return 数量 + */ + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumStore.java b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumStore.java new file mode 100644 index 0000000..61b2720 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/entity/SpuSonMumStore.java @@ -0,0 +1,136 @@ +package org.skyer.goods.domain.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.skyer.mybatis.annotation.ModifyAudit; +import org.skyer.mybatis.annotation.VersionAudit; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 子母商品售卖门店 + * + * @author chenzz 2021-08-17 17:17:16 + */ +@ApiModel("子母商品售卖门店") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "sgoo_spu_son_mum_store") +public class SpuSonMumStore extends AuditDomain { + + public static final String FIELD_ID = "id"; + public static final String FIELD_SPU_CODE = "spuCode"; + public static final String FIELD_STORE_ID = "storeId"; + public static final String FIELD_STORE_CODE = "storeCode"; + public static final String FIELD_DELETE_FLAG = "deleteFlag"; + public static final String FIELD_TENANT_ID = "tenantId"; + + // + // 业务方法(按public protected private顺序排列) + // ------------------------------------------------------------------------------ + + // + // 数据库字段 + // ------------------------------------------------------------------------------ + + + @ApiModelProperty("主键id") + @Id + @GeneratedValue + private Long id; + @ApiModelProperty(value = "spuCode", required = true) + @NotBlank + private String spuCode; + @ApiModelProperty(value = "店铺id", required = true) + @NotNull + private Long storeId; + @ApiModelProperty(value = "店铺代码", required = true) + @NotBlank + private String storeCode; + @ApiModelProperty(value = "删除状态") + private Boolean deleteFlag; + @ApiModelProperty(value = "租户Id") + private Long tenantId; + + // + // 非数据库字段 + // ------------------------------------------------------------------------------ + + // + // getter/setter + // ------------------------------------------------------------------------------ + + /** + * @return 主键id + */ + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + /** + * @return spuCode + */ + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + /** + * @return 店铺id + */ + public Long getStoreId() { + return storeId; + } + + public void setStoreId(Long storeId) { + this.storeId = storeId; + } + + /** + * @return 店铺代码 + */ + public String getStoreCode() { + return storeCode; + } + + public void setStoreCode(String storeCode) { + this.storeCode = storeCode; + } + + /** + * @return 删除状态 + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * @return 租户Id + */ + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/BrandRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/BrandRepository.java new file mode 100644 index 0000000..9e05419 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/BrandRepository.java @@ -0,0 +1,52 @@ +package org.skyer.goods.domain.repository; + + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.BrandPageReqDTO; +import org.skyer.goods.domain.entity.Brand; +import org.skyer.goods.domain.vo.AttributePageResVO; +import org.skyer.goods.domain.vo.BrandPageResVO; +import org.skyer.mybatis.base.BaseRepository; + +import java.util.List; + +/** +*

+* 商品品牌表Mapper +*

+* +* @author wusc +* @since 2021-06-24 +*/ + + +public interface BrandRepository extends BaseRepository { + + /** + * 分页查询品牌 + * @param + * @return + */ + Page pageBrand(BrandPageReqDTO brandPageReqDTO); + + + /** + * 列表查询商品 + * @param brandPageReqDTO + * @return + */ + List listBrand(BrandPageReqDTO brandPageReqDTO); + /** + * 通过名称品牌 + * @param + * @return + */ + Brand getBrandByName(String name,Long id,Long tenantId); + + /** + * 通过名称品牌 + * @param + * @return + */ + Brand getBrandByCode(String code,Long id); +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeRepository.java new file mode 100644 index 0000000..d3d74cc --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeRepository.java @@ -0,0 +1,24 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.goods.api.dto.CategoryAttributeQueryDTO; +import org.skyer.goods.domain.entity.CategoryAttribute; +import org.skyer.goods.domain.vo.CategoryAttributeVO; +import org.skyer.mybatis.base.BaseRepository; + +import java.util.List; + +/** + * 商品分类属性表资源库 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryAttributeRepository extends BaseRepository { + + /** + * 查询商品分类属性,含属性值 + * @param param 属性及属性值查询对象 + * @return 带属性值的属性列表 + */ + List listIncludedValue(CategoryAttributeQueryDTO param); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeValueRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeValueRepository.java new file mode 100644 index 0000000..9110afb --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryAttributeValueRepository.java @@ -0,0 +1,19 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.CategoryAttributeValue; + +/** + * 商品分类属性值表资源库 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryAttributeValueRepository extends BaseRepository { + /** + * 根据分类id 删除属性值 + * @param categoryId 分类id + * @return 删除成功的数量 + */ + int deleteByCategoryId(Long categoryId); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryRepository.java new file mode 100644 index 0000000..daf0789 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/CategoryRepository.java @@ -0,0 +1,67 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.domain.vo.CategoryVO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.Category; +import org.skyer.mybatis.pagehelper.domain.PageRequest; + +import java.util.List; + + +/** + * 商品分类表资源库 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryRepository extends BaseRepository { + + /** + * 获取全部分类 + * @return 全部分类 + */ + List getCategoryAll(); + + /** + * 查询商品分类列表 + * @param categoryQueryDTO 通用查询对象 + * @return 商品分类 + */ + List selectList(CategoryQueryDTO categoryQueryDTO); + + /** + * 分页获取分类列表 + * @param category 查询对象 + * @return 带分页的分类列表 + */ + Page pageIncludedAttr(PageRequest pageRequest, CategoryQueryDTO category); + + /** + * 根据分类ID获取分类名层级结构 + * @param categoryId + * @return String + */ + String getCategoryNameById(Long categoryId); + + /** + * 查询分类子节点Id + * @param categoryIdList + * @return + */ + List getLaterCategoryId(List categoryIdList); + + /** + * 根据父级类目id获取子级类目 + * @param parentId + * @return + */ + List getSonCategory(Long parentId); + + /** + * 根据某一个类目查询所有后代 + * @param parentId + * @return + */ + void getLaterCategory(List allCategoryRes, Long parentId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/InstallServiceRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/InstallServiceRepository.java new file mode 100644 index 0000000..fd2b7a0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/InstallServiceRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.InstallService; + +/** + * 安装服务资源库 + * + * @author chenzz 2021-08-18 15:42:47 + */ +public interface InstallServiceRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/MaterialRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/MaterialRepository.java new file mode 100644 index 0000000..86f5081 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/MaterialRepository.java @@ -0,0 +1,41 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.MaterialListDTO; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.vo.MaterialVO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.mybatis.pagehelper.domain.PageRequest; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +public interface MaterialRepository extends BaseRepository { + /** + * 分页查询经销商 + * + * @param pageRequest + * @param dealerListDTO + * @return + */ + Page pageList(PageRequest pageRequest, MaterialListDTO dealerListDTO); + + /** + * 通过名称查询素材 + * @param materialName + * @return + */ + Integer getSizeByName(String materialName); + + /** + * 通过编码查询素材 + * @param code + * @return + */ + Integer getSizeByCode(String code); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttrValueRelationRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttrValueRelationRepository.java new file mode 100644 index 0000000..1edfb98 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttrValueRelationRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuAttrValueRelation; + +/** + * 商品sku和属性值关系表资源库 + * + * @author chenzz 2021-07-06 10:35:44 + */ +public interface SkuAttrValueRelationRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueDraftRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueDraftRepository.java new file mode 100644 index 0000000..f1dcd7c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueDraftRepository.java @@ -0,0 +1,22 @@ +package org.skyer.goods.domain.repository; + +import java.util.List; + +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuAttributeValueDraft; + +/** + * sku属性关联草稿表资源库 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:23:43 + */ +public interface SkuAttributeValueDraftRepository extends BaseRepository { + /** + * 根据SKU ID获取关联的属性 + * + * @author lixiaoyang + * @date 2021/12/30 11:20 + */ + List queryAllBySkuId(Long skuId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueRepository.java new file mode 100644 index 0000000..16752fd --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAttributeValueRepository.java @@ -0,0 +1,30 @@ +package org.skyer.goods.domain.repository; + +import java.util.List; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuAttributeValue; + +/** + * sku属性关联表资源库 + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +public interface SkuAttributeValueRepository extends BaseRepository { + /** + * 根据SKU ID获取关联的属性 + * + * @author lixiaoyang + * @date 2021/12/30 11:20 + */ + List queryAllBySkuId(Long skuId); + + /** + * 根据SKU ID批量删除 + * + * @author lixiaoyang + * @date 2021/12/30 15:22 + */ + Integer deleteBySkuId(Long skuId); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAuditSettingRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAuditSettingRepository.java new file mode 100644 index 0000000..15f943d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuAuditSettingRepository.java @@ -0,0 +1,25 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuAuditSetting; + +/** + * 商品SKU审核资源库 + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +public interface SkuAuditSettingRepository extends BaseRepository { + + /** + * 查询默认的流程配置 + * @return + */ + SkuAuditSetting selectDefault(); + + /** + * 更新默认的流程配置 + * @param skuAuditSetting + * @return + */ + int updateDefault(SkuAuditSetting skuAuditSetting); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuDraftRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuDraftRepository.java new file mode 100644 index 0000000..5adbe45 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuDraftRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuDraft; + +/** + * 商品规格草稿表资源库 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +public interface SkuDraftRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupRepository.java new file mode 100644 index 0000000..d40801d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupRepository.java @@ -0,0 +1,40 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GroupPageReqDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.domain.vo.GroupPageResVO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuGroup; + +import java.util.List; + +/** + * Sku组合表资源库 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupRepository extends BaseRepository { + + /** + * 通过名字获取商品套餐 + * @param name + * @param tenantId + * @return + */ + List getSkuGroupByName(String name, Long tenantId); + + /** + * 分页查询商品组合 + * @param groupPageReqDTO + * @param tenantId + * @return + */ + Page pageGroup(GroupPageReqDTO groupPageReqDTO,Long tenantId); + + /** + * 删除商品组合 + * @param idsReqDTO + */ + void delGroup(IdsReqDTO idsReqDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupSkuRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupSkuRepository.java new file mode 100644 index 0000000..a6c18f1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupSkuRepository.java @@ -0,0 +1,40 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.goods.api.dto.GoodsGroupSkuReqDTO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuGroupSku; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Sku组合和sku关联表资源库 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupSkuRepository extends BaseRepository { + + /** + * 创建商品sku关系表 + * @param goodsGroupSkuReqDTOS + * @param groupId + * @param tenantId + */ + void createGroupSku(List goodsGroupSkuReqDTOS,Long spuId, Long groupId, Long tenantId); + + /** + * 查询套餐商品 + * @param groupId + * @return + */ + List queryList(Long groupId); + + /** + * 统计套餐数量 + * @param groupId + * @return + */ + BigDecimal totalSkuNum(Long groupId); + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupStoreRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupStoreRepository.java new file mode 100644 index 0000000..c9d40ad --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuGroupStoreRepository.java @@ -0,0 +1,30 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuGroupStore; + +import java.util.List; + +/** + * Sku组合和店铺表资源库 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupStoreRepository extends BaseRepository { + /** + * 更新组合商品门店 + * @param storeIdList + * @param groupId + * @param tenantId + */ + void updateSkuGroupStore(List storeIdList,Long groupId,Long tenantId); + + /** + * 查询店铺id列表 + * @param groupId + * @return + */ + List querySkuGroupStoreList(Long groupId); + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuPackageRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuPackageRepository.java new file mode 100644 index 0000000..086d07f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuPackageRepository.java @@ -0,0 +1,18 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.goods.domain.vo.RpcGoodsResVO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SkuPackage; + +import java.util.List; + +/** + * 资源库 + * + * @author zhanglongbing@ebc.com 2022-03-03 10:45:30 + */ +public interface SkuPackageRepository extends BaseRepository { + + + List querySkuPackageByMainId(Long packageId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuRepository.java new file mode 100644 index 0000000..d6364d1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SkuRepository.java @@ -0,0 +1,100 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsSkuPageDTO; +import org.skyer.goods.domain.vo.RpcGoodsResVO; +import org.skyer.goods.domain.vo.RpcOrderResVO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.Sku; +import org.skyer.mybatis.pagehelper.domain.PageRequest; + +import java.util.List; + +/** + * 商品规格表资源库 + * + * @author zhanglongbing@ebc.com 2021-12-27 14:48:20 + */ +public interface SkuRepository extends BaseRepository { + + /** + * 分页查询 + * @param goodsSku + * @return + */ + Page pageSku(GoodsSkuPageDTO goodsSku); + + /** + * 校验该属性值是否生成过sku + * @param spuId + * @param md5Long + * @return + */ + Sku checkHaveSameSku(Long spuId,String md5Long); + + /** + * 校验skuCode是否生成过sku + * @param skuCode + * @return + */ + Sku checkHaveSameSkuCode(String skuCode); + + /** + * 校验skuCode是否生成过sku + * @param skuCode + * @return + */ + Sku checkHaveSameSkuCodeWithOutSkuId(String skuCode,Long skuId); + + /** + * 通过spuId查询sku + * @param tenantId + * @param spuId + * @return + */ + List getSkuListBySpuId(Long tenantId, Long spuId); + + /** + * 根据skuCodeList获取sku列表 + * @param skuCodeList + * @return + */ + List getSkuListBySkuCode(List skuCodeList); + + /** + * skulist + * @param skuIdList + * @return + */ + List getSkuListBySkuId(List skuIdList); + + /** + * + * @param attributeValue + * @param spuId + * @param skuId + * @return + */ + Boolean getAttributeValueAndSpu(String attributeValue,Long spuId,Long skuId); + + /** + * 根据code获取sku + * @param code + * @return + */ + Sku getSkuByCode(String code); + + /** + * 查询skuCode(rpc调用 ) + * @param skuCodeList + * @return + */ + List queryRPCGoodsList(List skuCodeList); + + /** + * 查询skuCode(rpc调用 ) + * @param skuCodeList + * @return + */ + List queryOrderRpcList(List skuCodeList); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttrValueRelationRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttrValueRelationRepository.java new file mode 100644 index 0000000..ff51665 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttrValueRelationRepository.java @@ -0,0 +1,35 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.goods.domain.entity.SpuAttrValueRelation; +import org.skyer.mybatis.base.BaseRepository; + +import java.util.List; + +/** + * 商品和属性值关联关系资源库 + * + * @author wushaochuan 2021-07-19 09:18:33 + */ +public interface SpuAttrValueRelationRepository extends BaseRepository { + + + /** + * 保存该商品选择的对应属性值 + * @param spuAttrValueRelationList + */ + void createOrUpdateGoodsAttrRelation(Long goodsId,List spuAttrValueRelationList); + + /** + * 查询商品id对应商品关联列表 + * @param goodsId + * @return + */ + List queryGoodsAttribute(Long goodsId); + + /** + * 删除spu值的关联关系 + * @param spuId + * @param valueId + */ + void deleteSpuAttrValueRelation(Long spuId,Long valueId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeRepository.java new file mode 100644 index 0000000..37cb782 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeRepository.java @@ -0,0 +1,30 @@ +package org.skyer.goods.domain.repository; + +import java.util.List; + +import org.skyer.goods.api.dto.AttrListRequestDTO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuAttribute; + +/** + * 属性表资源库 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +public interface SpuAttributeRepository extends BaseRepository { + + + /** + * 保存属性 + * @param attrs + * @param spuId + */ + void saveAttr(List attrs, Long spuId); + + /** + * 批量删除属性和属性值 + * @param ids + */ + void deleteAttribute(List ids); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeValueRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeValueRepository.java new file mode 100644 index 0000000..369bad2 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuAttributeValueRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuAttributeValue; + +/** + * 属性值表资源库 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +public interface SpuAttributeValueRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceRepository.java new file mode 100644 index 0000000..4ad1db9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuInstallService; + +/** + * 商品安装服务资源库 + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceSkuRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceSkuRepository.java new file mode 100644 index 0000000..eab29e1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceSkuRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuInstallServiceSku; + +/** + * 商品安装服务sku表资源库 + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceSkuRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceStoreRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceStoreRepository.java new file mode 100644 index 0000000..d2fd67d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuInstallServiceStoreRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuInstallServiceStore; + +/** + * 商品安装服务售卖门店资源库 + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceStoreRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuRepository.java new file mode 100644 index 0000000..7b78ed4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuRepository.java @@ -0,0 +1,46 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.mybatis.base.BaseRepository; + +import java.util.List; + +/** + * 商品数据库层 + * @description + * @Author wusc + * @create 2021/6/28 10:34 上午 + */ + +public interface SpuRepository extends BaseRepository { + + /** + * 通过名称查找商品 + * @param name + * @return + */ + Spu queryGoodsByName(String name, Long id, Long tenantId); + + /** + * 分页查询商品 + * @param goodsPageReqDTO + * @return + */ + Page pageGoods(GoodsPageReqDTO goodsPageReqDTO); + + /** + * 查询商品spuList + * @param spuCodeList + * @return + */ + List queryGoodsList(List spuCodeList); + /** + * 通过名称查找商品 + * @param name + * @return + */ + Spu queryGoodsByNameNew(String name, Long id); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumRepository.java new file mode 100644 index 0000000..219234e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuSonMum; + +/** + * 子母商品资源库 + * + * @author chenzz 2021-08-16 15:04:38 + */ +public interface SpuSonMumRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumSkuRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumSkuRepository.java new file mode 100644 index 0000000..147f9b4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumSkuRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuSonMumSku; + +/** + * 子母商品sku表资源库 + * + * @author chenzz 2021-08-17 15:49:14 + */ +public interface SpuSonMumSkuRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumStoreRepository.java b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumStoreRepository.java new file mode 100644 index 0000000..060aaca --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/repository/SpuSonMumStoreRepository.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.repository; + +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.goods.domain.entity.SpuSonMumStore; + +/** + * 子母商品售卖门店资源库 + * + * @author chenzz 2021-08-16 15:04:38 + */ +public interface SpuSonMumStoreRepository extends BaseRepository { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/BrandService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/BrandService.java new file mode 100644 index 0000000..794b65b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/BrandService.java @@ -0,0 +1,49 @@ +package org.skyer.goods.domain.service; + + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.BrandPageReqDTO; +import org.skyer.goods.api.dto.BrandReqDTO; +import org.skyer.goods.domain.vo.AttributePageResVO; +import org.skyer.goods.domain.vo.BrandPageResVO; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author wusc + */ +public interface BrandService { + + /** + * 品牌分页查询 + * @param brandPageReqDTO + * @return + */ + Page pageBrand(BrandPageReqDTO brandPageReqDTO); + + /** + * 查询列表 + * @param brandPageReqDTO + * @return + */ + List listBrand(BrandPageReqDTO brandPageReqDTO); + /** + * 保存或者更新品牌 + * @param brandReqDTO + */ + void saveOrUpdateBrand(BrandReqDTO brandReqDTO); + + /** + * 删除属性 + * @param ids + */ + void deleteBrand(List ids); + + /** + * 更新品牌状态 + * @param ids + * @param status + */ + void updateBrandStatus(List ids,Integer status); +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/CategoryManageService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/CategoryManageService.java new file mode 100644 index 0000000..d377dd1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/CategoryManageService.java @@ -0,0 +1,41 @@ +package org.skyer.goods.domain.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.api.dto.CategorySaveDTO; +import org.skyer.goods.api.dto.CategoryTreeQueryDTO; +import org.skyer.goods.api.dto.CategoryUpdateByStatusFlagDTO; +import org.skyer.goods.domain.vo.CategoryTreeVO; +import org.skyer.goods.domain.vo.CategoryVO; + +import java.util.List; + +public interface CategoryManageService { + /** + * 更新或添加分类,包括 属性和属性值 + * @param category 分类信息 + */ + void save(CategorySaveDTO category); + /** + * 修改商品分类状态 + */ + void updateByStatusFlag(CategoryUpdateByStatusFlagDTO categoryUpdateByStatusFlagDTO); + /** + * 批量删除分类 + * @param ids 删除的分类id集合 + */ + void batchDelete(List ids); + + /** + * 获取分类树 + * @return 树型分类 + */ + List getCategoryTree(CategoryTreeQueryDTO category); + + /** + * 查询单级分类,包含属性 + * @param categoryQueryDTO 默认父id为0 + * @return 分页数据 + */ + Page pageIncludedAttr(CategoryQueryDTO categoryQueryDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsAttributeService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsAttributeService.java new file mode 100644 index 0000000..9085734 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsAttributeService.java @@ -0,0 +1,8 @@ +package org.skyer.goods.domain.service; + + +import org.skyer.core.domain.Page; +import org.skyer.mybatis.pagehelper.domain.PageRequest; + +public interface GoodsAttributeService { +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsShopService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsShopService.java new file mode 100644 index 0000000..3a054ec --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/GoodsShopService.java @@ -0,0 +1,13 @@ +package org.skyer.goods.domain.service; + +import org.skyer.goods.domain.entity.GoodsShop; +import org.skyer.mybatis.base.BaseRepository; + +/** + * 商品在店铺中的上下架关系表服务接口 + * + * @author chenzz + * @date 2021-06-25 13:36:41 + */ +public interface GoodsShopService extends BaseRepository { +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/MaterialService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/MaterialService.java new file mode 100644 index 0000000..4009957 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/MaterialService.java @@ -0,0 +1,65 @@ +package org.skyer.goods.domain.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.MaterialDTO; +import org.skyer.goods.api.dto.MaterialListDTO; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.vo.MaterialVO; +import org.skyer.mybatis.base.BaseRepository; +import org.skyer.mybatis.pagehelper.domain.PageRequest; + +import java.util.List; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +public interface MaterialService extends BaseRepository { + + /** + * 分页数据 + * + * @param pageRequest + * @param materialListDTO + * @return + */ + Page pageList(PageRequest pageRequest, MaterialListDTO materialListDTO); + + /** + * 添加 + * + * @param materialDTO + * @return + */ + Boolean add(MaterialDTO materialDTO); + + /** + * 修改 + * + * @param materialDTO + * @return + */ + Boolean edit(MaterialDTO materialDTO); + + /** + * 删除 + * + * @param id + * @return + */ + Boolean deleteById(Long id); + + /** + * 详情 + * + * @param id + * @return + */ + MaterialVO getDetail(Long id); + + Boolean deleteByIds(List ids); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupService.java new file mode 100644 index 0000000..06b40f2 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupService.java @@ -0,0 +1,43 @@ +package org.skyer.goods.domain.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsGroupReqDTO; +import org.skyer.goods.api.dto.GroupPageReqDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.domain.vo.GroupPageResVO; +import org.skyer.goods.domain.vo.SkuGroupResVO; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * Sku组合表应用服务 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupService { + + /** + * 创建或者更新商品组 + * @param goodsGroupReqDTO + */ + void createOrUpdateSkuGroup(@RequestBody GoodsGroupReqDTO goodsGroupReqDTO); + + /** + * sku组合详情 + * @param groupId + * @return + */ + SkuGroupResVO skuGroupDetail(Long groupId); + + /** + * 商品组分页 + * @param groupPageReqDTO + * @return + */ + Page pageGroup(GroupPageReqDTO groupPageReqDTO); + + /** + * 删除商品组合 + * @param idsReqDTO + */ + void delGroup(IdsReqDTO idsReqDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupSkuService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupSkuService.java new file mode 100644 index 0000000..4fe07d2 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupSkuService.java @@ -0,0 +1,11 @@ +package org.skyer.goods.domain.service; + +/** + * Sku组合和sku关联表应用服务 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ + +public interface SkuGroupSkuService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupStoreService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupStoreService.java new file mode 100644 index 0000000..191cbd4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SkuGroupStoreService.java @@ -0,0 +1,10 @@ +package org.skyer.goods.domain.service; + +/** + * Sku组合和店铺表应用服务 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupStoreService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/SpuService.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SpuService.java new file mode 100644 index 0000000..292e1a6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/SpuService.java @@ -0,0 +1,76 @@ +package org.skyer.goods.domain.service; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.api.dto.GoodsReqDTO; +import org.skyer.goods.api.dto.GoodsRequestDTO; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.vo.GoodsDetailResVO; +import org.skyer.goods.domain.vo.GoodsDetailsVO; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.mybatis.base.BaseRepository; + +import java.util.List; + +/** + * 商品表服务接口 + * + * @author chenzz + * @date 2021-06-25 13:36:41 + */ +public interface SpuService extends BaseRepository { + /** + * 商品列表分页 + * @param goodsPageReqDTO + * @return + */ + Page pageGoods(GoodsPageReqDTO goodsPageReqDTO); + + /** + * 查询spu的商品List + * @param spuList + * @return + */ + List queryGoodsBySpuList(List spuList); + + /** + * 保存或者更新商品 + * @param goodsReqDTO + */ + void saveOrUpdateGoods(GoodsReqDTO goodsReqDTO); + + /** + * 删除商品 + * @param ids + */ + void deleteByIds(List ids); + + /** + * 查询商品详情 + * @param id + * @return + */ + GoodsDetailResVO queryDetail(Long id); + + /** + * 修改状态 + * @param ids + * @param status + */ + void updateGoodsStatus(List ids,Integer status); + + + /** + * 保存或者更新商品 + * @param goodsRequestDTO + */ + void insertOrUpdateGoods(GoodsRequestDTO goodsRequestDTO); + + + /** + * 通过商品ID查详情 + * @param id + * @return + */ + GoodsDetailsVO getDetailsById(Long id); +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/BrandServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/BrandServiceImpl.java new file mode 100644 index 0000000..4b9179c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/BrandServiceImpl.java @@ -0,0 +1,134 @@ +package org.skyer.goods.domain.service.impl; + +import org.apache.commons.collections4.CollectionUtils; +import org.skyer.boot.platform.code.builder.CodeRuleBuilder; +import org.skyer.boot.platform.code.constant.CodeConstants; +import org.skyer.core.cache.ProcessCacheValue; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.api.dto.BrandPageReqDTO; +import org.skyer.goods.api.dto.BrandReqDTO; +import org.skyer.goods.domain.entity.Brand; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.repository.BrandRepository; +import org.skyer.goods.domain.repository.SpuRepository; +import org.skyer.goods.domain.service.BrandService; +import org.skyer.goods.domain.vo.BrandPageResVO; +import org.skyer.goods.infra.convertor.BrandConvertor; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.skyer.core.domain.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** +*

+* 商品品牌表服务实现类 +*

+* @author wusc +* @since 2021-06-24 +*/ +@Service +public class BrandServiceImpl implements BrandService { + private static final Logger logger = LoggerFactory.getLogger(BrandServiceImpl.class); + + @Autowired + private BrandRepository brandRepository; + @Autowired + private BrandConvertor brandConvertor; + @Autowired + private SpuRepository spuRepository; + @Autowired + private CodeRuleBuilder codeRuleBuilder; + + @Override + @ProcessCacheValue + public Page pageBrand(BrandPageReqDTO brandPageReqDTO) { + // 请求头中获取当前用户信息 + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + brandPageReqDTO.setTenantId(userDetails.getTenantId()); + return brandRepository.pageBrand(brandPageReqDTO); + } + + @Override + public List listBrand(BrandPageReqDTO brandPageReqDTO) { + // 请求头中获取当前用户信息 + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + brandPageReqDTO.setTenantId(userDetails.getTenantId()); + return brandRepository.listBrand(brandPageReqDTO); + } + + @Override + public void saveOrUpdateBrand(BrandReqDTO brandReqDTO) { + //不能创建名称相同的品牌 + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Brand oldNameBrand = brandRepository.getBrandByName(brandReqDTO.getBrandName(), brandReqDTO.getId(),userDetails.getTenantId()); + if (!Objects.isNull(oldNameBrand)){ + throw new CommonException("不能创建名称相同的品牌"); + } + Brand oldCodeBrand = brandRepository.getBrandByCode(brandReqDTO.getCode(), brandReqDTO.getId()); + if (!Objects.isNull(oldCodeBrand)){ + throw new CommonException("不能创建编码相同的品牌"); + } + Brand brand = brandConvertor.reqDtoToBrand(brandReqDTO); + brand.setTenantId(userDetails.getTenantId()); + if (Objects.isNull(brandReqDTO.getId())){ + brand.setCode(Objects.isNull(brand.getCode()) ? codeRuleBuilder.generateCode(CodeConstants.Level.TENANT, 0L, ObjectConstant.CodeRule.BRAND_CODE, CodeConstants.CodeRuleLevelCode.CUSTOM, ObjectConstant.LevelValue.BRAND_LEVEL, null): brand.getCode()); + brandRepository.insert(brand); + }else { + brandRepository.updateByPrimaryKeySelective(brand); + } + } + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public void deleteBrand(List ids) { + List brands = ids.stream().map(x -> { + Brand oldBrand = brandRepository.selectByPrimaryKey(x); + if (Boolean.TRUE.equals(this.checkHaveGoods(x))){ + throw new CommonException("品牌"+oldBrand.getName()+"存在关联商品不能删除"); + } + Brand brand = new Brand(); + brand.setId(x); + brand.setDeleteFlag(true); + brand.setObjectVersionNumber(oldBrand.getObjectVersionNumber()); + return brand; + }).collect(Collectors.toList()); + brandRepository.batchDeleteByPrimaryKey(brands); + } + + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public void updateBrandStatus(List ids, Integer status) { + List brands = ids.stream().map(x -> { + Brand brand = new Brand(); + brand.setId(x); + brand.setStatus(status); + return brand; + }).collect(Collectors.toList()); + brandRepository.batchUpdateByPrimaryKeySelective(brands); + } + + /** + * 根据品牌id 检查是否有关联商品 + * @param brandId 品牌id + * @return Boolean + */ + private Boolean checkHaveGoods(Long brandId){ + List spuList = spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom().andEqualTo(Spu.BRAND_ID, brandId).andEqualTo(Spu.DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + return CollectionUtils.isNotEmpty(spuList); + } +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/CategoryManageServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/CategoryManageServiceImpl.java new file mode 100644 index 0000000..4ec9383 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/CategoryManageServiceImpl.java @@ -0,0 +1,359 @@ +package org.skyer.goods.domain.service.impl; + +import org.skyer.core.domain.Page; +import org.skyer.core.exception.CommonException; +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.api.dto.CategorySaveDTO; +import org.skyer.goods.api.dto.CategoryTreeQueryDTO; +import org.skyer.goods.api.dto.CategoryUpdateByStatusFlagDTO; +import org.skyer.goods.domain.entity.Category; +import org.skyer.goods.domain.entity.CategoryAttribute; +import org.skyer.goods.domain.entity.CategoryAttributeValue; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.repository.CategoryAttributeRepository; +import org.skyer.goods.domain.repository.CategoryAttributeValueRepository; +import org.skyer.goods.domain.repository.CategoryRepository; +import org.skyer.goods.domain.repository.SpuRepository; +import org.skyer.goods.domain.service.CategoryManageService; +import org.skyer.goods.domain.vo.CategoryTreeVO; +import org.skyer.goods.domain.vo.CategoryVO; +import org.skyer.goods.infra.convertor.CategoryConvertor; +import org.skyer.goods.infra.util.ListUtils; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Service +public class CategoryManageServiceImpl implements CategoryManageService { + + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private CategoryAttributeRepository categoryAttributeRepository; + @Autowired + private CategoryAttributeValueRepository categoryAttributeValueRepository; + @Autowired + private SpuRepository spuRepository; + + @Autowired + private CategoryConvertor categoryConvertor; + + /** + * 根据分类id 删除属性及属性值 + * @param categoryId 分类id + */ + public void deleteAttributeAndValue(Long categoryId){ + //删除属性值 必须先删除属性值 + categoryAttributeValueRepository.deleteByCategoryId(categoryId); + + //删除属性 + CategoryAttribute categoryAttribute = new CategoryAttribute(); + categoryAttribute.setCategoryId(categoryId); + List categoryAttributeList = + categoryAttributeRepository.select(CategoryAttribute.FIELD_CATEGORY_ID, categoryId); + categoryAttributeRepository.batchDelete(categoryAttributeList); + + } + + /** + * 更新或添加分类,包括 属性和属性值 + * @param categorySaveDTO 分类信息 + */ + @Transactional + public void save(CategorySaveDTO categorySaveDTO){ + //DTO转换为实体对象 + Category category = categoryConvertor.CategorySaveDTOTOCategory(categorySaveDTO); + + // 校验所选父级分类,并重置分类级别 + Long pid = category.getParentId(); + if (pid != null && pid != 0L){ + if (pid.equals(categorySaveDTO.getId())){ + // 父类不能为自己 + throw new CommonException("父级不能是自己"); + } + Category pCategory = categoryRepository.selectByPrimaryKey(pid); + if (ObjectUtils.isEmpty(pCategory)){ + // 所选父类不存在,或已被删除 + throw new CommonException("所选父级不存在或已被删除"); + } + if (pCategory.getSubFlag()) { + // 所选父类已经是叶子分类 + throw new CommonException("所选父级是叶子分类,叶子分类不允许有下级"); + } + if (!pCategory.getStatusFlag()){ + // 所选父类已被禁用 + throw new CommonException("所选父级已被禁用"); + } + + category.setLevel(pCategory.getLevel() + 1); + }else{ + category.setLevel(1); + } + + //重置一级类目父id为0 + if (pid == null){ + category.setParentId(0L); + } + /* 校验当前分类数据 */ + //校验属性名称或属性编码是否有重复 + List attributeList = category.getAttributeList(); + if (!ObjectUtils.isEmpty(attributeList)){ + //过滤出重复的属性名称 + List repeatNameList = ListUtils.getRepeatList( + attributeList, CategoryAttribute::getName); + if (!ObjectUtils.isEmpty(repeatNameList)){ + throw new CommonException( + MessageFormat.format("存在重复的属性名称({0})", + String.join(",", repeatNameList))); + } + //过滤出重复的属性编码 + List repeatCodeList = ListUtils.getRepeatList(attributeList, CategoryAttribute::getCode); + if (!ObjectUtils.isEmpty(repeatCodeList)){ + throw new CommonException( + MessageFormat.format("存在重复的属性编码({0})", + String.join(",", repeatCodeList))); + } + } + + //校验属性值 + List repeatInfo = attributeList.stream().map(x -> { + List attributeValueList = x.getAttributeValueList(); + //校验非文本框类型,是否有属性值 + if (x.getFormType() != 3 && ObjectUtils.isEmpty(attributeValueList)) { + return x.getName() + ":非文本框至少需要输入一个属性值"; + } + //校验文本框类型,是否没有属性值 + if (x.getFormType() == 3 && !ObjectUtils.isEmpty(attributeValueList)){ + return x.getName() + ":文本框不应该有属性值"; + } + + //校验是否重复 + if (!ObjectUtils.isEmpty(attributeValueList)) { + //过滤出重复的值 + List repeatValueList = ListUtils.getRepeatList( + attributeValueList, CategoryAttributeValue::getValue); + if (!ObjectUtils.isEmpty(repeatValueList)) { + //重复属性值,带有属性名称 + return x.getName() + ":属性值重复(" + String.join(",", repeatValueList) + ")"; + } + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList()); + if (!ObjectUtils.isEmpty(repeatInfo)){ + throw new CommonException( + MessageFormat.format("分类属性值有误。({0})", + String.join(",", repeatInfo))); + } + + //校验名称 + int nameCount = categoryRepository.selectCountByCondition(Condition.builder(Category.class) + .andWhere(Sqls.custom() + .andEqualTo(Category.FIELD_PARENT_ID, category.getParentId()) + .andEqualTo(Category.FIELD_NAME, category.getName()) + .andNotEqualTo(Category.FIELD_ID, category.getId(), true)) + .build()); + if (nameCount > 0){ + throw new CommonException( + MessageFormat.format("所选父级分类下已有该分类名称({0})",category.getName())); + } + //校验编码 + if (!ObjectUtils.isEmpty(category.getCode())) { + int codeCount = categoryRepository.selectCountByCondition(Condition.builder(Category.class) + .andWhere(Sqls.custom() + .andEqualTo(Category.FIELD_CODE, category.getCode()) + .andNotEqualTo(Category.FIELD_ID, category.getId(), true)) + .build()); + if (codeCount > 0) { + throw new CommonException("分类编码已存在"); + } + } + /*修改时的校验*/ + if (!ObjectUtils.isEmpty(category.getId())){ + // 删除 父类信息避免被修改 + category.setParentId(null); + //校验 修改为叶子分类时,是否有下级 + if (category.getSubFlag()){ + int subCount = categoryRepository.selectCountByCondition(Condition.builder(Category.class) + .andWhere(Sqls.custom().andEqualTo(Category.FIELD_PARENT_ID, category.getId())) + .build()); + if (subCount > 0){ + throw new CommonException("已有下级,不允许修改为叶子分类"); + } + } + //校验 修改为普通分类时,是否已有商品 + if (!category.getSubFlag()){ + int spuCount = spuRepository.selectCountByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom().andEqualTo(Spu.CATEGORY_ID, category.getId())) + .build()); + if (spuCount > 0){ + throw new CommonException("已有商品,不允许修改为普通分类"); + } + } + } + + /*处理分类*/ + if (ObjectUtils.isEmpty(category.getId())){ + // id为空直接插入,插入之后带出id + categoryRepository.insertSelective(category); + }else{ + categoryRepository.updateByPrimaryKeySelective(category); + //删除原有属性及属性值 + this.deleteAttributeAndValue(category.getId()); + } + + /*处理分类属性*/ + //赋予分类id + attributeList.forEach(x->x.setCategoryId(category.getId())); + //批量插入属性值 + List attributeListNew = categoryAttributeRepository.batchInsertSelective(attributeList); + + /*处理属性值*/ + //收集属性值集合,并赋予属性值 属性id + List valueList = attributeListNew.stream().flatMap( + x -> { + List attributeValueList = x.getAttributeValueList(); + if (!ObjectUtils.isEmpty(attributeValueList)) { + //赋予属性id + return attributeValueList.stream().peek(y -> y.setAttributeId(x.getId())); + } + return null; + } + ).filter(Objects::nonNull).collect(Collectors.toList()); + + if (!ObjectUtils.isEmpty(valueList)){ + // 批量插入分类属性值 + categoryAttributeValueRepository.batchInsertSelective(valueList); + } + } + + /** + * 修改商品分类状态 + */ + public void updateByStatusFlag(CategoryUpdateByStatusFlagDTO categoryUpdateByStatusFlagDTO){ + Category category = new Category(); + BeanUtils.copyProperties(categoryUpdateByStatusFlagDTO, category); + categoryRepository.updateByPrimaryKeySelective(category); + } + /** + * 查询分类是否有下级,包括分类及商品 + * @param category 分类对象 + * @return true有下级 + */ + public boolean hasCategorySub(Category category){ + if (category.getSubFlag()){ + //叶子节点,获取是否有商品 + List spuList = spuRepository.select(Spu.CATEGORY_ID, category.getId()); + return !ObjectUtils.isEmpty(spuList); + }else { + //查询是否存在下级 + List categoryList = categoryRepository.select(Category.FIELD_PARENT_ID, category.getId()); + return !ObjectUtils.isEmpty(categoryList); + } + } + + /** + * 批量删除分类 + * @param ids 删除的分类id集合 + */ + @Override + @Transactional + public void batchDelete(List ids) { + ids.forEach(id->{ + Category category = categoryRepository.selectByPrimaryKey(id); + if (ObjectUtils.isEmpty(category)) return; + if (hasCategorySub(category)){ + throw new CommonException(MessageFormat.format("分类({0})已有下级分类或商品,不允许删除", category.getName())); + } + categoryRepository.deleteByPrimaryKey(category); + //删除属性及属性值 + this.deleteAttributeAndValue(category.getId()); + }); + } + + /** + * 判断分类树子孙是否有叶子分类。且只保留叶子分类或含有叶子分类的孩子 + * @param categoryTreeVO 分类树 + * @return 子孙是否有叶子分类 + */ + private boolean filterNotSubNode(CategoryTreeVO categoryTreeVO){ + if (categoryTreeVO.getSubFlag()){ + return true; + } + List children = categoryTreeVO.getChildren(); + if (!ObjectUtils.isEmpty(children)){ + List categoryTreeVOList = children.stream().filter(this::filterNotSubNode).collect(Collectors.toList()); + categoryTreeVO.setChildren(categoryTreeVOList); + return !ObjectUtils.isEmpty(categoryTreeVOList); + } + return false; + } + + @Override + public List getCategoryTree(CategoryTreeQueryDTO queryDTO) { + CategoryQueryDTO categoryQueryDTO = categoryConvertor.CategoryTreeQueryDTOToCategoryQueryDTO(queryDTO); + List categoryList = categoryRepository.selectList(categoryQueryDTO); + + //对象映射为树对象 + List categoryTreeVOList = categoryList.stream().map(x->{ + CategoryTreeVO categoryTreeVO = new CategoryTreeVO(); + BeanUtils.copyProperties(x, categoryTreeVO); + return categoryTreeVO; + }).collect(Collectors.toList()); + + //分组 父id + Map> groupMap = categoryTreeVOList.stream() + .collect(Collectors.groupingBy(CategoryTreeVO::getParentId)); + + categoryTreeVOList.forEach(x-> x.setChildren(groupMap.get(x.getId()))); + Stream categoryTreeVOStream = categoryTreeVOList.stream() + .filter(x -> x.getParentId() == 0) //过滤0一级节点 + .peek(x -> x.setParentId(null));//设置一级节点 父节点为null + + if (ObjectUtils.nullSafeEquals(true, queryDTO.getRemoveNotSubFlag()) ){ + //过滤没有叶子节点的普通节点 + categoryTreeVOStream = categoryTreeVOStream.filter(this::filterNotSubNode); + } + + return categoryTreeVOStream.collect(Collectors.toList()); + } + + /** + * 查询单级分类,包含属性 + * @param categoryQueryDTO 分类查询条件对象 + * @return 分页数据 + */ + public Page pageIncludedAttr(CategoryQueryDTO categoryQueryDTO){ + + PageRequest pageRequest = new PageRequest(); + BeanUtils.copyProperties(categoryQueryDTO, pageRequest); + + categoryQueryDTO.setSort(null); //避免前端传递列表排序(pageRequest内的sort),与通用查询条件冲突 + + Page categoryVOPage = categoryRepository.pageIncludedAttr(pageRequest, categoryQueryDTO); + + //处理返回值,父级为0时,设置为null + List categoryList = categoryVOPage.getContent(); + List collect = categoryList.stream().peek(x -> { + + if (x.getParentId() == 0) { + x.setParentId(null); + } + }).collect(Collectors.toList()); + + categoryVOPage.setContent(collect); + + return categoryVOPage; + } +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsAttributeServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsAttributeServiceImpl.java new file mode 100644 index 0000000..ffd81f7 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsAttributeServiceImpl.java @@ -0,0 +1,30 @@ +package org.skyer.goods.domain.service.impl; + +import org.skyer.goods.domain.service.GoodsAttributeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +import javax.annotation.Resource; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.skyer.core.cache.ProcessCacheValue; +import org.skyer.core.domain.Page; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.springframework.stereotype.Service; + +/** +*

+* 商品属性表服务实现类 +*

+* @author wusc +* @since 2021-06-24 +*/ +@Service +public class GoodsAttributeServiceImpl implements GoodsAttributeService { + +private static final Logger logger = LoggerFactory.getLogger(GoodsAttributeServiceImpl.class); +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsShopServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsShopServiceImpl.java new file mode 100644 index 0000000..c351490 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/GoodsShopServiceImpl.java @@ -0,0 +1,18 @@ +package org.skyer.goods.domain.service.impl; + +import org.springframework.stereotype.Service; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.GoodsShop; +import org.skyer.goods.domain.service.GoodsShopService; + +/** + * 商品在店铺中的上下架关系表服务实现类 + * + * @author chenzz + * @date 2021-06-25 13:36:41 + */ +@Service +public class GoodsShopServiceImpl extends BaseRepositoryImpl implements GoodsShopService { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/MaterialServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/MaterialServiceImpl.java new file mode 100644 index 0000000..aa6e03c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/MaterialServiceImpl.java @@ -0,0 +1,202 @@ +package org.skyer.goods.domain.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +import org.skyer.core.cache.ProcessCacheValue; +import org.skyer.core.domain.Page; +import org.skyer.core.domain.PageInfo; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.api.dto.MaterialDTO; +import org.skyer.goods.api.dto.MaterialListDTO; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.repository.MaterialRepository; +import org.skyer.goods.domain.repository.SpuRepository; +import org.skyer.goods.domain.service.MaterialService; +import org.skyer.goods.domain.vo.MaterialVO; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +@Slf4j +@Service +public class MaterialServiceImpl extends BaseRepositoryImpl implements MaterialService { + + @Autowired + private MaterialRepository materialRepository; + @Autowired + private SpuRepository spuRepository; + + @Override + @ProcessCacheValue + public Page pageList(PageRequest pageRequest, MaterialListDTO materialListDTO) { + Page pageList = PageHelper.doPage(pageRequest, () -> + selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andLike(Material.FIELD_MATERIAL_NAME, materialListDTO.getMaterialName(), true) + .andEqualTo(Material.FIELD_CODE, materialListDTO.getCode(), true) + .andEqualTo(Material.FIELD_DELETE_FLAG,false) + ) + .build())); + + List materialList = pageList.getContent(); + + + List materialVOList = new ArrayList<>(); + materialList.forEach(o -> { + MaterialVO materialVO = new MaterialVO(); + BeanUtils.copyProperties(o, materialVO); + + if (ObjectUtil.isNotEmpty(o.getMainImage())) { + String[] mainImages = o.getMainImage().split(","); + materialVO.setMainImage(CollUtil.newArrayList(mainImages)); + } + if (ObjectUtil.isNotEmpty(o.getDetailImage())) { + String[] detailImages = o.getDetailImage().split(","); + materialVO.setDetailImage(CollUtil.newArrayList(detailImages)); + } + + materialVOList.add(materialVO); + }); + + return new Page<>(materialVOList, new PageInfo(pageList.getTotalPages(), pageList.getSize()), pageList.getTotalElements()); + } + + @Override + public Boolean add(MaterialDTO materialDTO) { + + // 素材名称校验 + if (materialRepository.getSizeByName(materialDTO.getMaterialName()) >0) { + throw new CommonException("素材名称已存在"); + } + // 素材编号校验 + if (StringUtils.isNotEmpty(materialDTO.getCode())) { + if (materialRepository.getSizeByCode(materialDTO.getCode()) >0) { + throw new CommonException("素材编码已存在"); + } + } + + Material material = new Material(); + BeanUtils.copyProperties(materialDTO, material); + + // 商品主图 + if (CollUtil.isNotEmpty(materialDTO.getMainImage())) { + material.setMainImage(String.join(",", materialDTO.getMainImage())); + } + + // 商品详情图 + if (CollUtil.isNotEmpty(materialDTO.getDetailImage())) { + material.setDetailImage(String.join(",", materialDTO.getDetailImage())); + } + + material.setDeleteFlag(false); + return materialRepository.insert(material) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean edit(MaterialDTO materialDTO) { + // 素材名称校验 + if (materialRepository.getSizeByName(materialDTO.getMaterialName()) >1) { + throw new CommonException("素材名称已存在"); + } + // 素材编号校验 + if (StringUtils.isNotEmpty(materialDTO.getCode())) { + if (materialRepository.getSizeByCode(materialDTO.getCode()) >1) { + throw new CommonException("素材编码已存在"); + } + } + + Material material = materialRepository.selectByPrimaryKey(materialDTO.getId()); + BeanUtils.copyProperties(materialDTO, material); + if (CollUtil.isNotEmpty(materialDTO.getMainImage())) { + material.setMainImage(String.join(",", materialDTO.getMainImage())); + } + if (CollUtil.isNotEmpty(materialDTO.getDetailImage())) { + material.setDetailImage(String.join(",", materialDTO.getDetailImage())); + } + return materialRepository.updateByPrimaryKey(material) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteById(Long id) { + if (CollUtil.isNotEmpty(getSpuByMaterial(id))){ + throw new CommonException("该素材有相应关联商品无法删除"); + } + Material material = materialRepository.selectByPrimaryKey(id); + material.setDeleteFlag(true); + return materialRepository.updateByPrimaryKey(material) > 0; + } + + @Override + public MaterialVO getDetail(Long id) { + Material material = this.selectByPrimaryKey(id); + MaterialVO materialVO = new MaterialVO(); + BeanUtils.copyProperties(material, materialVO); + if (ObjectUtil.isNotEmpty(material.getMainImage()) ) { + String[] mainImages = material.getMainImage().split(","); + materialVO.setMainImage(CollUtil.newArrayList(mainImages)); + } + if (ObjectUtil.isNotEmpty(material.getDetailImage()) ) { + String[] detailImages = material.getDetailImage().split(","); + materialVO.setDetailImage(CollUtil.newArrayList(detailImages)); + } + return materialVO; + } + + @Override + public Boolean deleteByIds(List ids) { + List materials = super.selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andIn(Material.FIELD_ID, ids, true) + .andEqualTo(Material.FIELD_DELETE_FLAG, false)) + .build()); + + for (Material mm : materials) { + if (CollUtil.isNotEmpty(getSpuByMaterial(mm.getId()))){ + throw new CommonException("该素材有相应关联商品无法删除"); + } + mm.setDeleteFlag(true); + } + return !super.batchUpdateByPrimaryKeySelective(materials).isEmpty(); + } + + /** + * 素材关联商品 + * @param id + * @return + */ + private List getSpuByMaterial(Long id){ + return spuRepository.selectByCondition(Condition.builder(Spu.class) + .andWhere(Sqls.custom() + .andEqualTo(Spu.MATERIAL_ID, id)) + .build()); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupServiceImpl.java new file mode 100644 index 0000000..1f64bfa --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupServiceImpl.java @@ -0,0 +1,162 @@ +package org.skyer.goods.domain.service.impl; + + +import cn.hutool.core.util.ObjectUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.skyer.boot.platform.code.builder.CodeRuleBuilder; +import org.skyer.boot.platform.code.constant.CodeConstants; +import org.skyer.core.domain.Page; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.api.dto.GoodsGroupReqDTO; +import org.skyer.goods.api.dto.GroupPageReqDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.domain.entity.*; +import org.skyer.goods.domain.repository.*; +import org.skyer.goods.domain.service.SkuGroupService; +import org.skyer.goods.domain.service.SpuService; +import org.skyer.goods.domain.vo.*; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.convertor.SkuGroupConvertor; +import org.skyer.goods.infra.feign.OnlineShopRemoteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * Sku组合表应用服务默认实现 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Service +public class SkuGroupServiceImpl implements SkuGroupService { + @Autowired + private SkuGroupConvertor skuGroupConvertor; + @Autowired + private SkuRepository skuRepository; + @Autowired + private SkuGroupRepository skuGroupRepository; + @Autowired + private SkuGroupStoreRepository skuGroupStoreRepository; + @Autowired + private SkuGroupSkuRepository skuGroupSkuRepository; + @Autowired + private SpuService spuService; + @Autowired + private OnlineShopRemoteService onlineShopRemoteService; + @Autowired + private SpuRepository spuRepository; + @Autowired + private CodeRuleBuilder codeRuleBuilder; + @Override + @Transactional(rollbackFor = RuntimeException.class) + public void createOrUpdateSkuGroup(GoodsGroupReqDTO goodsGroupReqDTO) { + // 校验名称是否重复 + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + + SkuGroup skuGroup = skuGroupConvertor.dtoTOSkuGroup(goodsGroupReqDTO); + skuGroup.setTenantId(userDetails.getTenantId()); + skuGroup.setSkuGroupCode(Objects.isNull(skuGroup.getSkuGroupCode()) ? codeRuleBuilder.generateCode(CodeConstants.Level.TENANT, 0L, ObjectConstant.CodeRule.SKU_CODE, CodeConstants.CodeRuleLevelCode.CUSTOM, ObjectConstant.LevelValue.SKU_LEVEL, null) :skuGroup.getSkuGroupCode()); + //判读是更新还是创建 + if (Objects.isNull(goodsGroupReqDTO.getId())){ + skuGroupRepository.insert(skuGroup); + } + if (!Objects.isNull(goodsGroupReqDTO.getId())){ + skuGroupRepository.updateByPrimaryKeySelective(skuGroup); + } + if (!goodsGroupReqDTO.getIsAllStore()){ + skuGroupStoreRepository.updateSkuGroupStore(goodsGroupReqDTO.getStoreIdList(),skuGroup.getId(),userDetails.getTenantId()); + } + if (ObjectUtil.isNotNull(goodsGroupReqDTO.getGoodsGroupSkuReqDTOS())){ + skuGroupSkuRepository.createGroupSku(goodsGroupReqDTO.getGoodsGroupSkuReqDTOS(),skuGroup.getSpuId(),skuGroup.getId(),userDetails.getTenantId()); + } + } + + @Override + public SkuGroupResVO skuGroupDetail(Long groupId) { + SkuGroup skuGroup = skuGroupRepository.selectByPrimaryKey(groupId); + SkuGroupResVO skuGroupResVO = new SkuGroupResVO(); + GoodsDetailResVO goodsDetailResVO = spuService.queryDetail(skuGroup.getSpuId()); + if (goodsDetailResVO != null) { + skuGroupResVO.setId(groupId); + skuGroupResVO.setSpuId(goodsDetailResVO.getId()); + skuGroupResVO.setCategoryName(goodsDetailResVO.getCategoryName()); + skuGroupResVO.setRemark(skuGroup.getRemark()); + skuGroupResVO.setIsAllStore(skuGroup.getIsAllStore()); + skuGroupResVO.setSkuGroupCode(skuGroup.getSkuGroupCode()); + skuGroupResVO.setSpuCode(goodsDetailResVO.getCode()); + skuGroupResVO.setSpuName(goodsDetailResVO.getName()); + } + //查询门店 + List skuGroupStores = skuGroupStoreRepository.querySkuGroupStoreList(groupId); + if (CollectionUtils.isNotEmpty(skuGroupStores)) { + skuGroupResVO.setGroupStoreResVOList(packStore(skuGroupStores)); + } + //查询商品 + List skuGroupSkus = skuGroupSkuRepository.queryList(groupId); + if (CollectionUtils.isNotEmpty(skuGroupSkus)) { + skuGroupResVO.setSkuGroupSkuResVOList(skuGroupSkus.stream().map(skuGroupSku -> { + SkuGroupSkuResVO skuGroupSkuResVO = new SkuGroupSkuResVO(); + Long skuId = skuGroupSku.getSkuId(); + Sku sku = skuRepository.selectByPrimaryKey(skuId); + GoodsDetailResVO skuSpuVO = spuService.queryDetail(sku.getSpuId()); + skuGroupSkuResVO.setSkuId(sku.getId()); + skuGroupSkuResVO.setSkuCode(sku.getSkuCode()); + skuGroupSkuResVO.setNum(skuGroupSku.getNum()); + skuGroupSkuResVO.setSpuCode(skuSpuVO.getCode()); + skuGroupSkuResVO.setSpuName(skuSpuVO.getName()); + skuGroupSkuResVO.setPrice(sku.getSalesPrice()); + skuGroupSkuResVO.setCategoryName(skuSpuVO.getCategoryName()); + return skuGroupSkuResVO; + }).collect(Collectors.toList())); + + } + return skuGroupResVO; + } + + @Override + public Page pageGroup(GroupPageReqDTO groupPageReqDTO) { + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + Page groupPageResVOS = skuGroupRepository.pageGroup(groupPageReqDTO, userDetails.getTenantId()); + List groupPageResVOSContent = groupPageResVOS.getContent(); + if (CollectionUtils.isNotEmpty(groupPageResVOSContent)) { + groupPageResVOSContent.forEach(x->{ + Spu spu = spuService.selectByPrimaryKey(x.getSpuId()); +// x.setCategoryName(categoryOldService.getCategoryNameByListId(spu.getCategoryId())); + //统计数量 + x.setGoodsNum(skuGroupSkuRepository.totalSkuNum(x.getGroupId())); + List skuGroupStores = skuGroupStoreRepository.querySkuGroupStoreList(x.getGroupId()); + //先这样写后续响应速度慢在优化 + x.setStoreList(packStore(skuGroupStores)); + }); + } + groupPageResVOS.setContent(groupPageResVOSContent); + return groupPageResVOS; + } + + @Override + public void delGroup(IdsReqDTO idsReqDTO) { + skuGroupRepository.delGroup(idsReqDTO); + } + + private List packStore(List skuGroupStores) { + List groupStoreResVOS = skuGroupStores.stream().map(skuGroupStore -> { + GroupStoreResVO groupStoreResVO = new GroupStoreResVO(); + ResponseEntity listResponseEntity = onlineShopRemoteService.showDetails(skuGroupStore.getStoreId()); + OnlineShopVO body = listResponseEntity.getBody(); + if (body != null) { + groupStoreResVO.setCode(body.getCode()); + groupStoreResVO.setName(body.getName()); + groupStoreResVO.setChannelTypeMeaning(body.getChannelTypeCode()); + groupStoreResVO.setOnlineStoreTypeMeaning(body.getOnlineStoreTypeCode()); + } + return groupStoreResVO; + }).collect(Collectors.toList()); + return groupStoreResVOS; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupSkuServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupSkuServiceImpl.java new file mode 100644 index 0000000..beb3528 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupSkuServiceImpl.java @@ -0,0 +1,15 @@ +package org.skyer.goods.domain.service.impl; + + +import org.skyer.goods.domain.service.SkuGroupSkuService; +import org.springframework.stereotype.Service; + +/** + * Sku组合和sku关联表应用服务默认实现 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Service +public class SkuGroupSkuServiceImpl implements SkuGroupSkuService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupStoreServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupStoreServiceImpl.java new file mode 100644 index 0000000..5c273a3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SkuGroupStoreServiceImpl.java @@ -0,0 +1,15 @@ +package org.skyer.goods.domain.service.impl; + + +import org.skyer.goods.domain.service.SkuGroupStoreService; +import org.springframework.stereotype.Service; + +/** + * Sku组合和店铺表应用服务默认实现 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Service +public class SkuGroupStoreServiceImpl implements SkuGroupStoreService { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SpuServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SpuServiceImpl.java new file mode 100644 index 0000000..c72d94c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/service/impl/SpuServiceImpl.java @@ -0,0 +1,350 @@ +package org.skyer.goods.domain.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.skyer.core.domain.Page; +import org.skyer.core.exception.CommonException; +import org.skyer.core.oauth.CustomUserDetails; +import org.skyer.core.oauth.DetailsHelper; +import org.skyer.goods.api.dto.*; +import org.skyer.goods.app.service.SpuEsService; +import org.skyer.goods.domain.entity.*; +import org.skyer.goods.domain.repository.*; +import org.skyer.goods.domain.service.SpuService; +import org.skyer.goods.domain.vo.GoodsDetailResVO; +import org.skyer.goods.domain.vo.GoodsDetailsVO; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.convertor.GoodsConvertor; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品表服务实现类 + * + * @author chenzz + * @date 2021-06-25 13:36:41 + */ +@Service +@Slf4j +public class SpuServiceImpl extends BaseRepositoryImpl implements SpuService { + @Autowired + private GoodsConvertor goodsConvertor; + @Autowired + private SpuRepository spuRepository; + @Autowired + private BrandRepository brandRepository; + @Autowired + private MaterialRepository materialRepository; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private SpuAttrValueRelationRepository spuAttrValueRelationRepository; + @Autowired + private SpuAttributeValueRepository spuAttributeValueRepository; + @Autowired + private SpuAttributeRepository spuAttributeRepository; + @Autowired + private SkuRepository skuRepository; + @Autowired + private SpuEsService spuEsService; + + @Override + public Page pageGoods(GoodsPageReqDTO goodsPageReqDTO) { + log.info("Spu查询mysql"); + if (CollUtil.isNotEmpty(goodsPageReqDTO.getCategoryIdList())) { + goodsPageReqDTO.setCategoryIdList(categoryRepository.getLaterCategoryId(goodsPageReqDTO.getCategoryIdList())); + } + + Page goodsPage = spuRepository.pageGoods(goodsPageReqDTO); + List goodsPageResVOList = goodsPage.getContent(); + setBrandCategory(goodsPageResVOList); + return goodsPage; + } + + private void setBrandCategory(List goodsPageResVOList) { + Map categoryMap = Maps.newHashMap(); + goodsPageResVOList.forEach(x->{ + String categoryName = categoryMap.get(x.getCategoryId()); + if (StringUtils.isBlank(categoryName)){ + categoryName = categoryRepository.getCategoryNameById(x.getCategoryId()); + categoryMap.put(x.getCategoryId(),categoryName); + } + x.setCategoryName(categoryName); + Material material = materialRepository.selectByPrimaryKey(x.getMaterialId()); + if (material !=null) { + x.setMainImage(Arrays.asList(Optional.ofNullable(material.getMainImage()).orElse("").split(","))); + x.setMaterialName(material.getMaterialName()); + } + Brand brand = brandRepository.selectByPrimaryKey(x.getBrandId()); + if (brand != null){ + x.setBrandName(brand.getName()); + } + }); + } + + @Override + public List queryGoodsBySpuList(List spuList) { + List goodsPageResVOS = spuRepository.queryGoodsList(spuList); + setBrandCategory(goodsPageResVOS); + return goodsPageResVOS; + } + + + private String getCategoryName(Long categoryId){ +// List categoryByLastId = categoryOldService.getCategoryByLastId(categoryId); +// if (CollectionUtil.isNotEmpty(categoryByLastId)){ +// return categoryByLastId.stream().sorted(Comparator.comparing(LevelCategoryDTO::getLevel).reversed()).map(LevelCategoryDTO::getName).collect(Collectors.joining("/")); +// } + return ""; + } + + + + + @Override + public void saveOrUpdateGoods(GoodsReqDTO goodsReqDTO) { + //设置租户id + CustomUserDetails userDetails = DetailsHelper.getUserDetails(); + //查询名称是否重复 + Spu oldSpu = spuRepository.queryGoodsByName(goodsReqDTO.getName(),goodsReqDTO.getId(), userDetails.getTenantId()); + if (!Objects.isNull(oldSpu)) { + throw new CommonException("存在相同名称的商品"); + } + Spu spu = goodsConvertor.reqToGoods(goodsReqDTO); +// spu.setTenantId(userDetails.getTenantId()); + if (Objects.isNull(goodsReqDTO.getId())){ +// spu.setSpuCode(Objects.isNull(spu.getSpuCode()) ? codeRuleBuilder.generateCode(CodeConstants.Level.TENANT, 0L, ObjectConstant.CodeRule.GOODS_CODE, CodeConstants.CodeRuleLevelCode.CUSTOM, ObjectConstant.LevelValue.GOODS_LEVEL, null): spu.getSpuCode()); + spuRepository.insert(spu); + }else { + spuRepository.updateByPrimaryKeySelective(spu); + } + + } + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public void deleteByIds(List ids) { + //删除前需要判断商品是否禁用 + List spuList = ids.stream().map(x->{ + Spu oldSpu = spuRepository.selectByPrimaryKey(x); + if (!Objects.isNull(oldSpu) && ObjectConstant.Status.OPEN.equals(oldSpu.getStatus())) { + throw new CommonException("商品"+ oldSpu.getName()+"需要禁用才能删除"); + } + Sku sku = new Sku(); + sku.setSpuId(x); + if(skuRepository.selectCount(sku)>0){ + throw new CommonException("商品"+ oldSpu.getName()+"已生成sku无法删除"); + } + Spu spu = new Spu(); + spu.setId(x); + spu.setDeleteFlag(true); + return spu; + }).collect(Collectors.toList()); + //删除 + spuRepository.batchUpdateByPrimaryKeySelective(spuList); + SpuListDTO spuListDTO = new SpuListDTO(); + spuListDTO.setSpuList(getSpuList(ids)); + spuListDTO.setDeleteFlag(true); + //同步es + spuEsService.syncSpuEsSage(spuListDTO); + +// spuRepository.batchUpdateByPrimaryKeySelective(spuList); +// TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { +// @Override +// public void afterCommit() { +// List spuList = getSpuList(ids); +// spuList.forEach(x->{ +// spuEsService.createOrUpdateSpuEs(x); +// }); +// } +// }); + } + + @Override + public GoodsDetailResVO queryDetail(Long id) { + Spu spu = spuRepository.selectByPrimaryKey(id); + GoodsDetailResVO goodsDetailResVO = goodsConvertor.goodsToRes(spu); + // 查询分类 需要用/来拼接多级分类 + String categoryName = getCategoryName(spu.getCategoryId()); + goodsDetailResVO.setCategoryName(categoryName); + //查询品牌名称 + Long brandId = spu.getBrandId(); + Brand brand = brandRepository.selectByPrimaryKey(brandId); + if (brand !=null) { + goodsDetailResVO.setBrandName(brand.getName()); + } + //拼接素材信息 + Material material = materialRepository.selectByPrimaryKey(spu.getMaterialId()); + if (material !=null){ + goodsDetailResVO.setMaterialName(material.getMaterialName()); + } + goodsDetailResVO.setMainImage(Arrays.asList(Optional.ofNullable(material.getMainImage()).orElse("").split(","))); + String detailImage = material.getDetailImage(); + if (StringUtils.isNotBlank(detailImage)){ + goodsDetailResVO.setImageList(Arrays.asList(detailImage.split(","))); + } + goodsDetailResVO.setDetailHtml(goodsDetailResVO.getDetailHtml()); + return goodsDetailResVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateGoodsStatus(List ids, Integer status) { + List spuList = Lists.newArrayList(); + for (Long id : ids) { + Spu spu = new Spu(); + spu.setId(id); + spu.setStatus(status); + spuList.add(spu); + + } + //批量更新数据库状态 + spuRepository.batchUpdateByPrimaryKeySelective(spuList); +// //同步到es +// spuEsService.syncSpuEsSage(new SpuListDTO(getSpuList(ids))); + + } + + private List getSpuList(List ids) { + String s1 = ids.stream(). + reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString(); + s1 = s1.substring(0,s1.length()-1); + return spuRepository.selectByIds(s1); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertOrUpdateGoods(GoodsRequestDTO goodsRequestDTO) { + //查询名称是否重复 + Spu oldSpu = spuRepository.queryGoodsByNameNew(goodsRequestDTO.getName(),goodsRequestDTO.getId()); + if (!Objects.isNull(oldSpu)) { + throw new CommonException("存在相同名称的商品"); + } + Spu spuEntity = new Spu(); + BeanUtils.copyProperties(goodsRequestDTO,spuEntity); + + try { + if (Objects.isNull(goodsRequestDTO.getId())) { + int insert = spuRepository.insert(spuEntity); + // 插入属性 + if (insert > 0) { + spuAttributeRepository.saveAttr(goodsRequestDTO.getAttrs(), spuEntity.getId()); + } + } else { + // 删除原属性 + deleteAttr(goodsRequestDTO); + // 删除原属性值 + deleteAttrValues(goodsRequestDTO); + spuAttributeRepository.saveAttr(goodsRequestDTO.getAttrs(), spuEntity.getId()); + spuRepository.updateByPrimaryKeySelective(spuEntity); + } + }catch (DuplicateKeyException e){ + // 捕获编码唯一性异常,修改提示语 + throw new CommonException("存在相同编码的商品", e); + } + + // 同步到es + SpuListDTO spuListDTO = new SpuListDTO(spuEntity); + spuListDTO.setDeleteFlag(false); + spuEsService.syncSpuEsSage(spuListDTO); + } + + private void deleteAttrValues(GoodsRequestDTO goodsRequestDTO) { + SpuAttributeValue spuAttributeValue = new SpuAttributeValue(); + spuAttributeValue.setSpuId(goodsRequestDTO.getId()); +// spuAttributeValue.setDeleteFlag(ObjectConstant.DeleteFlag.NO); + List attrsValues = spuAttributeValueRepository.select(spuAttributeValue); +// if (CollUtil.isNotEmpty(attrsValues)){ +// List vas = attrsValues.stream().peek(a -> a.setDeleteFlag(ObjectConstant.DeleteFlag.YES)).collect(Collectors.toList()); +// spuAttributeValueRepository.batchUpdateByPrimaryKey(vas); +// } + spuAttributeValueRepository.batchDelete(attrsValues); + } + + private void deleteAttr(GoodsRequestDTO goodsRequestDTO) { + SpuAttribute spuAttribute = new SpuAttribute(); + spuAttribute.setSpuId(goodsRequestDTO.getId()); +// spuAttribute.setDeleteFlag(ObjectConstant.DeleteFlag.NO); + List attrs = spuAttributeRepository.select(spuAttribute); +// if (CollUtil.isNotEmpty(attrs)){ +// List collect = attrs.stream().peek(a -> a.setDeleteFlag(ObjectConstant.DeleteFlag.YES)).collect(Collectors.toList()); +// spuAttributeRepository.batchUpdateByPrimaryKey(collect); +// } + spuAttributeRepository.batchDelete(attrs); + } + + + @Override + public GoodsDetailsVO getDetailsById(Long id) { + Spu spu = spuRepository.selectByPrimaryKey(id); + GoodsDetailsVO goodsDetailsVO = new GoodsDetailsVO(); + BeanUtils.copyProperties(spu,goodsDetailsVO); + // 查询分类 需要用/来拼接多级分类 + goodsDetailsVO.setCategoryName(categoryRepository.getCategoryNameById(spu.getCategoryId())); + //查询品牌名称 + Long brandId = spu.getBrandId(); + Brand brand = brandRepository.selectByPrimaryKey(brandId); + if (brand !=null) { + goodsDetailsVO.setBrandName(brand.getName()); + } + //拼接素材信息 + Material material = materialRepository.selectByPrimaryKey(spu.getMaterialId()); + if (material !=null){ + goodsDetailsVO.setMaterialName(material.getMaterialName()); + } + goodsDetailsVO.setMainImage(Arrays.asList(Optional.ofNullable(material.getMainImage()).orElse("").split(","))); + String detailImage = material.getDetailImage(); + if (StringUtils.isNotBlank(detailImage)){ + goodsDetailsVO.setImageList(Arrays.asList(detailImage.split(","))); + } + goodsDetailsVO.setDetailHtml(material.getDetailHtml()); + //获取商品属性值列表 + goodsDetailsVO.setAttrLists((getAttributeValueList(id))); + return goodsDetailsVO; + } + + private List getAttributeValueList(Long goodsId) { + List spuAttributes = spuAttributeRepository.selectByCondition(Condition.builder(SpuAttribute.class) + .andWhere(Sqls.custom() + .andEqualTo(SpuAttribute.FIELD_SPU_ID, goodsId) + .andEqualTo(SpuAttribute.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + + + List spuAttributeValues = spuAttributeValueRepository.selectByCondition(Condition.builder(SpuAttributeValue.class) + .andWhere(Sqls.custom() + .andEqualTo(SpuAttributeValue.FIELD_SPU_ID, goodsId) + .andEqualTo(SpuAttributeValue.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + + Map > valueMap = spuAttributeValues.stream() + .collect(Collectors.toMap(SpuAttributeValue::getAttributeId, + com.google.common.collect.Lists::newArrayList, + (List newValueList, List oldValueList) -> { + oldValueList.addAll(newValueList); + return oldValueList; + }) + ); + + return spuAttributes.stream().map(item -> { + AttrListRequestDTO attrListRequestDTO = new AttrListRequestDTO(); + BeanUtils.copyProperties(item, attrListRequestDTO); + attrListRequestDTO.setAttributeName(item.getName()); + attrListRequestDTO.setValues(valueMap.get(item.getId())); + return attrListRequestDTO; + }).collect(Collectors.toList()); + + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AllAttributeRelationResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AllAttributeRelationResVO.java new file mode 100644 index 0000000..52f5fff --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AllAttributeRelationResVO.java @@ -0,0 +1,43 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @description + * @Author wusc + * @create 2021/7/16 10:29 上午 + */ +@Data +@ApiModel("属性返回参数") +public class AllAttributeRelationResVO { + + @ApiModelProperty("分类或者商品id") + @Encrypt + private Long mainId; + + @ApiModelProperty("属性id") + private Long attributeId; + + @ApiModelProperty("属性编码") + private String code; + + @ApiModelProperty("属性名称") + private String attributeName; + + @ApiModelProperty("类别 1单选2复选3文本4下拉") + private Integer type; + + @ApiModelProperty("属性是否属于自己") + private Boolean isSelf; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("属性关联id") + @Encrypt + private Long id; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeAndValueResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeAndValueResVO.java new file mode 100644 index 0000000..ea684c2 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeAndValueResVO.java @@ -0,0 +1,53 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * 查询该商品属性及其对应的属性值 + * @description + * @Author wusc + * @create 2021/7/7 9:30 上午 + */ +@Data +public class AttributeAndValueResVO { + + /** + * 属性值id + */ + @ApiModelProperty("属性值id") + @Encrypt + private Long attributeId; + + /** + * 属性名 + */ + @ApiModelProperty("属性名") + private String attributeName; + + /** + * 属性类别 + */ + @ApiModelProperty("属性类别 1单选2复选3文本4下拉") + private Integer type; + + /** + * 是否用于生成sku + */ + @ApiModelProperty("是否用于生成sku") + private Boolean isSku; + + /** + * 属性编码 + */ + @ApiModelProperty("属性编码") + private String code; + /** + * 属性值 + */ + @ApiModelProperty("属性值") + private List attributeValueResVOList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeDetailResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeDetailResVO.java new file mode 100644 index 0000000..ae3e96b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeDetailResVO.java @@ -0,0 +1,20 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/7/21 2:15 下午 + */ +@Data +@ApiModel("属性详情查询参数") +public class AttributeDetailResVO extends AttributePageResVO{ + + @ApiModelProperty("查询属性对应属性值") + private List attributeValueResVOList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributePageResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributePageResVO.java new file mode 100644 index 0000000..1441018 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributePageResVO.java @@ -0,0 +1,60 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/24 2:28 下午 + */ +@Data +@ApiModel("属性分页返回参数") +public class AttributePageResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("属性编码") + private String code; + + @ApiModelProperty("属性名称") + private String attributeName; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("属性值") + private List attributeValueResVOList; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("创建人员") + private String createdBy; + + @ApiModelProperty("操作人员") + private String lastUpdatedBy; + + @ApiModelProperty("创建时间") + private Date createDate; + + @ApiModelProperty("版本号") + private Long objectVersionNumber; + + @ApiModelProperty("类别 1单选2复选3文本4下拉") + private Integer type; + + @ApiModelProperty("是否用于生成sku") + private Boolean isSku; + + @ApiModelProperty("状态") + private Integer status; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeValueResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeValueResVO.java new file mode 100644 index 0000000..611a0a9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/AttributeValueResVO.java @@ -0,0 +1,30 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @description + * @Author wusc + * @create 2021/7/6 5:29 下午 + */ +@Data +@ApiModel("属性值返回参数") +public class AttributeValueResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("属性id") + @Encrypt + private Long attributeId; + + @ApiModelProperty("属性值") + private String value; + + @ApiModelProperty("排序") + private Integer sort; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/BrandPageResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/BrandPageResVO.java new file mode 100644 index 0000000..fc32cdb --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/BrandPageResVO.java @@ -0,0 +1,67 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.common.SkyerCacheKey; +import org.skyer.core.cache.CacheValue; +import org.skyer.core.cache.Cacheable; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; + +/** + * @description + * @Author wusc + * @create 2021/6/24 9:45 上午 + */ +@Data +@ApiModel("品牌返回参数") +public class BrandPageResVO implements Cacheable { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("品牌编码") + private String code; + + @ApiModelProperty("品牌logo") + private String logo; + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("制造商") + private String manufacturer; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("创建人员") + private String createdBy; + + @ApiModelProperty(value = "创建人名称") + @CacheValue( + key = SkyerCacheKey.USER, + primaryKey = "createdBy", + searchKey = "realName", + structure = CacheValue.DataStructure.MAP_OBJECT + ) + private String createdName; + + @ApiModelProperty("操作人员") + private String lastUpdatedBy; + + @ApiModelProperty("创建时间") + private Date createDate; + + @ApiModelProperty("最后更新时间") + private Date lastUpdateDate; + + @ApiModelProperty("版本号") + private Long objectVersionNumber; + + @ApiModelProperty("状态 0 开启 1禁用") + private Integer status; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeVO.java new file mode 100644 index 0000000..2e55354 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeVO.java @@ -0,0 +1,51 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + + +/** + * @author xurongfa 2021-12-27 09:41 + */ +@Data +@ApiModel("商品分类属性(包含属性值)") +public class CategoryAttributeVO { +// @Encrypt +// @ApiModelProperty("id") +// private Long id; +// + @Encrypt + @ApiModelProperty(value = "分类id sgoo_category.id") + private Long categoryId; + + @ApiModelProperty(value = "属性名称") + private String name; + + @ApiModelProperty(value = "属性编码") + private String code; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "表单方式 1单选2复选3文本4下拉") + private Integer formType; + + @ApiModelProperty(value = "是否用于生成sku true是 false否") + private Boolean skuFlag; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "来源类型 0新增 1系统 2父级属性") + private Integer sourceType; + + @ApiModelProperty(value = "属性值列表") + private List attributeValueList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeValueVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeValueVO.java new file mode 100644 index 0000000..6f72a7e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryAttributeValueVO.java @@ -0,0 +1,16 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("商品分类属性值") +public class CategoryAttributeValueVO { + @ApiModelProperty(value = "属性值") + private String value; + + @ApiModelProperty(value = "排序") + private Long sort; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldPageResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldPageResVO.java new file mode 100644 index 0000000..8f79953 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldPageResVO.java @@ -0,0 +1,56 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.api.dto.LevelCategoryDTO; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/23 10:21 上午 + */ +@Data +@ApiModel(description = "商品分类返回值") +public class CategoryOldPageResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("分类编码") + private String categoryCode; + + @ApiModelProperty("分类名称") + private String categoryName; + + @ApiModelProperty("当前等级") + private Integer level; + @ApiModelProperty("分类级别") + List levelCategoryDTOs; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("操作人员") + private Long lastUpdatedBy; + + @ApiModelProperty("创建时间") + private Date createDate; + + @ApiModelProperty("创建人员") + private Long createdBy; + + @ApiModelProperty("最后操作时间") + private Date lastUpdateDate; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否有下级") + private Boolean haveNext; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldResVO.java new file mode 100644 index 0000000..35699d8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryOldResVO.java @@ -0,0 +1,37 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @description + * @Author wusc + * @create 2021/6/24 9:16 上午 + */ +@Data +@ApiModel(description = "根据上级目录获取子级") +public class CategoryOldResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("分类编码") + private String categoryCode; + + + @ApiModelProperty("分类名称") + private String categoryName; + + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("类目等级") + private Integer level; + + @ApiModelProperty("父级id") + private String frontId; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryTreeVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryTreeVO.java new file mode 100644 index 0000000..ffb561f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryTreeVO.java @@ -0,0 +1,50 @@ +package org.skyer.goods.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.domain.entity.Category; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +@Data +@ApiModel("商品分类表") +public class CategoryTreeVO { + @Encrypt + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty(value = "分类编码") + private String code; + + @ApiModelProperty(value = "分类名称") + private String name; + + @Encrypt + @ApiModelProperty(value = "父id 默认0,代表一级") + private Long parentId; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "类目等级 一级开始:1") + private Integer level; + + @ApiModelProperty(value = "是否叶子类目 false否 true是") + private Boolean subFlag; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "下级分类") + private List children; + + @ApiModelProperty(value = "版本号") + private Long objectVersionNumber; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryVO.java new file mode 100644 index 0000000..4b36b6c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CategoryVO.java @@ -0,0 +1,56 @@ +package org.skyer.goods.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +@Data +@ApiModel("商品分类表(包含属性、属性值)") +public class CategoryVO { + @Encrypt + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty(value = "分类编码") + private String code; + + + @ApiModelProperty(value = "分类名称") + private String name; + + @Encrypt + @ApiModelProperty(value = "父id 0,代表一级") + private Long parentId; + + @ApiModelProperty(value = "父级分类名称") + private String parentName; + + @ApiModelProperty(value = "状态 true启用 false禁用") + private Boolean statusFlag; + + @ApiModelProperty(value = "类目等级 一级开始") + private Integer level; + + @ApiModelProperty(value = "是否叶子类目 false否 true是") + private Boolean subFlag; + + @ApiModelProperty(value = "排序") + private Long sort; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "商品属性表(包含属性值)") + private List attributeList; + + @ApiModelProperty(value = "版本号") + private Long objectVersionNumber; + + @ApiModelProperty(value = "普通分类是否有下级或者叶子节点是否有商品") + private Boolean hasSubOrSPUFlag; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CheckGoodsAttributeResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CheckGoodsAttributeResVO.java new file mode 100644 index 0000000..6678fc0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CheckGoodsAttributeResVO.java @@ -0,0 +1,39 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * 商品属性选择列表 + * @description + * @Author wusc + * @create 2021/7/19 9:44 上午 + */ +@Data +public class CheckGoodsAttributeResVO { + + @ApiModelProperty("商品属性") + @Encrypt + private Long attributeId; + + @ApiModelProperty("属性类别类别 1单选2复选3文本4下拉") + private Integer type; + + @ApiModelProperty("属性名称") + private String attributeName; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("属性值") + private List attributeValueResVOS; + + @ApiModelProperty("选择的属性值id") + private List checkValueIdList; + + @ApiModelProperty("为文本框时手写属性值") + private String valueText; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/ChinaZoingRemoteVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/ChinaZoingRemoteVO.java new file mode 100644 index 0000000..873444c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/ChinaZoingRemoteVO.java @@ -0,0 +1,46 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * { + * "levelThreeAreaCode": 110101001008, + * "levelTwoAreaCode": 110101001000, + * "levelOneAreaCode": 110101000000, + * "levelThreeAreaName": "黄图岗社区居委会", + * "levelTwoAreaName": "东华门街道", + * "levelOneAreaName": "东城区" + * } + * + * @description + * @Author chenzz + * @create 2021/8/23 + */ +@Data +public class ChinaZoingRemoteVO { + + @ApiModelProperty("3级编码") + @Encrypt + private Long levelThreeAreaCode; + + @ApiModelProperty("2级编码") + @Encrypt + private Long levelTwoAreaCode; + + @ApiModelProperty("1级编码") + @Encrypt + private Long levelOneAreaCode; + + @ApiModelProperty("三级名称") + private String levelThreeAreaName; + + @ApiModelProperty("二级名称") + private String levelTwoAreaName; + + @ApiModelProperty("一级名称") + private String levelOneAreaName; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CreateSkuListVo.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CreateSkuListVo.java new file mode 100644 index 0000000..fb58cac --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/CreateSkuListVo.java @@ -0,0 +1,18 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(description = "生成sku列表vo") +public class CreateSkuListVo { + // private Long id; + + private String skuCode; + + private String attributeIdText; + + private String attributeValueIdText; + + private String attributeValueText; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/DetailSpecifResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/DetailSpecifResVO.java new file mode 100644 index 0000000..d870390 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/DetailSpecifResVO.java @@ -0,0 +1,28 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * 商品详情规格和价格信息 + * @description + * @Author wusc + * @create 2021/6/24 1:49 下午 + */ +@Data +@ApiModel(description = "商品详情规格和价格信息") +public class DetailSpecifResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long specificationId; + + private String name; + + + private List skuInfo; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailResVO.java new file mode 100644 index 0000000..063aad7 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailResVO.java @@ -0,0 +1,59 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/24 1:43 下午 + */ +@Data +@ApiModel(description = "查询商品详情") +public class GoodsDetailResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("商品编码") + private String code; + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品类别") + private String type; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty("分类id") + private Long categoryId; + + @ApiModelProperty("分类名称") + private String categoryName; + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("素材id") + @Encrypt + private Long materialId; + + @ApiModelProperty("素材名称") + private String materialName; + + @ApiModelProperty("商品主图") + private List mainImage; + + @ApiModelProperty("商品详情图") + private List imageList; + + @ApiModelProperty("描述") + private String detailHtml; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailsVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailsVO.java new file mode 100644 index 0000000..af815f8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsDetailsVO.java @@ -0,0 +1,74 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +import org.skyer.goods.api.dto.AttrListRequestDTO; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @author: lzh + * @date: 2021-12-28 + * @description: + */ +@Data +@ApiModel(description = "查询商品详情") +public class GoodsDetailsVO { + @ApiModelProperty("主键") + @Encrypt + private Long id; + + @ApiModelProperty("商品编码") + private String spuCode; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品类别") + private Integer type; + + @ApiModelProperty("分类id") + @Encrypt + private Long categoryId; + + @ApiModelProperty("分类名称") + private String categoryName; + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("素材id") + @Encrypt + private Long materialId; + + @ApiModelProperty("素材名称") + private String materialName; + + @ApiModelProperty("商品主图") + private List mainImage; + + @ApiModelProperty("商品详情图") + private List imageList; + + @ApiModelProperty("描述") + private String detailHtml; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty(value = "品牌id") + @Encrypt + private Long brandId; + @ApiModelProperty("商品属性值") + private List attrLists; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsPageResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsPageResVO.java new file mode 100644 index 0000000..26ba025 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsPageResVO.java @@ -0,0 +1,80 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/24 11:15 上午 + */ +@Data +@ApiModel("商品分类分页查询") +public class GoodsPageResVO { + + @ApiModelProperty("主键") + @Encrypt + private Long id; + + private String spuCode; + + @ApiModelProperty("商品名称") + private String name; + + @ApiModelProperty("商品类别") + private Integer type; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty("分类id") + @Encrypt + private Long categoryId; + + @ApiModelProperty("分类名称") + private String categoryName; + + @ApiModelProperty("品牌id") + @Encrypt + private Long brandId; + + @ApiModelProperty("商品品牌") + private String brandName; + + @ApiModelProperty("素材id") + @Encrypt + private Long materialId; + + @ApiModelProperty("素材名称") + private String materialName; + + @ApiModelProperty("商品主图") + private List mainImage; + + @ApiModelProperty("操作人员") + private String lastUpdatedBy; + + @ApiModelProperty("操作时间") + private String lastUpdateDate; + + @ApiModelProperty("创建人员") + private String createdBy; + + @ApiModelProperty("创建时间") + private Date createDate; + + @ApiModelProperty("版本号") + private Long objectVersionNumber; + + @ApiModelProperty("商品状态") + private Integer status; + + @ApiModelProperty("备注") + private String remark; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditPriceVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditPriceVO.java new file mode 100644 index 0000000..006c3af --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditPriceVO.java @@ -0,0 +1,31 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class GoodsSkuAuditPriceVO { + + @ApiModelProperty(value = "成本价", required = true) + private BigDecimal costPrice; + + @ApiModelProperty(value = "销售价", required = true) + private BigDecimal salesPrice; + + @ApiModelProperty(value = "活动价", required = true) + private BigDecimal activityPrice; + + @ApiModelProperty(value = "市场价", required = true) + private BigDecimal marketPrice; + + @ApiModelProperty(value = "分销价", required = true) + private BigDecimal distributionPrice; + + @ApiModelProperty(value = "批发价", required = true) + private BigDecimal wholesalePrice; + + @ApiModelProperty(value = "结算价", required = true) + private BigDecimal clearingPrice; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditVO.java new file mode 100644 index 0000000..44fe1d4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuAuditVO.java @@ -0,0 +1,107 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import org.skyer.common.SkyerCacheKey; +import org.skyer.core.cache.CacheValue; +import org.skyer.core.cache.Cacheable; +import org.skyer.goods.api.dto.AttributeDTO; +import org.skyer.starter.keyencrypt.core.Encrypt; + +@Data +public class GoodsSkuAuditVO implements Cacheable { + + @ApiModelProperty("id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "商品id") + @Encrypt + private Long spuId; + + @ApiModelProperty(value = "商品名称") + private String spuName; + + @ApiModelProperty(value = "spu") + private String spuCode; + + @ApiModelProperty(value = "skuCode") + private String skuCode; + + @ApiModelProperty(value = "分类名") + String categoryName; + + @ApiModelProperty(value = "品牌名称") + private String brandName; + + @ApiModelProperty("素材名称") + private String materialName; + + @ApiModelProperty("主图") + private String mainImage; + + @ApiModelProperty("详情图") + private String detailImage; + + @ApiModelProperty("详情内容") + private String detailHtml; + + @ApiModelProperty(value = "显示标志,1显示,0不显示", required = true) + private Integer showFlag; + + @ApiModelProperty(value = "唯一性校验") + private String md5CheckValue; + + @ApiModelProperty(value = "sku名称") + private String skuName; + + @ApiModelProperty(value = "商品重量", required = true) + private BigDecimal weight; + + @ApiModelProperty(value = "商品长度", required = true) + private BigDecimal length; + + @ApiModelProperty(value = "商品宽度", required = true) + private BigDecimal width; + + @ApiModelProperty(value = "商品高度", required = true) + private BigDecimal height; + + @ApiModelProperty(value = "状态 0草稿1审核中 2被驳回 3已生效 4已生效(修改中)", required = true) + private Integer status; + + @ApiModelProperty("价格集") + private GoodsSkuAuditPriceVO priceVO; + + @ApiModelProperty("原始属性列表") + private List skuAttributeList; + + @ApiModelProperty("附加属性列表") + private List otherAttributeList; + + @ApiModelProperty(value = "审核意见") + private String auditIdea; + + @ApiModelProperty(value = "审核提交时间") + private Date auditCommitDate; + + @ApiModelProperty(value = "最后提交人id") + private Long auditCommitBy; + + @ApiModelProperty(value = "最后提交人姓名") + @CacheValue( + key = SkyerCacheKey.USER, + primaryKey = "auditCommitBy", + searchKey = "realName", + structure = CacheValue.DataStructure.MAP_OBJECT + ) + private String auditCommitName; + + @ApiModelProperty("套餐信息 sku明细") + private List skuDetailList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuDetailVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuDetailVO.java new file mode 100644 index 0000000..deb6258 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuDetailVO.java @@ -0,0 +1,105 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.goods.domain.entity.SkuPackage; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 商品规格表 + * + * @author zhanglb + */ +@ApiModel("sku详情") +@Data +public class GoodsSkuDetailVO { + + @ApiModelProperty(value = "主键id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "商品id") + @Encrypt + private Long spuId; + + @ApiModelProperty(value = "商品名称") + private String spuName; + + @ApiModelProperty(value = "spu") + private String spuCode; + + @ApiModelProperty(value = "素材id") + @Encrypt + private Long materialId; + + @ApiModelProperty(value = "素材名称") + private String materialName; + + @ApiModelProperty(value = "主要素材") + private List materialMainImages; + + @ApiModelProperty(value = "详情素材") + private List imageList; + + @ApiModelProperty(value = "skuCode") + private String skuCode; + + @ApiModelProperty(value = "品牌名") + private String brandName; + + @ApiModelProperty(value = "sku名称") + private String skuName; + + private String categoryName; + + @ApiModelProperty(value = "显示标志,1显示,0不显示") + private Integer showFlag; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + private String goodsRemark; + + @ApiModelProperty(value = "状态 0草稿1审核中 2被驳回 3已生效 4已生效(修改中)") + private Integer status; + + @ApiModelProperty(value = "成本价") + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价") + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价") + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价") + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价") + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价") + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价") + private BigDecimal clearingPrice; + @ApiModelProperty(value = "商品重量") + private BigDecimal weight; + @ApiModelProperty(value = "商品长度") + private BigDecimal length; + @ApiModelProperty(value = "商品宽度") + private BigDecimal width; + @ApiModelProperty(value = "商品高度") + private BigDecimal height; + @ApiModelProperty(value = "审核意见") + private String auditIdea; + + @ApiModelProperty("原始属性列表") + private List skuAttributeList; + + @ApiModelProperty("附加属性列表") + private List otherAttributeList; + + @ApiModelProperty("套餐信息 sku明细") + private List skuDetailList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuPageVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuPageVO.java new file mode 100644 index 0000000..0f7e801 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuPageVO.java @@ -0,0 +1,106 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.Transient; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 商品规格表 + * + * @author chenzz 2021-07-06 10:35:43 + */ +@ApiModel("商品SKU") +@Data +public class GoodsSkuPageVO { + + @ApiModelProperty(value = "主键id") + @Encrypt + private Long id; + + @ApiModelProperty(value = "商品id") + @Encrypt + private Long spuId; + + @ApiModelProperty(value = "商品名称") + private String spuName; + + @ApiModelProperty(value = "spuCode") + private String spuCode; + + @ApiModelProperty(value = "spu类别") + private Integer spuType; + + @ApiModelProperty(value = "spu分类") + private String categoryCode; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty(value = "素材id") + @Encrypt + private Long materialId; + + @ApiModelProperty(value = "素材名称") + private String materialName; + + @ApiModelProperty(value = "素材") + private List materialMainImages; + + @ApiModelProperty(value = "sku") + private String skuCode; + + @ApiModelProperty(value = "sku名称") + private String skuName; + + private String categoryName; + + @ApiModelProperty(value = "显示标志,1显示,0不显示") + private Integer showFlag; + + private String goodsRemark; + + @ApiModelProperty(value = "状态 0草稿1审核中 2被驳回 3已生效 4已生效(修改中)") + private Integer status; + + @ApiModelProperty(value = "成本价") + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价") + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价") + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价") + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价") + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价") + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价") + private BigDecimal clearingPrice; + @ApiModelProperty(value = "商品重量") + private BigDecimal weight; + @ApiModelProperty(value = "商品长度") + private BigDecimal length; + @ApiModelProperty(value = "商品宽度") + private BigDecimal width; + @ApiModelProperty(value = "商品高度") + private BigDecimal height; + @ApiModelProperty(value = "审核意见") + private String auditIdea; + @ApiModelProperty(value = "审核提交时间") + private Date auditCommitDate; + + @ApiModelProperty("原始属性列表") + private List skuAttributeList; + + @ApiModelProperty("附加属性列表") + private List otherAttributeList; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuVO.java new file mode 100644 index 0000000..f914192 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GoodsSkuVO.java @@ -0,0 +1,87 @@ +package org.skyer.goods.domain.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.skyer.goods.api.dto.LevelCategoryDTO; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 商品规格表 + * + * @author chenzz 2021-07-06 10:35:43 + */ +@ApiModel("商品SKU") +@Data +public class GoodsSkuVO { + + @ApiModelProperty(value = "主键id") + @JsonSerialize(using = ToStringSerializer.class) + @Encrypt + private Long id; + + @ApiModelProperty(value = "商品id") + @JsonSerialize(using = ToStringSerializer.class) + @Encrypt + private Long spuId; + + @ApiModelProperty(value = "spu") + private String spuCode; + + @ApiModelProperty(value = "素材id") + @JsonSerialize(using = ToStringSerializer.class) + @Encrypt + private Long materialId; + + @ApiModelProperty(value = "sku") + private String skuCode; + + private MaterialVO material; + + /** + * 商品详情 + */ + private GoodsDetailResVO goodsDetails; + + + private String categoryName; + + + @ApiModelProperty(value = "显示标志,1显示,0不显示") + private Integer showFlag; + + + @ApiModelProperty(value = "状态 0草稿1审核中 2被驳回 3已生效 4已生效(修改中)") + private Integer status; + + @ApiModelProperty(value = "成本价") + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价") + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价") + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价") + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价") + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价") + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价") + private BigDecimal clearingPrice; + + @ApiModelProperty("原始属性列表") + private List skuAttributeList; + + @ApiModelProperty("附加属性列表") + private List otherAttributeList; + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupPageResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupPageResVO.java new file mode 100644 index 0000000..8022dcf --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupPageResVO.java @@ -0,0 +1,58 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/8/16 5:22 下午 + */ +@ApiModel("商品组合分页查找") +@Data +public class GroupPageResVO { + + @ApiModelProperty("商品组合id") + @Encrypt + private Long groupId; + + @ApiModelProperty("商品组合编码") + private String groupCode; + + @ApiModelProperty("spu编码") + @Encrypt + private Long spuId; + + @ApiModelProperty("spu编码") + private String spuCode; + + @ApiModelProperty("spu名称") + private String spuName; + + @ApiModelProperty("分类") + private String categoryName; + + @ApiModelProperty("套餐商品数") + private BigDecimal goodsNum; + + @ApiModelProperty("适用店铺") + private List storeList; + + @ApiModelProperty("创建人员") + private String createdBy; + + @ApiModelProperty("操作人员") + private String lastUpdatedBy; + + @ApiModelProperty("最后更新时间") + private Date lastUpdateDate; + + @ApiModelProperty("创建时间") + private Date createDate; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupStoreResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupStoreResVO.java new file mode 100644 index 0000000..75fc990 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/GroupStoreResVO.java @@ -0,0 +1,32 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.boot.platform.lov.annotation.LovValue; + +/** + * 店铺类型 + * @description + * @Author wusc + * @create 2021/8/16 9:43 上午 + */ +@Data +public class GroupStoreResVO { + + @ApiModelProperty(value = "店铺id") + private Long storeId; + + @ApiModelProperty("店铺code") + private String code; + + @ApiModelProperty("店铺名称") + private String name; + + @ApiModelProperty("类型编码, 值集 SCHL.CHANNEL_TYP") + @LovValue(lovCode = "SCHL.CHANNEL_TYPE",meaningField = "channelTypeMeaning") + private String channelTypeMeaning; + + @ApiModelProperty("网店类型编码 SCHL.SHOP_TYPE") + @LovValue(lovCode = "SCHL.SHOP_TYPE", meaningField = "onlineStoreTypeMeaning") + private String onlineStoreTypeMeaning; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/MainIdAttributeValueResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/MainIdAttributeValueResVO.java new file mode 100644 index 0000000..5c76fda --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/MainIdAttributeValueResVO.java @@ -0,0 +1,40 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.List; + +/** + * 根据mainid查询所有属性或者属性值 + * @description + * @Author wusc + * @create 2021/7/7 9:15 上午 + */ +@Data +public class MainIdAttributeValueResVO { + + /** + * 商品或者分类的id + */ + @ApiModelProperty("主键") + @Encrypt + private Long mainId; + + @ApiModelProperty("名称") + private String name; + + /** + * 排序级别 + */ + @ApiModelProperty("排序级别") + private Integer level; + + /** + * 商品属性对应属性值 + */ + @ApiModelProperty("属性及其对应的属性值") + private List attributeAndValueResVOS; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/MaterialVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/MaterialVO.java new file mode 100644 index 0000000..246cabd --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/MaterialVO.java @@ -0,0 +1,74 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import org.skyer.common.SkyerCacheKey; +import org.skyer.core.cache.CacheValue; +import org.skyer.core.cache.Cacheable; +import org.skyer.mybatis.domain.AuditDomain; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel("商品素材") +public class MaterialVO extends AuditDomain implements Cacheable { + @ApiModelProperty("表ID,主键,供其他表做外键") + @Encrypt + private Long id; + + /** + * 编码 + */ + @ApiModelProperty("编码") + private String code; + + /** + * 素材名称 + */ + @ApiModelProperty("素材名称") + private String materialName; + + /** + * 主图 + */ + @ApiModelProperty("主图") + private List mainImage; + + /** + * 详情图 + */ + @ApiModelProperty("详情图") + private List detailImage; + + /** + * 详情内容 + */ + @ApiModelProperty("详情内容") + private String detailHtml; + + private String remark; + + + @ApiModelProperty("创建人用户名") + @CacheValue( + key = SkyerCacheKey.USER, + primaryKey = "createdBy", + searchKey = "realName", + structure = CacheValue.DataStructure.MAP_OBJECT + ) + private String createdName; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/OnlineShopVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/OnlineShopVO.java new file mode 100644 index 0000000..48d12be --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/OnlineShopVO.java @@ -0,0 +1,93 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.boot.platform.lov.annotation.LovValue; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; + +/** + * @description + * @Author wusc + * @create 2021/8/16 4:14 下午 + */ +@Data +public class OnlineShopVO { + + @ApiModelProperty("表ID,主键,供其他表做外键") + @Encrypt + private Long id; + + @ApiModelProperty("编码") + private String code; + + @ApiModelProperty("租户ID") + @Encrypt + private Long tenantId; + + @ApiModelProperty("网店名称") + @NotNull + private String name; + + @ApiModelProperty("渠道类型编码") + @NotNull + @LovValue(lovCode = "SCHL.CHANNEL_TYPE",meaningField = "channelTypeMeaning") + private String channelTypeCode; + + @ApiModelProperty("渠道类型") + private String channelTypeMeaning; + + @ApiModelProperty("网店类型编码") + @NotNull + @LovValue(lovCode = "SCHL.SHOP_TYPE", meaningField = "onlineStoreTypeMeaning") + private String onlineStoreTypeCode; + + @ApiModelProperty("网店类型") + private String onlineStoreTypeMeaning; + + @ApiModelProperty("负责人") + @NotNull + private String manager; + + @ApiModelProperty("网店地址(url)") + @NotNull + private String url; + + @ApiModelProperty("销售组织") + @NotNull + @Encrypt + private Long salesOrganizingId; + + @ApiModelProperty("发票种类编码") + @NotNull + @LovValue(lovCode = "SCHL.INVOICE_TYPE", meaningField = "invoiceTypeCodeMeaning") + private String invoiceTypeCode; + + @ApiModelProperty("发票种类") + private String invoiceTypeCodeMeaning; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("渠道仓使用状态 true是") + private Boolean channelStorehouseStatus; + + @ApiModelProperty("删除标识") + private Boolean deleteFlag; + + @ApiModelProperty("状态 true禁用") + private Boolean status; + + @ApiModelProperty("自动确认发货(天)") + private Integer autoConfirmDay; + + @ApiModelProperty("自动下载商品 true是 false否") + private Boolean autoDownloadGoods; + + @ApiModelProperty("自动同步库存 true是 false否") + private Boolean autoSyncInventory; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/PriceItemLov.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/PriceItemLov.java new file mode 100644 index 0000000..457858e --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/PriceItemLov.java @@ -0,0 +1,23 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.boot.platform.lov.dto.LovValueDTO; + +import java.io.Serializable; +import java.util.List; + +/** + * 租户价格项LOV + * + * @author chenzz + */ +@Data +@ApiModel("租户价格项值集") +public class PriceItemLov implements Serializable { + + @ApiModelProperty("租户价格项类型") + List priceItemTypes; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcGoodsResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcGoodsResVO.java new file mode 100644 index 0000000..b47d379 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcGoodsResVO.java @@ -0,0 +1,56 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * 用于远程调用时候需要值 + * @description + * @Author wusc + * @create 2021/8/9 10:30 上午 + */ +@Data +public class RpcGoodsResVO { + @ApiModelProperty("id") + @Encrypt + private Long id; + + @ApiModelProperty("商品code") + private String spuCode; + + @ApiModelProperty("skuCode") + private String skuCode; + + @ApiModelProperty("sku名称") + private String skuName; + + @ApiModelProperty("商品名称") + private String spuName; + + @ApiModelProperty("商品分类") + private String categoryStr; + + @ApiModelProperty("最后一级分类id") + @Encrypt + private Long lastCategoryId; + + @ApiModelProperty("品牌名") + private String brandName; + + @ApiModelProperty("品牌ID") + private Long brandId; + + @ApiModelProperty("商品类型") + private Integer spuType; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty("数量") + private Long num; + + @ApiModelProperty("套餐主商品的sku") + private String mainSkuCode; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcOrderResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcOrderResVO.java new file mode 100644 index 0000000..a841655 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/RpcOrderResVO.java @@ -0,0 +1,87 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单服务远程调用 + * @description + * @Author zhanglb + * @create 2022/01/18 + */ +@Data +public class RpcOrderResVO { + + @ApiModelProperty("商品Id") + private Long spuId; + + @ApiModelProperty("商品code") + private String spuCode; + + @ApiModelProperty("商品名称") + private String spuName; + + @ApiModelProperty("商品类型") + private String spuType; + + @ApiModelProperty("skuId") + private Long skuId; + + @ApiModelProperty("skuCode") + private String skuCode; + + @ApiModelProperty("sku名称") + private String skuName; + + @ApiModelProperty("品牌数据") + private String brandInfo; + + @ApiModelProperty("素材数据") + private String materialInfo; + + @ApiModelProperty("类型数据") + private String categoryInfo; + + @ApiModelProperty("属性数据") + private String attributeInfo; + + + @ApiModelProperty(value = "成本价") + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价") + private BigDecimal salesPrice; + @ApiModelProperty(value = "活动价") + private BigDecimal activityPrice; + @ApiModelProperty(value = "市场价") + private BigDecimal marketPrice; + @ApiModelProperty(value = "分销价") + private BigDecimal distributionPrice; + @ApiModelProperty(value = "批发价") + private BigDecimal wholesalePrice; + @ApiModelProperty(value = "结算价") + private BigDecimal clearingPrice; + @ApiModelProperty(value = "商品重量") + private BigDecimal weight; + @ApiModelProperty(value = "商品长度") + private BigDecimal length; + @ApiModelProperty(value = "商品宽度") + private BigDecimal width; + @ApiModelProperty(value = "商品高度") + private BigDecimal height; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + @ApiModelProperty("赠品标识:0-卖品,1-赠品") + private Integer giftFlag; + @ApiModelProperty("子母件标识:0-普通单品,1-子母件") + private Integer multiFlag; + + @ApiModelProperty("数量") + private Long num; + + @ApiModelProperty("套餐主商品的sku") + private String mainSkuCode; + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuAuditVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuAuditVO.java new file mode 100644 index 0000000..391ce1a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuAuditVO.java @@ -0,0 +1,17 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import org.skyer.core.cache.Cacheable; +import org.skyer.goods.domain.entity.Sku; + +@Data +public class SkuAuditVO implements Cacheable { + + @ApiModelProperty("修改前SKU") + private GoodsSkuAuditVO thisSkuVO; + + @ApiModelProperty("修改后SKU") + private GoodsSkuAuditVO draftSkuVO; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupResVO.java new file mode 100644 index 0000000..7406f4b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupResVO.java @@ -0,0 +1,49 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * 组合商品 + * @description + * @Author wusc + * @create 2021/8/16 9:40 上午 + */ +@Data +public class SkuGroupResVO { + + @ApiModelProperty("id") + @Encrypt + private Long id; + + @ApiModelProperty("skugroup编码") + private String skuGroupCode; + + @ApiModelProperty("spuId") + @Encrypt + private Long spuId; + @ApiModelProperty("spu编码") + private String spuCode; + + @ApiModelProperty("spu名称") + private String spuName; + + @ApiModelProperty("分类") + private String categoryName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("类别") + private Boolean isAllStore; + + @ApiModelProperty("店铺类型") + private List groupStoreResVOList; + + @ApiModelProperty("sku列表") + private List skuGroupSkuResVOList; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupSkuResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupSkuResVO.java new file mode 100644 index 0000000..88febc1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuGroupSkuResVO.java @@ -0,0 +1,38 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * + * @description + * @Author wusc + * @create 2021/8/16 9:45 上午 + */ +@Data +public class SkuGroupSkuResVO { + + @ApiModelProperty("skuId") + private Long skuId; + + @ApiModelProperty("spuCode") + private String spuCode; + + @ApiModelProperty("spu名称") + private String spuName; + + @ApiModelProperty("分类名称") + private String categoryName; + + @ApiModelProperty("sku编码") + private String skuCode; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("数量") + private BigDecimal num; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuInfoResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuInfoResVO.java new file mode 100644 index 0000000..1230c44 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuInfoResVO.java @@ -0,0 +1,41 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @description + * @Author wusc + * @create 2021/6/24 1:54 下午 + */ +@Data +@ApiModel("规格价格详情") +public class SkuInfoResVO { + + @ApiModelProperty("颜色") + private String color; + + @ApiModelProperty("sku") + private String skuCode; + + @ApiModelProperty("素材") + private String material; + + @ApiModelProperty("单位") + private String unit; + + @ApiModelProperty("重量") + private String weight; + + @ApiModelProperty("体积") + private String volume; + + @ApiModelProperty("价格") + private BigDecimal price; + + @ApiModelProperty("成本") + private BigDecimal costPrice; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuPackageVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuPackageVO.java new file mode 100644 index 0000000..fe8652a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SkuPackageVO.java @@ -0,0 +1,33 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.skyer.starter.keyencrypt.core.Encrypt; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author zlb + */ +@Data +public class SkuPackageVO { + @ApiModelProperty("id") + @Encrypt + private Long id; + @ApiModelProperty(value = "商品名称") + private String spuName; + @ApiModelProperty(value = "spuCode") + private String spuCode; + @ApiModelProperty(value = "skuCode") + private String skuCode; + @ApiModelProperty(value = "sku名称") + private String skuName; + @ApiModelProperty(value = "成本价") + private BigDecimal costPrice; + @ApiModelProperty(value = "销售价") + private BigDecimal salesPrice; + @ApiModelProperty(value = "套餐内sku数量") + private Long num; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SpuEsModel.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SpuEsModel.java new file mode 100644 index 0000000..5358bd9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/SpuEsModel.java @@ -0,0 +1,35 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.skyer.starter.keyencrypt.core.Encrypt; + +/** + * @author: lzh + * @date: 2022-01-11 + * @description: + */ +@Data +public class SpuEsModel { + + private Long id; + + @ApiModelProperty(value = "商品名称") + private String name; + + @ApiModelProperty(value = "spu") + private String spuCode; + + @ApiModelProperty(value = "类型1.实物2虚拟") + private Integer type; + + @ApiModelProperty("套餐标识:0-单品,1-套餐") + private Integer setFlag; + + @ApiModelProperty(value = "分类id") + private Long categoryId; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/domain/vo/TotalCategoryResVO.java b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/TotalCategoryResVO.java new file mode 100644 index 0000000..a0d19c0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/domain/vo/TotalCategoryResVO.java @@ -0,0 +1,33 @@ +package org.skyer.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @description + * @Author wusc + * @create 2021/6/23 4:52 下午 + */ +@Data +@ApiModel(description = "统计分类个数") +public class TotalCategoryResVO { + + @ApiModelProperty("全部分类编码") + private Integer allCategoryNum; + + @ApiModelProperty("一级分类编码") + private Integer firstCategoryNum; + + @ApiModelProperty("二级分类编码") + private Integer secondCategoryNum; + + @ApiModelProperty("三级分类编码") + private Integer thirdCategoryNum; + + @ApiModelProperty("四级分配编码") + private Integer forthCategoryNum; + + @ApiModelProperty("五级分配编码") + private Integer fifthCategoryNum; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/annocations/DatasourceType.java b/skyer-goods/src/main/java/org/skyer/goods/infra/annocations/DatasourceType.java new file mode 100644 index 0000000..5369497 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/annocations/DatasourceType.java @@ -0,0 +1,23 @@ +package org.skyer.goods.infra.annocations; + +import java.lang.annotation.*; + +/** + * 数据源类型 + * + * @author xiaoyu.zhao@hand-china.com + */ +@Inherited +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DatasourceType { + + /** + * 数据源类型 + * + * @return 类型 + */ + String[] value(); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/CompanyConstants.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/CompanyConstants.java new file mode 100644 index 0000000..730c0d0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/CompanyConstants.java @@ -0,0 +1,47 @@ +package org.skyer.goods.infra.constant; + + +/** + * 公司常量类 + * + * @author gaokuo.dai@hand-china.com 2018年7月10日下午7:15:05 + */ +public class CompanyConstants { + + /** + * 企业审批后续处理类型 + * + * @author gaokuo.dai@hand-china.com 2018年7月10日下午7:21:13 + */ + public static class CompanyApprovalProcessType { + /** + * 初审 + */ + public static final String FIRST_APPROVAL = "FIRST_APPROVAL"; + /** + * 组织分配 + */ + public static final String ORG_ASSIGN = "ORG_ASSIGN"; + /** + * 角色分配 + */ + public static final String ROLE_ASSIGN = "ROLE_ASSIGN"; + } + + /** + * 企业审批后续处理状态 + * + * @author gaokuo.dai@hand-china.com 2018年7月10日下午7:21:13 + */ + public static class CompanyApprovalProcessStatus { + /** + * 成功 + */ + public static final String SUCCESS = "S"; + /** + * 错误 + */ + public static final String ERROR = "E"; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/Constants.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/Constants.java new file mode 100644 index 0000000..80f2683 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/Constants.java @@ -0,0 +1,330 @@ +package org.skyer.goods.infra.constant; + +import org.skyer.common.SkyerService; + +/** + * 平台常量 + * + * @author gaokuo.dai@hand-china.com 2018年6月12日下午2:38:38 + */ +public interface Constants { + /** + * 国际冠码 值集编码 + */ + String IDD_LOV_CODE = "HPFM.IDD"; + + /** + * 值集禁止状态 + */ + String FORBIDDEN = "FORBIDDEN"; + + /** + * 服务简称 + */ + String APP_CODE = SkyerService.Platform.CODE; + + String SITE_LEVEL_UPPER_CASE = "SITE"; + String TENANT_LEVEL_UPPER_CASE = "TENANT"; + + String CONFIG_CODE_FAVICON = "FAVICON"; + + /** + * 默认平台管理员角色 + */ + String DEFAULT_ROLE_ADMINISTRATOR = "role/site/default/administrator"; + /** + * 默认平台管理员角色 + */ + String DEFAULT_ROLE_ORG_ADMINISTRATOR = "role/organization/default/administrator"; + /** + * 默认模板角色 + */ + String DEFAULT_ROLE_ADMINISTRATOR_TEMPLATE = "role/organization/default/template/administrator"; + + String HPFM_FILE_CONFIG_TYPE_CODE = "FILE"; + String HPFM_TEXT_CONFIG_TYPE_CODE = "TEXT"; + + String HPFM_LOV_VALUES_PRICE_ITEM = "PRICE.ITEM.TYPE"; + + + /** + * kafka topic常量 + * + * @author gaokuo.dai@hand-china.com 2018年7月10日上午11:15:11 + */ + interface KafkaTopics { + /** + * 企业注册 + */ + String HPFM_COMPANY_REGISTER = "hpfm_company_register"; + /** + * 角色权限分配 + */ + String HPFM_HIAM_ROLE_ASSIGN = "hpfm_hiam_role_assign"; + /** + * 企业注册后期处理 + */ + String COMPANY_REGISTER_POST_PROCESSING = "company_register_post_processing"; + } + + /** + * 编码规则代码 + * + * @author gaokuo.dai@hand-china.com 2018年7月10日下午5:27:21 + */ + interface RuleCodes { + /** + * 公司编码 + */ + String HPFM_COMPANY = "HPFM.COMPANY"; + /** + * 集团编码 + */ + String HPFM_GROUP = "HPFM.GROUP"; + /** + * 租户编码 + */ + String HPFM_TENANT = "HPFM.TENANT"; + } + + /** + * DashboardLayout编码 + */ + interface DashboardLayout { + /* + * 默认租户 + */ + Long DEFAULT_TENANT_ID = 0L; + /* + * 默认用户ID + */ + Long DEFAULT_USER_ID = 0L; + /** + * 默认角色ID + */ + Long DEFAULT_ROLE_ID = 0L; + } + + /** + * 数据源常量 + */ + interface Datasource { + /** + * 数据库类型-Oracle + */ + String DB_ORACLE = "ORACLE"; + /** + * 数据库类型-Mysql + */ + String DB_MYSQL = "MYSQL"; + /** + * 数据库类型-Tidb + */ + String DB_TIDB = "TIDB"; + /** + * 数据库类型-SqlServer + */ + String DB_MSSQL = "SQLSERVER"; + /** + * 数据库类型-Hana + */ + String DB_HANA = "HANA"; + + /** + * 数据库JDBC驱动 + */ + String DRIVER_CLASS_MYSQL = "com.mysql.jdbc.Driver"; + String DRIVER_CLASS_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + String DRIVER_CLASS_ORACLE = "oracle.jdbc.driver.OracleDriver"; + /** + * 数据库连接字符串 + */ + String DATA_SOURCE_URL_MYSQL = "jdbc:mysql://${host}:${port}/${database}?characterEncoding=${encoding}"; + String DATA_SOURCE_URL_SQLSERVER = "jdbc:sqlserver://${host};databaseName=${database}"; + String DATA_SOURCE_URL_ORACLE = "jdbc:oracle:thin:@${host}:${port}:${database}"; + String DATA_SOURCE_PURPOSE_DI = "DI"; + String DATA_SOURCE_PURPOSE_DT = "DT"; + String DATA_SOURCE_PURPOSE_DR = "DR"; + + /** + * 驱动类型(自定义,默认) + */ + String CUSTOMIZE = "CUSTOMIZE"; + String DEFAULT = "DEFAULT"; + } + + /** + * DashboardCard编码 + */ + interface DashboardCard { + /** + * 用户维度类型 + */ + String DIMENSION_TYPE_USER = "USER"; + /** + * 租户维度类型 + */ + String DIMENSION_TYPE_TENANT = "TENANT"; + } + + /** + * 属性归属 + */ + interface PropertyOwner { + /** + * 表格 + */ + String TABLE = "TABLE"; + /** + * 列 + */ + String COLUMN = "COLUMN"; + } + + /** + * 表格个性化 + */ + interface UiTable { + + interface SourceType { + String TENANT = "TENANT"; + String ROLE = "ROLE"; + String USER = "USER"; + } + } + + + /** + * 弹性域 + */ + interface Flex { + + /** + * 条件 + */ + interface Symbol { + String AND = "AND"; + String OR = "OR"; + } + + /** + * 运算符 + */ + interface Operator { + String EQUAL = "="; + String LIKE = "LIKE"; + } + + /** + * 层级 + */ + interface Scope { + String TENANT = "T"; + String ROLE = "R"; + String USER = "U"; + } + + interface FieldType { + String INPUT = "INPUT"; + String NUMBER = "NUMBER"; + String LOV = "LOV"; + String LANG = "LANG"; + String SELECT = "SELECT"; + String DATE = "DATE"; + } + } + + /** + * 表单个性化 + */ + interface Personality { + /** + * 层级 + */ + interface Scope { + String TENANT = "T"; + String ROLE = "R"; + String USER = "U"; + } + } + + /** + * 服务器管理 + */ + interface Server { + + String SEPARATOR = "/";// File.separator; + /** + * 操作系统常量 + */ + String OS_LINUX = "LINUX"; + } + + /** + * 个性化规则类型 + */ + interface CustomizeRuleType { + String URL = "URL"; + String JAVA = "JAVA"; + String GROOVY = "GROOVY"; + } + + /** + * 个性化规则位置 + */ + interface CustomizeRulePosition { + String BEFORE = "BEFORE"; + String REPLACE = "REPLACE"; + String AFTER = "AFTER"; + } + + /** + * 导入模板定义 + */ + interface ImportTemplateCode { + /** + * 平台多语言导入模板 + */ + String PROMPT_TEMP = "HPFM.PROMPT"; + /** + * 返回消息管理模板 + */ + String MESSAGE_TEMP = "HPFM.MESSAGE"; + /** + * 值集导入模板 + */ + String LOV_TEMP = "HPFM.LOV"; + /** + * 值集值导入模板 + */ + String LOV_VALUE_TEMP = "HPFM.LOV_VALUE"; + } + + /** + * 审批日志清理类型 + */ + interface ClearLogType { + String CODE = "HPFM.AUDIT_LOG.CLEAR_TYPE"; + String THREE_DAY = "1"; + String ONE_WEEK = "2"; + String ONE_MONTH = "3"; + String THREE_MONTH = "4"; + String SIX_MONTH = "5"; + String ONE_YEAR = "6"; + } + + /** + * 在线用户 + */ + interface OnlineUser { + /** + * 小时数 + */ + Integer HOURS = 24; + /** + * 初始在线人数 + */ + Long INITIAL_ONLINE = 0L; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/DataHierarchyDisplayStyle.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/DataHierarchyDisplayStyle.java new file mode 100644 index 0000000..c9a9515 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/DataHierarchyDisplayStyle.java @@ -0,0 +1,5 @@ +package org.skyer.goods.infra.constant; + +public enum DataHierarchyDisplayStyle { + MODAL, SELECT +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/FndConstants.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/FndConstants.java new file mode 100644 index 0000000..c46ec65 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/FndConstants.java @@ -0,0 +1,344 @@ +package org.skyer.goods.infra.constant; + +/** + * 基础模块常量 + * + * @author gaokuo.dai@hand-china.com 2018年6月12日下午2:38:50 + */ +public interface FndConstants { + + /** + * 个性化页面值类型 + */ + interface AttributeType { + + /** + * 字符串 + */ + String STRING = "STRING"; + + /** + * 数字 + */ + String NUMBER = "NUMBER"; + + /** + * boolean + */ + String BOOLEAN = "BOOLEAN"; + } + + /** + * 个性化页面应用层级 + */ + interface UiDimensionType { + + /** + * 平台级 + */ + String SITE = "SITE"; + + /** + * 租户级 + */ + String TENANT = "TENANT"; + + /** + * 公司及 + */ + String COMPANY = "COMPANY"; + + /** + * 用户级 + */ + String USER = "USER"; + } + + /** + * 缓存Key + */ + interface CacheKey { + + /** + * 模板配置缓存Key + */ + String TEMPLATE_CACHE_KEY = Constants.APP_CODE + ":template:"; + + /** + * 模板配置缓存Key + */ + String DEFAULT_TEMPLATE_CACHE_KEY = Constants.APP_CODE + ":default-template:"; + + /** + * 值集缓存 + */ + String LOV_KEY = Constants.APP_CODE + ":lov"; + + /** + * 配置维护 + */ + String PROFILE_KEY = Constants.APP_CODE + ":profile"; + + /** + * 事件 + */ + String EVENT_KEY = Constants.APP_CODE + ":event"; + + /** + * 个性化表格配置 + */ + String CUSTOM_TABLE_KEY = Constants.APP_CODE + ":custom_table"; + + /** + * 数据屏蔽 + */ + String PERMISSION_KEY = Constants.APP_CODE + ":permission"; + + /** + * 系统配置 服务级功能,所以不加fnd + */ + String CONFIG_KEY = Constants.APP_CODE + ":config"; + + /** + * 多语言描述 + */ + String PROMPT_KEY = Constants.APP_CODE + ":prompt"; + + /** + * 数据权限数据库关系 + */ + String DATABASE_KEY = Constants.APP_CODE + ":database"; + + /** + * 数据源服务关系 + */ + String DATASOURCE_KEY = Constants.APP_CODE + ":datasource"; + + /** + * 静态文本 + */ + String STATIC_TEXT = Constants.APP_CODE + ":text"; + + /** + * 个性化页面 + */ + String Ui_PAGE = Constants.APP_CODE + ":page"; + + /** + * 静态文本头 + */ + String STATIC_TEXT_HEAD = STATIC_TEXT + ":head"; + + /** + * 静态文本行 + */ + String STATIC_TEXT_LINE = STATIC_TEXT + ":line"; + + /** + * 平台卡片 + */ + String DASHBOARD_CARD_KEY = Constants.APP_CODE + ":dashboard_card"; + + /** + * 租户卡片分配 + */ + String DASHBOARD_TENANT_CARD_KEY = Constants.APP_CODE + ":dashboard_tenant_card"; + } + + /** + * 值集类型 + */ + interface LovTypeCode { + /** + * URL型 + */ + String URL = "URL"; + /** + * 自定义SQL型 + */ + String SQL = "SQL"; + /** + * 独立值集型 + */ + String INDEPENDENT = "IDP"; + } + + /** + * 事件调用类型 + */ + interface CallType { + /** + * 方法 + */ + String METHOD = "M"; + /** + * API + */ + String API = "A"; + } + + /** + * 配置维护值应用层级 + */ + interface ProfileLevelCode { + /** + * 配置维护值应用层级-角色级 + */ + String ROLE = "ROLE"; + + /** + * 配置维护值应用层级-用户级 + */ + String USER = "USER"; + + /** + * 配置维护值应用层级-全局(对应该租户下的所有) + */ + String GLOBAL = "GLOBAL"; + } + + /** + * 编码规则应用层级 + */ + interface CodeRuleLevelCode { + + /** + * 全局级 + */ + String GLOBAL = "GLOBAL"; + + /** + * 公司 + */ + String COMPANY = "COM"; + } + + /** + * 应用维度 + */ + interface Level { + /** + * 应用维度-租户级 + */ + String TENANT = "T"; + + /** + * 应用维度-平台级 + */ + String PLATFORM = "P"; + } + + /** + * 编码规则段类型 + */ + interface FieldType { + /** + * 序列 + */ + String SEQUENCE = "SEQUENCE"; + + /** + * 常量 + */ + String CONSTANT = "CONSTANT"; + + /** + * 日期 + */ + String DATE = "DATE"; + + /** + * 变量 + */ + String VARIABLE = "VARIABLE"; + + /** + * uuid + */ + String UUID = "UUID"; + } + + /** + * 重置频率 + */ + interface ResetFrequency { + + /** + * 从不 + */ + String NEVER = "NEVER"; + + /** + * 每年 + */ + String YEAR = "YEAR"; + + /** + * 每季 + */ + String QUARTER = "QUARTER"; + + /** + * 每月 + */ + String MONTH = "MONTH"; + + /** + * 每天 + */ + String DAY = "DAY"; + } + + /** + * 序列 + */ + interface Sequence { + + /** + * 自增步长 + */ + Long STEP = 1L; + + /** + * 记录频率 + */ + Long STEP_NUM = 100L; + } + + /** + * 数据来源 + * + * @author gaokuo.dai@hand-china.com 2018年8月27日下午4:39:03 + */ + interface DataSource { + String SKYER = "SKYER"; + String SRM = "SRM"; + String ERP = "ERP"; + } + + /** + * 数据屏蔽规则类型代码 + */ + interface PermissionRuleTypeCode { + + /** + * sql + */ + String SQL = "SQL"; + + /** + * 数据库前缀 + */ + String PREFIX = "PREFIX"; + } + + /** + * 数据源用户密码返回值 + */ + interface DatasourcePassword { + /** + * 返回前端的密码信息 + */ + String RETURNEDSTRING = "******"; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/HpfmMsgCodeConstants.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/HpfmMsgCodeConstants.java new file mode 100644 index 0000000..c35f1a0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/HpfmMsgCodeConstants.java @@ -0,0 +1,264 @@ +package org.skyer.goods.infra.constant; + +/** + * 维护返回异常信息 + * + * @author xiaoyu.zhao@hand-china.com 2019/01/17 20:25 + */ +public class HpfmMsgCodeConstants { + + /** + * 数据源驱动已经被使用,不可删除 + */ + public static final String ERROR_DELETE_USED_DRIVER = "hpfm.error.deleteUsedDriver"; + + /** + * 缓存Key所需参数获取失败 + */ + public static final String ERROR_CACHE_DATA_NULL = "hpfm.error.cache_data.null"; + + /** + * 事件编码已存在 + */ + public static final String ERROR_EVENT_CODE_EXISTS = "hpfm.error.event.code_exists"; + + /** + * 值集错误:无效的路由名 + */ + public static final String ERROR_LOV_INVALID_ROUTE_NAME = "hpfm.error.lov.invalid_route_name"; + /** + * 当前规则已经被引用,禁止删除 + */ + public static final String ERROR_PERMISSION_RULE_FORBID_DELETE = "hpfm.error.permission_rule_cited"; + /** + * 编码规则未找到 + */ + public static final String ERROR_CODE_RULE_NOT_FOUNT = "hpfm.error.code_rule.not_found"; + /** + * 屏蔽规则类型重复 + */ + public static final String ERROR_PERMISSION_REF_RULE_TYPE_CODE_REPEAT = "hpfm.error.blocking_rule.exist"; + /** + * 租户编码或名称重复 + */ + public static final String ERROR_TENANT_NAME_REPEAT = "hpfm.error.tenant.name_repeat"; + + /** + * 连接异常:不能建立JDBC连接 + */ + public static final String ERROR_CONNECTION = "hpfm.error.jdbc_connection"; + /** + * 查询异常: 数据库中存在多条记录 + */ + public static final String ERR_REPEAT = "hpfm.error.data_repeat"; + /** + * 查询异常: 没有主键或代码 + */ + public static final String ERR_NO_PRIMARY_KEY = "hpfm.error.no_pk"; + + /** + * 起始日期 {0} 晚于终止日期 {1} + */ + public static final String DATE_RANGE_ERROR = "hpfm.error.date.start_later_end"; + + /** + * 操作异常:不能对公有库进行插入操作 + */ + public static final String ERROR_INSERT_TO_DATABASE = "hpfm.error.can_not_insert"; + public static final String ERROR_UPDATE_TO_DATABASE = "hpfm.error.can_not_update"; + public static final String ERROR_DELETE_TO_DATABASE = "hpfm.error.can_not_delete"; + public static final String ERROR_ALTER_TO_PUBLIC = "hpfm.error.database.can_not_alter"; + public static final String ERROR_DROP_TO_PUBLIC = "hpfm.error.database.can_not_drop"; + public static final String ERROR_CREATE_INDEX_TO_PUBLIC = "hpfm.error.database.can_not_create_index"; + public static final String NO_OPERATION_PERMISSION = "hpfm.error.operation_without_permission"; + /** + * 查询到表提示没有改表 + */ + public static final String ERROR_NOT_EXIST_TABLE = "hpfm.error.table.not_exist"; + public static final String ERROR_NOT_EXIST_FIELD = "hpfm.error.field.not_exist"; + + /** + * 同一文本编码有效期重叠 + */ + public static final String REPEAT_DATE = "hpfm.error.text_code.repeat_date"; + /** + * 文本编码不存在 + */ + public static final String TEXT_CODE_NOT_EXISTS = "hpfm.error.text_code.not_exists"; + /** + * 文本编码和语言不存在 + */ + public static final String TEXT_CODE_LANG_NOT_EXISTS = "hpfm.error.text_code_lang.not_exists"; + /** + * saga 发送消息失败 + */ + public static final String SEND_SAGA_MESSAGE_FAIL = "hpfm.error.send_saga_message.fail"; + /** + * 获取规则引擎配置失败 + */ + public static final String GET_RULE_FAILED = "hpfm.error.rule_script.get_rule_failed"; + /** + * 数据为空 + */ + public static final String DASHBOARD_DATA_EMPTY = "hpfm.error.data.empty"; + /** + * 卡片code重复 + */ + public static final String DASHBOARD_CODE_REPEAT = "hpfm.error.code_repeat"; + /** + * 当前角色下已经存在该卡片 + */ + public static final String DASHBOARD_ROLE_CARD_EXISTS = "hpfm.error.role_card.exists"; + /** + * 事件规则数据不匹配 + */ + public static final String ERROR_EVENT_NOT_MATCH = "hpfm.error.event.notMatch"; + + /** + * saga调用失败回调 + */ + public static final String ERROR_SAGA_START_FAILED = "hpfm.error.saga.start"; + + /** + * 当前租户与传入值集租户信息不匹配 + */ + public static final String ERROR_LOV_TENANT_NOT_MATCH = "hpfm.error.lov_tenant.not_match"; + + /** + * 当前租户与传入多语言租户信息不匹配 + */ + public static final String ERROR_PROMPT_TENANT_NOT_MATCH = "hpfm.error.prompt_tenant.not_match"; + + /** + * 当前租户与传入规则引擎租户信息不匹配 + */ + public static final String ERROR_RULE_SCRIPT_TENANT_NOT_MATCH = "hpfm.error.rule_script.not_match"; + + /** + * 当前租户与传入数据权限租户信息不匹配 + */ + public static final String ERROR_PERMISSION_RULE_TENANT_NOT_MATCH = "hpfm.error.permission_rule.not_match"; + /** + * 卡片分配租户传入数据存在重复信息 + */ + public static final String ERROR_CARD_TENANT_REPEAT = "hpfm.error.card_tenant.repeat"; + public static final String ERROR_CARD_CLAUSE_REPEAT = "hpfm.error.card_clause.repeat"; + /** + * 起始时间不能大于截止时间 + */ + public static final String ERROR_DATE_IRREGULARITY = "hpfm.error.date.irregularity"; + public static final String ERROR_DATA_DISABLED = "hpfm.error.data.disabled"; + + /** + * 当前租户与传入静态文本租户信息不匹配 + */ + public static final String ERROR_STATIC_TEXT_TENANT_NOT_MATCH = "hpfm.error.static_text.not_match"; + + public static final String ERROR_EVENT_TENANT_NOT_MATCH = "hpfm.error.event.not_match"; + + /** + * 弹性域模型被使用,不可删除 + */ + public static final String FLEX_MODEL_DELETE = "hpfm.flex.model.delete"; + /** + * 弹性域模型字段被使用,不可删除 + */ + public static final String FLEX_MODEL_FIELD_DELETE = "hpfm.flex.model_field.delete"; + /** + * 弹性域规则明细被使用,不可删除 + */ + public static final String FLEX_RULE_DETAIL_DELETE = "hpfm.flex.rule_detail.delete"; + /** + * 弹性域字段初始化失败 + */ + public static final String FLEX_MODEL_FIELD_INIT = "hpfm.flex.model_field.init"; + public static final String ERROR_LOV_TENANT_REPEAT = "hpfm.lov.tenant.repeat"; + public static final String ERROR_LOV_SITE_COPY_FAIL = "hpfm.lov.site.copy_fail"; + public static final String ERROR_LOV_VIEW_TENANT_REPEAT = "hpfm.lov_view.tenant.repeat"; + public static final String ERROR_LOV_VIEW_SITE_COPY_FAIL = "hpfm.lov_view.site.copy_fail"; + /** + * 模板配置已经存在,不可重复添加 + */ + public static final String ERROR_TEMPLATE_CONFIG_EXISTS = "hpfm.template_config.exists"; + /** + * 当前数据下已经分配该模板,不可重复添加 + */ + public static final String ERROR_TEMPLATE_ASSIGN_EXISTS = "hpfm.template_assign.exists"; + public static final String ERROR_FORM_HEADER_NULL = "hpfm.error.form_header.null"; + public static final String ERROR_TEMPLATE_ASSIGN_DELETE_DEFAULT = "hpfm.error.template_assign.delete_default"; + + public static final String ERROR_DATASOURCE_REGISTER_FAIL = "hpfm.error.datasource_register.fail"; + public static final String ERROR_GET_CONNECTION_FAIL = "hpfm.error.get_connection.fail"; + public static final String ERROR_RELATIONAL_PARAM_ILLEGAL = "hpfm.relational_param.illegal"; + public static final String ERROR_DATASOURCE_ID_NULL = "hpfm.error.datasource_id.null"; + + /** + * 数据组,数据已经存在 + */ + public static final String ERROR_GROUP_DATA_EXISTS = "hpfm.error.group_data_exists"; + public static final String ERROR_TEMPLATE_ALREADY_REFERENCED = "hpfm.error.template.is_referenced"; + /** + * 平台多语言参数校验失败 + */ + public static final String ERROR_PROMPT_PARAM_NOT_NULL = "hpfm.error.prompt.param_not_null"; + + /** + * 导出错误信息 + */ + public static final String ERROR_EXPORT_TASK_NOT_EXISTS = "hpfm.error.export_task.not_exists"; + public static final String ERROR_EXPORT_TASK_CANCEL_FAILED = "hpfm.error.export.cancel_failed"; + public static final String ERROR_DRIVER_EXISTS = "hpfm.error.driver.exists"; + /** + * 自定义驱动无法测试连接 + */ + public static final String ERROR_CUSTOM_DRIVER = "hpfm.error.custom_driver"; + /** + * 父级未启用或父级不允许操作 + */ + public static final String ERROR_PARENT_DISABlE = "error.parent.disable"; + + public static final String SEND_SOCKET = "hpfm.error.send_socket"; + + public static final String REFRESH_CACHE = "hpfm.error.prompt.refresh_cache"; + /** + * 数据异常:名称重复 + */ + public static final String ERROR_MULTIPLE_NAME = "error.multiple.name"; + /** + * 值集没有父级值集 + */ + public static final String ERROR_LOV_IMPORT_HAVE_NOT_PARENT = "error.lov.import.have_not_parent"; + /** + * 父级值集值不存在或未启用 + */ + public static final String ERROR_LOV_IMPORT_PARENT_VALUE_INVALID = "error.lov.import.parent_value_invalid"; + /** + * 数据层级配置 下拉列表 数量超过最大配置数量 + */ + public static final String ERROR_DATA_HIERARCHY_SELECT_EXCEEDS_MAXIMUM_NUMBER_LIMIT = + "error.data_hierarchy.select.exceeds_maximum_number_limit"; + /** + * 数据层级配置显示样式与父级层级不匹配 + */ + public static final String ERROR_PARENT_DISPLAY_NOT_MATCH = "error.data_hierarchy.display.not_match_parent"; + /** + * 数据层级配置显示样式与父级层级不匹配 + */ + public static final String ERROR_CLUSTER_ASSIGN_SERVERS = "hpfm.error.clusterAssignServers"; + /** + * 值集编码为: {0} 的父级值集不存在 + */ + public static final String ERROR_PARENT_LOV_NOT_NULL = "hpfm.error.lov.parentLovNotNull"; + /** + * 值集错误:URL 值集 URL 内容不可为空 + */ + public static final String ERROR_LOV_URL_NOT_NULL = "hpfm.error.lov.urlNotNull"; + /** + * 值集错误:SQL 值集 SQL 内容不可为空 + */ + public static final String ERROR_LOV_SQL_NOT_NULL = "hpfm.error.lov.sqlNotNull"; + /** + * 值集错误:导入值集时不允许更新LovType内容 + */ + public static final String ERROR_LOV_TYPE_NOT_MATCH = "hpfm.error.lovTypeNotMatch"; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/HrConstants.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/HrConstants.java new file mode 100644 index 0000000..5d87c81 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/HrConstants.java @@ -0,0 +1,44 @@ +package org.skyer.goods.infra.constant; + +/** + *

+ * Hr 业务常量类 + *

+ * + * @author qingsheng.chen 2018/6/22 星期五 14:54 + */ +public class HrConstants { + private HrConstants() {} + + public static class LovCode { + /** + * 数据来源Lov code + */ + public static final String DATA_SOURCE = "HPFM.DATA_SOURCE"; + } + + + /** + * 维度类型 + * + * @author jian.zhang02@hand-china.com 2018年6月26日下午3:14:53 + */ + public static class DimensionType { + /** + * 平台级 + */ + public static final String DIMENSION_PLATFORM_TYPE = "platform"; + /** + * 租户级 + */ + public static final String DIMENSION_TENANT_TYPE = "tenant"; + /** + * 公司级 + */ + public static final String DIMENSION_COMPANY_TYPE = "company"; + /** + * 用户级 + */ + public static final String DIMENSION_USER_TYPE = "user"; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/ObjectConstant.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/ObjectConstant.java new file mode 100644 index 0000000..e1dce79 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/ObjectConstant.java @@ -0,0 +1,103 @@ +package org.skyer.goods.infra.constant; + +/** + * @description + * @Author wusc + * @create 2021/6/25 3:27 下午 + */ +public class ObjectConstant { + + public static class Status { + /** + * 启用 + */ + public static final Integer OPEN = 1; + + /** + * 警用 + */ + public static final Integer CLOSE = 0; + } + + + public static class DeleteFlag { + /** + * 未删除 + */ + public static final Integer NO = 0; + + /** + * 删除 + */ + public static final Integer YES = 1; + } + + public static class AttributeType { + /** + * 属性关联分类 + */ + public static final Integer CATEGORY_TYPE = 0; + + /** + * 属性关联商品 + */ + public static final Integer SPU_TYPE = 1; + } + + + public static class AttributeValueType { + /** + * 单选 + */ + public static final Integer SINGLE = 1; + + /** + * 多选 + */ + public static final Integer MULTIPLE = 2; + + /** + * 文本 + */ + public static final Integer TEXT = 3; + + /** + * 下拉 + */ + public static final Integer PULL_DOWN = 4; + } + + public static class CodeRule { + + public static final String ATTRIBUTE_CODE = "HPFM.COMPANY"; + + public static final String BRAND_CODE = "HPFM.COMPANY"; + + public static final String CATEGORY_CODE = "HPFM.COMPANY"; + + public static final String GOODS_CODE = "HPFM.COMPANY"; + + public static final String SKU_CODE = "HPFM.COMPANY"; + } + + public static class LevelValue { + public static final String ATTRIBUTE_LEVEL = "GLOBAL"; + + public static final String BRAND_LEVEL = "GLOBAL"; + + public static final String CATEGORY_LEVEL = "GLOBAL"; + + public static final String GOODS_LEVEL = "GLOBAL"; + + public static final String SKU_LEVEL = "GLOBAL"; + } + public static Integer FORM_TYPE_TEXT= 3; + + public static class EsKey { + public static final String SPU_INDEX = "goods_spu_index_01"; + + public static final String SKU_INDEX = "goods_sku_index_01"; + } + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/constant/RedisKey.java b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/RedisKey.java new file mode 100644 index 0000000..4657bed --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/constant/RedisKey.java @@ -0,0 +1,22 @@ +package org.skyer.goods.infra.constant; + +/** + * 用于redis缓存key的定义 + * @description + * @Author wusc + * @create 2021/6/29 10:37 上午 + */ +public class RedisKey { + + public static final String PREFIX = "sgoo_"; + + /** + * 类目key + */ + public static final String CATEGORY_KEY = "category_"; + + /** + * 所有类目缓存key + */ + public static final String CATEGORY_ALL = PREFIX + "category_all"; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/BrandConvertor.java b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/BrandConvertor.java new file mode 100644 index 0000000..5babae4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/BrandConvertor.java @@ -0,0 +1,22 @@ +package org.skyer.goods.infra.convertor; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.skyer.goods.api.dto.BrandReqDTO; +import org.skyer.goods.domain.entity.Brand; + +/** + * @description + * @Author wusc + * @create 2021/6/25 2:03 下午 + */ +@Mapper(componentModel="spring") +public interface BrandConvertor { + + @Mappings({ + @Mapping(source = "brandName",target = "name"), + + }) + Brand reqDtoToBrand(BrandReqDTO brandReqDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CategoryConvertor.java b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CategoryConvertor.java new file mode 100644 index 0000000..d30e6dd --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CategoryConvertor.java @@ -0,0 +1,25 @@ +package org.skyer.goods.infra.convertor; + +import org.mapstruct.Mapper; +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.api.dto.CategorySaveDTO; +import org.skyer.goods.api.dto.CategoryTreeQueryDTO; +import org.skyer.goods.domain.entity.Category; + +@Mapper(componentModel="spring") +public interface CategoryConvertor { + + /** + * 保存分类对象转换为实体对象 + * @param categorySaveDTO 保存对象,包含数据 + * @return 实体对象 + */ + Category CategorySaveDTOTOCategory(CategorySaveDTO categorySaveDTO); + + /** + * 树查询对象转为通用查询对象 + * @param categoryTreeQueryDTO 查询树的对象 + * @return 通用查询对象 + */ + CategoryQueryDTO CategoryTreeQueryDTOToCategoryQueryDTO(CategoryTreeQueryDTO categoryTreeQueryDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CommonConvertor.java b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CommonConvertor.java new file mode 100644 index 0000000..dbcb582 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/CommonConvertor.java @@ -0,0 +1,80 @@ +package org.skyer.goods.infra.convertor; + +import java.util.List; +import java.util.Map; + +import org.skyer.core.convert.CommonConverter; + +/** + * 通用对象转换工具 + * + * @author min.wang01@hand-china.com 2018/08/08 11:52 + */ +public class CommonConvertor { + /** + * List对象转换 + * + * @param targetClazz 目标对象class + * @param sourceList 源对象list + * @param + * @param + * @return + */ + public static List listConvertor(Class targetClazz, List sourceList) { + return listConvertor(targetClazz, sourceList, null); + } + + /** + * + * List对象转换 + * + * @param targetClazz + * @param sourceList + * @param rule 自定义映射规则(target字段,source字段) + * @return + */ + public static List listConvertor(Class targetClazz, List sourceList, Map rule) { + return CommonConverter.listConverter(targetClazz, sourceList, rule); + } + + /** + * List对象转换(过滤当前多语言) + * + * @param targetClazz + * @param field 多语言字段名 + * @param sourceList + * @return + */ + public static List listConvertor(Class targetClazz, String field, List sourceList) { + return listConvertor(targetClazz, field, sourceList, null); + } + + /** + * + * description + * + * @param targetClazz + * @param field 多语言字段名 + * @param sourceList + * @param rule 自定义映射规则(target字段,source字段) + * @return + */ + public static List listConvertor(Class targetClazz, String field, List sourceList, + Map rule) { + return CommonConverter.listConverter(targetClazz, field, sourceList, rule); + } + + + /** + * javaBean对象转换 + * + * @param targetClazz + * @param sourceObject + * @param + * @param + * @return + */ + public static T beanConvert(Class targetClazz, V sourceObject) { + return CommonConverter.beanConvert(targetClazz, sourceObject); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/GoodsConvertor.java b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/GoodsConvertor.java new file mode 100644 index 0000000..c62c281 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/GoodsConvertor.java @@ -0,0 +1,37 @@ +package org.skyer.goods.infra.convertor; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.skyer.goods.api.dto.GoodsReqDTO; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.vo.GoodsDetailResVO; + +/** + * @description + * @Author wusc + * @create 2021/6/28 10:39 上午 + */ +@Mapper(componentModel="spring") +public interface GoodsConvertor { + + /** + * req转商品 + * @param goodsReqDTO + * @return + */ + @Mappings( + @Mapping(source = "code",target = "spuCode") + ) + Spu reqToGoods(GoodsReqDTO goodsReqDTO); + + /** + * 商品转res + * @param spu + * @return + */ + @Mappings( + @Mapping(source = "spuCode",target = "code") + ) + GoodsDetailResVO goodsToRes(Spu spu); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/SkuGroupConvertor.java b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/SkuGroupConvertor.java new file mode 100644 index 0000000..f3b5f17 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/convertor/SkuGroupConvertor.java @@ -0,0 +1,20 @@ +package org.skyer.goods.infra.convertor; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.skyer.goods.api.dto.GoodsGroupReqDTO; +import org.skyer.goods.domain.entity.SkuGroup; + +/** + * @description + * @Author wusc + * @create 2021/8/13 2:52 下午 + */ +@Mapper(componentModel="spring") +public interface SkuGroupConvertor { + + SkuGroup dtoTOSkuGroup(GoodsGroupReqDTO goodsGroupReqDTO); + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/enums/DBPoolTypeEnum.java b/skyer-goods/src/main/java/org/skyer/goods/infra/enums/DBPoolTypeEnum.java new file mode 100644 index 0000000..6c4ecd4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/enums/DBPoolTypeEnum.java @@ -0,0 +1,63 @@ +package org.skyer.goods.infra.enums; + +/** + * + * 连接池类型 + * + * @author xianzhi.chen@hand-china.com 2018年10月23日下午2:47:03 + */ +public enum DBPoolTypeEnum { + /** + * C3p0 + */ + C3P0("C3p0"), + + /** + * Dbcp + */ + DBCP2("Dbcp2"), + + /** + * Druid + */ + DRUID("Druid"), + + /** + * No + */ + NO("No"); + + private final String value; + + DBPoolTypeEnum(final String value) { + this.value = value; + } + + public static DBPoolTypeEnum valueOf2(String arg) { + switch (arg) { + case "C3p0": + return C3P0; + case "Dbcp2": + return DBCP2; + case "Druid": + return DRUID; + case "No": + return NO; + default: + return NO; + } + } + + public static boolean isInEnum(String value) { + for (DBPoolTypeEnum dbPoolType : DBPoolTypeEnum.values()) { + if (dbPoolType.getValue().equals(value)) { + return true; + } + } + return false; + } + + public String getValue() { + return this.value; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/enums/DatabaseTypeEnum.java b/skyer-goods/src/main/java/org/skyer/goods/infra/enums/DatabaseTypeEnum.java new file mode 100644 index 0000000..05774ce --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/enums/DatabaseTypeEnum.java @@ -0,0 +1,70 @@ +package org.skyer.goods.infra.enums; + +import org.skyer.goods.infra.constant.Constants; + +/** + * + * 数据库类型 + * + * @author xianzhi.chen@hand-china.com 2018年10月23日下午2:47:03 + */ +public enum DatabaseTypeEnum { + /** + * MySQL + */ + MYSQL("MYSQL"), + + /** + * SqlServer + */ + SQLSERVER("SQLSERVER"), + + /** + * Oracle + */ + ORACLE("ORACLE"), + + /** + * TiDB + */ + TIDB("TIDB"), + + /** + * OtherDB + */ + OTHERDB("OTHERDB"); + + private final String value; + + DatabaseTypeEnum(final String value) { + this.value = value; + } + + public static DatabaseTypeEnum valueOf2(String arg) { + switch (arg) { + case Constants.Datasource.DB_MYSQL: + return MYSQL; + case Constants.Datasource.DB_MSSQL: + return SQLSERVER; + case Constants.Datasource.DB_ORACLE: + return ORACLE; + case Constants.Datasource.DB_TIDB: + return MYSQL; + default: + return OTHERDB; + } + } + + public static boolean isInEnum(String value) { + for (DatabaseTypeEnum databaseType : DatabaseTypeEnum.values()) { + if (databaseType.getValue().equals(value)) { + return true; + } + } + return false; + } + + public String getValue() { + return this.value; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/ChinaZoingRemoteService.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/ChinaZoingRemoteService.java new file mode 100644 index 0000000..c8473a6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/ChinaZoingRemoteService.java @@ -0,0 +1,39 @@ +package org.skyer.goods.infra.feign; + +import org.skyer.common.SkyerService; +import org.skyer.goods.domain.vo.ChinaZoingRemoteVO; +import org.skyer.goods.infra.feign.impl.ChinaZoingRemoteServiceImpl; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @description + * @Author wusc + * @create 2021/8/16 3:57 下午 + */ +@FeignClient(value = SkyerService.Platform.NAME, fallback = ChinaZoingRemoteServiceImpl.class, path = "/v1/cnareaAdministrativeDivision") +public interface ChinaZoingRemoteService { + + + /** + * 根据Id获取中国行政地区表信息 + *

+ * curl -X GET --header 'Accept: text/html' 'http://api.skyer.org/spfm/v1/cnareaAdministrativeDivision/details?areaCode=sss' + *

+ * { + * "levelThreeAreaCode": 110101001008, + * "levelTwoAreaCode": 110101001000, + * "levelOneAreaCode": 110101000000, + * "levelThreeAreaName": "黄图岗社区居委会", + * "levelTwoAreaName": "东华门街道", + * "levelOneAreaName": "东城区" + * } + * + * @param + * @return + */ + @GetMapping("/details") + ResponseEntity showDetails(@RequestParam(value = "areaCode") Long areaCode); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovManageRemoteService.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovManageRemoteService.java new file mode 100644 index 0000000..6dfaf00 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovManageRemoteService.java @@ -0,0 +1,111 @@ +package org.skyer.goods.infra.feign; + +import org.skyer.boot.platform.lov.dto.LovDTO; +import org.skyer.boot.platform.lov.dto.LovValueDTO; +import org.skyer.common.SkyerService; +import org.skyer.goods.infra.feign.dto.LovHeaderDto; +import org.skyer.goods.infra.feign.dto.LovValueDto; +import org.skyer.goods.infra.feign.impl.LovManageRemoteServiceImpl; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.annotation.Primary; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 值集管理API(租户级) 远程 Feign 调用 + * + * @author chenzz + */ +@Primary +@FeignClient(value = SkyerService.Platform.NAME, fallback = LovManageRemoteServiceImpl.class, path = "/v1") +public interface LovManageRemoteService { + + @GetMapping("/{organizationId}/lov-headers-code/{lovCode}") + ResponseEntity queryHeaderByCode( + @PathVariable("organizationId") Long tenantId, + @PathVariable String lovCode); + + /** + * 插入值集头 + * @param tenantId + * @param lovHeader + * @return + */ + @PostMapping("/{organizationId}/lov-headers") + ResponseEntity addLovHeader( + @PathVariable("organizationId") Long tenantId, + @RequestBody LovHeaderDto lovHeader); + + /** + * 插入值集值 + * @param tenantId + * @param lovValue + * @return + */ + @PostMapping("/{organizationId}/lov-values") + ResponseEntity addLovValues( + @PathVariable("organizationId") Long tenantId, + @RequestBody LovValueDto lovValue); + + /** + * 更新值集头 + * @param tenantId + * @param lovHeader + * @return + */ + @PutMapping("/{organizationId}/lov-headers") + ResponseEntity updateLovHeadersByPrimaryKey( + @PathVariable("organizationId") Long tenantId, + @RequestBody LovDTO lovHeader); + + /** + * 根据值集头ID查询值集值 + * @param tenantId + * @param lovId + * @param value + * @param meaning + * @return + */ + @GetMapping("/{organizationId}/lov-headers/{lovId}/values-list") + ResponseEntity> listValuesByLovId( + @PathVariable("organizationId") Long tenantId, + @PathVariable Long lovId, + @RequestParam(value = "value", required = false) String value, + @RequestParam(value = "meaning", required = false) String meaning); + + /** + * 更新值集 + * @param tenantId + * @param lovValue + * @return + */ + @PutMapping("/{organizationId}/lov-values") + ResponseEntity updateLovValuesByPrimaryKey( + @PathVariable("organizationId") Long tenantId, + @RequestBody LovValueDto lovValue); + + /** + * 批量删除值集头 + * @param tenantId + * @param lovHeaders + * @return + */ + @DeleteMapping("/{organizationId}/lov-headers") + ResponseEntity batchDeleteLovHeadersByPrimaryKey( + @PathVariable("organizationId") Long tenantId, + @RequestBody List lovHeaders); + + /** + * 批量删除值集 + * @param tenantId + * @param lovValues + * @return + */ + @DeleteMapping("/{organizationId}/lov-values") + ResponseEntity batchDeleteLovValuesByPrimaryKey( + @PathVariable("organizationId") Long tenantId, + @RequestBody List lovValues); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovRemoteService.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovRemoteService.java new file mode 100644 index 0000000..a936e6f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/LovRemoteService.java @@ -0,0 +1,150 @@ +package org.skyer.goods.infra.feign; + +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import org.skyer.boot.platform.lov.annotation.LovValue; +import org.skyer.boot.platform.lov.dto.LovDTO; +import org.skyer.boot.platform.lov.dto.LovValueDTO; +import org.skyer.common.SkyerService; +import org.skyer.goods.infra.feign.dto.LovValueDto; +import org.skyer.goods.infra.feign.impl.LovRemoteServiceImpl; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.annotation.Primary; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; +import java.util.Map; + +/** + * 值集API 远程 Feign 调用 + * + * @author chenzz + */ +@Primary +@FeignClient(value = SkyerService.Platform.NAME, fallback = LovRemoteServiceImpl.class, path = "/v1") +public interface LovRemoteService { + + + /** + * 获取值集信息 + * + * @param lovCode + * @param organizationId + * @param tenantId + * @return + */ + @GetMapping("/{organizationId}/lovs/info") + ResponseEntity queryLovInfo( + @RequestParam String lovCode, + @PathVariable("organizationId") Long organizationId, + @RequestParam(required = false) Long tenantId); + + + /** + * 集成获取值集数据 + * + * @param lovCode + * @param organizationId + * @param tag + * @param page + * @param size + * @param params + * @param tenantId + * @return + */ + @GetMapping("/{organizationId}/lovs/data") + ResponseEntity>> queryLovData( + @RequestParam String lovCode, + @PathVariable("organizationId") Long organizationId, + @RequestParam(required = false) String tag, + @RequestParam(required = false) Integer page, + @RequestParam(required = false) Integer size, + @RequestParam Map params, + @RequestParam(required = false) Long tenantId); + + /** + * 获取值集SQL + * + * @param lovCode + * @param organizationId + * @param tenantId + * @return + */ + @GetMapping(path = "/{organizationId}/lovs/sql") + ResponseEntity queryLovSql( + @RequestParam String lovCode, + @PathVariable("organizationId") Long organizationId, + @RequestParam(required = false) Long tenantId); + + /** + * 获取值集值 + * + * @param lovCode + * @param organizationId + * @param tag + * @param tenantId + * @return + */ + @GetMapping(path = "/{organizationId}/lovs/all-value") + ResponseEntity> queryAllLovValue( + @RequestParam String lovCode, + @PathVariable("organizationId") Long organizationId, + @RequestParam(required = false) String tag, + @RequestParam(required = false) Long tenantId); + + + /** + * 批量获取值集值 + * + * @param queryMap + * @param organizationId + * @param tenantId + * @return + */ + @GetMapping(path = "/{organizationId}/lovs/value/batch") + @ApiImplicitParams({ + @ApiImplicitParam(name = "queryMap", value = "批量查询条件,形式:返回key=code", paramType = "query", example = "codeOne=CODE1&codeTwo=CODE2", required = true), + @ApiImplicitParam(name = "tenantId", value = "租户ID", paramType = "query") + }) + ResponseEntity>> batchQueryLovValue( + @RequestParam Map queryMap, + @PathVariable("organizationId") Long organizationId, + @RequestParam(required = false) Long tenantId); + + + /** + * 获取值集信息 + * + * @param lovCode + * @param tenantId + * @return + */ + @GetMapping("/lovs/info") + ResponseEntity queryLovInfoSite( + @RequestParam String lovCode, + @RequestParam(required = false) Long tenantId); + + /** + * 集成获取值集数据 + * + * @param lovCode + * @param tenantId + * @param tag + * @param page + * @param size + * @param params + * @return + */ + @GetMapping("/lovs/data") + ResponseEntity>> queryLovDataSite( + @RequestParam String lovCode, + @RequestParam(required = false) Long tenantId, + @RequestParam(required = false) String tag, + @RequestParam(required = false) Integer page, + @RequestParam(required = false) Integer size, + @RequestParam Map params + ); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/OnlineShopRemoteService.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/OnlineShopRemoteService.java new file mode 100644 index 0000000..0edb033 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/OnlineShopRemoteService.java @@ -0,0 +1,30 @@ +package org.skyer.goods.infra.feign; + +import org.skyer.common.SkyerService; +import org.skyer.goods.domain.vo.OnlineShopVO; +import org.skyer.goods.infra.feign.impl.OnlineShopRemoteServiceImpl; +import org.skyer.starter.keyencrypt.core.Encrypt; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/8/16 3:57 下午 + */ +@FeignClient(value = SkyerService.Channel.NAME, fallback = OnlineShopRemoteServiceImpl.class, path = "/v1/online/shop") +public interface OnlineShopRemoteService { + + + /** + * 根据sku列表查询商品 + * @param + * @return + */ + @GetMapping("/details") + ResponseEntity showDetails(@RequestParam(value = "id") @Encrypt Long id); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/UserDetailRemoteService.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/UserDetailRemoteService.java new file mode 100644 index 0000000..c355c3f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/UserDetailRemoteService.java @@ -0,0 +1,36 @@ +package org.skyer.goods.infra.feign; + +import org.skyer.common.SkyerService; +import org.skyer.goods.infra.feign.impl.UserDetailRemoteServiceImpl; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 用户信息远程 Feign 调用 + * + * @author qingsheng.chen@hand-china.com + */ +@FeignClient(value = SkyerService.Oauth.NAME, fallback = UserDetailRemoteServiceImpl.class, path = "/oauth/api/user") +public interface UserDetailRemoteService { + /** + * 存储用户附加信息 + * + * @param accessToken 用户授权token + * @param dataHierarchyCode 数据层级编码 + * @param dataHierarchyValue 数据层级值 + * @param dataHierarchyMeaning 数据层级值展示值 + * @param childrenDataHierarchyCodes 子数据层级编码 + * @return 存储用户附加信息 + */ + @PostMapping("/addition-info") + ResponseEntity storeUserAdditionInfo(@RequestParam("access_token") String accessToken, + @RequestParam("dataHierarchyCode") String dataHierarchyCode, + @RequestParam("dataHierarchyValue") String dataHierarchyValue, + @RequestParam("dataHierarchyMeaning") String dataHierarchyMeaning, + @RequestParam(value = "childrenDataHierarchyCodes", + required = false) List childrenDataHierarchyCodes); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovHeaderDto.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovHeaderDto.java new file mode 100644 index 0000000..630d714 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovHeaderDto.java @@ -0,0 +1,39 @@ +package org.skyer.goods.infra.feign.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * @author yuelinsoft + */ +@Data +public class LovHeaderDto implements Serializable { + + @ApiModelProperty("租户ID") + private Long tenantId; + @Size( + max = 30 + ) + @ApiModelProperty("值集代码") + private String lovCode; + @ApiModelProperty("值集名称") + private String lovName; + @Size( + max = 30 + ) + @ApiModelProperty("值集类型") + private String lovTypeCode; + + @ApiModelProperty("是否必须分页") + private Integer mustPageFlag; + + @NotNull + @Range(min = 0, max = 1) + @ApiModelProperty("是否启用") + private Integer enabledFlag; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovValueDto.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovValueDto.java new file mode 100644 index 0000000..9cc91b5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/dto/LovValueDto.java @@ -0,0 +1,40 @@ +package org.skyer.goods.infra.feign.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; +import org.skyer.mybatis.domain.AuditDomain; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author yuelinsoft + */ +@Data +@ApiModel("值集value") +public class LovValueDto extends AuditDomain implements Serializable { + + @ApiModelProperty("值集值ID") + private Long lovValueId; + @ApiModelProperty("值集ID") + private Long lovId; + @ApiModelProperty("值集代码") + private String lovCode; + @ApiModelProperty("值集值") + private String value; + @ApiModelProperty("含义") + private String meaning; + @ApiModelProperty("描述") + private String description; + @ApiModelProperty("租户ID") + private Long tenantId; + @NotNull + @ApiModelProperty("排序号") + private Integer orderSeq; + @NotNull + @Range(min = 0, max = 1) + @ApiModelProperty("生效标识") + private Integer enabledFlag; +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/ChinaZoingRemoteServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/ChinaZoingRemoteServiceImpl.java new file mode 100644 index 0000000..1194faa --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/ChinaZoingRemoteServiceImpl.java @@ -0,0 +1,15 @@ +package org.skyer.goods.infra.feign.impl; + +import org.skyer.goods.domain.vo.ChinaZoingRemoteVO; +import org.skyer.goods.infra.feign.ChinaZoingRemoteService; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +@Component +public class ChinaZoingRemoteServiceImpl implements ChinaZoingRemoteService { + + @Override + public ResponseEntity showDetails(Long areaCode) { + return null; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovManageRemoteServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovManageRemoteServiceImpl.java new file mode 100644 index 0000000..c96111c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovManageRemoteServiceImpl.java @@ -0,0 +1,57 @@ +package org.skyer.goods.infra.feign.impl; + +import org.skyer.boot.platform.lov.dto.LovDTO; +import org.skyer.boot.platform.lov.dto.LovValueDTO; +import org.skyer.goods.infra.feign.LovManageRemoteService; +import org.skyer.goods.infra.feign.dto.LovHeaderDto; +import org.skyer.goods.infra.feign.dto.LovValueDto; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author chenzz + */ +@Component +public class LovManageRemoteServiceImpl implements LovManageRemoteService { + @Override + public ResponseEntity queryHeaderByCode(Long tenantId, String lovCode) { + return null; + } + + @Override + public ResponseEntity addLovHeader(Long tenantId, LovHeaderDto lovHeader) { + return null; + } + + @Override + public ResponseEntity addLovValues(Long tenantId, LovValueDto lovValue) { + return null; + } + + @Override + public ResponseEntity updateLovHeadersByPrimaryKey(Long tenantId, LovDTO lovHeader) { + return null; + } + + @Override + public ResponseEntity> listValuesByLovId(Long tenantId, Long lovId, String value, String meaning) { + return null; + } + + @Override + public ResponseEntity updateLovValuesByPrimaryKey(Long tenantId, LovValueDto lovValue) { + return null; + } + + @Override + public ResponseEntity batchDeleteLovHeadersByPrimaryKey(Long tenantId, List lovHeaders) { + return null; + } + + @Override + public ResponseEntity batchDeleteLovValuesByPrimaryKey(Long tenantId, List lovValues) { + return null; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovRemoteServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovRemoteServiceImpl.java new file mode 100644 index 0000000..c531c45 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/LovRemoteServiceImpl.java @@ -0,0 +1,52 @@ +package org.skyer.goods.infra.feign.impl; + +import org.skyer.boot.platform.lov.dto.LovDTO; +import org.skyer.boot.platform.lov.dto.LovValueDTO; +import org.skyer.goods.infra.feign.LovRemoteService; +import org.skyer.goods.infra.feign.dto.LovValueDto; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * @author chenzz + */ +@Component +public class LovRemoteServiceImpl implements LovRemoteService { + @Override + public ResponseEntity queryLovInfo(String lovCode, Long organizationId, Long tenantId) { + return null; + } + + @Override + public ResponseEntity>> queryLovData(String lovCode, Long organizationId, String tag, Integer page, Integer size, Map params, Long tenantId) { + return null; + } + + @Override + public ResponseEntity queryLovSql(String lovCode, Long organizationId, Long tenantId) { + return null; + } + + @Override + public ResponseEntity> queryAllLovValue(String lovCode, Long organizationId, String tag, Long tenantId) { + return null; + } + + @Override + public ResponseEntity>> batchQueryLovValue(Map queryMap, Long organizationId, Long tenantId) { + return null; + } + + @Override + public ResponseEntity queryLovInfoSite(String lovCode, Long tenantId) { + return null; + } + + @Override + public ResponseEntity>> queryLovDataSite(String lovCode, Long tenantId, String tag, Integer page, Integer size, Map params) { + return null; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/OnlineShopRemoteServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/OnlineShopRemoteServiceImpl.java new file mode 100644 index 0000000..621a0b5 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/OnlineShopRemoteServiceImpl.java @@ -0,0 +1,23 @@ +package org.skyer.goods.infra.feign.impl; + +import org.skyer.core.exception.CommonException; +import org.skyer.goods.domain.vo.OnlineShopVO; +import org.skyer.goods.infra.feign.OnlineShopRemoteService; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/8/16 4:09 下午 + */ +@Component +public class OnlineShopRemoteServiceImpl implements OnlineShopRemoteService { + + @Override + public ResponseEntity showDetails(Long id) { + throw new CommonException("查询网店调用有误"); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/UserDetailRemoteServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/UserDetailRemoteServiceImpl.java new file mode 100644 index 0000000..ced7cd8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/feign/impl/UserDetailRemoteServiceImpl.java @@ -0,0 +1,24 @@ +package org.skyer.goods.infra.feign.impl; + +import org.skyer.core.exception.CommonException; +import org.skyer.goods.infra.feign.UserDetailRemoteService; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 用户信息远程调用失败回调 + * + * @author qingsheng.chen@hand-china.com + */ +@Component +public class UserDetailRemoteServiceImpl implements UserDetailRemoteService { + + @Override + public ResponseEntity storeUserAdditionInfo(String accessToken, String dataHierarchyCode, String dataHierarchyValue, + String dataHierarchyMeaning, List childrenDataHierarchyCodes) { + throw new CommonException( + "Error store user addition info[" + dataHierarchyCode + ":" + dataHierarchyValue + "]."); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/handler/MessageHandler.java b/skyer-goods/src/main/java/org/skyer/goods/infra/handler/MessageHandler.java new file mode 100644 index 0000000..85bb5c6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/handler/MessageHandler.java @@ -0,0 +1,63 @@ +package org.skyer.goods.infra.handler; + +import org.apache.commons.lang3.StringUtils; +import org.skyer.boot.message.constant.WebSocketConstant; +import org.skyer.boot.message.entity.Msg; +import org.skyer.goods.infra.constant.HpfmMsgCodeConstants; +import org.skyer.websocket.helper.SocketMessageHandler; +import org.skyer.websocket.vo.MsgVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import org.skyer.core.exception.CommonException; + +/** + * description + * + * @author shuangfei.zhu@hand-china.com 2019/08/28 19:31 + */ +@Component +public class MessageHandler extends SocketMessageHandler { + + /** + * Hzero平台HTTP协议,默认http + */ + @Value("${skyer.platform.httpProtocol:http}") + private String skyerPlatformHttpProtocol; + + @Autowired + private RestTemplate restTemplate; + + @Override + public boolean needPrincipal() { + return true; + } + + @Override + public void processMessage(MsgVO msgVO) { + String serverName = msgVO.getService(); + if (StringUtils.isBlank(serverName)) { + return; + } + Msg msg = new Msg(); + BeanUtils.copyProperties(msgVO, msg); + // 获取用户信息 + msg.setUserDetails(getCustomUserDetails()); + // 使用restTemplate通知消息客户端 + String url = this.skyerPlatformHttpProtocol + "://" + serverName + WebSocketConstant.MESSAGE_HANDLER_PATH; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + HttpEntity entity = new HttpEntity<>(msg, headers); + ResponseEntity response = restTemplate.postForEntity(url, entity, String.class); + if (!response.getStatusCode().is2xxSuccessful()) { + throw new CommonException(HpfmMsgCodeConstants.SEND_SOCKET); + } + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/BrandMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/BrandMapper.java new file mode 100644 index 0000000..82c2ee6 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/BrandMapper.java @@ -0,0 +1,19 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; +import org.skyer.goods.api.dto.BrandPageReqDTO; +import org.skyer.goods.domain.entity.Brand; +import org.skyer.goods.domain.vo.BrandPageResVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/24 4:34 下午 + */ +public interface BrandMapper extends BaseMapper { + + List getBrandVOList(@Param("param") BrandPageReqDTO brandPageReqDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeMapper.java new file mode 100644 index 0000000..f0ad3a8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeMapper.java @@ -0,0 +1,19 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.api.dto.CategoryAttributeQueryDTO; +import org.skyer.goods.domain.entity.CategoryAttribute; +import org.skyer.goods.domain.vo.CategoryAttributeVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.util.List; + +/** + * 商品分类属性表Mapper + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryAttributeMapper extends BaseMapper { + + List listIncludedValue(CategoryAttributeQueryDTO param); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeValueMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeValueMapper.java new file mode 100644 index 0000000..fa52c65 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryAttributeValueMapper.java @@ -0,0 +1,19 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.CategoryAttributeValue; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品分类属性值表Mapper + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryAttributeValueMapper extends BaseMapper { + + /** + * 根据分类id 删除属性值 + * @param categoryId 分类id + * @return 删除成功的数量 + */ + int deleteByCategoryId(Long categoryId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryMapper.java new file mode 100644 index 0000000..8bc4f58 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/CategoryMapper.java @@ -0,0 +1,22 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.domain.entity.Category; +import org.skyer.goods.domain.vo.CategoryVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.util.List; + +/** + * 商品分类表Mapper + * + * @author xurongfa 2021-12-24 09:12:57 + */ +public interface CategoryMapper extends BaseMapper { + + List selectList(CategoryQueryDTO categoryQueryDTO); + + List listIncludedAttr(CategoryQueryDTO category); + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/GoodsShopMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/GoodsShopMapper.java new file mode 100644 index 0000000..64b6ba3 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/GoodsShopMapper.java @@ -0,0 +1,14 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.GoodsShop; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品在店铺中的上下架关系表Mapper + * + * @author chenzz 2021-06-25 13:36:41 + */ +public interface GoodsShopMapper extends BaseMapper { + +} + diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/InstallServiceMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/InstallServiceMapper.java new file mode 100644 index 0000000..499d686 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/InstallServiceMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.InstallService; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 安装服务Mapper + * + * @author chenzz 2021-08-18 15:42:47 + */ +public interface InstallServiceMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/MaterialMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/MaterialMapper.java new file mode 100644 index 0000000..e3d606d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/MaterialMapper.java @@ -0,0 +1,21 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; +import org.skyer.goods.api.dto.MaterialListDTO; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.vo.MaterialVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.util.List; + +/** + *

+ * 商品素材 + *

+ * + * @author chenzz + * @since 2021-06-23 + */ +public interface MaterialMapper extends BaseMapper { + List getListPage(@Param("materialDTO") MaterialListDTO materialDTO); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttrValueRelationMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttrValueRelationMapper.java new file mode 100644 index 0000000..f224058 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttrValueRelationMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SkuAttrValueRelation; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品sku和属性值关系表Mapper + * + * @author chenzz 2021-07-06 10:35:44 + */ +public interface SkuAttrValueRelationMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueDraftMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueDraftMapper.java new file mode 100644 index 0000000..44ceb87 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueDraftMapper.java @@ -0,0 +1,24 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +import org.skyer.goods.domain.entity.SkuAttributeValueDraft; +import org.skyer.mybatis.common.BaseMapper; + +/** + * sku属性关联草稿表Mapper + * + * @author zhanglongbing@ebc.com 2021-12-29 11:23:43 + */ +public interface SkuAttributeValueDraftMapper extends BaseMapper { + + /** + * 根据SKU ID获取关联的属性 + * + * @author lixiaoyang + * @date 2021/12/30 11:20 + */ + List queryAllBySkuId(@Param("skuId") Long skuId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueMapper.java new file mode 100644 index 0000000..05e585c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAttributeValueMapper.java @@ -0,0 +1,32 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.mybatis.common.BaseMapper; + +/** + * sku属性关联表Mapper + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +public interface SkuAttributeValueMapper extends BaseMapper { + /** + * 根据SKU ID获取关联的属性 + * + * @author lixiaoyang + * @date 2021/12/30 11:21 + */ + List queryAllBySkuId(@Param("skuId") Long skuId); + + /** + * 根据SKU ID批量删除 + * + * @author lixiaoyang + * @date 2021/12/30 15:22 + */ + Integer deleteBySkuId(@Param("skuId") Long skuId); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAuditSettingMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAuditSettingMapper.java new file mode 100644 index 0000000..f35c222 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuAuditSettingMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SkuAuditSetting; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品SKU审核Mapper + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +public interface SkuAuditSettingMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuDraftMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuDraftMapper.java new file mode 100644 index 0000000..369cca9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuDraftMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SkuDraft; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品规格草稿表Mapper + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +public interface SkuDraftMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupMapper.java new file mode 100644 index 0000000..fb3a263 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupMapper.java @@ -0,0 +1,23 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; +import org.skyer.goods.api.dto.GroupPageReqDTO; +import org.skyer.goods.domain.entity.SkuGroup; +import org.skyer.goods.domain.vo.GroupPageResVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Sku组合表Mapper + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupMapper extends BaseMapper { + + List queryGroupPageList(@Param("param") GroupPageReqDTO groupPageReqDTO,@Param("tenantId")Long tenantId); + + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupSkuMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupSkuMapper.java new file mode 100644 index 0000000..911c213 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupSkuMapper.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; +import org.skyer.goods.domain.entity.SkuGroupSku; +import org.skyer.mybatis.common.BaseMapper; + +import java.math.BigDecimal; + +/** + * Sku组合和sku关联表Mapper + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupSkuMapper extends BaseMapper { + + BigDecimal totalSkuNum(@Param("groupId")Long groupId); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupStoreMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupStoreMapper.java new file mode 100644 index 0000000..5631e21 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuGroupStoreMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SkuGroupStore; +import org.skyer.mybatis.common.BaseMapper; + +/** + * Sku组合和店铺表Mapper + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +public interface SkuGroupStoreMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuMapper.java new file mode 100644 index 0000000..bd5c1c9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuMapper.java @@ -0,0 +1,40 @@ +package org.skyer.goods.infra.mapper; + + +import org.apache.ibatis.annotations.Param; +import org.skyer.goods.api.dto.GoodsSkuPageDTO; +import org.skyer.goods.domain.entity.Sku; +import org.skyer.goods.domain.vo.RpcGoodsResVO; +import org.skyer.goods.domain.vo.RpcOrderResVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.util.List; + +/** + * 商品规格表Mapper + * + * @author chenzz 2021-07-06 10:35:43 + */ +public interface SkuMapper extends BaseMapper { + + /** + * 分页查询 + * @param goodsSkuPageDTO + * @return + */ + List getSkuList(@Param("param") GoodsSkuPageDTO goodsSkuPageDTO); + + /** + * 查询skuCode(rpc调用) + * @param skuCodeList + * @return + */ + List queryRPCGoodsList(@Param("skuCodeList") List skuCodeList); + + /** + * 查询skuCode(rpc调用) + * @param skuCodeList + * @return + */ + List queryOrderRpcList(@Param("skuCodeList") List skuCodeList); +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuPackageMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuPackageMapper.java new file mode 100644 index 0000000..2c2ae95 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SkuPackageMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SkuPackage; +import org.skyer.mybatis.common.BaseMapper; + +/** + * Mapper + * + * @author zhanglongbing@ebc.com 2022-03-03 10:45:30 + */ +public interface SkuPackageMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttrValueRelationMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttrValueRelationMapper.java new file mode 100644 index 0000000..32892db --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttrValueRelationMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuAttrValueRelation; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品和属性值关联关系Mapper + * + * @author wushaochuan 2021-07-19 09:18:33 + */ +public interface SpuAttrValueRelationMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeMapper.java new file mode 100644 index 0000000..d8f293f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuAttribute; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 属性表Mapper + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +public interface SpuAttributeMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeValueMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeValueMapper.java new file mode 100644 index 0000000..655c85b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuAttributeValueMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuAttributeValue; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 属性值表Mapper + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +public interface SpuAttributeValueMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceMapper.java new file mode 100644 index 0000000..f6eb9cf --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuInstallService; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品安装服务Mapper + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceSkuMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceSkuMapper.java new file mode 100644 index 0000000..b389033 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceSkuMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuInstallServiceSku; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品安装服务sku表Mapper + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceSkuMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceStoreMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceStoreMapper.java new file mode 100644 index 0000000..1ad2455 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuInstallServiceStoreMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuInstallServiceStore; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 商品安装服务售卖门店Mapper + * + * @author chenzz 2021-08-18 16:42:11 + */ +public interface SpuInstallServiceStoreMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuMapper.java new file mode 100644 index 0000000..8f779f4 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuMapper.java @@ -0,0 +1,32 @@ +package org.skyer.goods.infra.mapper; + +import org.apache.ibatis.annotations.Param; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.mybatis.common.BaseMapper; + +import java.util.List; + +/** + * 商品表Mapper + * + * @author chenzz 2021-06-25 13:36:41 + */ +public interface SpuMapper extends BaseMapper { + + /** + * 查询商品列表 + * @param goodsPageReqDTO + * @return + */ + List getGoodsList(@Param("param") GoodsPageReqDTO goodsPageReqDTO); + + /** + * 查询spuList + * @param spuList + * @return + */ + List queryGoodsListBySpu(@Param("spuList") List spuList); +} + diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumMapper.java new file mode 100644 index 0000000..3b5823b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuSonMum; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 子母商品Mapper + * + * @author chenzz 2021-08-16 15:04:38 + */ +public interface SpuSonMumMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumSkuMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumSkuMapper.java new file mode 100644 index 0000000..0b19b8f --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumSkuMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuSonMumSku; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 子母商品sku表Mapper + * + * @author chenzz 2021-08-17 15:49:14 + */ +public interface SpuSonMumSkuMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumStoreMapper.java b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumStoreMapper.java new file mode 100644 index 0000000..19c5720 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/mapper/SpuSonMumStoreMapper.java @@ -0,0 +1,13 @@ +package org.skyer.goods.infra.mapper; + +import org.skyer.goods.domain.entity.SpuSonMumStore; +import org.skyer.mybatis.common.BaseMapper; + +/** + * 子母商品售卖门店Mapper + * + * @author chenzz 2021-08-16 15:04:38 + */ +public interface SpuSonMumStoreMapper extends BaseMapper { + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/properties/DataHierarchyProperties.java b/skyer-goods/src/main/java/org/skyer/goods/infra/properties/DataHierarchyProperties.java new file mode 100644 index 0000000..988387a --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/properties/DataHierarchyProperties.java @@ -0,0 +1,19 @@ +package org.skyer.goods.infra.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author yuelinsoft + */ +@ConfigurationProperties(prefix = "skyer.data-hierarchy.display") +public class DataHierarchyProperties { + private int maxSelectCount = 3; + + public int getMaxSelectCount() { + return maxSelectCount; + } + + public void setMaxSelectCount(int maxSelectCount) { + this.maxSelectCount = maxSelectCount; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/properties/GoodsProperties.java b/skyer-goods/src/main/java/org/skyer/goods/infra/properties/GoodsProperties.java new file mode 100644 index 0000000..11d94f9 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/properties/GoodsProperties.java @@ -0,0 +1,118 @@ +package org.skyer.goods.infra.properties; + +import java.util.List; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * HPFM Properties + * + * @author gaokuo.dai@hand-china.com 2018年8月20日下午4:24:58 + */ +@ConfigurationProperties(prefix = GoodsProperties.PREFIX) +public class GoodsProperties { + + public static final String PREFIX = "skyer.platform"; + private static final String HTTP_PROTOCOL_SUFFIX = "://"; + + /** + * 启动时是否刷新缓存,默认true + */ + private Boolean initCache = true; + /** + * 平台Http协议,默认http + */ + private String httpProtocol = "http"; + /** + * 完整平台Http协议,默认http:// + */ + private String fullHttpProtocol = "http://"; + + /** + * @return 启动时是否刷新缓存,默认true + */ + public Boolean getInitCache() { + return initCache; + } + + /** + * 获取卡片使用的模板角色Code + */ + private List roleTemplateCodes; + + private Encrypt encrypt = new Encrypt(); + + public List getRoleTemplateCodes() { + return roleTemplateCodes; + } + + public void setRoleTemplateCodes(List roleTemplateCodes) { + this.roleTemplateCodes = roleTemplateCodes; + } + + public void setInitCache(Boolean initCache) { + this.initCache = initCache; + } + + /** + * @return 平台Http协议,默认http + */ + public String getHttpProtocol() { + return httpProtocol; + } + + public void setHttpProtocol(String httpProtocol) { + this.httpProtocol = httpProtocol; + this.fullHttpProtocol = httpProtocol + HTTP_PROTOCOL_SUFFIX; + } + + /** + * @return 完整平台Http协议,默认http:// + */ + public String getFullHttpProtocol() { + return fullHttpProtocol; + } + + public Encrypt getEncrypt() { + return encrypt; + } + + public void setEncrypt(Encrypt encrypt) { + this.encrypt = encrypt; + } + + /** + * 加密私钥和公钥 + */ + public static class Encrypt { + /** + * 密码加密公钥 + */ + private String publicKey = + "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIPdTZ1b9Q13Y2YmZ4mjQnFpypCqhV6rjGgsTQMYqC0eVu/je3/L98/4/j3lNePWqwHgCDD0mxISFm44nDKfPbcCAwEAAQ=="; + /** + * 密码加密私钥 + */ + private String privateKey = + "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAg91NnVv1DXdjZiZniaNCcWnKkKqFXquMaCxNAxioLR5W7+N7f8v3z/j+PeU149arAeAIMPSbEhIWbjicMp89twIDAQABAkAYAgbLi56GISJ7yqo3KP5D39r9k85MejdKECbFVYvpCsLG51IrwtVcdGJTExmkzIuOWnwqRAYUjpQnVvPvLzZhAiEA/Dyk4j+XZtC7NVxrXjn+PHG0vWZ8x14G5sBL6RfgzEsCIQCF1O0383YF0BbDUGkBoaVGmEc3H0D7FQF5L4gMe5EYxQIgLljOSyw4G5I68+EZcWTijCSweyS7xL5IMlofGKNkkOUCIC+hqdAZEW9eMUvQaZ8QBf/LIMWIlRsHzd9wwE4ZCHo1AiEAqsUlDIIfPOrjQfbeYVWSD+Ac9PzMiFfH9H/WMuaWRtw="; + + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getPrivateKey() { + return privateKey; + } + + public void setPrivateKey(String privateKey) { + this.privateKey = privateKey; + } + + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/RemoteCustomizeService.java b/skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/RemoteCustomizeService.java new file mode 100644 index 0000000..22271fd --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/RemoteCustomizeService.java @@ -0,0 +1,39 @@ +package org.skyer.goods.infra.remote.api; + +import java.util.List; + +import org.skyer.boot.api.customize.commons.vo.MethodMetaData; + +/** + * 客制化业务方法调用 + * + * @author bojiangzhou 2019/07/04 + */ +public interface RemoteCustomizeService { + + /** + * 获取服务的方法 + * + * @param serviceName 服务编码 + * @param packageNames 包名 + * @return List + */ + List fetchServiceMethods(String serviceName, String packageNames); + + /** + * 应用客制化规则 + * + * @param serviceNames 服务名 + * @param ruleCodes 规则规则 + */ + void applyCustomizeRule(List serviceNames, List ruleCodes); + + /** + * 应用客制化规则 + * + * @param serviceName 服务名 + * @param ruleCodes 规则规则 + */ + void applyCustomizeRule(String serviceName, List ruleCodes); + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/impl/RemoteCustomizeServiceImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/impl/RemoteCustomizeServiceImpl.java new file mode 100644 index 0000000..5a76cc1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/remote/api/impl/RemoteCustomizeServiceImpl.java @@ -0,0 +1,142 @@ +package org.skyer.goods.infra.remote.api.impl; + +import java.util.Collections; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.skyer.goods.infra.properties.GoodsProperties; +import org.skyer.goods.infra.remote.api.RemoteCustomizeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import org.skyer.core.exception.CommonException; +import org.skyer.core.exception.ExceptionResponse; + +import org.skyer.core.base.BaseConstants; +import org.skyer.core.net.RequestHeaderCopyInterceptor; +import org.skyer.boot.api.customize.commons.vo.MethodMetaData; + +/** + * 远程 RemoteCustomizeService 方法 + * + * @author bojiangzhou 2019/07/04 + */ +@Component +public class RemoteCustomizeServiceImpl implements RemoteCustomizeService { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoteCustomizeServiceImpl.class); + + @LoadBalanced + private final RestTemplate balanceRestTemplate; + private final GoodsProperties goodsProperties; + private final DiscoveryClient discoveryClient; + + private final RestTemplate normalRestTemplate; + + private static final String SCAN_URI = "/v1/customize/scan"; + private static final String APPLY_URI = "/v1/customize/apply"; + + private ParameterizedTypeReference> METHOD_TYPE = + new ParameterizedTypeReference>() {}; + + public RemoteCustomizeServiceImpl(RestTemplate restTemplate, GoodsProperties goodsProperties, + DiscoveryClient discoveryClient) { + this.balanceRestTemplate = restTemplate; + this.goodsProperties = goodsProperties; + this.discoveryClient = discoveryClient; + + normalRestTemplate = new RestTemplate(); + normalRestTemplate.setInterceptors(Collections.singletonList(new RequestHeaderCopyInterceptor())); + } + + @Override + public List fetchServiceMethods(String serviceName, String packageNames) { + String[] names = packageNames.split(BaseConstants.Symbol.COMMA); + StringBuilder builder = new StringBuilder(); + for (String name : names) { + builder.append("&packageNames=").append(name); + } + String params = builder.toString().replaceFirst("&", "?"); + String url = goodsProperties.getFullHttpProtocol() + serviceName + SCAN_URI + params; + LOGGER.debug("fetch service class methods, service = [{}], url = [{}]", serviceName, url); + List points; + try { + ResponseEntity> responseEntity = + balanceRestTemplate.exchange(url, HttpMethod.GET, null, METHOD_TYPE); + if (responseEntity.getStatusCode().is2xxSuccessful()) { + points = responseEntity.getBody(); + } else { + throw new CommonException("hpfm.warn.fetchMethods.failure", responseEntity.getStatusCodeValue()); + } + } catch (RestClientException e) { + LOGGER.error("fetch service class methods exception, service = {}, package = {}, ex={}", serviceName, + packageNames, e.getMessage()); + throw new CommonException("hpfm.warn.fetchMethods.exception", e.getMessage()); + } catch (Exception e) { + LOGGER.error("fetch service class methods error, service = {}, package = {}, ex = {}", serviceName, + packageNames, e.getMessage()); + throw new CommonException("hpfm.warn.fetchServiceException", serviceName); + } + + if (LOGGER.isDebugEnabled() && CollectionUtils.isNotEmpty(points)) { + for (MethodMetaData point : points) { + LOGGER.debug("point = {}", point); + } + } + + return points; + } + + @Override + public void applyCustomizeRule(List serviceNames, List ruleCodes) { + for (String serviceName : serviceNames) { + applyCustomizeRule(serviceName, ruleCodes); + } + } + + @Override + public void applyCustomizeRule(String serviceName, List ruleCodes) { + StringBuilder builder = new StringBuilder(); + for (String ruleCode : ruleCodes) { + builder.append("&ruleCodes=").append(ruleCode); + } + String params = builder.toString().replaceFirst("&", "?"); + + List instances = discoveryClient.getInstances(serviceName); + + if (CollectionUtils.isEmpty(instances)) { + throw new CommonException("hpfm.warn.customize.instanceNotRunning", serviceName); + } + + for (ServiceInstance instance : instances) { + String url = instance.getUri().toString() + APPLY_URI + params; + LOGGER.debug("apply customize rule, service = [{}], url = [{}]", serviceName, url); + + try { + ResponseEntity responseEntity = + normalRestTemplate.getForEntity(url, ExceptionResponse.class); + if (!responseEntity.getStatusCode().is2xxSuccessful()) { + if (responseEntity.getBody() != null) { + throw new CommonException("hpfm.warn.customizeRuleFailure", serviceName, + responseEntity.getBody().getMessage()); + } else { + throw new CommonException("hpfm.warn.callServiceFailure", serviceName); + } + } + } catch (Exception e) { + throw new CommonException("hpfm.warn.callServiceFailure", serviceName); + } + + } + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/BrandRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/BrandRepositoryImpl.java new file mode 100644 index 0000000..8115b78 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/BrandRepositoryImpl.java @@ -0,0 +1,64 @@ +package org.skyer.goods.infra.repository.impl; + +import org.apache.commons.collections4.CollectionUtils; +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.BrandPageReqDTO; +import org.skyer.goods.domain.entity.Brand; +import org.skyer.goods.domain.repository.BrandRepository; +import org.skyer.goods.domain.vo.BrandPageResVO; +import org.skyer.goods.infra.mapper.BrandMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 品牌dao层 + * @description + * @Author wusc + * @create 2021/6/25 1:39 下午 + */ +@Component +public class BrandRepositoryImpl extends BaseRepositoryImpl implements BrandRepository { + @Autowired + private BrandMapper brandMapper; + + @Override + public Page pageBrand(BrandPageReqDTO brandPageReqDTO) { + return PageHelper.doPage(brandPageReqDTO.getPage(),brandPageReqDTO.getSize(),() ->brandMapper.getBrandVOList(brandPageReqDTO)); + } + + @Override + public List listBrand(BrandPageReqDTO brandPageReqDTO) { + return brandMapper.getBrandVOList(brandPageReqDTO); + } + + @Override + public Brand getBrandByName(String name, Long id,Long tenantId) { + List brands = brandMapper.selectByCondition(Condition.builder(Brand.class) + .andWhere(Sqls.custom().andEqualTo(Brand.NAME, name).andEqualTo(Brand.DELETE_FLAG,0) + .andEqualTo(Brand.TENANT_ID,tenantId)).build()); + if (CollectionUtils.isNotEmpty(brands)){ + if (!brands.get(0).getId().equals(id)) { + return brands.get(0); + } + } + return null; + } + + @Override + public Brand getBrandByCode(String code, Long id) { + List brands = brandMapper.selectByCondition(Condition.builder(Brand.class) + .andWhere(Sqls.custom().andEqualTo(Brand.CODE, code).andEqualTo(Brand.DELETE_FLAG,0)).build()); + if (CollectionUtils.isNotEmpty(brands)){ + if (!brands.get(0).getId().equals(id)) { + return brands.get(0); + } + } + return null; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeRepositoryImpl.java new file mode 100644 index 0000000..2a6ac7b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeRepositoryImpl.java @@ -0,0 +1,29 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.goods.api.dto.CategoryAttributeQueryDTO; +import org.skyer.goods.domain.entity.CategoryAttribute; +import org.skyer.goods.domain.repository.CategoryAttributeRepository; +import org.skyer.goods.domain.vo.CategoryAttributeVO; +import org.skyer.goods.infra.mapper.CategoryAttributeMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 商品分类属性表 资源库实现 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@Component +public class CategoryAttributeRepositoryImpl extends BaseRepositoryImpl implements CategoryAttributeRepository { + + @Autowired + private CategoryAttributeMapper categoryAttributeMapper; + + public List listIncludedValue(CategoryAttributeQueryDTO param){ + return categoryAttributeMapper.listIncludedValue(param); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeValueRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeValueRepositoryImpl.java new file mode 100644 index 0000000..17d7a91 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryAttributeValueRepositoryImpl.java @@ -0,0 +1,31 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.goods.infra.mapper.CategoryAttributeValueMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.CategoryAttributeValue; +import org.skyer.goods.domain.repository.CategoryAttributeValueRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 商品分类属性值表 资源库实现 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@Component +public class CategoryAttributeValueRepositoryImpl extends BaseRepositoryImpl implements CategoryAttributeValueRepository { + + @Autowired + private CategoryAttributeValueMapper categoryAttributeValueMapper; + + /** + * 根据分类id 删除属性值 + * @param categoryId 分类id + * @return 删除成功的数量 + */ + @Override + public int deleteByCategoryId(Long categoryId){ + return categoryAttributeValueMapper.deleteByCategoryId(categoryId); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryRepositoryImpl.java new file mode 100644 index 0000000..fd9d449 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/CategoryRepositoryImpl.java @@ -0,0 +1,214 @@ +package org.skyer.goods.infra.repository.impl; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.skyer.core.domain.Page; +import org.skyer.core.redis.RedisHelper; +import org.skyer.goods.api.dto.CategoryQueryDTO; +import org.skyer.goods.api.dto.LevelCategoryDTO; +import org.skyer.goods.domain.entity.Category; +import org.skyer.goods.domain.repository.CategoryRepository; +import org.skyer.goods.domain.vo.CategoryVO; +import org.skyer.goods.infra.constant.RedisKey; +import org.skyer.goods.infra.mapper.CategoryMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商品分类表 资源库实现 + * + * @author xurongfa 2021-12-24 09:12:57 + */ +@Component +public class CategoryRepositoryImpl extends BaseRepositoryImpl implements CategoryRepository { + + private static final Logger logger = LoggerFactory.getLogger(CategoryRepositoryImpl.class); + + @Autowired + private CategoryMapper categoryMapper; + @Autowired + private RedisHelper redisHelper; + + @Override + public int updateByPrimaryKeySelective(Category record) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.updateByPrimaryKeySelective(record); + } + + @Override + public int updateByPrimaryKey(Category record) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.updateByPrimaryKey(record); + } + + @Override + public int updateOptional(Category record, String... optionals) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.updateOptional(record, optionals); + } + + @Override + public int insert(Category record) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.insert(record); + } + + @Override + public int insertSelective(Category record) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.insertSelective(record); + } + + @Override + public int insertOptional(Category record, String... optionals) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.insertOptional(record, optionals); + } + + @Override + public int delete(Category record) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.delete(record); + } + + @Override + public int deleteByPrimaryKey(Object key) { + redisHelper.delKey(RedisKey.CATEGORY_ALL); + return super.deleteByPrimaryKey(key); + } + + /** + * 获取全部分类 + * @return 全部分类 + */ + @Override + public List getCategoryAll(){ + String categoryAllStr = redisHelper.strGet(RedisKey.CATEGORY_ALL); + if (ObjectUtils.isEmpty(categoryAllStr)){ + List categoryList = categoryMapper.selectAll(); + redisHelper.strSet(RedisKey.CATEGORY_ALL, JSON.toJSONString(categoryList)); + logger.info("=============商品分类:数据库获取=============="); + return categoryList; + } + logger.info("=============商品分类:缓存获取=============="); + return JSON.parseArray(categoryAllStr, Category.class); + } + + + /** + * 查询商品分类列表 + * @param categoryQueryDTO 通用查询对象 + * @return 商品分类 + */ + @Override + public List selectList(CategoryQueryDTO categoryQueryDTO){ + return categoryMapper.selectList(categoryQueryDTO); + } + @Override + public Page pageIncludedAttr(PageRequest pageRequest, CategoryQueryDTO category){ + return PageHelper.doPageAndSort(pageRequest,()->categoryMapper.listIncludedAttr(category)); + } + + @Override + public String getCategoryNameById(Long categoryId) { + List levelCategoryDTOList = Lists.newArrayList(); + Category category = this.selectByPrimaryKey(categoryId); + + if (Objects.isNull(category)) { + return ""; + } + LevelCategoryDTO levelCategoryDTO = new LevelCategoryDTO(); + levelCategoryDTO.setId(category.getId()); + levelCategoryDTO.setName(category.getName()); + levelCategoryDTO.setLevel(category.getLevel()); + levelCategoryDTOList.add(levelCategoryDTO); + setFrontLevel(levelCategoryDTOList,category.getParentId()); + + if (CollUtil.isEmpty(levelCategoryDTOList)){ + return ""; + } + return levelCategoryDTOList.stream().sorted(Comparator.comparing(LevelCategoryDTO::getLevel)).map(LevelCategoryDTO::getName).collect(Collectors.joining("/")); + } + + /** + * 拼接上层分类 + * @param + */ + private void setFrontLevel(List list, Long parentId) { + if (parentId==0){ + return; + } + //查询上层分类 + Category parentCategory = this.selectByPrimaryKey(parentId); + if (Objects.isNull(parentCategory)){ + return; + } + if (parentCategory.getLevel()>=1){ + LevelCategoryDTO levelCategoryDTO = new LevelCategoryDTO(); + levelCategoryDTO.setId(parentId); + levelCategoryDTO.setLevel(parentCategory.getLevel()); + levelCategoryDTO.setName(parentCategory.getName()); + list.add(levelCategoryDTO); + setFrontLevel(list,parentCategory.getParentId()); + } + } + + @Override + public List getLaterCategoryId(List categoryIdList) { + + List vos = this.selectByCondition(Condition.builder(Category.class) + .andWhere(Sqls.custom() + .andIn(Category.FIELD_ID, categoryIdList)) + .build()); + if (CollUtil.isEmpty(vos)){ + return Collections.emptyList(); + } + + for (int i = 0; i < vos.size(); i++) { + getLaterCategory(vos, vos.get(i).getId()); + } + List allCategoryIdList = vos.stream().map(Category::getId).collect(Collectors.toList()); + allCategoryIdList.addAll(categoryIdList); + return allCategoryIdList.stream().distinct().collect(Collectors.toList()); + } + + @Override + public void getLaterCategory(List children, Long parentId) { + List sonCategory = getSonCategory(parentId); + if (CollectionUtils.isEmpty(sonCategory)){ + return; + } + children.addAll(sonCategory); + for (int i = 0; i < sonCategory.size(); i++) { + getLaterCategory(sonCategory, sonCategory.get(i).getId()); + } + + } + + @Override + public List getSonCategory(Long parentId) { + return categoryMapper.selectByCondition(Condition.builder(Category.class) + .andWhere(Sqls.custom() + .andEqualTo(Category.FIELD_PARENT_ID, parentId) + .andEqualTo(Category.FIELD_STATUS_FLAG, 1)) + .build()); + } + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/InstallServiceRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/InstallServiceRepositoryImpl.java new file mode 100644 index 0000000..7b1b8fc --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/InstallServiceRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.InstallService; +import org.skyer.goods.domain.repository.InstallServiceRepository; +import org.springframework.stereotype.Component; + +/** + * 安装服务 资源库实现 + * + * @author chenzz 2021-08-18 15:42:47 + */ +@Component +public class InstallServiceRepositoryImpl extends BaseRepositoryImpl implements InstallServiceRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/MaterialRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/MaterialRepositoryImpl.java new file mode 100644 index 0000000..7fbd4ba --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/MaterialRepositoryImpl.java @@ -0,0 +1,66 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.MaterialListDTO; +import org.skyer.goods.domain.entity.Material; +import org.skyer.goods.domain.repository.MaterialRepository; +import org.skyer.goods.domain.vo.MaterialVO; +import org.skyer.goods.infra.mapper.MaterialMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.pagehelper.domain.PageRequest; +import org.skyer.mybatis.util.Sqls; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author chenzz + */ +@Component +public class MaterialRepositoryImpl extends BaseRepositoryImpl implements MaterialRepository { + + @Autowired + private MaterialMapper materialMapper; + + @Override + public Page pageList(PageRequest pageRequest, MaterialListDTO dealerListDTO) { + return PageHelper.doPageAndSort(pageRequest, () -> materialMapper.getListPage(dealerListDTO)); + // return PageHelper.doPage(pageRequest, () -> { + // return selectByCondition(Condition.builder(Material.class) + // .andWhere(Sqls.custom() + // .andLike(Material.MATERIAL_NAME, dealerListDTO.getMaterialName(), true) + // .andEqualTo(Material.CODE, dealerListDTO.getCode(), true) + // .andEqualTo(Material.DELETE_FLAG, false)) + // .build()); + // }); + } + + @Override + public Integer getSizeByName(String materialName) { + List materials = this.selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andEqualTo(Material.FIELD_MATERIAL_NAME, materialName)) + .build()); + if (CollectionUtils.isEmpty(materials)) { + return 0; + } + return materials.size(); + } + + @Override + public Integer getSizeByCode(String code) { + List materials = this.selectByCondition(Condition.builder(Material.class) + .andWhere(Sqls.custom() + .andEqualTo(Material.FIELD_CODE, code)) + .build()); + if (CollectionUtils.isEmpty(materials)) { + return 0; + } + return materials.size(); + } +} \ No newline at end of file diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttrValueRelationRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttrValueRelationRepositoryImpl.java new file mode 100644 index 0000000..562c29b --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttrValueRelationRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuAttrValueRelation; +import org.skyer.goods.domain.repository.SkuAttrValueRelationRepository; +import org.springframework.stereotype.Component; + +/** + * 商品sku和属性值关系表 资源库实现 + * + * @author chenzz 2021-07-06 10:35:44 + */ +@Component +public class SkuAttrValueRelationRepositoryImpl extends BaseRepositoryImpl implements SkuAttrValueRelationRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueDraftRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueDraftRepositoryImpl.java new file mode 100644 index 0000000..e4b3426 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueDraftRepositoryImpl.java @@ -0,0 +1,27 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.goods.infra.mapper.SkuAttributeValueDraftMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuAttributeValueDraft; +import org.skyer.goods.domain.repository.SkuAttributeValueDraftRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * sku属性关联草稿表 资源库实现 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:23:43 + */ +@Component +public class SkuAttributeValueDraftRepositoryImpl extends BaseRepositoryImpl implements SkuAttributeValueDraftRepository { + + @Autowired + private SkuAttributeValueDraftMapper skuAttributeValueDraftMapper; + @Override + public List queryAllBySkuId(Long skuId) { + return skuAttributeValueDraftMapper.queryAllBySkuId(skuId); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueRepositoryImpl.java new file mode 100644 index 0000000..4a768b1 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAttributeValueRepositoryImpl.java @@ -0,0 +1,33 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.goods.infra.mapper.SkuAttributeValueMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuAttributeValue; +import org.skyer.goods.domain.repository.SkuAttributeValueRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * sku属性关联表 资源库实现 + * + * @author zhanglongbing@ebc.com 2021-12-28 09:17:10 + */ +@Component +public class SkuAttributeValueRepositoryImpl extends BaseRepositoryImpl implements SkuAttributeValueRepository { + + @Autowired + private SkuAttributeValueMapper skuAttributeValueMapper; + + @Override + public List queryAllBySkuId(Long skuId) { + return skuAttributeValueMapper.queryAllBySkuId(skuId); + } + + @Override + public Integer deleteBySkuId(Long skuId) { + return skuAttributeValueMapper.deleteBySkuId(skuId); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAuditSettingRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAuditSettingRepositoryImpl.java new file mode 100644 index 0000000..e1e62d2 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuAuditSettingRepositoryImpl.java @@ -0,0 +1,48 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.goods.infra.mapper.SkuAuditSettingMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuAuditSetting; +import org.skyer.goods.domain.repository.SkuAuditSettingRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +/** + * 商品SKU审核 资源库实现 + * + * @author zhanglongbing@ebc.com 2021-12-27 10:09:56 + */ +@Component +public class SkuAuditSettingRepositoryImpl extends BaseRepositoryImpl implements SkuAuditSettingRepository { + + @Autowired + private SkuAuditSettingMapper skuAuditSettingMapper; + + @Override + public SkuAuditSetting selectDefault() { + List allList= skuAuditSettingMapper.selectAll(); + if (ObjectUtils.isEmpty(allList)){ + SkuAuditSetting skuAuditSetting = new SkuAuditSetting(); + skuAuditSetting.setCreatedAuditStatus(0); + skuAuditSetting.setUpdateAuditStatus(0); + skuAuditSetting.setUpdatePriceStatus(0); + skuAuditSetting.setUpdatePropertyStatus(0); + return skuAuditSetting; + } + return allList.get(0); + } + + @Override + public int updateDefault(SkuAuditSetting skuAuditSetting) { + List allList= skuAuditSettingMapper.selectAll(); + if (ObjectUtils.isEmpty(allList)){ + return skuAuditSettingMapper.insertSelective(skuAuditSetting); + } + skuAuditSetting.setId(allList.get(0).getId()); + skuAuditSetting.setObjectVersionNumber(allList.get(0).getObjectVersionNumber()); + return skuAuditSettingMapper.updateByPrimaryKeySelective(skuAuditSetting); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuDraftRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuDraftRepositoryImpl.java new file mode 100644 index 0000000..f7a0dbe --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuDraftRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuDraft; +import org.skyer.goods.domain.repository.SkuDraftRepository; +import org.springframework.stereotype.Component; + +/** + * 商品规格草稿表 资源库实现 + * + * @author zhanglongbing@ebc.com 2021-12-29 11:12:15 + */ +@Component +public class SkuDraftRepositoryImpl extends BaseRepositoryImpl implements SkuDraftRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupRepositoryImpl.java new file mode 100644 index 0000000..3e0abf8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupRepositoryImpl.java @@ -0,0 +1,54 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GroupPageReqDTO; +import org.skyer.goods.api.dto.IdsReqDTO; +import org.skyer.goods.domain.vo.GroupPageResVO; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.mapper.SkuGroupMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuGroup; +import org.skyer.goods.domain.repository.SkuGroupRepository; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Sku组合表 资源库实现 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Component +public class SkuGroupRepositoryImpl extends BaseRepositoryImpl implements SkuGroupRepository { + @Autowired + private SkuGroupMapper skuGroupMapper; + + @Override + public List getSkuGroupByName(String name, Long tenantId) { + List skuGroups = skuGroupMapper.selectByCondition(Condition.builder(SkuGroup.class).andWhere(Sqls.custom().andEqualTo(SkuGroup.FIELD_GROUP_NAME, name) + .andEqualTo(SkuGroup.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO).andEqualTo(SkuGroup.FIELD_TENANT_ID, tenantId)).build()); + return skuGroups; + } + + @Override + public Page pageGroup(GroupPageReqDTO groupPageReqDTO,Long tenantId) { + return PageHelper.doPage(groupPageReqDTO.getPage(),groupPageReqDTO.getSize(),()->skuGroupMapper.queryGroupPageList(groupPageReqDTO,tenantId)); + + } + + @Override + public void delGroup(IdsReqDTO idsReqDTO) { + List ids = idsReqDTO.getIds(); + List skuGroupList = ids.stream().map(id -> { + SkuGroup skuGroup = this.selectByPrimaryKey(id); + skuGroup.setDeleteFlag(ObjectConstant.DeleteFlag.YES); + return skuGroup; + }).collect(Collectors.toList()); + this.batchUpdateByPrimaryKeySelective(skuGroupList); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupSkuRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupSkuRepositoryImpl.java new file mode 100644 index 0000000..bb9efcb --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupSkuRepositoryImpl.java @@ -0,0 +1,62 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.goods.api.dto.GoodsGroupSkuReqDTO; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.mapper.SkuGroupMapper; +import org.skyer.goods.infra.mapper.SkuGroupSkuMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuGroupSku; +import org.skyer.goods.domain.repository.SkuGroupSkuRepository; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Sku组合和sku关联表 资源库实现 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Component +public class SkuGroupSkuRepositoryImpl extends BaseRepositoryImpl implements SkuGroupSkuRepository { + @Autowired + private SkuGroupMapper skuGroupMapper; + @Autowired + private SkuGroupSkuMapper skuGroupSkuMapper; + @Override + public void createGroupSku(List goodsGroupSkuReqDTOS,Long spuId, Long groupId, Long tenantId) { + List skuGroupSkus = skuGroupSkuMapper.selectByCondition(Condition.builder(SkuGroupSku.class).andWhere(Sqls.custom() + .andEqualTo(SkuGroupSku.FIELD_SKU_GROUP_ID, groupId).andEqualTo(SkuGroupSku.FIELD_TENANT_ID, tenantId) + .andEqualTo(SkuGroupSku.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + this.batchDeleteByPrimaryKey(skuGroupSkus); + List skuGroupSkuList = goodsGroupSkuReqDTOS.stream().map(goodsGroupSkuReqDTO -> { + SkuGroupSku skuGroupSku = new SkuGroupSku(); + skuGroupSku.setSkuGroupId(groupId); + skuGroupSku.setSpuId(spuId); + skuGroupSku.setSkuId(goodsGroupSkuReqDTO.getSkuId()); + skuGroupSku.setNum(goodsGroupSkuReqDTO.getNum()); + skuGroupSku.setTenantId(tenantId); + return skuGroupSku; + }).collect(Collectors.toList()); + this.batchInsert(skuGroupSkuList); + } + + @Override + public List queryList(Long groupId) { + List skuGroupSkus = skuGroupSkuMapper.selectByCondition(Condition.builder(SkuGroupSku.class).andWhere(Sqls.custom() + .andEqualTo(SkuGroupSku.FIELD_SKU_GROUP_ID, groupId).andEqualTo(SkuGroupSku.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + + return skuGroupSkus; + } + + @Override + public BigDecimal totalSkuNum(Long groupId) { + BigDecimal skuNum = skuGroupSkuMapper.totalSkuNum(groupId); + return skuNum; + } +} + diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupStoreRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupStoreRepositoryImpl.java new file mode 100644 index 0000000..4442a54 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuGroupStoreRepositoryImpl.java @@ -0,0 +1,53 @@ +package org.skyer.goods.infra.repository.impl; + +import org.apache.commons.collections4.CollectionUtils; +import org.skyer.goods.domain.entity.SkuGroup; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.mapper.SkuGroupMapper; +import org.skyer.goods.infra.mapper.SkuGroupStoreMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuGroupStore; +import org.skyer.goods.domain.repository.SkuGroupStoreRepository; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Sku组合和店铺表 资源库实现 + * + * @author wushaochuan 2021-08-13 09:55:04 + */ +@Component +public class SkuGroupStoreRepositoryImpl extends BaseRepositoryImpl implements SkuGroupStoreRepository { + @Autowired + private SkuGroupStoreMapper skuGroupStoreMapper; + + @Override + public void updateSkuGroupStore(List storeIdList, Long groupId,Long tenantId) { + List skuGroups = skuGroupStoreMapper.selectByCondition(Condition.builder(SkuGroupStore.class).andWhere(Sqls.custom() + .andEqualTo(SkuGroupStore.FIELD_SKU_GROUP_ID, groupId)).build()); + if (CollectionUtils.isNotEmpty(skuGroups)){ + this.batchDeleteByPrimaryKey(skuGroups); + } + //删除后添加 + List skuGroupStoreList = storeIdList.stream().map(storeId -> { + SkuGroupStore skuGroupStore = new SkuGroupStore(); + skuGroupStore.setStoreId(storeId); + skuGroupStore.setSkuGroupId(groupId); + skuGroupStore.setTenantId(tenantId); + return skuGroupStore; + }).collect(Collectors.toList()); + this.batchInsertSelective(skuGroupStoreList); + } + + @Override + public List querySkuGroupStoreList(Long groupId) { + List skuGroupStores = skuGroupStoreMapper.selectByCondition(Condition.builder(SkuGroupStore.class).andWhere(Sqls.custom() + .andEqualTo(SkuGroupStore.FIELD_SKU_GROUP_ID, groupId).andEqualTo(SkuGroupStore.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + return skuGroupStores; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuPackageRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuPackageRepositoryImpl.java new file mode 100644 index 0000000..d82173c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuPackageRepositoryImpl.java @@ -0,0 +1,38 @@ +package org.skyer.goods.infra.repository.impl; + +import org.apache.commons.compress.utils.Lists; +import org.skyer.goods.domain.entity.Sku; +import org.skyer.goods.domain.repository.SkuRepository; +import org.skyer.goods.domain.vo.RpcGoodsResVO; +import org.skyer.goods.infra.mapper.SkuPackageMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SkuPackage; +import org.skyer.goods.domain.repository.SkuPackageRepository; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 资源库实现 + * + * @author zhanglongbing@ebc.com 2022-03-03 10:45:30 + */ +@Component +public class SkuPackageRepositoryImpl extends BaseRepositoryImpl implements SkuPackageRepository { + @Autowired + private SkuPackageMapper skuPackageMapper; + @Autowired + private SkuRepository skuRepository; + + @Override + public List querySkuPackageByMainId(Long packageId) { + List skuPackages = skuPackageMapper.selectByCondition(Condition.builder(SkuPackage.class).andWhere(Sqls.custom().andEqualTo(SkuPackage.FIELD_SKU_ID, packageId)).build()); + return skuPackages; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuRepositoryImpl.java new file mode 100644 index 0000000..0c5a936 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SkuRepositoryImpl.java @@ -0,0 +1,121 @@ +package org.skyer.goods.infra.repository.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsSkuPageDTO; +import org.skyer.goods.domain.entity.Sku; +import org.skyer.goods.domain.repository.SkuRepository; +import org.skyer.goods.domain.vo.RpcGoodsResVO; +import org.skyer.goods.domain.vo.RpcOrderResVO; +import org.skyer.goods.infra.mapper.SkuMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 商品规格表 资源库实现 + * + * @author zhanglongbing@ebc.com 2021-12-27 14:48:20 + */ +@Component +public class SkuRepositoryImpl extends BaseRepositoryImpl implements SkuRepository { + @Autowired + private SkuMapper skuMapper; + + @Override + public Page pageSku(GoodsSkuPageDTO skuPageDTO) { + return PageHelper.doPage(skuPageDTO.getPage(), skuPageDTO.getSize(), () -> skuMapper.getSkuList(skuPageDTO)); + } + + @Override + public Sku checkHaveSameSku(Long spuId,String md5Long) { + List skuList = skuMapper.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andEqualTo(Sku.FIELD_MD5_CHECK_VALUE, md5Long).andEqualTo(Sku.FIELD_SPU_ID,spuId,true)).build()); + if (CollUtil.isNotEmpty(skuList)) { + return skuList.get(0); + } + return null; + } + + @Override + public Sku checkHaveSameSkuCode(String skuCode) { + List skuList = skuMapper.selectByCondition(Condition.builder(Sku.class).andWhere(Sqls.custom().andEqualTo(Sku.FIELD_SKU_CODE, skuCode)).build()); + if (CollUtil.isNotEmpty(skuList)) { + return skuList.get(0); + } + return null; + } + + @Override + public Sku checkHaveSameSkuCodeWithOutSkuId(String skuCode, Long skuId) { + List skuList = skuMapper.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom().andEqualTo(Sku.FIELD_SKU_CODE, skuCode).andNotEqualTo(Sku.FIELD_ID, skuId)).build()); + if (CollUtil.isNotEmpty(skuList)) { + return skuList.get(0); + } + return null; + } + + @Override + public List getSkuListBySpuId(Long tenantId, Long spuId) { + return skuMapper.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom() + .andEqualTo(Sku.FIELD_SPU_ID, spuId, true)) + .build()); + } + + @Override + public List getSkuListBySkuCode(List skuCodeList) { + return skuMapper.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom() + .andIn(Sku.FIELD_SKU_CODE, skuCodeList, true)) + .build()); + } + + @Override + public List getSkuListBySkuId(List skuIdList) { + return skuMapper.selectByCondition(Condition.builder(Sku.class) + .andWhere(Sqls.custom() + .andIn(Sku.FIELD_ID, skuIdList, true)) + .build()); + } + + @Override + public Boolean getAttributeValueAndSpu(String attributeValue, Long spuId, Long skuId) { + List skuList = skuMapper.selectByCondition(Condition.builder(Sku.class).andWhere(Sqls.custom().andEqualTo(Sku.FIELD_SPU_ID, spuId).andLike(Sku.FIELD_ATTRIBUTE_VALUE, attributeValue) + .andNotEqualTo(Sku.FIELD_ID, skuId)).build()); + if (CollUtil.isEmpty(skuList)) { + return true; + } + return false; + } + + @Override + public Sku getSkuByCode(String code) { + List skuList = skuMapper.selectByCondition(Condition.builder(Sku.class).andWhere(Sqls.custom().andEqualTo(Sku.FIELD_SKU_CODE, code)).build()); + if (CollUtil.isEmpty(skuList)) { + return null; + } + return skuList.get(0); + } + + @Override + public List queryRPCGoodsList(List skuCodeList) { + List rpcGoodsResVOS = skuMapper.queryRPCGoodsList(skuCodeList); + return rpcGoodsResVOS; + } + + @Override + public List queryOrderRpcList(List skuCodeList) { + List rpcGoodsResVos = skuMapper.queryOrderRpcList(skuCodeList); + return rpcGoodsResVos; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttrValueRelationRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttrValueRelationRepositoryImpl.java new file mode 100644 index 0000000..614d2f0 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttrValueRelationRepositoryImpl.java @@ -0,0 +1,58 @@ +package org.skyer.goods.infra.repository.impl; + +import cn.hutool.core.collection.CollectionUtil; + +import org.skyer.goods.domain.entity.SpuAttrValueRelation; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.goods.infra.mapper.SpuAttrValueRelationMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.repository.SpuAttrValueRelationRepository; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 商品和属性值关联关系 资源库实现 + * + * @author wushaochuan 2021-07-19 09:18:33 + */ +@Component +public class SpuAttrValueRelationRepositoryImpl extends BaseRepositoryImpl implements SpuAttrValueRelationRepository { + @Autowired + private SpuAttrValueRelationMapper spuAttrValueRelationMapper; + + @Override + @Transactional(rollbackFor = RuntimeException.class) + public void createOrUpdateGoodsAttrRelation(Long goodsId,List spuAttrValueRelationList) { + //先删除对应商品id的记录 + List spuAttrValueRelations = queryGoodsAttribute(goodsId); + if (CollectionUtil.isNotEmpty(spuAttrValueRelations)) { + this.deleteSpuAttrValueRelation(goodsId,null); + } + //更新对应记录 + this.batchInsertSelective(spuAttrValueRelationList); + } + + @Override + public List queryGoodsAttribute(Long goodsId) { + return spuAttrValueRelationMapper.selectByCondition(Condition.builder(SpuAttrValueRelation.class).andWhere(Sqls.custom().andEqualTo(SpuAttrValueRelation.FIELD_GOODS_ID, goodsId) + .andEqualTo(SpuAttrValueRelation.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + } + + @Override + public void deleteSpuAttrValueRelation(Long spuId, Long valueId) { + Sqls sqls = Sqls.custom().andEqualTo(SpuAttrValueRelation.FIELD_GOODS_ID, spuId).andEqualTo(SpuAttrValueRelation.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO); + if (valueId != null){ + sqls.andEqualTo(SpuAttrValueRelation.FIELD_ATTRIBUTE_VALUE_ID,valueId); + } + List spuAttrValueRelationList = spuAttrValueRelationMapper.selectByCondition(Condition.builder(SpuAttrValueRelation.class).andWhere(sqls).build()); + spuAttrValueRelationList.forEach(x->{ + x.setDeleteFlag(ObjectConstant.DeleteFlag.YES); + }); + this.batchUpdateByPrimaryKeySelective(spuAttrValueRelationList); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeRepositoryImpl.java new file mode 100644 index 0000000..8033cea --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeRepositoryImpl.java @@ -0,0 +1,129 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.core.exception.CommonException; +import org.skyer.goods.api.dto.AttrListRequestDTO; +import org.skyer.goods.domain.entity.SpuAttributeValue; +import org.skyer.goods.domain.repository.SpuAttributeValueRepository; +import org.skyer.goods.infra.constant.ObjectConstant; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuAttribute; +import org.skyer.goods.domain.repository.SpuAttributeRepository; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.util.Sqls; + +import cn.hutool.core.collection.CollUtil; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 属性表 资源库实现 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@Component +public class SpuAttributeRepositoryImpl extends BaseRepositoryImpl implements SpuAttributeRepository { + + + @Autowired + private SpuAttributeValueRepository spuAttributeValueRepository; + + @Override + public void saveAttr(List attrs, Long spuId) { + attrs.forEach(item->{ + if (!ObjectConstant.FORM_TYPE_TEXT.equals(item.getSubmissionsType())) { + if (CollUtil.isEmpty(item.getValues())){ + throw new CommonException(item.getAttributeName()+"该文本类型至少需要一个属性值"); + } + } + }); + if (CollUtil.isNotEmpty(attrs) && Boolean.TRUE.equals(checkRepeatCode(attrs))){ + throw new CommonException("属性编码重复"); + } + + List attributeList = attrs.stream().map(item -> { + SpuAttribute attribute = new SpuAttribute(); + BeanUtils.copyProperties(item, attribute); + attribute.setName(item.getAttributeName()); + attribute.setSubmissionsType(item.getSubmissionsType()); + attribute.setDeleteFlag(ObjectConstant.DeleteFlag.NO); + attribute.setSpuId(spuId); + return attribute; + }).collect(Collectors.toList()); + this.batchInsert(attributeList); + attributeList.forEach(x->{ + List values = x.getValues(); + if (CollUtil.isNotEmpty(values) && Boolean.TRUE.equals(checkRepeatValue(values))){ + throw new CommonException("属性值存在重复"); + } + if (CollUtil.isNotEmpty(values)) { + values.forEach(y -> { + SpuAttributeValue value = new SpuAttributeValue(); + BeanUtils.copyProperties(y, value); + value.setAttributeId(x.getId()); + value.setSpuId(spuId); + value.setDeleteFlag(ObjectConstant.DeleteFlag.NO); + spuAttributeValueRepository.insertSelective(value); + }); + } + }); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAttribute(List ids) { + String s1 = ids.stream(). + reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString(); + s1 = s1.substring(0,s1.length()-1); + List select = this.selectByIds(s1); + if (CollUtil.isNotEmpty(select)){ + List attributeList = select.stream().map(item -> { + SpuAttribute spuAttribute = new SpuAttribute(); + spuAttribute.setId(item.getId()); + spuAttribute.setDeleteFlag(ObjectConstant.DeleteFlag.YES); + return spuAttribute; + }).collect(Collectors.toList()); + this.batchUpdateByPrimaryKeySelective(attributeList); + List attrIds = select.stream().map(SpuAttribute::getId).collect(Collectors.toList()); + + List values = spuAttributeValueRepository.selectByCondition(Condition.builder(SpuAttributeValue.class) + .andWhere(Sqls.custom() + .andIn(SpuAttributeValue.FIELD_ATTRIBUTE_ID, attrIds) + .andEqualTo(SpuAttributeValue.FIELD_DELETE_FLAG, ObjectConstant.DeleteFlag.NO)).build()); + + List valueList = values.stream().map(item -> { + SpuAttributeValue spuAttributes = new SpuAttributeValue(); + spuAttributes.setId(item.getId()); + spuAttributes.setDeleteFlag(ObjectConstant.DeleteFlag.YES); + return spuAttributes; + }).collect(Collectors.toList()); + spuAttributeValueRepository.batchUpdateByPrimaryKeySelective(valueList); + } + + + } + + private Boolean checkRepeatCode(List attrs) { + List collectionOptionList; + collectionOptionList=attrs.stream().filter(x->StringUtils.isNotBlank(x.getCode())).map(AttrListRequestDTO::getCode).collect(Collectors.toList()); + Set set = new HashSet<>(collectionOptionList); + return collectionOptionList.size() != set.size(); + } + + private Boolean checkRepeatValue(List values) { + List collectionOptionList; + collectionOptionList=values.stream().filter(x->StringUtils.isNotBlank(x.getValue())).map(SpuAttributeValue::getValue).collect(Collectors.toList()); + Set set = new HashSet<>(collectionOptionList); + return collectionOptionList.size() != set.size(); + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeValueRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeValueRepositoryImpl.java new file mode 100644 index 0000000..ceca359 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuAttributeValueRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuAttributeValue; +import org.skyer.goods.domain.repository.SpuAttributeValueRepository; +import org.springframework.stereotype.Component; + +/** + * 属性值表 资源库实现 + * + * @author linzhuanghuang@ebc.com 2021-12-28 16:40:03 + */ +@Component +public class SpuAttributeValueRepositoryImpl extends BaseRepositoryImpl implements SpuAttributeValueRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceRepositoryImpl.java new file mode 100644 index 0000000..985f4c8 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuInstallService; +import org.skyer.goods.domain.repository.SpuInstallServiceRepository; +import org.springframework.stereotype.Component; + +/** + * 商品安装服务 资源库实现 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@Component +public class SpuInstallServiceRepositoryImpl extends BaseRepositoryImpl implements SpuInstallServiceRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceSkuRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceSkuRepositoryImpl.java new file mode 100644 index 0000000..a92d2e7 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceSkuRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuInstallServiceSku; +import org.skyer.goods.domain.repository.SpuInstallServiceSkuRepository; +import org.springframework.stereotype.Component; + +/** + * 商品安装服务sku表 资源库实现 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@Component +public class SpuInstallServiceSkuRepositoryImpl extends BaseRepositoryImpl implements SpuInstallServiceSkuRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceStoreRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceStoreRepositoryImpl.java new file mode 100644 index 0000000..e1e5014 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuInstallServiceStoreRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuInstallServiceStore; +import org.skyer.goods.domain.repository.SpuInstallServiceStoreRepository; +import org.springframework.stereotype.Component; + +/** + * 商品安装服务售卖门店 资源库实现 + * + * @author chenzz 2021-08-18 16:42:11 + */ +@Component +public class SpuInstallServiceStoreRepositoryImpl extends BaseRepositoryImpl implements SpuInstallServiceStoreRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuRepositoryImpl.java new file mode 100644 index 0000000..19fa95d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuRepositoryImpl.java @@ -0,0 +1,64 @@ +package org.skyer.goods.infra.repository.impl; + +import org.apache.commons.collections4.CollectionUtils; +import org.skyer.core.domain.Page; +import org.skyer.goods.api.dto.GoodsPageReqDTO; +import org.skyer.goods.domain.entity.Spu; +import org.skyer.goods.domain.repository.SpuRepository; +import org.skyer.goods.domain.vo.GoodsPageResVO; +import org.skyer.goods.infra.mapper.SpuMapper; +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.mybatis.domian.Condition; +import org.skyer.mybatis.pagehelper.PageHelper; +import org.skyer.mybatis.util.Sqls; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @description + * @Author wusc + * @create 2021/6/28 10:52 上午 + */ +@Component +public class SpuRepositoryImpl extends BaseRepositoryImpl implements SpuRepository { + @Autowired + private SpuMapper spuMapper; + + @Override + public Spu queryGoodsByName(String name, Long id, Long tenantId) { + List spuList = spuMapper.selectByCondition(Condition.builder(Spu.class).andWhere(Sqls.custom() + .andEqualTo(org.skyer.goods.domain.entity.Spu.NAME, name).andEqualTo(org.skyer.goods.domain.entity.Spu.TENANT_ID, tenantId).andEqualTo(Spu.DELETE_FLAG, 0)).build()); + if (CollectionUtils.isNotEmpty(spuList)){ + if (!spuList.get(0).getId().equals(id)) { + return spuList.get(0); + } + } + return null; + } + + @Override + public Page pageGoods(GoodsPageReqDTO goodsPageReqDTO) { + return PageHelper.doPage(goodsPageReqDTO.getPage(),goodsPageReqDTO.getSize(), + ()-> spuMapper.getGoodsList(goodsPageReqDTO)); + } + + @Override + public List queryGoodsList(List spuCodeList) { + return spuMapper.queryGoodsListBySpu(spuCodeList); + } + + @Override + public Spu queryGoodsByNameNew(String name, Long id) { + List spuList = spuMapper.selectByCondition(Condition.builder(Spu.class).andWhere(Sqls.custom() + .andEqualTo(org.skyer.goods.domain.entity.Spu.NAME, name) + .andEqualTo(Spu.DELETE_FLAG, 0)).build()); + if (CollectionUtils.isNotEmpty(spuList)){ + if (!spuList.get(0).getId().equals(id)) { + return spuList.get(0); + } + } + return null; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumRepositoryImpl.java new file mode 100644 index 0000000..db8d759 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuSonMum; +import org.skyer.goods.domain.repository.SpuSonMumRepository; +import org.springframework.stereotype.Component; + +/** + * 子母商品 资源库实现 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@Component +public class SpuSonMumRepositoryImpl extends BaseRepositoryImpl implements SpuSonMumRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumSkuRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumSkuRepositoryImpl.java new file mode 100644 index 0000000..370c561 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumSkuRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuSonMumSku; +import org.skyer.goods.domain.repository.SpuSonMumSkuRepository; +import org.springframework.stereotype.Component; + +/** + * 子母商品sku表 资源库实现 + * + * @author chenzz 2021-08-17 15:49:14 + */ +@Component +public class SpuSonMumSkuRepositoryImpl extends BaseRepositoryImpl implements SpuSonMumSkuRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumStoreRepositoryImpl.java b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumStoreRepositoryImpl.java new file mode 100644 index 0000000..296b524 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/repository/impl/SpuSonMumStoreRepositoryImpl.java @@ -0,0 +1,17 @@ +package org.skyer.goods.infra.repository.impl; + +import org.skyer.mybatis.base.impl.BaseRepositoryImpl; +import org.skyer.goods.domain.entity.SpuSonMumStore; +import org.skyer.goods.domain.repository.SpuSonMumStoreRepository; +import org.springframework.stereotype.Component; + +/** + * 子母商品售卖门店 资源库实现 + * + * @author chenzz 2021-08-16 15:04:38 + */ +@Component +public class SpuSonMumStoreRepositoryImpl extends BaseRepositoryImpl implements SpuSonMumStoreRepository { + + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/util/Dates.java b/skyer-goods/src/main/java/org/skyer/goods/infra/util/Dates.java new file mode 100644 index 0000000..3b06def --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/util/Dates.java @@ -0,0 +1,32 @@ +package org.skyer.goods.infra.util; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +/** + * 日期工具 + * + * @author bojiangzhou 2018/07/31 + */ +public class Dates { + + private Dates() {} + + public static long getSecondsFromNowToDate(LocalDateTime dateTime) { + if (dateTime == null) { + return -1; + } + long diff = (dateTime.toInstant(ZoneOffset.UTC).toEpochMilli() + - LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()) / 1000; + return diff < 0 ? -1 : diff; + } + + public static boolean isBetweenOrEqual(LocalDateTime date, LocalDateTime startDate, LocalDateTime endDate) { + return date.isAfter(startDate) && date.isBefore(endDate) || date.isEqual(startDate) || date.isEqual(endDate); + } + + public static boolean isAfterOrEqual(LocalDateTime date, LocalDateTime another) { + return date.isAfter(another) || date.isEqual(another); + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/util/EsBoolQueryUtil.java b/skyer-goods/src/main/java/org/skyer/goods/infra/util/EsBoolQueryUtil.java new file mode 100644 index 0000000..73ecc5d --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/util/EsBoolQueryUtil.java @@ -0,0 +1,548 @@ +package org.skyer.goods.infra.util; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * es boolean 检索工具类 + * @author ChenQuanAn + * @date 1.0 2020/12/3 11:07 下午 + */ +public class EsBoolQueryUtil { + + /** + * 字符串"and"短语查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value需要是field值的一部分才能匹配成功 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder andPhraseQuery(BoolQueryBuilder builder, String field, String value) { + if(StringUtils.isNotBlank(value)) { + builder = builder.must(new MatchPhraseQueryBuilder(field, value.trim())); + } + return builder; + } + + /** + * 字符串"and"模糊查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder andStringQuery(BoolQueryBuilder builder, String field, String value) { + if(StringUtils.isNotBlank(value)) { + builder = builder.must(new SimpleQueryStringBuilder(value.trim()).field(field).defaultOperator(Operator.AND)); + } + return builder; + } + /** + * 字符串"and-not"反向模糊查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder andNotStringQuery(BoolQueryBuilder builder, String field, String value) { + if(StringUtils.isNotBlank(value)) { + builder = builder.mustNot(new SimpleQueryStringBuilder(value.trim()).field(field).defaultOperator(Operator.AND)); + } + return builder; + } + + /** + * 字符串"and"精确匹配 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value必须是field分词后的某一个词才能匹配成功 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder andTermQuery(BoolQueryBuilder builder, String field, String value) { + if(StringUtils.isNotBlank(value)) { + builder = builder.must(new TermQueryBuilder(field, value.trim())); + } + return builder; + } + + + /** + * 其他类型(数值,bool)"and"精确匹配,value必须与field值完全一致才能匹配成功 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder andTermQuery(BoolQueryBuilder builder, String field, Object value) { + if(value != null) { + builder = builder.must(new TermQueryBuilder(field, value)); + } + return builder; + } + + /** + * 字符串通配符匹配,类似于数据库的like查询,为了性能,只能在右边加通配符 + * @param builder + * @param field + * @param value + * @param wildcardChar 通配符 例如: *、?等 + * @return + */ + public static BoolQueryBuilder andWildcardQuery(BoolQueryBuilder builder, String field, String value, String wildcardChar) { + if(StringUtils.isNotBlank(value)) { + builder = builder.must(new WildcardQueryBuilder(field, value + wildcardChar)); + } + return builder; + } + + /** + * 字符串"and"多字段模糊查询,单个值同时匹配多个字段,多个字段之间用or查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param value + * @param fields + * @return + */ + public static BoolQueryBuilder andMultiFieldStringQuery(BoolQueryBuilder builder, String value, String...fields) { + if(StringUtils.isNotBlank(value)) { + BoolQueryBuilder orQueryBuilder = QueryBuilders.boolQuery(); + for(String field : fields) { + orQueryBuilder = orQueryBuilder.should(new SimpleQueryStringBuilder(value.trim()).field(field).defaultOperator(Operator.AND)); + } + builder = builder.must(orQueryBuilder); + } + + return builder; + } + + /** + * 字符串"and"多字段精确查询,单个值同时匹配多个字段,多个字段之间用or查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value必须是field分词后的某一个词才能匹配成功 + * @param builder + * @param value + * @param fields + * @return + */ + public static BoolQueryBuilder andMultiFieldTermQuery(BoolQueryBuilder builder, String value, String...fields) { + if(StringUtils.isNotBlank(value)) { + BoolQueryBuilder orQueryBuilder = QueryBuilders.boolQuery(); + for(String field : fields) { + orQueryBuilder = orQueryBuilder.should(new TermQueryBuilder(field, value.trim())); + } + builder = builder.must(orQueryBuilder); + } + + return builder; + } + + /** + * 字符串通多字段通配符匹配,类似于数据库的like查询,为了性能,只能在右边加通配符 + * @param builder + * @param value + * @param wildcardChar 通配符 例如: *、?等 + * @return + */ + public static BoolQueryBuilder andMultiFieldWildcardQuery(BoolQueryBuilder builder, String value, String wildcardChar, String...fields) { + if(StringUtils.isNotBlank(value)) { + BoolQueryBuilder orQueryBuilder = QueryBuilders.boolQuery(); + for(String field : fields) { + orQueryBuilder = orQueryBuilder.should(new WildcardQueryBuilder(field, value.trim() + wildcardChar)); + } + builder = builder.must(orQueryBuilder); + } + + return builder; + } + + /** + * 范围查询,一般用于数值类型 + * @param builder + * @param field + * @param minValueExclude + * @param maxValueInclude + * @return + */ + public static BoolQueryBuilder andRangeQuery(BoolQueryBuilder builder, String field, Object minValueExclude, Object maxValueInclude) { + if(minValueExclude == null && maxValueInclude == null) { + return builder; + } + + RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder(field); + if(minValueExclude != null) { + rangeQueryBuilder = rangeQueryBuilder.gt(minValueExclude); + } + if(maxValueInclude != null) { + rangeQueryBuilder = rangeQueryBuilder.lte(maxValueInclude); + } + return builder.must(rangeQueryBuilder); + } + + /** + * 范围查询,专用于日期类型 + * @param builder + * @param field + * @param minValueInclude + * @param maxValueExclude + * @return + */ + public static BoolQueryBuilder andRangeQuery(BoolQueryBuilder builder, String field, Date minValueInclude, Date maxValueExclude) { + if(minValueInclude == null && maxValueExclude == null) { + return builder; + } + + RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder(field); + if(minValueInclude != null) { + rangeQueryBuilder = rangeQueryBuilder.gte(toEsDataMillsecond(minValueInclude)); + } + if(maxValueExclude != null) { + rangeQueryBuilder = rangeQueryBuilder.lt(toEsDataMillsecond(maxValueExclude)); + } + return builder.must(rangeQueryBuilder); + } + + private static Long toEsDataMillsecond(Date date) { + if (date == null) { + return null; + } + Long second = date.getTime(); + // 查询的时候,参数传入es会少8个小时,所以在这边加上 + return second + 8 * 60 * 60 * 1000L; + } + + /** + * 字符串"in"模糊查询,相当于数据库的in查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param field + * @param values + * @return + */ + public static BoolQueryBuilder inStringQuery(BoolQueryBuilder builder, String field, Collection values) { + if(CollectionUtils.isEmpty(values)) { + return builder; + } + BoolQueryBuilder shouldBuilder = new BoolQueryBuilder(); + for(String value : values) { + if(StringUtils.isNotBlank(value)) { + shouldBuilder = shouldBuilder.should(new SimpleQueryStringBuilder(value).field(field).defaultOperator(Operator.AND)); + } + } + builder = builder.must(shouldBuilder); + return builder; + } + + /** + * 字符串"in"精确匹配,相当于数据库的in查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value必须是field分词后的某一个词才能匹配成功 + * @param builder + * @param field + * @param values + * @return + */ + public static BoolQueryBuilder inTermQuery(BoolQueryBuilder builder, String field, Collection values) { + if(CollectionUtils.isEmpty(values)) { + return builder; + } + BoolQueryBuilder shouldBuilder = new BoolQueryBuilder(); + for(Object value : values) { + if(value != null && StringUtils.isNotBlank(value.toString())) { + shouldBuilder = shouldBuilder.should(new TermQueryBuilder(field, value)); + } + } + builder = builder.must(shouldBuilder); + return builder; + } + + public static BoolQueryBuilder inTermQuery(BoolQueryBuilder builder, String field, Integer... values) { + if(CollectionUtils.isEmpty(Arrays.asList(values))) { + return builder; + } + BoolQueryBuilder shouldBuilder = new BoolQueryBuilder(); + for(Object value : values) { + if(value != null && StringUtils.isNotBlank(value.toString())) { + shouldBuilder = shouldBuilder.should(new TermQueryBuilder(field, value)); + } + } + builder = builder.must(shouldBuilder); + return builder; + } + + /** + * 字符串"in"短语查询,相当于数据库的in查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value需要是field值的一部分才能匹配成功 + * @param builder + * @param field + * @param values + * @return + */ + public static BoolQueryBuilder inPhraseQuery(BoolQueryBuilder builder, String field, Collection values) { + if(CollectionUtils.isEmpty(values)) { + return builder; + } + BoolQueryBuilder shouldBuilder = new BoolQueryBuilder(); + for(Object value : values) { + if(value != null && StringUtils.isNotBlank(value.toString())) { + shouldBuilder = shouldBuilder.should(new MatchPhraseQueryBuilder(field, value)); + } + } + builder = builder.must(shouldBuilder); + return builder; + } + + /** + * 字符串"in"通配符匹配,相当于数据库的in查询,通配符匹配类似于数据库的like查询,为了性能,只能在右边加通配符 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value需要是field值的一部分才能匹配成功 + * @param builder + * @param field + * @param values + * @param wildcardChar 通配符 例如: *、?等 + * @return + */ + public static BoolQueryBuilder inWildcardQuery(BoolQueryBuilder builder, String field, Collection values, String wildcardChar) { + if(CollectionUtils.isEmpty(values)) { + return builder; + } + BoolQueryBuilder shouldBuilder = new BoolQueryBuilder(); + for(String value : values) { + if(StringUtils.isNotBlank(value)) { + shouldBuilder = shouldBuilder.should(new WildcardQueryBuilder(field, value.trim() + wildcardChar)); + } + } + builder = builder.must(shouldBuilder); + return builder; + } + + /** + * 字符串"in"多字段短语查询,多字段的in查询,多个字段之间用or连接 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value需要是field值的一部分才能匹配成功 + * @param builder + * @param valueList + * @param fields + * @return + */ + public static BoolQueryBuilder inMultiFieldPhraseQuery(BoolQueryBuilder builder, Collection valueList, String...fields) { + valueList = valueList == null ? null : valueList.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(valueList)) { + BoolQueryBuilder orQueryBuilder = QueryBuilders.boolQuery(); + for(String field : fields) { + for(String value : valueList) { + orQueryBuilder = orQueryBuilder.should(new MatchPhraseQueryBuilder(field, value.trim())); + } + } + builder = builder.must(orQueryBuilder); + } + + return builder; + } + + /** + * 字符串"in"多字段通配符匹配,多字段的in查询,多个字段之间用or连接,通配符匹配类似于数据库的like查询,为了性能,只能在右边加通配符 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value需要是field值的一部分才能匹配成功 + * @param builder + * @param valueList + * @param wildcardChar 通配符 例如: *、?等 + * @param fields + * @return + */ + public static BoolQueryBuilder inMultiFieldWildcardQuery(BoolQueryBuilder builder, Collection valueList, String wildcardChar, String...fields) { + valueList = valueList == null ? null : valueList.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(valueList)) { + BoolQueryBuilder orQueryBuilder = QueryBuilders.boolQuery(); + for(String field : fields) { + for(String value : valueList) { + orQueryBuilder = orQueryBuilder.should(new WildcardQueryBuilder(field, value.trim() + wildcardChar)); + } + } + builder = builder.must(orQueryBuilder); + } + + return builder; + } + + /** + * 字符串"in"多字段模糊查询,多字段的in查询,多个字段之间用or连接 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param valueList + * @param fields + * @return + */ + public static BoolQueryBuilder inMultiFieldStringQuery(BoolQueryBuilder builder, Collection valueList, String...fields) { + valueList = valueList == null ? null : valueList.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(valueList)) { + BoolQueryBuilder orQueryBuilder = QueryBuilders.boolQuery(); + for(String field : fields) { + for(String value : valueList) { + orQueryBuilder = orQueryBuilder.should(new SimpleQueryStringBuilder(value.trim()).field(field).defaultOperator(Operator.AND)); + } + } + builder = builder.must(orQueryBuilder); + } + + return builder; + } + + /** + * 字符串"or"模糊查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder orStringQuery(BoolQueryBuilder builder, String field, String value) { + if(StringUtils.isNotBlank(value)) { + builder = builder.should(new SimpleQueryStringBuilder(value).field(field).defaultOperator(Operator.AND)); + } + return builder; + } + + /** + * 字符串"or"精确匹配,相当于数据库的in查询 + * 1. field类型为keyword: value需要与field值完全一致才能匹配成功 + * 2. field类型为text: value必须是field分词后的某一个词才能匹配成功 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder orTermQuery(BoolQueryBuilder builder, String field, Object value) { + if(value != null && StringUtils.isNotBlank(value.toString())) { + builder = builder.should(new TermQueryBuilder(field, value)); + } + return builder; + } + + /** + * 字符串"not"模糊查询 + * 1. field类型为keyword: value需要与field值完全不一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都不存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder notStringQuery(BoolQueryBuilder builder, String field, String value) { + if(StringUtils.isNotBlank(value)) { + builder = builder.mustNot(new SimpleQueryStringBuilder(value).field(field).defaultOperator(Operator.AND)); + } + return builder; + } + + /** + * 字符串"not"精确匹配,相当于数据库的in查询 + * 1. field类型为keyword: value需要与field值完全不一致才能匹配成功 + * 2. field类型为text: value必须不是field分词后的某一个词才能匹配成功 + * @param builder + * @param field + * @param value + * @return + */ + public static BoolQueryBuilder notTermQuery(BoolQueryBuilder builder, String field, Object value) { + if(value != null && StringUtils.isNotBlank(value.toString())) { + builder = builder.mustNot(new TermQueryBuilder(field, value)); + } + return builder; + } + + /** + * 字符串"not in"模糊查询,相当于数据库的not in查询 + * 1. field类型为keyword: value需要与field值完全不一致才能匹配成功 + * 2. field类型为text: value分词后的结果必须都不存在于field值中,不要求顺序,也不要求连续 + * @param builder + * @param field + * @param values + * @return + */ + public static BoolQueryBuilder notInStringQuery(BoolQueryBuilder builder, String field, Collection values) { + if(values != null) { + for(String value : values) { + if(StringUtils.isNotBlank(value)) { + builder = builder.mustNot(new SimpleQueryStringBuilder(value).field(field).defaultOperator(Operator.AND)); + } + } + } + return builder; + } + + /** + * 字符串"not in"精确匹配,相当于数据库的not in查询 + * 1. field类型为keyword: value需要与field值完全不一致才能匹配成功 + * 2. field类型为text: value必须不是field分词后的某一个词才能匹配成功 + * @param builder + * @param field + * @param values + * @return + */ + public static BoolQueryBuilder notInTermQuery(BoolQueryBuilder builder, String field, Collection values) { + if(values != null) { + for(Object value : values) { + if(value != null && StringUtils.isNotBlank(value.toString())) { + builder = builder.mustNot(new TermQueryBuilder(field, value)); + } + } + } + return builder; + } + + public static BoolQueryBuilder notNull(BoolQueryBuilder builder, String field) { + return builder.must(new ExistsQueryBuilder(field)); + } + + /** + * 设置分页 + * @param builder + * @return + */ + public static SearchSourceBuilder page(SearchSourceBuilder builder, int number,int size) { + int from = (number ) * size; + return builder.from(from).size(size); + } + + /** + * 设置排序,支持多字段排序,排序字段list中的每一项为一个排序字段,格式为: field,asc/desc。例如:createDate,asc 表示按创建时间升序排序。注意: text类型的字段不能做为排序字段。 + * @param builder + * @param orders + * @return + */ + public static SearchSourceBuilder order(SearchSourceBuilder builder, List orders) { + if(CollectionUtils.isEmpty(orders)) { + return builder; + } + + for (String order : orders) { + String[] orderData = order.split(","); + String field = StringUtils.trimToEmpty(orderData[0]); + String sortType = orderData.length > 1 ? StringUtils.trimToEmpty(orderData[1]) : ""; + builder = builder.sort(field, SortOrder.DESC.name().equalsIgnoreCase(sortType) ? SortOrder.DESC : SortOrder.ASC); + } + return builder; + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/util/JsonUtils.java b/skyer-goods/src/main/java/org/skyer/goods/infra/util/JsonUtils.java new file mode 100644 index 0000000..06c851c --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/util/JsonUtils.java @@ -0,0 +1,205 @@ +package org.skyer.goods.infra.util; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; + +import org.skyer.core.exception.CommonException; + +import org.skyer.core.base.BaseConstants; +import org.skyer.core.util.ResponseUtils; + +/** + * Json工具类 + * + * @author gaokuo.dai@hand-china.com 2018年7月5日下午6:05:08 + * @see ResponseUtils + */ +public class JsonUtils { + + private static Logger logger = LoggerFactory.getLogger(JsonUtils.class); + + private JsonUtils() {} + + /** + * 校验Json + *

+ *

+ * 如果为标准错误 + *

+ *

+ * {"failed": true, "meesage": "error message..."} + *

+ *

+ * 则抛出CommonException + *

+ *

+ * 如果入参不是一个合法的json,则返回null + * + * @param json + * @param objectMapper + * @return 由Json转化而来的JsonNode或null + */ + public static JsonNode checkResultStatus(String json, ObjectMapper objectMapper) { + // 空json不校验 + if (StringUtils.isBlank(json)) { + return null; + } + JsonNode jsonNode = null; + try { + jsonNode = objectMapper.readTree(json); + } catch (IOException e) { + // 源字符串不是json,忽略 + return null; + } + return checkResultStatus(jsonNode); + } + + /** + * 校验JsonNode + *

+ *

+ * 如果为标准错误 + *

+ *

+ * {"failed": true, "meesage": "error message..."} + *

+ *

+ * 则抛出CommonException + *

+ *

+ * 如果入参不是一个合法的json,则返回null + * + * @param jsonNode + * @return 通过校验的JsonNode, 如果入参jsonNode为空或者jsonNode中没有数据, 则返回null + */ + public static JsonNode checkResultStatus(JsonNode jsonNode) { + // 空json不校验 + if (jsonNode == null) { + return null; + } + if (jsonNode.isNull() || jsonNode.isMissingNode()) { + return null; + } + if (jsonNode.isObject()) { + JsonNode keyNode = jsonNode.get(BaseConstants.FIELD_FAILED); + if (keyNode != null && keyNode.isBoolean() && keyNode.asBoolean()) { + JsonNode messageNode = jsonNode.get(BaseConstants.FIELD_MSG); + throw new CommonException(messageNode == null ? StringUtils.EMPTY : messageNode.toString()); + } + } + return jsonNode; + } + + + /** + * 校验Json,并解析为指定类型 + * + * @param json Json + * @param objectMapper {@link ObjectMapper} + * @param clazz 指定类型Class + * @return 解析后的对象 + */ + public static T checkAndParseObject(String json, ObjectMapper objectMapper, Class clazz) { + JsonNode jsonNode = checkResultStatus(json, objectMapper); + if (jsonNode == null) { + return null; + } + Assert.isTrue(!jsonNode.isArray(), "this json is an array, please user JsonUtil.checkAndParseList"); + try { + return objectMapper.readValue(json, clazz); + } catch (IOException e) { + logger.error(e.getMessage(), e); + throw new CommonException(e); + } + } + + /** + * 校验JsonNode,并解析为指定类型 + * + * @param jsonNode JsonNode + * @param objectMapper {@link ObjectMapper} + * @param clazz 指定类型Class + * @return 解析后的对象 + */ + public static T checkAndParseObject(JsonNode jsonNode, ObjectMapper objectMapper, Class clazz) { + jsonNode = checkResultStatus(jsonNode); + if (jsonNode == null) { + return null; + } + Assert.isTrue(!jsonNode.isArray(), "this json is an array, please user JsonUtil.checkAndParseList"); + try { + return objectMapper.readValue(jsonNode.toString(), clazz); + } catch (IOException e) { + logger.error(e.getMessage(), e); + throw new CommonException(e); + } + } + + /** + * 校验Json,并解析为指定类型的List + * + * @param json Json + * @param objectMapper {@link ObjectMapper} + * @param clazz 指定类型Class + * @return 解析后的List + */ + public static List checkAndParseList(String json, ObjectMapper objectMapper, Class clazz) { + JsonNode jsonNode = checkResultStatus(json, objectMapper); + if (jsonNode == null) { + return null; + } + Assert.isTrue(jsonNode.isArray(), "this json is not an array, please user JsonUtil.checkAndParseObject"); + Iterator iterator = jsonNode.elements(); + JsonNode child; + List result = new ArrayList<>(); + try { + while (iterator.hasNext()) { + child = iterator.next(); + result.add(objectMapper.readValue(child.toString(), clazz)); + } + } catch (IOException e) { + logger.error(e.getMessage(), e); + throw new CommonException(e); + } + return result; + } + + /** + * 校验 JsonNode,并解析为指定类型的List + * + * @param jsonNode JsonNode + * @param objectMapper {@link ObjectMapper} + * @param clazz 指定类型Class + * @return 解析后的List + */ + public static List checkAndParseList(JsonNode jsonNode, ObjectMapper objectMapper, Class clazz) { + jsonNode = checkResultStatus(jsonNode); + if (jsonNode == null) { + return null; + } + Assert.isTrue(jsonNode.isArray(), "this json is not an array, please user JsonUtil.checkAndParseObject"); + Iterator iterator = jsonNode.elements(); + JsonNode child; + List result = new ArrayList<>(); + try { + while (iterator.hasNext()) { + child = iterator.next(); + result.add(objectMapper.readValue(child.toString(), clazz)); + } + } catch (IOException e) { + logger.error(e.getMessage(), e); + throw new CommonException(e); + } + return result; + } + +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/util/ListUtils.java b/skyer-goods/src/main/java/org/skyer/goods/infra/util/ListUtils.java new file mode 100644 index 0000000..f135136 --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/util/ListUtils.java @@ -0,0 +1,67 @@ +package org.skyer.goods.infra.util; + + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * List集合工具类 + * @author xurongfa 2021-01-04 12:33 + */ +public class ListUtils{ + + /** + * 根据 func函数返回值,提取list的重复元素 + * @param list 待提取的对象集合 + * @param func 处理对象的函数 + * @param 入参对象类型 + * @param 出参类型,func结果类型 + * @return 重复的func结果 + */ + public static List getRepeatList(List list, Function func){ + if (Objects.isNull(list)){ + return new ArrayList<>(); + } + return list.stream() + .map(func) + .filter(Objects::nonNull) + .collect(Collectors.toMap(x -> x, x -> 1, Integer::sum)) //记录出现次数 + .entrySet().stream() + .filter(x->x.getValue() > 1) //过滤重复的属性 + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + /** + * List 转其他类型List + */ + public static List listConvert(List lists, Class clzz) { + List vos = new ArrayList<>(); + if (CollectionUtils.isEmpty(lists)) { + return vos; + } + try { + vos = lists.stream().map(e -> { + try { + T t = clzz.newInstance(); + BeanUtils.copyProperties(e, t); + return t; + } catch (InstantiationException | IllegalAccessException ex) { + ex.printStackTrace(); + } + return null; + }).collect(Collectors.toList()); + return vos; + } catch (Exception e) { + e.printStackTrace(); + return new ArrayList<>(); + } + } +} diff --git a/skyer-goods/src/main/java/org/skyer/goods/infra/util/Md5Utils.java b/skyer-goods/src/main/java/org/skyer/goods/infra/util/Md5Utils.java new file mode 100644 index 0000000..c9d09ad --- /dev/null +++ b/skyer-goods/src/main/java/org/skyer/goods/infra/util/Md5Utils.java @@ -0,0 +1,24 @@ +package org.skyer.goods.infra.util; + + +import cn.hutool.crypto.digest.MD5; + +import java.util.Arrays; +import java.util.Base64; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @description + * @Author wusc + * @create 2021/7/29 3:23 下午 + */ +public class Md5Utils { + + + public static String createMd5ByLong(List attrList) { + String collect = attrList.stream().map(String::valueOf).collect(Collectors.joining(",")); + return Base64.getEncoder().encodeToString(MD5.create().digest(collect)); + } + +} diff --git a/skyer-goods/src/main/resources/application.yml b/skyer-goods/src/main/resources/application.yml new file mode 100644 index 0000000..298ad71 --- /dev/null +++ b/skyer-goods/src/main/resources/application.yml @@ -0,0 +1,165 @@ +spring: + application: + name: skyer-goods + datasource: + url: ${SPRING_DATASOURCE_URL:jdbc:mysql://192.168.124.106:30336/skyer_goods?useUnicode=true&characterEncoding=utf-8&useSSL=false} + username: ${SPRING_DATASOURCE_USERNAME:root} + password: ${SPRING_DATASOURCE_PASSWORD:Ss110110} + hikari: + # 连接池最小空闲连接数 + minimum-idle: ${SPRING_DATASOURCE_MINIMUM_IDLE:20} + # 连接池允许的最大连接数 + maximum-pool-size: ${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:200} + # 等待连接池分配连接的最大时长(毫秒) + connection-timeout: ${SPRING_DATASOURCE_CONNECTION_TIMEOUT:30000} + redis: + host: ${SPRING_REDIS_HOST:192.168.124.135} + port: ${SPRING_REDIS_PORT:30379} + database: ${SPRING_REDIS_DATABASE:1} + password: ${SPRING_REDIS_PASSWORD:Ss110110} + lettuce: + pool: + # 资源池中最大连接数 + # 默认8,-1表示无限制;可根据服务并发redis情况及服务端的支持上限调整 + max-active: ${SPRING_REDIS_POOL_MAX_ACTIVE:50} + # 资源池运行最大空闲的连接数 + # 默认8,-1表示无限制;可根据服务并发redis情况及服务端的支持上限调整,一般建议和max-active保持一致,避免资源伸缩带来的开销 + max-idle: ${SPRING_REDIS_POOL_MAX_IDLE:50} + # 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒) + # 默认 -1 表示永不超时,设置5秒 + max-wait: ${SPRING_REDIS_POOL_MAX_WAIT:5000} + +server: + undertow: + # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接 + # 默认值为8,建议设置每个CPU核心一个线程 + io-threads: ${SERVER_UNDERTOW_IO_THREADS:4} + # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程 + # 默认等于 io-threads*8,它的值设置取决于系统的负载,可适当调大该值 + worker-threads: ${SERVER_UNDERTOW_WORKER_THREADS:128} + # 每块buffer的空间大小,越小空间被利用越充分 + # 不要设置太大,以免影响其他应用,合适即可 + buffer-size: ${SERVER_UNDERTOW_BUFFER_SIZE:1024} + # 是否分配的直接内存(NIO直接分配的堆外内存) + # 默认false + direct-buffers: true + # HTTP POST请求最大的大小 + # 默认0,无限制,可设置10M + max-http-post-size: 10485760 + allow-unescaped-characters-in-url: true + +feign: + hystrix: + enabled: true + +hystrix: + threadpool: + default: + # 执行命令线程池的核心线程数,也是命令执行的最大并发量 + # 默认10 + coreSize: 1000 + # 最大执行线程数 + maximumSize: 1000 + command: + default: + execution: + isolation: + thread: + # HystrixCommand 执行的超时时间,超时后进入降级处理逻辑。一个接口,理论的最佳响应速度应该在200ms以内,或者慢点的接口就几百毫秒。 + # 默认 1000 毫秒,最高设置 2000足矣。如果超时,首先看能不能优化接口相关业务、SQL查询等,不要盲目加大超时时间,否则会导致线程堆积过多,hystrix 线程池卡死,最终服务不可用。 + timeoutInMilliseconds: ${HYSTRIX_COMMAND_TIMEOUT_IN_MILLISECONDS:40000} + +ribbon: + # 客户端读取超时时间,超时时间要小于Hystrix的超时时间,否则重试机制就无意义了 + ReadTimeout: ${RIBBON_READ_TIMEOUT:30000} + # 客户端连接超时时间 + ConnectTimeout: ${RIBBON_CONNECT_TIMEOUT:3000} + # 访问实例失败(超时),允许自动重试,设置重试次数,失败后会更换实例访问,请一定确保接口的幂等性,否则重试可能导致数据异常。 + OkToRetryOnAllOperations: true + MaxAutoRetries: 1 + MaxAutoRetriesNextServer: 1 + +mybatis: + mapperLocations: classpath*:/mapper/*.xml + configuration: + mapUnderscoreToCamelCase: true + key-generator: snowflake + +skyer: + lov: + # 是否开启SQL类型LOV + sql: + enabled: ${SKYER_LOV_SQL_ENABLED:true} + # 是否开启LOV值翻译 + value: + enabled: ${SKYER_LOV_VALUE_ENABLED:true} + platform: + # 是否启动初始化缓存 + init-cache: ${SKYER_PLATFORM_INIT_CACHE:true} + # 平台HTTP协议 + http-protocol: ${SKYER_PLATFORM_HTTP_PROTOCOL:http} + # 角色模板编码 + role-template-codes: + - ${SKYER_SALES_TEMPLATE_CODE:role/organization/default/template/sales} + - ${SKYER_EXPERTS_TEMPLATE_CODE:role/organization/default/template/experts} + regist-entity: + # 是否开启实体类的注册 + enable: ${SKYER_REGIST_ENTITY_ENABLE:false} + # 公钥和私钥 + encrypt: + public-key: ${SKYER_OAUTH_PASSWORD_PUBLIC_KEY:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIPdTZ1b9Q13Y2YmZ4mjQnFpypCqhV6rjGgsTQMYqC0eVu/je3/L98/4/j3lNePWqwHgCDD0mxISFm44nDKfPbcCAwEAAQ==} + private-key: ${SKYER_OAUTH_PASSWORD_PRIVATE_KEY:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAg91NnVv1DXdjZiZniaNCcWnKkKqFXquMaCxNAxioLR5W7+N7f8v3z/j+PeU149arAeAIMPSbEhIWbjicMp89twIDAQABAkAYAgbLi56GISJ7yqo3KP5D39r9k85MejdKECbFVYvpCsLG51IrwtVcdGJTExmkzIuOWnwqRAYUjpQnVvPvLzZhAiEA/Dyk4j+XZtC7NVxrXjn+PHG0vWZ8x14G5sBL6RfgzEsCIQCF1O0383YF0BbDUGkBoaVGmEc3H0D7FQF5L4gMe5EYxQIgLljOSyw4G5I68+EZcWTijCSweyS7xL5IMlofGKNkkOUCIC+hqdAZEW9eMUvQaZ8QBf/LIMWIlRsHzd9wwE4ZCHo1AiEAqsUlDIIfPOrjQfbeYVWSD+Ac9PzMiFfH9H/WMuaWRtw=} + data: + permission: + db-owner: ${SKYER_DB_OWNER:} + change: + enable: true + audit: + operation: + # 全局开关,默认 false + enable: true + data: + # 是否启用数据变更监控功能 + enable: true + scheduler: + executor-code: HPFM_EXECUTOR + export: + enable-async: true + api-customize: + enable-agent: false + resource: + # 匹配的资源才会解析JwtToken便于得到UserDetails + pattern: ${SKYER_RESOURCE_PATTERN:/v1/*,/sgoo/v1/*,/sgoo/skyer/*} + field-permission: + enable: true + cache-value: + # 启用 CacheValue 缓存 + enable: true + saga: + consumer: + enabled: true # 启动消费端 + thread-num: 2 # saga消息消费线程池大小 + max-poll-size: 200 # 每次拉取消息最大数量 + poll-interval-ms: 1000 # 拉取间隔,默认1000毫秒 + core-thread-num: 1 + max-thread-num: 5 + hsrh: + elasticsearch: + cluster-nodes: ${ELASTICSEARCH_DEFAULT_URL:skyer-elasticsearch:9200} + max-connect-num: 50 + max-connect-per-route: 10 + thread-pool: + core-size: 12 + max-pool-size: 24 + keep-alive-seconds: 30 + queue-capacity: 64 + max-thread: ${SSRH_MAX_THREAD:2} + thread-size: ${SSRH_THREAD_SIZE:2000} + +logging: + level: + org.skyer: ${LOG_LEVEL:info} + org.skyer.mybatis: ${LOG_LEVEL:info} + org.skyer.platform: ${LOG_LEVEL:info} + org.skyer.starter: ${LOG_LEVEL:info} + org.skyer.plugin.platform: ${LOG_LEVEL:info} diff --git a/skyer-goods/src/main/resources/banner.txt b/skyer-goods/src/main/resources/banner.txt new file mode 100644 index 0000000..786f537 --- /dev/null +++ b/skyer-goods/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + + █████████ █████ ████ █████ █████ ██████████ ███████████ + ███░░░░░███░░███ ███░ ░░███ ░░███ ░░███░░░░░█░░███░░░░░███ +░███ ░░░ ░███ ███ ░░███ ███ ░███ █ ░ ░███ ░███ +░░█████████ ░███████ ░░█████ ░██████ ░██████████ + ░░░░░░░░███ ░███░░███ ░░███ ░███░░█ ░███░░░░░███ + ███ ░███ ░███ ░░███ ░███ ░███ ░ █ ░███ ░███ +░░█████████ █████ ░░████ █████ ██████████ █████ █████ + ░░░░░░░░░ ░░░░░ ░░░░ ░░░░░ ░░░░░░░░░░ ░░░░░ ░░░░░ +:: ${spring.application.name} :: (v${eureka.instance.metadata-map.VERSION}.RELEASE) diff --git a/skyer-goods/src/main/resources/bootstrap.yml b/skyer-goods/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..3868a5b --- /dev/null +++ b/skyer-goods/src/main/resources/bootstrap.yml @@ -0,0 +1,32 @@ +server: + port: 8310 +management: + server: + port: 8311 + endpoints: + web: + exposure: + include: '*' + +spring: + cloud: + inetutils: + preferred-networks: + - 192 + +eureka: + instance: + # 以IP注册到注册中心 + preferIpAddress: ${EUREKA_INSTANCE_PREFER_IP_ADDRESS:true} + leaseRenewalIntervalInSeconds: 10 + leaseExpirationDurationInSeconds: 30 + # 服务的一些元数据信息k + metadata-map: +# developer: zhanglongbing #这里填写开发者自身的工号 + VERSION: 1.0.0 + client: + serviceUrl: + # 注册中心地址 + defaultZone: ${EUREKA_DEFAULT_ZONE:http://eureka.ebc.com/eureka} + registryFetchIntervalSeconds: 10 + disable-delta: true diff --git a/skyer-goods/src/main/resources/mapper/BrandMapper.xml b/skyer-goods/src/main/resources/mapper/BrandMapper.xml new file mode 100644 index 0000000..22703c3 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/BrandMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, + code, logo, manufacturer, name, remark, status, delete_flag, creation_date, last_update_date, created_by, last_updated_by, object_version_number, tenant_id + + + + diff --git a/skyer-goods/src/main/resources/mapper/CategoryAttributeMapper.xml b/skyer-goods/src/main/resources/mapper/CategoryAttributeMapper.xml new file mode 100644 index 0000000..27b4341 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/CategoryAttributeMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/CategoryAttributeValueMapper.xml b/skyer-goods/src/main/resources/mapper/CategoryAttributeValueMapper.xml new file mode 100644 index 0000000..0023bfb --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/CategoryAttributeValueMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + DELETE + FROM sgoo_category_attribute_value + WHERE EXISTS( + SELECT 1 + FROM sgoo_category_attribute t_attr + WHERE t_attr.category_id = #{categoryId} + AND t_attr.id = sgoo_category_attribute_value.attribute_id + ) + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/CategoryMapper.xml b/skyer-goods/src/main/resources/mapper/CategoryMapper.xml new file mode 100644 index 0000000..d1d65ed --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/CategoryMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + id, code, name, parent_id, status_flag, level, sub_flag, sort, remark, + creation_date, last_update_date, created_by, last_updated_by, object_version_number + + + + + id = #{id} + + + AND code = #{code} + + + + AND name like #{nameLike} + + + AND parent_id = #{parentId} + + + AND status_flag = #{statusFlag} + + + AND level = #{level} + + + AND sub_flag = #{subFlag} + + + AND sort = #{sort} + + + AND remark = #{remark} + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/GoodsShopMapper.xml b/skyer-goods/src/main/resources/mapper/GoodsShopMapper.xml new file mode 100644 index 0000000..8c587d9 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/GoodsShopMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/InstallServiceMapper.xml b/skyer-goods/src/main/resources/mapper/InstallServiceMapper.xml new file mode 100644 index 0000000..9f2f61d --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/InstallServiceMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/MaterialMapper.xml b/skyer-goods/src/main/resources/mapper/MaterialMapper.xml new file mode 100644 index 0000000..fa502d6 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/MaterialMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, + code, detail_html, detail_image, main_image, material_name, remark, delete_flag, creation_date, last_update_date, created_by, last_updated_by, object_version_number, tenant_id + + + diff --git a/skyer-goods/src/main/resources/mapper/SkuAttrValueRelationMapper.xml b/skyer-goods/src/main/resources/mapper/SkuAttrValueRelationMapper.xml new file mode 100644 index 0000000..f1467d5 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuAttrValueRelationMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuAttributeValueDraftMapper.xml b/skyer-goods/src/main/resources/mapper/SkuAttributeValueDraftMapper.xml new file mode 100644 index 0000000..2861aa8 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuAttributeValueDraftMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuAttributeValueMapper.xml b/skyer-goods/src/main/resources/mapper/SkuAttributeValueMapper.xml new file mode 100644 index 0000000..5ec42bf --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuAttributeValueMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + DELETE FROM sgoo_sku_attribute_value WHERE sku_id = #{skuId} + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuAuditSettingMapper.xml b/skyer-goods/src/main/resources/mapper/SkuAuditSettingMapper.xml new file mode 100644 index 0000000..db7cbc9 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuAuditSettingMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuDraftMapper.xml b/skyer-goods/src/main/resources/mapper/SkuDraftMapper.xml new file mode 100644 index 0000000..babf1f1 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuDraftMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuGroupMapper.xml b/skyer-goods/src/main/resources/mapper/SkuGroupMapper.xml new file mode 100644 index 0000000..c2c7e6c --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuGroupMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuGroupSkuMapper.xml b/skyer-goods/src/main/resources/mapper/SkuGroupSkuMapper.xml new file mode 100644 index 0000000..11dc298 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuGroupSkuMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuGroupStoreMapper.xml b/skyer-goods/src/main/resources/mapper/SkuGroupStoreMapper.xml new file mode 100644 index 0000000..baf0f36 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuGroupStoreMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuMapper.xml b/skyer-goods/src/main/resources/mapper/SkuMapper.xml new file mode 100644 index 0000000..899b550 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuMapper.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SkuPackageMapper.xml b/skyer-goods/src/main/resources/mapper/SkuPackageMapper.xml new file mode 100644 index 0000000..7094486 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SkuPackageMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuAttrValueRelationMapper.xml b/skyer-goods/src/main/resources/mapper/SpuAttrValueRelationMapper.xml new file mode 100644 index 0000000..0a45154 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuAttrValueRelationMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuAttributeMapper.xml b/skyer-goods/src/main/resources/mapper/SpuAttributeMapper.xml new file mode 100644 index 0000000..b5810fe --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuAttributeMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuAttributeValueMapper.xml b/skyer-goods/src/main/resources/mapper/SpuAttributeValueMapper.xml new file mode 100644 index 0000000..5fb374d --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuAttributeValueMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuInstallServiceMapper.xml b/skyer-goods/src/main/resources/mapper/SpuInstallServiceMapper.xml new file mode 100644 index 0000000..d855546 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuInstallServiceMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuInstallServiceSkuMapper.xml b/skyer-goods/src/main/resources/mapper/SpuInstallServiceSkuMapper.xml new file mode 100644 index 0000000..4aaa196 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuInstallServiceSkuMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuInstallServiceStoreMapper.xml b/skyer-goods/src/main/resources/mapper/SpuInstallServiceStoreMapper.xml new file mode 100644 index 0000000..817347b --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuInstallServiceStoreMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuMapper.xml b/skyer-goods/src/main/resources/mapper/SpuMapper.xml new file mode 100644 index 0000000..29aadfb --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, + brand_code, brand_id, category_code, category_id, material_code, material_id, name, remark, spu_code, type, delete_flag, creation_date, last_update_date, created_by, last_updated_by, object_version_number, tenant_id + + + + + + diff --git a/skyer-goods/src/main/resources/mapper/SpuSonMumMapper.xml b/skyer-goods/src/main/resources/mapper/SpuSonMumMapper.xml new file mode 100644 index 0000000..9ae82e3 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuSonMumMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuSonMumSkuMapper.xml b/skyer-goods/src/main/resources/mapper/SpuSonMumSkuMapper.xml new file mode 100644 index 0000000..53323c2 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuSonMumSkuMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/mapper/SpuSonMumStoreMapper.xml b/skyer-goods/src/main/resources/mapper/SpuSonMumStoreMapper.xml new file mode 100644 index 0000000..d8d5325 --- /dev/null +++ b/skyer-goods/src/main/resources/mapper/SpuSonMumStoreMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skyer-goods/src/main/resources/messages/messages_hpfm_en_US.properties b/skyer-goods/src/main/resources/messages/messages_hpfm_en_US.properties new file mode 100644 index 0000000..802e6b3 --- /dev/null +++ b/skyer-goods/src/main/resources/messages/messages_hpfm_en_US.properties @@ -0,0 +1,186 @@ +# basic +hpfm.info.predefined=Predefined +hpfm.info.customize=Customize +hpfm.error.no_pk=lov query error: no primary key or code +hpfm.error.data_repeat=lov query error: multiple record in database +hpfm.error.date.start_later_end=start date active {0} is later than end date active {1} +hpfm.error.jdbc_connection=JDBC Cannot Establish a Connection +error.data_invalid=Data invalid +error.not_found=Resource not found +error.error=There is a mistake in the program. Please contact the administrator +error.optimistic_lock=data not exists or version not match +error.data_exists=data already exist, please do not repeat the submission +error.data_not_exists=data not exists +# Event +hpfm.error.event.code_exists=event code exists +hpfm.error.event.notMatch=event rule data not match +hpfm.error.event.not_match=The tenant contained in the incoming event information does not match the current tenant and cannot be updated or deleted! +# lov +hpfm.error.lov.invalid_route_name="invalid route name" +# StaticText +hpfm.error.text_code.repeat_date=the same code has repeated date. +hpfm.error.text_code.not_exists=text code[{0}] not exists. +hpfm.error.text_code_lang.not_exists=text code[{0}] with language[{1}] not exists. +hpfm.error.permission_rule_cited=The permission rule has been referenced and is forbidden to delete. +hpfm.error.code_rule.not_found=Encoding rules are not enabled +hpfm.error.blocking_rule.exist=A blocking rule exists for the database prefix type +# tenant +hpfm.error.tenant.name_repeat=Tenant name repeat! +hpfm.error.send_saga_message.fail=saga send message fail. +#dbIde +hpfm.error.can_not_insert=the database cannot be insert +hpfm.error.can_not_update=the database cannot be update +hpfm.error.can_not_delete=the database cannot be delete +hpfm.error.database.can_not_alter=public database cannot be alter +hpfm.error.database.can_not_drop=public database cannot be drop +hpfm.error.database.can_not_create_index=public database cannot be create index +hpfm.error.operation_without_permission=there are no new table permissions in this service +hpfm.error.table.not_exist=table not exist; +hpfm.error.field.not_exist=field not exist; +#rule_script +hpfm.error.rule_script.get_rule_failed=Get rule script configuration failed +hpfm.error.rule_script.run_groovy_failed=Groovy script failed to run +hpfm.error.rule_script.service_not_found=Service not found +hpfm.error.rule.script.check=Rule Script Check Error +#DashboardLayout +hpfm.error.data.empty=Data is empty +hpfm.error.code_repeat=The code {0} already exists, please recreate it +hpfm.error.role_card.exists=The card exists under the current role. Please do not add it again +hpfm.error.saga.start=startSaga failed and fallback. +hpfm.error.lov_tenant.not_match=The incoming tenant does not match the current lov tenant. +hpfm.error.card_tenant.repeat=The same card cannot continuously assign the same tenant, please confirm the information of assigned tenant is correct. +hpfm.error.card_clause.repeat=You cannot assign more than one card under the same item. Please make sure that the card information is not repeated! +hpfm.error.prompt_tenant.not_match=The incoming tenant does not match the current prompt tenant. +hpfm.error.rule_script.not_match=The incoming tenant does not match the current ruleScript tenant. +hpfm.error.permission_rule.not_match=The incoming tenant does not match the current permissionRule tenant. +hpfm.error.date.irregularity=The start time must not be greater than the end time. +hpfm.error.data.disabled=This data is in the disabled state. Please enable this data before operation. +# hr +error.hr.portion.multiple.supervisor.exceptions=department can have at most one supervisor position +error.hr.unit.parent_disabled=parent is disabled +error.hr.unit.multiple.supervisor.exceptions=only one supervisor unit is allowed in same level +error.hr.unit.top_type_error=top unit must be company or group +error.position.not.allowed=Department or parent position is not enabled +error.data.source.not.allowed=Data source is not allowed : {0} +error.child.can.not.be.parent=The lower level post is not allowed to be set as the superior position of the superior position. +error.employee.not.exist=Employee does not exist +error.position.not.exist=Position does not exist +error.user_not_exists.or.already_linked=Sub-account does not exist or has associated employees +error.parent_unit.not.exist=The parent unit does not exist +error.department.missing.parent_unit=The department has no parent unit +error.department.missing.or.not.department=Department does not exist or unit type is not department +error.parent_position.not.exist=The parent position does not exist +error.department.or.company.not.enabled=Department or company is not activated +# mdm +error.multiple.code=Code repetition +error.multiple.name=Name repetition +error.parent.disable=Parent is not enabled or parent does not allow operation +calendar.holiday.overlap=calendar holiday is overlapped +startDate.bigger.endDate=Start Date is bigger than end Date +error.industry.category.name.repeat=Industry or category names under the same level are not allowed to be duplicated +hpfm.error.country.calendar.repeat=A country can only maintain one calendar! +hpfm.error.static_text.not_match=The incoming static text message contains a tenant that does not match the current tenant, so the data cannot be updated! +error.period.continue=Period is not continue +# flex +hpfm.flex.model.delete=The model has been used and cannot be deleted! +hpfm.flex.model_field.delete=The model field has been used and cannot be deleted! +hpfm.flex.rule_detail.delete=The rule detail has been used and cannot be deleted! +hpfm.flex.model_field.init=Initialization failed, please check the configuration! +# UiDimensionTemplate +dimension.template.not.exist=Dimension Template Not Exist +# UiField +dimension.template.or.field.not.exist=Dimension Template Or Field Not Exist +can.not.update=Can Not Update +hpfm.lov.tenant.repeat=The code for the next value set under the same tenant is not repeatable. Please confirm whether the value set already exists under the current tenant +hpfm.lov.site.copy_fail=This value set already exists on the current platform and does not need to be copied again +hpfm.lov_view.tenant.repeat=The code for the value set view under the same tenant is not repeatable. Please confirm whether the value set view already exists under the current tenant +hpfm.lov_view.site.copy_fail=This value set view already exists on the current platform and does not need to be copied again +# error +himp.error.readFile=Failed to read file +himp.error.excel.data=Excel is empty, please fill in the import data +himp.error.import.data=Import method is not defined +himp.error.template.match=Template and EXCEL do not match, please download the latest template +himp.error.feign.template=Feign call failed +himp.error.get.contract.attachment=Failed to get template information +himp.error.local_template.exists=Template already exists +himp.error.local_template.not_exists=Template not exists +himp.error.uploading=Data is being uploaded +himp.error.checking=Data is being verified +himp.error.importing=Data is being imported +himp.error.openSheet=Error while open sheet {0} +himp.error.dataFormat=Date {0} does not match the format {1} +himp.error.formula=Formula {0} is not supported at this time +himp.error.cell=Error reading a cell +himp.error.template.page.not_exists=Template page not exists +himp.error.batch.not_exists=Batch number does not exist {0} +himp.error.not_null={0} must be not null +himp.error.length_exceeds_limit={0} length exceeds limit +himp.error.regular_mismatch={0}regular mismatch +himp.error.lov_mismatch={0} lov mismatch +himp.error.not_decimal={0} is an illegal number type +himp.error.not_date={0} time format error +himp.error.not_number={0} is an illegal number type +himp.error.more_than={0} more than {1} +himp.error.less_than={0} less than {1} +himp.error.field=Illegal template field type +himp.error.script=Executing script {0} failed: {1} +hpfm.template_config.exists=The template configuration already exists. Please reenter it +hpfm.template_assign.exists=The template already exists. Please don't re-assign +hpfm.warn.fetchMethods.failure=Get service method failed, return status {0} +hpfm.warn.fetchMethods.exception=An exception occurred while getting the service method, exception information [{0}] +hpfm.warn.fetchServiceException=Service Instance [{0}] is not running. +hpfm.warn.customizeRuleFailure=api customize failure, service is [{0}], exception is [{1}] +hpfm.warn.callServiceFailure=call service to customize failure, service is [{0}] +hpfm.warn.customize.instanceNotRunning=customize service instance not running, service is [{0}] +hpfm.warn.checkCode.failure=Invoke service check code correctness failed +hpfm.warn.checkCode.exception=Invoke service check code correctness exception +hpfm.warn.range.ruleNotFound=Personalization rules do not exist +hpfm.warn.range.tenantNotEquals=The selected rule belongs to the tenant that does not match +hpfm.error.cache_data.null=Failed to get cache parameters. domainUrl: {0}, sourceType: {1} +hpfm.error.form_header.null=The form configuration header information does not exist, please check whether the entered form header encoding is correct, form header encoding: {0}, tenant Id: {1} +hpfm.error.template_assign.delete_default=The default template cannot be deleted. Please select it again +hpfm.error.datasource_register.fail=The database type already exists and cannot be re-registered +hpfm.error.get_connection.fail=Failed to get connection object. Please check whether the database type is correct. The database type is : {0} +hpfm.relational_param.illegal=Data source parameter verification failed. Current database type mandatory parameters: url address: {0}, driver class: {1}, user name: {2}, password: {3} +hpfm.error.datasource_id.null=The data source Id cannot be null when updated +hpfm.error.group_data_exists=The data[0] is exists +hpfm.error.template.is_referenced=The current template is already referenced, please delete the reference to the template before disabling it +hpfm.error.prompt.param_not_null=Parameter checking failed. PromptKey is: {0}, promptCode is: {1} +#export +hpfm.error.export_task.not_exists=The record [taskCode={0}] is not exists +hpfm.error.export.cancel_failed=cancel the export task failed. cause={0} +#datasource driver +hpfm.error.driver.exists=The driver version is not repeatable under the same tenant and driver type, tenantId is : {0}, driverType is : {1}, driverVersion is : {2} +hpfm.error.custom_driver=The custom driver could not test the connection ! +hpfm.error.send_socket=Message failed to be sent. +#CA\u05A4\u8BC1\u4E66 +hpfm.error.certificate.not_null=certificate can bot be null +hpfm.error.certificate.file.error=certificate file error +hpfm.error.certificate.exists=certificate file has been exists +hpfm.error.certificate.name.not_match=domainName of certificate is not match +#Server\u670D\u52A1\u5668\u7BA1\u7406 +hpfm.error.server.code.exists=Code exists +hpfm.error.server.check.fail=server check fail +hpfm.error.server.ip.empty=server ip empty +hpfm.error.server.ip.illegal=server ip illegal +hpfm.error.server.name.empty=server name empty +hpfm.error.server.name.existed=server name existed +hpfm.error.server.not.found=server not found +hpfm.error.prompt.refresh_cache=Do not repeat the operation during cache initialization. +hiam.warn.operation.onlySupperAdminAllowed=Only super admin have access to this api. +#gantt +hpfm.gantt.taskNameRepeat=Duplicate task name, please check. The task name is : {0} +#lov import +error.lov.import.have_not_parent=Value set has no parent value set +error.lov.import.parent_value_invalid=Parent value set value does not exist or is not enabled +hpfm.error.deleteUsedDriver=The driver has been used and cannot be deleted! +error.data_hierarchy.select.exceeds_maximum_number_limit=The maximum number of data level configuration select lists is {0} +error.data_hierarchy.display.not_match_parent=The data hierarchy configuration display style does not match the parent hierarchy +hpfm.error.clusterAssignServers=The server has been allocated under the cluster and cannot be deleted! +hpfm.error.lov.parentLovNotNull=The parent value set does not exist, lovCode is : {0} +hpfm.error.lov.urlNotNull=When the value set type is SQL type, the query SQL parameters must be lost! +hpfm.error.lovTypeNotMatch=It is not allowed to update the value set type when the same value set is updated. Please check the content of the existing value set under the current tenant, value set encoding: {0} + +sgoo.error.category.hasSub=This category ({0}) already has sub-categories or products, and it is not allowed to delete. +sgoo.error.category.not_parent=The selected parent does not exist +sgoo.error.category.attribute_name_exist=There are duplicate attribute names({0}) \ No newline at end of file diff --git a/skyer-goods/src/main/resources/messages/messages_hpfm_zh_CN.properties b/skyer-goods/src/main/resources/messages/messages_hpfm_zh_CN.properties new file mode 100644 index 0000000..4679121 --- /dev/null +++ b/skyer-goods/src/main/resources/messages/messages_hpfm_zh_CN.properties @@ -0,0 +1,187 @@ +# basic +hpfm.info.predefined=预定义 +hpfm.info.customize=自定义 +hpfm.error.no_pk=查询异常: 没有主键或代码 +hpfm.error.data_repeat=查询异常: 数据库中找不到记录或存在重复记录 +hpfm.error.date.start_later_end=起始日期 {0} 晚于终止日期 {1} +hpfm.error.jdbc_connection=数据源不能建立连接 +error.data_invalid=数据校验不通过 +error.not_found=资源不存在 +error.error=程序出现错误,请联系管理员 +error.optimistic_lock=记录不存在或版本不一致 +error.data_exists=数据已存在,请不要重复提交 +error.data_not_exists=数据不存在 +# Event +hpfm.error.event.code_exists=事件编码已存在 +hpfm.error.event.notMatch=事件数据不匹配 +hpfm.error.event.not_match=传入事件信息所含租户与当前租户不匹配,无法更新或删除数据! +# lov +hpfm.error.lov.invalid_route_name="无效的路由名" +# StaticText +hpfm.error.text_code.repeat_date=同一文本编码有效期重叠 +hpfm.error.text_code.not_exists=文本编码[{0}]不存在 +hpfm.error.text_code_lang.not_exists=文本编码[{0}]+语言[{1}]不存在 +hpfm.error.permission_rule_cited=当前规则已经被引用,禁止删除 +hpfm.error.code_rule.not_found=编码规则未启用 +hpfm.error.blocking_rule.exist=已存在为数据库前缀类型的屏蔽规则 +# tenant +hpfm.error.tenant.name_repeat=租户名称重复! +hpfm.error.send_saga_message.fail=saga消息发送失败 +#dbIde +hpfm.error.can_not_insert=不能进行插入操作 +hpfm.error.can_not_update=不能进行更新操作 +hpfm.error.can_not_delete=不能进行删除操作 +hpfm.error.database.can_not_alter=不能对公有库进行表更新操作 +hpfm.error.database.can_not_drop=不能对公有库进行表删除操作 +hpfm.error.database.can_not_create_index=不能对公有库进行插入索引操作 +hpfm.error.operation_without_permission=在此服务中没有新增表权限 +hpfm.error.table.not_exist=表不存在 +hpfm.error.field.not_exist=字段不存在 +#rule_script +hpfm.error.rule_script.get_rule_failed=获取规则引擎配置失败 +hpfm.error.rule_script.run_groovy_failed=Groovy脚本运行失败 +hpfm.error.rule_script.service_not_found=未找到指定服务 +hpfm.error.rule.script.check=业务脚本校验不通过 +#DashboardLayout +hpfm.error.data.empty=数据为空 +hpfm.error.code_repeat=卡片编码 {0} 已经存在,请您重新输入 +hpfm.error.role_card.exists=当前角色下存在该卡片,请不要重复添加 +hpfm.error.saga.start=startSaga调用失败 +hpfm.error.lov_tenant.not_match=传入值集信息所含租户与当前租户不匹配,无法更新数据! +hpfm.error.card_tenant.repeat=同一卡片下不能分配多个相同租户,请确认分配租户信息是否不重复! +hpfm.error.card_clause.repeat=同一条目下不能分配多个相同卡片,请确认分配卡片信息是否不重复! +hpfm.error.prompt_tenant.not_match=传入多语言信息所含租户与当前租户不匹配,无法更新数据! +hpfm.error.rule_script.not_match=传入规则引擎信息所含租户与当前租户不匹配,无法更新数据! +hpfm.error.permission_rule.not_match=传入数据权限信息所含租户与当前租户不匹配,无法更新数据! +hpfm.error.date.irregularity=起始时间不能大于截止时间,请重新选择时间范围 +hpfm.error.data.disabled=该条数据处于禁用状态,请先启用之后再操作 +# hr +error.hr.portion.multiple.supervisor.exceptions=一个部门最多只能有一个主管职位 +error.hr.unit.parent_disabled=父级未启用 +error.hr.unit.multiple.supervisor.exceptions=同级部门只能有一个主管部门 +error.hr.unit.top_type_error=顶层组织类型必须为公司或集团 +error.position.not.allowed=部门或者父级岗位未启用 +error.data.source.not.allowed=数据来源不允许 : {0} +error.child.can.not.be.parent=下级岗位不允许设置为上级岗位的上级岗位 +error.employee.not.exist=员工不存在 +error.position.not.exist=岗位不存在 +error.user_not_exists.or.already_linked=子账户不存在或已关联员工 +error.parent_unit.not.exist=上级组织不存在 +error.department.missing.parent_unit=部门没有上级组织 +error.department.missing.or.not.department=所属部门不存在或者组织类型非部门 +error.parent_position.not.exist=上级岗位不存在 +error.department.or.company.not.enabled=部门或所属公司未启用 +# mdm +error.multiple.code=编码重复 +error.multiple.name=名称重复 +error.parent.disable=父级未启用或父级不允许操作 +calendar.holiday.overlap=假期重叠 +startDate.bigger.endDate=假期起始日期大于终止日期 +error.industry.category.name.repeat=同一层级下行业或品类名称不允许重复 +hpfm.error.country.calendar.repeat=一个国家只能维护一个日历! +hpfm.error.static_text.not_match=传入静态文本信息所含租户与当前租户不匹配,无法更新数据! +error.period.continue=期间不连续 +# flex +hpfm.flex.model.delete=模型已被使用,不可删除! +hpfm.flex.model_field.delete=模型字段已被使用,不可删除! +hpfm.flex.rule_detail.delete=规则明细已被使用,不可删除! +hpfm.flex.model_field.init=初始化失败,请检查配置数据! +# UiDimensionTemplate +dimension.template.not.exist=维度模板不存在 +# UiField +dimension.template.or.field.not.exist=维度模板或字段不存在 +can.not.update=不能更新 +hpfm.lov.tenant.repeat=同一租户下值集编码不可重复,请确认该值集在当前租户下是否已经存在 +hpfm.lov.site.copy_fail=当前平台下已经存在该值集,无需再次复制 +hpfm.lov_view.tenant.repeat=同一租户下值集视图编码不可重复,请确认该值集视图在当前租户下是否已经存在 +hpfm.lov_view.site.copy_fail=当前平台下已经存在该值集视图,无需再次复制 +# error +himp.error.readFile=文件读取失败 +himp.error.excel.data=Excel为空,请填写导入数据 +himp.error.import.data=导入方法未定义 +himp.error.template.match=模板和EXCEL不匹配,请下载最新模板 +himp.error.feign.template=feign调用失败 +himp.error.get.contract.attachment=获取模板信息失败 +himp.error.local_template.exists=模板已存在 +himp.error.local_template.not_exists=模板不存在 +himp.error.uploading=数据上传未完成 +himp.error.checking=数据校验未完成 +himp.error.importing=数据导入未完成 +himp.error.openSheet=打开Sheet页{0}时发生错误 +himp.error.dataFormat=日期 {0} 不符合格式 {1} +himp.error.formula=暂不支持公式 {0} +himp.error.cell=读取单元格事发生错误 +himp.error.template.page.not_exists=模板页不存在 +himp.error.batch.not_exists=批号不存在 {0} +himp.error.not_null={0} 不能为空 +himp.error.length_exceeds_limit={0} 长度超过限制 +himp.error.regular_mismatch={0} 正则不匹配 +himp.error.lov_mismatch={0} 值集校验失败 +himp.error.not_decimal={0} 是非法的数字类型 +himp.error.not_date={0} 时间格式错误 +himp.error.not_number={0} 是非法的数字类型 +himp.error.more_than={0} 大于 {1} +himp.error.less_than={0} 小于 {1} +himp.error.field=非法模板字段类型 +himp.error.script=执行脚本 {0} 失败: {1} +hpfm.template_config.exists=该模板配置已经存在,请重新输入 +hpfm.template_assign.exists=模板已经存在,请勿重复分配 +hpfm.warn.fetchMethods.failure=获取服务方法失败,返回状态 {0} +hpfm.warn.fetchMethods.exception=获取服务方法时发生异常,异常信息 [{0}] +hpfm.warn.fetchServiceException=服务实例[{0}]未正常运行 +hpfm.warn.customizeRuleFailure=API客制化失败,服务[{0}], 异常信息[{1}] +hpfm.warn.callServiceFailure=API客制化服务调用失败,服务[{0}] +hpfm.warn.customize.instanceNotRunning=客制化服务实例未运行,服务 [{0}] +hpfm.warn.checkCode.failure=调用服务检查代码正确性失败 +hpfm.warn.checkCode.exception=调用服务检查代码正确性发生异常 +hpfm.warn.range.ruleNotFound=个性化规则不存在 +hpfm.warn.range.tenantNotEquals=选择的规则所属租户不匹配 +hpfm.error.cache_data.null=获取缓存参数失败,域名信息:{0},来源类型信息:{1} +hpfm.error.form_header.null=表单配置头信息不存在,请检查输入的表单头编码是否正确,表单头编码:{0}, 租户Id:{1} +hpfm.error.template_assign.delete_default=默认模板不可删除,请重新选择 +hpfm.error.datasource_register.fail=数据库类型已经存在,无法重复注册 +hpfm.error.get_connection.fail=获取连接对象失败,请检查数据库类型是否正确,数据库类型为:{0} +hpfm.relational_param.illegal=数据源参数校验失败,当前数据库类型必输参数:url地址:{0},驱动类:{1},用户名:{2},密码:{3} +hpfm.error.datasource_id.null=更新时数据源Id不可为空 +hpfm.error.group_data_exists=数据【{0}】已经存在 +hpfm.error.template.is_referenced=当前模板已经被引用,请先删除该模板的引用后再禁用 +hpfm.error.prompt.param_not_null=参数校验失败,promptKey is : {0}, promptCode is : {1} +#export +hpfm.error.export_task.not_exists=不存在该[taskCode={0}]的记录 +hpfm.error.export.cancel_failed=导出任务取消失败。cause={0} +#datasource driver +hpfm.error.driver.exists=同一租户及驱动类型下驱动版本不可重复,租户:{0},驱动类型:{1},驱动版本:{2} +hpfm.error.custom_driver=自定义驱动无法进行测试连接! +hpfm.error.send_socket=Socket消息发送失败 +#CA证书 +hpfm.error.certificate.not_null=CA证书不能为空 +hpfm.error.certificate.file.error=CA证书文件错误 +hpfm.error.certificate.exists=CA证书文件已经存在 +hpfm.error.certificate.name.not_match=CA证书域名不匹配 +#Server服务器管理 +hpfm.error.server.code.exists=Code已存在 +hpfm.error.server.check.fail=服务器不可用 +hpfm.error.server.ip.empty=服务器IP不能为空 +hpfm.error.server.ip.illegal=服务器IP不合法 +hpfm.error.server.name.empty=服务器名不可为空 +hpfm.error.server.name.existed=服务器名已存在 +hpfm.error.server.not.found=服务器不存在 +hpfm.error.prompt.refresh_cache=缓存初始化中,请勿重复操作 +hiam.warn.operation.onlySupperAdminAllowed=只有超级管理员有权限调用此接口 +#gantt +hpfm.gantt.taskNameRepeat=任务名称重复,请检查。任务名称为:{0} +#lov import +error.lov.import.have_not_parent=值集没有父级值集 +error.lov.import.parent_value_invalid=父级值集值不存在或未启用 +hpfm.error.deleteUsedDriver=驱动已经被使用,不可删除! +error.data_hierarchy.select.exceeds_maximum_number_limit=数据层级配置下拉列表数量最多允许 {0} 个 +error.data_hierarchy.display.not_match_parent=数据层级配置显示样式与父级层级不匹配 +hpfm.error.clusterAssignServers=集群下已分配服务器,不可删除! +hpfm.error.lov.parentLovNotNull=值集编码为 {0} 的父级值集不存在! +hpfm.error.lov.urlNotNull=值集类型为 URL 类型时,查询 URL 参数必输! +hpfm.error.lov.sqlNotNull=值集类型为 SQL 类型时,查询 SQL 参数必输! +hpfm.error.lovTypeNotMatch=同一值集更新时不允许更新值集类型,请查看当前租户下已存在的值集内容,值集编码:{0} + +sgoo.error.category.hasSub=该分类({0})已有下级分类或商品,不允许删除 +sgoo.error.category.not_parent=所选父级不存在 +sgoo.error.category.attribute_name_exist=存在重复的属性名称({0}) \ No newline at end of file diff --git a/skyer-goods/src/main/resources/static/js/babel.min.js b/skyer-goods/src/main/resources/static/js/babel.min.js new file mode 100644 index 0000000..1075776 --- /dev/null +++ b/skyer-goods/src/main/resources/static/js/babel.min.js @@ -0,0 +1,25 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Babel=t():e.Babel=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return e[n].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var r=t.slice(1),n=e[t[0]];return function(e,t,i){n.apply(this,[e,t,i].concat(r))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,r){"use strict";function n(e,t){return g(t)&&"string"==typeof t[0]?e.hasOwnProperty(t[0])?[e[t[0]]].concat(t.slice(1)):void 0:"string"==typeof t?e[t]:t}function i(e){var t=(e.presets||[]).map(function(e){var t=n(E,e);if(!t)throw new Error('Invalid preset specified in Babel options: "'+e+'"');return g(t)&&"object"===h(t[0])&&t[0].hasOwnProperty("buildPreset")&&(t[0]=d({},t[0],{buildPreset:t[0].buildPreset})),t}),r=(e.plugins||[]).map(function(e){var t=n(b,e);if(!t)throw new Error('Invalid plugin specified in Babel options: "'+e+'"');return t});return d({babelrc:!1},e,{presets:t,plugins:r})}function s(e,t){return y.transform(e,i(t))}function a(e,t,r){return y.transformFromAst(e,t,i(r))}function o(e,t){b.hasOwnProperty(e)&&console.warn('A plugin named "'+e+'" is already registered, it will be overridden'),b[e]=t}function u(e){Object.keys(e).forEach(function(t){return o(t,e[t])})}function l(e,t){E.hasOwnProperty(e)&&console.warn('A preset named "'+e+'" is already registered, it will be overridden'),E[e]=t}function c(e){Object.keys(e).forEach(function(t){return l(t,e[t])})}function f(e){(0,v.runScripts)(s,e)}function p(){window.removeEventListener("DOMContentLoaded",f)}Object.defineProperty(t,"__esModule",{value:!0}),t.version=t.buildExternalHelpers=t.availablePresets=t.availablePlugins=void 0;var d=Object.assign||function(e){for(var t=1;t=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}if(e===a)return!0}}return!1}function o(e,t,r){if(e){var n=z.NODE_FIELDS[e.type];if(n){var i=n[t];i&&i.validate&&(i.optional&&null==r||i.validate(e,t,r))}}}function u(e,t){for(var r=(0,B.default)(t),n=r,i=Array.isArray(n),s=0,n=i?n:(0,T.default)(n);;){var a;if(i){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var o=a;if(e[o]!==t[o])return!1}return!0}function l(e,t,r){return e.object=z.memberExpression(e.object,e.property,e.computed),e.property=t,e.computed=!!r,e}function c(e,t){return e.object=z.memberExpression(t,e.object),e}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"body";return e[t]=z.toBlock(e[t],e)}function p(e){if(!e)return e;var t={};for(var r in e)"_"!==r[0]&&(t[r]=e[r]);return t}function d(e){var t=p(e);return delete t.loc,t}function h(e){if(!e)return e;var t={};for(var r in e)if("_"!==r[0]){var n=e[r];n&&(n.type?n=z.cloneDeep(n):Array.isArray(n)&&(n=n.map(z.cloneDeep))),t[r]=n}return t}function m(e,t){var r=e.split(".");return function(e){if(!z.isMemberExpression(e))return!1;for(var n=[e],i=0;n.length;){var s=n.shift();if(t&&i===r.length)return!0;if(z.isIdentifier(s)){if(r[i]!==s.name)return!1}else{if(!z.isStringLiteral(s)){if(z.isMemberExpression(s)){if(s.computed&&!z.isStringLiteral(s.property))return!1;n.push(s.object),n.push(s.property);continue}return!1}if(r[i]!==s.value)return!1}if(++i>r.length)return!1}return!0}}function y(e){for(var t=z.COMMENT_KEYS,r=Array.isArray(t),n=0,t=r?t:(0,T.default)(t);;){var i;if(r){if(n>=t.length)break;i=t[n++]}else{if(n=t.next(),n.done)break;i=n.value}delete e[i]}return e}function v(e,t){return g(e,t),b(e,t),E(e,t),e}function g(e,t){x("trailingComments",e,t)}function b(e,t){x("leadingComments",e,t)}function E(e,t){x("innerComments",e,t)}function x(e,t,r){t&&r&&(t[e]=(0,K.default)([].concat(t[e],r[e]).filter(Boolean)))}function A(e,t){if(!e||!t)return e;for(var r=z.INHERIT_KEYS.optional,n=Array.isArray(r),i=0,r=n?r:(0,T.default)(r);;){var s;if(n){if(i>=r.length)break;s=r[i++]}else{if(i=r.next(),i.done)break;s=i.value}var a=s;null==e[a]&&(e[a]=t[a])}for(var o in t)"_"===o[0]&&(e[o]=t[o]);for(var u=z.INHERIT_KEYS.force,l=Array.isArray(u),c=0,u=l?u:(0,T.default)(u);;){var f;if(l){if(c>=u.length)break;f=u[c++]}else{if(c=u.next(),c.done)break;f=c.value}var p=f;e[p]=t[p]}return z.inheritsComments(e,t),e}function S(e){if(!_(e))throw new TypeError("Not a valid node "+(e&&e.type))}function _(e){return!(!e||!H.VISITOR_KEYS[e.type])}function D(e,t,r){if(e){var n=z.VISITOR_KEYS[e.type];if(n){r=r||{},t(e,r);for(var i=n,s=Array.isArray(i),a=0,i=s?i:(0,T.default)(i);;){var o;if(s){if(a>=i.length)break;o=i[a++]}else{if(a=i.next(),a.done)break;o=a.value}var u=o,l=e[u];if(Array.isArray(l))for(var c=l,f=Array.isArray(c),p=0,c=f?c:(0,T.default)(c);;){var d;if(f){if(p>=c.length)break;d=c[p++]}else{if(p=c.next(),p.done)break;d=p.value}var h=d;D(h,t,r)}else D(l,t,r)}}}}function C(e,t){t=t||{};for(var r=t.preserveComments?Z:ee,n=r,i=Array.isArray(n),s=0,n=i?n:(0,T.default)(n);;){var a;if(i){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var o=a;null!=e[o]&&(e[o]=void 0)}for(var u in e)"_"===u[0]&&null!=e[u]&&(e[u]=void 0);for(var l=(0,k.default)(e),c=l,f=Array.isArray(c),p=0,c=f?c:(0,T.default)(c);;){var d;if(f){if(p>=c.length)break;d=c[p++]}else{if(p=c.next(),p.done)break;d=p.value}e[d]=null}}function w(e,t){return D(e,C,t),e}t.__esModule=!0,t.createTypeAnnotationBasedOnTypeof=t.removeTypeDuplicates=t.createUnionTypeAnnotation=t.valueToNode=t.toBlock=t.toExpression=t.toStatement=t.toBindingIdentifierName=t.toIdentifier=t.toKeyAlias=t.toSequenceExpression=t.toComputedKey=t.isNodesEquivalent=t.isImmutable=t.isScope=t.isSpecifierDefault=t.isVar=t.isBlockScoped=t.isLet=t.isValidIdentifier=t.isReferenced=t.isBinding=t.getOuterBindingIdentifiers=t.getBindingIdentifiers=t.TYPES=t.react=t.DEPRECATED_KEYS=t.BUILDER_KEYS=t.NODE_FIELDS=t.ALIAS_KEYS=t.VISITOR_KEYS=t.NOT_LOCAL_BINDING=t.BLOCK_SCOPED_SYMBOL=t.INHERIT_KEYS=t.UNARY_OPERATORS=t.STRING_UNARY_OPERATORS=t.NUMBER_UNARY_OPERATORS=t.BOOLEAN_UNARY_OPERATORS=t.BINARY_OPERATORS=t.NUMBER_BINARY_OPERATORS=t.BOOLEAN_BINARY_OPERATORS=t.COMPARISON_BINARY_OPERATORS=t.EQUALITY_BINARY_OPERATORS=t.BOOLEAN_NUMBER_BINARY_OPERATORS=t.UPDATE_OPERATORS=t.LOGICAL_OPERATORS=t.COMMENT_KEYS=t.FOR_INIT_KEYS=t.FLATTENABLE_KEYS=t.STATEMENT_OR_BLOCK_KEYS=void 0;var P=r(360),k=n(P),F=r(2),T=n(F),O=r(14),B=n(O),R=r(35),I=n(R),M=r(135);Object.defineProperty(t,"STATEMENT_OR_BLOCK_KEYS",{enumerable:!0,get:function(){return M.STATEMENT_OR_BLOCK_KEYS}}),Object.defineProperty(t,"FLATTENABLE_KEYS",{enumerable:!0,get:function(){return M.FLATTENABLE_KEYS}}),Object.defineProperty(t,"FOR_INIT_KEYS",{enumerable:!0,get:function(){return M.FOR_INIT_KEYS}}),Object.defineProperty(t,"COMMENT_KEYS",{enumerable:!0,get:function(){return M.COMMENT_KEYS}}),Object.defineProperty(t,"LOGICAL_OPERATORS",{enumerable:!0,get:function(){return M.LOGICAL_OPERATORS}}),Object.defineProperty(t,"UPDATE_OPERATORS",{enumerable:!0,get:function(){return M.UPDATE_OPERATORS}}),Object.defineProperty(t,"BOOLEAN_NUMBER_BINARY_OPERATORS",{enumerable:!0,get:function(){return M.BOOLEAN_NUMBER_BINARY_OPERATORS}}),Object.defineProperty(t,"EQUALITY_BINARY_OPERATORS",{enumerable:!0,get:function(){return M.EQUALITY_BINARY_OPERATORS}}),Object.defineProperty(t,"COMPARISON_BINARY_OPERATORS",{enumerable:!0,get:function(){return M.COMPARISON_BINARY_OPERATORS}}),Object.defineProperty(t,"BOOLEAN_BINARY_OPERATORS",{enumerable:!0,get:function(){return M.BOOLEAN_BINARY_OPERATORS}}),Object.defineProperty(t,"NUMBER_BINARY_OPERATORS",{enumerable:!0,get:function(){return M.NUMBER_BINARY_OPERATORS}}),Object.defineProperty(t,"BINARY_OPERATORS",{enumerable:!0,get:function(){return M.BINARY_OPERATORS}}),Object.defineProperty(t,"BOOLEAN_UNARY_OPERATORS",{enumerable:!0,get:function(){return M.BOOLEAN_UNARY_OPERATORS}}),Object.defineProperty(t,"NUMBER_UNARY_OPERATORS",{enumerable:!0,get:function(){return M.NUMBER_UNARY_OPERATORS}}),Object.defineProperty(t,"STRING_UNARY_OPERATORS",{enumerable:!0,get:function(){return M.STRING_UNARY_OPERATORS}}),Object.defineProperty(t,"UNARY_OPERATORS",{enumerable:!0,get:function(){return M.UNARY_OPERATORS}}),Object.defineProperty(t,"INHERIT_KEYS",{enumerable:!0,get:function(){return M.INHERIT_KEYS}}),Object.defineProperty(t,"BLOCK_SCOPED_SYMBOL",{enumerable:!0,get:function(){return M.BLOCK_SCOPED_SYMBOL}}),Object.defineProperty(t,"NOT_LOCAL_BINDING",{enumerable:!0,get:function(){return M.NOT_LOCAL_BINDING}}),t.is=s,t.isType=a,t.validate=o,t.shallowEqual=u,t.appendToMemberExpression=l,t.prependToMemberExpression=c,t.ensureBlock=f,t.clone=p,t.cloneWithoutLoc=d,t.cloneDeep=h,t.buildMatchMemberExpression=m,t.removeComments=y,t.inheritsComments=v,t.inheritTrailingComments=g,t.inheritLeadingComments=b,t.inheritInnerComments=E,t.inherits=A,t.assertNode=S,t.isNode=_,t.traverseFast=D,t.removeProperties=C,t.removePropertiesDeep=w;var N=r(226);Object.defineProperty(t,"getBindingIdentifiers",{enumerable:!0,get:function(){return N.getBindingIdentifiers}}),Object.defineProperty(t,"getOuterBindingIdentifiers",{enumerable:!0,get:function(){return N.getOuterBindingIdentifiers}});var L=r(395);Object.defineProperty(t,"isBinding",{enumerable:!0,get:function(){return L.isBinding}}),Object.defineProperty(t,"isReferenced",{enumerable:!0,get:function(){return L.isReferenced}}),Object.defineProperty(t,"isValidIdentifier",{enumerable:!0,get:function(){return L.isValidIdentifier}}),Object.defineProperty(t,"isLet",{enumerable:!0,get:function(){return L.isLet}}),Object.defineProperty(t,"isBlockScoped",{enumerable:!0,get:function(){return L.isBlockScoped}}),Object.defineProperty(t,"isVar",{enumerable:!0,get:function(){return L.isVar}}),Object.defineProperty(t,"isSpecifierDefault",{enumerable:!0,get:function(){return L.isSpecifierDefault}}),Object.defineProperty(t,"isScope",{enumerable:!0,get:function(){return L.isScope}}),Object.defineProperty(t,"isImmutable",{enumerable:!0,get:function(){return L.isImmutable}}),Object.defineProperty(t,"isNodesEquivalent",{enumerable:!0,get:function(){return L.isNodesEquivalent}});var j=r(385);Object.defineProperty(t,"toComputedKey",{enumerable:!0,get:function(){return j.toComputedKey}}),Object.defineProperty(t,"toSequenceExpression",{enumerable:!0,get:function(){return j.toSequenceExpression}}),Object.defineProperty(t,"toKeyAlias",{enumerable:!0,get:function(){return j.toKeyAlias}}),Object.defineProperty(t,"toIdentifier",{enumerable:!0,get:function(){return j.toIdentifier}}),Object.defineProperty(t,"toBindingIdentifierName",{enumerable:!0,get:function(){return j.toBindingIdentifierName}}),Object.defineProperty(t,"toStatement",{enumerable:!0,get:function(){return j.toStatement}}),Object.defineProperty(t,"toExpression",{enumerable:!0,get:function(){return j.toExpression}}),Object.defineProperty(t,"toBlock",{enumerable:!0,get:function(){return j.toBlock}}),Object.defineProperty(t,"valueToNode",{enumerable:!0,get:function(){return j.valueToNode}});var U=r(393);Object.defineProperty(t,"createUnionTypeAnnotation",{enumerable:!0,get:function(){return U.createUnionTypeAnnotation}}),Object.defineProperty(t,"removeTypeDuplicates",{enumerable:!0,get:function(){return U.removeTypeDuplicates}}),Object.defineProperty(t,"createTypeAnnotationBasedOnTypeof",{enumerable:!0,get:function(){return U.createTypeAnnotationBasedOnTypeof}});var V=r(624),G=n(V),W=r(109),Y=n(W),q=r(600),K=n(q);r(390);var H=r(26),J=r(394),X=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(J),z=t;t.VISITOR_KEYS=H.VISITOR_KEYS,t.ALIAS_KEYS=H.ALIAS_KEYS,t.NODE_FIELDS=H.NODE_FIELDS,t.BUILDER_KEYS=H.BUILDER_KEYS,t.DEPRECATED_KEYS=H.DEPRECATED_KEYS,t.react=X;for(var $ in z.VISITOR_KEYS)i($);z.FLIPPED_ALIAS_KEYS={},(0,B.default)(z.ALIAS_KEYS).forEach(function(e){z.ALIAS_KEYS[e].forEach(function(t){(z.FLIPPED_ALIAS_KEYS[t]=z.FLIPPED_ALIAS_KEYS[t]||[]).push(e)})}),(0,B.default)(z.FLIPPED_ALIAS_KEYS).forEach(function(e){z[e.toUpperCase()+"_TYPES"]=z.FLIPPED_ALIAS_KEYS[e],i(e)});t.TYPES=(0,B.default)(z.VISITOR_KEYS).concat((0,B.default)(z.FLIPPED_ALIAS_KEYS)).concat((0,B.default)(z.DEPRECATED_KEYS));(0,B.default)(z.BUILDER_KEYS).forEach(function(e){function t(){if(arguments.length>r.length)throw new Error("t."+e+": Too many arguments passed. Received "+arguments.length+" but can receive no more than "+r.length);var t={};t.type=e;for(var n=0,i=r,s=Array.isArray(i),a=0,i=s?i:(0,T.default)(i);;){var u;if(s){if(a>=i.length)break;u=i[a++]}else{if(a=i.next(),a.done)break;u=a.value}var l=u,c=z.NODE_FIELDS[e][l],f=arguments[n++];void 0===f&&(f=(0,Y.default)(c.default)),t[l]=f}for(var p in t)o(t,p,t[p]);return t}var r=z.BUILDER_KEYS[e];z[e]=t,z[e[0].toLowerCase()+e.slice(1)]=t});for(var Q in z.DEPRECATED_KEYS)!function(e){function t(t){return function(){return console.trace("The node type "+e+" has been renamed to "+r),t.apply(this,arguments)}}var r=z.DEPRECATED_KEYS[e];z[e]=z[e[0].toLowerCase()+e.slice(1)]=t(z[r]),z["is"+e]=t(z["is"+r]),z["assert"+e]=t(z["assert"+r])}(Q);(0,G.default)(z),(0,G.default)(z.VISITOR_KEYS);var Z=["tokens","start","end","loc","raw","rawValue"],ee=z.COMMENT_KEYS.concat(["comments"]).concat(Z)},function(e,t,r){"use strict";e.exports={default:r(404),__esModule:!0}},function(e,t){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}function s(e,t){e=(0,l.default)(e);var r=e,n=r.program;return t.length&&(0,m.default)(e,A,null,t),n.body.length>1?n.body:n.body[0]}t.__esModule=!0;var a=r(10),o=i(a);t.default=function(e,t){var r=void 0;try{throw new Error}catch(e){e.stack&&(r=e.stack.split("\n").slice(1).join("\n"))}t=(0,f.default)({allowReturnOutsideFunction:!0,allowSuperOutsideMethod:!0,preserveComments:!1},t);var n=function(){var i=void 0;try{i=v.parse(e,t),i=m.default.removeProperties(i,{preserveComments:t.preserveComments}),m.default.cheap(i,function(e){e[E]=!0})}catch(e){throw e.stack=e.stack+"from\n"+r,e}return n=function(){return i},i};return function(){for(var e=arguments.length,t=Array(e),r=0;r=l.length)break;p=l[f++]}else{if(f=l.next(),f.done)break;p=f.value}var h=p;if((!s||!s[h])&&o.visit(e,h))return}},s.clearNode=function(e,t){x.removeProperties(e,t),S.path.delete(e)},s.removeProperties=function(e,t){return x.traverseFast(e,s.clearNode,t),e},s.hasType=function(e,t,r,n){if((0,b.default)(n,e.type))return!1;if(e.type===r)return!0;var i={has:!1,type:r};return s(e,{blacklist:n,enter:a},t,i),i.has},s.clearCache=function(){S.clear()},s.clearCache.clearPath=S.clearPath,s.clearCache.clearScope=S.clearScope,s.copyCache=function(e,t){S.path.has(e)&&S.path.set(t,S.path.get(e))}},function(e,t){"use strict";function r(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function i(e){if(c===setTimeout)return setTimeout(e,0);if((c===r||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function s(e){if(f===clearTimeout)return clearTimeout(e);if((f===n||!f)&&clearTimeout)return f=clearTimeout,clearTimeout(e);try{return f(e)}catch(t){try{return f.call(null,e)}catch(t){return f.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?h=d.concat(h):y=-1,h.length&&o())}function o(){if(!m){var e=i(a);m=!0;for(var t=h.length;t;){for(d=h,h=[];++y1)for(var r=1;r=0;n--){var i=e[n];"."===i?e.splice(n,1):".."===i?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}function n(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!i;s--){var a=s>=0?arguments[s]:e.cwd();if("string"!=typeof a)throw new TypeError("Arguments to path.resolve must be strings");a&&(t=a+"/"+t,i="/"===a.charAt(0))}return t=r(n(t.split("/"),function(e){return!!e}),!i).join("/"),(i?"/":"")+t||"."},t.normalize=function(e){var i=t.isAbsolute(e),s="/"===a(e,-1);return e=r(n(e.split("/"),function(e){return!!e}),!i).join("/"),e||i||(e="."),e&&s&&(e+="/"),(i?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(n(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var i=n(e.split("/")),s=n(r.split("/")),a=Math.min(i.length,s.length),o=a,u=0;u1?t-1:0),n=1;n=s.length)break;u=s[o++]}else{if(o=s.next(),o.done)break;u=o.value}var l=u;if(b.is(l,n)){i=!0;break}}if(!i)throw new TypeError("Property "+t+" of "+e.type+" expected node to be of a type "+(0,m.default)(r)+" but instead got "+(0,m.default)(n&&n.type))}for(var t=arguments.length,r=Array(t),n=0;n=a.length)break;l=a[u++]}else{if(u=a.next(),u.done)break;l=u.value}var c=l;if(i(n)===c||b.is(c,n)){s=!0;break}}if(!s)throw new TypeError("Property "+t+" of "+e.type+" expected node to be of a type "+(0,m.default)(r)+" but instead got "+(0,m.default)(n&&n.type))}for(var t=arguments.length,r=Array(t),n=0;n=e.length)break;i=e[n++]}else{if(n=e.next(),n.done)break;i=n.value}i.apply(void 0,arguments)}}for(var t=arguments.length,r=Array(t),n=0;n1&&void 0!==arguments[1]?arguments[1]:{},r=t.inherits&&D[t.inherits]||{};t.fields=t.fields||r.fields||{},t.visitor=t.visitor||r.visitor||[],t.aliases=t.aliases||r.aliases||[],t.builder=t.builder||r.builder||t.visitor||[],t.deprecatedAlias&&(_[t.deprecatedAlias]=e);for(var n=t.visitor.concat(t.builder),s=Array.isArray(n),a=0,n=s?n:(0,d.default)(n);;){var o;if(s){if(a>=n.length)break;o=n[a++]}else{if(a=n.next(),a.done)break;o=a.value}var u=o;t.fields[u]=t.fields[u]||{}}for(var c in t.fields){var f=t.fields[c];-1===t.builder.indexOf(c)&&(f.optional=!0),void 0===f.default?f.default=null:f.validate||(f.validate=l(i(f.default)))}E[e]=t.visitor,S[e]=t.builder,A[e]=t.fields,x[e]=t.aliases,D[e]=t}t.__esModule=!0,t.DEPRECATED_KEYS=t.BUILDER_KEYS=t.NODE_FIELDS=t.ALIAS_KEYS=t.VISITOR_KEYS=void 0;var p=r(2),d=n(p),h=r(35),m=n(h),y=r(11),v=n(y);t.assertEach=s,t.assertOneOf=a,t.assertNodeType=o,t.assertNodeOrValueType=u,t.assertValueType=l,t.chain=c,t.default=f;var g=r(1),b=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(g),E=t.VISITOR_KEYS={},x=t.ALIAS_KEYS={},A=t.NODE_FIELDS={},S=t.BUILDER_KEYS={},_=t.DEPRECATED_KEYS={},D={}},function(e,t){"use strict";e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){"use strict";var n=r(23),i=r(92);e.exports=r(22)?function(e,t,r){return n.f(e,t,i(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){"use strict";function n(e){return null==e?void 0===e?u:o:l&&l in Object(e)?s(e):a(e)}var i=r(45),s=r(534),a=r(559),o="[object Null]",u="[object Undefined]",l=i?i.toStringTag:void 0;e.exports=n},function(e,t,r){"use strict";function n(e,t,r,n){var a=!r;r||(r={});for(var o=-1,u=t.length;++o=s.length)break;u=s[o++]}else{if(o=s.next(),o.done)break;u=o.value}var l=u;if(l.container===t)return l.plugin}var c=void 0;if(c="function"==typeof t?t(b):t,"object"===(void 0===c?"undefined":(0,m.default)(c))){var f=new x.default(c,i);return e.memoisedPlugins.push({container:t,plugin:f}),f}throw new TypeError(S.get("pluginNotObject",r,n,void 0===c?"undefined":(0,m.default)(c))+r+n)},e.createBareOptions=function(){var e={};for(var t in M.default){var r=M.default[t];e[t]=(0,O.default)(r.default)}return e},e.normalisePlugin=function(t,r,n,i){if(!((t=t.__esModule?t.default:t)instanceof x.default)){if("function"!=typeof t&&"object"!==(void 0===t?"undefined":(0,m.default)(t)))throw new TypeError(S.get("pluginNotFunction",r,n,void 0===t?"undefined":(0,m.default)(t)));t=e.memoisePluginContainer(t,r,n,i)}return t.init(r,n),t},e.normalisePlugins=function(t,n,i){return i.map(function(i,s){var a=void 0,o=void 0;if(!i)throw new TypeError("Falsy value found in plugins");Array.isArray(i)?(a=i[0],o=i[1]):a=i;var u="string"==typeof a?a:t+"$"+s;if("string"==typeof a){var l=(0,C.default)(a,n);if(!l)throw new ReferenceError(S.get("pluginUnknown",a,t,s,n));a=r(179)(l)}return a=e.normalisePlugin(a,t,s,u),[a,o]})},e.prototype.mergeOptions=function(t){var r=this,i=t.options,s=t.extending,a=t.alias,o=t.loc,u=t.dirname;if(a=a||"foreign",i){("object"!==(void 0===i?"undefined":(0,m.default)(i))||Array.isArray(i))&&this.log.error("Invalid options type for "+a,TypeError);var l=(0,F.default)(i,function(e){if(e instanceof x.default)return e});u=u||n.cwd(),o=o||a;for(var c in l){if(!M.default[c]&&this.log)if(L.default[c])this.log.error("Using removed Babel 5 option: "+a+"."+c+" - "+L.default[c].message,ReferenceError);else{var p="Unknown option: "+a+"."+c+". Check out http://babeljs.io/docs/usage/options/ for more information about options.";this.log.error(p+"\n\nA common cause of this error is the presence of a configuration options object without the corresponding preset name. Example:\n\nInvalid:\n `{ presets: [{option: value}] }`\nValid:\n `{ presets: [['presetName', {option: value}]] }`\n\nFor more detailed information on preset configuration, please see http://babeljs.io/docs/plugins/#pluginpresets-options.",ReferenceError)}}(0,_.normaliseOptions)(l),l.plugins&&(l.plugins=e.normalisePlugins(o,u,l.plugins)),l.presets&&(l.passPerPreset?l.presets=this.resolvePresets(l.presets,u,function(e,t){r.mergeOptions({options:e,extending:e,alias:t,loc:t,dirname:u})}):(this.mergePresets(l.presets,u),delete l.presets)),i===s?(0,f.default)(s,l):(0,R.default)(s||this.options,l)}},e.prototype.mergePresets=function(e,t){var r=this;this.resolvePresets(e,t,function(e,t){r.mergeOptions({options:e,alias:t,loc:t,dirname:G.default.dirname(t||"")})})},e.prototype.resolvePresets=function(e,t,n){return e.map(function(e){var i=void 0;if(Array.isArray(e)){if(e.length>2)throw new Error("Unexpected extra options "+(0,l.default)(e.slice(2))+" passed to preset.");var s=e;e=s[0],i=s[1]}var a=void 0;try{if("string"==typeof e){if(!(a=(0,P.default)(e,t)))throw new Error("Couldn't find preset "+(0,l.default)(e)+" relative to directory "+(0,l.default)(t));e=r(179)(a)}if("object"===(void 0===e?"undefined":(0,m.default)(e))&&e.__esModule)if(e.default)e=e.default;else{var u=e,c=(u.__esModule,(0,o.default)(u,["__esModule"]));e=c}if("object"===(void 0===e?"undefined":(0,m.default)(e))&&e.buildPreset&&(e=e.buildPreset),"function"!=typeof e&&void 0!==i)throw new Error("Options "+(0,l.default)(i)+" passed to "+(a||"a preset")+" which does not accept options.");if("function"==typeof e&&(e=e(b,i,{dirname:t})),"object"!==(void 0===e?"undefined":(0,m.default)(e)))throw new Error("Unsupported preset format: "+e+".");n&&n(e,a)}catch(e){throw a&&(e.message+=" (While processing preset: "+(0,l.default)(a)+")"),e}return e})},e.prototype.normaliseOptions=function(){var e=this.options;for(var t in M.default){var r=M.default[t],n=e[t];!n&&r.optional||(r.alias?e[r.alias]=e[r.alias]||n:e[t]=n)}},e.prototype.init=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(0,U.default)(e,this.log),r=Array.isArray(t),n=0,t=r?t:(0,d.default)(t);;){var i;if(r){if(n>=t.length)break;i=t[n++]}else{if(n=t.next(),n.done)break;i=n.value}var s=i;this.mergeOptions(s)}return this.normaliseOptions(e),this.options},e}();t.default=W,W.memoisedPlugins=[],e.exports=t.default}).call(t,r(8))},function(e,t,r){"use strict";e.exports={default:r(405),__esModule:!0}},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=r(2),a=i(s),o=r(3),u=i(o),l=r(224),c=n(l),f=r(239),p=i(f),d=r(466),h=i(d),m=r(7),y=i(m),v=r(174),g=i(v),b=r(134),E=i(b),x=r(1),A=n(x),S=r(88),_=(0,p.default)("babel"),D=function(){function e(t,r){(0,u.default)(this,e),this.parent=r,this.hub=t,this.contexts=[],this.data={},this.shouldSkip=!1,this.shouldStop=!1,this.removed=!1,this.state=null,this.opts=null,this.skipKeys=null,this.parentPath=null,this.context=null,this.container=null,this.listKey=null,this.inList=!1,this.parentKey=null,this.key=null,this.node=null,this.scope=null,this.type=null,this.typeAnnotation=null}return e.get=function(t){var r=t.hub,n=t.parentPath,i=t.parent,s=t.container,a=t.listKey,o=t.key;!r&&n&&(r=n.hub),(0,h.default)(i,"To get a node path the parent needs to exist");var u=s[o],l=S.path.get(i)||[];S.path.has(i)||S.path.set(i,l);for(var c=void 0,f=0;f1&&void 0!==arguments[1]?arguments[1]:SyntaxError;return this.hub.file.buildCodeFrameError(this.node,e,t)},e.prototype.traverse=function(e,t){(0,y.default)(this.node,e,this.scope,t,this)},e.prototype.mark=function(e,t){this.hub.file.metadata.marked.push({type:e,message:t,loc:this.node.loc})},e.prototype.set=function(e,t){A.validate(this.node,e,t),this.node[e]=t},e.prototype.getPathLocation=function(){var e=[],t=this;do{var r=t.key;t.inList&&(r=t.listKey+"["+r+"]"),e.unshift(r)}while(t=t.parentPath);return e.join(".")},e.prototype.debug=function(e){_.enabled&&_(this.getPathLocation()+" "+this.type+": "+e())},e}();t.default=D,(0,g.default)(D.prototype,r(368)),(0,g.default)(D.prototype,r(374)),(0,g.default)(D.prototype,r(382)),(0,g.default)(D.prototype,r(372)),(0,g.default)(D.prototype,r(371)),(0,g.default)(D.prototype,r(377)),(0,g.default)(D.prototype,r(370)),(0,g.default)(D.prototype,r(381)),(0,g.default)(D.prototype,r(380)),(0,g.default)(D.prototype,r(373)),(0,g.default)(D.prototype,r(369));for(var C=A.TYPES,w=Array.isArray(C),P=0,C=w?C:(0,a.default)(C);;){var k;if("break"===function(){if(w){if(P>=C.length)return"break";k=C[P++]}else{if(P=C.next(),P.done)return"break";k=P.value}var e=k,t="is"+e;D.prototype[t]=function(e){return A[t](this.node,e)},D.prototype["assert"+e]=function(r){if(!this[t](r))throw new TypeError("Expected node path of type "+e)}}())break}for(var F in c){(function(e){if("_"===e[0])return"continue";A.TYPES.indexOf(e)<0&&A.TYPES.push(e);var t=c[e];D.prototype["is"+e]=function(e){return t.checkPath(this,e)}})(F)}e.exports=t.default},function(e,t,r){"use strict";var n=r(142),i=r(140);e.exports=function(e){return n(i(e))}},function(e,t,r){"use strict";function n(e,t){var r=s(e,t);return i(r)?r:void 0}var i=r(497),s=r(535);e.exports=n},function(e,t){"use strict";e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children=[],e.webpackPolyfill=1),e}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e,t,r,n){if(e.selfReference){if(!n.hasBinding(r.name)||n.hasGlobal(r.name)){if(!f.isFunction(t))return;var i=p;t.generator&&(i=d);var s=i({FUNCTION:t,FUNCTION_ID:r,FUNCTION_KEY:n.generateUidIdentifier(r.name)}).expression;s.callee._skipModulesRemap=!0;for(var a=s.callee.body.body[0].params,u=0,l=(0,o.default)(t);u0&&void 0!==arguments[0]?arguments[0]:{},r=arguments[1];(0,p.default)(this,n);var i=(0,h.default)(this,t.call(this));return i.pipeline=r,i.log=new L.default(i,e.filename||"unknown"),i.opts=i.initOptions(e),i.parserOpts={sourceType:i.opts.sourceType,sourceFileName:i.opts.filename,plugins:[]},i.pluginVisitors=[],i.pluginPasses=[],i.buildPluginsForOptions(i.opts),i.opts.passPerPreset&&(i.perPresetOpts=[],i.opts.presets.forEach(function(e){var t=(0,c.default)((0,u.default)(i.opts),e);i.perPresetOpts.push(t),i.buildPluginsForOptions(t)})),i.metadata={usedHelpers:[],marked:[],modules:{imports:[],exports:{exported:[],specifiers:[]}}},i.dynamicImportTypes={},i.dynamicImportIds={},i.dynamicImports=[],i.declarations={},i.usedHelpers={},i.path=null,i.ast={},i.code="",i.shebang="",i.hub=new w.Hub(i),i}return(0,y.default)(n,t),n.prototype.getMetadata=function(){for(var e=!1,t=this.ast.program.body,r=Array.isArray(t),n=0,t=r?t:(0,a.default)(t);;){var i;if(r){if(n>=t.length)break;i=t[n++]}else{if(n=t.next(),n.done)break;i=n.value}var s=i;if(H.isModuleDeclaration(s)){e=!0;break}}e&&this.path.traverse(E,this)},n.prototype.initOptions=function(e){e=new _.default(this.log,this.pipeline).init(e),e.inputSourceMap&&(e.sourceMaps=!0),e.moduleId&&(e.moduleIds=!0),e.basename=q.default.basename(e.filename,q.default.extname(e.filename)),e.ignore=W.arrayify(e.ignore,W.regexify),e.only&&(e.only=W.arrayify(e.only,W.regexify)),(0,M.default)(e,{moduleRoot:e.sourceRoot}),(0,M.default)(e,{sourceRoot:e.moduleRoot}),(0,M.default)(e,{filenameRelative:e.filename});var t=q.default.basename(e.filenameRelative);return(0,M.default)(e,{sourceFileName:t,sourceMapTarget:t}),e},n.prototype.buildPluginsForOptions=function(e){if(Array.isArray(e.plugins)){for(var t=e.plugins.concat(te),r=[],n=[],i=t,s=Array.isArray(i),o=0,i=s?i:(0,a.default)(i);;){var u;if(s){if(o>=i.length)break;u=i[o++]}else{if(o=i.next(),o.done)break;u=o.value}var l=u,c=l[0],f=l[1];r.push(c.visitor),n.push(new C.default(this,c,f)),c.manipulateOptions&&c.manipulateOptions(e,this.parserOpts,this)}this.pluginVisitors.push(r),this.pluginPasses.push(n)}},n.prototype.getModuleName=function(){var e=this.opts;if(!e.moduleIds)return null;if(null!=e.moduleId&&!e.getModuleId)return e.moduleId;var t=e.filenameRelative,r="";if(null!=e.moduleRoot&&(r=e.moduleRoot+"/"),!e.filenameRelative)return r+e.filename.replace(/^\//,"");if(null!=e.sourceRoot){var n=new RegExp("^"+e.sourceRoot+"/?");t=t.replace(n,"")}return t=t.replace(/\.(\w*?)$/,""),r+=t,r=r.replace(/\\/g,"/"),e.getModuleId?e.getModuleId(r)||r:r},n.prototype.resolveModuleSource=function(e){var t=this.opts.resolveModuleSource;return t&&(e=t(e,this.opts.filename)),e},n.prototype.addImport=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,n=e+":"+t,i=this.dynamicImportIds[n];if(!i){e=this.resolveModuleSource(e),i=this.dynamicImportIds[n]=this.scope.generateUidIdentifier(r);var s=[];"*"===t?s.push(H.importNamespaceSpecifier(i)):"default"===t?s.push(H.importDefaultSpecifier(i)):s.push(H.importSpecifier(i,H.identifier(t)));var a=H.importDeclaration(s,H.stringLiteral(e));a._blockHoist=3,this.path.unshiftContainer("body",a)}return i},n.prototype.addHelper=function(e){var t=this.declarations[e];if(t)return t;this.usedHelpers[e]||(this.metadata.usedHelpers.push(e),this.usedHelpers[e]=!0);var r=this.get("helperGenerator"),n=this.get("helpersNamespace");if(r){var i=r(e);if(i)return i}else if(n)return H.memberExpression(n,H.identifier(e));var s=(0,g.default)(e),a=this.declarations[e]=this.scope.generateUidIdentifier(e);return H.isFunctionExpression(s)&&!s.id?(s.body._compact=!0,s._generated=!0,s.id=a,s.type="FunctionDeclaration",this.path.unshiftContainer("body",s)):(s._compact=!0,this.scope.push({id:a,init:s,unique:!0})),a},n.prototype.addTemplateObject=function(e,t,r){var n=r.elements.map(function(e){return e.value}),i=e+"_"+r.elements.length+"_"+n.join(","),s=this.declarations[i];if(s)return s;var a=this.declarations[i]=this.scope.generateUidIdentifier("templateObject"),o=this.addHelper(e),u=H.callExpression(o,[t,r]);return u._compact=!0,this.scope.push({id:a,init:u,_blockHoist:1.9}),a},n.prototype.buildCodeFrameError=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:SyntaxError,n=e&&(e.loc||e._loc),i=new r(t);return n?i.loc=n.start:((0,P.default)(e,re,this.scope,i),i.message+=" (This is an error on an internal node. Probably an internal error",i.loc&&(i.message+=". Location has been estimated."),i.message+=")"),i},n.prototype.mergeSourceMap=function(e){var t=this.opts.inputSourceMap;if(t){var r=new F.default.SourceMapConsumer(t),n=new F.default.SourceMapConsumer(e),i=new F.default.SourceMapGenerator({file:r.file,sourceRoot:r.sourceRoot}),s=n.sources[0];r.eachMapping(function(e){var t=n.generatedPositionFor({line:e.generatedLine,column:e.generatedColumn,source:s});null!=t.column&&i.addMapping({source:e.source,original:null==e.source?null:{line:e.originalLine,column:e.originalColumn},generated:t})});var a=i.toJSON();return t.mappings=a.mappings,t}return e},n.prototype.parse=function(t){var n=V.parse,i=this.opts.parserOpts;if(i&&(i=(0,c.default)({},this.parserOpts,i),i.parser)){if("string"==typeof i.parser){var s=q.default.dirname(this.opts.filename)||e.cwd(),a=(0,X.default)(i.parser,s);if(!a)throw new Error("Couldn't find parser "+i.parser+' with "parse" method relative to directory '+s);n=r(178)(a).parse}else n=i.parser;i.parser={parse:function(e){return(0,V.parse)(e,i)}}}this.log.debug("Parse start");var o=n(t,i||this.parserOpts);return this.log.debug("Parse stop"),o},n.prototype._addAst=function(e){this.path=w.NodePath.get({hub:this.hub,parentPath:null,parent:e,container:e,key:"program"}).setContext(),this.scope=this.path.scope,this.ast=e,this.getMetadata()},n.prototype.addAst=function(e){this.log.debug("Start set AST"),this._addAst(e),this.log.debug("End set AST")},n.prototype.transform=function(){for(var e=0;e=r.length)break;s=r[i++]}else{if(i=r.next(),i.done)break;s=i.value}var o=s,u=o.plugin,l=u[e];l&&l.call(o,this)}},n.prototype.parseInputSourceMap=function(e){var t=this.opts;if(!1!==t.inputSourceMap){var r=A.default.fromSource(e);r&&(t.inputSourceMap=r.toObject(),e=A.default.removeComments(e))}return e},n.prototype.parseShebang=function(){var e=ee.exec(this.code);e&&(this.shebang=e[0],this.code=this.code.replace(ee,""))},n.prototype.makeResult=function(e){var t=e.code,r=e.map,n=e.ast,i=e.ignored,s={metadata:null,options:this.opts,ignored:!!i,code:null,ast:null,map:r||null};return this.opts.code&&(s.code=t),this.opts.ast&&(s.ast=n),this.opts.metadata&&(s.metadata=this.metadata),s},n.prototype.generate=function(){var t=this.opts,n=this.ast,i={ast:n};if(!t.code)return this.makeResult(i);var s=O.default;if(t.generatorOpts.generator&&"string"==typeof(s=t.generatorOpts.generator)){var a=q.default.dirname(this.opts.filename)||e.cwd(),o=(0,X.default)(s,a);if(!o)throw new Error("Couldn't find generator "+s+' with "print" method relative to directory '+a);s=r(178)(o).print}this.log.debug("Generation start");var u=s(n,t.generatorOpts?(0,c.default)(t,t.generatorOpts):t,this.code);return i.code=u.code,i.map=u.map,this.log.debug("Generation end"),this.shebang&&(i.code=this.shebang+"\n"+i.code),i.map&&(i.map=this.mergeSourceMap(i.map)),"inline"!==t.sourceMaps&&"both"!==t.sourceMaps||(i.code+="\n"+A.default.fromObject(i.map).toComment()),"inline"===t.sourceMaps&&(i.map=null),this.makeResult(i)},n}(U.default);t.default=ne,t.File=ne}).call(t,r(8))},function(e,t,r){(function(n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function s(e){var t=x[e];return null==t?x[e]=E.default.existsSync(e):t}function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],r=e.filename,n=new S(t);return!1!==e.babelrc&&n.findConfigs(r),n.mergeConfig({options:e,alias:"base",dirname:r&&g.default.dirname(r)}),n.configs}t.__esModule=!0;var o=r(87),u=i(o),l=r(3),c=i(l);t.default=a;var f=r(118),p=i(f),d=r(470),h=i(d),m=r(604),y=i(m),v=r(19),g=i(v),b=r(115),E=i(b),x={},A={},S=function(){function e(t){(0,c.default)(this,e),this.resolvedConfigs=[],this.configs=[],this.log=t}return e.prototype.findConfigs=function(e){if(e){(0,y.default)(e)||(e=g.default.join(n.cwd(),e));for(var t=!1,r=!1;e!==(e=g.default.dirname(e));){if(!t){var i=g.default.join(e,".babelrc");s(i)&&(this.addConfig(i),t=!0);var a=g.default.join(e,"package.json");!t&&s(a)&&(t=this.addConfig(a,"babel",JSON))}if(!r){var o=g.default.join(e,".babelignore");s(o)&&(this.addIgnoreConfig(o),r=!0)}if(r&&t)return}}},e.prototype.addIgnoreConfig=function(e){var t=E.default.readFileSync(e,"utf8"),r=t.split("\n");r=r.map(function(e){return e.replace(/#(.*?)$/,"").trim()}).filter(function(e){return!!e}),r.length&&this.mergeConfig({options:{ignore:r},alias:e,dirname:g.default.dirname(e)})},e.prototype.addConfig=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:h.default;if(this.resolvedConfigs.indexOf(e)>=0)return!1 +;this.resolvedConfigs.push(e);var n=E.default.readFileSync(e,"utf8"),i=void 0;try{i=A[n]=A[n]||r.parse(n),t&&(i=i[t])}catch(t){throw t.message=e+": Error while parsing JSON - "+t.message,t}return this.mergeConfig({options:i,alias:e,dirname:g.default.dirname(e)}),!!i},e.prototype.mergeConfig=function(e){var t=e.options,r=e.alias,i=e.loc,s=e.dirname;if(!t)return!1;if(t=(0,u.default)({},t),s=s||n.cwd(),i=i||r,t.extends){var a=(0,p.default)(t.extends,s);a?this.addConfig(a):this.log&&this.log.error("Couldn't resolve extends clause of "+t.extends+" in "+r),delete t.extends}this.configs.push({options:t,alias:r,loc:i,dirname:s});var o=void 0,l=n.env.BABEL_ENV||"production"||"development";t.env&&(o=t.env[l],delete t.env),this.mergeConfig({options:o,alias:r+".env."+l,dirname:s})},e}();e.exports=t.default}).call(t,r(8))},function(e,t,r){"use strict";function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(var t in e){var r=e[t];if(null!=r){var n=o.default[t];if(n&&n.alias&&(n=o.default[n.alias]),n){var i=s[n.type];i&&(r=i(r)),e[t]=r}}}return e}t.__esModule=!0,t.config=void 0,t.normaliseOptions=n;var i=r(53),s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(i),a=r(33),o=function(e){return e&&e.__esModule?e:{default:e}}(a);t.config=o.default},function(e,t,r){"use strict";function n(e){return!!e}function i(e){return l.booleanify(e)}function s(e){return l.list(e)}t.__esModule=!0,t.filename=void 0,t.boolean=n,t.booleanString=i,t.list=s;var a=r(284),o=function(e){return e&&e.__esModule?e:{default:e}}(a),u=r(122),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(u);t.filename=o.default},function(e,t){"use strict";e.exports={auxiliaryComment:{message:"Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`"},blacklist:{message:"Put the specific transforms you want in the `plugins` option"},breakConfig:{message:"This is not a necessary option in Babel 6"},experimental:{message:"Put the specific transforms you want in the `plugins` option"},externalHelpers:{message:"Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/"},extra:{message:""},jsxPragma:{message:"use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/"},loose:{message:"Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option."},metadataUsedHelpers:{message:"Not required anymore as this is enabled by default"},modules:{message:"Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules"},nonStandard:{message:"Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/"},optional:{message:"Put the specific transforms you want in the `plugins` option"},sourceMapName:{message:"Use the `sourceMapTarget` option"},stage:{message:"Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets"},whitelist:{message:"Put the specific transforms you want in the `plugins` option"}}},function(e,t,r){"use strict";var n=r(43),i=r(428),s=r(427),a=r(21),o=r(153),u=r(238),l={},c={},f=e.exports=function(e,t,r,f,p){var d,h,m,y,v=p?function(){return e}:u(e),g=n(r,f,t?2:1),b=0;if("function"!=typeof v)throw TypeError(e+" is not iterable!");if(s(v)){for(d=o(e.length);d>b;b++)if((y=t?g(a(h=e[b])[0],h[1]):g(e[b]))===l||y===c)return y}else for(m=v.call(e);!(h=m.next()).done;)if((y=i(m,g,h.value,t))===l||y===c)return y};f.BREAK=l,f.RETURN=c},function(e,t){"use strict";e.exports={}},function(e,t,r){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(95)("meta"),s=r(16),a=r(28),o=r(23).f,u=0,l=Object.isExtensible||function(){return!0},c=!r(27)(function(){return l(Object.preventExtensions({}))}),f=function(e){o(e,i,{value:{i:"O"+ ++u,w:{}}})},p=function(e,t){if(!s(e))return"symbol"==(void 0===e?"undefined":n(e))?e:("string"==typeof e?"S":"P")+e;if(!a(e,i)){if(!l(e))return"F";if(!t)return"E";f(e)}return e[i].i},d=function(e,t){if(!a(e,i)){if(!l(e))return!0;if(!t)return!1;f(e)}return e[i].w},h=function(e){return c&&m.NEED&&l(e)&&!a(e,i)&&f(e),e},m=e.exports={KEY:i,NEED:!1,fastKey:p,getWeak:d,onFreeze:h}},function(e,t,r){"use strict";var n=r(16);e.exports=function(e,t){if(!n(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,r){"use strict";r(440);for(var n=r(15),i=r(29),s=r(56),a=r(13)("toStringTag"),o="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),u=0;u=0;c--)a=u[c],"."===a?u.splice(c,1):".."===a?l++:l>0&&(""===a?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=o?"/":"."),s?(s.path=r,i(s)):r}function a(e,t){""===e&&(e="."),""===t&&(t=".");var r=n(t),a=n(e);if(a&&(e=a.path||"/"),r&&!r.scheme)return a&&(r.scheme=a.scheme),i(r);if(r||t.match(v))return t;if(a&&!a.host&&!a.path)return a.host=t,i(a);var o="/"===t.charAt(0)?t:s(e.replace(/\/+$/,"")+"/"+t);return a?(a.path=o,i(a)):o}function o(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==t.indexOf(e+"/");){var n=e.lastIndexOf("/");if(n<0)return t;if(e=e.slice(0,n),e.match(/^([^\/]+:\/)?\/*$/))return t;++r}return Array(r+1).join("../")+t.substr(e.length+1)}function u(e){return e}function l(e){return f(e)?"$"+e:e}function c(e){return f(e)?e.slice(1):e}function f(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var r=t-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,t,r){var n=e.source-t.source;return 0!==n?n:0!==(n=e.originalLine-t.originalLine)?n:0!==(n=e.originalColumn-t.originalColumn)||r?n:0!==(n=e.generatedColumn-t.generatedColumn)?n:(n=e.generatedLine-t.generatedLine,0!==n?n:e.name-t.name)}function d(e,t,r){var n=e.generatedLine-t.generatedLine;return 0!==n?n:0!==(n=e.generatedColumn-t.generatedColumn)||r?n:0!==(n=e.source-t.source)?n:0!==(n=e.originalLine-t.originalLine)?n:(n=e.originalColumn-t.originalColumn,0!==n?n:e.name-t.name)}function h(e,t){return e===t?0:e>t?1:-1}function m(e,t){var r=e.generatedLine-t.generatedLine;return 0!==r?r:0!==(r=e.generatedColumn-t.generatedColumn)?r:0!==(r=h(e.source,t.source))?r:0!==(r=e.originalLine-t.originalLine)?r:(r=e.originalColumn-t.originalColumn,0!==r?r:h(e.name,t.name))}t.getArg=r;var y=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/,v=/^data:.+\,.+$/;t.urlParse=n,t.urlGenerate=i,t.normalize=s,t.join=a,t.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(y)},t.relative=o;var g=function(){return!("__proto__"in Object.create(null))}();t.toSetString=g?u:l,t.fromSetString=g?u:c,t.compareByOriginalPositions=p,t.compareByGeneratedPositionsDeflated=d,t.compareByGeneratedPositionsInflated=m},function(e,t,r){(function(t){"use strict";function n(e,t){if(e===t)return 0;for(var r=e.length,n=t.length,i=0,s=Math.min(r,n);i=0;o--)if(u[o]!==l[o])return!1;for(o=u.length-1;o>=0;o--)if(a=u[o],!d(e[a],t[a],r,n))return!1;return!0}function y(e,t,r){d(e,t,!0)&&f(e,t,r,"notDeepStrictEqual",y)}function v(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function g(e){var t;try{e()}catch(e){t=e}return t}function b(e,t,r,n){var i;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=g(t),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),e&&!i&&f(i,r,"Missing expected exception"+n);var s="string"==typeof n,a=!e&&x.isError(i),o=!e&&i&&!r;if((a&&s&&v(i,r)||o)&&f(i,r,"Got unwanted exception"+n),e&&i&&r&&!v(i,r)||!e&&i)throw i}var E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},x=r(117),A=Object.prototype.hasOwnProperty,S=Array.prototype.slice,_=function(){return"foo"===function(){}.name}(),D=e.exports=p,C=/\s*function\s+([^\(\s]*)\s*/;D.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=c(this),this.generatedMessage=!0);var t=e.stackStartFunction||f;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var n=r.stack,i=o(t),s=n.indexOf("\n"+i);if(s>=0){var a=n.indexOf("\n",s+1);n=n.substring(a+1)}this.stack=n}}},x.inherits(D.AssertionError,Error),D.fail=f,D.ok=p,D.equal=function(e,t,r){e!=t&&f(e,t,r,"==",D.equal)},D.notEqual=function(e,t,r){e==t&&f(e,t,r,"!=",D.notEqual)},D.deepEqual=function(e,t,r){d(e,t,!1)||f(e,t,r,"deepEqual",D.deepEqual)},D.deepStrictEqual=function(e,t,r){d(e,t,!0)||f(e,t,r,"deepStrictEqual",D.deepStrictEqual)},D.notDeepEqual=function(e,t,r){d(e,t,!1)&&f(e,t,r,"notDeepEqual",D.notDeepEqual)},D.notDeepStrictEqual=y,D.strictEqual=function(e,t,r){e!==t&&f(e,t,r,"===",D.strictEqual)},D.notStrictEqual=function(e,t,r){e===t&&f(e,t,r,"!==",D.notStrictEqual)},D.throws=function(e,t,r){b(!0,e,t,r)},D.doesNotThrow=function(e,t,r){b(!1,e,t,r)},D.ifError=function(e){if(e)throw e};var w=Object.keys||function(e){var t=[];for(var r in e)A.call(e,r)&&t.push(r);return t}}).call(t,function(){return this}())},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=r(2),s=n(i),a=r(3),o=n(a),u=r(42),l=n(u),c=r(41),f=n(c),p=r(34),d=n(p),h=r(20),m=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(h),y=r(119),v=n(y),g=r(7),b=n(g),E=r(174),x=n(E),A=r(109),S=n(A),_=["enter","exit"],D=function(e){function t(r,n){(0,o.default)(this,t);var i=(0,l.default)(this,e.call(this));return i.initialized=!1,i.raw=(0,x.default)({},r),i.key=i.take("name")||n,i.manipulateOptions=i.take("manipulateOptions"),i.post=i.take("post"),i.pre=i.take("pre"),i.visitor=i.normaliseVisitor((0,S.default)(i.take("visitor"))||{}),i}return(0,f.default)(t,e),t.prototype.take=function(e){var t=this.raw[e];return delete this.raw[e],t},t.prototype.chain=function(e,t){if(!e[t])return this[t];if(!this[t])return e[t];var r=[e[t],this[t]];return function(){for(var e=void 0,t=arguments.length,n=Array(t),i=0;i=a.length)break;l=a[u++]}else{if(u=a.next(),u.done)break;l=u.value}var c=l;if(c){var f=c.apply(this,n);null!=f&&(e=f)}}return e}},t.prototype.maybeInherit=function(e){var t=this.take("inherits");t&&(t=d.default.normalisePlugin(t,e,"inherits"),this.manipulateOptions=this.chain(t,"manipulateOptions"),this.post=this.chain(t,"post"),this.pre=this.chain(t,"pre"),this.visitor=b.default.visitors.merge([t.visitor,this.visitor]))},t.prototype.init=function(e,t){if(!this.initialized){this.initialized=!0,this.maybeInherit(e);for(var r in this.raw)throw new Error(m.get("pluginInvalidProperty",e,t,r))}},t.prototype.normaliseVisitor=function(e){for(var t=_,r=Array.isArray(t),n=0,t=r?t:(0,s.default)(t);;){var i;if(r){if(n>=t.length)break;i=t[n++]}else{if(n=t.next(),n.done)break;i=n.value}if(e[i])throw new Error("Plugins aren't allowed to specify catch-all enter/exit handlers. Please target individual nodes.")}return b.default.explode(e),e},t}(v.default);t.default=D,e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0;var n=r(2),i=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=function(e){var t=e.messages;return{visitor:{Scope:function(e){var r=e.scope;for(var n in r.bindings){var s=r.bindings[n];if("const"===s.kind||"module"===s.kind)for(var a=s.constantViolations,o=Array.isArray(a),u=0,a=o?a:(0,i.default)(a);;){var l;if(o){if(u>=a.length)break;l=a[u++]}else{if(u=a.next(),u.done)break;l=u.value}var c=l;throw c.buildCodeFrameError(t.get("readOnly",n))}}}}}},e.exports=t.default},function(e,t){"use strict";t.__esModule=!0,t.default=function(){return{manipulateOptions:function(e,t){t.plugins.push("asyncFunctions")}}},e.exports=t.default},function(e,t){"use strict";t.__esModule=!0,t.default=function(e){var t=e.types;return{visitor:{ArrowFunctionExpression:function(e,r){if(r.opts.spec){var n=e.node;if(n.shadow)return;n.shadow={this:!1},n.type="FunctionExpression";var i=t.thisExpression();i._forceShadow=e,e.ensureBlock(),e.get("body").unshiftContainer("body",t.expressionStatement(t.callExpression(r.addHelper("newArrowCheck"),[t.thisExpression(),i]))),e.replaceWith(t.callExpression(t.memberExpression(n,t.identifier("bind")),[t.thisExpression()]))}else e.arrowFunctionToShadowed()}}}},e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0;var n=r(2),i=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=function(e){function t(e,t){for(var n=t.get(e),s=n,a=Array.isArray(s),o=0,s=a?s:(0,i.default)(s);;){var u;if(a){if(o>=s.length)break;u=s[o++]}else{if(o=s.next(),o.done)break;u=o.value}var l=u,c=l.node;if(l.isFunctionDeclaration()){var f=r.variableDeclaration("let",[r.variableDeclarator(c.id,r.toExpression(c))]);f._blockHoist=2,c.id=null,l.replaceWith(f)}}}var r=e.types;return{visitor:{BlockStatement:function(e){var n=e.node,i=e.parent;r.isFunction(i,{body:n})||r.isExportDeclaration(i)||t("body",e)},SwitchCase:function(e){t("consequent",e)}}}},e.exports=t.default},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e){return b.isLoop(e.parent)||b.isCatchClause(e.parent)}function s(e){return!!b.isVariableDeclaration(e)&&(!!e[b.BLOCK_SCOPED_SYMBOL]||("let"===e.kind||"const"===e.kind))}function a(e,t,r,n){var i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(t||(t=e.node),!b.isFor(r))for(var s=0;s0&&e.traverse(P,t),e.skip()}},v.visitor]),P=y.default.visitors.merge([{ReferencedIdentifier:function(e,t){var r=t.letReferences[e.node.name];if(r){var n=e.scope.getBindingIdentifier(e.node.name);n&&n!==r||(t.closurify=!0)}}},v.visitor]),k={enter:function(e,t){var r=e.node;e.parent;if(e.isForStatement()){if(o(r.init)){var n=t.pushDeclar(r.init);1===n.length?r.init=n[0]:r.init=b.sequenceExpression(n)}}else if(e.isFor())o(r.left)&&(t.pushDeclar(r.left),r.left=r.left.declarations[0].id);else if(o(r))e.replaceWithMultiple(t.pushDeclar(r).map(function(e){return b.expressionStatement(e)}));else if(e.isFunction())return e.skip()}},F={LabeledStatement:function(e,t){var r=e.node;t.innerLabels.push(r.label.name)}},T={enter:function(e,t){if(e.isAssignmentExpression()||e.isUpdateExpression()){var r=e.getBindingIdentifiers();for(var n in r)t.outsideReferences[n]===e.scope.getBindingIdentifier(n)&&(t.reassignments[n]=!0)}}},O={Loop:function(e,t){var r=t.ignoreLabeless;t.ignoreLabeless=!0,e.traverse(O,t),t.ignoreLabeless=r,e.skip()},Function:function(e){e.skip()},SwitchCase:function(e,t){var r=t.inSwitchCase;t.inSwitchCase=!0,e.traverse(O,t),t.inSwitchCase=r,e.skip()},"BreakStatement|ContinueStatement|ReturnStatement":function(e,t){var r=e.node,n=e.parent,i=e.scope;if(!r[this.LOOP_IGNORE]){var s=void 0,a=u(r);if(a){if(r.label){if(t.innerLabels.indexOf(r.label.name)>=0)return;a=a+"|"+r.label.name}else{if(t.ignoreLabeless)return;if(t.inSwitchCase)return;if(b.isBreakStatement(r)&&b.isSwitchCase(n))return}t.hasBreakContinue=!0,t.map[a]=r,s=b.stringLiteral(a)}e.isReturnStatement()&&(t.hasReturn=!0,s=b.objectExpression([b.objectProperty(b.identifier("v"),r.argument||i.buildUndefinedNode())])),s&&(s=b.returnStatement(s),s[this.LOOP_IGNORE]=!0,e.skip(),e.replaceWith(b.inherits(s,r)))}}},B=function(){function e(t,r,n,i,s){(0,h.default)(this,e),this.parent=n,this.scope=i,this.file=s,this.blockPath=r,this.block=r.node,this.outsideLetReferences=(0,p.default)(null),this.hasLetReferences=!1,this.letReferences=(0,p.default)(null),this.body=[],t&&(this.loopParent=t.parent,this.loopLabel=b.isLabeledStatement(this.loopParent)&&this.loopParent.label,this.loopPath=t,this.loop=t.node)}return e.prototype.run=function(){var e=this.block;if(!e._letDone){e._letDone=!0;var t=this.getLetReferences();if(b.isFunction(this.parent)||b.isProgram(this.block))return void this.updateScopeInfo();if(this.hasLetReferences)return t?this.wrapClosure():this.remap(),this.updateScopeInfo(t),this.loopLabel&&!b.isLabeledStatement(this.loopParent)?b.labeledStatement(this.loopLabel,this.loop):void 0}},e.prototype.updateScopeInfo=function(e){var t=this.scope,r=t.getFunctionParent(),n=this.letReferences;for(var i in n){var s=n[i],a=t.getBinding(s.name);a&&("let"!==a.kind&&"const"!==a.kind||(a.kind="var",e?t.removeBinding(s.name):t.moveBindingTo(s.name,r)))}},e.prototype.remap=function(){var e=this.letReferences,t=this.scope;for(var r in e){var n=e[r];(t.parentHasBinding(r)||t.hasGlobal(r))&&(t.hasOwnBinding(r)&&t.rename(n.name),this.blockPath.scope.hasOwnBinding(r)&&this.blockPath.scope.rename(n.name))}},e.prototype.wrapClosure=function(){if(this.file.opts.throwIfClosureRequired)throw this.blockPath.buildCodeFrameError("Compiling let/const in this block would add a closure (throwIfClosureRequired).");var e=this.block,t=this.outsideLetReferences;if(this.loop)for(var r in t){var n=t[r];(this.scope.hasGlobal(n.name)||this.scope.parentHasBinding(n.name))&&(delete t[n.name],delete this.letReferences[n.name],this.scope.rename(n.name),this.letReferences[n.name]=n,t[n.name]=n)}this.has=this.checkLoop(),this.hoistVarDeclarations();var i=(0,x.default)(t),s=(0,x.default)(t),a=this.blockPath.isSwitchStatement(),o=b.functionExpression(null,i,b.blockStatement(a?[e]:e.body));o.shadow=!0,this.addContinuations(o);var u=o;this.loop&&(u=this.scope.generateUidIdentifier("loop"),this.loopPath.insertBefore(b.variableDeclaration("var",[b.variableDeclarator(u,o)])));var l=b.callExpression(u,s),c=this.scope.generateUidIdentifier("ret");y.default.hasType(o.body,this.scope,"YieldExpression",b.FUNCTION_TYPES)&&(o.generator=!0,l=b.yieldExpression(l,!0)),y.default.hasType(o.body,this.scope,"AwaitExpression",b.FUNCTION_TYPES)&&(o.async=!0,l=b.awaitExpression(l)),this.buildClosure(c,l),a?this.blockPath.replaceWithMultiple(this.body):e.body=this.body},e.prototype.buildClosure=function(e,t){var r=this.has;r.hasReturn||r.hasBreakContinue?this.buildHas(e,t):this.body.push(b.expressionStatement(t))},e.prototype.addContinuations=function(e){var t={reassignments:{},outsideReferences:this.outsideLetReferences};this.scope.traverse(e,T,t);for(var r=0;r=t.length)break;o=t[a++]}else{if(a=t.next(),a.done)break;o=a.value}var u=o;"get"===u.kind||"set"===u.kind?n(e,u):r(e.objId,u,e.body)}}function a(e){for(var s=e.objId,a=e.body,u=e.computedProps,l=e.state,c=u,f=Array.isArray(c),p=0,c=f?c:(0,i.default)(c);;){var d;if(f){if(p>=c.length)break;d=c[p++]}else{if(p=c.next(),p.done)break;d=p.value}var h=d,m=o.toComputedKey(h);if("get"===h.kind||"set"===h.kind)n(e,h);else if(o.isStringLiteral(m,{value:"__proto__"}))r(s,h,a);else{if(1===u.length)return o.callExpression(l.addHelper("defineProperty"),[e.initPropExpression,m,t(h)]);a.push(o.expressionStatement(o.callExpression(l.addHelper("defineProperty"),[s,m,t(h)])))}}}var o=e.types,u=e.template,l=u("\n MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {};\n MUTATOR_MAP_REF[KEY].KIND = VALUE;\n ");return{visitor:{ObjectExpression:{exit:function(e,t){for(var r=e.node,n=e.parent,u=e.scope,l=!1,c=r.properties,f=Array.isArray(c),p=0,c=f?c:(0,i.default)(c);;){var d;if(f){if(p>=c.length)break;d=c[p++]}else{if(p=c.next(),p.done)break;d=p.value}if(l=!0===d.computed)break}if(l){for(var h=[],m=[],y=!1,v=r.properties,g=Array.isArray(v),b=0,v=g?v:(0,i.default)(v);;){var E;if(g){if(b>=v.length)break;E=v[b++]}else{if(b=v.next(),b.done)break;E=b.value}var x=E;x.computed&&(y=!0),y?m.push(x):h.push(x)}var A=u.generateUidIdentifierBasedOnNode(n),S=o.objectExpression(h),_=[];_.push(o.variableDeclaration("var",[o.variableDeclarator(A,S)]));var D=a;t.opts.loose&&(D=s);var C=void 0,w=function(){return C||(C=u.generateUidIdentifier("mutatorMap"),_.push(o.variableDeclaration("var",[o.variableDeclarator(C,o.objectExpression([]))]))),C},P=D({scope:u,objId:A,body:_,computedProps:m,initPropExpression:S,getMutatorId:w,state:t});C&&_.push(o.expressionStatement(o.callExpression(t.addHelper("defineEnumerableProperties"),[A,C]))),P?e.replaceWith(P):(_.push(o.expressionStatement(A)),e.replaceWithMultiple(_))}}}}}},e.exports=t.default},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=r(3),s=n(i),a=r(2),o=n(a);t.default=function(e){function t(e){for(var t=e.declarations,r=Array.isArray(t),i=0,t=r?t:(0,o.default)(t);;){var s;if(r){if(i>=t.length)break;s=t[i++]}else{if(i=t.next(),i.done)break;s=i.value}var a=s;if(n.isPattern(a.id))return!0}return!1}function r(e){for(var t=e.elements,r=Array.isArray(t),i=0,t=r?t:(0,o.default)(t);;){var s;if(r){if(i>=t.length)break;s=t[i++]}else{if(i=t.next(),i.done)break;s=i.value}var a=s;if(n.isRestElement(a))return!0}return!1}var n=e.types,i={ReferencedIdentifier:function(e,t){t.bindings[e.node.name]&&(t.deopt=!0,e.stop())}},a=function(){function e(t){(0,s.default)(this,e),this.blockHoist=t.blockHoist,this.operator=t.operator,this.arrays={},this.nodes=t.nodes||[],this.scope=t.scope,this.file=t.file,this.kind=t.kind} +return e.prototype.buildVariableAssignment=function(e,t){var r=this.operator;n.isMemberExpression(e)&&(r="=");var i=void 0;return i=r?n.expressionStatement(n.assignmentExpression(r,e,t)):n.variableDeclaration(this.kind,[n.variableDeclarator(e,t)]),i._blockHoist=this.blockHoist,i},e.prototype.buildVariableDeclaration=function(e,t){var r=n.variableDeclaration("var",[n.variableDeclarator(e,t)]);return r._blockHoist=this.blockHoist,r},e.prototype.push=function(e,t){n.isObjectPattern(e)?this.pushObjectPattern(e,t):n.isArrayPattern(e)?this.pushArrayPattern(e,t):n.isAssignmentPattern(e)?this.pushAssignmentPattern(e,t):this.nodes.push(this.buildVariableAssignment(e,t))},e.prototype.toArray=function(e,t){return this.file.opts.loose||n.isIdentifier(e)&&this.arrays[e.name]?e:this.scope.toArray(e,t)},e.prototype.pushAssignmentPattern=function(e,t){var r=this.scope.generateUidIdentifierBasedOnNode(t),i=n.variableDeclaration("var",[n.variableDeclarator(r,t)]);i._blockHoist=this.blockHoist,this.nodes.push(i);var s=n.conditionalExpression(n.binaryExpression("===",r,n.identifier("undefined")),e.right,r),a=e.left;if(n.isPattern(a)){var o=n.expressionStatement(n.assignmentExpression("=",r,s));o._blockHoist=this.blockHoist,this.nodes.push(o),this.push(a,r)}else this.nodes.push(this.buildVariableAssignment(a,s))},e.prototype.pushObjectRest=function(e,t,r,i){for(var s=[],a=0;a=i)break;if(!n.isRestProperty(o)){var u=o.key;n.isIdentifier(u)&&!o.computed&&(u=n.stringLiteral(o.key.name)),s.push(u)}}s=n.arrayExpression(s);var l=n.callExpression(this.file.addHelper("objectWithoutProperties"),[t,s]);this.nodes.push(this.buildVariableAssignment(r.argument,l))},e.prototype.pushObjectProperty=function(e,t){n.isLiteral(e.key)&&(e.computed=!0);var r=e.value,i=n.memberExpression(t,e.key,e.computed);n.isPattern(r)?this.push(r,i):this.nodes.push(this.buildVariableAssignment(r,i))},e.prototype.pushObjectPattern=function(e,t){if(e.properties.length||this.nodes.push(n.expressionStatement(n.callExpression(this.file.addHelper("objectDestructuringEmpty"),[t]))),e.properties.length>1&&!this.scope.isStatic(t)){var r=this.scope.generateUidIdentifierBasedOnNode(t);this.nodes.push(this.buildVariableDeclaration(r,t)),t=r}for(var i=0;it.elements.length)){if(e.elements.length=s.length)break;l=s[u++]}else{if(u=s.next(),u.done)break;l=u.value}var c=l;if(!c)return!1;if(n.isMemberExpression(c))return!1}for(var f=t.elements,p=Array.isArray(f),d=0,f=p?f:(0,o.default)(f);;){var h;if(p){if(d>=f.length)break;h=f[d++]}else{if(d=f.next(),d.done)break;h=d.value}var m=h;if(n.isSpreadElement(m))return!1;if(n.isCallExpression(m))return!1;if(n.isMemberExpression(m))return!1}var y=n.getBindingIdentifiers(e),v={deopt:!1,bindings:y};return this.scope.traverse(t,i,v),!v.deopt}},e.prototype.pushUnpackedArrayPattern=function(e,t){for(var r=0;r=y.length)break;b=y[g++]}else{if(g=y.next(),g.done)break;b=g.value}var E=b,x=m[m.length-1];if(x&&n.isVariableDeclaration(x)&&n.isVariableDeclaration(E)&&x.kind===E.kind){var A;(A=x.declarations).push.apply(A,E.declarations)}else m.push(E)}for(var S=m,_=Array.isArray(S),D=0,S=_?S:(0,o.default)(S);;){var C;if(_){if(D>=S.length)break;C=S[D++]}else{if(D=S.next(),D.done)break;C=D.value}var w=C;if(w.declarations)for(var P=w.declarations,k=Array.isArray(P),F=0,P=k?P:(0,o.default)(P);;){var T;if(k){if(F>=P.length)break;T=P[F++]}else{if(F=P.next(),F.done)break;T=F.value}var O=T,B=O.id.name;s.bindings[B]&&(s.bindings[B].kind=w.kind)}}1===m.length?e.replaceWith(m[0]):e.replaceWithMultiple(m)}}}}},e.exports=t.default},function(e,t){"use strict";t.__esModule=!0,t.default=function(e){function t(e){var t=e.node,r=e.scope,n=[],i=t.right;if(!a.isIdentifier(i)||!r.hasBinding(i.name)){var s=r.generateUidIdentifier("arr");n.push(a.variableDeclaration("var",[a.variableDeclarator(s,i)])),i=s}var u=r.generateUidIdentifier("i"),l=o({BODY:t.body,KEY:u,ARR:i});a.inherits(l,t),a.ensureBlock(l);var c=a.memberExpression(i,u,!0),f=t.left;return a.isVariableDeclaration(f)?(f.declarations[0].init=c,l.body.body.unshift(f)):l.body.body.unshift(a.expressionStatement(a.assignmentExpression("=",f,c))),e.parentPath.isLabeledStatement()&&(l=a.labeledStatement(e.parentPath.node.label,l)),n.push(l),n}function r(e,t){var r=e.node,n=e.scope,s=e.parent,o=r.left,l=void 0,c=void 0;if(a.isIdentifier(o)||a.isPattern(o)||a.isMemberExpression(o))c=o;else{if(!a.isVariableDeclaration(o))throw t.buildCodeFrameError(o,i.get("unknownForHead",o.type));c=n.generateUidIdentifier("ref"),l=a.variableDeclaration(o.kind,[a.variableDeclarator(o.declarations[0].id,c)])}var f=n.generateUidIdentifier("iterator"),p=n.generateUidIdentifier("isArray"),d=u({LOOP_OBJECT:f,IS_ARRAY:p,OBJECT:r.right,INDEX:n.generateUidIdentifier("i"),ID:c});l||d.body.body.shift();var h=a.isLabeledStatement(s),m=void 0;return h&&(m=a.labeledStatement(s.label,d)),{replaceParent:h,declar:l,node:m||d,loop:d}}function n(e,t){var r=e.node,n=e.scope,s=e.parent,o=r.left,u=void 0,c=n.generateUidIdentifier("step"),f=a.memberExpression(c,a.identifier("value"));if(a.isIdentifier(o)||a.isPattern(o)||a.isMemberExpression(o))u=a.expressionStatement(a.assignmentExpression("=",o,f));else{if(!a.isVariableDeclaration(o))throw t.buildCodeFrameError(o,i.get("unknownForHead",o.type));u=a.variableDeclaration(o.kind,[a.variableDeclarator(o.declarations[0].id,f)])}var p=n.generateUidIdentifier("iterator"),d=l({ITERATOR_HAD_ERROR_KEY:n.generateUidIdentifier("didIteratorError"),ITERATOR_COMPLETION:n.generateUidIdentifier("iteratorNormalCompletion"),ITERATOR_ERROR_KEY:n.generateUidIdentifier("iteratorError"),ITERATOR_KEY:p,STEP_KEY:c,OBJECT:r.right,BODY:null}),h=a.isLabeledStatement(s),m=d[3].block.body,y=m[0];return h&&(m[0]=a.labeledStatement(s.label,y)),{replaceParent:h,declar:u,loop:y,node:d}}var i=e.messages,s=e.template,a=e.types,o=s("\n for (var KEY = 0; KEY < ARR.length; KEY++) BODY;\n "),u=s("\n for (var LOOP_OBJECT = OBJECT,\n IS_ARRAY = Array.isArray(LOOP_OBJECT),\n INDEX = 0,\n LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {\n var ID;\n if (IS_ARRAY) {\n if (INDEX >= LOOP_OBJECT.length) break;\n ID = LOOP_OBJECT[INDEX++];\n } else {\n INDEX = LOOP_OBJECT.next();\n if (INDEX.done) break;\n ID = INDEX.value;\n }\n }\n "),l=s("\n var ITERATOR_COMPLETION = true;\n var ITERATOR_HAD_ERROR_KEY = false;\n var ITERATOR_ERROR_KEY = undefined;\n try {\n for (var ITERATOR_KEY = OBJECT[Symbol.iterator](), STEP_KEY; !(ITERATOR_COMPLETION = (STEP_KEY = ITERATOR_KEY.next()).done); ITERATOR_COMPLETION = true) {\n }\n } catch (err) {\n ITERATOR_HAD_ERROR_KEY = true;\n ITERATOR_ERROR_KEY = err;\n } finally {\n try {\n if (!ITERATOR_COMPLETION && ITERATOR_KEY.return) {\n ITERATOR_KEY.return();\n }\n } finally {\n if (ITERATOR_HAD_ERROR_KEY) {\n throw ITERATOR_ERROR_KEY;\n }\n }\n }\n ");return{visitor:{ForOfStatement:function(e,i){if(e.get("right").isArrayExpression())return e.parentPath.isLabeledStatement()?e.parentPath.replaceWithMultiple(t(e)):e.replaceWithMultiple(t(e));var s=n;i.opts.loose&&(s=r);var o=e.node,u=s(e,i),l=u.declar,c=u.loop,f=c.body;e.ensureBlock(),l&&f.body.push(l),f.body=f.body.concat(o.body.body),a.inherits(c,o),a.inherits(c.body,o.body),u.replaceParent?(e.parentPath.replaceWithMultiple(u.node),e.remove()):e.replaceWithMultiple(u.node)}}}},e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0,t.default=function(){return{visitor:{FunctionExpression:{exit:function(e){if("value"!==e.key&&!e.parentPath.isObjectProperty()){var t=(0,i.default)(e);t&&e.replaceWith(t)}}},ObjectProperty:function(e){var t=e.get("value");if(t.isFunction()){var r=(0,i.default)(t);r&&t.replaceWith(r)}}}}};var n=r(40),i=function(e){return e&&e.__esModule?e:{default:e}}(n);e.exports=t.default},function(e,t){"use strict";t.__esModule=!0,t.default=function(){return{visitor:{NumericLiteral:function(e){var t=e.node;t.extra&&/^0[ob]/i.test(t.extra.raw)&&(t.extra=void 0)},StringLiteral:function(e){var t=e.node;t.extra&&/\\[u]/gi.test(t.extra.raw)&&(t.extra=void 0)}}}},e.exports=t.default},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=r(14),s=n(i),a=r(9),o=n(a),u=r(2),l=n(u),c=r(10),f=n(c);t.default=function(){var e=(0,f.default)(),t={ReferencedIdentifier:function(e){var t=e.node.name,r=this.remaps[t];if(r&&this.scope.getBinding(t)===e.scope.getBinding(t)){if(e.parentPath.isCallExpression({callee:e.node}))e.replaceWith(g.sequenceExpression([g.numericLiteral(0),r]));else if(e.isJSXIdentifier()&&g.isMemberExpression(r)){var n=r.object,i=r.property;e.replaceWith(g.JSXMemberExpression(g.JSXIdentifier(n.name),g.JSXIdentifier(i.name)))}else e.replaceWith(r);this.requeueInParent(e)}},AssignmentExpression:function(t){var r=t.node;if(!r[e]){var n=t.get("left");if(n.isIdentifier()){var i=n.node.name,s=this.exports[i];if(!s)return;if(this.scope.getBinding(i)!==t.scope.getBinding(i))return;r[e]=!0;for(var a=s,o=Array.isArray(a),u=0,a=o?a:(0,l.default)(a);;){var c;if(o){if(u>=a.length)break;c=a[u++]}else{if(u=a.next(),u.done)break;c=u.value}r=S(c,r).expression}t.replaceWith(r),this.requeueInParent(t)}else if(n.isObjectPattern())for(var f=n.node.properties,p=Array.isArray(f),d=0,f=p?f:(0,l.default)(f);;){var h;if(p){if(d>=f.length)break;h=f[d++]}else{if(d=f.next(),d.done)break;h=d.value}var m=h,y=m.value.name,v=this.exports[y];if(v){if(this.scope.getBinding(y)!==t.scope.getBinding(y))return;r[e]=!0,t.insertAfter(S(g.identifier(y),g.identifier(y)))}}else if(n.isArrayPattern())for(var b=n.node.elements,E=Array.isArray(b),x=0,b=E?b:(0,l.default)(b);;){var A;if(E){if(x>=b.length)break;A=b[x++]}else{if(x=b.next(),x.done)break;A=x.value}var _=A;if(_){var D=_.name,C=this.exports[D];if(C){if(this.scope.getBinding(D)!==t.scope.getBinding(D))return;r[e]=!0,t.insertAfter(S(g.identifier(D),g.identifier(D)))}}}}},UpdateExpression:function(e){var t=e.get("argument");if(t.isIdentifier()){var r=t.node.name;if(this.exports[r]&&this.scope.getBinding(r)===e.scope.getBinding(r)){var n=g.assignmentExpression(e.node.operator[0]+"=",t.node,g.numericLiteral(1));if(e.parentPath.isExpressionStatement()&&!e.isCompletionRecord()||e.node.prefix)return e.replaceWith(n),void this.requeueInParent(e);var i=[];i.push(n);var s=void 0;s="--"===e.node.operator?"+":"-",i.push(g.binaryExpression(s,t.node,g.numericLiteral(1))),e.replaceWithMultiple(g.sequenceExpression(i))}}}};return{inherits:y.default,visitor:{ThisExpression:function(e,t){this.ranCommonJS||!0===t.opts.allowTopLevelThis||e.findParent(function(e){return!e.is("shadow")&&D.indexOf(e.type)>=0})||e.replaceWith(g.identifier("undefined"))},Program:{exit:function(e){function r(t,r){var n=C[t];if(n)return n;var i=e.scope.generateUidIdentifier((0,p.basename)(t,(0,p.extname)(t))),s=g.variableDeclaration("var",[g.variableDeclarator(i,b(g.stringLiteral(t)).expression)]);return h[t]&&(s.loc=h[t].loc),"number"==typeof r&&r>0&&(s._blockHoist=r),v.push(s),C[t]=i}function n(e,t,r){var n=e[t]||[];e[t]=n.concat(r)}this.ranCommonJS=!0;var i=!!this.opts.strict,a=!!this.opts.noInterop,u=e.scope;u.rename("module"),u.rename("exports"),u.rename("require");for(var c=!1,f=!1,d=e.get("body"),h=(0,o.default)(null),m=(0,o.default)(null),y=(0,o.default)(null),v=[],D=(0,o.default)(null),C=(0,o.default)(null),w=d,P=Array.isArray(w),k=0,w=P?w:(0,l.default)(w);;){var F;if(P){if(k>=w.length)break;F=w[k++]}else{if(k=w.next(),k.done)break;F=k.value}var T=F;if(T.isExportDeclaration()){c=!0;for(var O=[].concat(T.get("declaration"),T.get("specifiers")),B=O,R=Array.isArray(B),I=0,B=R?B:(0,l.default)(B);;){var M;if(R){if(I>=B.length)break;M=B[I++]}else{if(I=B.next(),I.done)break;M=I.value}var N=M;if(N.getBindingIdentifiers().__esModule)throw N.buildCodeFrameError('Illegal export "__esModule"')}}if(T.isImportDeclaration()){var L;f=!0;var j=T.node.source.value,U=h[j]||{specifiers:[],maxBlockHoist:0,loc:T.node.loc};(L=U.specifiers).push.apply(L,T.node.specifiers),"number"==typeof T.node._blockHoist&&(U.maxBlockHoist=Math.max(T.node._blockHoist,U.maxBlockHoist)),h[j]=U,T.remove()}else if(T.isExportDefaultDeclaration()){var V=T.get("declaration");if(V.isFunctionDeclaration()){var G=V.node.id,W=g.identifier("default");G?(n(m,G.name,W),v.push(S(W,G)),T.replaceWith(V.node)):(v.push(S(W,g.toExpression(V.node))),T.remove())}else if(V.isClassDeclaration()){var Y=V.node.id,q=g.identifier("default");Y?(n(m,Y.name,q),T.replaceWithMultiple([V.node,S(q,Y)])):(T.replaceWith(S(q,g.toExpression(V.node))),T.parentPath.requeue(T.get("expression.left")))}else T.replaceWith(S(g.identifier("default"),V.node)),T.parentPath.requeue(T.get("expression.left"))}else if(T.isExportNamedDeclaration()){var K=T.get("declaration");if(K.node){if(K.isFunctionDeclaration()){var H=K.node.id;n(m,H.name,H),v.push(S(H,H)),T.replaceWith(K.node)}else if(K.isClassDeclaration()){var J=K.node.id;n(m,J.name,J),T.replaceWithMultiple([K.node,S(J,J)]),y[J.name]=!0}else if(K.isVariableDeclaration()){for(var X=K.get("declarations"),z=X,$=Array.isArray(z),Q=0,z=$?z:(0,l.default)(z);;){var Z;if($){if(Q>=z.length)break;Z=z[Q++]}else{if(Q=z.next(),Q.done)break;Z=Q.value}var ee=Z,te=ee.get("id"),re=ee.get("init"),ne=[];if(re.node||re.replaceWith(g.identifier("undefined")),te.isIdentifier())n(m,te.node.name,te.node),re.replaceWith(S(te.node,re.node).expression),y[te.node.name]=!0;else if(te.isObjectPattern())for(var ie=0;ie=he.length)break;ve=he[ye++]}else{if(ye=he.next(),ye.done)break;ve=ye.value}var ge=ve;ge.isExportNamespaceSpecifier()||ge.isExportDefaultSpecifier()||ge.isExportSpecifier()&&(a||"default"!==ge.node.local.name?v.push(x(g.stringLiteral(ge.node.exported.name),g.memberExpression(de,ge.node.local))):v.push(x(g.stringLiteral(ge.node.exported.name),g.memberExpression(g.callExpression(this.addHelper("interopRequireDefault"),[de]),ge.node.local))),y[ge.node.exported.name]=!0)}else for(var be=ce,Ee=Array.isArray(be),xe=0,be=Ee?be:(0,l.default)(be);;){var Ae;if(Ee){if(xe>=be.length)break;Ae=be[xe++]}else{if(xe=be.next(),xe.done)break;Ae=xe.value}var Se=Ae;Se.isExportSpecifier()&&(n(m,Se.node.local.name,Se.node.exported),y[Se.node.exported.name]=!0,fe.push(S(Se.node.exported,Se.node.local)))}T.replaceWithMultiple(fe)}else if(T.isExportAllDeclaration()){var _e=_({OBJECT:r(T.node.source.value,T.node._blockHoist)});_e.loc=T.node.loc,v.push(_e),T.remove()}}for(var De in h){var Ce=h[De],O=Ce.specifiers,we=Ce.maxBlockHoist;if(O.length){for(var Pe=r(De,we),ke=void 0,Fe=0;Fe0&&(Oe._blockHoist=we),v.push(Oe)}ke=Te.local}else g.isImportDefaultSpecifier(Te)&&(O[Fe]=g.importSpecifier(Te.local,g.identifier("default")))}for(var Be=O,Re=Array.isArray(Be),Ie=0,Be=Re?Be:(0,l.default)(Be);;){var Me;if(Re){if(Ie>=Be.length)break;Me=Be[Ie++]}else{if(Ie=Be.next(),Ie.done)break;Me=Ie.value}var Ne=Me;if(g.isImportSpecifier(Ne)){var Le=Pe;if("default"===Ne.imported.name)if(ke)Le=ke;else if(!a){Le=ke=e.scope.generateUidIdentifier(Pe.name);var je=g.variableDeclaration("var",[g.variableDeclarator(Le,g.callExpression(this.addHelper("interopRequireDefault"),[Pe]))]);we>0&&(je._blockHoist=we),v.push(je)}D[Ne.local.name]=g.memberExpression(Le,g.cloneWithoutLoc(Ne.imported))}}}else{var Ue=b(g.stringLiteral(De));Ue.loc=h[De].loc,v.push(Ue)}}if(f&&(0,s.default)(y).length)for(var Ve=(0,s.default)(y),Ge=0;Ge=l.length)break;p=l[f++]}else{if(f=l.next(),f.done)break;p=f.value}var d=p;d.isObjectProperty()&&(d=d.get("value")),t(d,d.node,e.scope,o,i)}a&&(e.scope.push({id:a}),e.replaceWith(r.assignmentExpression("=",a,e.node)))}}}}}};var u=r(193),l=n(u);e.exports=t.default},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}t.__esModule=!0;var i=r(2),s=function(e){return e&&e.__esModule?e:{default:e}}(i);t.default=function(){return{visitor:a.visitors.merge([{ArrowFunctionExpression:function(e){for(var t=e.get("params"),r=t,n=Array.isArray(r),i=0,r=n?r:(0,s.default)(r);;){var a;if(n){if(i>=r.length)break;a=r[i++]}else{if(i=r.next(),i.done)break;a=i.value}var o=a;if(o.isRestElement()||o.isAssignmentPattern()){e.arrowFunctionToShadowed();break}}}},u.visitor,p.visitor,c.visitor])}};var a=r(7),o=r(334),u=n(o),l=r(333),c=n(l),f=r(335),p=n(f);e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0,t.default=function(){return{visitor:{ObjectMethod:function(e){var t=e.node;if("method"===t.kind){var r=i.functionExpression(null,t.params,t.body,t.generator,t.async);r.returnType=t.returnType,e.replaceWith(i.objectProperty(t.key,r,t.computed))}},ObjectProperty:function(e){var t=e.node;t.shorthand&&(t.shorthand=!1)}}}};var n=r(1),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(n);e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0;var n=r(2),i=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=function(e){function t(e,t,r){return r.opts.loose&&!s.isIdentifier(e.argument,{name:"arguments"})?e.argument:t.toArray(e.argument,!0)}function r(e){for(var t=0;t=l.length)break;p=l[f++]}else{if(f=l.next(),f.done)break;p=f.value}var d=p;s.isSpreadElement(d)?(a(),o.push(t(d,r,n))):u.push(d)}return a(),o}var s=e.types;return{visitor:{ArrayExpression:function(e,t){var i=e.node,a=e.scope,o=i.elements;if(r(o)){var u=n(o,a,t),l=u.shift();s.isArrayExpression(l)||(u.unshift(l),l=s.arrayExpression([])),e.replaceWith(s.callExpression(s.memberExpression(l,s.identifier("concat")),u))}},CallExpression:function(e,t){var i=e.node,a=e.scope,o=i.arguments;if(r(o)){var u=e.get("callee");if(!u.isSuper()){var l=s.identifier("undefined");i.arguments=[];var c=void 0;c=1===o.length&&"arguments"===o[0].argument.name?[o[0].argument]:n(o,a,t);var f=c.shift();c.length?i.arguments.push(s.callExpression(s.memberExpression(f,s.identifier("concat")),c)):i.arguments.push(f);var p=i.callee;if(u.isMemberExpression()){var d=a.maybeGenerateMemoised(p.object);d?(p.object=s.assignmentExpression("=",d,p.object),l=d):l=p.object,s.appendToMemberExpression(p,s.identifier("apply"))}else i.callee=s.memberExpression(i.callee,s.identifier("apply"));s.isSuper(l)&&(l=s.thisExpression()),i.arguments.unshift(l)}}},NewExpression:function(e,t){var i=e.node,a=e.scope,o=i.arguments;if(r(o)){var u=n(o,a,t),l=s.arrayExpression([s.nullLiteral()]);o=s.callExpression(s.memberExpression(l,s.identifier("concat")),u),e.replaceWith(s.newExpression(s.callExpression(s.memberExpression(s.memberExpression(s.memberExpression(s.identifier("Function"),s.identifier("prototype")),s.identifier("bind")),s.identifier("apply")),[i.callee,o]),[]))}}}}},e.exports=t.default},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}t.__esModule=!0,t.default=function(){return{visitor:{RegExpLiteral:function(e){var t=e.node;s.is(t,"y")&&e.replaceWith(o.newExpression(o.identifier("RegExp"),[o.stringLiteral(t.pattern),o.stringLiteral(t.flags)]))}}}};var i=r(192),s=n(i),a=r(1),o=n(a);e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0;var n=r(2),i=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=function(e){function t(e){return n.isLiteral(e)&&"string"==typeof e.value}function r(e,t){return n.binaryExpression("+",e,t)}var n=e.types;return{visitor:{TaggedTemplateExpression:function(e,t){for(var r=e.node,s=r.quasi,a=[],o=[],u=[],l=s.quasis,c=Array.isArray(l),f=0,l=c?l:(0,i.default)(l);;){var p;if(c){if(f>=l.length)break;p=l[f++]}else{if(f=l.next(),f.done)break;p=f.value}var d=p;o.push(n.stringLiteral(d.value.cooked)),u.push(n.stringLiteral(d.value.raw))}o=n.arrayExpression(o),u=n.arrayExpression(u);var h="taggedTemplateLiteral";t.opts.loose&&(h+="Loose");var m=t.file.addTemplateObject(h,o,u);a.push(m),a=a.concat(s.expressions),e.replaceWith(n.callExpression(r.tag,a))},TemplateLiteral:function(e,s){for(var a=[],o=e.get("expressions"),u=e.node.quasis,l=Array.isArray(u),c=0,u=l?u:(0,i.default)(u);;){var f;if(l){if(c>=u.length)break;f=u[c++]}else{if(c=u.next(),c.done)break;f=c.value}var p=f;a.push(n.stringLiteral(p.value.cooked));var d=o.shift();d&&(!s.opts.spec||d.isBaseType("string")||d.isBaseType("number")?a.push(d.node):a.push(n.callExpression(n.identifier("String"),[d.node])))}if(a=a.filter(function(e){return!n.isLiteral(e,{value:""})}),t(a[0])||t(a[1])||a.unshift(n.stringLiteral("")),a.length>1){for(var h=r(a.shift(),a.shift()),m=a,y=Array.isArray(m),v=0,m=y?m:(0,i.default)(m);;){var g;if(y){if(v>=m.length)break;g=m[v++]}else{if(v=m.next(),v.done)break;g=v.value}h=r(h,g)}e.replaceWith(h)}else e.replaceWith(a[0])}}}},e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0;var n=r(10),i=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=function(e){var t=e.types,r=(0,i.default)();return{visitor:{Scope:function(e){var t=e.scope;t.getBinding("Symbol")&&t.rename("Symbol")},UnaryExpression:function(e){var n=e.node,i=e.parent;if(!n[r]&&!e.find(function(e){return e.node&&!!e.node._generated})){if(e.parentPath.isBinaryExpression()&&t.EQUALITY_BINARY_OPERATORS.indexOf(i.operator)>=0){var s=e.getOpposite();if(s.isLiteral()&&"symbol"!==s.node.value&&"object"!==s.node.value)return}if("typeof"===n.operator){var a=t.callExpression(this.addHelper("typeof"),[n.argument]);if(e.get("argument").isIdentifier()){var o=t.stringLiteral("undefined"),u=t.unaryExpression("typeof",n.argument);u[r]=!0,e.replaceWith(t.conditionalExpression(t.binaryExpression("===",u,o),o,a))}else e.replaceWith(a)}}}}}},e.exports=t.default},function(e,t,r){"use strict";t.__esModule=!0,t.default=function(){return{visitor:{RegExpLiteral:function(e){var t=e.node;a.is(t,"u")&&(t.pattern=(0,i.default)(t.pattern,t.flags),a.pullFlag(t,"u"))}}}};var n=r(612),i=function(e){return e&&e.__esModule?e:{default:e}}(n),s=r(192),a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(s);e.exports=t.default},function(e,t,r){"use strict";e.exports=r(606)},function(e,t,r){"use strict";e.exports={default:r(408),__esModule:!0}},function(e,t,r){"use strict";function n(){i(),s()}function i(){t.path=u=new o.default}function s(){t.scope=l=new o.default}t.__esModule=!0,t.scope=t.path=void 0;var a=r(364),o=function(e){return e&&e.__esModule?e:{default:e}}(a);t.clear=n,t.clearPath=i,t.clearScope=s;var u=t.path=new o.default,l=t.scope=new o.default},function(e,t){"use strict";function r(e){return e=e.split(" "),function(t){return e.indexOf(t)>=0}}function n(e,t){for(var r=65536,n=0;ne)return!1;if((r+=t[n+1])>=e)return!0}}function i(e){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&x.test(String.fromCharCode(e)):n(e,S)))}function s(e){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&A.test(String.fromCharCode(e)):n(e,S)||n(e,_))))}function a(e){var t={};for(var r in D)t[r]=e&&r in e?e[r]:D[r];return t}function o(e){return 10===e||13===e||8232===e||8233===e}function u(e,t){for(var r=1,n=0;;){N.lastIndex=n;var i=N.exec(e);if(!(i&&i.index>10),56320+(e-65536&1023))}function c(e,t,r,n){return e.type=t,e.end=r,e.loc.end=n,this.processComment(e),e}function f(e){return e[e.length-1]}function p(e){return e&&"Property"===e.type&&"init"===e.kind&&!1===e.method}function d(e){return"JSXIdentifier"===e.type?e.name:"JSXNamespacedName"===e.type?e.namespace.name+":"+e.name.name:"JSXMemberExpression"===e.type?d(e.object)+"."+d(e.property):void 0}function h(e,t){return new J(t,e).parse()}function m(e,t){var r=new J(t,e);return r.options.strictMode&&(r.state.strict=!0),r.getExpression()}var y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var v={6:r("enum await"),strict:r("implements interface let package private protected public static yield"),strictBind:r("eval arguments") +},g=r("break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this let const class extends export import yield super"),b="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠ-ࢴࢶ-ࢽऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿕ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞮꞰ-ꞷꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭥꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",E="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣔ-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఃా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഁ-ഃാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ູົຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭ᳲ-᳴᳸᳹᷀-᷵᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱꤀-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",x=new RegExp("["+b+"]"),A=new RegExp("["+b+E+"]");b=E=null;var S=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541],_=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239],D={sourceType:"script",sourceFilename:void 0,startLine:1,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowSuperOutsideMethod:!1,plugins:[],strictMode:null},C="function"==typeof Symbol&&"symbol"===y(Symbol.iterator)?function(e){return void 0===e?"undefined":y(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":y(e)},w=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},P=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+(void 0===t?"undefined":y(t)));e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},k=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":y(t))&&"function"!=typeof t?e:t},F=!0,T=function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};w(this,e),this.label=t,this.keyword=r.keyword,this.beforeExpr=!!r.beforeExpr,this.startsExpr=!!r.startsExpr,this.rightAssociative=!!r.rightAssociative,this.isLoop=!!r.isLoop,this.isAssign=!!r.isAssign,this.prefix=!!r.prefix,this.postfix=!!r.postfix,this.binop=r.binop||null,this.updateContext=null},O=function(e){function t(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return w(this,t),n.keyword=r,k(this,e.call(this,r,n))}return P(t,e),t}(T),B=function(e){function t(r,n){return w(this,t),k(this,e.call(this,r,{beforeExpr:F,binop:n}))}return P(t,e),t}(T),R={num:new T("num",{startsExpr:!0}),regexp:new T("regexp",{startsExpr:!0}),string:new T("string",{startsExpr:!0}),name:new T("name",{startsExpr:!0}),eof:new T("eof"),bracketL:new T("[",{beforeExpr:F,startsExpr:!0}),bracketR:new T("]"),braceL:new T("{",{beforeExpr:F,startsExpr:!0}),braceBarL:new T("{|",{beforeExpr:F,startsExpr:!0}),braceR:new T("}"),braceBarR:new T("|}"),parenL:new T("(",{beforeExpr:F,startsExpr:!0}),parenR:new T(")"),comma:new T(",",{beforeExpr:F}),semi:new T(";",{beforeExpr:F}),colon:new T(":",{beforeExpr:F}),doubleColon:new T("::",{beforeExpr:F}),dot:new T("."),question:new T("?",{beforeExpr:F}),arrow:new T("=>",{beforeExpr:F}),template:new T("template"),ellipsis:new T("...",{beforeExpr:F}),backQuote:new T("`",{startsExpr:!0}),dollarBraceL:new T("${",{beforeExpr:F,startsExpr:!0}),at:new T("@"),eq:new T("=",{beforeExpr:F,isAssign:!0}),assign:new T("_=",{beforeExpr:F,isAssign:!0}),incDec:new T("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new T("prefix",{beforeExpr:F,prefix:!0,startsExpr:!0}),logicalOR:new B("||",1),logicalAND:new B("&&",2),bitwiseOR:new B("|",3),bitwiseXOR:new B("^",4),bitwiseAND:new B("&",5),equality:new B("==/!=",6),relational:new B("",7),bitShift:new B("<>",8),plusMin:new T("+/-",{beforeExpr:F,binop:9,prefix:!0,startsExpr:!0}),modulo:new B("%",10),star:new B("*",10),slash:new B("/",10),exponent:new T("**",{beforeExpr:F,binop:11,rightAssociative:!0})},I={break:new O("break"),case:new O("case",{beforeExpr:F}),catch:new O("catch"),continue:new O("continue"),debugger:new O("debugger"),default:new O("default",{beforeExpr:F}),do:new O("do",{isLoop:!0,beforeExpr:F}),else:new O("else",{beforeExpr:F}),finally:new O("finally"),for:new O("for",{isLoop:!0}),function:new O("function",{startsExpr:!0}),if:new O("if"),return:new O("return",{beforeExpr:F}),switch:new O("switch"),throw:new O("throw",{beforeExpr:F}),try:new O("try"),var:new O("var"),let:new O("let"),const:new O("const"),while:new O("while",{isLoop:!0}),with:new O("with"),new:new O("new",{beforeExpr:F,startsExpr:!0}),this:new O("this",{startsExpr:!0}),super:new O("super",{startsExpr:!0}),class:new O("class"),extends:new O("extends",{beforeExpr:F}),export:new O("export"),import:new O("import",{startsExpr:!0}),yield:new O("yield",{beforeExpr:F,startsExpr:!0}),null:new O("null",{startsExpr:!0}),true:new O("true",{startsExpr:!0}),false:new O("false",{startsExpr:!0}),in:new O("in",{beforeExpr:F,binop:7}),instanceof:new O("instanceof",{beforeExpr:F,binop:7}),typeof:new O("typeof",{beforeExpr:F,prefix:!0,startsExpr:!0}),void:new O("void",{beforeExpr:F,prefix:!0,startsExpr:!0}),delete:new O("delete",{beforeExpr:F,prefix:!0,startsExpr:!0})};Object.keys(I).forEach(function(e){R["_"+e]=I[e]});var M=/\r\n?|\n|\u2028|\u2029/,N=new RegExp(M.source,"g"),L=/[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/,j=function e(t,r,n,i){w(this,e),this.token=t,this.isExpr=!!r,this.preserveSpace=!!n,this.override=i},U={braceStatement:new j("{",!1),braceExpression:new j("{",!0),templateQuasi:new j("${",!0),parenStatement:new j("(",!1),parenExpression:new j("(",!0),template:new j("`",!0,!0,function(e){return e.readTmplToken()}),functionExpression:new j("function",!0)};R.parenR.updateContext=R.braceR.updateContext=function(){if(1===this.state.context.length)return void(this.state.exprAllowed=!0);var e=this.state.context.pop();e===U.braceStatement&&this.curContext()===U.functionExpression?(this.state.context.pop(),this.state.exprAllowed=!1):e===U.templateQuasi?this.state.exprAllowed=!0:this.state.exprAllowed=!e.isExpr},R.name.updateContext=function(e){this.state.exprAllowed=!1,e!==R._let&&e!==R._const&&e!==R._var||M.test(this.input.slice(this.state.end))&&(this.state.exprAllowed=!0)},R.braceL.updateContext=function(e){this.state.context.push(this.braceIsBlock(e)?U.braceStatement:U.braceExpression),this.state.exprAllowed=!0},R.dollarBraceL.updateContext=function(){this.state.context.push(U.templateQuasi),this.state.exprAllowed=!0},R.parenL.updateContext=function(e){var t=e===R._if||e===R._for||e===R._with||e===R._while;this.state.context.push(t?U.parenStatement:U.parenExpression),this.state.exprAllowed=!0},R.incDec.updateContext=function(){},R._function.updateContext=function(){this.curContext()!==U.braceStatement&&this.state.context.push(U.functionExpression),this.state.exprAllowed=!1},R.backQuote.updateContext=function(){this.curContext()===U.template?this.state.context.pop():this.state.context.push(U.template),this.state.exprAllowed=!1};var V=function e(t,r){w(this,e),this.line=t,this.column=r},G=function e(t,r){w(this,e),this.start=t,this.end=r},W=function(){function e(){w(this,e)}return e.prototype.init=function(e,t){return this.strict=!1!==e.strictMode&&"module"===e.sourceType,this.input=t,this.potentialArrowAt=-1,this.inMethod=this.inFunction=this.inGenerator=this.inAsync=this.inPropertyName=this.inType=this.inClassProperty=this.noAnonFunctionType=!1,this.labels=[],this.decorators=[],this.tokens=[],this.comments=[],this.trailingComments=[],this.leadingComments=[],this.commentStack=[],this.pos=this.lineStart=0,this.curLine=e.startLine,this.type=R.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=[U.braceStatement],this.exprAllowed=!0,this.containsEsc=this.containsOctal=!1,this.octalPosition=null,this.invalidTemplateEscapePosition=null,this.exportedIdentifiers=[],this},e.prototype.curPosition=function(){return new V(this.curLine,this.pos-this.lineStart)},e.prototype.clone=function(t){var r=new e;for(var n in this){var i=this[n];t&&"context"!==n||!Array.isArray(i)||(i=i.slice()),r[n]=i}return r},e}(),Y=function e(t){w(this,e),this.type=t.type,this.value=t.value,this.start=t.start,this.end=t.end,this.loc=new G(t.startLoc,t.endLoc)},q=function(){function e(t,r){w(this,e),this.state=new W,this.state.init(t,r)}return e.prototype.next=function(){this.isLookahead||this.state.tokens.push(new Y(this.state)),this.state.lastTokEnd=this.state.end,this.state.lastTokStart=this.state.start,this.state.lastTokEndLoc=this.state.endLoc,this.state.lastTokStartLoc=this.state.startLoc,this.nextToken()},e.prototype.eat=function(e){return!!this.match(e)&&(this.next(),!0)},e.prototype.match=function(e){return this.state.type===e},e.prototype.isKeyword=function(e){return g(e)},e.prototype.lookahead=function(){var e=this.state;this.state=e.clone(!0),this.isLookahead=!0,this.next(),this.isLookahead=!1;var t=this.state.clone(!0);return this.state=e,t},e.prototype.setStrict=function(e){if(this.state.strict=e,this.match(R.num)||this.match(R.string)){for(this.state.pos=this.state.start;this.state.pos=this.input.length?this.finishToken(R.eof):e.override?e.override(this):this.readToken(this.fullCharCodeAtPos())},e.prototype.readToken=function(e){return i(e)||92===e?this.readWord():this.getTokenFromCode(e)},e.prototype.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.state.pos);return e<=55295||e>=57344?e:(e<<10)+this.input.charCodeAt(this.state.pos+1)-56613888},e.prototype.pushComment=function(e,t,r,n,i,s){var a={type:e?"CommentBlock":"CommentLine",value:t,start:r,end:n,loc:new G(i,s)};this.isLookahead||(this.state.tokens.push(a),this.state.comments.push(a),this.addComment(a))},e.prototype.skipBlockComment=function(){var e=this.state.curPosition(),t=this.state.pos,r=this.input.indexOf("*/",this.state.pos+=2);-1===r&&this.raise(this.state.pos-2,"Unterminated comment"),this.state.pos=r+2,N.lastIndex=t;for(var n=void 0;(n=N.exec(this.input))&&n.index8&&e<14||e>=5760&&L.test(String.fromCharCode(e))))break e;++this.state.pos}}},e.prototype.finishToken=function(e,t){this.state.end=this.state.pos,this.state.endLoc=this.state.curPosition();var r=this.state.type;this.state.type=e,this.state.value=t,this.updateContext(r)},e.prototype.readToken_dot=function(){var e=this.input.charCodeAt(this.state.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.state.pos+2);return 46===e&&46===t?(this.state.pos+=3,this.finishToken(R.ellipsis)):(++this.state.pos,this.finishToken(R.dot))},e.prototype.readToken_slash=function(){return this.state.exprAllowed?(++this.state.pos,this.readRegexp()):61===this.input.charCodeAt(this.state.pos+1)?this.finishOp(R.assign,2):this.finishOp(R.slash,1)},e.prototype.readToken_mult_modulo=function(e){var t=42===e?R.star:R.modulo,r=1,n=this.input.charCodeAt(this.state.pos+1);return 42===n&&(r++,n=this.input.charCodeAt(this.state.pos+2),t=R.exponent),61===n&&(r++,t=R.assign),this.finishOp(t,r)},e.prototype.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.state.pos+1);return t===e?this.finishOp(124===e?R.logicalOR:R.logicalAND,2):61===t?this.finishOp(R.assign,2):124===e&&125===t&&this.hasPlugin("flow")?this.finishOp(R.braceBarR,2):this.finishOp(124===e?R.bitwiseOR:R.bitwiseAND,1)},e.prototype.readToken_caret=function(){return 61===this.input.charCodeAt(this.state.pos+1)?this.finishOp(R.assign,2):this.finishOp(R.bitwiseXOR,1)},e.prototype.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.state.pos+1);return t===e?45===t&&62===this.input.charCodeAt(this.state.pos+2)&&M.test(this.input.slice(this.state.lastTokEnd,this.state.pos))?(this.skipLineComment(3),this.skipSpace(),this.nextToken()):this.finishOp(R.incDec,2):61===t?this.finishOp(R.assign,2):this.finishOp(R.plusMin,1)},e.prototype.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.state.pos+1),r=1;return t===e?(r=62===e&&62===this.input.charCodeAt(this.state.pos+2)?3:2,61===this.input.charCodeAt(this.state.pos+r)?this.finishOp(R.assign,r+1):this.finishOp(R.bitShift,r)):33===t&&60===e&&45===this.input.charCodeAt(this.state.pos+2)&&45===this.input.charCodeAt(this.state.pos+3)?(this.inModule&&this.unexpected(),this.skipLineComment(4),this.skipSpace(),this.nextToken()):(61===t&&(r=2),this.finishOp(R.relational,r))},e.prototype.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.state.pos+1);return 61===t?this.finishOp(R.equality,61===this.input.charCodeAt(this.state.pos+2)?3:2):61===e&&62===t?(this.state.pos+=2,this.finishToken(R.arrow)):this.finishOp(61===e?R.eq:R.prefix,1)},e.prototype.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.state.pos,this.finishToken(R.parenL);case 41:return++this.state.pos,this.finishToken(R.parenR);case 59:return++this.state.pos,this.finishToken(R.semi);case 44:return++this.state.pos,this.finishToken(R.comma);case 91:return++this.state.pos,this.finishToken(R.bracketL);case 93:return++this.state.pos,this.finishToken(R.bracketR);case 123:return this.hasPlugin("flow")&&124===this.input.charCodeAt(this.state.pos+1)?this.finishOp(R.braceBarL,2):(++this.state.pos,this.finishToken(R.braceL));case 125:return++this.state.pos,this.finishToken(R.braceR);case 58:return this.hasPlugin("functionBind")&&58===this.input.charCodeAt(this.state.pos+1)?this.finishOp(R.doubleColon,2):(++this.state.pos,this.finishToken(R.colon));case 63:return++this.state.pos,this.finishToken(R.question);case 64:return++this.state.pos,this.finishToken(R.at);case 96:return++this.state.pos,this.finishToken(R.backQuote);case 48:var t=this.input.charCodeAt(this.state.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2);case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 126:return this.finishOp(R.prefix,1)}this.raise(this.state.pos,"Unexpected character '"+l(e)+"'")},e.prototype.finishOp=function(e,t){var r=this.input.slice(this.state.pos,this.state.pos+t);return this.state.pos+=t,this.finishToken(e,r)},e.prototype.readRegexp=function(){for(var e=this.state.pos,t=void 0,r=void 0;;){this.state.pos>=this.input.length&&this.raise(e,"Unterminated regular expression");var n=this.input.charAt(this.state.pos);if(M.test(n)&&this.raise(e,"Unterminated regular expression"),t)t=!1;else{if("["===n)r=!0;else if("]"===n&&r)r=!1;else if("/"===n&&!r)break;t="\\"===n}++this.state.pos}var i=this.input.slice(e,this.state.pos);++this.state.pos;var s=this.readWord1();if(s){/^[gmsiyu]*$/.test(s)||this.raise(e,"Invalid regular expression flag")}return this.finishToken(R.regexp,{pattern:i,flags:s})},e.prototype.readInt=function(e,t){for(var r=this.state.pos,n=0,i=0,s=null==t?1/0:t;i=97?a-97+10:a>=65?a-65+10:a>=48&&a<=57?a-48:1/0)>=e)break;++this.state.pos,n=n*e+o}return this.state.pos===r||null!=t&&this.state.pos-r!==t?null:n},e.prototype.readRadixNumber=function(e){this.state.pos+=2;var t=this.readInt(e);return null==t&&this.raise(this.state.start+2,"Expected number in radix "+e),i(this.fullCharCodeAtPos())&&this.raise(this.state.pos,"Identifier directly after number"),this.finishToken(R.num,t)},e.prototype.readNumber=function(e){var t=this.state.pos,r=48===this.input.charCodeAt(t),n=!1;e||null!==this.readInt(10)||this.raise(t,"Invalid number"),r&&this.state.pos==t+1&&(r=!1);var s=this.input.charCodeAt(this.state.pos);46!==s||r||(++this.state.pos,this.readInt(10),n=!0,s=this.input.charCodeAt(this.state.pos)),69!==s&&101!==s||r||(s=this.input.charCodeAt(++this.state.pos),43!==s&&45!==s||++this.state.pos,null===this.readInt(10)&&this.raise(t,"Invalid number"),n=!0),i(this.fullCharCodeAtPos())&&this.raise(this.state.pos,"Identifier directly after number");var a=this.input.slice(t,this.state.pos),o=void 0;return n?o=parseFloat(a):r&&1!==a.length?this.state.strict?this.raise(t,"Invalid number"):o=/[89]/.test(a)?parseInt(a,10):parseInt(a,8):o=parseInt(a,10),this.finishToken(R.num,o)},e.prototype.readCodePoint=function(e){var t=this.input.charCodeAt(this.state.pos),r=void 0;if(123===t){var n=++this.state.pos;if(r=this.readHexChar(this.input.indexOf("}",this.state.pos)-this.state.pos,e),++this.state.pos,null===r)--this.state.invalidTemplateEscapePosition;else if(r>1114111){if(!e)return this.state.invalidTemplateEscapePosition=n-2,null;this.raise(n,"Code point out of bounds")}}else r=this.readHexChar(4,e);return r},e.prototype.readString=function(e){for(var t="",r=++this.state.pos;;){this.state.pos>=this.input.length&&this.raise(this.state.start,"Unterminated string constant");var n=this.input.charCodeAt(this.state.pos);if(n===e)break;92===n?(t+=this.input.slice(r,this.state.pos),t+=this.readEscapedChar(!1),r=this.state.pos):(o(n)&&this.raise(this.state.start,"Unterminated string constant"),++this.state.pos)}return t+=this.input.slice(r,this.state.pos++),this.finishToken(R.string,t)},e.prototype.readTmplToken=function(){for(var e="",t=this.state.pos,r=!1;;){this.state.pos>=this.input.length&&this.raise(this.state.start,"Unterminated template");var n=this.input.charCodeAt(this.state.pos);if(96===n||36===n&&123===this.input.charCodeAt(this.state.pos+1))return this.state.pos===this.state.start&&this.match(R.template)?36===n?(this.state.pos+=2,this.finishToken(R.dollarBraceL)):(++this.state.pos,this.finishToken(R.backQuote)):(e+=this.input.slice(t,this.state.pos),this.finishToken(R.template,r?null:e));if(92===n){e+=this.input.slice(t,this.state.pos);var i=this.readEscapedChar(!0);null===i?r=!0:e+=i,t=this.state.pos}else if(o(n)){switch(e+=this.input.slice(t,this.state.pos),++this.state.pos,n){case 13:10===this.input.charCodeAt(this.state.pos)&&++this.state.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(n)}++this.state.curLine,this.state.lineStart=this.state.pos,t=this.state.pos}else++this.state.pos}},e.prototype.readEscapedChar=function(e){var t=!e,r=this.input.charCodeAt(++this.state.pos);switch(++this.state.pos,r){case 110:return"\n";case 114:return"\r";case 120:var n=this.readHexChar(2,t);return null===n?null:String.fromCharCode(n);case 117:var i=this.readCodePoint(t);return null===i?null:l(i);case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:10===this.input.charCodeAt(this.state.pos)&&++this.state.pos;case 10:return this.state.lineStart=this.state.pos,++this.state.curLine,"";default:if(r>=48&&r<=55){var s=this.state.pos-1,a=this.input.substr(this.state.pos-1,3).match(/^[0-7]+/)[0],o=parseInt(a,8);if(o>255&&(a=a.slice(0,-1),o=parseInt(a,8)),o>0){if(e)return this.state.invalidTemplateEscapePosition=s,null;this.state.strict?this.raise(s,"Octal literal in strict mode"):this.state.containsOctal||(this.state.containsOctal=!0,this.state.octalPosition=s)}return this.state.pos+=a.length-1,String.fromCharCode(o)}return String.fromCharCode(r)}},e.prototype.readHexChar=function(e,t){var r=this.state.pos,n=this.readInt(16,e);return null===n&&(t?this.raise(r,"Bad character escape sequence"):(this.state.pos=r-1,this.state.invalidTemplateEscapePosition=r-1)),n},e.prototype.readWord1=function(){this.state.containsEsc=!1;for(var e="",t=!0,r=this.state.pos;this.state.pos-1)||!!this.plugins[e]},t.prototype.extend=function(e,t){this[e]=t(this[e])},t.prototype.loadAllPlugins=function(){var e=this,t=Object.keys(K).filter(function(e){return"flow"!==e&&"estree"!==e});t.push("flow"),t.forEach(function(t){var r=K[t];r&&r(e)})},t.prototype.loadPlugins=function(e){if(e.indexOf("*")>=0)return this.loadAllPlugins(),{"*":!0};var t={};e.indexOf("flow")>=0&&(e=e.filter(function(e){return"flow"!==e}),e.push("flow")),e.indexOf("estree")>=0&&(e=e.filter(function(e){return"estree"!==e}),e.unshift("estree"));for(var r=e,n=Array.isArray(r),i=0,r=n?r:r[Symbol.iterator]();;){var s;if(n){if(i>=r.length)break;s=r[i++]}else{if(i=r.next(),i.done)break;s=i.value}var a=s;if(!t[a]){t[a]=!0;var o=K[a];o&&o(this)}}return t},t.prototype.parse=function(){var e=this.startNode(),t=this.startNode();return this.nextToken(),this.parseTopLevel(e,t)},t}(q),X=J.prototype;X.addExtra=function(e,t,r){if(e){(e.extra=e.extra||{})[t]=r}},X.isRelational=function(e){return this.match(R.relational)&&this.state.value===e},X.expectRelational=function(e){this.isRelational(e)?this.next():this.unexpected(null,R.relational)},X.isContextual=function(e){return this.match(R.name)&&this.state.value===e},X.eatContextual=function(e){return this.state.value===e&&this.eat(R.name)},X.expectContextual=function(e,t){this.eatContextual(e)||this.unexpected(null,t)},X.canInsertSemicolon=function(){return this.match(R.eof)||this.match(R.braceR)||M.test(this.input.slice(this.state.lastTokEnd,this.state.start))},X.isLineTerminator=function(){return this.eat(R.semi)||this.canInsertSemicolon()},X.semicolon=function(){this.isLineTerminator()||this.unexpected(null,R.semi)},X.expect=function(e,t){return this.eat(e)||this.unexpected(t,e)},X.unexpected=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Unexpected token";t&&"object"===(void 0===t?"undefined":C(t))&&t.label&&(t="Unexpected token, expected "+t.label),this.raise(null!=e?e:this.state.start,t)};var z=J.prototype;z.parseTopLevel=function(e,t){return t.sourceType=this.options.sourceType,this.parseBlockBody(t,!0,!0,R.eof),e.program=this.finishNode(t,"Program"),e.comments=this.state.comments,e.tokens=this.state.tokens,this.finishNode(e,"File")};var $={kind:"loop"},Q={kind:"switch"};z.stmtToDirective=function(e){var t=e.expression,r=this.startNodeAt(t.start,t.loc.start),n=this.startNodeAt(e.start,e.loc.start),i=this.input.slice(t.start,t.end),s=r.value=i.slice(1,-1);return this.addExtra(r,"raw",i),this.addExtra(r,"rawValue",s),n.value=this.finishNodeAt(r,"DirectiveLiteral",t.end,t.loc.end),this.finishNodeAt(n,"Directive",e.end,e.loc.end)},z.parseStatement=function(e,t){this.match(R.at)&&this.parseDecorators(!0);var r=this.state.type,n=this.startNode();switch(r){case R._break:case R._continue:return this.parseBreakContinueStatement(n,r.keyword);case R._debugger:return this.parseDebuggerStatement(n);case R._do:return this.parseDoStatement(n);case R._for:return this.parseForStatement(n);case R._function:return e||this.unexpected(),this.parseFunctionStatement(n);case R._class:return e||this.unexpected(),this.parseClass(n,!0);case R._if:return this.parseIfStatement(n);case R._return:return this.parseReturnStatement(n);case R._switch:return this.parseSwitchStatement(n);case R._throw:return this.parseThrowStatement(n);case R._try:return this.parseTryStatement(n);case R._let:case R._const:e||this.unexpected();case R._var:return this.parseVarStatement(n,r);case R._while:return this.parseWhileStatement(n);case R._with:return this.parseWithStatement(n);case R.braceL:return this.parseBlock();case R.semi:return this.parseEmptyStatement(n);case R._export:case R._import:if(this.hasPlugin("dynamicImport")&&this.lookahead().type===R.parenL)break;return this.options.allowImportExportEverywhere||(t||this.raise(this.state.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.state.start,"'import' and 'export' may appear only with 'sourceType: \"module\"'")),r===R._import?this.parseImport(n):this.parseExport(n);case R.name:if("async"===this.state.value){var i=this.state.clone();if(this.next(),this.match(R._function)&&!this.canInsertSemicolon())return this.expect(R._function),this.parseFunction(n,!0,!1,!0);this.state=i}}var s=this.state.value,a=this.parseExpression();return r===R.name&&"Identifier"===a.type&&this.eat(R.colon)?this.parseLabeledStatement(n,s,a):this.parseExpressionStatement(n,a)},z.takeDecorators=function(e){this.state.decorators.length&&(e.decorators=this.state.decorators,this.state.decorators=[])},z.parseDecorators=function(e){for(;this.match(R.at);){var t=this.parseDecorator();this.state.decorators.push(t)}e&&this.match(R._export)||this.match(R._class)||this.raise(this.state.start,"Leading decorators must be attached to a class declaration")},z.parseDecorator=function(){this.hasPlugin("decorators")||this.unexpected();var e=this.startNode();return this.next(),e.expression=this.parseMaybeAssign(),this.finishNode(e,"Decorator")},z.parseBreakContinueStatement=function(e,t){var r="break"===t;this.next(),this.isLineTerminator()?e.label=null:this.match(R.name)?(e.label=this.parseIdentifier(),this.semicolon()):this.unexpected();var n=void 0;for(n=0;n=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}a.name===t&&this.raise(r.start,"Label '"+t+"' is already declared")}for(var o=this.state.type.isLoop?"loop":this.match(R._switch)?"switch":null,u=this.state.labels.length-1;u>=0;u--){var l=this.state.labels[u];if(l.statementStart!==e.start)break;l.statementStart=this.state.start,l.kind=o}return this.state.labels.push({name:t,kind:o,statementStart:this.state.start}),e.body=this.parseStatement(!0),this.state.labels.pop(),e.label=r,this.finishNode(e,"LabeledStatement")},z.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},z.parseBlock=function(e){var t=this.startNode();return this.expect(R.braceL),this.parseBlockBody(t,e,!1,R.braceR),this.finishNode(t,"BlockStatement")},z.isValidDirective=function(e){return"ExpressionStatement"===e.type&&"StringLiteral"===e.expression.type&&!e.expression.extra.parenthesized},z.parseBlockBody=function(e,t,r,n){e.body=[],e.directives=[];for(var i=!1,s=void 0,a=void 0;!this.eat(n);){i||!this.state.containsOctal||a||(a=this.state.octalPosition);var o=this.parseStatement(!0,r);if(t&&!i&&this.isValidDirective(o)){var u=this.stmtToDirective(o);e.directives.push(u),void 0===s&&"use strict"===u.value.value&&(s=this.state.strict,this.setStrict(!0),a&&this.raise(a,"Octal literal in strict mode"))}else i=!0,e.body.push(o)}!1===s&&this.setStrict(!1)},z.parseFor=function(e,t){return e.init=t,this.expect(R.semi),e.test=this.match(R.semi)?null:this.parseExpression(),this.expect(R.semi),e.update=this.match(R.parenR)?null:this.parseExpression(),this.expect(R.parenR),e.body=this.parseStatement(!1),this.state.labels.pop(),this.finishNode(e,"ForStatement")},z.parseForIn=function(e,t,r){var n=void 0;return r?(this.eatContextual("of"),n="ForAwaitStatement"):(n=this.match(R._in)?"ForInStatement":"ForOfStatement",this.next()),e.left=t,e.right=this.parseExpression(),this.expect(R.parenR),e.body=this.parseStatement(!1),this.state.labels.pop(),this.finishNode(e,n)},z.parseVar=function(e,t,r){for(e.declarations=[],e.kind=r.keyword;;){var n=this.startNode();if(this.parseVarHead(n),this.eat(R.eq)?n.init=this.parseMaybeAssign(t):r!==R._const||this.match(R._in)||this.isContextual("of")?"Identifier"===n.id.type||t&&(this.match(R._in)||this.isContextual("of"))?n.init=null:this.raise(this.state.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(n,"VariableDeclarator")),!this.eat(R.comma))break}return e},z.parseVarHead=function(e){e.id=this.parseBindingAtom(),this.checkLVal(e.id,!0,void 0,"variable declaration")},z.parseFunction=function(e,t,r,n,i){var s=this.state.inMethod;return this.state.inMethod=!1,this.initFunction(e,n),this.match(R.star)&&(e.async&&!this.hasPlugin("asyncGenerators")?this.unexpected():(e.generator=!0,this.next())),!t||i||this.match(R.name)||this.match(R._yield)||this.unexpected(),(this.match(R.name)||this.match(R._yield))&&(e.id=this.parseBindingIdentifier()),this.parseFunctionParams(e),this.parseFunctionBody(e,r),this.state.inMethod=s,this.finishNode(e,t?"FunctionDeclaration":"FunctionExpression")},z.parseFunctionParams=function(e){this.expect(R.parenL),e.params=this.parseBindingList(R.parenR)},z.parseClass=function(e,t,r){return this.next(),this.takeDecorators(e),this.parseClassId(e,t,r),this.parseClassSuper(e),this.parseClassBody(e),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},z.isClassProperty=function(){return this.match(R.eq)||this.match(R.semi)||this.match(R.braceR)},z.isClassMethod=function(){return this.match(R.parenL)},z.isNonstaticConstructor=function(e){return!(e.computed||e.static||"constructor"!==e.key.name&&"constructor"!==e.key.value)},z.parseClassBody=function(e){var t=this.state.strict;this.state.strict=!0;var r=!1,n=!1,i=[],s=this.startNode();for(s.body=[],this.expect(R.braceL);!this.eat(R.braceR);)if(this.eat(R.semi))i.length>0&&this.raise(this.state.lastTokEnd,"Decorators must not be followed by a semicolon");else if(this.match(R.at))i.push(this.parseDecorator());else{var a=this.startNode();if(i.length&&(a.decorators=i,i=[]),a.static=!1,this.match(R.name)&&"static"===this.state.value){var o=this.parseIdentifier(!0);if(this.isClassMethod()){a.kind="method",a.computed=!1,a.key=o,this.parseClassMethod(s,a,!1,!1);continue}if(this.isClassProperty()){a.computed=!1,a.key=o,s.body.push(this.parseClassProperty(a));continue}a.static=!0}if(this.eat(R.star))a.kind="method",this.parsePropertyName(a),this.isNonstaticConstructor(a)&&this.raise(a.key.start,"Constructor can't be a generator"),a.computed||!a.static||"prototype"!==a.key.name&&"prototype"!==a.key.value||this.raise(a.key.start,"Classes may not have static property named prototype"),this.parseClassMethod(s,a,!0,!1);else{var u=this.match(R.name),l=this.parsePropertyName(a);if(a.computed||!a.static||"prototype"!==a.key.name&&"prototype"!==a.key.value||this.raise(a.key.start,"Classes may not have static property named prototype"),this.isClassMethod())this.isNonstaticConstructor(a)?(n?this.raise(l.start,"Duplicate constructor in the same class"):a.decorators&&this.raise(a.start,"You can't attach decorators to a class constructor"),n=!0,a.kind="constructor"):a.kind="method",this.parseClassMethod(s,a,!1,!1);else if(this.isClassProperty())this.isNonstaticConstructor(a)&&this.raise(a.key.start,"Classes may not have a non-static field named 'constructor'"),s.body.push(this.parseClassProperty(a));else if(u&&"async"===l.name&&!this.isLineTerminator()){var c=this.hasPlugin("asyncGenerators")&&this.eat(R.star);a.kind="method",this.parsePropertyName(a),this.isNonstaticConstructor(a)&&this.raise(a.key.start,"Constructor can't be an async function"),this.parseClassMethod(s,a,c,!0)}else!u||"get"!==l.name&&"set"!==l.name||this.isLineTerminator()&&this.match(R.star)?this.hasPlugin("classConstructorCall")&&u&&"call"===l.name&&this.match(R.name)&&"constructor"===this.state.value?(r?this.raise(a.start,"Duplicate constructor call in the same class"):a.decorators&&this.raise(a.start,"You can't attach decorators to a class constructor"),r=!0,a.kind="constructorCall",this.parsePropertyName(a),this.parseClassMethod(s,a,!1,!1)):this.isLineTerminator()?(this.isNonstaticConstructor(a)&&this.raise(a.key.start,"Classes may not have a non-static field named 'constructor'"),s.body.push(this.parseClassProperty(a))):this.unexpected():(a.kind=l.name,this.parsePropertyName(a),this.isNonstaticConstructor(a)&&this.raise(a.key.start,"Constructor can't have get/set modifier"),this.parseClassMethod(s,a,!1,!1),this.checkGetterSetterParamCount(a))}}i.length&&this.raise(this.state.start,"You have trailing decorators with no method"),e.body=this.finishNode(s,"ClassBody"),this.state.strict=t},z.parseClassProperty=function(e){return this.state.inClassProperty=!0,this.match(R.eq)?(this.hasPlugin("classProperties")||this.unexpected(),this.next(),e.value=this.parseMaybeAssign()):e.value=null,this.semicolon(),this.state.inClassProperty=!1,this.finishNode(e,"ClassProperty")},z.parseClassMethod=function(e,t,r,n){this.parseMethod(t,r,n),e.body.push(this.finishNode(t,"ClassMethod"))},z.parseClassId=function(e,t,r){this.match(R.name)?e.id=this.parseIdentifier():r||!t?e.id=null:this.unexpected()},z.parseClassSuper=function(e){e.superClass=this.eat(R._extends)?this.parseExprSubscripts():null},z.parseExport=function(e){if(this.next(),this.match(R.star)){var t=this.startNode();if(this.next(),!this.hasPlugin("exportExtensions")||!this.eatContextual("as"))return this.parseExportFrom(e,!0),this.finishNode(e,"ExportAllDeclaration");t.exported=this.parseIdentifier(),e.specifiers=[this.finishNode(t,"ExportNamespaceSpecifier")],this.parseExportSpecifiersMaybe(e),this.parseExportFrom(e,!0)}else if(this.hasPlugin("exportExtensions")&&this.isExportDefaultSpecifier()){var r=this.startNode();if(r.exported=this.parseIdentifier(!0),e.specifiers=[this.finishNode(r,"ExportDefaultSpecifier")],this.match(R.comma)&&this.lookahead().type===R.star){this.expect(R.comma);var n=this.startNode();this.expect(R.star),this.expectContextual("as"),n.exported=this.parseIdentifier(),e.specifiers.push(this.finishNode(n,"ExportNamespaceSpecifier"))}else this.parseExportSpecifiersMaybe(e);this.parseExportFrom(e,!0)}else{if(this.eat(R._default)){var i=this.startNode(),s=!1;return this.eat(R._function)?i=this.parseFunction(i,!0,!1,!1,!0):this.match(R._class)?i=this.parseClass(i,!0,!0):(s=!0,i=this.parseMaybeAssign()),e.declaration=i,s&&this.semicolon(),this.checkExport(e,!0,!0),this.finishNode(e,"ExportDefaultDeclaration")}this.shouldParseExportDeclaration()?(e.specifiers=[],e.source=null,e.declaration=this.parseExportDeclaration(e)):(e.declaration=null,e.specifiers=this.parseExportSpecifiers(),this.parseExportFrom(e))}return this.checkExport(e,!0),this.finishNode(e,"ExportNamedDeclaration")},z.parseExportDeclaration=function(){return this.parseStatement(!0)},z.isExportDefaultSpecifier=function(){if(this.match(R.name))return"async"!==this.state.value;if(!this.match(R._default))return!1;var e=this.lookahead();return e.type===R.comma||e.type===R.name&&"from"===e.value},z.parseExportSpecifiersMaybe=function(e){this.eat(R.comma)&&(e.specifiers=e.specifiers.concat(this.parseExportSpecifiers()))},z.parseExportFrom=function(e,t){this.eatContextual("from")?(e.source=this.match(R.string)?this.parseExprAtom():this.unexpected(),this.checkExport(e)):t?this.unexpected():e.source=null,this.semicolon()},z.shouldParseExportDeclaration=function(){return"var"===this.state.type.keyword||"const"===this.state.type.keyword||"let"===this.state.type.keyword||"function"===this.state.type.keyword||"class"===this.state.type.keyword||this.isContextual("async")},z.checkExport=function(e,t,r){if(t)if(r)this.checkDuplicateExports(e,"default");else if(e.specifiers&&e.specifiers.length)for(var n=e.specifiers,i=Array.isArray(n),s=0,n=i?n:n[Symbol.iterator]();;){var a;if(i){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var o=a;this.checkDuplicateExports(o,o.exported.name)}else if(e.declaration)if("FunctionDeclaration"===e.declaration.type||"ClassDeclaration"===e.declaration.type)this.checkDuplicateExports(e,e.declaration.id.name);else if("VariableDeclaration"===e.declaration.type)for(var u=e.declaration.declarations,l=Array.isArray(u),c=0,u=l?u:u[Symbol.iterator]();;){var f;if(l){if(c>=u.length)break;f=u[c++]}else{if(c=u.next(),c.done)break;f=c.value}var p=f;this.checkDeclaration(p.id)}if(this.state.decorators.length){var d=e.declaration&&("ClassDeclaration"===e.declaration.type||"ClassExpression"===e.declaration.type);e.declaration&&d||this.raise(e.start,"You can only use decorators on an export when exporting a class"),this.takeDecorators(e.declaration)}},z.checkDeclaration=function(e){if("ObjectPattern"===e.type)for(var t=e.properties,r=Array.isArray(t),n=0,t=r?t:t[Symbol.iterator]();;){var i;if(r){if(n>=t.length)break;i=t[n++]}else{if(n=t.next(),n.done)break;i=n.value}var s=i;this.checkDeclaration(s)}else if("ArrayPattern"===e.type)for(var a=e.elements,o=Array.isArray(a),u=0,a=o?a:a[Symbol.iterator]();;){var l;if(o){if(u>=a.length)break;l=a[u++]}else{if(u=a.next(),u.done)break;l=u.value}var c=l;c&&this.checkDeclaration(c)}else"ObjectProperty"===e.type?this.checkDeclaration(e.value):"RestElement"===e.type||"RestProperty"===e.type?this.checkDeclaration(e.argument):"Identifier"===e.type&&this.checkDuplicateExports(e,e.name)},z.checkDuplicateExports=function(e,t){this.state.exportedIdentifiers.indexOf(t)>-1&&this.raiseDuplicateExportError(e,t),this.state.exportedIdentifiers.push(t)},z.raiseDuplicateExportError=function(e,t){this.raise(e.start,"default"===t?"Only one default export allowed per module.":"`"+t+"` has already been exported. Exported identifiers must be unique.")},z.parseExportSpecifiers=function(){var e=[],t=!0,r=void 0;for(this.expect(R.braceL);!this.eat(R.braceR);){if(t)t=!1;else if(this.expect(R.comma),this.eat(R.braceR))break;var n=this.match(R._default);n&&!r&&(r=!0);var i=this.startNode();i.local=this.parseIdentifier(n),i.exported=this.eatContextual("as")?this.parseIdentifier(!0):i.local.__clone(),e.push(this.finishNode(i,"ExportSpecifier"))}return r&&!this.isContextual("from")&&this.unexpected(),e},z.parseImport=function(e){return this.eat(R._import),this.match(R.string)?(e.specifiers=[],e.source=this.parseExprAtom()):(e.specifiers=[],this.parseImportSpecifiers(e),this.expectContextual("from"),e.source=this.match(R.string)?this.parseExprAtom():this.unexpected()),this.semicolon(),this.finishNode(e,"ImportDeclaration")},z.parseImportSpecifiers=function(e){var t=!0;if(this.match(R.name)){var r=this.state.start,n=this.state.startLoc;if(e.specifiers.push(this.parseImportSpecifierDefault(this.parseIdentifier(),r,n)),!this.eat(R.comma))return}if(this.match(R.star)){var i=this.startNode();return this.next(),this.expectContextual("as"),i.local=this.parseIdentifier(),this.checkLVal(i.local,!0,void 0,"import namespace specifier"),void e.specifiers.push(this.finishNode(i,"ImportNamespaceSpecifier"))}for(this.expect(R.braceL);!this.eat(R.braceR);){if(t)t=!1;else if(this.eat(R.colon)&&this.unexpected(null,"ES2015 named imports do not destructure. Use another statement for destructuring after the import."),this.expect(R.comma),this.eat(R.braceR))break;this.parseImportSpecifier(e)}},z.parseImportSpecifier=function(e){var t=this.startNode();t.imported=this.parseIdentifier(!0),this.eatContextual("as")?t.local=this.parseIdentifier():(this.checkReservedWord(t.imported.name,t.start,!0,!0),t.local=t.imported.__clone()),this.checkLVal(t.local,!0,void 0,"import specifier"),e.specifiers.push(this.finishNode(t,"ImportSpecifier"))},z.parseImportSpecifierDefault=function(e,t,r){var n=this.startNodeAt(t,r);return n.local=e,this.checkLVal(n.local,!0,void 0,"default import specifier"),this.finishNode(n,"ImportDefaultSpecifier")};var ee=J.prototype;ee.toAssignable=function(e,t,r){if(e)switch(e.type){case"Identifier":case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":break;case"ObjectExpression":e.type="ObjectPattern";for(var n=e.properties,i=Array.isArray(n),s=0,n=i?n:n[Symbol.iterator]();;){var a;if(i){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var o=a;"ObjectMethod"===o.type?"get"===o.kind||"set"===o.kind?this.raise(o.key.start,"Object pattern can't contain getter or setter"):this.raise(o.key.start,"Object pattern can't contain methods"):this.toAssignable(o,t,"object destructuring pattern")}break;case"ObjectProperty":this.toAssignable(e.value,t,r);break;case"SpreadProperty":e.type="RestProperty";var u=e.argument;this.toAssignable(u,t,r);break;case"ArrayExpression":e.type="ArrayPattern",this.toAssignableList(e.elements,t,r);break;case"AssignmentExpression":"="===e.operator?(e.type="AssignmentPattern",delete e.operator):this.raise(e.left.end,"Only '=' operator can be used for specifying default value.");break;case"MemberExpression":if(!t)break;default:var l="Invalid left-hand side"+(r?" in "+r:"expression");this.raise(e.start,l)}return e},ee.toAssignableList=function(e,t,r){var n=e.length;if(n){var i=e[n-1];if(i&&"RestElement"===i.type)--n;else if(i&&"SpreadElement"===i.type){i.type="RestElement";var s=i.argument;this.toAssignable(s,t,r),"Identifier"!==s.type&&"MemberExpression"!==s.type&&"ArrayPattern"!==s.type&&this.unexpected(s.start),--n}}for(var a=0;a=s.length)break;u=s[o++]}else{if(o=s.next(),o.done)break;u=o.value}var l=u;"ObjectProperty"===l.type&&(l=l.value),this.checkLVal(l,t,r,"object destructuring pattern")}break;case"ArrayPattern":for(var c=e.elements,f=Array.isArray(c),p=0,c=f?c:c[Symbol.iterator]();;){var d;if(f){if(p>=c.length)break;d=c[p++]}else{if(p=c.next(),p.done)break;d=p.value}var h=d;h&&this.checkLVal(h,t,r,"array destructuring pattern")}break;case"AssignmentPattern":this.checkLVal(e.left,t,r,"assignment pattern");break;case"RestProperty":this.checkLVal(e.argument,t,r,"rest property");break;case"RestElement":this.checkLVal(e.argument,t,r,"rest element");break;default:var m=(t?"Binding invalid":"Invalid")+" left-hand side"+(n?" in "+n:"expression");this.raise(e.start,m)}};var te=J.prototype;te.checkPropClash=function(e,t){if(!e.computed&&!e.kind){var r=e.key;"__proto__"===("Identifier"===r.type?r.name:String(r.value))&&(t.proto&&this.raise(r.start,"Redefinition of __proto__ property"),t.proto=!0)}},te.getExpression=function(){this.nextToken();var e=this.parseExpression();return this.match(R.eof)||this.unexpected(),e},te.parseExpression=function(e,t){var r=this.state.start,n=this.state.startLoc,i=this.parseMaybeAssign(e,t);if(this.match(R.comma)){var s=this.startNodeAt(r,n);for(s.expressions=[i];this.eat(R.comma);)s.expressions.push(this.parseMaybeAssign(e,t));return this.toReferencedList(s.expressions),this.finishNode(s,"SequenceExpression")}return i},te.parseMaybeAssign=function(e,t,r,n){var i=this.state.start,s=this.state.startLoc;if(this.match(R._yield)&&this.state.inGenerator){var a=this.parseYield();return r&&(a=r.call(this,a,i,s)),a}var o=void 0;t?o=!1:(t={start:0},o=!0),(this.match(R.parenL)||this.match(R.name))&&(this.state.potentialArrowAt=this.state.start);var u=this.parseMaybeConditional(e,t,n);if(r&&(u=r.call(this,u,i,s)),this.state.type.isAssign){var l=this.startNodeAt(i,s);if(l.operator=this.state.value,l.left=this.match(R.eq)?this.toAssignable(u,void 0,"assignment expression"):u,t.start=0,this.checkLVal(u,void 0,void 0,"assignment expression"),u.extra&&u.extra.parenthesized){var c=void 0;"ObjectPattern"===u.type?c="`({a}) = 0` use `({a} = 0)`":"ArrayPattern"===u.type&&(c="`([a]) = 0` use `([a] = 0)`"),c&&this.raise(u.start,"You're trying to assign to a parenthesized expression, eg. instead of "+c)}return this.next(),l.right=this.parseMaybeAssign(e),this.finishNode(l,"AssignmentExpression")}return o&&t.start&&this.unexpected(t.start),u},te.parseMaybeConditional=function(e,t,r){var n=this.state.start,i=this.state.startLoc,s=this.parseExprOps(e,t);return t&&t.start?s:this.parseConditional(s,e,n,i,r)},te.parseConditional=function(e,t,r,n){if(this.eat(R.question)){var i=this.startNodeAt(r,n);return i.test=e,i.consequent=this.parseMaybeAssign(),this.expect(R.colon),i.alternate=this.parseMaybeAssign(t),this.finishNode(i,"ConditionalExpression")}return e},te.parseExprOps=function(e,t){var r=this.state.start,n=this.state.startLoc,i=this.parseMaybeUnary(t);return t&&t.start?i:this.parseExprOp(i,r,n,-1,e)},te.parseExprOp=function(e,t,r,n,i){var s=this.state.type.binop;if(!(null==s||i&&this.match(R._in))&&s>n){var a=this.startNodeAt(t,r);a.left=e,a.operator=this.state.value,"**"!==a.operator||"UnaryExpression"!==e.type||!e.extra||e.extra.parenthesizedArgument||e.extra.parenthesized||this.raise(e.argument.start,"Illegal expression. Wrap left hand side or entire exponentiation in parentheses.");var o=this.state.type;this.next();var u=this.state.start,l=this.state.startLoc;return a.right=this.parseExprOp(this.parseMaybeUnary(),u,l,o.rightAssociative?s-1:s,i),this.finishNode(a,o===R.logicalOR||o===R.logicalAND?"LogicalExpression":"BinaryExpression"),this.parseExprOp(a,t,r,n,i)}return e},te.parseMaybeUnary=function(e){if(this.state.type.prefix){var t=this.startNode(),r=this.match(R.incDec);t.operator=this.state.value,t.prefix=!0,this.next();var n=this.state.type;return t.argument=this.parseMaybeUnary(),this.addExtra(t,"parenthesizedArgument",!(n!==R.parenL||t.argument.extra&&t.argument.extra.parenthesized)),e&&e.start&&this.unexpected(e.start),r?this.checkLVal(t.argument,void 0,void 0,"prefix operation"):this.state.strict&&"delete"===t.operator&&"Identifier"===t.argument.type&&this.raise(t.start,"Deleting local variable in strict mode"),this.finishNode(t,r?"UpdateExpression":"UnaryExpression")}var i=this.state.start,s=this.state.startLoc,a=this.parseExprSubscripts(e);if(e&&e.start)return a;for(;this.state.type.postfix&&!this.canInsertSemicolon();){var o=this.startNodeAt(i,s);o.operator=this.state.value,o.prefix=!1,o.argument=a,this.checkLVal(a,void 0,void 0,"postfix operation"),this.next(),a=this.finishNode(o,"UpdateExpression")}return a},te.parseExprSubscripts=function(e){var t=this.state.start,r=this.state.startLoc,n=this.state.potentialArrowAt,i=this.parseExprAtom(e);return"ArrowFunctionExpression"===i.type&&i.start===n?i:e&&e.start?i:this.parseSubscripts(i,t,r)},te.parseSubscripts=function(e,t,r,n){for(;;){if(!n&&this.eat(R.doubleColon)){var i=this.startNodeAt(t,r);return i.object=e,i.callee=this.parseNoCallExpr(),this.parseSubscripts(this.finishNode(i,"BindExpression"),t,r,n)}if(this.eat(R.dot)){var s=this.startNodeAt(t,r);s.object=e,s.property=this.parseIdentifier(!0),s.computed=!1,e=this.finishNode(s,"MemberExpression")}else if(this.eat(R.bracketL)){var a=this.startNodeAt(t,r);a.object=e,a.property=this.parseExpression(),a.computed=!0,this.expect(R.bracketR),e=this.finishNode(a,"MemberExpression")}else if(!n&&this.match(R.parenL)){var o=this.state.potentialArrowAt===e.start&&"Identifier"===e.type&&"async"===e.name&&!this.canInsertSemicolon();this.next();var u=this.startNodeAt(t,r);if(u.callee=e,u.arguments=this.parseCallExpressionArguments(R.parenR,o),"Import"===u.callee.type&&1!==u.arguments.length&&this.raise(u.start,"import() requires exactly one argument"),e=this.finishNode(u,"CallExpression"),o&&this.shouldParseAsyncArrow())return this.parseAsyncArrowFromCallExpression(this.startNodeAt(t,r),u);this.toReferencedList(u.arguments)}else{if(!this.match(R.backQuote))return e;var l=this.startNodeAt(t,r);l.tag=e,l.quasi=this.parseTemplate(!0),e=this.finishNode(l,"TaggedTemplateExpression")}}},te.parseCallExpressionArguments=function(e,t){for(var r=[],n=void 0,i=!0;!this.eat(e);){if(i)i=!1;else if(this.expect(R.comma),this.eat(e))break;this.match(R.parenL)&&!n&&(n=this.state.start),r.push(this.parseExprListItem(!1,t?{start:0}:void 0,t?{start:0}:void 0))}return t&&n&&this.shouldParseAsyncArrow()&&this.unexpected(),r},te.shouldParseAsyncArrow=function(){return this.match(R.arrow)},te.parseAsyncArrowFromCallExpression=function(e,t){return this.expect(R.arrow),this.parseArrowExpression(e,t.arguments,!0)},te.parseNoCallExpr=function(){var e=this.state.start,t=this.state.startLoc;return this.parseSubscripts(this.parseExprAtom(),e,t,!0)},te.parseExprAtom=function(e){var t=this.state.potentialArrowAt===this.state.start,r=void 0;switch(this.state.type){case R._super:return this.state.inMethod||this.state.inClassProperty||this.options.allowSuperOutsideMethod||this.raise(this.state.start,"'super' outside of function or class"),r=this.startNode(),this.next(),this.match(R.parenL)||this.match(R.bracketL)||this.match(R.dot)||this.unexpected(),this.match(R.parenL)&&"constructor"!==this.state.inMethod&&!this.options.allowSuperOutsideMethod&&this.raise(r.start,"super() outside of class constructor"),this.finishNode(r,"Super");case R._import:return this.hasPlugin("dynamicImport")||this.unexpected(),r=this.startNode(),this.next(),this.match(R.parenL)||this.unexpected(null,R.parenL),this.finishNode(r,"Import");case R._this:return r=this.startNode(),this.next(),this.finishNode(r,"ThisExpression");case R._yield:this.state.inGenerator&&this.unexpected();case R.name:r=this.startNode();var n="await"===this.state.value&&this.state.inAsync,i=this.shouldAllowYieldIdentifier(),s=this.parseIdentifier(n||i);if("await"===s.name){if(this.state.inAsync||this.inModule)return this.parseAwait(r)}else{if("async"===s.name&&this.match(R._function)&&!this.canInsertSemicolon())return this.next(),this.parseFunction(r,!1,!1,!0);if(t&&"async"===s.name&&this.match(R.name)){var a=[this.parseIdentifier()];return this.expect(R.arrow),this.parseArrowExpression(r,a,!0)}}return t&&!this.canInsertSemicolon()&&this.eat(R.arrow)?this.parseArrowExpression(r,[s]):s;case R._do:if(this.hasPlugin("doExpressions")){var o=this.startNode();this.next();var u=this.state.inFunction,l=this.state.labels;return this.state.labels=[],this.state.inFunction=!1,o.body=this.parseBlock(!1,!0),this.state.inFunction=u,this.state.labels=l,this.finishNode(o,"DoExpression")}case R.regexp:var c=this.state.value;return r=this.parseLiteral(c.value,"RegExpLiteral"),r.pattern=c.pattern,r.flags=c.flags,r;case R.num:return this.parseLiteral(this.state.value,"NumericLiteral");case R.string:return this.parseLiteral(this.state.value,"StringLiteral");case R._null:return r=this.startNode(),this.next(),this.finishNode(r,"NullLiteral");case R._true:case R._false:return r=this.startNode(),r.value=this.match(R._true),this.next(),this.finishNode(r,"BooleanLiteral");case R.parenL:return this.parseParenAndDistinguishExpression(null,null,t);case R.bracketL:return r=this.startNode(),this.next(),r.elements=this.parseExprList(R.bracketR,!0,e),this.toReferencedList(r.elements),this.finishNode(r,"ArrayExpression");case R.braceL:return this.parseObj(!1,e);case R._function:return this.parseFunctionExpression();case R.at:this.parseDecorators();case R._class:return r=this.startNode(),this.takeDecorators(r),this.parseClass(r,!1);case R._new:return this.parseNew();case R.backQuote:return this.parseTemplate(!1);case R.doubleColon:r=this.startNode(),this.next(),r.object=null;var f=r.callee=this.parseNoCallExpr();if("MemberExpression"===f.type)return this.finishNode(r,"BindExpression");this.raise(f.start,"Binding should be performed on object property.");default:this.unexpected()}},te.parseFunctionExpression=function(){var e=this.startNode(),t=this.parseIdentifier(!0);return this.state.inGenerator&&this.eat(R.dot)&&this.hasPlugin("functionSent")?this.parseMetaProperty(e,t,"sent"):this.parseFunction(e,!1)},te.parseMetaProperty=function(e,t,r){return e.meta=t,e.property=this.parseIdentifier(!0),e.property.name!==r&&this.raise(e.property.start,"The only valid meta property for new is "+t.name+"."+r),this.finishNode(e,"MetaProperty")},te.parseLiteral=function(e,t,r,n){r=r||this.state.start,n=n||this.state.startLoc;var i=this.startNodeAt(r,n);return this.addExtra(i,"rawValue",e),this.addExtra(i,"raw",this.input.slice(r,this.state.end)),i.value=e,this.next(),this.finishNode(i,t)},te.parseParenExpression=function(){this.expect(R.parenL);var e=this.parseExpression();return this.expect(R.parenR),e},te.parseParenAndDistinguishExpression=function(e,t,r){e=e||this.state.start,t=t||this.state.startLoc;var n=void 0;this.expect(R.parenL);for(var i=this.state.start,s=this.state.startLoc,a=[],o={start:0},u={start:0},l=!0,c=void 0,f=void 0;!this.match(R.parenR);){if(l)l=!1;else if(this.expect(R.comma,u.start||null),this.match(R.parenR)){f=this.state.start;break} +if(this.match(R.ellipsis)){var p=this.state.start,d=this.state.startLoc;c=this.state.start,a.push(this.parseParenItem(this.parseRest(),p,d));break}a.push(this.parseMaybeAssign(!1,o,this.parseParenItem,u))}var h=this.state.start,m=this.state.startLoc;this.expect(R.parenR);var y=this.startNodeAt(e,t);if(r&&this.shouldParseArrow()&&(y=this.parseArrow(y))){for(var v=a,g=Array.isArray(v),b=0,v=g?v:v[Symbol.iterator]();;){var E;if(g){if(b>=v.length)break;E=v[b++]}else{if(b=v.next(),b.done)break;E=b.value}var x=E;x.extra&&x.extra.parenthesized&&this.unexpected(x.extra.parenStart)}return this.parseArrowExpression(y,a)}return a.length||this.unexpected(this.state.lastTokStart),f&&this.unexpected(f),c&&this.unexpected(c),o.start&&this.unexpected(o.start),u.start&&this.unexpected(u.start),a.length>1?(n=this.startNodeAt(i,s),n.expressions=a,this.toReferencedList(n.expressions),this.finishNodeAt(n,"SequenceExpression",h,m)):n=a[0],this.addExtra(n,"parenthesized",!0),this.addExtra(n,"parenStart",e),n},te.shouldParseArrow=function(){return!this.canInsertSemicolon()},te.parseArrow=function(e){if(this.eat(R.arrow))return e},te.parseParenItem=function(e){return e},te.parseNew=function(){var e=this.startNode(),t=this.parseIdentifier(!0);if(this.eat(R.dot)){var r=this.parseMetaProperty(e,t,"target");return this.state.inFunction||this.raise(r.property.start,"new.target can only be used in functions"),r}return e.callee=this.parseNoCallExpr(),this.eat(R.parenL)?(e.arguments=this.parseExprList(R.parenR),this.toReferencedList(e.arguments)):e.arguments=[],this.finishNode(e,"NewExpression")},te.parseTemplateElement=function(e){var t=this.startNode();return null===this.state.value&&(e&&this.hasPlugin("templateInvalidEscapes")?this.state.invalidTemplateEscapePosition=null:this.raise(this.state.invalidTemplateEscapePosition,"Invalid escape sequence in template")),t.value={raw:this.input.slice(this.state.start,this.state.end).replace(/\r\n?/g,"\n"),cooked:this.state.value},this.next(),t.tail=this.match(R.backQuote),this.finishNode(t,"TemplateElement")},te.parseTemplate=function(e){var t=this.startNode();this.next(),t.expressions=[];var r=this.parseTemplateElement(e);for(t.quasis=[r];!r.tail;)this.expect(R.dollarBraceL),t.expressions.push(this.parseExpression()),this.expect(R.braceR),t.quasis.push(r=this.parseTemplateElement(e));return this.next(),this.finishNode(t,"TemplateLiteral")},te.parseObj=function(e,t){var r=[],n=Object.create(null),i=!0,s=this.startNode();s.properties=[],this.next();for(var a=null;!this.eat(R.braceR);){if(i)i=!1;else if(this.expect(R.comma),this.eat(R.braceR))break;for(;this.match(R.at);)r.push(this.parseDecorator());var o=this.startNode(),u=!1,l=!1,c=void 0,f=void 0;if(r.length&&(o.decorators=r,r=[]),this.hasPlugin("objectRestSpread")&&this.match(R.ellipsis)){if(o=this.parseSpread(e?{start:0}:void 0),o.type=e?"RestProperty":"SpreadProperty",e&&this.toAssignable(o.argument,!0,"object pattern"),s.properties.push(o),!e)continue;var p=this.state.start;if(null===a){if(this.eat(R.braceR))break;if(this.match(R.comma)&&this.lookahead().type===R.braceR)continue;a=p;continue}this.unexpected(a,"Cannot have multiple rest elements when destructuring")}if(o.method=!1,o.shorthand=!1,(e||t)&&(c=this.state.start,f=this.state.startLoc),e||(u=this.eat(R.star)),!e&&this.isContextual("async")){u&&this.unexpected();var d=this.parseIdentifier();this.match(R.colon)||this.match(R.parenL)||this.match(R.braceR)||this.match(R.eq)||this.match(R.comma)?(o.key=d,o.computed=!1):(l=!0,this.hasPlugin("asyncGenerators")&&(u=this.eat(R.star)),this.parsePropertyName(o))}else this.parsePropertyName(o);this.parseObjPropValue(o,c,f,u,l,e,t),this.checkPropClash(o,n),o.shorthand&&this.addExtra(o,"shorthand",!0),s.properties.push(o)}return null!==a&&this.unexpected(a,"The rest element has to be the last element when destructuring"),r.length&&this.raise(this.state.start,"You have trailing decorators with no property"),this.finishNode(s,e?"ObjectPattern":"ObjectExpression")},te.isGetterOrSetterMethod=function(e,t){return!t&&!e.computed&&"Identifier"===e.key.type&&("get"===e.key.name||"set"===e.key.name)&&(this.match(R.string)||this.match(R.num)||this.match(R.bracketL)||this.match(R.name)||this.state.type.keyword)},te.checkGetterSetterParamCount=function(e){var t="get"===e.kind?0:1;if(e.params.length!==t){var r=e.start;"get"===e.kind?this.raise(r,"getter should have no params"):this.raise(r,"setter should have exactly one param")}},te.parseObjectMethod=function(e,t,r,n){return r||t||this.match(R.parenL)?(n&&this.unexpected(),e.kind="method",e.method=!0,this.parseMethod(e,t,r),this.finishNode(e,"ObjectMethod")):this.isGetterOrSetterMethod(e,n)?((t||r)&&this.unexpected(),e.kind=e.key.name,this.parsePropertyName(e),this.parseMethod(e),this.checkGetterSetterParamCount(e),this.finishNode(e,"ObjectMethod")):void 0},te.parseObjectProperty=function(e,t,r,n,i){return this.eat(R.colon)?(e.value=n?this.parseMaybeDefault(this.state.start,this.state.startLoc):this.parseMaybeAssign(!1,i),this.finishNode(e,"ObjectProperty")):e.computed||"Identifier"!==e.key.type?void 0:(this.checkReservedWord(e.key.name,e.key.start,!0,!0),n?e.value=this.parseMaybeDefault(t,r,e.key.__clone()):this.match(R.eq)&&i?(i.start||(i.start=this.state.start),e.value=this.parseMaybeDefault(t,r,e.key.__clone())):e.value=e.key.__clone(),e.shorthand=!0,this.finishNode(e,"ObjectProperty"))},te.parseObjPropValue=function(e,t,r,n,i,s,a){var o=this.parseObjectMethod(e,n,i,s)||this.parseObjectProperty(e,t,r,s,a);return o||this.unexpected(),o},te.parsePropertyName=function(e){if(this.eat(R.bracketL))e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(R.bracketR);else{e.computed=!1;var t=this.state.inPropertyName;this.state.inPropertyName=!0,e.key=this.match(R.num)||this.match(R.string)?this.parseExprAtom():this.parseIdentifier(!0),this.state.inPropertyName=t}return e.key},te.initFunction=function(e,t){e.id=null,e.generator=!1,e.expression=!1,e.async=!!t},te.parseMethod=function(e,t,r){var n=this.state.inMethod;return this.state.inMethod=e.kind||!0,this.initFunction(e,r),this.expect(R.parenL),e.params=this.parseBindingList(R.parenR),e.generator=!!t,this.parseFunctionBody(e),this.state.inMethod=n,e},te.parseArrowExpression=function(e,t,r){return this.initFunction(e,r),e.params=this.toAssignableList(t,!0,"arrow function parameters"),this.parseFunctionBody(e,!0),this.finishNode(e,"ArrowFunctionExpression")},te.isStrictBody=function(e,t){if(!t&&e.body.directives.length)for(var r=e.body.directives,n=Array.isArray(r),i=0,r=n?r:r[Symbol.iterator]();;){var s;if(n){if(i>=r.length)break;s=r[i++]}else{if(i=r.next(),i.done)break;s=i.value}var a=s;if("use strict"===a.value.value)return!0}return!1},te.parseFunctionBody=function(e,t){var r=t&&!this.match(R.braceL),n=this.state.inAsync;if(this.state.inAsync=e.async,r)e.body=this.parseMaybeAssign(),e.expression=!0;else{var i=this.state.inFunction,s=this.state.inGenerator,a=this.state.labels;this.state.inFunction=!0,this.state.inGenerator=e.generator,this.state.labels=[],e.body=this.parseBlock(!0),e.expression=!1,this.state.inFunction=i,this.state.inGenerator=s,this.state.labels=a}this.state.inAsync=n;var o=this.isStrictBody(e,r),u=this.state.strict||t||o;if(o&&e.id&&"Identifier"===e.id.type&&"yield"===e.id.name&&this.raise(e.id.start,"Binding yield in strict mode"),u){var l=Object.create(null),c=this.state.strict;o&&(this.state.strict=!0),e.id&&this.checkLVal(e.id,!0,void 0,"function name");for(var f=e.params,p=Array.isArray(f),d=0,f=p?f:f[Symbol.iterator]();;){var h;if(p){if(d>=f.length)break;h=f[d++]}else{if(d=f.next(),d.done)break;h=d.value}var m=h;o&&"Identifier"!==m.type&&this.raise(m.start,"Non-simple parameter in strict mode"),this.checkLVal(m,!0,l,"function parameter list")}this.state.strict=c}},te.parseExprList=function(e,t,r){for(var n=[],i=!0;!this.eat(e);){if(i)i=!1;else if(this.expect(R.comma),this.eat(e))break;n.push(this.parseExprListItem(t,r))}return n},te.parseExprListItem=function(e,t,r){return e&&this.match(R.comma)?null:this.match(R.ellipsis)?this.parseSpread(t):this.parseMaybeAssign(!1,t,this.parseParenItem,r)},te.parseIdentifier=function(e){var t=this.startNode();return e||this.checkReservedWord(this.state.value,this.state.start,!!this.state.type.keyword,!1),this.match(R.name)?t.name=this.state.value:this.state.type.keyword?t.name=this.state.type.keyword:this.unexpected(),!e&&"await"===t.name&&this.state.inAsync&&this.raise(t.start,"invalid use of await inside of an async function"),t.loc.identifierName=t.name,this.next(),this.finishNode(t,"Identifier")},te.checkReservedWord=function(e,t,r,n){(this.isReservedWord(e)||r&&this.isKeyword(e))&&this.raise(t,e+" is a reserved word"),this.state.strict&&(v.strict(e)||n&&v.strictBind(e))&&this.raise(t,e+" is a reserved word in strict mode")},te.parseAwait=function(e){return this.state.inAsync||this.unexpected(),this.match(R.star)&&this.raise(e.start,"await* has been removed from the async functions proposal. Use Promise.all() instead."),e.argument=this.parseMaybeUnary(),this.finishNode(e,"AwaitExpression")},te.parseYield=function(){var e=this.startNode();return this.next(),this.match(R.semi)||this.canInsertSemicolon()||!this.match(R.star)&&!this.state.type.startsExpr?(e.delegate=!1,e.argument=null):(e.delegate=this.eat(R.star),e.argument=this.parseMaybeAssign()),this.finishNode(e,"YieldExpression")};var re=J.prototype,ne=["leadingComments","trailingComments","innerComments"],ie=function(){function e(t,r,n){w(this,e),this.type="",this.start=t,this.end=0,this.loc=new G(r),n&&(this.loc.filename=n)}return e.prototype.__clone=function(){var t=new e;for(var r in this)ne.indexOf(r)<0&&(t[r]=this[r]);return t},e}();re.startNode=function(){return new ie(this.state.start,this.state.startLoc,this.filename)},re.startNodeAt=function(e,t){return new ie(e,t,this.filename)},re.finishNode=function(e,t){return c.call(this,e,t,this.state.lastTokEnd,this.state.lastTokEndLoc)},re.finishNodeAt=function(e,t,r,n){return c.call(this,e,t,r,n)},J.prototype.raise=function(e,t){var r=u(this.input,e);t+=" ("+r.line+":"+r.column+")";var n=new SyntaxError(t);throw n.pos=e,n.loc=r,n};var se=J.prototype;se.addComment=function(e){this.filename&&(e.loc.filename=this.filename),this.state.trailingComments.push(e),this.state.leadingComments.push(e)},se.processComment=function(e){if(!("Program"===e.type&&e.body.length>0)){var t=this.state.commentStack,r=void 0,n=void 0,i=void 0,s=void 0,a=void 0;if(this.state.trailingComments.length>0)this.state.trailingComments[0].start>=e.end?(i=this.state.trailingComments,this.state.trailingComments=[]):this.state.trailingComments.length=0;else{var o=f(t);t.length>0&&o.trailingComments&&o.trailingComments[0].start>=e.end&&(i=o.trailingComments,o.trailingComments=null)}for(t.length>0&&f(t).start>=e.start&&(r=t.pop());t.length>0&&f(t).start>=e.start;)n=t.pop();if(!n&&r&&(n=r),r&&this.state.leadingComments.length>0){var u=f(this.state.leadingComments);if("ObjectProperty"===r.type){if(u.start>=e.start&&this.state.commentPreviousNode){for(a=0;a0&&(r.trailingComments=this.state.leadingComments,this.state.leadingComments=[])}}else if("CallExpression"===e.type&&e.arguments&&e.arguments.length){var l=f(e.arguments);l&&u.start>=l.start&&u.end<=e.end&&this.state.commentPreviousNode&&this.state.leadingComments.length>0&&(l.trailingComments=this.state.leadingComments,this.state.leadingComments=[])}}if(n){if(n.leadingComments)if(n!==e&&f(n.leadingComments).end<=e.start)e.leadingComments=n.leadingComments,n.leadingComments=null;else for(s=n.leadingComments.length-2;s>=0;--s)if(n.leadingComments[s].end<=e.start){e.leadingComments=n.leadingComments.splice(0,s+1);break}}else if(this.state.leadingComments.length>0)if(f(this.state.leadingComments).end<=e.start){if(this.state.commentPreviousNode)for(a=0;a0&&(e.leadingComments=this.state.leadingComments,this.state.leadingComments=[])}else{for(s=0;se.start);s++);e.leadingComments=this.state.leadingComments.slice(0,s),0===e.leadingComments.length&&(e.leadingComments=null),i=this.state.leadingComments.slice(s),0===i.length&&(i=null)}this.state.commentPreviousNode=e,i&&(i.length&&i[0].start>=e.start&&f(i).end<=e.end?e.innerComments=i:e.trailingComments=i),t.push(e)}};var ae=J.prototype;ae.estreeParseRegExpLiteral=function(e){var t=e.pattern,r=e.flags,n=null;try{n=new RegExp(t,r)}catch(e){}var i=this.estreeParseLiteral(n);return i.regex={pattern:t,flags:r},i},ae.estreeParseLiteral=function(e){return this.parseLiteral(e,"Literal")},ae.directiveToStmt=function(e){var t=e.value,r=this.startNodeAt(e.start,e.loc.start),n=this.startNodeAt(t.start,t.loc.start);return n.value=t.value,n.raw=t.extra.raw,r.expression=this.finishNodeAt(n,"Literal",t.end,t.loc.end),r.directive=t.extra.raw.slice(1,-1),this.finishNodeAt(r,"ExpressionStatement",e.end,e.loc.end)};var oe=function(e){e.extend("checkDeclaration",function(e){return function(t){p(t)?this.checkDeclaration(t.value):e.call(this,t)}}),e.extend("checkGetterSetterParamCount",function(){return function(e){var t="get"===e.kind?0:1;if(e.value.params.length!==t){var r=e.start;"get"===e.kind?this.raise(r,"getter should have no params"):this.raise(r,"setter should have exactly one param")}}}),e.extend("checkLVal",function(e){return function(t,r,n){var i=this;switch(t.type){case"ObjectPattern":t.properties.forEach(function(e){i.checkLVal("Property"===e.type?e.value:e,r,n,"object destructuring pattern")});break;default:for(var s=arguments.length,a=Array(s>3?s-3:0),o=3;o0)for(var r=e.body.body,n=Array.isArray(r),i=0,r=n?r:r[Symbol.iterator]();;){var s;if(n){if(i>=r.length)break;s=r[i++]}else{if(i=r.next(),i.done)break;s=i.value}var a=s;if("ExpressionStatement"!==a.type||"Literal"!==a.expression.type)break;if("use strict"===a.expression.value)return!0}return!1}}),e.extend("isValidDirective",function(){return function(e){return!("ExpressionStatement"!==e.type||"Literal"!==e.expression.type||"string"!=typeof e.expression.value||e.expression.extra&&e.expression.extra.parenthesized)}}),e.extend("stmtToDirective",function(e){return function(t){var r=e.call(this,t),n=t.expression.value;return r.value.value=n,r}}),e.extend("parseBlockBody",function(e){return function(t){for(var r=this,n=arguments.length,i=Array(n>1?n-1:0),s=1;s1?n-1:0),s=1;s2?n-2:0),s=2;s=a.length)break;l=a[u++]}else{if(u=a.next(),u.done)break;l=u.value}var c=l;"get"===c.kind||"set"===c.kind?this.raise(c.key.start,"Object pattern can't contain getter or setter"):c.method?this.raise(c.key.start,"Object pattern can't contain methods"):this.toAssignable(c,r,"object destructuring pattern")}return t}return e.call.apply(e,[this,t,r].concat(i))}})},ue=["any","mixed","empty","bool","boolean","number","string","void","null"],le=J.prototype;le.flowParseTypeInitialiser=function(e){var t=this.state.inType;this.state.inType=!0,this.expect(e||R.colon);var r=this.flowParseType();return this.state.inType=t,r},le.flowParsePredicate=function(){var e=this.startNode(),t=this.state.startLoc,r=this.state.start;this.expect(R.modulo);var n=this.state.startLoc;return this.expectContextual("checks"),t.line===n.line&&t.column===n.column-1||this.raise(r,"Spaces between ´%´ and ´checks´ are not allowed here."),this.eat(R.parenL)?(e.expression=this.parseExpression(),this.expect(R.parenR),this.finishNode(e,"DeclaredPredicate")):this.finishNode(e,"InferredPredicate")},le.flowParseTypeAndPredicateInitialiser=function(){var e=this.state.inType;this.state.inType=!0,this.expect(R.colon);var t=null,r=null;return this.match(R.modulo)?(this.state.inType=e,r=this.flowParsePredicate()):(t=this.flowParseType(),this.state.inType=e,this.match(R.modulo)&&(r=this.flowParsePredicate())),[t,r]},le.flowParseDeclareClass=function(e){return this.next(),this.flowParseInterfaceish(e,!0),this.finishNode(e,"DeclareClass")},le.flowParseDeclareFunction=function(e){this.next();var t=e.id=this.parseIdentifier(),r=this.startNode(),n=this.startNode();this.isRelational("<")?r.typeParameters=this.flowParseTypeParameterDeclaration():r.typeParameters=null,this.expect(R.parenL);var i=this.flowParseFunctionTypeParams();r.params=i.params,r.rest=i.rest,this.expect(R.parenR);var s=null,a=this.flowParseTypeAndPredicateInitialiser();return r.returnType=a[0],s=a[1],n.typeAnnotation=this.finishNode(r,"FunctionTypeAnnotation"),n.predicate=s,t.typeAnnotation=this.finishNode(n,"TypeAnnotation"),this.finishNode(t,t.type),this.semicolon(),this.finishNode(e,"DeclareFunction")},le.flowParseDeclare=function(e){return this.match(R._class)?this.flowParseDeclareClass(e):this.match(R._function)?this.flowParseDeclareFunction(e):this.match(R._var)?this.flowParseDeclareVariable(e):this.isContextual("module")?this.lookahead().type===R.dot?this.flowParseDeclareModuleExports(e):this.flowParseDeclareModule(e):this.isContextual("type")?this.flowParseDeclareTypeAlias(e):this.isContextual("opaque")?this.flowParseDeclareOpaqueType(e):this.isContextual("interface")?this.flowParseDeclareInterface(e):this.match(R._export)?this.flowParseDeclareExportDeclaration(e):void this.unexpected()},le.flowParseDeclareExportDeclaration=function(e){if(this.expect(R._export),this.isContextual("opaque"))return e.declaration=this.flowParseDeclare(this.startNode()),e.default=!1,this.finishNode(e,"DeclareExportDeclaration");throw this.unexpected()},le.flowParseDeclareVariable=function(e){return this.next(),e.id=this.flowParseTypeAnnotatableIdentifier(),this.semicolon(),this.finishNode(e,"DeclareVariable")},le.flowParseDeclareModule=function(e){this.next(),this.match(R.string)?e.id=this.parseExprAtom():e.id=this.parseIdentifier();var t=e.body=this.startNode(),r=t.body=[];for(this.expect(R.braceL);!this.match(R.braceR);){var n=this.startNode();if(this.match(R._import)){var i=this.lookahead();"type"!==i.value&&"typeof"!==i.value&&this.unexpected(null,"Imports within a `declare module` body must always be `import type` or `import typeof`"),this.parseImport(n)}else this.expectContextual("declare","Only declares and type imports are allowed inside declare module"),n=this.flowParseDeclare(n,!0);r.push(n)}return this.expect(R.braceR),this.finishNode(t,"BlockStatement"),this.finishNode(e,"DeclareModule")},le.flowParseDeclareModuleExports=function(e){return this.expectContextual("module"),this.expect(R.dot),this.expectContextual("exports"),e.typeAnnotation=this.flowParseTypeAnnotation(),this.semicolon(),this.finishNode(e,"DeclareModuleExports")},le.flowParseDeclareTypeAlias=function(e){return this.next(),this.flowParseTypeAlias(e),this.finishNode(e,"DeclareTypeAlias")},le.flowParseDeclareOpaqueType=function(e){return this.next(),this.flowParseOpaqueType(e,!0),this.finishNode(e,"DeclareOpaqueType")},le.flowParseDeclareInterface=function(e){return this.next(),this.flowParseInterfaceish(e),this.finishNode(e,"DeclareInterface")},le.flowParseInterfaceish=function(e){if(e.id=this.parseIdentifier(),this.isRelational("<")?e.typeParameters=this.flowParseTypeParameterDeclaration():e.typeParameters=null,e.extends=[],e.mixins=[],this.eat(R._extends))do{e.extends.push(this.flowParseInterfaceExtends())}while(this.eat(R.comma));if(this.isContextual("mixins")){this.next();do{e.mixins.push(this.flowParseInterfaceExtends())}while(this.eat(R.comma))}e.body=this.flowParseObjectType(!0,!1,!1)},le.flowParseInterfaceExtends=function(){var e=this.startNode();return e.id=this.flowParseQualifiedTypeIdentifier(),this.isRelational("<")?e.typeParameters=this.flowParseTypeParameterInstantiation():e.typeParameters=null,this.finishNode(e,"InterfaceExtends")},le.flowParseInterface=function(e){return this.flowParseInterfaceish(e,!1),this.finishNode(e,"InterfaceDeclaration")},le.flowParseRestrictedIdentifier=function(e){return ue.indexOf(this.state.value)>-1&&this.raise(this.state.start,"Cannot overwrite primitive type "+this.state.value),this.parseIdentifier(e)},le.flowParseTypeAlias=function(e){return e.id=this.flowParseRestrictedIdentifier(),this.isRelational("<")?e.typeParameters=this.flowParseTypeParameterDeclaration():e.typeParameters=null,e.right=this.flowParseTypeInitialiser(R.eq),this.semicolon(),this.finishNode(e,"TypeAlias")},le.flowParseOpaqueType=function(e,t){return this.expectContextual("type"),e.id=this.flowParseRestrictedIdentifier(),this.isRelational("<")?e.typeParameters=this.flowParseTypeParameterDeclaration():e.typeParameters=null,e.supertype=null,this.match(R.colon)&&(e.supertype=this.flowParseTypeInitialiser(R.colon)),e.impltype=null,t||(e.impltype=this.flowParseTypeInitialiser(R.eq)),this.semicolon(),this.finishNode(e,"OpaqueType")},le.flowParseTypeParameter=function(){var e=this.startNode(),t=this.flowParseVariance(),r=this.flowParseTypeAnnotatableIdentifier();return e.name=r.name,e.variance=t,e.bound=r.typeAnnotation,this.match(R.eq)&&(this.eat(R.eq),e.default=this.flowParseType()),this.finishNode(e,"TypeParameter")},le.flowParseTypeParameterDeclaration=function(){var e=this.state.inType,t=this.startNode();t.params=[],this.state.inType=!0,this.isRelational("<")||this.match(R.jsxTagStart)?this.next():this.unexpected();do{t.params.push(this.flowParseTypeParameter()),this.isRelational(">")||this.expect(R.comma)}while(!this.isRelational(">"));return this.expectRelational(">"),this.state.inType=e,this.finishNode(t,"TypeParameterDeclaration")},le.flowParseTypeParameterInstantiation=function(){var e=this.startNode(),t=this.state.inType;for(e.params=[],this.state.inType=!0,this.expectRelational("<");!this.isRelational(">");)e.params.push(this.flowParseType()),this.isRelational(">")||this.expect(R.comma);return this.expectRelational(">"),this.state.inType=t,this.finishNode(e,"TypeParameterInstantiation")},le.flowParseObjectPropertyKey=function(){return this.match(R.num)||this.match(R.string)?this.parseExprAtom():this.parseIdentifier(!0)},le.flowParseObjectTypeIndexer=function(e,t,r){return e.static=t,this.expect(R.bracketL),this.lookahead().type===R.colon?(e.id=this.flowParseObjectPropertyKey(),e.key=this.flowParseTypeInitialiser()):(e.id=null,e.key=this.flowParseType()),this.expect(R.bracketR),e.value=this.flowParseTypeInitialiser(),e.variance=r,this.flowObjectTypeSemicolon(),this.finishNode(e,"ObjectTypeIndexer")},le.flowParseObjectTypeMethodish=function(e){for(e.params=[],e.rest=null,e.typeParameters=null,this.isRelational("<")&&(e.typeParameters=this.flowParseTypeParameterDeclaration()),this.expect(R.parenL);!this.match(R.parenR)&&!this.match(R.ellipsis);)e.params.push(this.flowParseFunctionTypeParam()),this.match(R.parenR)||this.expect(R.comma);return this.eat(R.ellipsis)&&(e.rest=this.flowParseFunctionTypeParam()),this.expect(R.parenR),e.returnType=this.flowParseTypeInitialiser(),this.finishNode(e,"FunctionTypeAnnotation")},le.flowParseObjectTypeMethod=function(e,t,r,n){var i=this.startNodeAt(e,t);return i.value=this.flowParseObjectTypeMethodish(this.startNodeAt(e,t)),i.static=r,i.key=n,i.optional=!1,this.flowObjectTypeSemicolon(),this.finishNode(i,"ObjectTypeProperty")},le.flowParseObjectTypeCallProperty=function(e,t){var r=this.startNode();return e.static=t,e.value=this.flowParseObjectTypeMethodish(r),this.flowObjectTypeSemicolon(),this.finishNode(e,"ObjectTypeCallProperty")},le.flowParseObjectType=function(e,t,r){var n=this.state.inType;this.state.inType=!0;var i=this.startNode(),s=void 0,a=void 0,o=!1;i.callProperties=[],i.properties=[],i.indexers=[];var u=void 0,l=void 0;for(t&&this.match(R.braceBarL)?(this.expect(R.braceBarL),u=R.braceBarR,l=!0):(this.expect(R.braceL),u=R.braceR,l=!1),i.exact=l;!this.match(u);){var c=!1,f=this.state.start,p=this.state.startLoc;s=this.startNode(),e&&this.isContextual("static")&&this.lookahead().type!==R.colon&&(this.next(),o=!0);var d=this.state.start,h=this.flowParseVariance();this.match(R.bracketL)?i.indexers.push(this.flowParseObjectTypeIndexer(s,o,h)):this.match(R.parenL)||this.isRelational("<")?(h&&this.unexpected(d),i.callProperties.push(this.flowParseObjectTypeCallProperty(s,o))):this.match(R.ellipsis)?(r||this.unexpected(null,"Spread operator cannot appear in class or interface definitions"),h&&this.unexpected(h.start,"Spread properties cannot have variance"),this.expect(R.ellipsis),s.argument=this.flowParseType(),this.flowObjectTypeSemicolon(),i.properties.push(this.finishNode(s,"ObjectTypeSpreadProperty"))):(a=this.flowParseObjectPropertyKey(),this.isRelational("<")||this.match(R.parenL)?(h&&this.unexpected(h.start),i.properties.push(this.flowParseObjectTypeMethod(f,p,o,a))):(this.eat(R.question)&&(c=!0),s.key=a,s.value=this.flowParseTypeInitialiser(),s.optional=c,s.static=o,s.variance=h,this.flowObjectTypeSemicolon(),i.properties.push(this.finishNode(s,"ObjectTypeProperty")))),o=!1}this.expect(u);var m=this.finishNode(i,"ObjectTypeAnnotation");return this.state.inType=n,m},le.flowObjectTypeSemicolon=function(){this.eat(R.semi)||this.eat(R.comma)||this.match(R.braceR)||this.match(R.braceBarR)||this.unexpected()},le.flowParseQualifiedTypeIdentifier=function(e,t,r){e=e||this.state.start,t=t||this.state.startLoc;for(var n=r||this.parseIdentifier();this.eat(R.dot);){var i=this.startNodeAt(e,t);i.qualification=n,i.id=this.parseIdentifier(),n=this.finishNode(i,"QualifiedTypeIdentifier")}return n},le.flowParseGenericType=function(e,t,r){var n=this.startNodeAt(e,t);return n.typeParameters=null,n.id=this.flowParseQualifiedTypeIdentifier(e,t,r),this.isRelational("<")&&(n.typeParameters=this.flowParseTypeParameterInstantiation()),this.finishNode(n,"GenericTypeAnnotation")},le.flowParseTypeofType=function(){var e=this.startNode();return this.expect(R._typeof),e.argument=this.flowParsePrimaryType(),this.finishNode(e,"TypeofTypeAnnotation")},le.flowParseTupleType=function(){var e=this.startNode();for(e.types=[],this.expect(R.bracketL);this.state.pos0&&void 0!==arguments[0]?arguments[0]:[],t={params:e,rest:null};!this.match(R.parenR)&&!this.match(R.ellipsis);)t.params.push(this.flowParseFunctionTypeParam()),this.match(R.parenR)||this.expect(R.comma);return this.eat(R.ellipsis)&&(t.rest=this.flowParseFunctionTypeParam()),t},le.flowIdentToTypeAnnotation=function(e,t,r,n){switch(n.name){case"any":return this.finishNode(r,"AnyTypeAnnotation");case"void":return this.finishNode(r,"VoidTypeAnnotation");case"bool":case"boolean":return this.finishNode(r,"BooleanTypeAnnotation");case"mixed":return this.finishNode(r,"MixedTypeAnnotation");case"empty":return this.finishNode(r,"EmptyTypeAnnotation");case"number":return this.finishNode(r,"NumberTypeAnnotation");case"string":return this.finishNode(r,"StringTypeAnnotation");default:return this.flowParseGenericType(e,t,n)}},le.flowParsePrimaryType=function(){var e=this.state.start,t=this.state.startLoc,r=this.startNode(),n=void 0,i=void 0,s=!1,a=this.state.noAnonFunctionType;switch(this.state.type){case R.name:return this.flowIdentToTypeAnnotation(e,t,r,this.parseIdentifier());case R.braceL:return this.flowParseObjectType(!1,!1,!0);case R.braceBarL:return this.flowParseObjectType(!1,!0,!0);case R.bracketL:return this.flowParseTupleType();case R.relational:if("<"===this.state.value)return r.typeParameters=this.flowParseTypeParameterDeclaration(),this.expect(R.parenL),n=this.flowParseFunctionTypeParams(),r.params=n.params,r.rest=n.rest,this.expect(R.parenR),this.expect(R.arrow),r.returnType=this.flowParseType(),this.finishNode(r,"FunctionTypeAnnotation");break;case R.parenL:if(this.next(),!this.match(R.parenR)&&!this.match(R.ellipsis))if(this.match(R.name)){var o=this.lookahead().type;s=o!==R.question&&o!==R.colon}else s=!0;if(s){if(this.state.noAnonFunctionType=!1,i=this.flowParseType(),this.state.noAnonFunctionType=a,this.state.noAnonFunctionType||!(this.match(R.comma)||this.match(R.parenR)&&this.lookahead().type===R.arrow))return this.expect(R.parenR),i;this.eat(R.comma)}return n=i?this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(i)]):this.flowParseFunctionTypeParams(),r.params=n.params,r.rest=n.rest,this.expect(R.parenR),this.expect(R.arrow),r.returnType=this.flowParseType(),r.typeParameters=null,this.finishNode(r,"FunctionTypeAnnotation");case R.string:return this.parseLiteral(this.state.value,"StringLiteralTypeAnnotation");case R._true:case R._false:return r.value=this.match(R._true),this.next(),this.finishNode(r,"BooleanLiteralTypeAnnotation");case R.plusMin:if("-"===this.state.value)return this.next(), +this.match(R.num)||this.unexpected(null,"Unexpected token, expected number"),this.parseLiteral(-this.state.value,"NumericLiteralTypeAnnotation",r.start,r.loc.start);this.unexpected();case R.num:return this.parseLiteral(this.state.value,"NumericLiteralTypeAnnotation");case R._null:return r.value=this.match(R._null),this.next(),this.finishNode(r,"NullLiteralTypeAnnotation");case R._this:return r.value=this.match(R._this),this.next(),this.finishNode(r,"ThisTypeAnnotation");case R.star:return this.next(),this.finishNode(r,"ExistentialTypeParam");default:if("typeof"===this.state.type.keyword)return this.flowParseTypeofType()}this.unexpected()},le.flowParsePostfixType=function(){for(var e=this.state.start,t=this.state.startLoc,r=this.flowParsePrimaryType();!this.canInsertSemicolon()&&this.match(R.bracketL);){var n=this.startNodeAt(e,t);n.elementType=r,this.expect(R.bracketL),this.expect(R.bracketR),r=this.finishNode(n,"ArrayTypeAnnotation")}return r},le.flowParsePrefixType=function(){var e=this.startNode();return this.eat(R.question)?(e.typeAnnotation=this.flowParsePrefixType(),this.finishNode(e,"NullableTypeAnnotation")):this.flowParsePostfixType()},le.flowParseAnonFunctionWithoutParens=function(){var e=this.flowParsePrefixType();if(!this.state.noAnonFunctionType&&this.eat(R.arrow)){var t=this.startNodeAt(e.start,e.loc.start);return t.params=[this.reinterpretTypeAsFunctionTypeParam(e)],t.rest=null,t.returnType=this.flowParseType(),t.typeParameters=null,this.finishNode(t,"FunctionTypeAnnotation")}return e},le.flowParseIntersectionType=function(){var e=this.startNode();this.eat(R.bitwiseAND);var t=this.flowParseAnonFunctionWithoutParens();for(e.types=[t];this.eat(R.bitwiseAND);)e.types.push(this.flowParseAnonFunctionWithoutParens());return 1===e.types.length?t:this.finishNode(e,"IntersectionTypeAnnotation")},le.flowParseUnionType=function(){var e=this.startNode();this.eat(R.bitwiseOR);var t=this.flowParseIntersectionType();for(e.types=[t];this.eat(R.bitwiseOR);)e.types.push(this.flowParseIntersectionType());return 1===e.types.length?t:this.finishNode(e,"UnionTypeAnnotation")},le.flowParseType=function(){var e=this.state.inType;this.state.inType=!0;var t=this.flowParseUnionType();return this.state.inType=e,t},le.flowParseTypeAnnotation=function(){var e=this.startNode();return e.typeAnnotation=this.flowParseTypeInitialiser(),this.finishNode(e,"TypeAnnotation")},le.flowParseTypeAndPredicateAnnotation=function(){var e=this.startNode(),t=this.flowParseTypeAndPredicateInitialiser();return e.typeAnnotation=t[0],e.predicate=t[1],this.finishNode(e,"TypeAnnotation")},le.flowParseTypeAnnotatableIdentifier=function(){var e=this.flowParseRestrictedIdentifier();return this.match(R.colon)&&(e.typeAnnotation=this.flowParseTypeAnnotation(),this.finishNode(e,e.type)),e},le.typeCastToParameter=function(e){return e.expression.typeAnnotation=e.typeAnnotation,this.finishNodeAt(e.expression,e.expression.type,e.typeAnnotation.end,e.typeAnnotation.loc.end)},le.flowParseVariance=function(){var e=null;return this.match(R.plusMin)&&("+"===this.state.value?e="plus":"-"===this.state.value&&(e="minus"),this.next()),e};var ce=function(e){e.extend("parseFunctionBody",function(e){return function(t,r){return this.match(R.colon)&&!r&&(t.returnType=this.flowParseTypeAndPredicateAnnotation()),e.call(this,t,r)}}),e.extend("parseStatement",function(e){return function(t,r){if(this.state.strict&&this.match(R.name)&&"interface"===this.state.value){var n=this.startNode();return this.next(),this.flowParseInterface(n)}return e.call(this,t,r)}}),e.extend("parseExpressionStatement",function(e){return function(t,r){if("Identifier"===r.type)if("declare"===r.name){if(this.match(R._class)||this.match(R.name)||this.match(R._function)||this.match(R._var)||this.match(R._export))return this.flowParseDeclare(t)}else if(this.match(R.name)){if("interface"===r.name)return this.flowParseInterface(t);if("type"===r.name)return this.flowParseTypeAlias(t);if("opaque"===r.name)return this.flowParseOpaqueType(t,!1)}return e.call(this,t,r)}}),e.extend("shouldParseExportDeclaration",function(e){return function(){return this.isContextual("type")||this.isContextual("interface")||this.isContextual("opaque")||e.call(this)}}),e.extend("isExportDefaultSpecifier",function(e){return function(){return(!this.match(R.name)||"type"!==this.state.value&&"interface"!==this.state.value&&"opaque"!==this.state.value)&&e.call(this)}}),e.extend("parseConditional",function(e){return function(t,r,n,i,s){if(s&&this.match(R.question)){var a=this.state.clone();try{return e.call(this,t,r,n,i)}catch(e){if(e instanceof SyntaxError)return this.state=a,s.start=e.pos||this.state.start,t;throw e}}return e.call(this,t,r,n,i)}}),e.extend("parseParenItem",function(e){return function(t,r,n){if(t=e.call(this,t,r,n),this.eat(R.question)&&(t.optional=!0),this.match(R.colon)){var i=this.startNodeAt(r,n);return i.expression=t,i.typeAnnotation=this.flowParseTypeAnnotation(),this.finishNode(i,"TypeCastExpression")}return t}}),e.extend("parseExport",function(e){return function(t){return t=e.call(this,t),"ExportNamedDeclaration"===t.type&&(t.exportKind=t.exportKind||"value"),t}}),e.extend("parseExportDeclaration",function(e){return function(t){if(this.isContextual("type")){t.exportKind="type";var r=this.startNode();return this.next(),this.match(R.braceL)?(t.specifiers=this.parseExportSpecifiers(),this.parseExportFrom(t),null):this.flowParseTypeAlias(r)}if(this.isContextual("opaque")){t.exportKind="type";var n=this.startNode();return this.next(),this.flowParseOpaqueType(n,!1)}if(this.isContextual("interface")){t.exportKind="type";var i=this.startNode();return this.next(),this.flowParseInterface(i)}return e.call(this,t)}}),e.extend("parseClassId",function(e){return function(t){e.apply(this,arguments),this.isRelational("<")&&(t.typeParameters=this.flowParseTypeParameterDeclaration())}}),e.extend("isKeyword",function(e){return function(t){return(!this.state.inType||"void"!==t)&&e.call(this,t)}}),e.extend("readToken",function(e){return function(t){return!this.state.inType||62!==t&&60!==t?e.call(this,t):this.finishOp(R.relational,1)}}),e.extend("jsx_readToken",function(e){return function(){if(!this.state.inType)return e.call(this)}}),e.extend("toAssignable",function(e){return function(t,r,n){return"TypeCastExpression"===t.type?e.call(this,this.typeCastToParameter(t),r,n):e.call(this,t,r,n)}}),e.extend("toAssignableList",function(e){return function(t,r,n){for(var i=0;i2?n-2:0),s=2;s1114111||de(a)!=a)throw RangeError("Invalid code point: "+a);a<=65535?e.push(a):(a-=65536,t=55296+(a>>10),r=a%1024+56320,e.push(t,r)),(n+1==i||e.length>16384)&&(s+=pe.apply(null,e),e.length=0)}return s}}var he=fe,me={quot:'"',amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",times:"×",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",divide:"÷",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",frasl:"⁄",euro:"€",image:"ℑ",weierp:"℘",real:"ℜ",trade:"™",alefsym:"ℵ",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lArr:"⇐",uArr:"⇑",rArr:"⇒",dArr:"⇓",hArr:"⇔",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",lang:"〈",rang:"〉",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"},ye=/^[\da-fA-F]+$/,ve=/^\d+$/;U.j_oTag=new j("...",!0,!0),R.jsxName=new T("jsxName"),R.jsxText=new T("jsxText",{beforeExpr:!0}),R.jsxTagStart=new T("jsxTagStart",{startsExpr:!0}),R.jsxTagEnd=new T("jsxTagEnd"),R.jsxTagStart.updateContext=function(){this.state.context.push(U.j_expr),this.state.context.push(U.j_oTag),this.state.exprAllowed=!1},R.jsxTagEnd.updateContext=function(e){var t=this.state.context.pop();t===U.j_oTag&&e===R.slash||t===U.j_cTag?(this.state.context.pop(),this.state.exprAllowed=this.curContext()===U.j_expr):this.state.exprAllowed=!0};var ge=J.prototype;ge.jsxReadToken=function(){for(var e="",t=this.state.pos;;){this.state.pos>=this.input.length&&this.raise(this.state.start,"Unterminated JSX contents");var r=this.input.charCodeAt(this.state.pos);switch(r){case 60:case 123:return this.state.pos===this.state.start?60===r&&this.state.exprAllowed?(++this.state.pos,this.finishToken(R.jsxTagStart)):this.getTokenFromCode(r):(e+=this.input.slice(t,this.state.pos),this.finishToken(R.jsxText,e));case 38:e+=this.input.slice(t,this.state.pos),e+=this.jsxReadEntity(),t=this.state.pos;break;default:o(r)?(e+=this.input.slice(t,this.state.pos),e+=this.jsxReadNewLine(!0),t=this.state.pos):++this.state.pos}}},ge.jsxReadNewLine=function(e){var t=this.input.charCodeAt(this.state.pos),r=void 0;return++this.state.pos,13===t&&10===this.input.charCodeAt(this.state.pos)?(++this.state.pos,r=e?"\n":"\r\n"):r=String.fromCharCode(t),++this.state.curLine,this.state.lineStart=this.state.pos,r},ge.jsxReadString=function(e){for(var t="",r=++this.state.pos;;){this.state.pos>=this.input.length&&this.raise(this.state.start,"Unterminated string constant");var n=this.input.charCodeAt(this.state.pos);if(n===e)break;38===n?(t+=this.input.slice(r,this.state.pos),t+=this.jsxReadEntity(),r=this.state.pos):o(n)?(t+=this.input.slice(r,this.state.pos),t+=this.jsxReadNewLine(!1),r=this.state.pos):++this.state.pos}return t+=this.input.slice(r,this.state.pos++),this.finishToken(R.string,t)},ge.jsxReadEntity=function(){for(var e="",t=0,r=void 0,n=this.input[this.state.pos],i=++this.state.pos;this.state.pos")}return r.openingElement=i,r.closingElement=s,r.children=n,this.match(R.relational)&&"<"===this.state.value&&this.raise(this.state.start,"Adjacent JSX elements must be wrapped in an enclosing tag"),this.finishNode(r,"JSXElement")},ge.jsxParseElement=function(){var e=this.state.start,t=this.state.startLoc;return this.next(),this.jsxParseElementAt(e,t)};var be=function(e){e.extend("parseExprAtom",function(e){return function(t){if(this.match(R.jsxText)){var r=this.parseLiteral(this.state.value,"JSXText");return r.extra=null,r}return this.match(R.jsxTagStart)?this.jsxParseElement():e.call(this,t)}}),e.extend("readToken",function(e){return function(t){if(this.state.inPropertyName)return e.call(this,t);var r=this.curContext();if(r===U.j_expr)return this.jsxReadToken();if(r===U.j_oTag||r===U.j_cTag){if(i(t))return this.jsxReadWord();if(62===t)return++this.state.pos,this.finishToken(R.jsxTagEnd);if((34===t||39===t)&&r===U.j_oTag)return this.jsxReadString(t)}return 60===t&&this.state.exprAllowed?(++this.state.pos,this.finishToken(R.jsxTagStart)):e.call(this,t)}}),e.extend("updateContext",function(e){return function(t){if(this.match(R.braceL)){var r=this.curContext();r===U.j_oTag?this.state.context.push(U.braceExpression):r===U.j_expr?this.state.context.push(U.templateQuasi):e.call(this,t),this.state.exprAllowed=!0}else{if(!this.match(R.slash)||t!==R.jsxTagStart)return e.call(this,t);this.state.context.length-=2,this.state.context.push(U.j_cTag),this.state.exprAllowed=!1}}})};K.estree=oe,K.flow=ce,K.jsx=be,t.parse=h,t.parseExpression=m,t.tokTypes=R},function(e,t,r){"use strict";var n=r(21),i=r(431),s=r(141),a=r(150)("IE_PROTO"),o=function(){},u=function(){var e,t=r(230)("iframe"),n=s.length;for(t.style.display="none",r(426).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("