From 35fa3721c5f15608b11998feef90f87281386bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E5=B0=9B?= <1254210241@qq.com> Date: Mon, 15 Jun 2026 13:48:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E7=89=88=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 201 + README.md | 1 + .../centerBooksAdd_1916358871501082626_1.txt | 351 ++ .../centerBooksAdd_1965254774327533570_4.txt | 336 ++ ...centerBooksAdd_1967112570379649025_440.txt | 9 + .../centerBooksAdd_1983373997176135681_33.txt | 5 + file/log/centerBooksAdd_1_1.txt | 203 + pom.xml | 520 ++ ruoyi-admin/Dockerfile | 30 + ruoyi-admin/pom.xml | 181 + .../dromara/DromaraServletInitializer.java | 18 + .../web/controller/AuthController.java | 507 ++ .../web/controller/CaptchaController.java | 139 + .../dromara/web/domain/vo/LoginTenantVo.java | 25 + .../dromara/web/domain/vo/TenantListVo.java | 31 + .../org/dromara/web/domain/vo/WxLoginVo.java | 12 + .../web/domain/vo/dto/WxRegisterDTO.java | 16 + .../web/listener/UserActionListener.java | 165 + .../dromara/web/service/IAuthStrategy.java | 49 + .../dromara/web/service/SysLoginService.java | 251 + .../service/impl/PasswordAuthStrategy.java | 185 + .../web/service/impl/SocialAuthStrategy.java | 131 + .../web/service/impl/XcxAuthStrategy.java | 153 + .../src/main/resources/application-dev.yml | 290 + .../src/main/resources/application.yml | 317 + .../main/resources/i18n/messages.properties | 61 + .../resources/i18n/messages_zh_CN.properties | 61 + .../mapper/zhishu/BookBaseInfoMapper.xml | 21 + .../java/org/dromara/test/AssertUnitTest.java | 45 + .../java/org/dromara/test/ParamUnitTest.java | 72 + ruoyi-admin/zhFonts/.uuid | 1 + ruoyi-admin/zhFonts/fonts.dir | 4 + ruoyi-common/pom.xml | 46 + ruoyi-common/ruoyi-common-bom/pom.xml | 185 + ruoyi-common/ruoyi-common-core/pom.xml | 99 + .../common/core/config/ApplicationConfig.java | 17 + .../common/core/config/RuoYiConfig.java | 38 + .../common/core/config/ThreadPoolConfig.java | 87 + .../common/core/config/ValidatorConfig.java | 40 + .../common/core/config/ZhishuConfig.java | 58 + .../properties/ThreadPoolProperties.java | 30 + .../common/core/constant/CacheConstants.java | 30 + .../common/core/constant/Constants.java | 76 + .../common/core/constant/HttpStatus.java | 93 + .../common/core/constant/SystemConstants.java | 75 + .../common/core/constant/TenantConstants.java | 35 + .../org/dromara/common/core/domain/R.java | 110 + .../core/domain/dto/CompleteTaskDTO.java | 71 + .../common/core/domain/dto/FlowCopyDTO.java | 30 + .../common/core/domain/dto/OssDTO.java | 46 + .../common/core/domain/dto/RoleDTO.java | 42 + .../domain/dto/StartProcessReturnDTO.java | 30 + .../core/domain/dto/TaskAssigneeDTO.java | 101 + .../common/core/domain/dto/UserOnlineDTO.java | 72 + .../core/domain/event/ProcessTaskEvent.java | 44 + .../core/domain/model/EmailLoginBody.java | 31 + .../core/domain/model/InterfaceLoginBody.java | 14 + .../common/core/domain/model/LoginBody.java | 66 + .../common/core/domain/model/LoginUser.java | 153 + .../core/domain/model/SmsLoginBody.java | 29 + .../core/domain/model/SocialLoginBody.java | 35 + .../core/domain/model/TaskAssigneeBody.java | 56 + .../dromara/common/core/enums/DeviceType.java | 37 + .../dromara/common/core/enums/LoginType.java | 44 + .../dromara/common/core/enums/UserStatus.java | 30 + .../dromara/common/core/enums/UserType.java | 37 + .../core/exception/ServiceException.java | 59 + .../common/core/exception/SseException.java | 62 + .../FileNameLengthLimitExceededException.java | 18 + .../file/FileSizeLimitExceededException.java | 18 + .../core/exception/user/CaptchaException.java | 18 + .../user/CaptchaExpireException.java | 18 + .../core/exception/user/UserException.java | 20 + .../common/core/service/ConfigService.java | 18 + .../common/core/service/DeptService.java | 37 + .../common/core/service/OssService.java | 29 + .../common/core/service/PostService.java | 10 + .../common/core/service/RoleService.java | 10 + .../dromara/common/core/utils/DateUtils.java | 299 + .../common/core/utils/MessageUtils.java | 33 + .../common/core/utils/ServletUtils.java | 289 + .../common/core/utils/SpringUtils.java | 67 + .../common/core/utils/StreamUtils.java | 283 + .../common/core/utils/StringUtils.java | 406 ++ .../common/core/utils/TreeBuildUtils.java | 96 + .../common/core/utils/ValidatorUtils.java | 35 + .../common/core/utils/file/MimeTypeUtils.java | 40 + .../common/core/utils/ip/AddressUtils.java | 33 + .../common/core/utils/regex/RegexUtils.java | 31 + .../core/utils/regex/RegexValidator.java | 105 + .../common/core/validate/EditGroup.java | 9 + .../common/core/validate/QueryGroup.java | 9 + .../validate/enumd/EnumPatternValidator.java | 37 + .../dromara/common/core/xss/XssValidator.java | 21 + ...ot.autoconfigure.AutoConfiguration.imports | 6 + .../common/doc/config/SpringDocConfig.java | 126 + .../properties/SpringDocProperties.java | 94 + .../common/doc/handler/OpenApiHandler.java | 253 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../common/encrypt/annotation/ApiEncrypt.java | 20 + .../encrypt/annotation/EncryptField.java | 44 + .../config/ApiDecryptAutoConfiguration.java | 32 + .../config/EncryptorAutoConfiguration.java | 49 + .../common/encrypt/core/IEncryptor.java | 35 + .../core/encryptor/AbstractEncryptor.java | 18 + .../encrypt/core/encryptor/RsaEncryptor.java | 62 + .../encrypt/core/encryptor/Sm2Encryptor.java | 61 + .../common/encrypt/enumd/AlgorithmType.java | 48 + .../common/encrypt/enumd/EncodeType.java | 26 + .../filter/DecryptRequestBodyWrapper.java | 94 + .../filter/EncryptResponseBodyWrapper.java | 121 + .../MybatisDecryptInterceptor.java | 120 + .../MybatisEncryptInterceptor.java | 124 + .../properties/ApiDecryptProperties.java | 34 + .../properties/EncryptorProperties.java | 48 + .../common/encrypt/utils/EncryptUtils.java | 313 + ruoyi-common/ruoyi-common-excel/pom.xml | 30 + .../common/excel/annotation/CellMerge.java | 29 + .../excel/annotation/ExcelDictFormat.java | 32 + .../excel/annotation/ExcelEnumFormat.java | 30 + .../excel/annotation/ExcelNotation.java | 24 + .../excel/annotation/ExcelRequired.java | 26 + .../excel/convert/ExcelDictConvert.java | 73 + .../excel/convert/ExcelEnumConvert.java | 87 + .../common/excel/core/CellMergeStrategy.java | 157 + .../excel/core/DefaultExcelListener.java | 104 + .../common/excel/core/ExcelDownHandler.java | 399 ++ .../common/excel/core/ExcelListener.java | 14 + .../common/excel/core/ExcelResult.java | 26 + .../excel/handler/DataWriteHandler.java | 135 + .../dromara/common/excel/utils/ExcelUtil.java | 453 ++ .../zhishu/annotation/EnableExcelComment.java | 9 + .../zhishu/handler/EmptyListTipHandler.java | 74 + .../zhishu/handler/TipRowWriteHandler.java | 110 + ruoyi-common/ruoyi-common-idempotent/pom.xml | 41 + .../idempotent/annotation/RepeatSubmit.java | 29 + ruoyi-common/ruoyi-common-job/pom.xml | 46 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../json/handler/BigNumberSerializer.java | 42 + .../dromara/common/json/utils/JsonUtils.java | 170 + ruoyi-common/ruoyi-common-log/pom.xml | 32 + .../dromara/common/log/annotation/Log.java | 48 + .../dromara/common/log/aspect/LogAspect.java | 219 + .../common/log/enums/OperatorType.java | 23 + .../common/log/event/LogininforEvent.java | 52 + .../common/log/event/OperLogEvent.java | 115 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../common/mail/config/MailConfig.java | 37 + ruoyi-common/ruoyi-common-mybatis/pom.xml | 52 + .../common/mybatis/annotation/DataColumn.java | 40 + .../mybatis/annotation/DataPermission.java | 30 + .../mybatis/aspect/DataPermissionAspect.java | 50 + .../mybatis/config/MybatisPlusConfig.java | 139 + .../mybatis/core/domain/BaseEntity.java | 70 + .../mybatis/core/mapper/BaseMapperPlus.java | 354 ++ .../mybatis/core/page/TableDataInfo.java | 91 + .../common/mybatis/enums/DataBaseType.java | 58 + .../handler/InjectionMetaObjectHandler.java | 102 + .../handler/MybatisExceptionHandler.java | 46 + .../handler/PlusDataPermissionHandler.java | 332 ++ .../handler/PlusPostInitTableInfoHandler.java | 27 + .../common/mybatis/helper/DataBaseHelper.java | 81 + .../mybatis/helper/DataPermissionHelper.java | 176 + .../PlusDataPermissionInterceptor.java | 181 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/spy.properties | 20 + ruoyi-common/ruoyi-common-oss/pom.xml | 79 + .../dromara/common/oss/core/OssClient.java | 518 ++ .../common/oss/exception/OssException.java | 19 + .../common/oss/factory/OssFactory.java | 73 + .../ratelimiter/annotation/RateLimiter.java | 47 + .../ratelimiter/config/RateLimiterConfig.java | 20 + .../common/ratelimiter/enums/LimitType.java | 24 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/spel-extension.json | 7 + ruoyi-common/ruoyi-common-redis/pom.xml | 59 + .../common/redis/config/CacheConfig.java | 45 + .../redis/manager/CaffeineCacheDecorator.java | 96 + .../common/redis/utils/CacheUtils.java | 61 + .../common/redis/utils/QueueUtils.java | 237 + .../common/redis/utils/RedisUtils.java | 642 ++ .../common/redis/utils/SequenceUtils.java | 165 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + ruoyi-common/ruoyi-common-satoken/pom.xml | 46 + .../satoken/core/dao/PlusSaTokenDao.java | 180 + .../common/satoken/utils/LoginHelper.java | 219 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/common-satoken.yml | 13 + ruoyi-common/ruoyi-common-security/pom.xml | 26 + .../security/handler/AllUrlHandler.java | 39 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + ruoyi-common/ruoyi-common-sensitive/pom.xml | 25 + .../sensitive/annotation/Sensitive.java | 34 + .../sensitive/core/SensitiveService.java | 18 + .../sensitive/core/SensitiveStrategy.java | 99 + .../sensitive/handler/SensitiveHandler.java | 58 + .../org/dromara/common/utils/ImageUtils.java | 64 + .../sms/config/SmsAutoConfiguration.java | 33 + .../common/sms/core/dao/PlusSmsDao.java | 72 + .../sms/handler/SmsExceptionHandler.java | 30 + ruoyi-common/ruoyi-common-social/pom.xml | 34 + .../config/properties/SocialProperties.java | 24 + .../social/maxkey/AuthMaxKeyRequest.java | 80 + .../social/maxkey/AuthMaxKeySource.java | 52 + .../social/topiam/AuthTopIamRequest.java | 113 + .../social/topiam/AuthTopIamSource.java | 51 + .../social/utils/AuthRedisStateCache.java | 61 + .../common/social/utils/SocialUtils.java | 73 + ruoyi-common/ruoyi-common-sse/pom.xml | 36 + .../sse/config/SseAutoConfiguration.java | 36 + .../common/sse/config/SseProperties.java | 21 + .../common/sse/controller/SseController.java | 87 + .../common/sse/core/SseEmitterManager.java | 155 + .../dromara/common/sse/dto/SseMessageDto.java | 29 + .../common/sse/utils/SseMessageUtils.java | 84 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + ruoyi-common/ruoyi-common-tenant/pom.xml | 32 + .../common/tenant/core/TenantSaTokenDao.java | 148 + .../tenant/exception/TenantException.java | 20 + .../tenant/handle/PlusTenantLineHandler.java | 56 + .../tenant/handle/TenantKeyPrefixHandler.java | 83 + .../common/tenant/helper/TenantHelper.java | 231 + .../manager/TenantSpringCacheManager.java | 41 + .../tenant/properties/TenantProperties.java | 27 + ruoyi-common/ruoyi-common-translation/pom.xml | 27 + .../annotation/TranslationType.java | 23 + .../core/TranslationInterface.java | 20 + .../core/handler/TranslationHandler.java | 65 + .../core/impl/DictTypeTranslationImpl.java | 28 + .../core/impl/NicknameTranslationImpl.java | 29 + .../core/impl/OssUrlTranslationImpl.java | 29 + .../core/impl/UserNameTranslationImpl.java | 27 + ruoyi-common/ruoyi-common-web/pom.xml | 62 + .../common/web/config/FilterConfig.java | 44 + .../dromara/common/web/config/I18nConfig.java | 22 + .../common/web/config/UndertowConfig.java | 63 + .../web/config/properties/XssProperties.java | 28 + .../common/web/core/BaseController.java | 40 + .../common/web/core/I18nLocaleResolver.java | 31 + .../dromara/common/web/enums/CaptchaType.java | 29 + .../common/web/filter/RepeatableFilter.java | 40 + .../web/filter/RepeatedlyRequestWrapper.java | 68 + .../filter/XssHttpServletRequestWrapper.java | 134 + .../web/handler/GlobalExceptionHandler.java | 220 + .../PlusWebInvokeTimeInterceptor.java | 89 + .../web/utils/UnsignedMathGenerator.java | 88 + ...ot.autoconfigure.AutoConfiguration.imports | 5 + .../websocket/config/WebSocketConfig.java | 63 + .../properties/WebSocketProperties.java | 26 + .../constant/WebSocketConstants.java | 29 + .../websocket/dto/WebSocketMessageDto.java | 29 + .../holder/WebSocketSessionHolder.java | 74 + .../interceptor/PlusWebSocketInterceptor.java | 75 + .../websocket/utils/WebSocketUtils.java | 127 + ruoyi-extend/pom.xml | 19 + .../admin/config/AdminServerConfig.java | 31 + .../src/main/resources/application.yml | 48 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/logback-plus.xml | 34 + ruoyi-extend/ruoyi-snailjob-server/Dockerfile | 23 + ruoyi-extend/ruoyi-snailjob-server/pom.xml | 58 + .../server/starter/filter/SecurityConfig.java | 29 + .../snailjob/SnailJobServerApplication.java | 19 + .../src/main/resources/application-dev.yml | 53 + .../src/main/resources/application-prod.yml | 53 + .../src/main/resources/application.yml | 39 + .../src/main/resources/banner.txt | 11 + .../src/main/resources/logback-plus.xml | 92 + ruoyi-modules/pom.xml | 28 + ruoyi-modules/ruoyi-demo/pom.xml | 108 + .../demo/controller/MailController.java | 70 + .../demo/controller/RedisLockController.java | 64 + .../RedisRateLimiterController.java | 64 + .../demo/controller/SmsController.java | 82 + .../controller/Swagger3DemoController.java | 31 + .../demo/controller/TestBatchController.java | 90 + .../controller/TestEncryptController.java | 55 + .../demo/controller/TestI18nController.java | 71 + .../controller/TestSensitiveController.java | 76 + .../demo/controller/WeSocketController.java | 33 + .../queue/BoundedQueueController.java | 92 + .../queue/DelayedQueueController.java | 97 + .../demo/controller/queue/PriorityDemo.java | 22 + .../queue/PriorityQueueController.java | 89 + .../org/dromara/demo/domain/TestTree.java | 65 + .../dromara/demo/domain/bo/TestDemoBo.java | 62 + .../demo/domain/bo/TestDemoImportVo.java | 53 + .../dromara/demo/domain/bo/TestTreeBo.java | 54 + .../org/dromara/demo/domain/package-info.java | 1 + .../dromara/demo/domain/vo/ExportDemoVo.java | 122 + .../dromara/demo/domain/vo/TestTreeVo.java | 64 + .../demo/listener/ExportDemoListener.java | 68 + .../demo/mapper/TestDemoEncryptMapper.java | 13 + .../demo/service/IExportExcelService.java | 18 + .../service/impl/ExportExcelServiceImpl.java | 236 + .../service/impl/TestDemoServiceImpl.java | 116 + .../demo/service/impl/package-info.java | 1 + .../dromara/demo/service/package-info.java | 1 + .../src/main/resources/excel/单列表.xlsx | Bin 0 -> 10787 bytes .../src/main/resources/excel/多sheet列表.xlsx | Bin 0 -> 13359 bytes .../resources/mapper/demo/TestDemoMapper.xml | 11 + .../resources/mapper/demo/TestTreeMapper.xml | 7 + .../config/MyBatisDataSourceMonitor.java | 105 + .../generator/constant/GenConstants.java | 186 + .../generator/controller/GenController.java | 217 + .../generator/domain/GenTableColumn.java | 222 + .../mapper/GenTableColumnMapper.java | 15 + .../generator/mapper/GenTableMapper.java | 51 + .../service/GenTableServiceImpl.java | 582 ++ .../generator/service/IGenTableService.java | 141 + .../dromara/generator/util/VelocityUtils.java | 341 ++ .../mapper/generator/GenTableColumnMapper.xml | 10 + .../mapper/generator/GenTableMapper.xml | 42 + .../src/main/resources/vm/java/bo.java.vm | 50 + .../src/main/resources/vm/java/domain.java.vm | 60 + .../src/main/resources/vm/java/mapper.java.vm | 15 + .../main/resources/vm/java/service.java.vm | 72 + .../resources/vm/java/serviceImpl.java.vm | 158 + .../src/main/resources/vm/java/vo.java.vm | 66 + .../src/main/resources/vm/sql/oracle/sql.vm | 19 + .../src/main/resources/vm/sql/postgres/sql.vm | 20 + .../src/main/resources/vm/sql/sql.vm | 19 + .../main/resources/vm/sql/sqlserver/sql.vm | 19 + .../src/main/resources/vm/ts/api.ts.vm | 63 + .../main/resources/vm/vue/index-tree.vue.vm | 498 ++ .../src/main/resources/vm/vue/index.vue.vm | 459 ++ .../src/main/resources/vm/xml/mapper.xml.vm | 7 + ruoyi-modules/ruoyi-job/pom.xml | 52 + .../org/dromara/job/domains/ShopOrderVO.java | 17 + .../job/mapper/ShopOrderDetailMapper.java | 10 + .../job/service/impl/PddServiceImpl.java | 1121 ++++ .../job/snailjob/CatsGetJobExecutor.java | 34 + .../job/snailjob/GetOrderNowJobExecutor.java | 40 + .../job/snailjob/TestClassJobExecutor.java | 19 + .../controller/monitor/CacheController.java | 55 + .../monitor/SysLogininforController.java | 89 + .../monitor/SysUserOnlineController.java | 131 + .../system/SysClientController.java | 115 + .../system/SysConfigController.java | 137 + .../controller/system/SysDeptController.java | 140 + .../system/SysDictDataController.java | 123 + .../system/SysDictTypeController.java | 125 + .../controller/system/SysMenuController.java | 178 + .../system/SysNoticeController.java | 90 + .../system/SysOssConfigController.java | 105 + .../controller/system/SysOssController.java | 108 + .../controller/system/SysPostController.java | 133 + .../system/SysProfileController.java | 137 + .../controller/system/SysRoleController.java | 229 + .../system/SysTenantController.java | 218 + .../system/SysUserBalanceController.java | 47 + .../controller/system/SysUserController.java | 339 ++ .../org/dromara/system/domain/SysCache.java | 47 + .../org/dromara/system/domain/SysClient.java | 77 + .../org/dromara/system/domain/SysConfig.java | 51 + .../org/dromara/system/domain/SysDept.java | 83 + .../org/dromara/system/domain/SysMenu.java | 191 + .../org/dromara/system/domain/SysOperLog.java | 115 + .../org/dromara/system/domain/SysPost.java | 61 + .../org/dromara/system/domain/SysRole.java | 79 + .../dromara/system/domain/SysRoleDept.java | 29 + .../dromara/system/domain/SysRoleMenu.java | 29 + .../org/dromara/system/domain/SysSocial.java | 136 + .../org/dromara/system/domain/SysTenant.java | 103 + .../system/domain/SysTenantPackage.java | 60 + .../org/dromara/system/domain/SysUser.java | 140 + .../dromara/system/domain/SysUserOnline.java | 63 + .../dromara/system/domain/SysUserPost.java | 29 + .../dromara/system/domain/SysUserRole.java | 29 + .../dromara/system/domain/bo/SysConfigBo.java | 59 + .../system/domain/bo/SysDictDataBo.java | 80 + .../system/domain/bo/SysLogininforBo.java | 87 + .../dromara/system/domain/bo/SysMenuBo.java | 110 + .../system/domain/bo/SysOperLogBo.java | 127 + .../system/domain/bo/SysOssConfigBo.java | 109 + .../dromara/system/domain/bo/SysRoleBo.java | 94 + .../dromara/system/domain/bo/SysTenantBo.java | 114 + .../dromara/system/domain/bo/SysUserBo.java | 142 + .../system/domain/bo/SysUserProfileBo.java | 57 + .../system/domain/vo/DeptTreeSelectVo.java | 26 + .../system/domain/vo/MenuTreeSelectVo.java | 26 + .../org/dromara/system/domain/vo/MetaVo.java | 61 + .../dromara/system/domain/vo/ProfileVo.java | 36 + .../dromara/system/domain/vo/RouterVo.java | 62 + .../dromara/system/domain/vo/SysClientVo.java | 90 + .../dromara/system/domain/vo/SysConfigVo.java | 72 + .../dromara/system/domain/vo/SysDeptVo.java | 102 + .../system/domain/vo/SysDictDataVo.java | 88 + .../system/domain/vo/SysDictTypeVo.java | 59 + .../system/domain/vo/SysLogininforVo.java | 106 + .../dromara/system/domain/vo/SysMenuVo.java | 116 + .../system/domain/vo/SysOssConfigVo.java | 97 + .../system/domain/vo/SysOssUploadVo.java | 28 + .../dromara/system/domain/vo/SysOssVo.java | 72 + .../dromara/system/domain/vo/SysPostVo.java | 91 + .../dromara/system/domain/vo/SysTenantVo.java | 115 + .../system/domain/vo/SysUserExportVo.java | 96 + .../system/domain/vo/SysUserImportVo.java | 76 + .../dromara/system/domain/vo/SysUserVo.java | 164 + .../listener/SysUserImportListener.java | 127 + .../system/mapper/SysClientMapper.java | 15 + .../system/mapper/SysDictDataMapper.java | 29 + .../system/mapper/SysDictTypeMapper.java | 14 + .../dromara/system/mapper/SysMenuMapper.java | 76 + .../system/mapper/SysNoticeMapper.java | 14 + .../system/mapper/SysOperLogMapper.java | 14 + .../system/mapper/SysOssConfigMapper.java | 16 + .../dromara/system/mapper/SysOssMapper.java | 13 + .../dromara/system/mapper/SysPostMapper.java | 43 + .../system/mapper/SysRoleDeptMapper.java | 13 + .../system/mapper/SysRoleMenuMapper.java | 13 + .../system/mapper/SysTenantMapper.java | 14 + .../system/mapper/SysTenantPackageMapper.java | 14 + .../system/mapper/SysUserRoleMapper.java | 23 + .../system/service/ISysClientService.java | 60 + .../system/service/ISysConfigService.java | 87 + .../system/service/ISysDataScopeService.java | 26 + .../system/service/ISysDeptService.java | 125 + .../system/service/ISysDictTypeService.java | 95 + .../system/service/ISysLogininforService.java | 47 + .../system/service/ISysMenuService.java | 147 + .../system/service/ISysNoticeService.java | 67 + .../system/service/ISysOperLogService.java | 54 + .../system/service/ISysOssConfigService.java | 64 + .../system/service/ISysPermissionService.java | 28 + .../system/service/ISysPostService.java | 130 + .../system/service/ISysRoleService.java | 202 + .../system/service/ISysSocialService.java | 53 + .../system/service/ISysTenantService.java | 87 + .../system/service/ISysUserService.java | 238 + .../system/service/IUserTransferService.java | 40 + .../service/impl/SysClientServiceImpl.java | 151 + .../service/impl/SysConfigServiceImpl.java | 216 + .../service/impl/SysDataScopeServiceImpl.java | 78 + .../service/impl/SysDictDataServiceImpl.java | 157 + .../service/impl/SysDictTypeServiceImpl.java | 258 + .../impl/SysLogininforServiceImpl.java | 175 + .../service/impl/SysMenuServiceImpl.java | 372 ++ .../service/impl/SysOssConfigServiceImpl.java | 177 + .../service/impl/SysOssServiceImpl.java | 269 + .../service/impl/SysPostServiceImpl.java | 249 + .../service/impl/SysSensitiveServiceImpl.java | 47 + .../impl/SysTaskAssigneeServiceImpl.java | 168 + .../impl/SysTenantPackageServiceImpl.java | 157 + .../service/impl/SysTenantServiceImpl.java | 477 ++ .../service/impl/UserTransferServiceImpl.java | 127 + .../mapper/system/SysClientMapper.xml | 7 + .../resources/mapper/system/SysDeptMapper.xml | 47 + .../mapper/system/SysDictDataMapper.xml | 7 + .../mapper/system/SysLogininforMapper.xml | 7 + .../mapper/system/SysOperLogMapper.xml | 7 + .../mapper/system/SysOssConfigMapper.xml | 7 + .../resources/mapper/system/SysOssMapper.xml | 5 + .../resources/mapper/system/SysPostMapper.xml | 29 + .../mapper/system/SysRoleDeptMapper.xml | 7 + .../resources/mapper/system/SysRoleMapper.xml | 62 + .../mapper/system/SysRoleMenuMapper.xml | 7 + .../mapper/system/SysSocialMapper.xml | 7 + .../resources/mapper/system/SysUserMapper.xml | 286 + .../mapper/system/SysUserRoleMapper.xml | 13 + ruoyi-modules/ruoyi-workflow/README.md | 3 + ruoyi-modules/ruoyi-workflow/pom.xml | 84 + .../workflow/common/ConditionalOnEnable.java | 14 + .../common/enums/MessageTypeEnum.java | 53 + .../common/enums/TaskAssigneeType.java | 49 + .../workflow/common/enums/TaskStatusEnum.java | 104 + .../workflow/config/WarmFlowConfig.java | 16 + .../controller/FlwCategoryController.java | 132 + .../controller/FlwDefinitionController.java | 194 + .../controller/FlwInstanceController.java | 157 + .../controller/FlwTaskController.java | 201 + .../controller/TestLeaveController.java | 108 + .../dromara/workflow/domain/TestLeave.java | 63 + .../workflow/domain/bo/BackProcessBo.java | 71 + .../workflow/domain/bo/CompleteTaskBo.java | 75 + .../workflow/domain/bo/FlowCategoryBo.java | 47 + .../workflow/domain/bo/FlowInstanceBo.java | 55 + .../workflow/domain/bo/FlowInvalidBo.java | 31 + .../workflow/domain/bo/FlowTaskBo.java | 55 + .../workflow/domain/bo/FlowTerminationBo.java | 31 + .../workflow/domain/bo/TaskOperationBo.java | 48 + .../workflow/domain/bo/TestLeaveBo.java | 79 + .../workflow/domain/vo/FlowCategoryVo.java | 67 + .../workflow/domain/vo/FlowDefinitionVo.java | 104 + .../workflow/domain/vo/FlowHisTaskVo.java | 244 + .../workflow/domain/vo/FlowInstanceVo.java | 137 + .../workflow/domain/vo/FlowTaskVo.java | 176 + .../workflow/domain/vo/TestLeaveVo.java | 70 + .../handler/FlowProcessEventHandler.java | 82 + .../handler/WorkflowPermissionHandler.java | 73 + .../workflow/mapper/FlwCategoryMapper.java | 60 + .../workflow/mapper/TestLeaveMapper.java | 15 + .../workflow/service/IFlwCategoryService.java | 102 + .../workflow/service/IFlwInstanceService.java | 159 + .../service/IFlwTaskAssigneeService.java | 22 + .../workflow/service/ITestLeaveService.java | 47 + .../impl/CategoryNameTranslationImpl.java | 37 + .../impl/FlwDefinitionServiceImpl.java | 266 + .../service/impl/FlwInstanceServiceImpl.java | 451 ++ .../service/impl/FlwTaskServiceImpl.java | 687 +++ .../service/impl/WorkflowServiceImpl.java | 132 + .../dromara/workflow/utils/WorkflowUtils.java | 206 + .../src/main/resources/mapper/package-info.md | 3 + .../mapper/workflow/FlwCategoryMapper.xml | 11 + .../mapper/workflow/FlwInstanceMapper.xml | 36 + .../mapper/workflow/FlwTaskMapper.xml | 115 + ruoyi-modules/ruoyi-zhishu/pom.xml | 407 ++ .../dromara/zhishu/aspect/CenterAspect.java | 90 + .../dromara/zhishu/aspect/GoodsAddAspect.java | 50 + .../zhishu/aspect/LogRecordAspect.java | 112 + .../org/dromara/zhishu/aspect/XcxAspect.java | 103 + .../zhishu/config/RestTemplateConfig.java | 17 + .../zhishu/config/SecondRedissonConfig.java | 126 + .../zhishu/controller/AccountController.java | 39 + .../controller/ArtNoMoveController.java | 13 + .../controller/BookBaseInfoController.java | 920 +++ .../zhishu/controller/CountController.java | 48 + .../controller/CourierLogController.java | 81 + .../controller/DepotOrderController.java | 642 ++ .../controller/ExcelTaskController.java | 294 + .../controller/FilterSetController.java | 189 + .../zhishu/controller/GoofishController.java | 34 + .../zhishu/controller/KongfzController.java | 209 + .../controller/LogisticsController.java | 64 + .../zhishu/controller/NewUserController.java | 125 + .../zhishu/controller/NoticeController.java | 129 + .../OrderExternalGoodsController.java | 433 ++ .../zhishu/controller/PddController.java | 1478 +++++ .../zhishu/controller/PddOrderContorller.java | 64 + .../controller/PrintTemplateController.java | 116 + .../zhishu/controller/PrinterController.java | 171 + .../zhishu/controller/ProductController.java | 72 + .../ProfitSharingLogController.java | 40 + .../controller/RunningLogFileController.java | 122 + .../zhishu/controller/ShopController.java | 691 +++ .../controller/ShopDetailController.java | 114 + .../ShopGoodsPublishedController.java | 224 + .../ShopGoodsPublishedLogController.java | 44 + .../ShopGoodsRejectionController.java | 206 + .../controller/SinglePrintController.java | 181 + .../SynchronizationShopLogController.java | 74 + .../zhishu/controller/TAuditController.java | 139 + .../controller/TBookAuditController.java | 115 + .../zhishu/controller/TDepotController.java | 174 + .../controller/TDistrictController.java | 209 + .../zhishu/controller/TFreightController.java | 148 + .../controller/TInviteCodeController.java | 120 + .../TInviteRelationsController.java | 113 + .../controller/TLogisticsController.java | 143 + .../zhishu/controller/TShelvesController.java | 188 + .../controller/TShopDepotAotuController.java | 52 + .../TShopOrderDetailController.java | 105 + .../zhishu/controller/TestController.java | 93 + .../controller/UserAccountController.java | 116 + .../zhishu/controller/UserInfoController.java | 25 + .../controller/UserRechargeController.java | 356 ++ .../controller/ViolationController.java | 221 + .../WarehouseSettingsController.java | 114 + .../controller/WaveDetailController.java | 79 + .../controller/WhiteListController.java | 141 + .../zhishu/controller/XcxController.java | 481 ++ .../zhishu/controller/XyBindController.java | 179 + .../controller/ZhishuShopGoodsController.java | 861 +++ .../ZhishuShopGoodsDetailController.java | 105 + .../converter/PriceDivideBy100Converter.java | 96 + .../zhishu/converter/QualityConverter.java | 70 + .../org/dromara/zhishu/domain/Account.java | 116 + .../org/dromara/zhishu/domain/ArtNoMove.java | 21 + .../zhishu/domain/BookBaseInfoPhp.java | 32 + .../org/dromara/zhishu/domain/CourierLog.java | 95 + .../org/dromara/zhishu/domain/DepotOrder.java | 57 + .../org/dromara/zhishu/domain/Employee.java | 47 + .../dromara/zhishu/domain/ErpGoodsOrder.java | 286 + .../org/dromara/zhishu/domain/ExcelTask.java | 77 + .../org/dromara/zhishu/domain/FastMail.java | 67 + .../dromara/zhishu/domain/GoodsAutoFail.java | 59 + .../org/dromara/zhishu/domain/GoodsDto.java | 36 + .../dromara/zhishu/domain/LicenseResult.java | 31 + .../zhishu/domain/LocalMultipartFile.java | 56 + .../org/dromara/zhishu/domain/Logistics.java | 127 + .../dromara/zhishu/domain/NewUserInfo.java | 102 + .../org/dromara/zhishu/domain/Notice.java | 56 + .../org/dromara/zhishu/domain/PddLoginVo.java | 58 + .../dromara/zhishu/domain/PriceTemplate.java | 76 + .../dromara/zhishu/domain/PrintTemplate.java | 55 + .../org/dromara/zhishu/domain/Printer.java | 67 + .../zhishu/domain/ProfitSharingLog.java | 111 + .../dromara/zhishu/domain/RunningTask.java | 91 + .../dromara/zhishu/domain/ShopContext.java | 52 + .../org/dromara/zhishu/domain/ShopDepot.java | 33 + .../org/dromara/zhishu/domain/ShopDetail.java | 291 + .../dromara/zhishu/domain/ShopGoodIsbn.java | 28 + .../dromara/zhishu/domain/SinglePrint.java | 98 + .../java/org/dromara/zhishu/domain/Spec.java | 97 + .../org/dromara/zhishu/domain/Statistic.java | 44 + .../org/dromara/zhishu/domain/SyncLog.java | 49 + .../zhishu/domain/SynchronizationShopLog.java | 110 + .../org/dromara/zhishu/domain/TAudit.java | 45 + .../org/dromara/zhishu/domain/TDistrict.java | 71 + .../org/dromara/zhishu/domain/TFreight.java | 72 + .../org/dromara/zhishu/domain/TShelves.java | 64 + .../dromara/zhishu/domain/TUserPlatform.java | 86 + .../java/org/dromara/zhishu/domain/Task.java | 78 + .../org/dromara/zhishu/domain/TaskPause.java | 23 + .../dromara/zhishu/domain/UserAccount.java | 67 + .../dromara/zhishu/domain/UserRecharge.java | 95 + .../org/dromara/zhishu/domain/Violation.java | 75 + .../zhishu/domain/WarehouseSettings.java | 87 + .../domain/WarehouseSettingsAttribute.java | 25 + .../java/org/dromara/zhishu/domain/Wave.java | 66 + .../org/dromara/zhishu/domain/WaveDetail.java | 76 + .../org/dromara/zhishu/domain/WhiteList.java | 47 + .../org/dromara/zhishu/domain/XyBind.java | 50 + .../org/dromara/zhishu/domain/XyCategory.java | 27 + .../zhishu/domain/ZhishuShopImages.java | 47 + .../zhishu/domain/bo/BatchUpdateCargoBo.java | 21 + .../zhishu/domain/bo/BookBaseInfoBo.java | 228 + .../zhishu/domain/bo/BookNumberRageBo.java | 15 + .../zhishu/domain/bo/BookUpdateInfoBo.java | 71 + .../zhishu/domain/bo/CourierLogBo.java | 80 + .../zhishu/domain/bo/EditBookInfoBo.java | 167 + .../domain/bo/EncryptionDataSingelBo.java | 31 + .../dromara/zhishu/domain/bo/FastMailBo.java | 60 + .../zhishu/domain/bo/GoodsAutoFailBo.java | 64 + .../zhishu/domain/bo/IllBaseInfoBo.java | 20 + .../dromara/zhishu/domain/bo/NewUserBo.java | 99 + .../dromara/zhishu/domain/bo/NoticeBo.java | 51 + .../zhishu/domain/bo/PriceTemplateBo.java | 68 + .../zhishu/domain/bo/PrintTemplateBo.java | 48 + .../dromara/zhishu/domain/bo/PrinterBo.java | 71 + .../zhishu/domain/bo/RunningLogFileBo.java | 55 + .../zhishu/domain/bo/RunningTaskBo.java | 60 + .../org/dromara/zhishu/domain/bo/ShopBo.java | 150 + .../zhishu/domain/bo/ShopContextBo.java | 45 + .../domain/bo/ShopGoodsPublishedBo.java | 91 + .../dromara/zhishu/domain/bo/ShopImgBo.java | 60 + .../zhishu/domain/bo/ShopWarehouseBo.java | 41 + .../zhishu/domain/bo/SinglePrintBo.java | 58 + .../dromara/zhishu/domain/bo/TAuditBo.java | 77 + .../dromara/zhishu/domain/bo/TDepotBo.java | 76 + .../dromara/zhishu/domain/bo/TFreightBo.java | 74 + .../zhishu/domain/bo/TInviteRelationsBo.java | 56 + .../dromara/zhishu/domain/bo/TShelvesBo.java | 73 + .../zhishu/domain/bo/TShopOrderDetailBo.java | 107 + .../zhishu/domain/bo/UserAccountBo.java | 60 + .../zhishu/domain/bo/UserTAuditBo.java | 115 + .../dromara/zhishu/domain/bo/ViolationBo.java | 68 + .../zhishu/domain/bo/WarehouseSettingsBo.java | 91 + .../zhishu/domain/bo/WaveDetailBo.java | 68 + .../dromara/zhishu/domain/bo/WhiteListBo.java | 40 + .../dromara/zhishu/domain/bo/XyBindBo.java | 40 + .../zhishu/domain/bo/XyCategoryBo.java | 27 + .../zhishu/domain/bo/ZhishuShopGoodsBo.java | 290 + .../domain/bo/ZhishuShopGoodsDetailBo.java | 70 + .../zhishu/domain/dto/BookBaseInfoDto.java | 31 + .../zhishu/domain/dto/BookPriceInfoDto.java | 43 + .../zhishu/domain/dto/ErpGoodsDto.java | 33 + .../zhishu/domain/dto/KongfzRequestDto.java | 21 + .../zhishu/domain/dto/KongfzShopDto.java | 28 + .../domain/dto/OrderExternalGoodsDto.java | 347 ++ .../zhishu/domain/dto/PddOrderQueryDto.java | 35 + .../zhishu/domain/dto/SuccessDataItemDto.java | 154 + .../zhishu/domain/dto/SuccessDataKfz.java | 136 + .../domain/dto/TShopGoodsPublishedDto.java | 62 + .../domain/dto/WaveDetailInsertDto.java | 39 + .../domain/dto/parcelInformationDto.java | 30 + .../CalculatePriceByTemplateRequest.java | 22 + .../DeleteSaleOutGoodsBatchRequest.java | 22 + .../request/ErpBaseShopPageGetRequest.java | 45 + .../request/ErpGoodsUpdateItemRequest.java | 38 + .../dto/request/GoodsComparisonRequest.java | 22 + .../dto/request/ImageProcessingRequest.java | 14 + .../dto/request/OperatingSoldOutRequest.java | 61 + .../dto/request/OrderDeliveryKWRequest.java | 33 + .../dto/request/OrderListByShopIdRequest.java | 19 + .../domain/dto/request/SoldOutRequest.java | 16 + .../dto/request/UpdateArtNoRequest.java | 38 + .../UpdateShopGoodsDataPriceCSVRequest.java | 59 + .../request/UpdateShopGoodsPriceRequest.java | 52 + .../dto/request/UpdateTokenRequest.java | 56 + .../dto/response/AddTaskLogResponse.java | 18 + .../CalculatePriceByTemplateResponse.java | 34 + .../response/ErpBaseShopPageGetResponse.java | 42 + .../ErpGoodsQueryOlnGoodsResponse.java | 81 + .../dto/response/GetBookByISBNResponse.java | 106 + .../response/GetShopGoodsListResponse.java | 437 ++ .../dto/response/GetWlnShopListResponse.java | 19 + .../dto/response/LogisticsMethodResponse.java | 23 + .../domain/dto/response/PddTokenResponse.java | 13 + .../dto/response/UpdateSkuPriceResponse.java | 22 + .../domain/dto/response/WlnBaseResponse.java | 18 + .../zhishu/domain/vo/AuthorPressVo.java | 9 + .../zhishu/domain/vo/BaseInfoPricingVo.java | 37 + .../zhishu/domain/vo/BookEditPriceVo.java | 36 + .../zhishu/domain/vo/BookEditStockVo.java | 34 + .../org/dromara/zhishu/domain/vo/BookPic.java | 29 + .../org/dromara/zhishu/domain/vo/BookVo.java | 42 + .../zhishu/domain/vo/DepotOrderVo.java | 448 ++ .../dromara/zhishu/domain/vo/DistrictsVo.java | 42 + .../zhishu/domain/vo/EmployeeInfoVo.java | 78 + .../dromara/zhishu/domain/vo/EmployeeVo.java | 53 + .../dromara/zhishu/domain/vo/ExcelTaskVo.java | 90 + .../dromara/zhishu/domain/vo/FastMailVo.java | 98 + .../org/dromara/zhishu/domain/vo/FilesVo.java | 11 + .../dromara/zhishu/domain/vo/FilterSetVo.java | 84 + .../zhishu/domain/vo/GoodsAutoFailVo.java | 90 + .../zhishu/domain/vo/GoodsItemKfzVo.java | 42 + .../zhishu/domain/vo/InviteCodeVo.java | 54 + .../dromara/zhishu/domain/vo/ItemListVo.java | 29 + .../dromara/zhishu/domain/vo/KongfzVo.java | 29 + .../dromara/zhishu/domain/vo/LogisticsVo.java | 111 + .../dromara/zhishu/domain/vo/NewUserVo.java | 66 + .../domain/vo/OperatingInventoryVo.java | 103 + .../dromara/zhishu/domain/vo/OrderItemVo.java | 37 + .../zhishu/domain/vo/PlatformIdUpdateVO.java | 13 + .../zhishu/domain/vo/PriceTemplateVo.java | 84 + .../zhishu/domain/vo/PrintTemplateVo.java | 69 + .../dromara/zhishu/domain/vo/PrinterVo.java | 76 + .../dromara/zhishu/domain/vo/ProductForm.java | 137 + .../domain/vo/ProductSubmitResultVo.java | 50 + .../dromara/zhishu/domain/vo/ProductVo.java | 34 + .../zhishu/domain/vo/RunningLogFileVo.java | 69 + .../zhishu/domain/vo/RunningTaskNumVo.java | 31 + .../zhishu/domain/vo/ShopDetailVo.java | 361 ++ .../zhishu/domain/vo/ShopGoodIsbnVo.java | 11 + .../org/dromara/zhishu/domain/vo/ShopVo.java | 200 + .../zhishu/domain/vo/ShopWarehouseVo.java | 51 + .../org/dromara/zhishu/domain/vo/SpecVo.java | 111 + .../dromara/zhishu/domain/vo/StatisticVo.java | 58 + .../zhishu/domain/vo/StockChangeLogVo.java | 61 + .../domain/vo/SynchronizationShopLogVo.java | 98 + .../dromara/zhishu/domain/vo/TAuditVo.java | 145 + .../dromara/zhishu/domain/vo/TDepotVo.java | 138 + .../dromara/zhishu/domain/vo/TDistrictVo.java | 63 + .../zhishu/domain/vo/TInviteRelationsVo.java | 64 + .../zhishu/domain/vo/TLogisticsVo.java | 141 + .../dromara/zhishu/domain/vo/TShelvesVo.java | 101 + .../zhishu/domain/vo/TShopDepotAotuVo.java | 41 + .../domain/vo/TShopMessageSubscribeVo.java | 55 + .../zhishu/domain/vo/TShopOrderDetailVo.java | 117 + .../dromara/zhishu/domain/vo/TaskUrlVo.java | 37 + .../org/dromara/zhishu/domain/vo/TaskVo.java | 114 + .../zhishu/domain/vo/UserRechargeVo.java | 110 + .../dromara/zhishu/domain/vo/ViolationVo.java | 83 + .../zhishu/domain/vo/WaveDetailVo.java | 80 + .../org/dromara/zhishu/domain/vo/WaveVo.java | 80 + .../dromara/zhishu/domain/vo/WhiteListVo.java | 51 + .../zhishu/domain/vo/XyCategoryVo.java | 32 + .../domain/vo/ZhishuShopGoodsDetailVo.java | 87 + .../zhishu/domain/vo/ZhishuShopGoodsVo.java | 224 + .../zhishu/domain/vo/updateOcrResult.java | 26 + .../zhishu/enums/IsJoinDistributionEnum.java | 45 + .../enums/OperationInventoryTypeEnum.java | 48 + .../zhishu/enums/OrderSourceTypeEnum.java | 48 + .../zhishu/enums/PddOrderDetailEnum.java | 26 + .../dromara/zhishu/enums/PddOrderEnum.java | 100 + .../zhishu/enums/TaskStatusTypeEnum.java | 52 + .../dromara/zhishu/enums/TaskTypeEnum.java | 47 + .../zhishu/listener/StartupListener.java | 65 + .../zhishu/manager/TaskExecutorManager.java | 37 + .../zhishu/mapper/BookBaseInfoMapper.java | 53 + .../dromara/zhishu/mapper/CountMapper.java | 18 + .../zhishu/mapper/DepotOrderMapper.java | 26 + .../zhishu/mapper/ExcelTaskMapper.java | 26 + .../dromara/zhishu/mapper/FastMailMapper.java | 25 + .../zhishu/mapper/FilterSetMapper.java | 35 + .../zhishu/mapper/GoodsAutoFailMapper.java | 24 + .../zhishu/mapper/LogisticsMapper.java | 30 + .../zhishu/mapper/NewUserBoMapper.java | 24 + .../dromara/zhishu/mapper/NoticeMapper.java | 15 + .../zhishu/mapper/PrintTemplateMapper.java | 30 + .../zhishu/mapper/RunningLogFileMapper.java | 18 + .../mapper/RunningTaskByShopMapper.java | 234 + .../zhishu/mapper/RunningTaskMapper.java | 89 + .../zhishu/mapper/ShopDepotMapper.java | 26 + .../zhishu/mapper/ShopDetailMapper.java | 23 + .../zhishu/mapper/ShopGoodsMapper.java | 235 + .../mapper/ShopGoodsPublishedLogMapper.java | 13 + .../mapper/ShopGoodsPublishedMapper.java | 68 + .../mapper/ShopGoodsRejectionMapper.java | 60 + .../dromara/zhishu/mapper/ShopImgMapper.java | 23 + .../mapper/ShopWarehouseAutoMapper.java | 58 + .../zhishu/mapper/ShopWarehouseMapper.java | 55 + .../org/dromara/zhishu/mapper/SpecMapper.java | 19 + .../dromara/zhishu/mapper/TAuditMapper.java | 43 + .../dromara/zhishu/mapper/TFreightMapper.java | 79 + .../zhishu/mapper/TInviteCodeMapper.java | 54 + .../zhishu/mapper/TInviteRelationMapper.java | 10 + .../zhishu/mapper/TInviteRelationsMapper.java | 19 + .../zhishu/mapper/TLogisticsMapper.java | 45 + .../dromara/zhishu/mapper/TShelvesMapper.java | 97 + .../org/dromara/zhishu/mapper/TaskMapper.java | 55 + .../zhishu/mapper/UserRechargeMapper.java | 42 + .../zhishu/mapper/UserTAuditMapper.java | 44 + .../zhishu/mapper/ViolationMapper.java | 15 + .../org/dromara/zhishu/mapper/WaveMapper.java | 19 + .../zhishu/mapper/WhiteListMapper.java | 22 + .../dromara/zhishu/mapper/XyBindMapper.java | 12 + .../mapper/ZhishuShopGoodsDetailMapper.java | 16 + .../zhishu/mapper/ZhishuShopGoodsMapper.java | 191 + .../dromara/zhishu/service/CountService.java | 7 + .../zhishu/service/EmployeeService.java | 15 + .../zhishu/service/IAccountService.java | 18 + .../zhishu/service/IArtNoMoveService.java | 4 + .../zhishu/service/IBookBaseInfoService.java | 136 + .../zhishu/service/ICourierLogService.java | 54 + .../zhishu/service/IFilterSetService.java | 76 + .../zhishu/service/IGoofishService.java | 25 + .../service/IOrderExternalGoodsService.java | 42 + .../dromara/zhishu/service/IPddService.java | 99 + .../zhishu/service/IPriceTemplateService.java | 74 + .../zhishu/service/IPrintTemplateService.java | 68 + .../zhishu/service/IPrinterService.java | 68 + .../service/IProfitSharingLogService.java | 18 + .../service/IRunningLogFileService.java | 75 + .../service/IRunningTaskByShopService.java | 137 + .../zhishu/service/IShopContextService.java | 70 + .../zhishu/service/IShopDetailService.java | 86 + .../zhishu/service/IShopImgService.java | 84 + .../service/IShopWarehouseAutoService.java | 64 + .../zhishu/service/IShopWarehouseService.java | 59 + .../dromara/zhishu/service/ISpecService.java | 70 + .../zhishu/service/ISyncLogService.java | 54 + .../ISynchronizationShopLogService.java | 44 + .../zhishu/service/ITAuditService.java | 72 + .../zhishu/service/ITBookAuditService.java | 70 + .../zhishu/service/ITDistrictService.java | 82 + .../zhishu/service/ITFreightService.java | 96 + .../zhishu/service/ITInviteCodeService.java | 65 + .../service/ITInviteRelationsService.java | 15 + .../zhishu/service/ITShelvesService.java | 79 + .../service/ITShopDepotAotuService.java | 43 + .../zhishu/service/ITUserPlatformService.java | 8 + .../zhishu/service/ITaskPauseService.java | 20 + .../zhishu/service/IUserAccountService.java | 75 + .../zhishu/service/IUserRechargeService.java | 88 + .../zhishu/service/IViolationService.java | 68 + .../service/IWarehouseSettingsService.java | 76 + .../zhishu/service/IWaveDetailService.java | 30 + .../dromara/zhishu/service/IWaveService.java | 13 + .../zhishu/service/IWhiteListService.java | 77 + .../zhishu/service/IXyBindService.java | 14 + .../zhishu/service/IXyCategoryService.java | 12 + .../IZhishuShopGoodsDetailService.java | 77 + .../service/IZhishuShopGoodsService.java | 292 + .../service/IZhishuShopImagesService.java | 72 + .../zhishu/service/LogisticsService.java | 18 + .../zhishu/service/PddRequestService.java | 8 + .../service/ShopGoodsPublishedLogService.java | 20 + .../zhishu/service/SignGeneratorService.java | 5 + .../service/TShopMessageSubscribeService.java | 10 + .../service/ZhishuShopGoodsAopService.java | 38 + .../zhishu/service/client/KfzClient.java | 77 + .../zhishu/service/client/PddClient.java | 66 + .../zhishu/service/client/WlnClient.java | 54 + .../InventorySynchronizedStrategyFactory.java | 40 + .../service/factory/ShopGoodsFactory.java | 38 + .../service/impl/ArtNoMoveServiceImpl.java | 8 + .../zhishu/service/impl/CountServiceImpl.java | 33 + .../service/impl/CourierLogServiceImpl.java | 111 + .../service/impl/DepotOrderServiceImpl.java | 157 + .../service/impl/EmployeeServiceImpl.java | 54 + .../service/impl/FastMailServiceImpl.java | 341 ++ .../service/impl/FilterSetServiceImpl.java | 203 + .../service/impl/GoofishServiceImpl.java | 258 + .../service/impl/KongfzItemService.java | 128 + .../service/impl/KongfzServiceImpl.java | 328 ++ .../service/impl/LogisticsServiceImpl.java | 139 + .../service/impl/NewUserServiceImpl.java | 51 + .../service/impl/NoticeServiceImpl.java | 135 + .../zhishu/service/impl/PddServiceImpl.java | 996 ++++ .../impl/PrintTemplateServiceImpl.java | 149 + .../service/impl/ProductServiceImpl.java | 241 + .../impl/RunningLogFileServiceImpl.java | 139 + .../impl/RunningTaskByShopServiceImpl.java | 568 ++ .../service/impl/RunningTaskServiceImpl.java | 200 + .../service/impl/ShopContextServiceImpl.java | 137 + .../service/impl/ShopDetailServiceImpl.java | 362 ++ .../ShopGoodsPublishedLogServiceImpl.java | 34 + .../impl/ShopGoodsRejectionServiceImpl.java | 100 + .../impl/ShopWarehouseServiceImpl.java | 93 + .../impl/SignGeneratorServiceImpl.java | 43 + .../zhishu/service/impl/SpecServiceImpl.java | 246 + .../impl/StockChangeLogServiceImpl.java | 21 + .../service/impl/TAuditServiceImpl.java | 233 + .../service/impl/TBookAuditServiceImpl.java | 159 + .../service/impl/TDepotServiceImpl.java | 384 ++ .../service/impl/TDistrictServiceImpl.java | 235 + .../service/impl/TFreightServiceImpl.java | 382 ++ .../service/impl/TInviteCodeServiceImpl.java | 200 + .../impl/TInviteRelationsServiceImpl.java | 32 + .../service/impl/TLogisticsServiceImpl.java | 225 + .../impl/TShopDepotAotuServiceImpl.java | 68 + .../impl/TShopGoodsPublishedServiceImpl.java | 279 + .../TShopMessageSubscribeServiceImpl.java | 57 + .../impl/TShopOrderDetailServiceImpl.java | 211 + .../impl/TUserPlatformServiceImpl.java | 21 + .../zhishu/service/impl/TaskServiceImpl.java | 1175 ++++ .../service/impl/UserAccountServiceImpl.java | 154 + .../service/impl/UserRechargeServiceImpl.java | 270 + .../service/impl/UserTAuditServiceImpl.java | 214 + ...WarehouseSettingsAttributeServiceImpl.java | 32 + .../impl/WarehouseSettingsServiceImpl.java | 144 + .../service/impl/WaveDetailServiceImpl.java | 155 + .../service/impl/XianYvQueryShopImpl.java | 111 + .../service/impl/XyBindServiceImpl.java | 125 + .../service/impl/XyCategoryServiceImpl.java | 23 + .../impl/ZhishuShopGoodsAopServiceImpl.java | 180 + .../ZhishuShopGoodsDetailServiceImpl.java | 142 + .../impl/ZhishuShopGoodsServiceImpl.java | 5205 +++++++++++++++++ .../impl/ZhishuShopImagesServiceImpl.java | 137 + .../InventorySynchronizedGFtrategy.java | 56 + .../InventorySynchronizedKWStrategy.java | 58 + .../ItemListJsonStringParseGFStrategy.java | 15 + .../ItemListJsonStringParseKWStrategy.java | 15 + .../ItemListJsonStringParseStrategy.java | 9 + .../service/strategy/OrderGFStrategy.java | 44 + .../service/strategy/OrderKWStrategy.java | 57 + .../service/strategy/OrderPddStrategy.java | 43 + .../service/strategy/OrderStrategy.java | 16 + .../strategy/ShopGoodsWlnStrategy.java | 253 + .../org/dromara/zhishu/util/ArtNoUtil.java | 99 + .../org/dromara/zhishu/util/Base64Utils.java | 56 + .../org/dromara/zhishu/util/CnumberUtils.java | 804 +++ .../org/dromara/zhishu/util/ContentUtils.java | 104 + .../org/dromara/zhishu/util/CountUtils.java | 23 + .../org/dromara/zhishu/util/CsvUtils.java | 215 + .../dromara/zhishu/util/DateUtilsUtils.java | 102 + .../org/dromara/zhishu/util/DecryptUtils.java | 247 + .../dromara/zhishu/util/EasyExcelUtil.java | 700 +++ ...vironmentVariableCredentialsProvider2.java | 34 + .../zhishu/util/ExcelFileHandlerUtil.java | 462 ++ .../zhishu/util/ExpressCompanyDetector.java | 378 ++ .../org/dromara/zhishu/util/FileUtil.java | 233 + .../org/dromara/zhishu/util/ImageUtils.java | 172 + .../zhishu/util/JsonExporterUtils.java | 49 + .../dromara/zhishu/util/KongfzApiUtils.java | 85 + .../org/dromara/zhishu/util/ListUtils.java | 34 + .../org/dromara/zhishu/util/LoginUtils.java | 31 + .../org/dromara/zhishu/util/NewTaskUtils.java | 22 + .../java/org/dromara/zhishu/util/OcrUtil.java | 42 + .../dromara/zhishu/util/PddResultUtil.java | 16 + .../dromara/zhishu/util/PricingUrlUtil.java | 181 + .../dromara/zhishu/util/RunningLogUtils.java | 134 + .../org/dromara/zhishu/util/TaskRunnable.java | 62 + .../dromara/zhishu/util/ThreadPoolUtils.java | 74 + .../org/dromara/zhishu/util/UploadUtil.java | 358 ++ .../org/dromara/zhishu/util/WxPayUtil.java | 411 ++ .../src/main/resources/BookParamsEnum.java | 50 + .../resources/lib/pop-sdk-1.19.52-all.jar | Bin 0 -> 7369755 bytes .../src/main/resources/mapper/package-info.md | 3 + .../mapper/zhishu/BookBaseInfoMapper.xml | 47 + .../resources/mapper/zhishu/CountMapper.xml | 20 + .../mapper/zhishu/DepotOrderMapper.xml | 219 + .../mapper/zhishu/ExcelTaskMapper.xml | 18 + .../mapper/zhishu/FastMailMapper.xml | 16 + .../mapper/zhishu/FilterSetMapper.xml | 31 + .../mapper/zhishu/GoodsAutoFailMapper.xml | 84 + .../resources/mapper/zhishu/NoticeMapper.xml | 7 + .../mapper/zhishu/PriceTemplateMapper.xml | 11 + .../resources/mapper/zhishu/PrinterMapper.xml | 7 + .../mapper/zhishu/RunningLogFileMapper.xml | 10 + .../mapper/zhishu/RunningTaskMapper.xml | 264 + .../mapper/zhishu/ShopContextMapper.xml | 10 + .../mapper/zhishu/ShopDetailMapper.xml | 23 + .../mapper/zhishu/ShopGoodIsbnMapper.xml | 8 + .../zhishu/ShopGoodsPublishedLogMapper.xml | 7 + .../zhishu/ShopGoodsPublishedMapper.xml | 191 + .../zhishu/ShopGoodsRejectionMapper.xml | 110 + .../resources/mapper/zhishu/ShopImgMapper.xml | 15 + .../mapper/zhishu/ShopWarehouseMapper.xml | 57 + .../resources/mapper/zhishu/TAuditMapper.xml | 102 + .../mapper/zhishu/TBookAuditMapper.xml | 21 + .../mapper/zhishu/TDistrictMapper.xml | 51 + .../mapper/zhishu/TFreightMapper.xml | 175 + .../mapper/zhishu/TInviteCodeMapper.xml | 53 + .../mapper/zhishu/TInviteRelationMapper.xml | 15 + .../mapper/zhishu/TInviteRelationsMapper.xml | 25 + .../mapper/zhishu/TLogisticsMapper.xml | 83 + .../mapper/zhishu/TShopDepotAotuMapper.xml | 108 + .../zhishu/TShopGoodsPublishedMapper.xml | 201 + .../zhishu/TShopMessageSubscribeMapper.xml | 7 + .../mapper/zhishu/TShopOrderMapper.xml | 115 + .../mapper/zhishu/TUserPlatformMapper.xml | 35 + .../resources/mapper/zhishu/TaskMapper.xml | 66 + .../mapper/zhishu/UserAccountMapper.xml | 7 + .../mapper/zhishu/UserRechargeMapper.xml | 7 + .../mapper/zhishu/WaveDetailMapper.xml | 180 + .../resources/mapper/zhishu/WaveMapper.xml | 21 + .../mapper/zhishu/WhiteListMapper.xml | 18 + .../mapper/zhishu/XyCategoryMapper.xml | 22 + .../main/resources/mapper/zhishu/XyMapper.xml | 7 + .../zhishu/ZhishuShopGoodsDetailMapper.xml | 10 + .../preview/韵达快递单pdf_base64.txt | 1 + script/bin/ry.bat | 68 + script/bin/ry.sh | 86 + script/docker/database.yml | 59 + script/docker/docker-compose.yml | 154 + script/docker/nginx/conf/nginx.conf | 115 + script/docker/redis/data/README.md | 1 + script/leave/leave2.json | 111 + script/leave/leave3.json | 121 + script/leave/leave4.json | 90 + script/leave/leave5.json | 121 + script/sql/oracle/oracle_ry_job.sql | 914 +++ script/sql/oracle/oracle_ry_vue_5.X.sql | 1391 +++++ script/sql/oracle/oracle_ry_workflow.sql | 414 ++ script/sql/postgres/postgres_ry_job.sql | 845 +++ script/sql/postgres/postgres_ry_vue_5.X.sql | 1383 +++++ script/sql/postgres/postgres_ry_workflow.sql | 405 ++ script/sql/ry_vue_5.X.sql | 962 +++ script/sql/ry_workflow.sql | 253 + script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 3607 ++++++++++++ .../sql/sqlserver/sqlserver_ry_workflow.sql | 1336 +++++ script/sql/update/oracle/update_5.0-5.1.sql | 151 + .../sql/update/oracle/update_5.1.0-5.1.1.sql | 5 + script/sql/update/postgres/update_5.0-5.1.sql | 150 + .../update/postgres/update_5.1.0-5.1.1.sql | 5 + .../update/postgres/update_5.1.1-5.1.2.sql | 5 + .../update/postgres/update_5.1.2-5.2.0.sql | 9 + .../sql/update/sqlserver/update_5.0-5.1.sql | 409 ++ .../update/sqlserver/update_5.1.1-5.1.2.sql | 10 + .../update/sqlserver/update_5.1.2-5.2.0.sql | 29 + script/sql/update/update_5.0-5.1.sql | 101 + script/sql/update/update_5.1.0-5.1.1.sql | 3 + script/sql/update/update_5.1.1-5.1.2.sql | 5 + script/sql/update/update_5.1.2-5.2.0.sql | 5 + .../stock_sync_log_2025-12-01.txt | 9 + .../stock_sync_log_2026-01-16.txt | 36 + .../stock_sync_log_2026-05-01.txt | 9 + 1030 files changed, 114289 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 file/log/centerBooksAdd_1916358871501082626_1.txt create mode 100644 file/log/centerBooksAdd_1965254774327533570_4.txt create mode 100644 file/log/centerBooksAdd_1967112570379649025_440.txt create mode 100644 file/log/centerBooksAdd_1983373997176135681_33.txt create mode 100644 file/log/centerBooksAdd_1_1.txt create mode 100644 pom.xml create mode 100644 ruoyi-admin/Dockerfile create mode 100644 ruoyi-admin/pom.xml create mode 100644 ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/domain/vo/WxLoginVo.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/domain/vo/dto/WxRegisterDTO.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java create mode 100644 ruoyi-admin/src/main/resources/application-dev.yml create mode 100644 ruoyi-admin/src/main/resources/application.yml create mode 100644 ruoyi-admin/src/main/resources/i18n/messages.properties create mode 100644 ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties create mode 100644 ruoyi-admin/src/main/resources/mapper/zhishu/BookBaseInfoMapper.xml create mode 100644 ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java create mode 100644 ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java create mode 100644 ruoyi-admin/zhFonts/.uuid create mode 100644 ruoyi-admin/zhFonts/fonts.dir create mode 100644 ruoyi-common/pom.xml create mode 100644 ruoyi-common/ruoyi-common-bom/pom.xml create mode 100644 ruoyi-common/ruoyi-common-core/pom.xml create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ZhishuConfig.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/InterfaceLoginBody.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java create mode 100644 ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java create mode 100644 ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java create mode 100644 ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java create mode 100644 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java create mode 100644 ruoyi-common/ruoyi-common-excel/pom.xml create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/annotation/EnableExcelComment.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/EmptyListTipHandler.java create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/TipRowWriteHandler.java create mode 100644 ruoyi-common/ruoyi-common-idempotent/pom.xml create mode 100644 ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java create mode 100644 ruoyi-common/ruoyi-common-job/pom.xml create mode 100644 ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java create mode 100644 ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java create mode 100644 ruoyi-common/ruoyi-common-log/pom.xml create mode 100644 ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java create mode 100644 ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java create mode 100644 ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java create mode 100644 ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java create mode 100644 ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java create mode 100644 ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/pom.xml create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties create mode 100644 ruoyi-common/ruoyi-common-oss/pom.xml create mode 100644 ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java create mode 100644 ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/exception/OssException.java create mode 100644 ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java create mode 100644 ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java create mode 100644 ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/config/RateLimiterConfig.java create mode 100644 ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/enums/LimitType.java create mode 100644 ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-ratelimiter/src/main/resources/spel-extension.json create mode 100644 ruoyi-common/ruoyi-common-redis/pom.xml create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/CacheConfig.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java create mode 100644 ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-satoken/pom.xml create mode 100644 ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java create mode 100644 ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java create mode 100644 ruoyi-common/ruoyi-common-satoken/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml create mode 100644 ruoyi-common/ruoyi-common-security/pom.xml create mode 100644 ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/handler/AllUrlHandler.java create mode 100644 ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-sensitive/pom.xml create mode 100644 ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java create mode 100644 ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java create mode 100644 ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java create mode 100644 ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java create mode 100644 ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/utils/ImageUtils.java create mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java create mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java create mode 100644 ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/handler/SmsExceptionHandler.java create mode 100644 ruoyi-common/ruoyi-common-social/pom.xml create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamSource.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java create mode 100644 ruoyi-common/ruoyi-common-sse/pom.xml create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/config/SseProperties.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/dto/SseMessageDto.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java create mode 100644 ruoyi-common/ruoyi-common-sse/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-tenant/pom.xml create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/exception/TenantException.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/manager/TenantSpringCacheManager.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/properties/TenantProperties.java create mode 100644 ruoyi-common/ruoyi-common-translation/pom.xml create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/DictTypeTranslationImpl.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/NicknameTranslationImpl.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java create mode 100644 ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java create mode 100644 ruoyi-common/ruoyi-common-web/pom.xml create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/I18nConfig.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/I18nLocaleResolver.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/enums/CaptchaType.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatableFilter.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/RepeatedlyRequestWrapper.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java create mode 100644 ruoyi-common/ruoyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/WebSocketConfig.java create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/config/properties/WebSocketProperties.java create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/constant/WebSocketConstants.java create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/dto/WebSocketMessageDto.java create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/holder/WebSocketSessionHolder.java create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java create mode 100644 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java create mode 100644 ruoyi-extend/pom.xml create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/java/org/dromara/monitor/admin/config/AdminServerConfig.java create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application.yml create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/resources/banner.txt create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/resources/logback-plus.xml create mode 100644 ruoyi-extend/ruoyi-snailjob-server/Dockerfile create mode 100644 ruoyi-extend/ruoyi-snailjob-server/pom.xml create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/SecurityConfig.java create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/java/org/dromara/snailjob/SnailJobServerApplication.java create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application.yml create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/banner.txt create mode 100644 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/pom.xml create mode 100644 ruoyi-modules/ruoyi-demo/pom.xml create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisRateLimiterController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/WeSocketController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/excel/单列表.xlsx create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 ruoyi-modules/ruoyi-job/pom.xml create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/domains/ShopOrderVO.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/mapper/ShopOrderDetailMapper.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/impl/PddServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/CatsGetJobExecutor.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/GetOrderNowJobExecutor.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserBalanceController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IUserTransferService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/UserTransferServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 ruoyi-modules/ruoyi-workflow/README.md create mode 100644 ruoyi-modules/ruoyi-workflow/pom.xml create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/pom.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/CenterAspect.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/GoodsAddAspect.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/LogRecordAspect.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/XcxAspect.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/RestTemplateConfig.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/SecondRedissonConfig.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/AccountController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ArtNoMoveController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/BookBaseInfoController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CountController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CourierLogController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/DepotOrderController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ExcelTaskController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/FilterSetController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/GoofishController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/KongfzController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/LogisticsController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NewUserController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NoticeController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/OrderExternalGoodsController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddOrderContorller.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrintTemplateController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrinterController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProductController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProfitSharingLogController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/RunningLogFileController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopDetailController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedLogController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsRejectionController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SinglePrintController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SynchronizationShopLogController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TAuditController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TBookAuditController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDepotController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDistrictController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TFreightController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteCodeController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteRelationsController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TLogisticsController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShelvesController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopDepotAotuController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopOrderDetailController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TestController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserAccountController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserInfoController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserRechargeController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ViolationController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WarehouseSettingsController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WaveDetailController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WhiteListController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XcxController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XyBindController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsDetailController.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/PriceDivideBy100Converter.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/QualityConverter.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Account.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ArtNoMove.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/BookBaseInfoPhp.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/CourierLog.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/DepotOrder.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Employee.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ErpGoodsOrder.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ExcelTask.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/FastMail.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsAutoFail.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LicenseResult.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LocalMultipartFile.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Logistics.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/NewUserInfo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Notice.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PddLoginVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PriceTemplate.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PrintTemplate.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Printer.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ProfitSharingLog.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/RunningTask.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopContext.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDepot.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDetail.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopGoodIsbn.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SinglePrint.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Spec.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Statistic.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SyncLog.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SynchronizationShopLog.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TAudit.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TDistrict.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TFreight.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TShelves.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TUserPlatform.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Task.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TaskPause.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserAccount.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserRecharge.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Violation.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettings.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettingsAttribute.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Wave.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WaveDetail.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WhiteList.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyBind.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyCategory.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ZhishuShopImages.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BatchUpdateCargoBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookBaseInfoBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookNumberRageBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookUpdateInfoBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/CourierLogBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EditBookInfoBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EncryptionDataSingelBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/FastMailBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/GoodsAutoFailBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/IllBaseInfoBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NewUserBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NoticeBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PriceTemplateBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrintTemplateBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrinterBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningLogFileBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningTaskBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopContextBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopGoodsPublishedBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopImgBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopWarehouseBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/SinglePrintBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TAuditBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TDepotBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TFreightBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TInviteRelationsBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShelvesBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShopOrderDetailBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserAccountBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserTAuditBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ViolationBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WarehouseSettingsBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WaveDetailBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WhiteListBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyBindBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyCategoryBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsDetailBo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookBaseInfoDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookPriceInfoDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/ErpGoodsDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzRequestDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzShopDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/OrderExternalGoodsDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/PddOrderQueryDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataItemDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataKfz.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/TShopGoodsPublishedDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/WaveDetailInsertDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/parcelInformationDto.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/CalculatePriceByTemplateRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/DeleteSaleOutGoodsBatchRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpBaseShopPageGetRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpGoodsUpdateItemRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/GoodsComparisonRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ImageProcessingRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OperatingSoldOutRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderDeliveryKWRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderListByShopIdRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/SoldOutRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateArtNoRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsDataPriceCSVRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsPriceRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateTokenRequest.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/AddTaskLogResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/CalculatePriceByTemplateResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpBaseShopPageGetResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpGoodsQueryOlnGoodsResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetBookByISBNResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetShopGoodsListResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetWlnShopListResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/LogisticsMethodResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/PddTokenResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/UpdateSkuPriceResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/WlnBaseResponse.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/AuthorPressVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BaseInfoPricingVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditPriceVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditStockVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookPic.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DepotOrderVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DistrictsVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeInfoVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ExcelTaskVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FastMailVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilesVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilterSetVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsAutoFailVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsItemKfzVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/InviteCodeVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ItemListVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/KongfzVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/LogisticsVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/NewUserVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OperatingInventoryVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OrderItemVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PlatformIdUpdateVO.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PriceTemplateVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrintTemplateVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrinterVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductForm.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductSubmitResultVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningLogFileVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningTaskNumVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopDetailVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopGoodIsbnVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopWarehouseVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SpecVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StatisticVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StockChangeLogVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SynchronizationShopLogVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TAuditVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDepotVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDistrictVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TInviteRelationsVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TLogisticsVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShelvesVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopDepotAotuVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopMessageSubscribeVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopOrderDetailVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskUrlVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/UserRechargeVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ViolationVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveDetailVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WhiteListVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/XyCategoryVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsDetailVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsVo.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/updateOcrResult.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/IsJoinDistributionEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OperationInventoryTypeEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OrderSourceTypeEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderDetailEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskStatusTypeEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskTypeEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/listener/StartupListener.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/manager/TaskExecutorManager.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/BookBaseInfoMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/CountMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/DepotOrderMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ExcelTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FastMailMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FilterSetMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/GoodsAutoFailMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/LogisticsMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NewUserBoMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NoticeMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/PrintTemplateMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningLogFileMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskByShopMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDepotMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDetailMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedLogMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsRejectionMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopImgMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseAutoMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/SpecMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TAuditMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TFreightMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteCodeMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationsMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TLogisticsMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TShelvesMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TaskMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserRechargeMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserTAuditMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ViolationMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WaveMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WhiteListMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/XyBindMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsDetailMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsMapper.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/CountService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/EmployeeService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IAccountService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IArtNoMoveService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IBookBaseInfoService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ICourierLogService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IFilterSetService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IGoofishService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IOrderExternalGoodsService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPddService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPriceTemplateService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrintTemplateService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrinterService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IProfitSharingLogService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningLogFileService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningTaskByShopService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopContextService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopDetailService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopImgService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseAutoService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISpecService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISyncLogService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISynchronizationShopLogService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITAuditService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITBookAuditService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITDistrictService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITFreightService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteCodeService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteRelationsService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShelvesService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShopDepotAotuService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITUserPlatformService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITaskPauseService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserAccountService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserRechargeService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IViolationService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWarehouseSettingsService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveDetailService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWhiteListService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyBindService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyCategoryService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsDetailService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopImagesService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/LogisticsService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/PddRequestService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ShopGoodsPublishedLogService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/SignGeneratorService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/TShopMessageSubscribeService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ZhishuShopGoodsAopService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/KfzClient.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/PddClient.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/WlnClient.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/InventorySynchronizedStrategyFactory.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/ShopGoodsFactory.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ArtNoMoveServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CourierLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/DepotOrderServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/EmployeeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FastMailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FilterSetServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/GoofishServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzItemService.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/LogisticsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NewUserServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NoticeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PddServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PrintTemplateServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ProductServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningLogFileServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskByShopServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopContextServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsPublishedLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsRejectionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopWarehouseServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SignGeneratorServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SpecServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/StockChangeLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TAuditServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TBookAuditServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDepotServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDistrictServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TFreightServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteCodeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteRelationsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TLogisticsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopDepotAotuServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopGoodsPublishedServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopMessageSubscribeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopOrderDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TUserPlatformServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TaskServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserRechargeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserTAuditServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsAttributeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WaveDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XianYvQueryShopImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyBindServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyCategoryServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsAopServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopImagesServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedGFtrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedKWStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseGFStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseKWStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderGFStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderKWStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderPddStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ShopGoodsWlnStrategy.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ArtNoUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/Base64Utils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/CnumberUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ContentUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/CountUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/CsvUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DateUtilsUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DecryptUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EasyExcelUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EnvironmentVariableCredentialsProvider2.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExcelFileHandlerUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExpressCompanyDetector.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/FileUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ImageUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/JsonExporterUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/KongfzApiUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ListUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/LoginUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/NewTaskUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/OcrUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PddResultUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PricingUrlUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/RunningLogUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/TaskRunnable.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ThreadPoolUtils.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/UploadUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/WxPayUtil.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/BookParamsEnum.java create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/lib/pop-sdk-1.19.52-all.jar create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/BookBaseInfoMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/CountMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/DepotOrderMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ExcelTaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/FastMailMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/FilterSetMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/GoodsAutoFailMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/NoticeMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/PriceTemplateMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/PrinterMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/RunningLogFileMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/RunningTaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopContextMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopDetailMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopGoodIsbnMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopGoodsPublishedLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopGoodsPublishedMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopGoodsRejectionMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopImgMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ShopWarehouseMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TAuditMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TBookAuditMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TDistrictMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TFreightMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TInviteCodeMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TInviteRelationMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TInviteRelationsMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TLogisticsMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TShopDepotAotuMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TShopGoodsPublishedMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TShopMessageSubscribeMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TShopOrderMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TUserPlatformMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/TaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/UserAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/UserRechargeMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/WaveDetailMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/WaveMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/WhiteListMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/XyCategoryMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/XyMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/mapper/zhishu/ZhishuShopGoodsDetailMapper.xml create mode 100644 ruoyi-modules/ruoyi-zhishu/src/main/resources/preview/韵达快递单pdf_base64.txt create mode 100644 script/bin/ry.bat create mode 100644 script/bin/ry.sh create mode 100644 script/docker/database.yml create mode 100644 script/docker/docker-compose.yml create mode 100644 script/docker/nginx/conf/nginx.conf create mode 100644 script/docker/redis/data/README.md create mode 100644 script/leave/leave2.json create mode 100644 script/leave/leave3.json create mode 100644 script/leave/leave4.json create mode 100644 script/leave/leave5.json create mode 100644 script/sql/oracle/oracle_ry_job.sql create mode 100644 script/sql/oracle/oracle_ry_vue_5.X.sql create mode 100644 script/sql/oracle/oracle_ry_workflow.sql create mode 100644 script/sql/postgres/postgres_ry_job.sql create mode 100644 script/sql/postgres/postgres_ry_vue_5.X.sql create mode 100644 script/sql/postgres/postgres_ry_workflow.sql create mode 100644 script/sql/ry_vue_5.X.sql create mode 100644 script/sql/ry_workflow.sql create mode 100644 script/sql/sqlserver/sqlserver_ry_vue_5.X.sql create mode 100644 script/sql/sqlserver/sqlserver_ry_workflow.sql create mode 100644 script/sql/update/oracle/update_5.0-5.1.sql create mode 100644 script/sql/update/oracle/update_5.1.0-5.1.1.sql create mode 100644 script/sql/update/postgres/update_5.0-5.1.sql create mode 100644 script/sql/update/postgres/update_5.1.0-5.1.1.sql create mode 100644 script/sql/update/postgres/update_5.1.1-5.1.2.sql create mode 100644 script/sql/update/postgres/update_5.1.2-5.2.0.sql create mode 100644 script/sql/update/sqlserver/update_5.0-5.1.sql create mode 100644 script/sql/update/sqlserver/update_5.1.1-5.1.2.sql create mode 100644 script/sql/update/sqlserver/update_5.1.2-5.2.0.sql create mode 100644 script/sql/update/update_5.0-5.1.sql create mode 100644 script/sql/update/update_5.1.0-5.1.1.sql create mode 100644 script/sql/update/update_5.1.1-5.1.2.sql create mode 100644 script/sql/update/update_5.1.2-5.2.0.sql create mode 100644 stockSynchronize/stock_sync_log_2025-12-01.txt create mode 100644 stockSynchronize/stock_sync_log_2026-01-16.txt create mode 100644 stockSynchronize/stock_sync_log_2026-05-01.txt diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ef2c59 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# erp \ No newline at end of file diff --git a/file/log/centerBooksAdd_1916358871501082626_1.txt b/file/log/centerBooksAdd_1916358871501082626_1.txt new file mode 100644 index 0000000..c6dc975 --- /dev/null +++ b/file/log/centerBooksAdd_1916358871501082626_1.txt @@ -0,0 +1,351 @@ + +【2026-01-20 13:32:33】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-01-20 13:32:33】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2013484773489025025","taskType":"1","shopIds":"2006557053525397505","shopNames":"志诚纸品店","fileName":"excel表格更新:task_template_1768886957287.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/d301edd6-9de7-4b05-bf04-6cb671aa1b7c_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2006557053525397505","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-01-20 13:39:40】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-01-20 13:39:40】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2013486565350219777","taskType":"1","shopIds":"2006557053525397505","shopNames":"志诚纸品店","fileName":"excel表格更新:task_template_1768886957287.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/1fb39e22-29d5-49a3-9092-27234b2dc7e0_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2006557053525397505","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0"},"userId":"1916358871501082626"} +【2026-01-26 16:17:46】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-01-26 16:17:46】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2015700678402940929","taskType":"1","shopIds":"1995373681100910593","shopNames":"志诚图书店","fileName":"excel表格更新:task_template_1768886957287.xlsx","dataNum":100,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":100,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/43d1e842-2645-4418-9af7-0a5239d3655a_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-01-26 16:17:57】【返回参数】null +【2026-01-26 16:17:57】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-01-26 16:52:35】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-01-26 16:52:35】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2015709440610181122","taskType":"1","shopIds":"1995373681100910593","shopNames":"志诚图书店","fileName":"excel表格更新:task_template_1768886957287.xlsx","dataNum":100,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":100,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0ecc4aa4-3355-41db-8d9e-1b59b8532242_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0"},"userId":"1916358871501082626"} +【2026-01-26 16:52:43】【返回参数】null +【2026-01-26 16:52:43】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-02-08 13:41:37】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-02-08 13:41:37】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2020372423449829378","taskType":"1","shopIds":"2006241414755627010","shopNames":"品博","fileName":"excel表格更新:task_template_1770529245267.xlsx","dataNum":5,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":5,"fileName":"task_template_1770529245267.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/f16eb452-b33d-494f-9849-51f503d9d2bd_task_template_1770529245267.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2006241414755627010","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-02-08 13:41:37】【返回参数】null +【2026-02-08 13:41:37】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-02-08 13:47:40】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-02-08 13:47:40】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2020373948133859330","taskType":"1","shopIds":"2006241414755627010","shopNames":"品博","fileName":"excel表格更新:task_template_1770529245267.xlsx","dataNum":5,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":5,"fileName":"task_template_1770529245267.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/24a7401d-b340-41f0-981a-03c522b2a77e_task_template_1770529245267.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2006241414755627010","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-02-08 13:47:41】【返回参数】null +【2026-02-08 13:47:41】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-02-08 13:54:02】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-02-08 13:54:02】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2020375549208748033","taskType":"1","shopIds":"2006241414755627010","shopNames":"品博","fileName":"excel表格更新:task_template_1770529245267.xlsx","dataNum":5,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":5,"fileName":"task_template_1770529245267.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/d0a34799-1aeb-4e1e-b031-39a1c2849adc_task_template_1770529245267.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2006241414755627010","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-02-08 13:54:03】【返回参数】null +【2026-02-08 13:54:03】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:10:17】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:10:17】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/2f011223-3ab4-460e-97b5-41d55700e34c_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:10:32】【系统异常】【异常方法】addGoods +【2026-03-04 17:10:32】【系统异常】【异常内容】java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap') + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:240) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:248) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:10:32】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:11:17】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:11:17】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/4af5b618-5d3f-456c-a9c1-ad4e957639ff_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:11:48】【系统异常】【异常方法】addGoods +【2026-03-04 17:11:48】【系统异常】【异常内容】java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap') + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:240) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:248) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:11:48】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:13:11】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:13:11】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/b97adc6a-5512-442f-8a96-52183021e6eb_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:13:40】【系统异常】【异常方法】addGoods +【2026-03-04 17:13:40】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "java.util.Map.get(Object)" is null + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:250) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:13:40】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:13:56】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:13:56】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/8eb77905-7c95-40a6-a8c0-acc547dc2512_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:14:12】【系统异常】【异常方法】addGoods +【2026-03-04 17:14:12】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "java.util.Map.get(Object)" is null + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:250) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:14:12】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:15:27】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:15:27】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7b761a18-ad42-4cc1-95ee-83160446a2d3_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:16:01】【系统异常】【异常方法】addGoods +【2026-03-04 17:16:01】【系统异常】【异常内容】java.lang.ClassCastException: class java.util.HashMap cannot be cast to class java.lang.String (java.util.HashMap and java.lang.String are in module java.base of loader 'bootstrap') + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:240) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:264) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:16:01】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:17:25】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:17:25】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/dd92d5b1-677e-4ce6-ae96-92d2004c88c9_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:18:06】【系统异常】【异常方法】addGoods +【2026-03-04 17:18:07】【系统异常】【异常内容】java.lang.ClassCastException: class java.util.HashMap cannot be cast to class java.lang.String (java.util.HashMap and java.lang.String are in module java.base of loader 'bootstrap') + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:240) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:264) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:18:14】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:21:48】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-04 17:21:48】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/896274d9-d773-4a22-bc5a-3852cc794b43_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-04 17:25:35】【系统异常】【异常方法】addGoods +【2026-03-04 17:25:35】【系统异常】【异常内容】java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.lang.String (java.util.ArrayList and java.lang.String are in module java.base of loader 'bootstrap') + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:240) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:266) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2026-03-04 17:25:35】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:10:01】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:10:01】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0e1fb1d8-29af-49d4-9a1d-0a36f5533c81_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:10:29】【返回参数】null +【2026-03-05 13:10:29】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:12:09】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:12:09】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/a892e033-5c93-4b48-b70a-adc5acf751db_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:12:10】【返回参数】null +【2026-03-05 13:12:10】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:13:16】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:13:16】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ac313af0-7711-4bf1-af46-472f1552bfba_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:23:57】【返回参数】null +【2026-03-05 13:23:57】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:25:18】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:25:18】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/64ac0c9d-cac4-4624-95be-479818295e2e_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:33:26】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:33:26】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/735f415f-0458-432f-a58d-7e49751c9f4d_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:37:45】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:37:45】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/86a57566-0fa0-4c36-98a9-8fbdd1e5a778_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:40:23】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:40:23】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/09f17fa6-36a0-4e56-b51c-30854417d708_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:40:29】【系统异常】【异常方法】addGoods +【2026-03-05 13:40:29】【系统异常】【异常内容】org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://103.236.74.207:8283/task/create": Connect timed out + at org.springframework.web.client.RestTemplate.createResourceAccessException(RestTemplate.java:926) + at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:906) + at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801) + at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:549) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:249) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:248) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) +Caused by: java.net.SocketTimeoutException: Connect timed out + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:551) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:602) + at java.base/java.net.Socket.connect(Socket.java:633) + at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178) + at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:534) + at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:639) + at java.base/sun.net.www.http.HttpClient.(HttpClient.java:282) + at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:387) + at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:409) + at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1308) + at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1241) + at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1127) + at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1056) + at org.springframework.http.client.SimpleClientHttpRequest.executeInternal(SimpleClientHttpRequest.java:79) + at org.springframework.http.client.AbstractStreamingClientHttpRequest.executeInternal(AbstractStreamingClientHttpRequest.java:71) + at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:81) + at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:900) + ... 28 more + +【2026-03-05 13:40:29】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:40:57】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:40:57】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/83b138df-c60b-4288-8ff3-e79b756c7386_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:41:59】【返回参数】null +【2026-03-05 13:41:59】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:45:15】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 13:45:15】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0f6883b3-6038-4d34-9b1b-9a4e5db7fb1f_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 13:45:17】【返回参数】null +【2026-03-05 13:45:17】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 15:01:39】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 15:01:39】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/b64ceafc-e75c-4725-a987-421f345226d5_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1916358871501082626"} +【2026-03-05 15:01:40】【返回参数】null +【2026-03-05 15:01:40】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 17:28:29】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 17:28:29】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/104f3c70-22ef-4598-838d-8946b7866561_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2029489046873382913\",\"msg\":\"成功\"}\n"},"userId":"1916358871501082626"} +【2026-03-05 17:28:35】【返回参数】null +【2026-03-05 17:28:35】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 17:35:19】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-05 17:35:19】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ae73d8c0-d17f-422b-b3ea-2790f48e2001_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2029490760825380865\",\"msg\":\"成功\"}\n"},"userId":"1916358871501082626"} +【2026-03-10 09:57:39】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-10 09:57:39】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0f16470e-d7d2-4a74-95ca-527b6b6926be_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"0"},"userId":"1916358871501082626"} +【2026-03-10 10:00:10】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-10 10:00:10】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/71b08c28-455f-4ca1-bf28-4cfe8d21716a_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"0"},"userId":"1916358871501082626"} +【2026-03-10 10:03:52】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-03-10 10:03:52】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1916358871501082626","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"task_template_1768886957287.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/e276e4e4-b52f-4074-9d44-0a4ed8ac153b_task_template_1768886957287.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"1995373681100910593","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"0"},"userId":"1916358871501082626"} +【2026-03-10 10:04:09】【返回参数】null +【2026-03-10 10:04:09】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods \ No newline at end of file diff --git a/file/log/centerBooksAdd_1965254774327533570_4.txt b/file/log/centerBooksAdd_1965254774327533570_4.txt new file mode 100644 index 0000000..90fcdc2 --- /dev/null +++ b/file/log/centerBooksAdd_1965254774327533570_4.txt @@ -0,0 +1,336 @@ + +【2025-11-08 08:43:34】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-11-08 08:43:34】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1986957732971384833","taskType":"EDIT_STOCK_GOODS","shopIds":"1940355994419642369","shopNames":"古威文具礼品专营店","fileName":"excel表格上传:更新库存.xlsx","dataNum":3,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"EDIT_STOCK_GOODS","way":"0","listStatus":"0","bookCategory":"0","shopIds":"1940355994419642369","data":{"total":3,"fileName":"更新库存.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/50894f85-9a07-4527-b117-b4c1b05dde6f_更新库存.xlsx"},"imageSelect":"1","deleteNum":0},"userId":"1965254774327533570"} +【2025-11-08 08:43:34】【系统异常】【异常方法】addGoods +【2025-11-08 08:43:34】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "String.toCharArray()" because "val" is null + at java.base/java.math.BigDecimal.(BigDecimal.java:900) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:244) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2025-11-08 08:43:34】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-11-08 08:44:48】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-11-08 08:44:48】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1986958045090516994","taskType":"EDIT_STOCK_GOODS","shopIds":"1940355994419642369","shopNames":"古威文具礼品专营店","fileName":"excel表格上传:更新库存.xlsx","dataNum":3,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"EDIT_STOCK_GOODS","way":"0","listStatus":"0","bookCategory":"0","shopIds":"1940355994419642369","data":{"total":3,"fileName":"更新库存.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/91c2c5eb-9a9c-44e9-b4bb-4ac784133f20_更新库存.xlsx"},"imageSelect":"1","deleteNum":0},"userId":"1965254774327533570"} +【2025-11-08 08:44:48】【系统异常】【异常方法】addGoods +【2025-11-08 08:44:48】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "String.toCharArray()" because "val" is null + at java.base/java.math.BigDecimal.(BigDecimal.java:900) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:244) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) + +【2025-11-08 08:44:48】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-13 09:20:51】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-13 09:20:51】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2043499624554655746","taskType":"1","shopIds":"2031685168119377922","shopNames":"简创甄选书籍","fileName":"excel表格更新:新发布商品模板.xlsx","dataNum":2,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"新发布商品模板.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/f91c2096-854d-4a73-8fa0-40a8075fff50_新发布商品模板.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2031685168119377922","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0"},"userId":"1965254774327533570"} +【2026-04-13 09:20:53】【返回参数】null +【2026-04-13 09:20:53】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 10:26:05】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 10:26:05】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"新发布商品模板.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/9d359ccb-32ea-4b5f-a19c-07ad5d299636_新发布商品模板.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2044603196746182658\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 10:26:06】【返回参数】null +【2026-04-16 10:26:06】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:06:15】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:06:15】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ce467766-d204-4a7b-bac4-dc5a9b506163_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044673709124284417\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:06:15】【返回参数】null +【2026-04-16 15:06:15】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:07:10】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:07:10】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/f5639497-2949-4a0a-8c9e-1970bdbaca49_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044673940914106369\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:07:36】【返回参数】null +【2026-04-16 15:07:36】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:09:35】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:09:35】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/a2f18b45-dc29-4a91-9af3-f74e0cb2287b_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044674547817312258\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:09:55】【返回参数】null +【2026-04-16 15:09:55】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:11:32】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:11:32】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7803a21e-3f1a-4ed9-949a-01cdd51667c5_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044675039247134722\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:11:35】【返回参数】null +【2026-04-16 15:11:35】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:14:37】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:14:37】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/08e13481-da0d-4443-95b1-99031ad198b7_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044675816292282369\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:14:38】【返回参数】null +【2026-04-16 15:14:38】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:15:50】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:15:50】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/6721fcbf-e7bb-42c5-b86b-0eb9ba68d9a8_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2044676123617325058\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:15:51】【返回参数】null +【2026-04-16 15:15:51】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:16:39】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:16:39】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/a3271d95-2ced-453c-9c59-8843c87d1efb_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044676325912801282\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:18:36】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:18:36】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0d8e7f18-ced5-4e95-b79d-1a9c5b3a1994_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044676819477524482\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:18:59】【返回参数】null +【2026-04-16 15:18:59】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:22:05】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:22:05】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/76c9e511-af83-4188-9ec9-339544ba89ae_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2044677694208012290\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-16 15:22:05】【返回参数】null +【2026-04-16 15:22:05】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:24:23】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:24:23】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2044678275270795266","taskType":"1","shopIds":"2031685168119377922","shopNames":"简创甄选书籍","fileName":"excel表格更新:baseInfo_1776307622338.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/4a997bb6-a82e-46f0-8854-605b77f5f59f_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2031685168119377922","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-04-16 15:24:24】【返回参数】null +【2026-04-16 15:24:24】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:26:16】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:26:16】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2044678748044337154","taskType":"1","shopIds":"2031685168119377922","shopNames":"简创甄选书籍","fileName":"excel表格更新:baseInfo_1776307622338.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/59abecc2-6509-45be-a2e5-b62dd11bb72c_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2031685168119377922","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-04-16 15:26:17】【返回参数】null +【2026-04-16 15:26:17】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:27:19】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:27:19】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2044679013053046786","taskType":"1","shopIds":"2000809400724316161","shopNames":"书海寻源cs1","fileName":"excel表格更新:baseInfo_1776307622338.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/fb88b057-1f65-4be3-a08a-4b3a4e5ed085_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2000809400724316161","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-04-16 15:27:20】【返回参数】null +【2026-04-16 15:27:20】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:30:05】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:30:05】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2044679707529060354","taskType":"1","shopIds":"2000809400724316161","shopNames":"书海寻源cs1","fileName":"excel表格更新:baseInfo_1776307622338.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/c2fd224d-93e7-4e25-8906-ce34e3867184_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2000809400724316161","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-04-16 15:30:16】【返回参数】null +【2026-04-16 15:30:16】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:31:13】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:31:13】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2044679992125169665","taskType":"1","shopIds":"2000809400724316161","shopNames":"书海寻源cs1","fileName":"excel表格更新:baseInfo_1776307622338.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/4817c483-0313-4732-a3d5-a2c85f52672a_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2000809400724316161","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-04-16 15:31:16】【返回参数】null +【2026-04-16 15:31:16】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:33:36】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-16 15:33:36】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2044680595056369665","taskType":"1","shopIds":"2000809400724316161","shopNames":"书海寻源cs1","fileName":"excel表格更新:baseInfo_1776307622338.xlsx","dataNum":1,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776307622338.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/2376be6d-86ab-4b37-aa38-99c9ea38cccf_baseInfo_1776307622338.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2000809400724316161","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-04-16 15:33:37】【返回参数】null +【2026-04-16 15:33:37】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-17 15:22:27】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-17 15:22:27】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":133535,"fileName":"task_template_1776408308595.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/dccd453a-bce1-4eea-8be5-8b14398b9091_task_template_1776408308595.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2045040173987557377\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-17 15:31:08】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-17 15:31:08】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":133535,"fileName":"task_template_1776408308595.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7b0cedd6-5139-42a3-8e4d-708826773270_task_template_1776408308595.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2045042358829871105\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 14:51:27】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 14:51:27】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":12,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7b1ea6a0-f39d-4dc4-9efb-e59799d33a11_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2046119528465633281\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 14:52:00】【返回参数】null +【2026-04-20 14:52:00】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 14:54:02】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 14:54:02】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":12,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7bd22644-6316-444c-b4f8-d0f4690f25d9_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046120179140595714\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 14:56:52】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 14:56:52】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":12,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/4dfde870-33c7-4cc4-834a-e53c74b4cae4_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046120893040496641\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 14:57:36】【返回参数】null +【2026-04-20 14:57:36】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:05:50】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:05:50】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":12,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ec66bb8b-69dc-412d-8494-a7bba8b48316_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046123147927687170\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:06:20】【返回参数】null +【2026-04-20 15:06:20】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:10:06】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:10:06】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"proportion":100,"addNum":0}],"data":{"total":12,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ec66bb8b-69dc-412d-8494-a7bba8b48316_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046124222147661825\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:10:17】【返回参数】null +【2026-04-20 15:10:17】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:29:41】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:29:41】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/c29629cc-0ce2-4651-9a71-826a85c3d4ea_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046129148831666177\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:29:46】【返回参数】null +【2026-04-20 15:29:46】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:31:34】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:31:34】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/9173f024-bf8d-452a-af10-8941f70e5b95_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046129621793968129\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:31:39】【返回参数】null +【2026-04-20 15:31:39】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:32:43】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:32:43】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/d04844b3-493e-4a8f-b252-294adf31632d_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046129914136956930\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:32:49】【返回参数】null +【2026-04-20 15:32:49】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:34:40】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:34:40】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/8cebea0b-408b-40a4-bae8-7745fcf99a67_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046130402291027969\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:34:45】【返回参数】null +【2026-04-20 15:34:45】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:36:09】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:36:09】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7fb41e5e-88c3-4aab-80c2-f7f34acf2c89_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046130778071306242\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:36:15】【返回参数】null +【2026-04-20 15:36:15】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:42:12】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:42:12】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/e51e95d1-e75e-4fca-91ea-ad14495aeef8_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046132298221293570\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:42:17】【返回参数】null +【2026-04-20 15:42:17】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:43:06】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:43:06】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/5cfe33c4-d678-4dda-b692-2484f733cbaa_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046132525678399490\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:43:11】【返回参数】null +【2026-04-20 15:43:11】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:46:30】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:46:30】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7f56b37d-dc50-4b1b-afad-1f0b94476ce7_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046133383535202305\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:46:36】【返回参数】null +【2026-04-20 15:46:36】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:48:51】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-20 15:48:51】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776666774463.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/91894544-f7b2-4977-9b60-c6717e4c204f_baseInfo_1776666774463.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046133972956549122\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-20 15:48:56】【返回参数】null +【2026-04-20 15:48:56】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-21 15:34:03】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-21 15:34:03】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776671934641.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7d606bd4-718d-4632-a862-0bc6423aba1a_baseInfo_1776671934641.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046492643871916034\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-21 15:35:18】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-21 15:35:18】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776671934641.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/6c44f2e6-77bf-4546-8328-3767483b134a_baseInfo_1776671934641.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2046492961305231362\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-21 16:55:34】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-21 16:55:34】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776671934641.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/93de46fe-f77d-4b90-bf10-65044b53fcdb_baseInfo_1776671934641.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046513159244570626\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-21 16:55:57】【返回参数】null +【2026-04-21 16:55:57】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-21 16:56:26】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-21 16:56:26】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":1,"fileName":"baseInfo_1776671934641.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0c409529-4a38-4adf-b34b-5ae86caf2eba_baseInfo_1776671934641.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2042843272765263874","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2046513379311312897\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-04-21 16:56:48】【返回参数】null +【2026-04-21 16:56:48】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-09 11:45:15】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-09 11:45:15】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":6,"fileName":"志诚.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/43e733bd-b6d9-4b01-b644-fd67c501e6bf_志诚.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2052958038187192321\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828423056261121","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-09 11:45:16】【返回参数】null +【2026-05-09 11:45:16】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-09 11:48:30】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-09 11:48:30】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":4,"fileName":"闲鱼商品.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/b395071d-127a-48f5-a9da-e7047e9b072c_闲鱼商品.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2052958856936304642\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828423056261121","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-09 11:48:30】【返回参数】null +【2026-05-09 11:48:30】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-09 13:20:01】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-09 13:20:01】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":4,"fileName":"闲鱼商品.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/51291a87-9af4-4cb6-9f54-94794db7f69c_闲鱼商品.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2052981886706135042\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828423056261121","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-09 13:20:01】【返回参数】null +【2026-05-09 13:20:01】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-16 13:20:34】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-16 13:20:34】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":7,"fileName":"加密表格.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/be61ca59-b074-4f5e-a649-0e68a7eed3fb_加密表格.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2054805126617468929","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2055518748859691009\",\"msg\":\"成功\"}\n"},"userId":"1965254774327533570"} +【2026-05-16 13:25:19】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-16 13:25:19】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":7,"fileName":"加密表格.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/66b41482-acc1-4a6e-a856-9d29047cd28d_加密表格.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2055519946794856450\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2054805126617468929","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-16 13:26:39】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-16 13:26:39】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":7,"fileName":"加密表格.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/2f217c7a-45c1-4903-8ac8-d94d3c3b4f85_加密表格.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2055520280783089666\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2054805126617468929","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-16 13:28:54】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-16 13:28:54】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":6,"fileName":"志诚.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/87379338-3fa3-4557-ac15-956e9738b6dd_志诚.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2055520846435315713\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2054805126617468929","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-18 11:52:25】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:52:25】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2056221341643239426","taskType":"1","shopIds":"2031685168119377922","shopNames":"简创甄选书籍","fileName":"excel表格更新:简创甄选书籍-测试数据.xlsx","dataNum":2,"taskStatus":"0","status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/c08b3732-7557-4892-834c-ea37aa3d035b_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2031685168119377922","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-05-18 11:52:25】【系统异常】【异常方法】addGoods +【2026-05-18 11:52:25】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "java.util.Map.get(Object)" is null + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:257) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:840) + +【2026-05-18 11:52:25】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:53:05】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:53:05】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2056221510325563394","taskType":"1","shopIds":"2031685168119377922","shopNames":"简创甄选书籍","fileName":"excel表格更新:简创甄选书籍-测试数据.xlsx","dataNum":2,"taskStatus":"0","status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/77d39ea1-9c47-495c-9273-04e430e09e5f_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2031685168119377922","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-05-18 11:53:12】【系统异常】【异常方法】addGoods +【2026-05-18 11:53:12】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "java.util.Map.get(Object)" is null + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:257) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:840) + +【2026-05-18 11:53:12】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:53:30】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:53:30】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"2056221614864396289","taskType":"1","shopIds":"2031685168119377922","shopNames":"简创甄选书籍","fileName":"excel表格更新:简创甄选书籍-测试数据.xlsx","dataNum":2,"taskStatus":"0","status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/302ca3a5-5629-48d2-8b37-2ea0036c8b25_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2031685168119377922","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2"},"userId":"1965254774327533570"} +【2026-05-18 11:55:22】【系统异常】【异常方法】addGoods +【2026-05-18 11:55:22】【系统异常】【异常内容】java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "java.util.Map.get(Object)" is null + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:257) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:840) + +【2026-05-18 11:55:22】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:57:34】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 11:57:34】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/385afd29-24b2-4c80-a239-d09c71b9de46_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2056222637107929089\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2031685168119377922","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-18 11:57:43】【返回参数】null +【2026-05-18 11:57:43】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 13:03:51】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 13:03:51】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/54dd6d25-c4f0-4501-9b66-aae1be13c16c_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2056239317095768065\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2031685168119377922","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-18 13:03:54】【返回参数】null +【2026-05-18 13:03:54】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 14:33:27】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 14:33:27】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/6a6f3bbc-a367-479f-9a55-db129cbedaef_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2056261865716015106\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828423056261121","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-18 14:37:29】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 14:37:29】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/f1be0ec8-f095-4dc9-94d5-fde7e5404101_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2056262883182862338\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2031685168119377922","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-18 14:37:30】【返回参数】null +【2026-05-18 14:37:30】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 14:39:07】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-18 14:39:07】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"2"},"map":{"bookCategoryAppoint":0,"data":{"total":2,"fileName":"简创甄选书籍-测试数据.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/d1063931-7a40-4595-8e7f-d240f76e48f3_简创甄选书籍-测试数据.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2056263292014256130\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828096496140289","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-05-18 14:39:07】【返回参数】null +【2026-05-18 14:39:07】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-06-03 15:09:49】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-06-03 15:09:49】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":198,"fileName":"闲鱼.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/a36296b5-3c88-41e1-bf2c-1ef8d13f6080_闲鱼.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2062069223054589954\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828423056261121","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} +【2026-06-03 15:14:21】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-06-03 15:14:21】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":198,"fileName":"闲鱼.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/d4e36220-61f5-4bb9-9167-53870cafbe45_闲鱼.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2062070365880795138\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1965254774327533570","proportion":100,"addNum":0}],"shopIds":"2026828423056261121","synchronizationType":"1","bookCategory":"0"},"userId":"1965254774327533570"} \ No newline at end of file diff --git a/file/log/centerBooksAdd_1967112570379649025_440.txt b/file/log/centerBooksAdd_1967112570379649025_440.txt new file mode 100644 index 0000000..5b4369b --- /dev/null +++ b/file/log/centerBooksAdd_1967112570379649025_440.txt @@ -0,0 +1,9 @@ + +【2025-09-30 18:24:25】【日志开始,方法名称:centerBooks】【centerBooksAdd】中心书库发布商品 +【2025-09-30 18:24:25】【执行参数】{"result":[{"isbn":"9787568918695","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572019722","title":"中学生思辨日知录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.41,"price":22.41,"shippingFee":1,"differencePrice":-23.41,"GoodsUrl":"https://book.kongfz.com/250369/7507863640","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4986191/4593582d712cdd2c_b.jpg","GoodsImgCount":"1","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518418466","title":"萨巴厨房 粗粮细做","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.3,"price":3.3,"shippingFee":5,"differencePrice":-8.3,"GoodsUrl":"https://book.kongfz.com/802508/8631264293","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dffbcfeb/6b008f588aa38d92_b.jpg","GoodsImgCount":"1","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514810813","title":"植物大战僵尸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":8,"shippingFee":3,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/566350/8842775522","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bebcbeee/b169dfd45b2c6889_b.jpg","GoodsImgCount":"5","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535688316","title":"(未拆封)小王子(唯美绘本典藏版,凯特·格林威大奖提名曼纽拉·阿德雷亚尼全新绘制)【浦睿文化出品】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2,"shippingFee":5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/695844/8215712304","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaddfcfe/5f734b0719ebcbe7_b.jpg","GoodsImgCount":"6","onSaleCount":99,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501559565","title":"诗词格律手册,,","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":4,"shippingFee":8,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/241320/6143640925","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbfdfacc/9361917dd464d637_b.jpg","GoodsImgCount":"4","onSaleCount":50,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100023085","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020157563","title":"西藏天空(茅盾文学奖得主、《尘埃落定》作者阿来作品。人如何才能成为真正的人?平等的爱才能铸就幸福)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/9617/8175403971","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1149758/0861d76b41b79344_b.jpg","GoodsImgCount":"3","onSaleCount":129,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521729405","title":"长期有耐心美团的成长与进化逻辑 丁西坡 中信出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.3,"price":15.3,"shippingFee":5,"differencePrice":-20.3,"GoodsUrl":"https://book.kongfz.com/910533/8776640084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdfcbfce/dc3b3f0f770b2564_b.jpg","GoodsImgCount":"1","onSaleCount":141,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559607577","title":"正版书籍命运:掌控你人生的命脉玄机 重塑人生主宰命运改变人生成功与运气","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.98,"price":8.98,"shippingFee":5,"differencePrice":-13.98,"GoodsUrl":"https://book.kongfz.com/442545/7044016865","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/12608860/b7aaf035a46742d8_b.jpg","GoodsImgCount":"1","onSaleCount":195,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546347110","title":"国学典藏 偏方秘方","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":0.5,"shippingFee":5,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/820017/8708620849","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daeddaef/0236a2498e1ea631_b.jpg","GoodsImgCount":"3","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522201573","title":"影子老师实战指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.15,"price":24.15,"shippingFee":2,"differencePrice":-26.15,"GoodsUrl":"https://book.kongfz.com/476106/8289838819","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaffcfff/5b82a2549640e185_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503322457","title":"实拍图 雄师劲旅 中国人民解放军第十一军征战纪实","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.689999999999998,"price":15.69,"shippingFee":4,"differencePrice":-19.689999999999998,"GoodsUrl":"https://book.kongfz.com/330788/8779037628","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddaadcd/354fcf459e2bc020_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508228327","title":"异国主食美味30种","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.9,"price":5.4,"shippingFee":3.5,"differencePrice":-8.9,"GoodsUrl":"https://book.kongfz.com/719470/7147511958","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/18693003/824e38ad750a4f7c_b.jpg","GoodsImgCount":"4","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506503945","title":"黄石公三略浅说","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":5,"shippingFee":9,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/16576/8322316451","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adcbcefe/735dcc4a5c9de005_b.jpg","GoodsImgCount":"4","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510408366","title":"实拍图 百弊放言","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.77,"price":5.77,"shippingFee":4,"differencePrice":-9.77,"GoodsUrl":"https://book.kongfz.com/330788/8655240012","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbabdeaa/d18897da754846a8_b.jpg","GoodsImgCount":"1","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122197689","title":"化工分离过程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.2,"price":1.2,"shippingFee":3,"differencePrice":-4.2,"GoodsUrl":"https://book.kongfz.com/774181/8784846555","imgBigUrl":"httpstotalPrice://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeccdcc/b03249bc4a0bff33_b.jpg","GoodsImgCount":"10","onSaleCount":145,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508649986","title":"正版二手书光荣与梦想(4)9787508649986","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.89,"price":6.89,"shippingFee":0,"differencePrice":-6.89,"GoodsUrl":"https://book.kongfz.com/765962/8807354840","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/facebfde/3179c1dbe9a1a3e1_b.jpg","GoodsImgCount":"1","onSaleCount":607,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787306038234","title":"新媒渠:中国营销实践版1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.98,"price":6.98,"shippingFee":0,"differencePrice":-6.98,"GoodsUrl":"https://book.kongfz.com/356195/8831898825","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/80acda36e6792b24_b.jpg","GoodsImgCount":"7","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550831971","title":"琴道(论古琴的思想体系)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":44,"price":34,"shippingFee":10,"differencePrice":-44,"GoodsUrl":"https://book.kongfz.com/471874/8103918813","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbcefca/3eaa20070e97dc68_b.jpg","GoodsImgCount":"10","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511517661","title":"中国梦 中国的奋斗与复兴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.199999999999999,"price":4.8,"shippingFee":2.4,"differencePrice":-7.199999999999999,"GoodsUrl":"https://book.kongfz.com/13534/8836412957","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdaaecc/f6e075e551b87645_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538731293","title":"本草纲目","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.35,"price":6.35,"shippingFee":5,"differencePrice":-11.35,"GoodsUrl":"https://book.kongfz.com/798675/8753394509","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afeedaca/c47788d5f78c4552_b.jpg","GoodsImgCount":"1","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805532752","title":"世界名曲欣赏·2·俄罗斯部分","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.5,"price":2.5,"shippingFee":5,"differencePrice":-7.5,"GoodsUrl":"https://book.kongfz.com/469122/8625940704","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feddbdba/17478803856c6a77_b.jpg","GoodsImgCount":"9","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787566801715","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117237321","title":"英汉对照护理英语会话(第2版 英汉对照)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/508346/8881986880","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfdacfb/eecb8ef0a9eceff3_b.jpg","GoodsImgCount":"9","onSaleCount":104,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807058953","title":"景丽瑜伽:瑜伽初级入门(升级版)附光盘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":3.3,"shippingFee":0,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/840504/8228479927","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adfedacd/19bfd9488c0fbb11_b.jpg","GoodsImgCount":"7","onSaleCount":448,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122270795","title":"新SAT阅读长难句精讲30天第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.559999999999999,"price":4.06,"shippingFee":4.5,"differencePrice":-8.559999999999999,"GoodsUrl":"https://book.kongfz.com/877194/8511050402","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fafafbfd/6b7b13835b41f7ec_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508224664","title":"英语语法表解手册 (修订版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":38,"shippingFee":10,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/269417/5120887447","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faecbabe/9519270017db1bd6_b.jpg","GoodsImgCount":"2","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534736025","title":"中国国家地理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.9399999999999995,"price":4.93,"shippingFee":0.01,"differencePrice":-4.9399999999999995,"GoodsUrl":"https://book.kongfz.com/545601/8761272941","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14322431/d91e5ce59a592a24_b.jpg","GoodsImgCount":"2","onSaleCount":151,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787107346361","title":"普通高中教科书教师教学用书生物学选择性必修2生物与环境 人民教育出版社课程教材研究所生物课程教材研究开发中心编著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.5,"price":10.5,"shippingFee":3,"differencePrice":-13.5,"GoodsUrl":"https://book.kongfz.com/681595/8811715235","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdefffb/0fbe52d7dda4ef04_b.jpg","GoodsImgCount":"3","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030207500","title":"大学应用物理 蒲利春 张雪峰 科学出版社 9787030207500","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.87,"price":1.87,"shippingFee":3,"differencePrice":-4.87,"GoodsUrl":"https://book.kongfz.com/195620/8312037668","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5749161/6e89f9d1af7e7989_b.jpg","GoodsImgCount":"1","onSaleCount":72,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213104589","title":"颠覆:马斯克的商业逻辑和创新法则(九品)9787213104589","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.9,"price":9.3,"shippingFee":2.6,"differencePrice":-11.9,"GoodsUrl":"https://book.kongfz.com/20579/8802296569","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbadefca/15c37dc77ff955cf_b.jpg","GoodsImgCount":"1","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535364456","title":"古代传说中的怪物【正版 塑封 发货快】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/891652/8853257427","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acceceed/610520b76a3ebe80_b.jpg","GoodsImgCount":"5","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560417035","title":"对农民让利:一个乡镇党委书记的工作笔记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.8,"price":2.8,"shippingFee":10,"differencePrice":-12.8,"GoodsUrl":"https://book.kongfz.com/20238/6553568561","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2388552/6b834f981ec7e865_b.jpg","GoodsImgCount":"7","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545560978","title":"邓小平","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.18,"price":9.18,"shippingFee":5,"differencePrice":-14.18,"GoodsUrl":"https://book.kongfz.com/805022/8530275546","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21340856/36aaf5bffbf85d8c_b.jpg","GoodsImgCount":"1","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569506563","title":"活着,就该尽点儿兴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":8,"shippingFee":5,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/364917/8345040086","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecccebaa/eae7ce24870491e4_b.jpg","GoodsImgCount":"3","onSaleCount":139,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534338755","title":"中国文化史教程第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.49,"price":1.49,"shippingFee":4,"differencePrice":-5.49,"GoodsUrl":"https://book.kongfz.com/878042/8490636209","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaadffef/7807b51707816c48_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500319368","title":"历代画谱类编:山水(12)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":52,"price":40,"shippingFee":12,"differencePrice":-52,"GoodsUrl":"https://book.kongfz.com/25728/8440709404","imgBigUrl":"https://www0.kfzimg.com/G06/M00/14/79/p4YBAFqisNaAIasgAABrIQx-ikM832_b.jpg","GoodsImgCount":"1","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533258030","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802257481","title":"希腊棺材之谜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.73,"price":12.73,"shippingFee":5,"differencePrice":-17.73,"GoodsUrl":"https://book.kongfz.com/202798/8894676974","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccccbdec/2343a3c4f807db86_b.jpg","GoodsImgCount":"1","onSaleCount":85,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117055352","title":"妇产科手术学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":28,"shippingFee":10,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/760393/8899580666","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffaecbce/b54811d7b2204a06_b.jpg","GoodsImgCount":"3","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532522453","title":"韩愈散文选集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":6,"shippingFee":6,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/263916/8292153110","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abacbbfc/82ed778ad7f2030c_b.jpg","GoodsImgCount":"7","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301347775","title":"中国现代文学三十年(第三版)北京大学钱理群、温儒敏、吴福辉教授著 现当代文学书及中文系考研重要参考书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":13,"shippingFee":10,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/574881/7680988794","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deffdbae/bb726b02bcf65138_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500166207","title":"疫情后中国经济新发展格局","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":1.5,"shippingFee":3,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/838443/8749381946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebecdcad/222250eecf4e488c_b.jpg","GoodsImgCount":"1","onSaleCount":323,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546420950","title":"7岁对了,一辈子就对了","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/712812/7340204569","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbffeec/79cd4560b8c5de05_b.jpg","GoodsImgCount":"4","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807676447","title":"云冈石窟","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.5,"price":8,"shippingFee":4.5,"differencePrice":-12.5,"GoodsUrl":"https://book.kongfz.com/81946/6302388964","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baeaffef/65208eca36d1432c_b.jpg","GoodsImgCount":"4","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305120305","title":"正版新书现货 文学理论读本/IAS励学文丛 9787305120305 阎嘉|主编:周宪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.66,"price":32.66,"shippingFee":5,"differencePrice":-37.66,"GoodsUrl":"https://book.kongfz.com/311632/8812587135","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babdccad/2ba0f4a400d24004_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540485818","title":"散落星河的记忆4:璀璨","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":12,"shippingFee":8,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/639697/5243750723","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfecffea/f776a0acf017e68f_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559652737","title":"看国宝 和爸妈游博物馆","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.9,"price":1.8,"shippingFee":3.1,"differencePrice":-4.9,"GoodsUrl":"https://book.kongfz.com/894143/8701969746","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaabafee/f2595c7b2fd4a550_b.jpg","GoodsImgCount":"6","onSaleCount":261,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503943348","title":"献给阿尔吉侬的花束","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":10,"shippingFee":10,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/498915/7429202611","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbebfaec/d6256a6ee6537fa6_b.jpg","GoodsImgCount":"10","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301085493","title":"简单机械(中文翻译版)——国家地理阅读与写作训练丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/395221/5519963069","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1098/c6f60cc2ccbee2bb_b.jpg","GoodsImgCount":"2","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543211018","title":"寺庙自助游完全手册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":15,"shippingFee":0,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/700859/7742663957","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acecbabc/2d6e70c49c17570e_b.jpg","GoodsImgCount":"3","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801491589","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561327265","title":"正版二手书二手正版重返普罗旺斯97875613272659787561327265","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/765962/8631594226","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babdaece/b00ebe69df5166ff_b.jpg","GoodsImgCount":"1","onSaleCount":341,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543225589","title":"信用评级理论与实务 第二版叶伟春 编格致出版社9787543225589","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.17,"price":4.17,"shippingFee":0,"differencePrice":-4.17,"GoodsUrl":"https://book.kongfz.com/443530/8601138144","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11958278/4e1eb16e9d1c0462_b.jpg","GoodsImgCount":"1","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507547092","title":"我们生命里的“七七”(许倬云、郝柏村、齐邦媛、星云大师等用生命记录一篇篇撼动心灵的故事)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":35,"shippingFee":8,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/274410/7932527162","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddedaaac/5cabe80609502ec1_b.jpg","GoodsImgCount":"7","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787555373070","title":"2023秋状元导学案名师教学设计数学三年级上册样书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":5,"shippingFee":9,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/381029/8749671888","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcedeaf/6bf3c05878ca8f83_b.jpg","GoodsImgCount":"3","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540206956","title":"中国谋略宝鉴第十六卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.01,"price":0.01,"shippingFee":3,"differencePrice":-3.01,"GoodsUrl":"https://book.kongfz.com/360813/5966263658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdbfdfa/62959300371438f8_b.jpg","GoodsImgCount":"2","onSaleCount":330,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518051625","title":"肿瘤医院营养师的防癌抗癌吃法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.790000000000001,"price":5.19,"shippingFee":1.6,"differencePrice":-6.790000000000001,"GoodsUrl":"https://book.kongfz.com/457799/7915187178","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C3/5E/p4YBAFuRCEOAGxQ5AAC90eEIDkQ669_b.jpg","GoodsImgCount":"0","onSaleCount":220,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508079165","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787102041223","title":"物色黑白","quality":0,"qualityText":"","originalPrice":0,"totalPrice":66,"price":66,"shippingFee":0,"differencePrice":-66,"GoodsUrl":"https://book.kongfz.com/319064/8795448603","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbeefaca/c584b2d59a425bfc_b.jpg","GoodsImgCount":"8","onSaleCount":76,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787220108211","title":"瑜伽文库〔5〕:阿育吠陀瑜伽","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.8,"price":19.8,"shippingFee":13,"differencePrice":-32.8,"GoodsUrl":"https://book.kongfz.com/402676/8643741176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeaabefd/2a392099ec628856_b.jpg","GoodsImgCount":"9","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810103855","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806498439","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545435702","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539186887","title":"我的第一本科学漫画书寻宝记系列:巴西寻宝记11","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.51,"price":0.01,"shippingFee":4.5,"differencePrice":-4.51,"GoodsUrl":"https://book.kongfz.com/825588/8886241126","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccedcffa/61ddbfc1f57a12af_b.jpg","GoodsImgCount":"5","onSaleCount":248,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537144704","title":"写给小读者之快乐精灵","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":2,"shippingFee":3,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/774181/8597113775","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfcffafb/d701ee2510c5ed23_b.jpg","GoodsImgCount":"5","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115106124","title":"WindowsAPI函数参考手册 WindowsAPI函数参考手册 编写组编 人民邮电出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.37,"price":24.37,"shippingFee":4,"differencePrice":-28.37,"GoodsUrl":"https://book.kongfz.com/878042/8495444282","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfbeabaa/96a386fdb8bce4df_b.jpg","GoodsImgCount":"1","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535612793","title":"论摄影","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":12,"shippingFee":0,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/26771/8136858550","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eabfccee/3ca1daf23bce666c_b.jpg","GoodsImgCount":"4","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532785445","title":"近代文学批评史(全八卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":411.88,"price":401.88,"shippingFee":10,"differencePrice":-411.88,"GoodsUrl":"https://book.kongfz.com/471874/8695951046","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdabfceb/3089afd17e730b90_b.jpg","GoodsImgCount":"5","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504758415","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500311133","title":"徽派与徽州篆刻研究专辑:西泠印社(总第21辑)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.11,"price":16.11,"shippingFee":0,"differencePrice":-16.11,"GoodsUrl":"https://book.kongfz.com/897296/8237009972","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23068564/6d816b75de4e44ee_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111180623","title":"物业管理沟通艺术","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31,"price":24,"shippingFee":7,"differencePrice":-31,"GoodsUrl":"https://book.kongfz.com/912353/8289311525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdfcefa/39fd857445991f96_b.jpg","GoodsImgCount":"6","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532520756","title":"天涯侠侣册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.26,"price":4.26,"shippingFee":2,"differencePrice":-6.26,"GoodsUrl":"https://book.kongfz.com/1214361/8873449966","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbbddcb/8610a576eb08226a_b.jpg","GoodsImgCount":"4","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787109200845","title":"榨汁机美味食谱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.5,"price":20,"shippingFee":3.5,"differencePrice":-23.5,"GoodsUrl":"https://book.kongfz.com/719470/8585565450","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/18693003/0bfa2608b791ef68_b.jpg","GoodsImgCount":"3","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544763035","title":"三个女人 罗伯特 穆齐尔 译林出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.69,"price":9.69,"shippingFee":4,"differencePrice":-13.69,"GoodsUrl":"https://book.kongfz.com/766912/8858942814","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdefddae/bfa6459d0d82fb08_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541736247","title":"2007年最佳小故事排行榜TOP100感动卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/1207077/8702929036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efcbbdfa/2d9763b9c691fc8d_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507838336","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556021703","title":"女儿的故事 梅子涵 9787556021703 长江少年儿童出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.18,"price":1.68,"shippingFee":2.5,"differencePrice":-4.18,"GoodsUrl":"https://book.kongfz.com/237713/8792049160","imgBigUrl":"https://www0.kfzimg.com/G06/M00/38/4F/p4YBAFqjzVGAQ2WRAABJeXbuA7o046_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533937928","title":"迷狂 精装32开一版一印","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/696299/5906512396","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afabbcbb/9090a343c388e169_b.jpg","GoodsImgCount":"5","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565513671","title":"普通土壤学(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/506902/4876475660","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abbefebc/96f603e5373aadfd_b.jpg","GoodsImgCount":"2","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805646862","title":"野性的证明","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.98,"price":1.98,"shippingFee":3,"differencePrice":-4.98,"GoodsUrl":"https://book.kongfz.com/557002/5846843192","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbaeffbf/4b2a328969a84da5_b.jpg","GoodsImgCount":"6","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501767939","title":"期货-财富永动机","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":2,"shippingFee":4.9,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/26937/3839324520","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbfccfbb/f0d427a5206db5af_b.jpg","GoodsImgCount":"4","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787204009978","title":"红砂勾魂手 品好","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":19,"shippingFee":9,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/303616/8201886650","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafbbaba/e4d9bb837f6179d2_b.jpg","GoodsImgCount":"13","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020165650","title":"岁月静好:蒋勋的日常功课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.46,"price":18.46,"shippingFee":0,"differencePrice":-18.46,"GoodsUrl":"https://book.kongfz.com/792408/8898218361","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2790/02552e196a86ee0f77_b.jpg","GoodsImgCount":"1","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509823743","title":"红色之路烽火","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/730214/8858116427","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbeeebe/f500632e8ecee420_b.jpg","GoodsImgCount":"4","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536472129","title":"拉玛迷境","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34,"price":22,"shippingFee":12,"differencePrice":-34,"GoodsUrl":"https://book.kongfz.com/151474/8535484987","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbddebe/867cffc401ca09c4_b.jpg","GoodsImgCount":"7","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121211515","title":"学而思 培优辅导:初二物理跟踪练习(上下)附答案","quality":0,"qualityText":"","originalPrice":0,"totalPrice":120,"price":110,"shippingFee":10,"differencePrice":-120,"GoodsUrl":"https://book.kongfz.com/23910/8754936757","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3161432/7d4639abda234b4e_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224054538","title":"心血运动论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.67,"price":3.77,"shippingFee":3.9,"differencePrice":-7.67,"GoodsUrl":"https://book.kongfz.com/261575/7984459895","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecfcdcfa/b3872a57908ad1e8_b.jpg","GoodsImgCount":"5","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020081776","title":"芥川龙之介读本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":12,"shippingFee":8,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/689520/8843157283","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babacfce/8db8bcfa2d41f417_b.jpg","GoodsImgCount":"7","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532603763","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510430008","title":"新青瓷之窑变","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.06,"price":3.06,"shippingFee":5,"differencePrice":-8.06,"GoodsUrl":"https://book.kongfz.com/1207077/8886789761","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfdabcaa/1796162e1d9f2e4b_b.jpg","GoodsImgCount":"1","onSaleCount":251,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536564343","title":"夜翼天使","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/470358/4339829959","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfdffca/d07df374b3e13496_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550708471","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507850642","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544624770","title":"新编高级英语语法:A New Advanced English Grammar","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32,"price":20,"shippingFee":12,"differencePrice":-32,"GoodsUrl":"https://book.kongfz.com/830099/8882431094","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbaccbf/781a6310a0eb776e_b.jpg","GoodsImgCount":"9","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115495372","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506290227","title":"墓志书法百品","quality":0,"qualityText":"","originalPrice":0,"totalPrice":57.82,"price":46.82,"shippingFee":11,"differencePrice":-57.82,"GoodsUrl":"https://book.kongfz.com/509141/8585650720","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14014041/28964975e7dc309e_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559634351","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303135660","title":"顾明远教育口述史(增订)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/17747/5768445516","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1970964/2e94e4bdc50d3792_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800880452","title":"龙虎群英 中","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":1.5,"shippingFee":4,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/203004/8899012503","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdabaaea/64e07e07529c21b6_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538290622","title":"PASS初中英语巧记2000词","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":2,"shippingFee":3,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/841015/8684297376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcfffbab/4b67a6d547944648_b.jpg","GoodsImgCount":"4","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101084894","title":"中华经典精粹解读:史记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/702814/8179518138","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/defadbfe/4eea5c6a4809568e_b.jpg","GoodsImgCount":"4","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301270189","title":"文本的隐与显 中国现代文学文献校读论稿 解志熙著 北京大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.8,"price":25.8,"shippingFee":5,"differencePrice":-30.8,"GoodsUrl":"https://book.kongfz.com/903313/8547742130","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfeacbae/ddfb49783c133365_b.jpg","GoodsImgCount":"1","onSaleCount":85,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787552569421","title":"阅读理解超快提分公式","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":10,"shippingFee":0,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/34480/7649697434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/15505652/d3d2322c7ec0cb86_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511717306","title":"中央编译局文库 中国的民主治理 理论与实践 效率政府","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.059999999999999,"price":5.06,"shippingFee":3,"differencePrice":-8.059999999999999,"GoodsUrl":"https://book.kongfz.com/783956/8891177168","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acacbaae/5200429427f763ac_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571209483","title":"墨点字帖:2025秋英语写字同步练习册·必修第三册(新教材)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.01,"price":4.51,"shippingFee":4.5,"differencePrice":-9.01,"GoodsUrl":"https://book.kongfz.com/757284/8792634933","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbefcfaa/0cffeeed9f3fd774_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539448374","title":"历代书法名碑名帖精选:隶书(2)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/27190/365578569","imgBigUrl":"https://www0.kfzimg.com/G03/M01/70/45/pYYBAFWvkZeAZ3boAADmaxNa8ss048_b.jpg","GoodsImgCount":"3","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544246255","title":"星期三的战争 美 加里 施密特著 高雪莲译 南海出版公司","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.3,"price":1.3,"shippingFee":5,"differencePrice":-6.3,"GoodsUrl":"https://book.kongfz.com/672601/8709251624","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfddfcdd/b6b4d1110bf4f714_b.jpg","GoodsImgCount":"1","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787205094157","title":"红楼人物家庭角色论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":81,"price":71,"shippingFee":10,"differencePrice":-81,"GoodsUrl":"https://book.kongfz.com/20509/2274876206","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1930/017c3cfaea4867b6f6_b.jpg","GoodsImgCount":"1","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569912647","title":"美在举手投足间 一个人若举止优雅 心灵也会变得更坚强","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.7,"price":12.7,"shippingFee":5,"differencePrice":-17.7,"GoodsUrl":"https://book.kongfz.com/398369/8265506509","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/debccfdc/6d2d3253fb537795_b.jpg","GoodsImgCount":"1","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538724554","title":"毕淑敏作品2·话说孩子毕淑敏时代文艺出版社9787538724554","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.64,"price":4.64,"shippingFee":0,"differencePrice":-4.64,"GoodsUrl":"https://book.kongfz.com/366030/8301042871","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/29e82405eff322db_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534759819","title":"理学古文史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":5,"shippingFee":10,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/233973/8223713174","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbfabab/c49dd1ce62c4a5fb_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787307043114","title":"数字测图原理与方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/603269/8864023084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aacfabef/22ba103e580191bb_b.jpg","GoodsImgCount":"7","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801516091","title":"我信我能我要","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43.21,"price":32.21,"shippingFee":11,"differencePrice":-43.21,"GoodsUrl":"https://book.kongfz.com/878875/8142977482","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22516043/bd4ef387b1384988_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020161638","title":"袁枚诗选(中国古典文学读本丛书典藏)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.36,"price":21.36,"shippingFee":2,"differencePrice":-23.36,"GoodsUrl":"https://book.kongfz.com/476106/8283375310","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebcdbcdd/18643d009e705fdc_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787220040528","title":"历代笔记小说精华 第四卷 清","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.3,"price":23.3,"shippingFee":5,"differencePrice":-28.3,"GoodsUrl":"https://book.kongfz.com/261116/8560390036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceceadad/4cef7455f3e00ef9_b.jpg","GoodsImgCount":"1","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537733373","title":"少林拳术图说","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/210450/4528748517","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D7/AB/p4YBAFqYwJuAJtQPAACd0cT9L9o331_b.jpg","GoodsImgCount":"1","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800063107","title":"汉语方言词汇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":66.5,"price":61,"shippingFee":5.5,"differencePrice":-66.5,"GoodsUrl":"https://book.kongfz.com/405080/7310375008","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daeceecf/30475e68c2096095_b.jpg","GoodsImgCount":"1","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020075782","title":"唐宋词简释","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.2,"price":7.7,"shippingFee":3.5,"differencePrice":-11.2,"GoodsUrl":"https://book.kongfz.com/206421/8501383468","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6147505/9dea4fd349d3d63a_b.jpg","GoodsImgCount":"2","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531855354","title":"东汉演义之二十八《武瘟神下山》","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":25,"shippingFee":0,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/712837/6676396249","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbfaaede/5fd873f0845c0e19_b.jpg","GoodsImgCount":"6","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516100516","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806683200","title":"上海探戈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.79,"price":1.59,"shippingFee":3.2,"differencePrice":-4.79,"GoodsUrl":"https://book.kongfz.com/739740/7152710203","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbacecee/cac0ec945280e864_b.jpg","GoodsImgCount":"4","onSaleCount":228,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502705329","title":"正版 (同系3本包邮)中国古代航海 中国传统民俗文化政治经济制度系列古代航海活动 海上丝绸之路 郑和下西洋指南针的发明与航海等古代航海事业 9787502705329","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.3,"price":14.3,"shippingFee":6,"differencePrice":-20.3,"GoodsUrl":"https://book.kongfz.com/14409/8719267733","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1570906/9b5183c8dd9004c0_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300305042","title":"小学儿童心理学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":5.5,"shippingFee":1.5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/774690/8698078134","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/12774130/3dec28e005f0c72f_b.jpg","GoodsImgCount":"1","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543579217","title":"少年时飞机大解剖","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6,"price":3,"shippingFee":3,"differencePrice":-6,"GoodsUrl":"https://book.kongfz.com/838443/8811129821","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffaeffad/54baa2c8e92b3e4a_b.jpg","GoodsImgCount":"1","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802128125","title":"中国分省系列地图集 河北省地图集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":7,"shippingFee":5,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/911327/8701948242","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdccbec/8f996e037aa30df2_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101015485","title":"祥云县志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":126,"price":120,"shippingFee":6,"differencePrice":-126,"GoodsUrl":"https://book.kongfz.com/409331/3661003725","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eccfbcdd/733430ba3bdecdfb_b.jpg","GoodsImgCount":"6","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117267304","title":"正版二手 变态心理学(第3版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.69,"price":16.69,"shippingFee":0,"differencePrice":-16.69,"GoodsUrl":"https://book.kongfz.com/549116/8830860499","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D4/28/p4YBAFt-5veAPPw7AABq9rtHFGs112_b.jpg","GoodsImgCount":"1","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218045627","title":"现象学的始基","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.16,"price":32.16,"shippingFee":0,"differencePrice":-32.16,"GoodsUrl":"https://book.kongfz.com/792228/8885481303","imgBigUrl":"https://www0.kfzimg.com/G06/M00/62/A7/p4YBAFuCZAWAOEfaAAA_Rk5xTx8034_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513312097","title":"人骨拼图:林肯·莱姆系列之一","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.27,"price":13.27,"shippingFee":10,"differencePrice":-23.27,"GoodsUrl":"https://book.kongfz.com/915406/8415906199","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecfbead/4d4a0685889879f4_b.jpg","GoodsImgCount":"3","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513653343","title":"商社就是天网","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.94,"price":16.94,"shippingFee":5,"differencePrice":-21.94,"GoodsUrl":"https://book.kongfz.com/202798/8568284655","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfafbfc/c08df37a7d16dd93_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040079869","title":"电子技术基础数字部分第4版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":0.5,"shippingFee":5,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/820017/8732562193","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaecdacd/e70eef6ce74fdfbe_b.jpg","GoodsImgCount":"2","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505725508","title":"盗墓笔记5 谜海归巢","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.92,"price":4.12,"shippingFee":2.8,"differencePrice":-6.92,"GoodsUrl":"https://book.kongfz.com/1093663/8899378239","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daffabac/fe727b4b941bbc33_b.jpg","GoodsImgCount":"1","onSaleCount":362,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509155189","title":"颈腰关节疼痛及注射疗法 第5版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":184,"price":168,"shippingFee":16,"differencePrice":-184,"GoodsUrl":"https://book.kongfz.com/165055/8254619732","imgBigUrl":"https://www0.kfzimg.com/G05/M00/F1/D0/p4YBAFmNI22AdqQ1AAT058m6zlw056_b.jpg","GoodsImgCount":"9","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509641651","title":"实拍图 文化的逻辑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.74,"price":4.74,"shippingFee":5,"differencePrice":-9.74,"GoodsUrl":"https://book.kongfz.com/802501/8561762805","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbabfcdc/6980f786578b04a8_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200044867","title":"梦断紫禁城","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.08,"price":2.08,"shippingFee":3,"differencePrice":-5.08,"GoodsUrl":"https://book.kongfz.com/832065/8677126488","imgBigUrl":"https://www0.kfzimg.com/G06/M00/B0/84/p4YBAFrBjlSAJZRXAADDlnNLY8U712_b.jpg","GoodsImgCount":"1","onSaleCount":162,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801123596","title":"中国民主建国会史稿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":2.2,"shippingFee":3.3,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/912942/8547857084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcefdeae/6c07c7d88214a065_b.jpg","GoodsImgCount":"2","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301139899","title":"地质学原理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":29,"shippingFee":9,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/521012/8429778365","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfbbdbcd/7e66c3c7cba28ccd_b.jpg","GoodsImgCount":"4","onSaleCount":150,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787104019404","title":"中国现代话剧教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":2,"shippingFee":8,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/23363/8631048802","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3089567/3d8d13eefa1391ea_b.jpg","GoodsImgCount":"3","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506671965","title":"温室气体核算体系:企业价值链(范围三)核算与报告标准","quality":0,"qualityText":"","originalPrice":0,"totalPrice":88,"price":78,"shippingFee":10,"differencePrice":-88,"GoodsUrl":"https://book.kongfz.com/12885/7710497039","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aeaedccf/213af3af7a5412cd_b.jpg","GoodsImgCount":"3","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108016850","title":"人·兽·鬼","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.779999999999999,"price":5.77,"shippingFee":0.01,"differencePrice":-5.779999999999999,"GoodsUrl":"https://book.kongfz.com/877749/8801481679","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/421097e73bed945d_b.jpg","GoodsImgCount":"3","onSaleCount":382,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111350118","title":"材料力学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":14,"shippingFee":8,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/190848/8546617490","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebfbffac/bbc9b45a3879d75e_b.jpg","GoodsImgCount":"1","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539996301","title":"纳粹医生:医学屠杀与种族灭绝心理学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":22,"shippingFee":7,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/677955/8132923615","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efaecfbb/b6bb3ab2cfa17bb1_b.jpg","GoodsImgCount":"10","onSaleCount":171,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117141598","title":"实地解剖学(本科创新教材)(第2版)羊惠君9787117141598人民卫生出版社羊惠君 编人民卫生出版社9787117141598","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":10,"shippingFee":0,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/810267/8649014717","imgBigUrl":"https://www0.kfzimg.com/G06/M00/20/51/p4YBAFqaTeyAWKo9AAB4_CSZkNs668_b.jpg","GoodsImgCount":"2","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532785230","title":"彩虹几度","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.5,"price":10,"shippingFee":7.5,"differencePrice":-17.5,"GoodsUrl":"https://book.kongfz.com/274142/6240614349","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbfddad/7d7cfe731f17e04d_b.jpg","GoodsImgCount":"4","onSaleCount":103,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801456915","title":"世界艳史 彩图版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.36,"price":1.36,"shippingFee":3,"differencePrice":-4.36,"GoodsUrl":"https://book.kongfz.com/791250/8511647318","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babfecff/e3ea21a762374dc7_b.jpg","GoodsImgCount":"1","onSaleCount":285,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805202174","title":"白话尚书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.2,"price":8.2,"shippingFee":4,"differencePrice":-12.2,"GoodsUrl":"https://book.kongfz.com/203004/8424128025","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdebccad/0b4a13e8667c9f38_b.jpg","GoodsImgCount":"1","onSaleCount":50,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100240147","title":"回望;西南联大沉思录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":44.9,"price":42.9,"shippingFee":2,"differencePrice":-44.9,"GoodsUrl":"https://book.kongfz.com/531424/8836849831","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfecbfde/300a0427a530a221_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556841233","title":"我的第一本科学漫画书 世界寻宝记26 意大利1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.53,"price":1.03,"shippingFee":4.5,"differencePrice":-5.53,"GoodsUrl":"https://book.kongfz.com/1148054/8608793479","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddaabcec/c7db2f605b3fe3d5_b.jpg","GoodsImgCount":"1","onSaleCount":136,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521728057","title":"薛暮桥年谱 1904-1952","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":24.8,"shippingFee":5,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/180897/8428895461","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceceafce/caceb3157ab2e82e_b.jpg","GoodsImgCount":"1","onSaleCount":128,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547258569","title":"你若不勇敢谁替你坚强思履编9787547258569","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":0.5,"shippingFee":2.8,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/783757/8331651577","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdeddde/efd4c2250ad6a94d_b.jpg","GoodsImgCount":"1","onSaleCount":337,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547122990","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560082073","title":"剑桥雅思听力精练","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.03,"price":9.03,"shippingFee":4,"differencePrice":-13.03,"GoodsUrl":"https://book.kongfz.com/884251/8122170338","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaeeafee/47b06a1e8e364586_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550605015","title":"高盛在中国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3,"price":4.29,"shippingFee":0.01,"differencePrice":-4.3,"GoodsUrl":"https://book.kongfz.com/836621/8847676368","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeccebf/0ebeedb9d50da249_b.jpg","GoodsImgCount":"4","onSaleCount":263,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559639769","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302112785","title":"第三次改革:中国非营利部门战略研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.89,"price":6.39,"shippingFee":1.5,"differencePrice":-7.89,"GoodsUrl":"https://book.kongfz.com/774690/8186180572","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AB/04/p4YBAFr8MJuAGAghAAA1z6WS3zI917_b.jpg","GoodsImgCount":"1","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530771389","title":"35公斤的希望","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.84,"price":8.04,"shippingFee":3.8,"differencePrice":-11.84,"GoodsUrl":"https://book.kongfz.com/1213190/8836708018","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dafaafec/7cf7665548548831_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533937102","title":"名家散文典藏·平凹散文:丑石","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.9,"price":5.9,"shippingFee":3,"differencePrice":-8.9,"GoodsUrl":"https://book.kongfz.com/681595/8690093248","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddbdffb/4f941801eb25debf_b.jpg","GoodsImgCount":"3","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536015920","title":"周易八卦实解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34,"price":28,"shippingFee":6,"differencePrice":-34,"GoodsUrl":"https://book.kongfz.com/907443/8170308109","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafeecaf/897ff4b8c0710df5_b.jpg","GoodsImgCount":"7","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516606476","title":"实干成就梦想","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":4.8,"shippingFee":5,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/350027/5033853984","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcacdab/2a63dd061ea42499_b.jpg","GoodsImgCount":"7","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301354377","title":"你写的论文,为什么老师总看不上?","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.58,"price":26.58,"shippingFee":3,"differencePrice":-29.58,"GoodsUrl":"https://book.kongfz.com/787155/8780056007","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13196094/1eec498b7026e22c_b.jpg","GoodsImgCount":"1","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122223289","title":"【正版二手】建筑结构与选型崔钦淑9787122223289化学工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.78,"price":3.78,"shippingFee":0,"differencePrice":-3.78,"GoodsUrl":"https://book.kongfz.com/805904/7166459946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/febaefaf/7e1ada906fcd9fe5_b.jpg","GoodsImgCount":"6","onSaleCount":101,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530215982","title":"风声","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.4,"price":7.4,"shippingFee":4,"differencePrice":-11.4,"GoodsUrl":"https://book.kongfz.com/203004/8422969956","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcaedba/f9c5e1712684ca6f_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511273048","title":"麻省理工商学院最具影响力的商业哲学课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.66,"price":12.66,"shippingFee":0,"differencePrice":-12.66,"GoodsUrl":"https://book.kongfz.com/792228/8901674659","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E2/0D/p4YBAFqY5zyAO8BbAADniLoteH8960_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502844684","title":"主力行为盘口解密二 随机发","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":6,"shippingFee":2,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/755561/8872649902","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbcffdcc/041163d5f287171b_b.jpg","GoodsImgCount":"3","onSaleCount":152,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504486004","title":"中国传统民俗文化 中国古代城墙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.8100000000000005,"price":1.81,"shippingFee":5,"differencePrice":-6.8100000000000005,"GoodsUrl":"https://book.kongfz.com/23607/8261593719","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deacabba/95b12624c888dc2c_b.jpg","GoodsImgCount":"1","onSaleCount":147,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507753936","title":"环喜马拉雅区域研究编译文集二——佐米亚、边疆与跨界","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33.3,"price":27.3,"shippingFee":6,"differencePrice":-33.3,"GoodsUrl":"https://book.kongfz.com/522587/8886443261","imgBigUrl":"https://www0.kfzimg.com/G06/M00/37/D8/p4YBAFsnavWAAHndAABM74pZ9cE770_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504691422","title":"百年耕耘 金善宝传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.58,"price":24.58,"shippingFee":5,"differencePrice":-29.58,"GoodsUrl":"https://book.kongfz.com/716746/8485861144","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddccfdfa/320fa35108c02c52_b.jpg","GoodsImgCount":"2","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121350894","title":"服装设计效果图手绘教程 全彩","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.6899999999999995,"price":0.69,"shippingFee":5,"differencePrice":-5.6899999999999995,"GoodsUrl":"https://book.kongfz.com/1215524/8813604508","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decedfeb/df55bfbeacd0bdc0_b.jpg","GoodsImgCount":"2","onSaleCount":110,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530858394","title":"最具人气的110篇微型小说","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":2.2,"shippingFee":5,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/820017/8708554212","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dedacdcd/5f5491cc457f068e_b.jpg","GoodsImgCount":"2","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509130520","title":"吕仁和临床经验集(第二辑)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":38,"shippingFee":10,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/273906/7915510103","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afaccaba/e01e4552aa321dbb_b.jpg","GoodsImgCount":"5","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101021264","title":"启功丛稿 论文卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/15897/8530660645","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebfcbfae/f929a4dd9ca3e4b8_b.jpg","GoodsImgCount":"6","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541126628","title":"和气生财","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.39,"price":0.89,"shippingFee":4.5,"differencePrice":-5.39,"GoodsUrl":"https://book.kongfz.com/898393/8830817137","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedbcfde/d399a83aa69886b0_b.jpg","GoodsImgCount":"3","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561716977","title":"天然美容法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.98,"price":6.98,"shippingFee":4,"differencePrice":-10.98,"GoodsUrl":"https://book.kongfz.com/787407/7457083905","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beedbcfc/e65d9aa20e1a0495_b.jpg","GoodsImgCount":"5","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513177245","title":"原生家庭创伤和疗愈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.49,"price":3.49,"shippingFee":5,"differencePrice":-8.49,"GoodsUrl":"https://book.kongfz.com/716746/8530263030","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccaeaddb/d3877c98415ad8ec_b.jpg","GoodsImgCount":"1","onSaleCount":94,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549622993","title":"七种武器 2 碧玉九 多情环 古龙 文汇出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.65,"price":8.65,"shippingFee":4,"differencePrice":-12.65,"GoodsUrl":"https://book.kongfz.com/878042/8892052988","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebfebeff/ee8c98cacf018c9f_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516123911","title":"正学 第1辑 程水金 主编中国社会科学出版社9787516123911","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.3,"price":6.3,"shippingFee":0,"differencePrice":-6.3,"GoodsUrl":"https://book.kongfz.com/248516/8445608487","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/5695f680954765b6_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541541247","title":"白话资治通鉴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.08,"price":4.48,"shippingFee":1.6,"differencePrice":-6.08,"GoodsUrl":"https://book.kongfz.com/457799/8458628865","imgBigUrl":"https://www0.kfzimg.com/G06/M00/DB/5D/p4YBAFqYz9yAHTnOAADftrtdLbw543_b.jpg","GoodsImgCount":"1","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547908471","title":"《增广贤文》行楷硬笔字帖","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.19,"price":18.19,"shippingFee":0,"differencePrice":-18.19,"GoodsUrl":"https://book.kongfz.com/792228/8894526011","imgBigUrl":"https://www0.kfzimg.com/G06/M00/5B/8A/p4YBAFqcjB6AXbWlAACxpMJRAxM805_b.jpg","GoodsImgCount":"1","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806051467","title":"中国当代散文精品大观","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.7,"price":5.7,"shippingFee":5,"differencePrice":-10.7,"GoodsUrl":"https://book.kongfz.com/1207201/8732056718","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fadbdafc/d7ca7a014dc6ecd4_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229011628","title":"数字X线成像技术操作规范与剂量优化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.5,"price":14.5,"shippingFee":2,"differencePrice":-16.5,"GoodsUrl":"https://book.kongfz.com/181222/7301030202","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21084698/936f69f883c7f63f_b.jpg","GoodsImgCount":"1","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030438393","title":"原子物理与量子力学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":19,"shippingFee":6,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/219170/8854670030","imgBigUrl":"https://www0.kfzimg.com/G06/M00/0B/61/p4YBAFqZ--OAGdjqAACto8Azpr0414_b.jpg","GoodsImgCount":"1","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535110008","title":"楚辞文化背景研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/257645/8385818159","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eecbadab/53120eaadf8ddada_b.jpg","GoodsImgCount":"13","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559632340","title":"火:鲁米抒情诗","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.8,"price":14,"shippingFee":5.8,"differencePrice":-19.8,"GoodsUrl":"https://book.kongfz.com/1184610/8732818645","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fefffcdc/ef95dd5ef39a5110_b.jpg","GoodsImgCount":"1","onSaleCount":155,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807592501","title":"孔子家语插图本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.859999999999999,"price":0.06,"shippingFee":4.8,"differencePrice":-4.859999999999999,"GoodsUrl":"https://book.kongfz.com/245306/8519611266","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fedfadef/9ceb5bc75d4c177d_b.jpg","GoodsImgCount":"1","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020131617","title":"弹吧 莫扎特 弹吧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":6.1,"shippingFee":5.6,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/1151143/8891642184","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/debdabbc/1d8c6f57855cbebb_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567530416","title":"大夏书系·我的教育信条","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":3,"shippingFee":7,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/251066/6314429244","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dddbfebd/e08eb5004a5a2688_b.jpg","GoodsImgCount":"6","onSaleCount":149,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508698144","title":"认知尺度","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.14,"price":6.54,"shippingFee":1.6,"differencePrice":-8.14,"GoodsUrl":"https://book.kongfz.com/457799/8340498745","imgBigUrl":"https://www0.kfzimg.com/G07/M00/5D/39/qoYBAFxtK26AJQSTAAEIhLXCEPk917_b.jpg","GoodsImgCount":"1","onSaleCount":168,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108056115","title":"蔡澜作品自选集9:一缕余香","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.76,"price":17.76,"shippingFee":5,"differencePrice":-22.76,"GoodsUrl":"https://book.kongfz.com/640398/8325606114","imgBigUrl":"https://www0.kfzimg.com/G06/M00/92/9B/p4YBAFqeNLeATHCWAACUTSWV7sA518_b.jpg","GoodsImgCount":"1","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534084669","title":"自怡书迹(篆书卷)/黄宾虹书法集粹","quality":0,"qualityText":"","originalPrice":0,"totalPrice":300,"price":290,"shippingFee":10,"differencePrice":-300,"GoodsUrl":"https://book.kongfz.com/668742/7408798391","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eccfdcab/c60bd3db8bb088c3_b.jpg","GoodsImgCount":"1","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500083498","title":"亚洲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.58,"price":23.58,"shippingFee":0,"differencePrice":-23.58,"GoodsUrl":"https://book.kongfz.com/492548/8866390914","imgBigUrl":"https://www0.kfzimg.com/G06/M00/83/39/p4YBAFsp0mWAAVA_AAF056wk3DA841_b.jpg","GoodsImgCount":"1","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787210115472","title":"锁定高端:中小企业的出路【正版 塑封 发货快】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":62.8,"price":52.8,"shippingFee":10,"differencePrice":-62.8,"GoodsUrl":"https://book.kongfz.com/891652/8701830203","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebbfacbc/3f994e3345e47706_b.jpg","GoodsImgCount":"5","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301188378","title":"我要做个好家长:家庭教育的核心理念和操作方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.68,"price":4.68,"shippingFee":0,"differencePrice":-4.68,"GoodsUrl":"https://book.kongfz.com/840504/8515494439","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfdbaebd/c66372e6c229f47e_b.jpg","GoodsImgCount":"8","onSaleCount":101,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550623736","title":"子海精华编:四存编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":11,"shippingFee":5,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/737771/8807102818","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F6/AD/p4YBAFqyPJaAVf3fAABnbpaPYeo653_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539670140","title":"一念永恒6 耳根 安徽文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35.67,"price":30.67,"shippingFee":5,"differencePrice":-35.67,"GoodsUrl":"https://book.kongfz.com/878060/8899600389","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbabfcbb/b37d38ca1a66ebf0_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509716229","title":"社会学之思","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.5,"price":12.5,"shippingFee":6,"differencePrice":-18.5,"GoodsUrl":"https://book.kongfz.com/770286/8333236126","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeefbcb/2d1619b6ae1c99c7_b.jpg","GoodsImgCount":"10","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800735912","title":"最大化你的自尊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.88,"price":4.38,"shippingFee":3.5,"differencePrice":-7.88,"GoodsUrl":"https://book.kongfz.com/819139/8780150484","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbcbafcf/16ff682d72d85325_b.jpg","GoodsImgCount":"5","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117117968","title":"一病一页速成系列·症状与体征(翻译版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":30,"shippingFee":5,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/244916/7672342792","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcbafce/36e348e3b2781add_b.jpg","GoodsImgCount":"5","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503419843","title":"国民党将领谈国共大决战:战场较量","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.16,"price":8.66,"shippingFee":1.5,"differencePrice":-10.16,"GoodsUrl":"https://book.kongfz.com/774690/8698048698","imgBigUrl":"https://www0.kfzimg.com/G06/M00/90/C0/p4YBAFqnIWGAZPmWAACgYFH2BdA325_b.jpg","GoodsImgCount":"1","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535437822","title":"谈美书简:大家文论经典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.89,"price":0.09,"shippingFee":4.8,"differencePrice":-4.89,"GoodsUrl":"https://book.kongfz.com/780405/7794576703","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bebffdbd/621954b1d9ca687b_b.jpg","GoodsImgCount":"4","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511708991","title":"光明大手印:实修心髓(下卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/271386/8128810121","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdeefdfc/812225588f075059_b.jpg","GoodsImgCount":"6","onSaleCount":172,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512516236","title":"等我·遇繁","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.2,"price":8.2,"shippingFee":2,"differencePrice":-10.2,"GoodsUrl":"https://book.kongfz.com/545601/8868078177","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdedecc/1f05c7eabb2dae12_b.jpg","GoodsImgCount":"2","onSaleCount":255,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501255726","title":"与爱有关 1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.779999999999999,"price":3.28,"shippingFee":1.5,"differencePrice":-4.779999999999999,"GoodsUrl":"https://book.kongfz.com/772556/8042035571","imgBigUrl":"https://www0.kfzimg.com/G06/M00/37/61/p4YBAFqbSJeAI6TRAAC8PL7kUTA655_b.jpg","GoodsImgCount":"1","onSaleCount":125,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806845394","title":"第三届全国会计知识大赛法规汇编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2.5,"shippingFee":4.5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/285622/5472130653","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfaccbbc/877daef6e53689dc_b.jpg","GoodsImgCount":"3","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545823349","title":"中国城市轨道交通年鉴2023","quality":0,"qualityText":"","originalPrice":0,"totalPrice":88,"price":80,"shippingFee":8,"differencePrice":-88,"GoodsUrl":"https://book.kongfz.com/15878/8635018981","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdbbefdf/7203761aa85bddbe_b.jpg","GoodsImgCount":"7","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520206716","title":"故宫里的大怪兽 木之精灵","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":0.5,"shippingFee":4.5,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/531994/8811950065","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daddabbc/19753635be32a51a_b.jpg","GoodsImgCount":"1","onSaleCount":176,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806960325","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515307497","title":"结构与明暗 素描几何形体单体训练","quality":0,"qualityText":"","originalPrice":0,"totalPrice":60,"price":50,"shippingFee":10,"differencePrice":-60,"GoodsUrl":"https://book.kongfz.com/28297/8404195016","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aacefaab/a69030f0b920a813_b.jpg","GoodsImgCount":"4","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113253271","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539169903","title":"怪杰佐罗力之魔法师的弟子","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":4.4,"shippingFee":2.5,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/782278/8853393863","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdcecfc/7a4f8f77be4872f0_b.jpg","GoodsImgCount":"4","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505411937","title":"东风破","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.65,"price":2.25,"shippingFee":2.4,"differencePrice":-4.65,"GoodsUrl":"https://book.kongfz.com/692223/8848001982","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeabbada/18d4a6e00b5282e5_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540776886","title":"极简黄河史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.899999999999999,"price":5.3,"shippingFee":5.6,"differencePrice":-10.899999999999999,"GoodsUrl":"https://book.kongfz.com/1151143/8749172406","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbfaddcc/1c4188e8273e071e_b.jpg","GoodsImgCount":"2","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801432322","title":"中国的危机 下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.7,"price":0.7,"shippingFee":5,"differencePrice":-5.7,"GoodsUrl":"https://book.kongfz.com/1207201/8732160973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bffaacfd/55b5e6a712210d46_b.jpg","GoodsImgCount":"1","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522511986","title":"心知肚明9787522511986","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.32,"price":26.32,"shippingFee":4,"differencePrice":-30.32,"GoodsUrl":"https://book.kongfz.com/655396/8896033621","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9868355/0c51063e3a790f70_b.jpg","GoodsImgCount":"1","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508668680","title":"理性的非理性:人人都需要的十堂营销心理课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":10.2,"shippingFee":4.8,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/22176/8708259911","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F1/A6/p4YBAFqZN7eAT8t7AADm2HMJsK8866_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545428117","title":"《市场赢家生存智慧》丛书·高级波段交易:预期、确认、交易期货市场波段的交易策略","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40,"price":35,"shippingFee":5,"differencePrice":-40,"GoodsUrl":"https://book.kongfz.com/806881/8791937670","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdeafbbd/4a7a74100aaf4936_b.jpg","GoodsImgCount":"9","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532757060","title":"培根随笔全集培根","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":7,"shippingFee":0,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/576646/8248968682","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faeebaaf/5aedb15807c176ce_b.jpg","GoodsImgCount":"1","onSaleCount":89,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507322910","title":"中国“三农”问题研究(下)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.9,"price":14,"shippingFee":7.9,"differencePrice":-21.9,"GoodsUrl":"https://book.kongfz.com/266593/8514771412","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edefdaad/eefd5c7965a65e96_b.jpg","GoodsImgCount":"1","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806456095","title":"旋风再起林志颖","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.990000000000002,"price":13.99,"shippingFee":3,"differencePrice":-16.990000000000002,"GoodsUrl":"https://book.kongfz.com/525062/7952933376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffccdbfb/d89b4ebf5e73be91_b.jpg","GoodsImgCount":"4","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519882723","title":"综合能源服务百家实践案例集(2023年版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":95,"price":88,"shippingFee":7,"differencePrice":-95,"GoodsUrl":"https://book.kongfz.com/363535/8017764796","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efbbfadc/fb12de80869054a3_b.jpg","GoodsImgCount":"3","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514367324","title":"【正版二手,当日发货,所见即所得】直指生命的真相","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25.5,"price":15.5,"shippingFee":10,"differencePrice":-25.5,"GoodsUrl":"https://book.kongfz.com/314591/8873898618","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbaeadba/ce7c89c2b3d883b0_b.jpg","GoodsImgCount":"2","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561367186","title":"道德经的奥秘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/327097/8898096706","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daededeb/4052728ffcad3402_b.jpg","GoodsImgCount":"11","onSaleCount":261,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020033232","title":"人有病 :一九四九年后中国文坛纪实","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":2,"shippingFee":15,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/702376/8574002491","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdcbfbed/8f994a0ce4511fd7_b.jpg","GoodsImgCount":"9","onSaleCount":146,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546343815","title":"鲁迅经典文集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":1,"shippingFee":3,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/832065/8677403155","imgBigUrl":"https://www0.kfzimg.com/G06/M00/8F/2B/p4YBAFrJk8GAcBv1AAD2D_aSEjw105_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302611257","title":"趣味数学300题","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.34,"price":23.14,"shippingFee":3.2,"differencePrice":-26.34,"GoodsUrl":"https://book.kongfz.com/739740/8455964241","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabaadee/c56a8a360873d9bf_b.jpg","GoodsImgCount":"4","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515341132","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556073115","title":"李毓佩数学故事智斗系列·数学小子杜鲁克","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.54,"price":6.54,"shippingFee":0,"differencePrice":-6.54,"GoodsUrl":"https://book.kongfz.com/196857/8660963953","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E2/9B/p4YBAFskolqAGC7PAAD-YhhDpOQ512_b.jpg","GoodsImgCount":"1","onSaleCount":99,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805926230","title":"心香泪酒祭吴宓","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.4,"price":2.4,"shippingFee":5,"differencePrice":-7.4,"GoodsUrl":"https://book.kongfz.com/1207077/8774008733","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bceafceb/e6e84c0a6968bedb_b.jpg","GoodsImgCount":"1","onSaleCount":167,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513919159","title":"万物简史 布森特 民主与建设出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.1,"price":2.1,"shippingFee":5,"differencePrice":-7.1,"GoodsUrl":"https://book.kongfz.com/180897/8769178321","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdabbaee/25c282fef18ab380_b.jpg","GoodsImgCount":"1","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787107274169","title":"数学 八年级下 教师教学用书 9787107274169","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.8,"price":6.3,"shippingFee":4.5,"differencePrice":-10.8,"GoodsUrl":"https://book.kongfz.com/1121890/8881703556","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcabafca/a28f75df568c2578_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534607820","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534237003","title":"童年的云彩——冰心儿童文学新作奖获奖作者丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3100000000000005,"price":1.42,"shippingFee":2.89,"differencePrice":-4.3100000000000005,"GoodsUrl":"https://book.kongfz.com/826403/8655659602","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fefdbaec/0ac8ce22befd9b77_b.jpg","GoodsImgCount":"2","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807256465","title":"交通银行史画 中英文本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36,"price":31,"shippingFee":5,"differencePrice":-36,"GoodsUrl":"https://book.kongfz.com/766980/8311121800","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eecbbcfc/36be02eef1c632ec_b.jpg","GoodsImgCount":"1","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546122649","title":"中国文化源与流X-GM","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":7.2,"shippingFee":4.5,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/473622/8709248209","imgBigUrl":"https://www0.kfzimg.com/G06/M00/17/08/p4YBAFsYv3KASa21AAB3m2dwVTA494_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535657886","title":"绯弹的亚里亚.3.蜂蜜色陷阱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.5,"price":12.9,"shippingFee":1.6,"differencePrice":-14.5,"GoodsUrl":"https://book.kongfz.com/464363/8082360131","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1303/f3ae13fed07610a2_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516100158","title":"当代中国简帛学研究:1949-2009","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.6,"price":13.6,"shippingFee":5,"differencePrice":-18.6,"GoodsUrl":"https://book.kongfz.com/285265/8420474812","imgBigUrl":"https://www0.kfzimg.com/G06/M00/09/94/p4YBAFqiQTqAfU-fAAB8biLxNVg251_b.jpg","GoodsImgCount":"0","onSaleCount":89,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562153719","title":"数字媒体艺术设计概论谢成开西南师范大学出版社9787562153719","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.98,"price":3.98,"shippingFee":0,"differencePrice":-3.98,"GoodsUrl":"https://book.kongfz.com/366030/8389757114","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/ab8853cb8613e942_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507744088","title":"中医儿科杂病调治 临床验案心得","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.4,"price":8.4,"shippingFee":5,"differencePrice":-13.4,"GoodsUrl":"https://book.kongfz.com/1146983/8731284798","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccabaeea/bec4a3f3ca202604_b.jpg","GoodsImgCount":"1","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562491927","title":"焦虑症和恐惧症:一种认知的观点","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/722553/8053935000","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbbbefb/06a98a8307a77647_b.jpg","GoodsImgCount":"10","onSaleCount":113,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787215063983","title":"人学的科学之路","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":38,"shippingFee":10,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/677747/5525845992","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebefffaa/2aae35f9a9c3c119_b.jpg","GoodsImgCount":"3","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540736590","title":"《发货快》冰心作品精编 冰心 著,卓如 选编 漓江出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.29,"price":4.29,"shippingFee":0,"differencePrice":-4.29,"GoodsUrl":"https://book.kongfz.com/156492/8477626078","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4362605/2b017963221ae54e_b.jpg","GoodsImgCount":"1","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559602589","title":"*超脑/团灭","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.8,"price":11.9,"shippingFee":3.9,"differencePrice":-15.8,"GoodsUrl":"https://book.kongfz.com/622913/8781293258","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1C/A7/p4YBAFqaPyaASO8OAADjaotTI2g047_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509209028","title":"节能技术(一)(二)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.04,"price":3.04,"shippingFee":5,"differencePrice":-8.04,"GoodsUrl":"https://book.kongfz.com/821188/8009266743","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcbddaa/4441735d2fc83d12_b.jpg","GoodsImgCount":"4","onSaleCount":53,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787557614034","title":"糖尿病调养三部曲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.93,"price":5.93,"shippingFee":3,"differencePrice":-8.93,"GoodsUrl":"https://book.kongfz.com/364423/8154767176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11281955/b1d32f99f88a512f_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807429777","title":"黄庭禅","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40,"price":33,"shippingFee":7,"differencePrice":-40,"GoodsUrl":"https://book.kongfz.com/251066/8876471272","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbbcafe/cc28a29941eab7d3_b.jpg","GoodsImgCount":"8","onSaleCount":74,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111385479","title":"管理者每天读点韩非子","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.4,"price":14.4,"shippingFee":5,"differencePrice":-19.4,"GoodsUrl":"https://book.kongfz.com/1207201/8642575748","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edfbaeff/3799b38ac41be0c2_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787313270368","title":"初中英语语法专练 大字版 知识点梳理 全国 中学英语专练百分百","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.11,"price":12.61,"shippingFee":1.5,"differencePrice":-14.11,"GoodsUrl":"https://book.kongfz.com/772556/7933482079","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10317333/28422663cee46d73_b.jpg","GoodsImgCount":"1","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121357961","title":"HTML+CSS+JavaScript编程从入门到精通 html5+css3基础自学教程web前端开发 网站网页前端设计制作建设","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":3.8,"shippingFee":0,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/590687/8602236711","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/578/6f71cebe6e2fe3c2_b.jpg","GoodsImgCount":"1","onSaleCount":149,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553646091","title":"新东方 直通托福基础教程 写作教育科技集团美国本科考试研究院浙江教育出版社9787553646091","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3,"price":4.3,"shippingFee":0,"differencePrice":-4.3,"GoodsUrl":"https://book.kongfz.com/248516/8440860798","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/7c0909d9fac80f7c_b.jpg","GoodsImgCount":"1","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519777418","title":"国家公诉人出庭指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":107.9,"price":99.9,"shippingFee":8,"differencePrice":-107.9,"GoodsUrl":"https://book.kongfz.com/218476/8455920813","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcbfaae/2f5ea8d721d8f099_b.jpg","GoodsImgCount":"8","onSaleCount":97,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535396464","title":"赛尔号精灵传说第二季5女神的愤怒","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.2,"price":1.2,"shippingFee":3,"differencePrice":-4.2,"GoodsUrl":"https://book.kongfz.com/902124/8232461903","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abacdfca/24cae20760f51e8c_b.jpg","GoodsImgCount":"4","onSaleCount":128,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508251738","title":"跌打损伤偏方验方疗法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":11,"shippingFee":9,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/879205/8386867884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadcbdeb/d46616aff116f328_b.jpg","GoodsImgCount":"4","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810971843","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539673882","title":"诡秘之主 10","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36,"price":30,"shippingFee":6,"differencePrice":-36,"GoodsUrl":"https://book.kongfz.com/738944/8666813116","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebebefcf/5b8c2f0af154a990_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550217454","title":"上帝掷骰子吗?:量子物理史话","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/522252/8881101832","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcedbffe/3bc31a21a55e85fe_b.jpg","GoodsImgCount":"10","onSaleCount":535,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533196677","title":"颞下颌关节外科手术图谱【未开封】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":40,"shippingFee":8,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/20113/8708722394","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2368075/5cc59fca61418e15_b.jpg","GoodsImgCount":"6","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545581447","title":"特工小品 小品绘著 天地出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.6,"price":3.6,"shippingFee":4,"differencePrice":-7.6,"GoodsUrl":"https://book.kongfz.com/878042/8780122369","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aabdbfaf/4c6e809d5f8ac283_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520717281","title":"基层中国:国家治理的基石","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/836297/8270087899","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecbffbbb/e7eba40da48936ea_b.jpg","GoodsImgCount":"5","onSaleCount":221,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503971549","title":"流动的博物馆李德庚9787503971549文化艺术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.6,"price":34.1,"shippingFee":5.5,"differencePrice":-39.6,"GoodsUrl":"https://book.kongfz.com/405080/7310559973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddbfdca/ddfaa51954478712_b.jpg","GoodsImgCount":"1","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301233009","title":"中外物理学精品书系·前沿系列:从抛物线谈起(混沌动力学引论)(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/785604/8009702581","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eefaffee/c4ebf23f89793c3e_b.jpg","GoodsImgCount":"9","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040150780","title":"高中新课程老师教育系列教材:高中音乐新课程教学论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39,"price":30,"shippingFee":9,"differencePrice":-39,"GoodsUrl":"https://book.kongfz.com/233641/6012616143","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdcedcd/c986845d3a146f0c_b.jpg","GoodsImgCount":"18","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508229942","title":"偏方验方治病丛书:胃病偏方验方疗法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/10563/4619429987","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbebdbef/fde06ecabc17f303_b.jpg","GoodsImgCount":"4","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802282452","title":"寒武纪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.4,"price":0.4,"shippingFee":3,"differencePrice":-3.4,"GoodsUrl":"https://book.kongfz.com/884527/8123402741","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfcebaeb/45e505eaf81204fa_b.jpg","GoodsImgCount":"4","onSaleCount":295,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501170388","title":"42部文学名著导读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":3.1,"shippingFee":5,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/700512/8535927223","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbcfbba/7b00d27ca9cbaa29_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516641590","title":"电信诈骗话语模式解读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":12,"shippingFee":5,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/758933/8311513802","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbdaabbc/85b378309fc2d5cf_b.jpg","GoodsImgCount":"2","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508679327","title":"会动的立体小汽车 超级工程车","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.03,"price":15.23,"shippingFee":2.8,"differencePrice":-18.03,"GoodsUrl":"https://book.kongfz.com/1093663/8881837238","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aedffeab/2fc4c6c70426a7cc_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302451402","title":"四川重庆古建筑地图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":132,"price":124,"shippingFee":8,"differencePrice":-132,"GoodsUrl":"https://book.kongfz.com/750186/6510117695","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accbaafc/7966d331b607474d_b.jpg","GoodsImgCount":"2","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560078403","title":"韩国语基础教程4 学生用书韩国西江大学韩国语教育院 著外语教学与研究出版社9787560078403","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.88,"price":4.88,"shippingFee":0,"differencePrice":-4.88,"GoodsUrl":"https://book.kongfz.com/366030/8432554732","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/8c0716368a76c0e7_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802551268","title":"财务报表就像一本故事书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/3092/8441875353","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbafffed/53bad65e508c1600_b.jpg","GoodsImgCount":"5","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564345402","title":"铁路线路与站场","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.9,"price":20.9,"shippingFee":9,"differencePrice":-29.9,"GoodsUrl":"https://book.kongfz.com/900492/8399542894","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23095665/8f6596c31f51ae90_b.jpg","GoodsImgCount":"1","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802543416","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562476443","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513330251","title":"变色龙马克斯","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.52,"price":3.52,"shippingFee":5,"differencePrice":-8.52,"GoodsUrl":"https://book.kongfz.com/716746/8573685578","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efcbddac/009ecce6718456e3_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101115253","title":"古钱极品/中国钱币丛书乙种本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":32,"shippingFee":11,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/23380/8891015518","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaadefed/cc33c8659337be72_b.jpg","GoodsImgCount":"6","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531327493","title":"我恋爱 我容易吗 二手书实拍图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.27,"price":1.77,"shippingFee":5.5,"differencePrice":-7.27,"GoodsUrl":"https://book.kongfz.com/898097/8767090319","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcafceed/ae1ea8b5b115d524_b.jpg","GoodsImgCount":"2","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539198675","title":"我要炼出黄金","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.61,"price":0.11,"shippingFee":2.5,"differencePrice":-2.61,"GoodsUrl":"https://book.kongfz.com/903233/8497337794","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbaedeaf/04d5fa349cc307a6_b.jpg","GoodsImgCount":"7","onSaleCount":405,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117333016","title":"颞下颌关节紊乱病临床诊疗解析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":86.4,"price":77,"shippingFee":9.4,"differencePrice":-86.4,"GoodsUrl":"https://book.kongfz.com/755104/8486452382","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdbcdef/cd8b52f5f18d0870_b.jpg","GoodsImgCount":"11","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533547981","title":"传世中医秘方","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":9,"shippingFee":3,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/566350/8858398045","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edcddbdb/e499acd32b9e1737_b.jpg","GoodsImgCount":"12","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547277898","title":"谭延闿临麻姑仙坛记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":47.35,"price":41.35,"shippingFee":6,"differencePrice":-47.35,"GoodsUrl":"https://book.kongfz.com/533712/7445542462","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdacdfcc/747808d442d68dbd_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122168108","title":"伟大的声音 演讲的力量 高温消毒发货 俞敏洪编 化学工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.199999999999996,"price":35.4,"shippingFee":1.8,"differencePrice":-37.199999999999996,"GoodsUrl":"https://book.kongfz.com/110/8696450340","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffdfacdf/23cd709fa1189c02_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565834691","title":"做最好的自己【全新】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.5,"price":0.5,"shippingFee":3,"differencePrice":-3.5,"GoodsUrl":"https://book.kongfz.com/241879/8585409526","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9187761/e00b22696eefd681_b.jpg","GoodsImgCount":"1","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115558534","title":"我的世界 年鉴2021","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":10,"shippingFee":7,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/696405/6634553010","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afccacdb/d9bfc72e1eb7dc88_b.jpg","GoodsImgCount":"10","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122185471","title":"电子电工技术全图解全集:PLC技术·变频技术速成全图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/760233/6672966429","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfcccaa/b1d730a43c135807_b.jpg","GoodsImgCount":"5","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800471193","title":"紫禁城的黄昏","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":10,"shippingFee":9,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/17163/6977347845","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afedfdcf/0e2cef314cfd9a14_b.jpg","GoodsImgCount":"3","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787574108943","title":"中国古代服饰结构图集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.5,"price":34.5,"shippingFee":7,"differencePrice":-41.5,"GoodsUrl":"https://book.kongfz.com/633822/8836490919","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5126996/a3aa257bc59f9af3_b.jpg","GoodsImgCount":"1","onSaleCount":168,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531004691","title":"邓散木印集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/189253/924912293","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1E/7D/p4YBAFsmYxmAEyJlAAKI5tlWFsM222_b.jpg","GoodsImgCount":"6","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500060833","title":"华罗庚学校初中物理试题解析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/690706/8016636203","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfcaabfb/9f3293f6168eadfd_b.jpg","GoodsImgCount":"10","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539753775","title":"北极熊王:中外动物小说精品","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/437976/8801246014","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbbdecbc/3ca925e159754de4_b.jpg","GoodsImgCount":"2","onSaleCount":140,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547722091","title":"地道英文写作进阶:外刊实用短语句型精选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":57,"price":57,"shippingFee":0,"differencePrice":-57,"GoodsUrl":"https://book.kongfz.com/356195/8896018285","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/c3ee7195f7455908_b.jpg","GoodsImgCount":"6","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302165309","title":"电子商务网站建设实验指导","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.93,"price":13.93,"shippingFee":10,"differencePrice":-23.93,"GoodsUrl":"https://book.kongfz.com/885269/8596565983","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D6/B2/p4YBAFqYvI-ADYiFAAC7RDvbnYE984_b.jpg","GoodsImgCount":"1","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538899429","title":"家有小学生的营养早餐","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.28,"price":0.5,"shippingFee":2.78,"differencePrice":-3.28,"GoodsUrl":"https://book.kongfz.com/785333/8671961291","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdacedec/7f7eb8b6035a3c34_b.jpg","GoodsImgCount":"1","onSaleCount":439,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010086798","title":"家庭文化学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/462357/8563912467","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbebcedf/9544c30b47cda303_b.jpg","GoodsImgCount":"11","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806862339","title":"大画幅摄影","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.85,"price":7.35,"shippingFee":1.5,"differencePrice":-8.85,"GoodsUrl":"https://book.kongfz.com/701775/8774482003","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfdbeabb/07a9faf8ce7aaefc_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572501159","title":"儿童和青少年普拉提 英 切莱斯特 科里 索菲奇 Celeste Corey Zopich 布雷特 霍华德 Brett Howard 道恩玛丽 伊克斯 Dawn Marie Ickes 主编 河南科学技术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.65,"price":15.65,"shippingFee":5,"differencePrice":-20.65,"GoodsUrl":"https://book.kongfz.com/903313/8867129101","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbaecdae/9a66480f20211491_b.jpg","GoodsImgCount":"1","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514222944","title":"洞见 赵昂 文化发展出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.4,"price":1.4,"shippingFee":5,"differencePrice":-6.4,"GoodsUrl":"https://book.kongfz.com/398369/8756316997","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abebbffb/38c9650f51d3487e_b.jpg","GoodsImgCount":"1","onSaleCount":146,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117263764","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787119079493","title":"吃喝玩乐超实用英语会话一本通 希伯伦股份有限公司编 外文出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":4.8,"shippingFee":5,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/180897/8441994084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afffeeaa/477bc761e5ae81c2_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502615178","title":"百战狐狸:职业机构实战操盘讲义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.77,"price":1.27,"shippingFee":5.5,"differencePrice":-6.77,"GoodsUrl":"https://book.kongfz.com/250120/8708646976","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dabebaeb/c9eea535bcbe11db_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561126028","title":"高等学校理工科物理类规划教材:量子力学(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":13,"shippingFee":7,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/217161/6851259518","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbceffdb/21857aa37ee9847a_b.jpg","GoodsImgCount":"4","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787554174623","title":"初一预习视频课英语","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9799999999999995,"price":4.18,"shippingFee":3.8,"differencePrice":-7.9799999999999995,"GoodsUrl":"https://book.kongfz.com/237705/8613570433","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafdfaeb/241850ced0e78c1a_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513533140","title":"英语. 二年级. 上册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.9899999999999998,"price":0.01,"shippingFee":2.98,"differencePrice":-2.9899999999999998,"GoodsUrl":"https://book.kongfz.com/840438/8166411046","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfafdbea/d633d70cee3e5f71_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121436604","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518440917","title":"读醉:宁夏酒庄指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":20,"shippingFee":0,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/10991/8852891015","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addfbadb/e166df1a5914a696_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514507799","title":"斗破苍穹(23)一版一印","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9,"price":0.9,"shippingFee":3,"differencePrice":-3.9,"GoodsUrl":"https://book.kongfz.com/668354/7024201760","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bacbcdcf/c0b24ea31449a10b_b.jpg","GoodsImgCount":"4","onSaleCount":243,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558902406","title":"不一样的圣诞节 达妮拉库洛特,方素珍 少年儿童出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":5.1,"shippingFee":3,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/521005/8337317394","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1B/43/p4YBAFqaO6-ADWX-AACLI7p96U4392_b.jpg","GoodsImgCount":"1","onSaleCount":117,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800420313","title":"难经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":65.9,"price":59.9,"shippingFee":6,"differencePrice":-65.9,"GoodsUrl":"https://book.kongfz.com/169274/8450740779","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbefdeb/17dce85a175b8604_b.jpg","GoodsImgCount":"4","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504747914","title":"王敬之讲田黄 9787504747914 王敬之 著 中国物资出版社 有疑问咨询客服","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.65,"price":12.65,"shippingFee":4,"differencePrice":-16.65,"GoodsUrl":"https://book.kongfz.com/790574/8853963934","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abbddeec/2595703d5b185aa7_b.jpg","GoodsImgCount":"1","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558911934","title":"海豚绘本花园:一家好认真好认真的餐厅","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.51,"price":10.91,"shippingFee":1.6,"differencePrice":-12.51,"GoodsUrl":"https://book.kongfz.com/470338/8091876352","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/16223501/d0ac2cf21ff67db3_b.jpg","GoodsImgCount":"0","onSaleCount":70,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121363634","title":"我超喜欢的趣味数学书 小学四年级 第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.59,"price":6.19,"shippingFee":2.4,"differencePrice":-8.59,"GoodsUrl":"https://book.kongfz.com/692223/8853556029","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adffadfd/7fc165d6fe4fbb20_b.jpg","GoodsImgCount":"1","onSaleCount":139,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509222133","title":"房地产企业全程会计核算与税务处理(第六版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":56,"price":50,"shippingFee":6,"differencePrice":-56,"GoodsUrl":"https://book.kongfz.com/520656/7331763806","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfcdfed/66caec80f6229f38_b.jpg","GoodsImgCount":"4","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510226991","title":"十大业务系列教材——职务犯罪检察业务","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":40,"shippingFee":8,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/584570/8436769476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdeafad/895dbfc10f7deb10_b.jpg","GoodsImgCount":"14","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810756075","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567597013","title":"大夏书系·教育的100种语言:丹麦教育见闻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.5,"price":10,"shippingFee":4.5,"differencePrice":-14.5,"GoodsUrl":"https://book.kongfz.com/585799/8333731294","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14917819/d342c68268bd6844_b.jpg","GoodsImgCount":"5","onSaleCount":90,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506749145","title":"医学衷中参西录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":50,"price":40,"shippingFee":10,"differencePrice":-50,"GoodsUrl":"https://book.kongfz.com/730822/8433255540","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/facdecbd/5cc0c5684378b427_b.jpg","GoodsImgCount":"5","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111288954","title":"供应链物流管理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.1,"price":4.1,"shippingFee":0,"differencePrice":-4.1,"GoodsUrl":"https://book.kongfz.com/733352/8279417108","imgBigUrl":"https://www0.kfzimg.com/G06/M00/58/FA/p4YBAFqcKLyANGCJAAErWD_1er4153_b.jpg","GoodsImgCount":"1","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214287892","title":"海外中国研究丛书·艺术系列 《中正之笔:颜真卿书法与宋代文人政治》赠包","quality":0,"qualityText":"","originalPrice":0,"totalPrice":60.08,"price":60.08,"shippingFee":0,"differencePrice":-60.08,"GoodsUrl":"https://book.kongfz.com/457799/8830585867","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/15505652/82c39efb161a5c45_b.jpg","GoodsImgCount":"1","onSaleCount":117,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501256730","title":"教育就是培养好习惯","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":1.3,"shippingFee":2,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/667558/8863965946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baadebdb/b72ce315488f2b9f_b.jpg","GoodsImgCount":"1","onSaleCount":431,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111326793","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540484958","title":"人类群星闪耀时","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.02,"price":5.42,"shippingFee":1.6,"differencePrice":-7.02,"GoodsUrl":"https://book.kongfz.com/457799/8321235881","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F7/BA/p4YBAFqhnLeANWRTAABg9lSn2Ks131_b.jpg","GoodsImgCount":"1","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556869824","title":"大中华寻宝系列26 新疆寻宝记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.5,"price":6.5,"shippingFee":5,"differencePrice":-11.5,"GoodsUrl":"https://book.kongfz.com/697065/8817518628","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdeffed/4edad2afd5490255_b.jpg","GoodsImgCount":"3","onSaleCount":193,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535429704","title":"少年天子 凌力著 长江文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.99,"price":4.99,"shippingFee":5,"differencePrice":-9.99,"GoodsUrl":"https://book.kongfz.com/1146983/8811740152","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcddced/5334a2f79e1bd2da_b.jpg","GoodsImgCount":"1","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532560868","title":"贾题韬讲坛经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/23153/8780563654","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/effabcae/0243a97a1d72ba14_b.jpg","GoodsImgCount":"15","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507535198","title":"暮色紫禁城 洋帝师眼中的溥仪与近代中国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.25,"price":2.85,"shippingFee":2.4,"differencePrice":-5.25,"GoodsUrl":"https://book.kongfz.com/692223/8222719769","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eabfeccd/807382cae33649cd_b.jpg","GoodsImgCount":"1","onSaleCount":175,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303086641","title":"说话的力量【封面几层书页有被顶破小洞】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":7,"shippingFee":7,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/211464/7174616446","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdceddbd/482a0066db3d5e28_b.jpg","GoodsImgCount":"9","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100034975","title":"美洲三书 扉页有水渍","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/12142/6630865417","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdedcae/cf96f3bd07d5c0df_b.jpg","GoodsImgCount":"7","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506449045","title":"开·合:纽扣拉链的连接艺术(书页干净无笔画。)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/273362/2564607312","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2593/022091c08a2390131d_b.jpg","GoodsImgCount":"4","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302364832","title":"国际物流黄新祥 等主编清华大学出版社9787302364832","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":0.5,"shippingFee":4,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/420387/8678386948","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/12298542/57d47de2dbc7168d_b.jpg","GoodsImgCount":"1","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302025207","title":"实用软件工程 第二版郑人杰等 编著清华大学出版社9787302025207","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.75,"price":3.75,"shippingFee":0,"differencePrice":-3.75,"GoodsUrl":"https://book.kongfz.com/366030/8275536127","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/e72b7e2e2cfde181_b.jpg","GoodsImgCount":"1","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208164208","title":"正版新书现货 宏观航运经济学 9787208164208 (希) 伊莱亚斯·卡拉基索斯, 兰布罗斯·瓦纳维兹著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31.26,"price":26.26,"shippingFee":5,"differencePrice":-31.26,"GoodsUrl":"https://book.kongfz.com/1181534/8500474938","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffaaddac/39f58d121b1b8db4_b.jpg","GoodsImgCount":"1","onSaleCount":67,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533951610","title":"吉姆:吉卜林作品(精装本)2018年1版1印","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.5,"price":25.5,"shippingFee":2,"differencePrice":-27.5,"GoodsUrl":"https://book.kongfz.com/1996/8650425365","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecedaeee/da61038dbe97ad9c_b.jpg","GoodsImgCount":"3","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801739261","title":"秦书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":50,"price":46,"shippingFee":4,"differencePrice":-50,"GoodsUrl":"https://book.kongfz.com/521036/8800425189","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbdafec/d093e26f8cc2c73f_b.jpg","GoodsImgCount":"8","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500690696","title":"边城","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.1,"price":4.1,"shippingFee":0,"differencePrice":-4.1,"GoodsUrl":"https://book.kongfz.com/880899/8678253491","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeedabd/1c5c446cb92761b3_b.jpg","GoodsImgCount":"2","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787570110940","title":"小学生叙事作文 思维导图作文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":1.5,"shippingFee":3,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/783956/8818428031","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffccbfba/91f578f8e6cdd416_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535295439","title":"张景中科普文集:漫话数学(精装典藏版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.84,"price":10.44,"shippingFee":4.4,"differencePrice":-14.84,"GoodsUrl":"https://book.kongfz.com/321650/8279680042","imgBigUrl":"https://www0.kfzimg.com/G06/M00/FE/71/p4YBAFqZclaARCtwAACby3byH0g317_b.jpg","GoodsImgCount":"1","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810462761","title":"大学英语精读-(3)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.14,"price":0.14,"shippingFee":3,"differencePrice":-3.14,"GoodsUrl":"https://book.kongfz.com/1092190/8867494474","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeefbab/adc884da026a2cc7_b.jpg","GoodsImgCount":"1","onSaleCount":257,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544678667","title":"大学英语基础口语教程 3(第2版)学生用书(附光盘)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.14,"price":26.14,"shippingFee":6,"differencePrice":-32.14,"GoodsUrl":"https://book.kongfz.com/444647/8628763673","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dffafdeb/aafce3d1f21adfff_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801567048","title":"中西医结合精神病学/新世纪全国高等医药院校规划教材","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31,"price":31,"shippingFee":0,"differencePrice":-31,"GoodsUrl":"https://book.kongfz.com/698100/8721476824","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceccdbbc/cad5c1ae98d17471_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787576049688","title":"奥数教程 六年级","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.17,"price":20.37,"shippingFee":3.8,"differencePrice":-24.17,"GoodsUrl":"https://book.kongfz.com/624030/8505456371","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4893319/c0ed3496e5c5bbb6_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805183671","title":"晚清小说史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":9,"shippingFee":10,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/179226/7693867371","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbdceed/20efe77062ee6a6f_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500909514","title":"中国武术人名辞典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37,"price":29,"shippingFee":8,"differencePrice":-37,"GoodsUrl":"https://book.kongfz.com/204356/7119094838","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdbdcadd/acc1900622c92670_b.jpg","GoodsImgCount":"7","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533003395","title":"武氏祠汉画像石","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":30,"shippingFee":13,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/24485/304549598","imgBigUrl":"https://www0.kfzimg.com/G03/M01/A0/E8/pYYBAFStYTyAK1C2AAElEuFY5XY899_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200120837","title":"大家小书 中国古代衣食住行","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":6,"shippingFee":4,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/20902/8727045221","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdbdccf/b167e6589d0bbda4_b.jpg","GoodsImgCount":"2","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564071028","title":"蒙台梭利早教方案:0-3岁智力及语言系统训练全书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8600000000000003,"price":1.86,"shippingFee":2,"differencePrice":-3.8600000000000003,"GoodsUrl":"https://book.kongfz.com/624177/8228419387","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadbfcaf/dd1d18ccaac06855_b.jpg","GoodsImgCount":"3","onSaleCount":540,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115602763","title":"孕期冥想心理课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.04,"price":13.04,"shippingFee":2,"differencePrice":-15.04,"GoodsUrl":"https://book.kongfz.com/738826/8492472031","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbbfecda/4b467c05a7ff0e49_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787202025154","title":"河北通史 民国上卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.11,"price":13.11,"shippingFee":5,"differencePrice":-18.11,"GoodsUrl":"https://book.kongfz.com/1154627/8790091931","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafcfaad/346ccaf3ae2ecc3e_b.jpg","GoodsImgCount":"2","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117139618","title":"中药名方现代研究与应用·四物汤现代研究与应用","quality":0,"qualityText":"","originalPrice":0,"totalPrice":73.77,"price":69.27,"shippingFee":4.5,"differencePrice":-73.77,"GoodsUrl":"https://book.kongfz.com/792669/7996883998","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecacccb/cabb099d4ffa62eb_b.jpg","GoodsImgCount":"2","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200131475","title":"向解放军学习有效率组织的管理之道精编版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.14,"price":3.64,"shippingFee":4.5,"differencePrice":-8.14,"GoodsUrl":"https://book.kongfz.com/884575/8886801797","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdcabfd/c4649fe683ed4712_b.jpg","GoodsImgCount":"1","onSaleCount":335,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569912883","title":"雪球帮:为什么世界是今天这样的?","quality":0,"qualityText":"","originalPrice":0,"totalPrice":93,"price":90,"shippingFee":3,"differencePrice":-93,"GoodsUrl":"https://book.kongfz.com/889351/8359062152","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbeedbcc/46cba327d8dc3331_b.jpg","GoodsImgCount":"6","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801752093","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562622963","title":"大学军事教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.58,"price":0.59,"shippingFee":2.99,"differencePrice":-3.58,"GoodsUrl":"https://book.kongfz.com/784293/8214414858","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daacbdaf/63c3a8955499e0dd_b.jpg","GoodsImgCount":"5","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559617910","title":"和孩子一起去艺术博物馆","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":10,"shippingFee":10,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/265261/8694353313","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaebafae/e8ab83ffb9b4f994_b.jpg","GoodsImgCount":"7","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547260388","title":"全新小学生必背文言文注音版小学一二三四五六年级6-12岁语文教材必背文言文全集阅读小古文经典诵读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.99,"price":3.99,"shippingFee":0,"differencePrice":-3.99,"GoodsUrl":"https://book.kongfz.com/787255/8088016248","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1760/01588e892e1dfa98e4_b.jpg","GoodsImgCount":"1","onSaleCount":141,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502963460","title":"气象统计分析与预报方法(第4版)(首页有字迹)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/269417/7879872024","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdacbfe/4f1c6c5fe9e7ab60_b.jpg","GoodsImgCount":"5","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549850372","title":"意林18周年纪念书.B","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.89,"price":2.89,"shippingFee":0,"differencePrice":-2.89,"GoodsUrl":"https://book.kongfz.com/711444/8643457434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20517473/2b74e8a9e24dfb85_b.jpg","GoodsImgCount":"0","onSaleCount":507,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533643638","title":"魅力口才","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.05,"price":0.05,"shippingFee":5,"differencePrice":-5.05,"GoodsUrl":"https://book.kongfz.com/805022/8631298088","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbcaaac/3ebabf676af610eb_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807553274","title":"妖怪山","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.73,"price":3.23,"shippingFee":4.5,"differencePrice":-7.73,"GoodsUrl":"https://book.kongfz.com/765432/8854682434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbcccae/704257a20943f31f_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532137435","title":"静欲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1.5,"shippingFee":3.5,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/253683/8613551636","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6887408/5c50a923c692899b_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506545433","title":"古今中外心理战100例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":10,"shippingFee":7,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/20331/8181661495","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2868/0269943c229e5f365c_b.jpg","GoodsImgCount":"2","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121451928","title":"人人都能玩赚ChatGPT 高温消毒发货 黄小刀 电子工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3,"price":2.5,"shippingFee":1.8,"differencePrice":-4.3,"GoodsUrl":"https://book.kongfz.com/259056/8887865046","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceaeddfd/444fd0181d292df1_b.jpg","GoodsImgCount":"1","onSaleCount":333,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201150321","title":"男孩故事 彩图注音有声版 笨笨狼童书坊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.1,"price":15.1,"shippingFee":5,"differencePrice":-20.1,"GoodsUrl":"https://book.kongfz.com/911923/8608024464","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecaccefc/d5a348a22b1aba4d_b.jpg","GoodsImgCount":"1","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115510907","title":"用图表说话如何简单有效地做数据分析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.8,"price":0.8,"shippingFee":5,"differencePrice":-5.8,"GoodsUrl":"https://book.kongfz.com/700512/8743345578","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebafedac/360e136d8247ad57_b.jpg","GoodsImgCount":"1","onSaleCount":119,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530638491","title":"现代西方历史的故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/6856/8690577625","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddddafae/afdd629a50acab25_b.jpg","GoodsImgCount":"14","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539990378","title":"虹口大爆炸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.48,"price":1.48,"shippingFee":5,"differencePrice":-6.48,"GoodsUrl":"https://book.kongfz.com/750161/8211811207","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fffaeced/9cd2a7b72eb0f4ac_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544542524","title":"从课本到奥数难题点拨 小学五年级 全新升级版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.7,"price":3.7,"shippingFee":3,"differencePrice":-6.7,"GoodsUrl":"https://book.kongfz.com/838443/8877688994","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdfddeb/3a9a15a02db2c2a7_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115477217","title":"足球战术与阵形图解:思路解说、案例分析及训练方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.5,"price":15,"shippingFee":5.5,"differencePrice":-20.5,"GoodsUrl":"https://book.kongfz.com/669776/8842681155","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbfdaca/86189842b664a053_b.jpg","GoodsImgCount":"3","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530653180","title":"师陀散文选集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":1,"shippingFee":7,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/784196/8071376720","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbebaacf/387d7985239551bb_b.jpg","GoodsImgCount":"2","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030409836","title":"化学实验教学论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.16,"price":41.16,"shippingFee":0,"differencePrice":-41.16,"GoodsUrl":"https://book.kongfz.com/1120807/8901560862","imgBigUrl":"https://www0.kfzimg.com/G06/M00/57/62/p4YBAFqcDtqAYjz_AABOWff5Al4841_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806033494","title":"猫国春秋","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25.8,"price":20,"shippingFee":5.8,"differencePrice":-25.8,"GoodsUrl":"https://book.kongfz.com/914318/8378334053","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddbfdbf/f07a2f247617134c_b.jpg","GoodsImgCount":"2","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508534701","title":"超级梦想家像天才一样思考","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.05,"price":1.67,"shippingFee":5.38,"differencePrice":-7.05,"GoodsUrl":"https://book.kongfz.com/311927/8249147995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efffecaf/9f5fba8331161639_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530214008","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543231214","title":"吃掉情绪?——和食物的斗争","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":7,"shippingFee":6,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/22916/7541247337","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3008554/b610294fb1f49931_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521750393","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521300789","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509654163","title":"电力市场经济学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":71,"price":65,"shippingFee":6,"differencePrice":-71,"GoodsUrl":"https://book.kongfz.com/722278/8595373194","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edafadbf/7506fe39a352972e_b.jpg","GoodsImgCount":"7","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111321118","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213093449","title":"如何启动黄金圈思维","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53.49,"price":47.99,"shippingFee":5.5,"differencePrice":-53.49,"GoodsUrl":"https://book.kongfz.com/1153783/8871587942","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22135404/73612320da1a5cec_b.jpg","GoodsImgCount":"4","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806451427","title":"鲁迅书话","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.48,"price":19.98,"shippingFee":6.5,"differencePrice":-26.48,"GoodsUrl":"https://book.kongfz.com/18747/5221530317","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abecbfad/69d613574c951abc_b.jpg","GoodsImgCount":"13","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224140859","title":"现代文分类提升练·语文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.890000000000001,"price":3.89,"shippingFee":3,"differencePrice":-6.890000000000001,"GoodsUrl":"https://book.kongfz.com/771462/8574561248","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdbbead/c63a292e6fe6cc59_b.jpg","GoodsImgCount":"4","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550243576","title":"中华国学经典精粹·蒙学家训必读本:三字经·百家姓·千字文·弟子规","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.09,"price":1.09,"shippingFee":2,"differencePrice":-3.09,"GoodsUrl":"https://book.kongfz.com/624177/8743682753","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edccbabb/8141fa7ddeaca3c0_b.jpg","GoodsImgCount":"2","onSaleCount":764,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200030402","title":"苍生 华夏出版社编 北京出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":6.7,"shippingFee":5,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/398369/8618810522","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acabddfb/87e80f30013d13a0_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805937731","title":"二胡启蒙教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.46,"price":15.96,"shippingFee":3.5,"differencePrice":-19.46,"GoodsUrl":"https://book.kongfz.com/648701/8612669580","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C1/CE/p4YBAFqw4IGAHMeGAAECW5fmF94515_b.jpg","GoodsImgCount":"1","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537852838","title":"红楼梦—八十回回解精鉴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":148,"price":148,"shippingFee":0,"differencePrice":-148,"GoodsUrl":"https://book.kongfz.com/16743/7232736010","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdcebef/655584802429999d_b.jpg","GoodsImgCount":"1","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805191225","title":"金元明清词鉴赏辞典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":20,"shippingFee":9,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/883669/7889815425","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deaaefec/b7bf4814e6897207_b.jpg","GoodsImgCount":"6","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546358055","title":"美联储的秘密","quality":0,"qualityText":"","originalPrice":0,"totalPrice":60,"price":50,"shippingFee":10,"differencePrice":-60,"GoodsUrl":"https://book.kongfz.com/593893/8299743873","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eccffbbf/0b8db257b042f3e0_b.jpg","GoodsImgCount":"4","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300062372","title":"戴高乐书系:我的父亲戴高乐","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.5,"price":9.5,"shippingFee":8,"differencePrice":-17.5,"GoodsUrl":"https://book.kongfz.com/180278/8511632615","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccccaffe/e139d6f440938797_b.jpg","GoodsImgCount":"12","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556125227","title":"画知道答案","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.3,"price":6.3,"shippingFee":5,"differencePrice":-11.3,"GoodsUrl":"https://book.kongfz.com/893135/8473380609","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabefcfc/34f7142558ae9ce0_b.jpg","GoodsImgCount":"1","onSaleCount":153,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122135674","title":"正版二手 现代生物化学 第三版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.55,"price":13.55,"shippingFee":0,"differencePrice":-13.55,"GoodsUrl":"https://book.kongfz.com/745839/8780452119","imgBigUrl":"https://www0.kfzimg.com/G06/M00/CC/AF/p4YBAFqYnVSAGvflAAGZAQiLoGs040_b.jpg","GoodsImgCount":"0","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500168171","title":"极简元宇宙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.01,"price":2.01,"shippingFee":2,"differencePrice":-4.01,"GoodsUrl":"https://book.kongfz.com/755561/8129818306","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aeeaaefa/2ab5dd065e2dd348_b.jpg","GoodsImgCount":"2","onSaleCount":248,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549286348","title":"你哄我一下2 签名本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":3,"shippingFee":9,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/381029/8362454944","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddcbeadb/45eac4be85e7634e_b.jpg","GoodsImgCount":"7","onSaleCount":81,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532759095","title":"意大利风光","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":20,"shippingFee":9,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/638707/5528411427","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/17015971/bb54277e8cd73700_b.jpg","GoodsImgCount":"5","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513321174","title":"巴比伦时代","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.1,"price":9.1,"shippingFee":3,"differencePrice":-12.1,"GoodsUrl":"https://book.kongfz.com/808455/8886959658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbbcaeee/dfc8b85fc3bece6e_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807696001","title":"南烟以北","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.08,"price":0.08,"shippingFee":5,"differencePrice":-5.08,"GoodsUrl":"https://book.kongfz.com/878060/8738813937","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aeacadcc/9dbeb09260474062_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545801064","title":"浑家 拙荆 夫人 刘绍铭 上海书店出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":23,"shippingFee":5,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/878060/8575285157","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abaddfea/2da8202ac0a5e1a4_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513108577","title":"新世纪心理与心理健康教育文库9 人格心理学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.34,"price":4.34,"shippingFee":5,"differencePrice":-9.34,"GoodsUrl":"https://book.kongfz.com/23607/8458656434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deecddbd/1c5a5efca63348db_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535917393","title":"广东茶点:[图集]","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":5,"shippingFee":4,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/769904/8539241272","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcccfcab/4cb012ab8cc45886_b.jpg","GoodsImgCount":"5","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810321556","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800504174","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540213169","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020110971","title":"普希金代表作上尉的女儿 俄 普希金著 磊然译 人民文学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.54,"price":6.54,"shippingFee":5,"differencePrice":-11.54,"GoodsUrl":"https://book.kongfz.com/672601/8830859922","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafebffc/0014b4a285f792dc_b.jpg","GoodsImgCount":"1","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544775854","title":"文学名著经典译林 欧也妮葛朗台 新版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.55,"price":2.55,"shippingFee":3,"differencePrice":-5.55,"GoodsUrl":"https://book.kongfz.com/1181761/8875292333","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbdadbf/1b838edc8ecf18b4_b.jpg","GoodsImgCount":"1","onSaleCount":174,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111523642","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301326640","title":"9787301326640 21世纪教师教育系列~ 外国高等教育史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34.07,"price":29.67,"shippingFee":4.4,"differencePrice":-34.07,"GoodsUrl":"https://book.kongfz.com/27495/8343052854","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4756272/1e6e8023f7617217_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301227671","title":"法律史译评","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.35,"price":15.35,"shippingFee":8,"differencePrice":-23.35,"GoodsUrl":"https://book.kongfz.com/820711/8391037776","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecbffba/bda90fee6c7c1436_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301209974","title":"理解美国:美国文化指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.6,"price":2.6,"shippingFee":3,"differencePrice":-5.6,"GoodsUrl":"https://book.kongfz.com/736627/8382555942","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadcbeda/860f249185e56c97_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503400490","title":"名僧录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":15,"shippingFee":5,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/398369/8195974665","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceabbfae/a43ce3e5787c2a5a_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301320327","title":"侠义三千年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":15,"shippingFee":0,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/419134/4596898069","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeedbec/96ecee234f4f480c_b.jpg","GoodsImgCount":"1","onSaleCount":135,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507514704","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113197445","title":"新手学开公司:创业融资常识","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1,"shippingFee":4,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/1210014/8842706502","imgBigUrl":"https://www0.kfzimg.com/G06/M00/04/EC/p4YBAFqZ55SAPmxSAADXtJjYMto864_b.jpg","GoodsImgCount":"1","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534247293","title":"史记故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.4,"price":4.4,"shippingFee":2,"differencePrice":-6.4,"GoodsUrl":"https://book.kongfz.com/667558/8898517027","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaecaffe/a6a58d3c0ae45e3d_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802113022","title":"人类与宗教","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53.2,"price":42,"shippingFee":11.2,"differencePrice":-53.2,"GoodsUrl":"https://book.kongfz.com/890580/8054767633","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decaefca/8f5bc4523bca53c2_b.jpg","GoodsImgCount":"6","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562858201","title":"中日跨文化交际实用教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.71,"price":3.71,"shippingFee":0,"differencePrice":-3.71,"GoodsUrl":"https://book.kongfz.com/892397/8511714742","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/206/24ff4c4e636a8af1_b.jpg","GoodsImgCount":"1","onSaleCount":162,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506007252","title":"十批判书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.95,"price":18.95,"shippingFee":2,"differencePrice":-20.95,"GoodsUrl":"https://book.kongfz.com/877749/8349858098","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/610ef12388c7aae3_b.jpg","GoodsImgCount":"3","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565107610","title":"幼儿园早期阅读资源. 幸福的种子 大班 导读手册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.8,"price":1.8,"shippingFee":3,"differencePrice":-4.8,"GoodsUrl":"https://book.kongfz.com/225395/6586000622","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabdbbce/277268d26c84ada2_b.jpg","GoodsImgCount":"6","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111607915","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100014205","title":"狄德罗传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/565102/7684520458","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afbfdeaf/49dfb3ffb3e393b9_b.jpg","GoodsImgCount":"9","onSaleCount":76,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532360437","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303113255","title":"伦理学经典著作选读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":52,"price":40,"shippingFee":12,"differencePrice":-52,"GoodsUrl":"https://book.kongfz.com/633074/5274343343","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeaeacae/eb4784a0715850e4_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535378569","title":"芭比小公主影院 芭比之公主学校 新版畅销版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9,"price":1.1,"shippingFee":2.8,"differencePrice":-3.9,"GoodsUrl":"https://book.kongfz.com/1093663/8697070175","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcbcecb/74f6ac0d15ec88fc_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567591547","title":"数学家画传·吴文俊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":10,"shippingFee":9,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/507602/7478663525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ababcabf/f04da9e185cf94d2_b.jpg","GoodsImgCount":"6","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500931003","title":":篮球运动教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.41,"price":3.41,"shippingFee":0,"differencePrice":-3.41,"GoodsUrl":"https://book.kongfz.com/20179/8594547518","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F2/CE/p4YBAFqZPEqAaXIFAAD8_GCgzIw699_b.jpg","GoodsImgCount":"1","onSaleCount":366,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521740196","title":"生命密码3:瘟疫传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":11,"shippingFee":6,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/624944/8895449656","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeeeddc/a0cdba4fddc59c7e_b.jpg","GoodsImgCount":"8","onSaleCount":283,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508235202","title":"职业技能培训丛书:电焊工入门与技巧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.24,"price":9.24,"shippingFee":2,"differencePrice":-11.24,"GoodsUrl":"https://book.kongfz.com/767143/8725850207","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdddabbd/5e8247e98682f766_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040506655","title":"西方政治思想史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":4.5,"shippingFee":0,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/638685/8638161704","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/445/5932042ae57cc3ce_b.jpg","GoodsImgCount":"1","onSaleCount":288,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538725421","title":"《希区柯克悬念故事集》-午夜追踪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.41,"price":4.91,"shippingFee":0.5,"differencePrice":-5.41,"GoodsUrl":"https://book.kongfz.com/156492/8287023578","imgBigUrl":"https://www0.kfzimg.com/G06/M00/4A/BF/p4YBAFqbw2CAMtcwAACLHc8-Kmw376_b.jpg","GoodsImgCount":"1","onSaleCount":127,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229148935","title":"少即是多:北欧自由生活意见新版与断舍离并提的人生整理术,樊登读书会创始人樊登亲自讲书推荐","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.92,"price":9.92,"shippingFee":5,"differencePrice":-14.92,"GoodsUrl":"https://book.kongfz.com/400965/8684128772","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddffccde/e26c93777dcaddbf_b.jpg","GoodsImgCount":"1","onSaleCount":140,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040402025","title":"管理心理学第二2版王晓钧 主编高等教育出版社9787040402025","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.72,"price":3.72,"shippingFee":0,"differencePrice":-3.72,"GoodsUrl":"https://book.kongfz.com/248516/8445959763","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/de788cd5eee0ea96_b.jpg","GoodsImgCount":"1","onSaleCount":126,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500081029","title":"曹汝霖一生之回忆","quality":0,"qualityText":"","originalPrice":0,"totalPrice":107.8,"price":102,"shippingFee":5.8,"differencePrice":-107.8,"GoodsUrl":"https://book.kongfz.com/51215/8461562441","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaefdbce/8c562bf3869c30fd_b.jpg","GoodsImgCount":"3","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030656407","title":"大学物理实验","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.1,"price":1.1,"shippingFee":3,"differencePrice":-4.1,"GoodsUrl":"https://book.kongfz.com/891713/8560427068","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aabafbce/ba4bec806b56ffe0_b.jpg","GoodsImgCount":"3","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122180339","title":"白菜与国王,心与手","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.9,"price":4.9,"shippingFee":0,"differencePrice":-4.9,"GoodsUrl":"https://book.kongfz.com/842883/8265631544","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceaeaadf/e35077eb4df6c14d_b.jpg","GoodsImgCount":"20","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547312964","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301302866","title":"法律研习的方法:作业、考试和论文写作","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":3,"shippingFee":10,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/891541/8813242545","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbdeecf/81217bf603b8cd44_b.jpg","GoodsImgCount":"2","onSaleCount":167,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506240789","title":"GRE 语文仿真试题","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.55,"price":2.55,"shippingFee":4,"differencePrice":-6.55,"GoodsUrl":"https://book.kongfz.com/203004/8427844598","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddcafaaf/ac83988286fb5146_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510454585","title":"中国社会科学全球化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35.81,"price":32.31,"shippingFee":3.5,"differencePrice":-35.81,"GoodsUrl":"https://book.kongfz.com/904671/8421015503","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbeeedeb/033d993974bafbe5_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558308178","title":"肖云峰阳光成长小说系列:我的筷子班主任","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":0.5,"shippingFee":4,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/768172/8469297539","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcfddbee/d237e91dc5b7f728_b.jpg","GoodsImgCount":"4","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040024135","title":"艺术概论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.8,"price":1.8,"shippingFee":3,"differencePrice":-4.8,"GoodsUrl":"https://book.kongfz.com/602194/6362597815","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdecfeb/5da7fa93a557f9aa_b.jpg","GoodsImgCount":"4","onSaleCount":214,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535631329","title":"湖湘篆刻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":90,"price":80,"shippingFee":10,"differencePrice":-90,"GoodsUrl":"https://book.kongfz.com/27254/8219331776","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deeeddaf/74aeb2b4b131791a_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787570612352","title":"小学数学竞赛年鉴:MO2020","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":8,"shippingFee":5,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/426911/7902501351","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/7611848/fda903b85b9134bc_b.jpg","GoodsImgCount":"4","onSaleCount":124,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040285246","title":"正版二手 地球与空间科学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.7,"price":4.7,"shippingFee":0,"differencePrice":-4.7,"GoodsUrl":"https://book.kongfz.com/549116/8836455149","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/917/a23746764cd07ab3_b.jpg","GoodsImgCount":"1","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545812886","title":"三苏评传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":70,"price":58,"shippingFee":12,"differencePrice":-70,"GoodsUrl":"https://book.kongfz.com/23265/8181755497","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addddfac/fa013300f5292783_b.jpg","GoodsImgCount":"7","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510446566","title":"500美元问鼎百事CEO:全球头号女强人卢英德的经营哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/592021/5550361559","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddabecfa/dbc1bfe082195815_b.jpg","GoodsImgCount":"4","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121380440","title":"电气控制与plc技术应用 大中专理科水利电力 刘小春","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":13,"shippingFee":10,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/712076/8416032209","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dccdcafa/dec1e5d38d5f38ee_b.jpg","GoodsImgCount":"6","onSaleCount":53,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542618368","title":"德意志精神漫游","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.31,"price":17.31,"shippingFee":0,"differencePrice":-17.31,"GoodsUrl":"https://book.kongfz.com/919786/8892987379","imgBigUrl":"https://www0.kfzimg.com/G06/M00/6F/AB/p4YBAFqdEgyAcQgWAABHsHusPPc676_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787304008789","title":"艺术赏析概要","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.5,"price":0.5,"shippingFee":3,"differencePrice":-3.5,"GoodsUrl":"https://book.kongfz.com/838443/8859718589","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecffaac/dcae10f91c4a308b_b.jpg","GoodsImgCount":"1","onSaleCount":171,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562296195","title":"考点同步解读 高中化学 选择性必修一 化学反应原理 有笔记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":23,"shippingFee":3,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/211077/7520896879","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceaccafa/ab450e1ce8320b0e_b.jpg","GoodsImgCount":"4","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539947235","title":"铠甲勇士:神秘的陨石1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.8,"price":18,"shippingFee":5.8,"differencePrice":-23.8,"GoodsUrl":"https://book.kongfz.com/747887/6880955959","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbcefbbc/682c32a3d38bb55d_b.jpg","GoodsImgCount":"7","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115375438","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564817688","title":"二手财经应用文写作9787564817688刘鑫","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":2.6,"shippingFee":2.9,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/750659/8426123356","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/affafccf/9af32edd2ccd7249_b.jpg","GoodsImgCount":"1","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503318443","title":"白登之围3 帝国草原三部曲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.5,"price":7.5,"shippingFee":5,"differencePrice":-12.5,"GoodsUrl":"https://book.kongfz.com/798681/8249118687","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeafdca/8450b15747941350_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787557014858","title":"诡秘之主4","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.46,"price":10.46,"shippingFee":5,"differencePrice":-15.46,"GoodsUrl":"https://book.kongfz.com/771462/8867879036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accbddaf/f6fcebe29db0cd77_b.jpg","GoodsImgCount":"4","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787225013046","title":"黄埔军校百将传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.98,"price":4,"shippingFee":2.98,"differencePrice":-6.98,"GoodsUrl":"https://book.kongfz.com/840438/8881985399","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfedbef/5eadb46b1348058c_b.jpg","GoodsImgCount":"2","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539798387","title":"妄想银行星新一 李盈春安徽少年儿童出版社9787539798387","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.19,"price":5.19,"shippingFee":0,"differencePrice":-5.19,"GoodsUrl":"https://book.kongfz.com/366030/8864056391","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/b0cc76b216b8cb24_b.jpg","GoodsImgCount":"1","onSaleCount":103,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544323086","title":"张家界旅游导读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/778224/6948456565","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfebdfee/1911341d2cf4b3cd_b.jpg","GoodsImgCount":"1","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516922811","title":"集体的失忆 杨定一全部生命系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33.65,"price":30.65,"shippingFee":3,"differencePrice":-33.65,"GoodsUrl":"https://book.kongfz.com/762329/8780202649","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10564427/c571335c6e98d724_b.jpg","GoodsImgCount":"0","onSaleCount":97,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302249085","title":"国际物流:国际贸易中的运作管理(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":73.06,"price":61.06,"shippingFee":12,"differencePrice":-73.06,"GoodsUrl":"https://book.kongfz.com/795825/7334746188","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14523379/51ba99736a77252f_b.jpg","GoodsImgCount":"2","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810035750","title":"截拳道","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/233440/4385393174","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecbecbe/4a6d598b9537b021_b.jpg","GoodsImgCount":"4","onSaleCount":219,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807205913","title":"古玉收藏三百问 鉴宝 大众收藏3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":3,"shippingFee":2.4,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/561672/8415735311","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaccbcc/f11e6347fa684356_b.jpg","GoodsImgCount":"1","onSaleCount":128,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805747637","title":"西塘民间建筑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.1,"price":7.6,"shippingFee":5.5,"differencePrice":-13.1,"GoodsUrl":"https://book.kongfz.com/250120/8810679961","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edccedac/3fe60dbba98c7088_b.jpg","GoodsImgCount":"3","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100186506","title":"钱颖一对话录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":68,"price":58,"shippingFee":10,"differencePrice":-68,"GoodsUrl":"https://book.kongfz.com/17030/8830419237","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffceeede/2e8b3b3f24aa0fb7_b.jpg","GoodsImgCount":"7","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508673073","title":"茶当酒集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":4.5,"shippingFee":3.5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/401024/8872498867","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cacabaec/912f51c1b0fefcbd_b.jpg","GoodsImgCount":"2","onSaleCount":193,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801211453","title":"妇科病外治独特新疗法--内病外治·外病外治独特新疗法丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":15,"shippingFee":5,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/16472/6638610438","imgBigUrl":"https://www0.kfzimg.com/G06/M00/6D/DF/p4YBAFt2j6eAVdSMAAHEQyrZmzw541_b.jpg","GoodsImgCount":"2","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505438132","title":"探索·科学专题百科绘本 :植物的奥秘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":18,"shippingFee":10,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/427935/8151202484","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cffbddcd/b9350271a6c67aac_b.jpg","GoodsImgCount":"4","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113284220","title":"城市轨道交通信号技术(第二版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55.82,"price":49.82,"shippingFee":6,"differencePrice":-55.82,"GoodsUrl":"https://book.kongfz.com/533712/7445893108","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fffddefa/e3eecc18ea41d9a3_b.jpg","GoodsImgCount":"1","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560826462","title":"老上海名宅赏析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21,"price":12,"shippingFee":9,"differencePrice":-21,"GoodsUrl":"https://book.kongfz.com/366445/8584945980","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eabffdea/b445c31f3017c8ec_b.jpg","GoodsImgCount":"7","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805112329","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544786218","title":"小译林国际大奖童书:我的哥哥吹黑管","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.99,"price":4.99,"shippingFee":6,"differencePrice":-10.99,"GoodsUrl":"https://book.kongfz.com/273843/8153980235","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deffacda/736311caf50ede76_b.jpg","GoodsImgCount":"2","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504770356","title":"加盟连锁招商模式顶级设计思维 李松 李爽 9787504770356 中国财富出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.62,"price":5.12,"shippingFee":2.5,"differencePrice":-7.62,"GoodsUrl":"https://book.kongfz.com/237713/8695995574","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/940/a676d512dc1104ae_b.jpg","GoodsImgCount":"1","onSaleCount":165,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539168975","title":"胡平文集:百年误读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.46,"price":16.46,"shippingFee":2,"differencePrice":-18.46,"GoodsUrl":"https://book.kongfz.com/1214248/8872764563","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abbcffec/36a14534af372c1d_b.jpg","GoodsImgCount":"2","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534808944","title":"野叟曝言 下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.879999999999999,"price":4.88,"shippingFee":5,"differencePrice":-9.879999999999999,"GoodsUrl":"https://book.kongfz.com/750161/8080623189","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfbabfb/bd7efa40cb71d18c_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810367899","title":"杨桃文化·新手食谱系列 41~45","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1,"shippingFee":4,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/891293/8009230723","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbffdadd/2dc8960a8a687a9f_b.jpg","GoodsImgCount":"3","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569931549","title":"看见梵高:孤独与伟大(写给大家的360度艺术启蒙书)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":2,"shippingFee":10,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/453237/8801143694","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acddcacb/fd041a1fd8b81733_b.jpg","GoodsImgCount":"11","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800220272","title":"常见病简易中医疗法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/322775/7550848376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cddccbec/e7fbcfaad8043cd4_b.jpg","GoodsImgCount":"11","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533758684","title":"超级秀·小学英语随堂故事:三年级","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.470000000000002,"price":27.87,"shippingFee":1.6,"differencePrice":-29.470000000000002,"GoodsUrl":"https://book.kongfz.com/470338/8595088507","imgBigUrl":"https://www0.kfzimg.com/G06/M00/FB/9F/p4YBAFqh40GANBXkAADzfKO38vM478_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553122250","title":"中国雕塑史 梁思成 著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.8,"price":18.8,"shippingFee":4,"differencePrice":-22.8,"GoodsUrl":"https://book.kongfz.com/651345/8071240129","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4893319/632f3df473149970_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806890356","title":"金田一探案集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.9,"price":6,"shippingFee":4.9,"differencePrice":-10.9,"GoodsUrl":"https://book.kongfz.com/588886/8817249258","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fddedbab/536b81fb83ff03a4_b.jpg","GoodsImgCount":"6","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122112309","title":"典型液压气动回路600例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27,"price":22,"shippingFee":5,"differencePrice":-27,"GoodsUrl":"https://book.kongfz.com/891499/8842174912","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eefdafbb/afc934890793788e_b.jpg","GoodsImgCount":"6","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500625827","title":"马说陶瓷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.8,"price":32,"shippingFee":5.8,"differencePrice":-37.8,"GoodsUrl":"https://book.kongfz.com/681126/8811277816","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbbbdfeb/569966dc1788862d_b.jpg","GoodsImgCount":"2","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214254863","title":"诗意人生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35.8,"price":29,"shippingFee":6.8,"differencePrice":-35.8,"GoodsUrl":"https://book.kongfz.com/13883/8535361435","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdafdced/5137129530c3717e_b.jpg","GoodsImgCount":"2","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535548887","title":"玻璃城堡","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":5,"shippingFee":4,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/512101/5119116553","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14073610/877fc17482e5334d_b.jpg","GoodsImgCount":"4","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787112273393","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534253621","title":"世界少年文学经典文库 叶圣陶作品精选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.48,"price":0.48,"shippingFee":3,"differencePrice":-3.48,"GoodsUrl":"https://book.kongfz.com/791250/8878211228","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aebcbced/163c2c611b494d45_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810035927","title":"奇门护身暗器练法(一版一印)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":30,"shippingFee":8,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/137604/7693281367","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfafeaac/d69912592ceffad6_b.jpg","GoodsImgCount":"5","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565659676","title":"最新五年中考满分作文大全","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/911923/8806310513","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbadcca/b8961895538c4451_b.jpg","GoodsImgCount":"1","onSaleCount":120,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040519297","title":"中学语文教学设计 郑桂华 9787040519297 高等教育出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.99,"price":5.99,"shippingFee":3,"differencePrice":-8.99,"GoodsUrl":"https://book.kongfz.com/240018/8661063245","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/424/549f95263f2b8049_b.jpg","GoodsImgCount":"0","onSaleCount":137,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550243552","title":"中华国学经典精粹·历史地理必读本:三国志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.8899999999999997,"price":0.11,"shippingFee":2.78,"differencePrice":-2.8899999999999997,"GoodsUrl":"https://book.kongfz.com/785333/8761856529","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbbebddd/b733d5d903cb7b1d_b.jpg","GoodsImgCount":"1","onSaleCount":789,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571103408","title":"中国现当代作家作品专题研究/河南省高等教育自学考试汉语言文学专业本科教材","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":18,"shippingFee":6,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/778238/8492605781","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdfafbca/e1fb525eb35a401b_b.jpg","GoodsImgCount":"12","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532614813","title":"8848我为歌狂终结本漫画版·楚天歌篇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33,"price":25,"shippingFee":8,"differencePrice":-33,"GoodsUrl":"https://book.kongfz.com/778785/7495502311","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecedbdcd/21cedd66962c506c_b.jpg","GoodsImgCount":"5","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539443744","title":"历代书法名迹技法选讲(第1辑):王铎诗卷.","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/18033/8237184983","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdffaecd/9190e5260d56e5dc_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515360607","title":"念力的秘密:2:2","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.2,"price":3.2,"shippingFee":5,"differencePrice":-8.2,"GoodsUrl":"https://book.kongfz.com/180897/8428663147","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dddfcdbd/210a611eee19a8eb_b.jpg","GoodsImgCount":"1","onSaleCount":144,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539154541","title":"绿山墙的安妮","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":4,"shippingFee":4,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/413068/2855797793","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3373/02e31e12e618d9a492_b.jpg","GoodsImgCount":"3","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539731766","title":"虹猫蓝兔七侠传.2","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":1.5,"shippingFee":4,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/198833/8806246345","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5862318/af620f5bab4bd51e_b.jpg","GoodsImgCount":"1","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544131834","title":"郑振铎藏本红楼梦","quality":0,"qualityText":"","originalPrice":0,"totalPrice":73,"price":65,"shippingFee":8,"differencePrice":-73,"GoodsUrl":"https://book.kongfz.com/25093/8534180256","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feabbbed/4e83283b2d4203e9_b.jpg","GoodsImgCount":"9","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511828156","title":"法律方法论 (书面有划横伤)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.9,"price":1.9,"shippingFee":8,"differencePrice":-9.9,"GoodsUrl":"https://book.kongfz.com/271477/8201797030","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffebdafa/76c5fecaf81060f1_b.jpg","GoodsImgCount":"5","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806657607","title":"明清小品选评 高温消毒发货 杨义著 李玫著 岳麓书社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.89,"price":8.09,"shippingFee":1.8,"differencePrice":-9.89,"GoodsUrl":"https://book.kongfz.com/110/8696629154","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caebcddd/7a1589c89b1a04c4_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787523202487","title":"2024世图版第二版英语皮考研真题逐词逐句精讲册 基础试卷版2004-2010曾鸣 张剑 刘京霄世界图书出版公司9787523202487","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":6.9,"shippingFee":0,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/248516/8585451759","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/1b6430cf81a207af_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108043597","title":"坚忍与守望 近代韩江下游的福音姿娘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.05,"price":12.55,"shippingFee":5.5,"differencePrice":-18.05,"GoodsUrl":"https://book.kongfz.com/244432/8796690963","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffeefbad/6720ba4115d67751_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535436375","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787830054038","title":"男科疾病诊断治疗指南(2022 版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":30,"shippingFee":5,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/196496/7650931803","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdebcfdf/e3d909f5ed9a00c8_b.jpg","GoodsImgCount":"6","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111307921","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544714587","title":"猫和老鼠:浪漫的代价","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.5,"price":0.5,"shippingFee":6,"differencePrice":-6.5,"GoodsUrl":"https://book.kongfz.com/570846/8637927606","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbcddccc/42e5131764a6ee79_b.jpg","GoodsImgCount":"7","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111244813","title":"HyperWorks分析应用实例9787111244813李楚琳机械工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.2,"price":16.7,"shippingFee":2.5,"differencePrice":-19.2,"GoodsUrl":"https://book.kongfz.com/1092759/8781226015","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbdedaf/05761766ae23af61_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513352109","title":"早期中国的鬼","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.85,"price":19.85,"shippingFee":3,"differencePrice":-22.85,"GoodsUrl":"https://book.kongfz.com/791250/8897892698","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaceecf/57e4bbc2456853dd_b.jpg","GoodsImgCount":"1","onSaleCount":160,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121253799","title":"体验引擎:游戏设计全景探秘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.48,"price":24.48,"shippingFee":0,"differencePrice":-24.48,"GoodsUrl":"https://book.kongfz.com/492548/8866402714","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C5/31/p4YBAFqYOW-AMOJ-AADBpjNYdUU066_b.jpg","GoodsImgCount":"1","onSaleCount":183,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508396170","title":"国家电网公司生产技能人员职业能力培训通用教材 继电保护及自动","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.45,"price":12.95,"shippingFee":4.5,"differencePrice":-17.45,"GoodsUrl":"https://book.kongfz.com/654834/8738560594","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1C/8B/p4YBAFq7vXaAM8zEAADX1CViJh8024_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213086113","title":"【正版】创造自然9787213086113","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.86,"price":28.86,"shippingFee":0,"differencePrice":-28.86,"GoodsUrl":"https://book.kongfz.com/774490/8790671476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedbbfba/1175b5720aeccb00_b.jpg","GoodsImgCount":"1","onSaleCount":123,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535441058","title":"白色群像","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.2800000000000002,"price":0.28,"shippingFee":3,"differencePrice":-3.2800000000000002,"GoodsUrl":"https://book.kongfz.com/885099/8677269564","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfdeebbc/0c1b88098d1c3758_b.jpg","GoodsImgCount":"4","onSaleCount":513,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506026468","title":"斯大林的女儿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":9,"shippingFee":8,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/280648/7012552257","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeadaca/fc65bfaccdc26af3_b.jpg","GoodsImgCount":"10","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501948802","title":"高温消毒发货 100种天然食物营养治病全新彩装","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.18,"price":4.38,"shippingFee":1.8,"differencePrice":-6.18,"GoodsUrl":"https://book.kongfz.com/110/8853611246","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbcacbda/2b0d9fb3a6dffbdf_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503424182","title":"政协主席","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.5,"price":6.5,"shippingFee":5,"differencePrice":-11.5,"GoodsUrl":"https://book.kongfz.com/1207201/8642380606","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deffcaae/e40f087108ded6db_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208145405","title":"殷墟青铜器研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33,"price":27,"shippingFee":6,"differencePrice":-33,"GoodsUrl":"https://book.kongfz.com/592236/8433015685","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daafbefb/968585acf2692335_b.jpg","GoodsImgCount":"13","onSaleCount":74,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301244869","title":"俄罗斯文学史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.76,"price":3.26,"shippingFee":1.5,"differencePrice":-4.76,"GoodsUrl":"https://book.kongfz.com/774690/8696568956","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C7/FD/p4YBAFqYQpWAbJXyAAC4ESrSO-U746_b.jpg","GoodsImgCount":"1","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542844064","title":"隐喻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49.8,"price":39.8,"shippingFee":10,"differencePrice":-49.8,"GoodsUrl":"https://book.kongfz.com/302127/7140352552","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AB/1A/p4YBAFr8MQOAND_6AAC1fo4rTZA063_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787568287760","title":"梅兰妮·克莱因儿童心理学:嫉羡与感恩","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.2,"price":11.2,"shippingFee":5,"differencePrice":-16.2,"GoodsUrl":"https://book.kongfz.com/1155304/8779916761","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3038/02939e282aadcbb13b_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532740680","title":"还原论的局限 来自活细胞的训诫","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":26,"shippingFee":3.8,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/1937/8841925682","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccfcafba/14d8bbf616f6cca3_b.jpg","GoodsImgCount":"6","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501056361","title":"嘉德日历2019","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":6,"shippingFee":10,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/593645/7150712837","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eadecbcb/e27d123c6ae6f237_b.jpg","GoodsImgCount":"6","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502848378","title":"怎么选择成长股 美 菲利普 A 费舍 地震出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.75,"price":7.75,"shippingFee":5,"differencePrice":-12.75,"GoodsUrl":"https://book.kongfz.com/180897/8899731120","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecaaabee/4d03e36f79e8d89c_b.jpg","GoodsImgCount":"1","onSaleCount":313,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571404512","title":"真相只有一个","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1,"shippingFee":4,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/893934/8882047074","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbcdefeb/8e226b7ee365b547_b.jpg","GoodsImgCount":"3","onSaleCount":275,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302649847","title":"微积分","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.14,"price":37.34,"shippingFee":3.8,"differencePrice":-41.14,"GoodsUrl":"https://book.kongfz.com/717628/8773767244","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13270436/44c070d95076cb9a_b.jpg","GoodsImgCount":"1","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513662109","title":"年度经营计划制订与管理企业管理年度计划","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.62,"price":18.62,"shippingFee":6,"differencePrice":-24.62,"GoodsUrl":"https://book.kongfz.com/339693/8767370008","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2196/01b864aa0eea225d39_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101124163","title":"中国兵器史稿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/766211/7869531760","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdaaaae/1ae140e68d413e75_b.jpg","GoodsImgCount":"2","onSaleCount":126,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040212495","title":"肥胖症咨询","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.89,"price":15.89,"shippingFee":6,"differencePrice":-21.89,"GoodsUrl":"https://book.kongfz.com/903355/8146162281","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AB/70/p4YBAFqnmtuAcKiLAACq2BdpEts751_b.jpg","GoodsImgCount":"0","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111536659","title":"创业八讲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9000000000000004,"price":0.2,"shippingFee":3.7,"differencePrice":-3.9000000000000004,"GoodsUrl":"https://book.kongfz.com/682861/6931289851","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afffdaff/55c74a8b7dc93c83_b.jpg","GoodsImgCount":"3","onSaleCount":293,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532785049","title":"旅行的艺术(阿兰·德波顿作品集) [英]阿兰·德波顿 著,南治国 彭俊豪 何世原 译 上海译文出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.4,"price":13.4,"shippingFee":3,"differencePrice":-16.4,"GoodsUrl":"https://book.kongfz.com/521005/8637635084","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2926/0277dc937e68954c4f_b.jpg","GoodsImgCount":"1","onSaleCount":141,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532727308","title":"上尉的女儿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.5,"price":8,"shippingFee":4.5,"differencePrice":-12.5,"GoodsUrl":"https://book.kongfz.com/563726/4981987527","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbfdfcde/746d3d61e7061c4a_b.jpg","GoodsImgCount":"9","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787568028318","title":"说服力 如何讲好一个故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.99,"price":2.29,"shippingFee":3.7,"differencePrice":-5.99,"GoodsUrl":"https://book.kongfz.com/760748/8801361701","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcceffd/a729199af997ee71_b.jpg","GoodsImgCount":"3","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508679709","title":"汉字有意思(精装)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":23,"shippingFee":5,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/735780/8827432116","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accfbccf/622e02efc4893d76_b.jpg","GoodsImgCount":"4","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540479343","title":"聪明人的一张纸工作整理术:完美图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.279999999999999,"price":2.78,"shippingFee":1.5,"differencePrice":-4.279999999999999,"GoodsUrl":"https://book.kongfz.com/772556/7315801571","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D2/B7/p4YBAFqYsP6Abfz2AACosblIHW0452_b.jpg","GoodsImgCount":"1","onSaleCount":324,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546342399","title":"黑色记事本 二手书实拍图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.809999999999999,"price":5.21,"shippingFee":5.6,"differencePrice":-10.809999999999999,"GoodsUrl":"https://book.kongfz.com/899541/8721283986","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babdebfe/c531fae696961d1c_b.jpg","GoodsImgCount":"1","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121287183","title":"视觉型团队 应用可视化工具开创团队创新新模式双色","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.7,"price":25.7,"shippingFee":5,"differencePrice":-30.7,"GoodsUrl":"https://book.kongfz.com/666339/8521897933","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddddceac/3da6222201dfdb6b_b.jpg","GoodsImgCount":"1","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111134916","title":"4+2什么对企业真正有效","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/847200/8208211887","imgBigUrl":"https://www0.kfzimg.com/G06/M00/FF/A5/p4YBAFqh9_KAOFbPAACEsYfS-Qk627_b.jpg","GoodsImgCount":"1","onSaleCount":101,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030722485","title":"中药炮制学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33.3,"price":33.3,"shippingFee":0,"differencePrice":-33.3,"GoodsUrl":"https://book.kongfz.com/196857/8732055060","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/7445133/1aaae00ef9686a5d_b.jpg","GoodsImgCount":"1","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805236988","title":"红楼梦","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/256283/8754312169","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decabaff/80a154bafe4d9f70_b.jpg","GoodsImgCount":"9","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308080125","title":"文化产业概论(第二版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.01,"price":0.01,"shippingFee":4,"differencePrice":-4.01,"GoodsUrl":"https://book.kongfz.com/781353/7169578229","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baaefbfb/8732ca3425966bcc_b.jpg","GoodsImgCount":"1","onSaleCount":179,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549259618","title":"明朝市井周刊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":3.9,"shippingFee":3,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/783956/8836247359","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aebbfbcf/12ee2b7c2fb85771_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508098586","title":"太平洋地缘政治学:地理与历史之间关系的研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":44,"price":32,"shippingFee":12,"differencePrice":-44,"GoodsUrl":"https://book.kongfz.com/256234/7416926912","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecfdce/6940ef59d0e3093f_b.jpg","GoodsImgCount":"12","onSaleCount":99,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510711213","title":"平安中国年鉴 2023 碟子在","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":7,"shippingFee":5,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/878710/8454275891","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbfedcbc/950dd6c01187f526_b.jpg","GoodsImgCount":"1","onSaleCount":104,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559655479","title":"子不语:完全珍藏版.3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":10,"shippingFee":10,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/624390/6910763145","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eecfcffc/22d5dc8a606de24c_b.jpg","GoodsImgCount":"5","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787204044559","title":"中国偏方全书 肝病 肾病泌尿病","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.08,"price":0.08,"shippingFee":5,"differencePrice":-5.08,"GoodsUrl":"https://book.kongfz.com/716746/8631109464","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcafcfaa/4e57320326499aca_b.jpg","GoodsImgCount":"1","onSaleCount":286,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541445026","title":"魔法少女①——寻找百变裙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6,"price":6,"shippingFee":0,"differencePrice":-6,"GoodsUrl":"https://book.kongfz.com/461620/5735289715","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eefedaae/806a6210a4e2dfb3_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787228064564","title":"中国九十年代诗歌精选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.35,"price":6.35,"shippingFee":5,"differencePrice":-11.35,"GoodsUrl":"https://book.kongfz.com/820017/8795346716","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fffceade/974ba7bca5ddfc42_b.jpg","GoodsImgCount":"2","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224013887","title":"中国善恶报应习俗","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":3,"shippingFee":7,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/679518/7011532548","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddfebbdb/feef7a302dcd8e57_b.jpg","GoodsImgCount":"3","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115597533","title":"新潮职业","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/911923/8655383401","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cebcdddb/6e45ffcdec9a8925_b.jpg","GoodsImgCount":"1","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506073486","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541128509","title":"不会吟诗也会吟 诗词创作十日谈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.96,"price":8.96,"shippingFee":5,"differencePrice":-13.96,"GoodsUrl":"https://book.kongfz.com/798681/8340108119","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecdfddf/da80026a3f1892fe_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545303964","title":"副省长女秘书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2,"shippingFee":5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/1207077/8689348274","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcaebab/610f32d42234c9ec_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308030458","title":"大学写作陈建新 主编浙江大学出版社9787308030458","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.03,"price":4.03,"shippingFee":0,"differencePrice":-4.03,"GoodsUrl":"https://book.kongfz.com/366030/8589381214","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/093b49e8b778b4c2_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544707510","title":"林先生的小孙女","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34.7,"price":29.7,"shippingFee":5,"differencePrice":-34.7,"GoodsUrl":"https://book.kongfz.com/911923/8761066348","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbdfebfb/29358101e6344448_b.jpg","GoodsImgCount":"1","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500923909","title":"陈式太极拳五功八法十三势","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.7,"price":4.9,"shippingFee":5.8,"differencePrice":-10.7,"GoodsUrl":"https://book.kongfz.com/703680/8288986467","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecffcff/7ec83cb4d94bafd5_b.jpg","GoodsImgCount":"3","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506367608","title":"那个骑轮箱来的蜜儿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/788761/8822390367","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddecfeba/cdd744b263a7e6e1_b.jpg","GoodsImgCount":"1","onSaleCount":108,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505619050","title":"抵岸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":45,"shippingFee":4,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/585018/8894888641","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaafcdcb/89e23d1b5842789f_b.jpg","GoodsImgCount":"8","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522609096","title":"安顿自己 76岁日本女性专家真理子奶奶教你如何过好这一生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":3,"shippingFee":2.4,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/692223/8526088916","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcfbaad/756f18d7352b9e62_b.jpg","GoodsImgCount":"1","onSaleCount":170,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534190711","title":"补益中药实用技巧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.5,"price":3,"shippingFee":3.5,"differencePrice":-6.5,"GoodsUrl":"https://book.kongfz.com/884581/8442926178","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbdcebac/cef24561f15d8822_b.jpg","GoodsImgCount":"5","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500621775","title":"篆刻欣赏 9787500621775","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.65,"price":3.15,"shippingFee":3.5,"differencePrice":-6.65,"GoodsUrl":"https://book.kongfz.com/507381/7533225690","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13271240/a8653532485645de_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108003461","title":"红楼启示录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/398369/8193296634","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfdaabaf/892c48e88bbcdc59_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532139255","title":"考骨纪 北疆生死契 张硕 上海文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/398369/8420118970","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aafafbed/94ce7550b610293d_b.jpg","GoodsImgCount":"1","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519296544","title":"心理学考研重难点1200题","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/135543/8584685391","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbfbfcf/2462ed352d3f44f8_b.jpg","GoodsImgCount":"2","onSaleCount":56,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301279816","title":"贝壳博物馆 博物文库/自然博物馆丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":234,"price":230,"shippingFee":4,"differencePrice":-234,"GoodsUrl":"https://book.kongfz.com/884382/8100768943","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beeeccfa/6424ef37f54fd9bf_b.jpg","GoodsImgCount":"13","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302563273","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301326381","title":"股权、控制权与公司治理:120个实务问题解析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/11146/8755374340","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaaeebd/0672c84311716bdf_b.jpg","GoodsImgCount":"8","onSaleCount":113,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558609701","title":"中外经典故事连环画——中国古代神话故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":13,"shippingFee":0,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/622488/5080907449","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdaebdb/b76efed91207d395_b.jpg","GoodsImgCount":"2","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571400064","title":"说手—太极拳静思录(承道篇)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42,"price":34,"shippingFee":8,"differencePrice":-42,"GoodsUrl":"https://book.kongfz.com/597518/8053281899","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccecdcda/aeab93b2adf2a81c_b.jpg","GoodsImgCount":"7","onSaleCount":100,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540000103","title":"罗通扫北","quality":0,"qualityText":"","originalPrice":0,"totalPrice":46,"price":46,"shippingFee":0,"differencePrice":-46,"GoodsUrl":"https://book.kongfz.com/370626/7929080243","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aefbedbc/a4fc65d52116f37f_b.jpg","GoodsImgCount":"3","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511327925","title":"读史有智慧用史有学问","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":14,"shippingFee":3,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/268442/8600009342","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafbcbab/396f0e52bd7a25d9_b.jpg","GoodsImgCount":"9","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787226038857","title":"中国近代文物事业简史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":16,"shippingFee":10,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/15851/688431873","imgBigUrl":"https://www0.kfzimg.com/W03/14/12/141221cee4836b17ae8e215d8c10180e_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540421434","title":"跟我学手风琴弹唱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.8,"price":9.8,"shippingFee":6,"differencePrice":-15.8,"GoodsUrl":"https://book.kongfz.com/257028/1108204319","imgBigUrl":"https://www0.kfzimg.com/G07/M00/E0/92/qoYBAFwjPOCAZqP-AAGp7_le9_0427_b.jpg","GoodsImgCount":"3","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539317311","title":"福建印人传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36,"price":30,"shippingFee":6,"differencePrice":-36,"GoodsUrl":"https://book.kongfz.com/26986/8178082271","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcfccecd/014b311a1df3276d_b.jpg","GoodsImgCount":"4","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787114114298","title":"物流产业发展规划理论与实践","quality":0,"qualityText":"","originalPrice":0,"totalPrice":777780.3,"price":777780.3,"shippingFee":0,"differencePrice":-777780.3,"GoodsUrl":"https://book.kongfz.com/390985/8890465732","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C4/B6/p4YBAFq4r2iAEiqwAAC_IROI4fY072_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806227794","title":"揭开雍正皇帝隐秘的面纱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.5,"price":7.5,"shippingFee":10,"differencePrice":-17.5,"GoodsUrl":"https://book.kongfz.com/603552/7638624490","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcbdbda/df84853aea96acc6_b.jpg","GoodsImgCount":"1","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562050445","title":"程序即是惩罚:基层刑事法院的案件处理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.14,"price":9.14,"shippingFee":6,"differencePrice":-15.14,"GoodsUrl":"https://book.kongfz.com/560577/8422900551","imgBigUrl":"https://www0.kfzimg.com/G06/M00/63/D0/p4YBAFq-KauAZ5KrAACo4MqJ-oY907_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512721722","title":"不止文静","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.3500000000000005,"price":1.7,"shippingFee":5.65,"differencePrice":-7.3500000000000005,"GoodsUrl":"https://book.kongfz.com/743642/8767293788","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfeebade/d7b6b7c62b2a40e5_b.jpg","GoodsImgCount":"3","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535795168","title":"第一推动丛书 物理系列:完美理论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":6,"shippingFee":6,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/206084/8817868442","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6137288/629b1a53703318bb_b.jpg","GoodsImgCount":"6","onSaleCount":113,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559623102","title":"顶级销售的111条军规","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.57,"price":7.57,"shippingFee":4,"differencePrice":-11.57,"GoodsUrl":"https://book.kongfz.com/607359/8796692730","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E7/C4/p4YBAFt_h6uANn-6AADhap7U0Cs462_b.jpg","GoodsImgCount":"1","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531214151","title":"名家彩图鉴赏名杉崎由绮琉 琉璃色的天使","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":8,"shippingFee":0,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/208724/6365919000","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6206642/305ac1b89c25cda6_b.jpg","GoodsImgCount":"3","onSaleCount":208,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511883018","title":"中华人民共和国森林法 最新修订版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.54,"price":0.04,"shippingFee":4.5,"differencePrice":-4.54,"GoodsUrl":"https://book.kongfz.com/757209/8460373718","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaedbbba/b0b467ad7807e8c8_b.jpg","GoodsImgCount":"2","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510143618","title":"邦臣小红花 神奇洞洞书 这是什么颜色 北京小红花图书工作室 中国人口出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.73,"price":2.73,"shippingFee":5,"differencePrice":-7.73,"GoodsUrl":"https://book.kongfz.com/263231/8827442067","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daebfcdd/21853a8d3d6b6f4e_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108028310","title":"语文常谈:中学图书馆文库","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":3,"shippingFee":7,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/346280/8715238629","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebecffaa/c0082bbaa022388a_b.jpg","GoodsImgCount":"4","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539050904","title":"图解黄帝内经(中国养生第一书 经典图解畅销版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":10,"shippingFee":4,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/20902/8088357878","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beacfaae/051481bdbde5a4c7_b.jpg","GoodsImgCount":"3","onSaleCount":313,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111326236","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508095950","title":"我命在我也在天:道家筋经内传指略","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":20,"shippingFee":5,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/849894/8780983692","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccfbfbeb/c181eed498b667bd_b.jpg","GoodsImgCount":"6","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535971531","title":"潮式风味点心制作工艺(广东省“粤菜师傅”工程培训教材)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.89,"price":8.89,"shippingFee":5,"differencePrice":-13.89,"GoodsUrl":"https://book.kongfz.com/502929/8245471444","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdfddbb/7d433d18b88839e7_b.jpg","GoodsImgCount":"11","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501400881","title":"谍海沉浮三十年:休.汉布尔顿的双重生涯(//1988-07一版一印馆藏未翻阅自然旧近10品/见描述/2)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":10,"shippingFee":14,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/7229/644810045","imgBigUrl":"https://www0.kfzimg.com/G05/M00/05/41/p4YBAFjFSF2Ab6FaAAClse2zg6k836_b.jpg","GoodsImgCount":"3","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505920514","title":"中国神仙养生大全","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":28,"shippingFee":10,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/233973/8813481496","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafadabd/21780c3c3a50a749_b.jpg","GoodsImgCount":"5","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040433647","title":"环境工程原理第3版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.4699999999999998,"price":0.47,"shippingFee":3,"differencePrice":-3.4699999999999998,"GoodsUrl":"https://book.kongfz.com/830714/8836053658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faddeebf/73e1130a978eb2ab_b.jpg","GoodsImgCount":"1","onSaleCount":333,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562353416","title":"我们这样做生本教育·数学篇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.730000000000004,"price":26.73,"shippingFee":6,"differencePrice":-32.730000000000004,"GoodsUrl":"https://book.kongfz.com/701775/8673274568","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fddbbdea/243269b1eea9ec2d_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208093973","title":"忧伤的老板","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/284909/6860484341","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feeddceb/3070df6c3b2af8ed_b.jpg","GoodsImgCount":"7","onSaleCount":119,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507532890","title":"蒋经国传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.11,"price":15.11,"shippingFee":6,"differencePrice":-21.11,"GoodsUrl":"https://book.kongfz.com/845061/7763922871","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cebaaefb/007eff2770c0243f_b.jpg","GoodsImgCount":"9","onSaleCount":319,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111497929","title":"零基础学内部审计","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":36,"shippingFee":7,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/521179/7169944650","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbfcfaf/ec51ee601eb33d49_b.jpg","GoodsImgCount":"4","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511575678","title":"北京四中语文课:细说诗文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":15,"shippingFee":5,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/902933/8887092520","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edbebdaa/f72f2a49d8f650cd_b.jpg","GoodsImgCount":"4","onSaleCount":136,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559629906","title":"新书-- 后浪·因为我有生活:电影美术师杨占家从艺录(精装)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":7,"shippingFee":7,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/680109/8164552567","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/306/3af6ecaa708cfe4d_b.jpg","GoodsImgCount":"1","onSaleCount":160,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810035767","title":"三皇炮捶一北京镖局拳术功法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":78,"price":68,"shippingFee":10,"differencePrice":-78,"GoodsUrl":"https://book.kongfz.com/17030/7934731735","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faacbdfe/9dd500da308d84fb_b.jpg","GoodsImgCount":"6","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532256327","title":"中外设计艺术论著精读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.2,"price":7.2,"shippingFee":5,"differencePrice":-12.2,"GoodsUrl":"https://book.kongfz.com/180897/8429017414","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/affbbacd/c725a34076a44bc5_b.jpg","GoodsImgCount":"1","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787576406528","title":"环境法调整范围问题研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.72,"price":13.72,"shippingFee":7,"differencePrice":-20.72,"GoodsUrl":"https://book.kongfz.com/753811/8420113257","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14256494/0c2399ce4c56befd_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530522493","title":"棋魂·光之棋(15)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.8,"price":3.8,"shippingFee":12,"differencePrice":-15.8,"GoodsUrl":"https://book.kongfz.com/259232/3263082368","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efbaeadf/d6e0defb6c2112d3_b.jpg","GoodsImgCount":"3","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115455611","title":"股市T+0交易实战技法图解升级版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.45,"price":6.95,"shippingFee":5.5,"differencePrice":-12.45,"GoodsUrl":"https://book.kongfz.com/898097/8767386927","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/debffbda/75ccfb20d83a74a1_b.jpg","GoodsImgCount":"2","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547717455","title":"来点给力的正能量 让我更加积极向上的故事 做最好的自己","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.52,"price":1.12,"shippingFee":2.4,"differencePrice":-3.52,"GoodsUrl":"https://book.kongfz.com/561672/8424838977","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfafacec/f67f9a463082e593_b.jpg","GoodsImgCount":"1","onSaleCount":116,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303099771","title":"自信的提升","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":15,"shippingFee":0,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/783975/7001458250","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecbbaac/c1db02303b2b0bbc_b.jpg","GoodsImgCount":"5","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513318365","title":"二手昆虫漫话科普经典文库新星","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.49,"price":4.49,"shippingFee":2,"differencePrice":-6.49,"GoodsUrl":"https://book.kongfz.com/769044/7879074016","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caaeebac/90432555072321fe_b.jpg","GoodsImgCount":"3","onSaleCount":214,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117172028","title":"·医学影像学第7版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.88,"price":0.08,"shippingFee":3.8,"differencePrice":-3.88,"GoodsUrl":"https://book.kongfz.com/237705/8801387036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaddeaff/0a5c6cac3826b2fc_b.jpg","GoodsImgCount":"1","onSaleCount":325,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787312027079","title":"高等学校过渡教材读本 高中数学大学数学基本习题练习高三学生升大学大一新生数学过渡 谢盛刚 中国科学技术大学出版社图书籍","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.37,"price":7.37,"shippingFee":10,"differencePrice":-17.37,"GoodsUrl":"https://book.kongfz.com/374786/8679077396","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11488598/edc93870210278b7_b.jpg","GoodsImgCount":"1","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506731584","title":"孰能无错:创建更加安全的医疗卫生保健系统","quality":0,"qualityText":"","originalPrice":0,"totalPrice":119.47,"price":107.47,"shippingFee":12,"differencePrice":-119.47,"GoodsUrl":"https://book.kongfz.com/912097/8236582135","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23092773/64be6ccad3f4056e_b.jpg","GoodsImgCount":"2","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806325162","title":"股市预测方法大全","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":6.7,"shippingFee":5,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/911923/8760299166","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfafeeed/53759abb4d28ec0a_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501167326","title":"斯大林:鲜为人知的剖面","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.13,"price":19.13,"shippingFee":3,"differencePrice":-22.13,"GoodsUrl":"https://book.kongfz.com/566350/8837106767","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abcfdcca/3069be6490f47334_b.jpg","GoodsImgCount":"6","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544430548","title":"中国近现代学校音乐教育(1840-1949)(1949-1995)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":20,"shippingFee":6,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/27200/6963259840","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeaacada/c8352f4dd943f78f_b.jpg","GoodsImgCount":"5","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121281839","title":"内分泌决定女人健康","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.5,"price":7,"shippingFee":2.5,"differencePrice":-9.5,"GoodsUrl":"https://book.kongfz.com/361618/8008064383","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dccddaee/22195ad9be22f208_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506322751","title":"巴黎 艺术至上","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9399999999999995,"price":1.94,"shippingFee":5,"differencePrice":-6.9399999999999995,"GoodsUrl":"https://book.kongfz.com/820017/8872308665","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcaabdff/8609546f9f9d59d4_b.jpg","GoodsImgCount":"2","onSaleCount":110,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559437839","title":"遗忘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":8,"shippingFee":3,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/268442/8358622148","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dceaeeaf/d6f93765fd88c265_b.jpg","GoodsImgCount":"6","onSaleCount":143,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521740288","title":"华为组织力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":15,"shippingFee":9,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/762356/6953163766","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14883503/80b35d52657b3996_b.jpg","GoodsImgCount":"1","onSaleCount":135,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201161969","title":"地球上线.3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.779999999999999,"price":4.77,"shippingFee":0.01,"differencePrice":-4.779999999999999,"GoodsUrl":"https://book.kongfz.com/754078/8661022100","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbacffdf/639fc984f5b2e115_b.jpg","GoodsImgCount":"2","onSaleCount":515,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516116890","title":"美国研究十年回顾(2001-2010)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.1,"price":10.1,"shippingFee":5,"differencePrice":-15.1,"GoodsUrl":"https://book.kongfz.com/619532/7045149457","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdaacece/05f659a51981a4d6_b.jpg","GoodsImgCount":"4","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521715613","title":"航海少年团1·古灯塔的神秘之门","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.89,"price":0.09,"shippingFee":4.8,"differencePrice":-4.89,"GoodsUrl":"https://book.kongfz.com/780405/7827920500","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcabbed/2ac0d0a49357653f_b.jpg","GoodsImgCount":"4","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553734088","title":"神农本草经(精版) 9787553734088","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.86,"price":12.86,"shippingFee":2,"differencePrice":-14.86,"GoodsUrl":"https://book.kongfz.com/755561/8095945895","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cccaedbc/a2944602ab786932_b.jpg","GoodsImgCount":"2","onSaleCount":202,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533935085","title":"各自的朝圣路","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":4.5,"shippingFee":0,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/356195/8895884096","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/a1472ea00606d477_b.jpg","GoodsImgCount":"5","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802504004","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030080509","title":"接口电路入门","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":3,"shippingFee":8,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/737383/6250535451","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdaaaec/4255d8b549208d2b_b.jpg","GoodsImgCount":"6","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508056180","title":"内功是怎样炼成的","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":26.8,"shippingFee":3,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/1087817/8643065121","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adfaaafb/dc1ba998f7f55ecf_b.jpg","GoodsImgCount":"6","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300089089","title":"传播学专业英语教程(第四版) 巴兰 中国人民大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":4.9,"shippingFee":3,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/521005/8353652390","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C6/1B/p4YBAFqYPGyAGqpqAAC62maQM4A311_b.jpg","GoodsImgCount":"1","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787563399789","title":"诗歌读本(学前卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25.22,"price":14.22,"shippingFee":11,"differencePrice":-25.22,"GoodsUrl":"https://book.kongfz.com/832731/7502436066","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22203957/acb0519120203613_b.jpg","GoodsImgCount":"2","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508659121","title":"小熊很忙中英双语厚纸板游戏书:快乐的假期","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":1,"shippingFee":10,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/281327/8827437261","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddaafcaf/7c85a7abd7215d33_b.jpg","GoodsImgCount":"6","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516530399","title":"未来世界","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.690000000000001,"price":6.69,"shippingFee":5,"differencePrice":-11.690000000000001,"GoodsUrl":"https://book.kongfz.com/1212927/8625774682","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabfaeed/effb81294d8913ec_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507305227","title":"从宝塔山到中南海","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":20,"shippingFee":15,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/669739/8486939181","imgBigUrl":"https://www0.kfzimg.com/G07/M00/FA/0C/q4YBAFywU4aAImriAABJ4X3BxME372_b.jpg","GoodsImgCount":"1","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541018961","title":"【涵套装】中国西部太阳谷——得荣:[中英藏文本]","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":26,"shippingFee":9,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/439962/6640113502","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caddfaca/d7cc825d53483bca_b.jpg","GoodsImgCount":"30","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544774277","title":"远处的拉莫","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.93,"price":19.93,"shippingFee":5,"differencePrice":-24.93,"GoodsUrl":"https://book.kongfz.com/202798/8665745337","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcabcbac/c0577cb97558c6f2_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501048014","title":"大美之佛像:犍陀罗艺术(16开精装 全1册)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":104.88,"price":98.88,"shippingFee":6,"differencePrice":-104.88,"GoodsUrl":"https://book.kongfz.com/386071/8241300300","imgBigUrl":"https://www0.kfzimg.com/G06/M00/EB/82/p4YBAFqhN8yAXG-yAADLMdZzwV4982_b.jpg","GoodsImgCount":"1","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547259863","title":"回话的技术","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.7800000000000002,"price":0.78,"shippingFee":2,"differencePrice":-2.7800000000000002,"GoodsUrl":"https://book.kongfz.com/738826/8530510157","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdcadebc/80a28b6c4a823131_b.jpg","GoodsImgCount":"1","onSaleCount":1640,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519102586","title":"【正版二手书籍】 幼儿园科学领域教育精要:关键经验与活动指导 175-5-2-127","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.95,"price":8.95,"shippingFee":2,"differencePrice":-10.95,"GoodsUrl":"https://book.kongfz.com/826462/8673356833","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22052838/3f2484448a8e7784_b.jpg","GoodsImgCount":"3","onSaleCount":105,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533263423","title":"没有秘密长不大","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.01,"price":0.01,"shippingFee":3,"differencePrice":-3.01,"GoodsUrl":"https://book.kongfz.com/891713/7988364522","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdbefbe/fe803e1c2690f4d9_b.jpg","GoodsImgCount":"4","onSaleCount":830,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806598436","title":"佛教灵验记研究:以晋唐为中心","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":40,"shippingFee":8,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/23842/8011951958","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3149222/bc752f79a0734a0f_b.jpg","GoodsImgCount":"5","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564129255","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115352491","title":"Photoshop CS6实战从入门到精通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.5,"price":3.5,"shippingFee":0,"differencePrice":-3.5,"GoodsUrl":"https://book.kongfz.com/372285/8607946044","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbdafff/0e356f4ae5d6050d_b.jpg","GoodsImgCount":"4","onSaleCount":236,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506382298","title":"三重门-十五周年纪念版9787506382298","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.2,"price":3.6,"shippingFee":2.6,"differencePrice":-6.2,"GoodsUrl":"https://book.kongfz.com/20579/8888133382","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfcbdfb/c68163ee23660130_b.jpg","GoodsImgCount":"1","onSaleCount":53,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560381299","title":"拉马努金遗失笔记(第一卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":110,"price":105,"shippingFee":5,"differencePrice":-110,"GoodsUrl":"https://book.kongfz.com/319561/8249081973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcecbafe/c29d43db77317553_b.jpg","GoodsImgCount":"9","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500869016","title":"诡盗团","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.4,"price":10,"shippingFee":5.4,"differencePrice":-15.4,"GoodsUrl":"https://book.kongfz.com/7546/8297358995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abdbfdde/76f2d0edb31829de_b.jpg","GoodsImgCount":"2","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540343927","title":"中华成语全典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":90,"price":78,"shippingFee":12,"differencePrice":-90,"GoodsUrl":"https://book.kongfz.com/602730/8697095825","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbaccafa/924c480acee402ce_b.jpg","GoodsImgCount":"4","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553420394","title":"西方经典哲学之旅系列 荣格的性格哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.859999999999999,"price":0.06,"shippingFee":4.8,"differencePrice":-4.859999999999999,"GoodsUrl":"https://book.kongfz.com/245306/8510038095","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdeafdd/43d52666b500e80f_b.jpg","GoodsImgCount":"1","onSaleCount":188,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502541897","title":"润滑剂与润滑(有水印)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":39,"shippingFee":10,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/353752/8432573477","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deeecfdd/2761ee960fe2bd5b_b.jpg","GoodsImgCount":"6","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572617270","title":"《我准备好了,变老也没关系》","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.9,"price":11.9,"shippingFee":6,"differencePrice":-17.9,"GoodsUrl":"https://book.kongfz.com/901995/8697497893","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13196094/c59e3bd7277ec52d_b.jpg","GoodsImgCount":"1","onSaleCount":161,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508663920","title":"商业区块链 开启加密经济新时代威廉 穆贾雅 著 林华 等 译中信出版社9787508663920","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.01,"price":4.01,"shippingFee":0,"differencePrice":-4.01,"GoodsUrl":"https://book.kongfz.com/248516/8732168980","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/f4e2971f8af4ba85_b.jpg","GoodsImgCount":"1","onSaleCount":331,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308022279","title":"中央银行关金券·金圆券","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/364294/8442165598","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedfbadc/a39d3b2c67fb7320_b.jpg","GoodsImgCount":"4","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503883880","title":"IUCN自然保护地管理分类应用指南:纪念中国自然保护区建设60周年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/274216/8872061006","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adefaafa/ec00a58c55648b0d_b.jpg","GoodsImgCount":"4","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221041524","title":"大唐西域记全译","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":23,"shippingFee":5,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/1207201/8690378400","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abacbffd/2e48df6c99d72e02_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506748438","title":"国医大师颜德馨","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":36,"shippingFee":7,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/15548/6439625257","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceffcafa/676a35c42ee7db3f_b.jpg","GoodsImgCount":"3","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221158017","title":"我当心理咨询师遇到的那些怪诞事件3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.8,"price":8,"shippingFee":3.8,"differencePrice":-11.8,"GoodsUrl":"https://book.kongfz.com/198833/7419472199","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5862318/942b1c4a6bced624_b.jpg","GoodsImgCount":"1","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522604435","title":"安英的魅力口才","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.33,"price":7.33,"shippingFee":3,"differencePrice":-10.33,"GoodsUrl":"https://book.kongfz.com/566350/8859451482","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/15424286/0c9700a9eeda2a28_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787574204058","title":"新编医圣张仲景奇方妙治","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.24,"price":3.24,"shippingFee":5,"differencePrice":-8.24,"GoodsUrl":"https://book.kongfz.com/1154627/8795652570","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfacacce/1f4e1df9d8365907_b.jpg","GoodsImgCount":"2","onSaleCount":246,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547908051","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503232589","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549630356","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111674887","title":"Rhino7犀利建模","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.86,"price":7.86,"shippingFee":0,"differencePrice":-7.86,"GoodsUrl":"https://book.kongfz.com/638685/8631701848","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3656/0329a70d76c057ea6f_b.jpg","GoodsImgCount":"1","onSaleCount":143,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532924899","title":"请大家保护自己的腰/新活力作家文丛","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55.98,"price":45.98,"shippingFee":10,"differencePrice":-55.98,"GoodsUrl":"https://book.kongfz.com/832982/7495387597","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22231533/28e7f7f1bdb87c7f_b.jpg","GoodsImgCount":"2","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502419035","title":"重有色金属冶炼设计手册:冶炼烟气收尘·通用工程(常用数据卷)(藏书\\无笔记\\实物拍摄)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":228,"price":220,"shippingFee":8,"differencePrice":-228,"GoodsUrl":"https://book.kongfz.com/218311/7537560196","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/effdedef/6c145f37a0818a46_b.jpg","GoodsImgCount":"14","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787304093150","title":"DK玩出来的百科:棋子数学游戏(新版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/678667/7919607286","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bffefdbb/7bfd77f54abb77e1_b.jpg","GoodsImgCount":"4","onSaleCount":163,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500475965","title":"精英与资本:转型期中国乡村精英结构变迁的实证研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.4,"price":5,"shippingFee":4.4,"differencePrice":-9.4,"GoodsUrl":"https://book.kongfz.com/12041/8322135237","imgBigUrl":"https://www0.kfzimg.com/G06/M00/2E/97/p4YBAFs0qnmAL_i4AACf9Lup5DI641_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534059308","title":"排球少年!! 2:最高处的风景","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.5,"price":4.5,"shippingFee":6,"differencePrice":-10.5,"GoodsUrl":"https://book.kongfz.com/648064/8020657037","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbfddbcd/2983bfa0f566d3be_b.jpg","GoodsImgCount":"7","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787563392926","title":"浮生:清美凄凉的伶人传奇 馆藏无笔迹","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.2,"price":0.2,"shippingFee":6,"differencePrice":-6.2,"GoodsUrl":"https://book.kongfz.com/180265/5033827968","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feecdbac/ef77ae61ce991e03_b.jpg","GoodsImgCount":"2","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508682945","title":"我的世界就是一座花园","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.6,"price":17.6,"shippingFee":10,"differencePrice":-27.6,"GoodsUrl":"https://book.kongfz.com/901511/8212002579","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caddcbaf/376c04b8d6e29e64_b.jpg","GoodsImgCount":"4","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101040418","title":"三曹资料汇编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":54.42,"price":45.42,"shippingFee":9,"differencePrice":-54.42,"GoodsUrl":"https://book.kongfz.com/797172/8353517037","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21462970/467b1a4dcf01baf8_b.jpg","GoodsImgCount":"1","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530888469","title":"健康有捷径:气血旺 百病消","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/262475/4642903053","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfddfdfd/292f2b4eb304bb3e_b.jpg","GoodsImgCount":"9","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544789332","title":"人文与社会译丛:风险社会","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":12,"shippingFee":8,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/591983/8368601013","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baeafbdb/ba8a68ab686c5496_b.jpg","GoodsImgCount":"5","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201110066","title":"正版 小鹿斑比 费利克斯 萨尔腾一部关于爱 成长与生命的童话 迪士尼同名动画原著小说 儿童文学 迪士尼 果麦图书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":45.5,"price":33.5,"shippingFee":12,"differencePrice":-45.5,"GoodsUrl":"https://book.kongfz.com/765896/6847101073","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20763945/401ff2ad8d22b54c_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521702019","title":"地球","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.93,"price":18.93,"shippingFee":10,"differencePrice":-28.93,"GoodsUrl":"https://book.kongfz.com/791821/8547538750","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/564/6d855bb66320948e_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121288579","title":"高效运作项目管理办公室:PMO实践、案例和启示 张富民 著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.04,"price":12.04,"shippingFee":0,"differencePrice":-12.04,"GoodsUrl":"https://book.kongfz.com/169647/8662261121","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3674971/90a67a9cc84613ca_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511361547","title":"股市心理战:一位资深股民的投资哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":25,"shippingFee":10,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/356104/4811368206","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaefbafe/a5e0de1094aec3d8_b.jpg","GoodsImgCount":"3","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547239438","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800689659","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040274202","title":"设计原理彭澎编著高等教育出版社9787040274202","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.79,"price":4.79,"shippingFee":0,"differencePrice":-4.79,"GoodsUrl":"https://book.kongfz.com/366030/8354018430","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/03d8b190e2261d50_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542847621","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801786029","title":"【原版闪电发货】原《金口诀应用学》(各类实战例题解读)/张得计大小六壬入门四柱学盲派书籍图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":50.4,"price":40.4,"shippingFee":10,"differencePrice":-50.4,"GoodsUrl":"https://book.kongfz.com/274158/7360476472","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9625326/3ee67f794e6b1f58_b.jpg","GoodsImgCount":"2","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503400032","title":"忆往谈旧录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.1,"price":8.1,"shippingFee":3,"differencePrice":-11.1,"GoodsUrl":"https://book.kongfz.com/577988/7210036783","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdffcae/40a87de7683567d9_b.jpg","GoodsImgCount":"3","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559608710","title":"高敏感是种天赋 拯救全球15亿人的心灵之书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.55,"price":6.05,"shippingFee":1.5,"differencePrice":-7.55,"GoodsUrl":"https://book.kongfz.com/825417/8696502179","imgBigUrl":"https://www0.kfzimg.com/G06/M00/CB/77/p4YBAFqYl1eAXrB-AADwJUlM01E764_b.jpg","GoodsImgCount":"0","onSaleCount":467,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532264643","title":"铠甲勇士·刑天:对战大图鉴1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":20,"shippingFee":8,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/261367/8881674842","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dacfeccc/2c82927f965d5eea_b.jpg","GoodsImgCount":"11","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553443751","title":"菲尔博士率众前来","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":9,"shippingFee":8,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/188947/8481004836","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbdacdf/05ba38b868d0fca8_b.jpg","GoodsImgCount":"7","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305032974","title":"孟子评传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":148,"price":148,"shippingFee":0,"differencePrice":-148,"GoodsUrl":"https://book.kongfz.com/15335/8300858073","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baccaafc/a39615a199559525_b.jpg","GoodsImgCount":"8","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508678993","title":"我愿意等,熊猫先生(单册价格,套装咨询客服)(单册价格,套装咨询客服)(单册价格,套装咨询客服)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.91,"price":7.91,"shippingFee":2,"differencePrice":-9.91,"GoodsUrl":"https://book.kongfz.com/769044/8613050954","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdbfbdf/00d80d1cc0ca28cc_b.jpg","GoodsImgCount":"2","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538550368","title":"疯了!桂宝(第贰卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.09,"price":0.09,"shippingFee":5,"differencePrice":-5.09,"GoodsUrl":"https://book.kongfz.com/11912/5836900069","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbaecaeb/c5c246f371e9cc2a_b.jpg","GoodsImgCount":"4","onSaleCount":161,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532750108","title":"炎夏之都","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32,"price":23,"shippingFee":9,"differencePrice":-32,"GoodsUrl":"https://book.kongfz.com/810477/8511733932","imgBigUrl":"https://www0.kfzimg.com/G06/M00/DE/4B/p4YBAFrUlHCAH8skAAB13jNBPts242_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514302646","title":"素食达人","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.95,"price":4.95,"shippingFee":4,"differencePrice":-8.95,"GoodsUrl":"https://book.kongfz.com/1027325/8690643837","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccafdaaf/ecd79dc361fa7827_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500489559","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549559299","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115525932","title":"建筑施工会计真账实操全流程演练第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.82,"price":6.82,"shippingFee":0,"differencePrice":-6.82,"GoodsUrl":"https://book.kongfz.com/548348/8649348889","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/801/8da2143eeaea7a0b_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302165682","title":"清华大学化学类教材:简明物理化学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31.78,"price":24.78,"shippingFee":7,"differencePrice":-31.78,"GoodsUrl":"https://book.kongfz.com/722739/8596219163","imgBigUrl":"https://www0.kfzimg.com/G06/M00/42/8C/p4YBAFqbhNuARHsYAAB-WYFXRzQ862_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101100938","title":"宋词三百首","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.780000000000001,"price":4.78,"shippingFee":4,"differencePrice":-8.780000000000001,"GoodsUrl":"https://book.kongfz.com/330788/8429376914","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbaffcff/acaca30e37ab4659_b.jpg","GoodsImgCount":"1","onSaleCount":145,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800137495","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512679436","title":"原来化学可以这样学 化学奇谈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.25,"price":0.25,"shippingFee":5,"differencePrice":-5.25,"GoodsUrl":"https://book.kongfz.com/202798/8459717610","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcecdaaf/b6227047461d7a66_b.jpg","GoodsImgCount":"1","onSaleCount":237,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9780375813658","title":"Magic Tree House Books #1-4神奇树屋合辑(1-4)(缺3册)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":4,"shippingFee":8,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/5669/7756604676","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1278/ecde0a6674bba01f_b.jpg","GoodsImgCount":"3","onSaleCount":72,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556828623","title":"苍蝇和大象的足球赛米切尔 恩德20周年纪念版精装","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.86,"price":5.86,"shippingFee":5,"differencePrice":-10.86,"GoodsUrl":"https://book.kongfz.com/911923/8827352288","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dacdaecc/d202436c78aecf55_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300145365","title":"刑法各论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/265019/8666457069","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C7/25/p4YBAFqYP2SACg9mAACfG_cnNJI045_b.jpg","GoodsImgCount":"1","onSaleCount":86,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787551715843","title":"VI设计9787551715843","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.69,"price":0.19,"shippingFee":3.5,"differencePrice":-3.69,"GoodsUrl":"https://book.kongfz.com/1152148/8524904150","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/becaaeef/50d6f4ba2c5a29e3_b.jpg","GoodsImgCount":"3","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532793365","title":"安娜·卡列尼娜的真实故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":25,"shippingFee":4.8,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/567272/8398230717","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abcfbbca/a0f81346232c398b_b.jpg","GoodsImgCount":"1","onSaleCount":124,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556101429","title":"爸爸去哪儿(实用版)超级龙蛋王亲子互动漫画(未拆封)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.5,"price":15,"shippingFee":5.5,"differencePrice":-20.5,"GoodsUrl":"https://book.kongfz.com/346699/4684397376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6198840/45e55b1a2a1686ca_b.jpg","GoodsImgCount":"3","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511354785","title":"高效经营法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":7,"shippingFee":10,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/356060/8256005905","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcfceede/8183e6993263453c_b.jpg","GoodsImgCount":"3","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535692023","title":"浮世绘【浦睿文化出品】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.99,"price":22.99,"shippingFee":5,"differencePrice":-27.99,"GoodsUrl":"https://book.kongfz.com/914444/8566543484","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abccddda/84545b02d8c7d573_b.jpg","GoodsImgCount":"8","onSaleCount":151,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507737172","title":"神农本草经读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36.14,"price":24.14,"shippingFee":12,"differencePrice":-36.14,"GoodsUrl":"https://book.kongfz.com/795825/7321125946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14523379/60a9962271d44fca_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556240944","title":"儿童英语轻松学系列 儿童英语启蒙1000词","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.050000000000001,"price":2.16,"shippingFee":2.89,"differencePrice":-5.050000000000001,"GoodsUrl":"https://book.kongfz.com/785333/8282614242","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebbbeebb/ec1d8b32a5bea2e3_b.jpg","GoodsImgCount":"1","onSaleCount":121,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550042308","title":"丰子恺给孩子的阅读写作课 游记卷 丰子恺著绘 张伟锋点评 白马时光出品 百花洲文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":2.9,"shippingFee":5,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/398369/8726837081","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addfdfdc/53c3f12c6f960ff8_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111667278","title":"IT运维服务管理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.26,"price":16.26,"shippingFee":0,"differencePrice":-16.26,"GoodsUrl":"https://book.kongfz.com/196857/8731918717","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2750/02491aeaaef30c5f3b_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544490337","title":"白马湖书系 培养真正的阅读者 整本书阅读之理论基础 吴欣歆 上海教育出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.59,"price":7.59,"shippingFee":5,"differencePrice":-12.59,"GoodsUrl":"https://book.kongfz.com/903313/8744997561","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efeeabfe/6b03cfc027eedc60_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539554594","title":"云梦泽屠龙记鬼谷学校 第五卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.01,"price":4.01,"shippingFee":3,"differencePrice":-7.01,"GoodsUrl":"https://book.kongfz.com/1181761/8874528061","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daceffce/ebcdaf1d65f390fb_b.jpg","GoodsImgCount":"1","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309079418","title":"三十七道品偈诵释义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":6,"shippingFee":6,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/386898/7963978478","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daefeadc/063dce8cf89efcab_b.jpg","GoodsImgCount":"3","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535957450","title":"寻味广东丛书:百年老店·广州老食肆与老食语","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":10,"shippingFee":4,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/203004/8386290176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeebdfa/811d13534a3f61d4_b.jpg","GoodsImgCount":"1","onSaleCount":81,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305022906","title":"数学奥林匹克题典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":17,"shippingFee":7,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/188968/7578688674","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accadcff/4b343540fbb642e0_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546376806","title":"西游记 吴承恩著 9787546376806 吉林出版集团有限责任公司","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.48,"price":3.98,"shippingFee":2.5,"differencePrice":-6.48,"GoodsUrl":"https://book.kongfz.com/237713/8683926712","imgBigUrl":"https://www0.kfzimg.com/G06/M00/49/0D/p4YBAFqbt_2AQMoYAABFGK4V49k913_b.jpg","GoodsImgCount":"1","onSaleCount":145,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521714074","title":"外国摄影师镜头里的中国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":72,"price":65,"shippingFee":7,"differencePrice":-72,"GoodsUrl":"https://book.kongfz.com/281199/8410912596","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfffacae/d2279aa3b06bc73f_b.jpg","GoodsImgCount":"11","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531171423","title":"嘻哈小天才. 9","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":16,"shippingFee":10,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/497994/8873990567","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afaefffa/165fe0bdd58127cb_b.jpg","GoodsImgCount":"10","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530500606","title":"欧洲绘画简史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.5,"price":5,"shippingFee":6.5,"differencePrice":-11.5,"GoodsUrl":"https://book.kongfz.com/754002/7204027658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdddbbcd/56f24b5b0f8784bb_b.jpg","GoodsImgCount":"4","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510888489","title":"周易本义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":20,"shippingFee":8,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/228843/6865717081","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdfdfafb/dce8a087d28c2705_b.jpg","GoodsImgCount":"1","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213013386","title":"人生絮语","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":3,"shippingFee":4,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/727057/8432652339","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbacfccd/b9fed35ba00032e8_b.jpg","GoodsImgCount":"7","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506748544","title":"国医大师唐由之","quality":0,"qualityText":"","originalPrice":0,"totalPrice":99.09,"price":90.09,"shippingFee":9,"differencePrice":-99.09,"GoodsUrl":"https://book.kongfz.com/465465/7167355375","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E2/3C/p4YBAFqY552AUUL5AACreTJSD6s208_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501946983","title":"家庭治疗基础","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38.9,"price":33.9,"shippingFee":5,"differencePrice":-38.9,"GoodsUrl":"https://book.kongfz.com/911923/8779777083","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cadeeebc/3589bebebfa3f806_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520822022","title":"中国古琴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.51,"price":8.51,"shippingFee":3,"differencePrice":-11.51,"GoodsUrl":"https://book.kongfz.com/718844/7361733092","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/19134004/9c42134fc4f080b2_b.jpg","GoodsImgCount":"1","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530149188","title":"正版图书 蒲公英中国儿童文学名家精品丛书:小巫婆的大扫帚(注音版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/525155/8129835817","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfededad/b9702bb478982502_b.jpg","GoodsImgCount":"9","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309016987","title":"孟子旁通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":11,"shippingFee":2,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/624177/8000572501","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedefadf/97ba0db0d0c9eeef_b.jpg","GoodsImgCount":"3","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544428651","title":"华师大二附中","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.4,"price":5.9,"shippingFee":5.5,"differencePrice":-11.4,"GoodsUrl":"https://book.kongfz.com/1182056/8831011997","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1632/013b0116920fd5ef7a_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501986002","title":"家具专业英语实务(普通高等教育室内与家具设计专业十二五规划教材)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":47.1,"price":40.7,"shippingFee":6.4,"differencePrice":-47.1,"GoodsUrl":"https://book.kongfz.com/561989/8852981910","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbeebcf/437692bc37429777_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558606212","title":"正版二手书书画巨匠艺库:傅抱石·傅抱石中国画法要论(精装本)9787558606212","quality":0,"qualityText":"","originalPrice":0,"totalPrice":106,"price":106,"shippingFee":0,"differencePrice":-106,"GoodsUrl":"https://book.kongfz.com/765962/8143826136","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbefebd/2596c704c26b9418_b.jpg","GoodsImgCount":"1","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544878227","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506382014","title":"西班牙在心中:反法西斯诗选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":154,"price":145,"shippingFee":9,"differencePrice":-154,"GoodsUrl":"https://book.kongfz.com/758397/8540606900","imgBigUrl":"https://www0.kfzimg.com/G06/M00/A7/E1/p4YBAFqevjeAUjMWAABuc9xLDZQ430_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500112396","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787517147213","title":"铜雀锁金钗 民国虐心必看榜单神作 高温消毒发货 世味煮茶 中国言实出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.4,"price":18.4,"shippingFee":2,"differencePrice":-20.4,"GoodsUrl":"https://book.kongfz.com/1113/8677185936","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbbaede/051a0d80939bf3c7_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506086943","title":"噼里啪啦牙菌来啦","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.99,"price":4.99,"shippingFee":5,"differencePrice":-9.99,"GoodsUrl":"https://book.kongfz.com/375512/8829692617","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccfafccd/0e5374b790a97b04_b.jpg","GoodsImgCount":"4","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530640333","title":"李叔同影事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.35,"price":5.85,"shippingFee":5.5,"differencePrice":-11.35,"GoodsUrl":"https://book.kongfz.com/789796/8145140253","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaaeacdf/bc6e13229b611f82_b.jpg","GoodsImgCount":"14","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539958316","title":"能量场","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32,"price":26,"shippingFee":6,"differencePrice":-32,"GoodsUrl":"https://book.kongfz.com/398434/8881638801","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbaeabc/7827a2f39328e335_b.jpg","GoodsImgCount":"1","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540477240","title":"《发货快》留学口语从头学 赖世雄, 吴纪维 湖南文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.37,"price":6.87,"shippingFee":0.5,"differencePrice":-7.37,"GoodsUrl":"https://book.kongfz.com/156492/8283749461","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4362605/b9672e2119790224_b.jpg","GoodsImgCount":"1","onSaleCount":62,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509629727","title":"破解股市陷阱系列之二:技术指标虚假信号及破解方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.38,"price":22.38,"shippingFee":0,"differencePrice":-22.38,"GoodsUrl":"https://book.kongfz.com/792228/8894405073","imgBigUrl":"https://www0.kfzimg.com/G06/M00/27/6C/p4YBAFqaeZOARcnDAACg7i988Vw421_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807243991","title":"5分钟和陌生人成为朋友","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.57,"price":3.57,"shippingFee":0,"differencePrice":-3.57,"GoodsUrl":"https://book.kongfz.com/887808/8391689793","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bccbffae/f8debbec62ce7351_b.jpg","GoodsImgCount":"7","onSaleCount":685,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542644916","title":"诗人的迟缓【全新带塑封】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":21,"shippingFee":8,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/85357/7659329715","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2747720/00bc6133660a1e42_b.jpg","GoodsImgCount":"10","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300279107","title":"自媒体营销施薇 李灿辉 肖凭中国人民大学出版社9787300279107","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.97,"price":3.97,"shippingFee":0,"differencePrice":-3.97,"GoodsUrl":"https://book.kongfz.com/366030/8472562730","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/b8aec546a3b2d85b_b.jpg","GoodsImgCount":"1","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806749012","title":"中央美术学院教学素描典藏2:油画系1978级至2000级","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":39,"shippingFee":10,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/353476/8412551966","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdfbdcaf/03d7eb67b33a5434_b.jpg","GoodsImgCount":"8","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508612690","title":"美国怎么了?:一个自由主义者的良知","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":3.8,"shippingFee":0,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/356195/8832243949","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/39296172e9a70322_b.jpg","GoodsImgCount":"5","onSaleCount":688,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530914144","title":"外国文学小百科","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/266365/1600675441","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/459/5bec61e229676ba7_b.jpg","GoodsImgCount":"5","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218123943","title":"早起的奇迹:那些能够在早晨8:00前改变人生的秘密","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.6,"price":6.6,"shippingFee":4,"differencePrice":-10.6,"GoodsUrl":"https://book.kongfz.com/1210014/8818511610","imgBigUrl":"https://www0.kfzimg.com/G06/M00/BE/35/p4YBAFsjew-AZMa4AADQy1ZsI-E761_b.jpg","GoodsImgCount":"0","onSaleCount":800,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559468185","title":"今日喜你(2)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.18,"price":27.28,"shippingFee":2.9,"differencePrice":-30.18,"GoodsUrl":"https://book.kongfz.com/566350/8416910242","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfadadcb/ab01eb1968feebe1_b.jpg","GoodsImgCount":"2","onSaleCount":4,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806769300","title":"上海电影图史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.41,"price":11.41,"shippingFee":2,"differencePrice":-13.41,"GoodsUrl":"https://book.kongfz.com/769034/8690883878","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdebedb/8a4108e8115dcd59_b.jpg","GoodsImgCount":"3","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787517503569","title":"2019年政策粮食库存大清查培训教材 经济理论、法规 政策粮食库存数量和质量大清查部际协调机制办公室编 新华正版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.96,"price":0.06,"shippingFee":7.9,"differencePrice":-7.96,"GoodsUrl":"https://book.kongfz.com/266593/8181243192","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffeffcdf/08facbab7c467c40_b.jpg","GoodsImgCount":"3","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218112039","title":"走进客家历史田野","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.67,"price":13.67,"shippingFee":2,"differencePrice":-15.67,"GoodsUrl":"https://book.kongfz.com/877749/8552934938","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/dbe28f6f66ba679c_b.jpg","GoodsImgCount":"2","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806460733","title":"千古名赋 咬文嚼字书林 吟诵卷 高建中选注 上海文化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.280000000000001,"price":7.28,"shippingFee":5,"differencePrice":-12.280000000000001,"GoodsUrl":"https://book.kongfz.com/180897/8848284913","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feefcbda/544e560d07370a8f_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221126634","title":"在血与火中穿行","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.4399999999999995,"price":1.44,"shippingFee":3,"differencePrice":-4.4399999999999995,"GoodsUrl":"https://book.kongfz.com/371891/3670304267","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafcdcea/832f209afe7f1e48_b.jpg","GoodsImgCount":"7","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501035120","title":"吴门篆刻史研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.46,"price":28.96,"shippingFee":3.5,"differencePrice":-32.46,"GoodsUrl":"https://book.kongfz.com/904671/8420602978","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dedcceac/a3f246f9df94771a_b.jpg","GoodsImgCount":"1","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522901176","title":"烹饪原料学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":9,"shippingFee":7,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/791901/8236858701","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbaafabd/d14d90ded1b4853a_b.jpg","GoodsImgCount":"14","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515304786","title":"器材大师2佳能EOS60D数码单反摄影完全攻略","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.05,"price":7.55,"shippingFee":4.5,"differencePrice":-12.05,"GoodsUrl":"https://book.kongfz.com/531994/8713723345","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfaaedc/5774b1aee3694d8d_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535557865","title":"经济学大纲李达著湖南教育出版社正版马克思主义经济学教科书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":96.60000000000001,"price":86.7,"shippingFee":9.9,"differencePrice":-96.60000000000001,"GoodsUrl":"https://book.kongfz.com/498749/7330285594","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13768817/f620e30b590271c7_b.jpg","GoodsImgCount":"5","onSaleCount":4,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100007986","title":"外国地名译名手册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":10,"shippingFee":3,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/783956/8818059184","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddadbdae/0c467f31d5f788c4_b.jpg","GoodsImgCount":"1","onSaleCount":118,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807283690","title":"饭前好汤","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.49,"price":1.51,"shippingFee":2.98,"differencePrice":-4.49,"GoodsUrl":"https://book.kongfz.com/761854/8327314613","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbeddfff/771d2b0ef4627887_b.jpg","GoodsImgCount":"2","onSaleCount":50,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501946822","title":"发展心理学:心理学导读系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/619676/8100134597","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfebddff/67fab02ba70db394_b.jpg","GoodsImgCount":"10","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020152513","title":"哈利 波特与密室1 英 J K 罗琳著 马爱农 马爱新译 人民文学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.02,"price":2.02,"shippingFee":5,"differencePrice":-7.02,"GoodsUrl":"https://book.kongfz.com/180897/8899464885","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdaeaadb/03de942e85445e90_b.jpg","GoodsImgCount":"1","onSaleCount":192,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301138731","title":"经济发展与转型 思潮 战略与自生能力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.75,"price":1.75,"shippingFee":5,"differencePrice":-6.75,"GoodsUrl":"https://book.kongfz.com/263231/8460658424","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfcfefff/4a059682c31d1bf7_b.jpg","GoodsImgCount":"1","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122145031","title":"人生没有假如 一个 渐冻人 的悟与行 王甲著 化学工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/1146983/8773150111","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddecdabb/1a7c05d00ab28762_b.jpg","GoodsImgCount":"1","onSaleCount":200,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807657590","title":"楚留香新传4:新月传奇·午夜兰花","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":11,"shippingFee":8,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/623665/8695112105","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeaacdc/c5c542d15f9601b9_b.jpg","GoodsImgCount":"9","onSaleCount":81,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553443133","title":"星火英语·专4新题型标准阅读180篇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.86,"price":0.06,"shippingFee":3.8,"differencePrice":-3.86,"GoodsUrl":"https://book.kongfz.com/237705/8785081658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffdeffbe/1fadee5fe9aa9939_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020073948","title":"思无邪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.6,"price":0.6,"shippingFee":3,"differencePrice":-3.6,"GoodsUrl":"https://book.kongfz.com/903324/8684232524","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabbfacc/a28a9fc194d8bb7e_b.jpg","GoodsImgCount":"4","onSaleCount":552,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787554709719","title":"中国线描 钟馗迎祥纳福百图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":7,"shippingFee":5,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/735086/6940082430","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfdddfbc/d60edd964b638b70_b.jpg","GoodsImgCount":"5","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111527077","title":"质量总监成长记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":24.2,"shippingFee":3.8,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/237705/8642867339","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedfaddf/ef6b31285894943a_b.jpg","GoodsImgCount":"1","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521723311","title":"地球的故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":111.96,"price":102.96,"shippingFee":9,"differencePrice":-111.96,"GoodsUrl":"https://book.kongfz.com/518589/8629261141","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3457/02f88e006ed44dea44_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502850449","title":"十年三","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.21,"price":2.21,"shippingFee":5,"differencePrice":-7.21,"GoodsUrl":"https://book.kongfz.com/714758/7591149701","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/badfefcf/bfbebc21eedd5e0e_b.jpg","GoodsImgCount":"2","onSaleCount":221,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513256698","title":"中国孩子中医养:坐月子怎么吃(全彩)用适合中国人的方式让宝妈不落病奶水足,宝宝不生病长得壮!","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/462171/8660821950","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbebeecf/2f6e7e0bf01a00d5_b.jpg","GoodsImgCount":"2","onSaleCount":89,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542621641","title":"近代私法史下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":97,"price":93,"shippingFee":4,"differencePrice":-97,"GoodsUrl":"https://book.kongfz.com/330788/8423978555","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeffbcd/a893aaab265655e0_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542837875","title":"相对论的意义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/246207/8481578074","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfabecbe/a2e86389c5114683_b.jpg","GoodsImgCount":"6","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500421900","title":"佛陀和原始佛教思想","quality":0,"qualityText":"","originalPrice":0,"totalPrice":76.92,"price":71.42,"shippingFee":5.5,"differencePrice":-76.92,"GoodsUrl":"https://book.kongfz.com/250120/8708990278","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddddeaad/33b05c5af02f72b6_b.jpg","GoodsImgCount":"3","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532158263","title":"眼睛游戏 二手书实拍图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.719999999999999,"price":7.12,"shippingFee":5.6,"differencePrice":-12.719999999999999,"GoodsUrl":"https://book.kongfz.com/899541/8749220703","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecfdeda/8b6bf25d96064288_b.jpg","GoodsImgCount":"1","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111669531","title":"SiC/GaN功率半导体封装和可靠性评估技术","quality":0,"qualityText":"","originalPrice":0,"totalPrice":45.27,"price":38.27,"shippingFee":7,"differencePrice":-45.27,"GoodsUrl":"https://book.kongfz.com/162938/8886458225","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3374/02e33f6a36d6a2b377_b.jpg","GoodsImgCount":"1","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518033645","title":"为什么你说话别人不爱听张鸿9787518033645","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":0.5,"shippingFee":2.8,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/881983/7867281773","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaebadcb/3cd42d6ced8893f8_b.jpg","GoodsImgCount":"1","onSaleCount":550,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543981515","title":"从陪伴到放手:复旦五浦汇丛书-说李白黄玉峰","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":8,"shippingFee":5,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/15335/8689567387","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcbfadf/be78bc3cc126b571_b.jpg","GoodsImgCount":"4","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505740570","title":"七根凶简渔线人偶仙人指路 尾鱼 中国友谊出版公司","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.71,"price":10.71,"shippingFee":5,"differencePrice":-15.71,"GoodsUrl":"https://book.kongfz.com/903313/8601974525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaecddef/9c5814706496e1ad_b.jpg","GoodsImgCount":"1","onSaleCount":164,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111604518","title":"数据化运营:系统方法与实践案例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.61,"price":8.61,"shippingFee":0,"differencePrice":-8.61,"GoodsUrl":"https://book.kongfz.com/768603/8897179135","imgBigUrl":"https://www0.kfzimg.com/G06/M00/0A/A8/p4YBAFuMo-KAabDXAABizTiDPo4865_b.jpg","GoodsImgCount":"1","onSaleCount":136,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544733434","title":"战争临到美国:丘吉尔第二次世界大战回忆录06","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.83,"price":8.83,"shippingFee":2,"differencePrice":-10.83,"GoodsUrl":"https://book.kongfz.com/754405/8464078588","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AD/60/p4YBAFqfHMGAE36pAAEpfYi4KYI348_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802031623","title":"冯德全早教方案:三岁缔造一生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9,"price":0.9,"shippingFee":3,"differencePrice":-3.9,"GoodsUrl":"https://book.kongfz.com/832065/8677106895","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E4/42/p4YBAFqY74iAIP61AADPFXvXBAk285_b.jpg","GoodsImgCount":"1","onSaleCount":287,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787112243693","title":"自然与道德(古代永州地区城市规划设计研究)/人居环境科学丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":51.37,"price":49.37,"shippingFee":2,"differencePrice":-51.37,"GoodsUrl":"https://book.kongfz.com/476106/8289767243","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdfbdcfc/d5c28fc209e2480f_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504662774","title":"老科学家学术成长资料采集工程丛书国科学院院士传记丛书大音希声应崇福传 王传超著 国科学技术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.1,"price":6.1,"shippingFee":5,"differencePrice":-11.1,"GoodsUrl":"https://book.kongfz.com/911923/8642786730","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eedbfedb/0ee80689f3f1f141_b.jpg","GoodsImgCount":"1","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532763399","title":"第二性","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":39,"shippingFee":9,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/24286/8655519438","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdbbcff/11326043b66b78d8_b.jpg","GoodsImgCount":"8","onSaleCount":208,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221181442","title":"西游密档 死亡诅咒","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.190000000000001,"price":6.19,"shippingFee":3,"differencePrice":-9.190000000000001,"GoodsUrl":"https://book.kongfz.com/774181/8822974772","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/16365868/be960223de05f0da_b.jpg","GoodsImgCount":"1","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108056283","title":"窥视日本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.4,"price":14.4,"shippingFee":5,"differencePrice":-19.4,"GoodsUrl":"https://book.kongfz.com/640398/8325622171","imgBigUrl":"https://www0.kfzimg.com/G06/M00/61/9C/p4YBAFqctU6AC_foAAC3m52T-Pg635_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522510606","title":"别再说我恋爱脑 亲密关系 金钱与自我 孙能能 九州出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":2.9,"shippingFee":5,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/878060/8575274097","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeedfbcd/cf34c35618e4846a_b.jpg","GoodsImgCount":"1","onSaleCount":185,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010136479","title":"日本如何面对历史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.9,"price":4.9,"shippingFee":5,"differencePrice":-9.9,"GoodsUrl":"https://book.kongfz.com/398369/8886414153","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeabacd/414f2354130e7c2b_b.jpg","GoodsImgCount":"1","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537863407","title":"沈从文全集·补遗卷(历经十七年搜集、整理的遗落于《沈从文全集》之外的篇目)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":151.8,"price":151.8,"shippingFee":0,"differencePrice":-151.8,"GoodsUrl":"https://book.kongfz.com/506993/8197585884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddbdadc/863af2d42f64a712_b.jpg","GoodsImgCount":"4","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564365103","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512501010","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534069109","title":"画猫.雅宋:宋朝风情绘卷 16开 原价68元 ,画集以猫拟人,用千姿百态的猫咪演绎宋朝的绝代佳人、名士才子、休闲娱乐、生活习俗以及饮食文化等内容,收录五十张插画,分为【宋朝红颜谱】【宋朝才俊传】【宋朝闲乐篇】【宋朝百家事】【宋朝食事说】五大部分,展现出独特的宋朝风貌。","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":16,"shippingFee":0,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/22178/8842692481","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabfaccc/296ab20dabec1d3d_b.jpg","GoodsImgCount":"8","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787555102571","title":"你了解动物朋友吗/思考的魅力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.88,"price":0.08,"shippingFee":3.8,"differencePrice":-3.88,"GoodsUrl":"https://book.kongfz.com/237705/8818015350","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddbeada/454883a43146e865_b.jpg","GoodsImgCount":"1","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801273963","title":"心灵导师 情绪管理全书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.6,"price":0.6,"shippingFee":3,"differencePrice":-3.6,"GoodsUrl":"https://book.kongfz.com/791250/8376938616","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daafbaca/99cdf254dc0503cf_b.jpg","GoodsImgCount":"1","onSaleCount":328,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550285811","title":"很老很老的老偏方 :","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.06,"price":4.05,"shippingFee":0.01,"differencePrice":-4.06,"GoodsUrl":"https://book.kongfz.com/778027/8309893135","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eafeceea/577f1db4f57123fd_b.jpg","GoodsImgCount":"5","onSaleCount":622,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504468079","title":"煤矿 科学环境风水学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.8,"price":7.8,"shippingFee":5,"differencePrice":-12.8,"GoodsUrl":"https://book.kongfz.com/903313/8491513788","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23176617/284894c1eaa3b820_b.jpg","GoodsImgCount":"2","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787102080901","title":"中华砚文化汇典:砚谱卷:归云楼砚谱新编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":118.48,"price":114.08,"shippingFee":4.4,"differencePrice":-118.48,"GoodsUrl":"https://book.kongfz.com/27495/8065738536","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14256494/e9d0ec6a139e5a6d_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122387813","title":"变频器故障检修260例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":46.2,"price":40.2,"shippingFee":6,"differencePrice":-46.2,"GoodsUrl":"https://book.kongfz.com/1118298/8825504310","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/7445133/6b80c75aef1c1c8d_b.jpg","GoodsImgCount":"1","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530415702","title":"小学生作文大全 创新作文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.1,"price":0.1,"shippingFee":3,"differencePrice":-3.1,"GoodsUrl":"https://book.kongfz.com/371891/5644920378","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acedfbbf/2d736b34bda93f2c_b.jpg","GoodsImgCount":"3","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509141892","title":"30年临证实验录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55.92,"price":45.92,"shippingFee":10,"differencePrice":-55.92,"GoodsUrl":"https://book.kongfz.com/833207/7490953622","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22165297/2cd24e3e0d92cfc5_b.jpg","GoodsImgCount":"2","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201161693","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108009234","title":"大剖面:不可思议的剖面","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53,"price":45,"shippingFee":8,"differencePrice":-53,"GoodsUrl":"https://book.kongfz.com/310577/5906903518","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dedcfdcb/ee738917471fe03f_b.jpg","GoodsImgCount":"6","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515406466","title":"回忆萧华:纪念开国上将萧华诞辰100周年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":69,"price":60,"shippingFee":9,"differencePrice":-69,"GoodsUrl":"https://book.kongfz.com/634974/8146082829","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addeffcf/50b393dd54382db6_b.jpg","GoodsImgCount":"6","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505907294","title":"人类性爱史话","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.5,"price":1.5,"shippingFee":5,"differencePrice":-6.5,"GoodsUrl":"https://book.kongfz.com/890432/8719655764","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fddffafa/1b2b73ba2dc29f83_b.jpg","GoodsImgCount":"1","onSaleCount":177,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806155073","title":"金点子赚大钱赚钱点子 金 字系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/1207201/8801350603","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddccedcf/bc869c63b26b2662_b.jpg","GoodsImgCount":"1","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303119752","title":"20世纪西方文论新编 陈太胜 9787303119752 北京师范大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.53,"price":1.53,"shippingFee":3,"differencePrice":-4.53,"GoodsUrl":"https://book.kongfz.com/240018/8665248260","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C8/18/p4YBAFqotxaAffdjAADUpAcClLs234_b.jpg","GoodsImgCount":"1","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541126895","title":"三国演义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.29,"price":3.79,"shippingFee":2.5,"differencePrice":-6.29,"GoodsUrl":"https://book.kongfz.com/782278/8848213757","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afffccde/20b47fe8625e47a6_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500436867","title":"二手正版在下沉、下沉的世界里上升、上升9787500436867","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/765962/6746217821","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaeeefbd/ccebe6c255823c7a_b.jpg","GoodsImgCount":"1","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553313368","title":"不会说话,你就输了","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.9,"price":0.9,"shippingFee":2,"differencePrice":-2.9,"GoodsUrl":"https://book.kongfz.com/738826/8619357112","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adcaaddb/f1b58548dcfe64be_b.jpg","GoodsImgCount":"1","onSaleCount":1327,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787576007565","title":"从课本到奥数 7年级 第2学期 A版 第3版·视频讲解版 吴建平熊斌主编 华东师范大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.25,"price":14.75,"shippingFee":3.5,"differencePrice":-18.25,"GoodsUrl":"https://book.kongfz.com/610883/8510316729","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecfaafff/60aabde21e985ecd_b.jpg","GoodsImgCount":"5","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787557548193","title":"我叫丁 隐形的朋友 杨校艳 吉林美术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":4.8,"shippingFee":5,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/263231/8583717995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/befeffda/7748c91965d89732_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559620668","title":"你要如何衡量你的人生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.36,"price":9.36,"shippingFee":5,"differencePrice":-14.36,"GoodsUrl":"https://book.kongfz.com/750161/8749953015","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddafebab/9ee757288f1baef8_b.jpg","GoodsImgCount":"1","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532552726","title":"周易虞氏易象释易则","quality":0,"qualityText":"","originalPrice":0,"totalPrice":108,"price":90,"shippingFee":18,"differencePrice":-108,"GoodsUrl":"https://book.kongfz.com/476973/4795679344","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edafaabb/a4e9fc477f428e7d_b.jpg","GoodsImgCount":"5","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530220771","title":"绘本 三国志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37,"price":31,"shippingFee":6,"differencePrice":-37,"GoodsUrl":"https://book.kongfz.com/283241/8877731096","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbadebae/8da18a79e50e7791_b.jpg","GoodsImgCount":"9","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115449238","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535218292","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541151408","title":"昆仑.大结局","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":8,"shippingFee":7,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/624391/5408060815","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbfadbb/07c3be2711e5771a_b.jpg","GoodsImgCount":"12","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537728317","title":"梁秀清临床经验选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":108,"price":98,"shippingFee":10,"differencePrice":-108,"GoodsUrl":"https://book.kongfz.com/12117/8755654368","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eafaffdb/a731ef1a1cca7b58_b.jpg","GoodsImgCount":"2","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511536600","title":"人民日报记者说:典型人物采访与写作","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":7.2,"shippingFee":0,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/27736/8222096683","imgBigUrl":"https://www0.kfzimg.com/G06/M00/5F/DB/p4YBAFqlT3GAMPjmAACYZ6OExoQ676_b.jpg","GoodsImgCount":"1","onSaleCount":247,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801702715","title":"王树声传 王树声传 编写组编 当代中国出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33,"price":28,"shippingFee":5,"differencePrice":-33,"GoodsUrl":"https://book.kongfz.com/911923/8772814849","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeedcfa/bdd7e96d5ebd45fe_b.jpg","GoodsImgCount":"1","onSaleCount":90,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787219045039","title":"中国吴氏通书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":238,"price":228,"shippingFee":10,"differencePrice":-238,"GoodsUrl":"https://book.kongfz.com/388938/5635734530","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedacdfd/776fd9e3856a5399_b.jpg","GoodsImgCount":"4","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564061128","title":"聪明的女人不生气","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.48,"price":0.48,"shippingFee":3,"differencePrice":-3.48,"GoodsUrl":"https://book.kongfz.com/566350/8631713045","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcccbcda/e73ef67510e788b8_b.jpg","GoodsImgCount":"9","onSaleCount":175,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539272757","title":"货币哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.35,"price":32.35,"shippingFee":5,"differencePrice":-37.35,"GoodsUrl":"https://book.kongfz.com/403679/8309828791","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F8/D9/p4YBAFqZU3CAcNrGAACsHGgv654706_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532775903","title":"竞艳(永井荷风小说精选)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":18,"shippingFee":0,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/274136/6161792990","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdcbddc/2a54d839359d76b4_b.jpg","GoodsImgCount":"11","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117308953","title":"人卫版 考试达人 2021全国护师资格考试 随身记 2021新版 职称考试","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.57,"price":0.57,"shippingFee":4,"differencePrice":-4.57,"GoodsUrl":"https://book.kongfz.com/692632/8421322348","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcdfbba/af38ab15b897f2a2_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545206647","title":"狩魔手记 No. 3:在光与暗之间","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":6,"shippingFee":8,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/80269/8337622370","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3306/02d1a0dc6ad04aec0f_b.jpg","GoodsImgCount":"6","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513245272","title":"中草药的美丽传说 读故事知中医丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.31,"price":8.81,"shippingFee":4.5,"differencePrice":-13.31,"GoodsUrl":"https://book.kongfz.com/263924/8359098604","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accbccaa/71741a85ae819b1a_b.jpg","GoodsImgCount":"1","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787209091251","title":"明代朝鲜使臣胶东纪行诗探析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/27544/2973684514","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3630/0322c3fee2285943c6_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787204010592","title":"八仙醉行剑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":64.7,"price":54.7,"shippingFee":10,"differencePrice":-64.7,"GoodsUrl":"https://book.kongfz.com/832982/7421669386","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22231533/acc445679116fa70_b.jpg","GoodsImgCount":"2","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111611455","title":"体验式零售樊文花3000家连锁店的奥秘 刘琼雄著 机械工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":0.4,"shippingFee":5,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/910533/8534925404","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedfbefa/e9108bf55a3c5726_b.jpg","GoodsImgCount":"1","onSaleCount":165,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567529731","title":"美学是未来的教育学德育世界的探寻 檀传宝著 上海 华东师范大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":62,"price":57,"shippingFee":5,"differencePrice":-62,"GoodsUrl":"https://book.kongfz.com/910533/8594193674","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdfeffa/d771f7f1133412b9_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559840653","title":"法哲学沉思录(增订注释版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42.88,"price":32.88,"shippingFee":10,"differencePrice":-42.88,"GoodsUrl":"https://book.kongfz.com/795574/8482826703","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2498932/25a228594e7c8698_b.jpg","GoodsImgCount":"1","onSaleCount":86,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501209880","title":"信主独一 伊斯兰教","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.740000000000002,"price":14.74,"shippingFee":5,"differencePrice":-19.740000000000002,"GoodsUrl":"https://book.kongfz.com/802508/8561749878","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feedacfa/144d6e447f607a6f_b.jpg","GoodsImgCount":"1","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020064304","title":"刘白羽散文:插图珍藏版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/16713/7428025070","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1825943/089638a0dcdcc20c_b.jpg","GoodsImgCount":"3","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536030497","title":"非神化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.97,"price":13.97,"shippingFee":4,"differencePrice":-17.97,"GoodsUrl":"https://book.kongfz.com/797722/8362753281","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cadeaadd/b275ab6824ca0dc7_b.jpg","GoodsImgCount":"4","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562488002","title":"工程造价确定与控制 第7版吴学伟 谭德精 郑文建 主编重庆大学出版社9787562488002","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.7,"price":3.7,"shippingFee":0,"differencePrice":-3.7,"GoodsUrl":"https://book.kongfz.com/366030/8613584644","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/7028af8b53465ac6_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540783884","title":"溺水者","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.5,"price":8,"shippingFee":2.5,"differencePrice":-10.5,"GoodsUrl":"https://book.kongfz.com/361618/7588004292","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfcbcdb/d4f4881569709583_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040458749","title":"2017年 全国硕士研究生招生考试法律硕士","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":1,"shippingFee":3,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/684559/8441884801","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bacbeaac/97523a1d94c76d53_b.jpg","GoodsImgCount":"2","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214049544","title":"中华帝国的法律","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":16,"shippingFee":6,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/61222/8696597261","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceccaadf/3fa7aa8a06b334c7_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562440673","title":"会展项目策划与组织9787562440673","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":5.4,"shippingFee":0,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/797928/7133987476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21491677/092f9249b4885775_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807348566","title":"水利水电工程专业案例应试辅导与习题集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36.97,"price":33.17,"shippingFee":3.8,"differencePrice":-36.97,"GoodsUrl":"https://book.kongfz.com/717628/8773851320","imgBigUrl":"https://www0.kfzimg.com/G06/M00/91/5F/p4YBAFrJoHGALyMyAABxymwcVA4723_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560017181","title":"汉英口译入门","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.98,"price":5.48,"shippingFee":2.5,"differencePrice":-7.98,"GoodsUrl":"https://book.kongfz.com/749193/8497283264","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbbfadec/40d5813e2d448723_b.jpg","GoodsImgCount":"2","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508690469","title":"切尔诺贝利的祭祷 斯韦特兰娜 亚历山德罗夫娜 阿列克谢耶维著 孙 中信出版集团 中信出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.6,"price":5.6,"shippingFee":5,"differencePrice":-10.6,"GoodsUrl":"https://book.kongfz.com/398369/8732751738","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecaebbb/61df20b5adc43022_b.jpg","GoodsImgCount":"1","onSaleCount":343,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538465365","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122177568","title":"3天完成超人气简单钩针编织披肩 围巾 毛衣","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.73,"price":22.73,"shippingFee":5,"differencePrice":-27.73,"GoodsUrl":"https://book.kongfz.com/798596/8841462997","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecedfec/0acd92a7b4e82865_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802515062","title":"30天精通哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.65,"price":3.65,"shippingFee":4,"differencePrice":-7.65,"GoodsUrl":"https://book.kongfz.com/841736/7819318114","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbadeae/97389454709a0395_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531339038","title":"小阿卡那王国的十二天 塔罗牌的冒险游戏 3 李榕 春风文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41,"price":36,"shippingFee":5,"differencePrice":-41,"GoodsUrl":"https://book.kongfz.com/398369/8525948579","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdbdaaef/502feffcdc5a83f2_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802545137","title":"宗教团体教规制度汇编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.3,"price":3.5,"shippingFee":3.8,"differencePrice":-7.3,"GoodsUrl":"https://book.kongfz.com/570268/4507336198","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aebfbafd/f0e5c62ff57592db_b.jpg","GoodsImgCount":"3","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559830425","title":"致一百年以后的你:茨维塔耶娃诗选(布罗茨基和帕斯捷尔纳克推崇备至,虚伪年代里她发出了天上真理的声音)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.6,"price":37.6,"shippingFee":0,"differencePrice":-37.6,"GoodsUrl":"https://book.kongfz.com/464998/5836803688","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadefded/38fcb773d15f75f9_b.jpg","GoodsImgCount":"3","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513276764","title":"正版中医经典能力等级考试学习备要 一二级 大学教材 对一二级全部条文中的关键知识点进行规范解读 经典条文全解中国中医药出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":72,"price":64,"shippingFee":8,"differencePrice":-72,"GoodsUrl":"https://book.kongfz.com/667710/8264576689","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/17848986/06d71c99a14262d1_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020070985","title":"名著名译插图本:格林童话全集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.92,"price":4.92,"shippingFee":5,"differencePrice":-9.92,"GoodsUrl":"https://book.kongfz.com/481057/8714237544","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdeddecc/130f2902b9a8a4c3_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569901856","title":"论重要之事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":22,"shippingFee":8,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/665570/8689983587","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daaddebc/4d6909ac7a702e44_b.jpg","GoodsImgCount":"4","onSaleCount":56,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533073640","title":"中国石刻书法精粹冈山入楞伽经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":47.8,"price":42,"shippingFee":5.8,"differencePrice":-47.8,"GoodsUrl":"https://book.kongfz.com/1120159/8821041704","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdeccece/327c94577b5df77b_b.jpg","GoodsImgCount":"3","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562418863","title":"电脑中文五笔字型编码字典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6,"price":6,"shippingFee":0,"differencePrice":-6,"GoodsUrl":"https://book.kongfz.com/731554/6197072537","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdadbcae/8248e5748581be30_b.jpg","GoodsImgCount":"4","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530483565","title":"法式烘焙圣经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":18,"shippingFee":4,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/716704/8005098362","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E0/B8/p4YBAFqY5ImAP-xTAAD-aKAGaq0152_b.jpg","GoodsImgCount":"0","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111485681","title":"放空一下,大脑更有活力:发呆或深度睡眠的时间,正是大脑整理信息、巩固记忆的宝贵时刻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.58,"price":39.98,"shippingFee":1.6,"differencePrice":-41.58,"GoodsUrl":"https://book.kongfz.com/457799/8898556222","imgBigUrl":"https://www0.kfzimg.com/G06/M00/61/B6/p4YBAFqctaaAZShRAAB7qAPX2I4591_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511702463","title":"一个冬夜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.99,"price":1.01,"shippingFee":2.98,"differencePrice":-3.99,"GoodsUrl":"https://book.kongfz.com/761854/8282360559","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbefaaaa/bdd6bbbf29672624_b.jpg","GoodsImgCount":"2","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801305312","title":"图解住宅禁忌","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":4,"shippingFee":10,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/289461/8750166897","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbfeada/ff4d3e78ae4f33e4_b.jpg","GoodsImgCount":"4","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559052407","title":"儿童权利宣言","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/302893/3001668407","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/390/4cdb424a175a6bc1_b.jpg","GoodsImgCount":"1","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539967486","title":"波吉亚家族","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42,"price":34,"shippingFee":8,"differencePrice":-42,"GoodsUrl":"https://book.kongfz.com/316589/8786458274","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecefce/858ca722b85e3531_b.jpg","GoodsImgCount":"11","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115227409","title":"FPGA应用开发入门与典型实例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.9,"price":24.9,"shippingFee":0,"differencePrice":-24.9,"GoodsUrl":"https://book.kongfz.com/792228/8893341825","imgBigUrl":"https://www0.kfzimg.com/G06/M00/66/FF/p4YBAFql1cSAbYjSAABg-cl_KK8164_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559461674","title":"毛姆短篇小说全集江苏凤凰文艺出版社册第三册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.9,"price":13.9,"shippingFee":2,"differencePrice":-15.9,"GoodsUrl":"https://book.kongfz.com/769034/8877458642","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecaaea/595a1d153417c057_b.jpg","GoodsImgCount":"4","onSaleCount":147,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787563801084","title":"如何正确购买股票","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.39,"price":0.39,"shippingFee":6,"differencePrice":-6.39,"GoodsUrl":"https://book.kongfz.com/732025/7658617884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aafdfdfa/3a4f774764fbc683_b.jpg","GoodsImgCount":"14","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500303176","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560036908","title":"蓝宝伴侣:GRE词汇逆序突破肖静波 杨媚","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":10,"shippingFee":0,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/576646/8181293652","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeeefbdd/fc709d318be41ab9_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506313803","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544717991","title":"译林名著精选:童年《图片实拍》","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.49,"price":1.49,"shippingFee":2,"differencePrice":-3.49,"GoodsUrl":"https://book.kongfz.com/892872/8841398697","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eacfdfcc/665f0977eb140373_b.jpg","GoodsImgCount":"5","onSaleCount":344,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787811002201","title":"羽毛球教学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":75.72,"price":63.72,"shippingFee":12,"differencePrice":-75.72,"GoodsUrl":"https://book.kongfz.com/876767/7810979890","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22552668/642a62ea85b3b7ad_b.jpg","GoodsImgCount":"2","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533290221","title":"阳光姐姐小书房-补习班的毕业狗","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.59,"price":0.59,"shippingFee":3,"differencePrice":-3.59,"GoodsUrl":"https://book.kongfz.com/891713/7982111525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdcebace/2f1de291a31baeb2_b.jpg","GoodsImgCount":"4","onSaleCount":212,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553332925","title":"看晚风吹动香椿树","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":7,"shippingFee":7,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/906778/8175138950","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/17787432/b4ed61571e964018_b.jpg","GoodsImgCount":"4","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535715807","title":"时间之箭:揭开时间最大奥秘之科旅程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":3.8,"shippingFee":0,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/437976/8789758974","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdbbedba/b68db3d7454fdc01_b.jpg","GoodsImgCount":"4","onSaleCount":639,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518426096","title":"非瘦不可","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/191396/8547026612","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbadccb/53f868482c984b7e_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229011338","title":"夫妻按摩保健图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":10,"shippingFee":5,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/3092/8222548065","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dffedfea/afe59603b8ebe5ee_b.jpg","GoodsImgCount":"6","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113276508","title":"股市稳定盈利——寻找最小阻力位9787113276508毕文锋中国铁道出","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36.8,"price":34.3,"shippingFee":2.5,"differencePrice":-36.8,"GoodsUrl":"https://book.kongfz.com/1092759/8885035777","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebacebce/399a4692deda6697_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521719208","title":"通往衰败之路经济学如何掌控我们的生活","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/825106/7894333431","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcffaffb/546c29ed56f49d38_b.jpg","GoodsImgCount":"6","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122339980","title":"抗癌秘验方(第3版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.38,"price":8.38,"shippingFee":3,"differencePrice":-11.38,"GoodsUrl":"https://book.kongfz.com/902124/8346316359","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdbacbe/405f74ef1d91f332_b.jpg","GoodsImgCount":"8","onSaleCount":146,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300112275","title":"普通公司法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":160,"price":150,"shippingFee":10,"differencePrice":-160,"GoodsUrl":"https://book.kongfz.com/593645/8588413426","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deacbcff/f813861f1b55e16a_b.jpg","GoodsImgCount":"30","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787551101455","title":"幼儿衔接训练营数学 10以内数的加减法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.36,"price":0.36,"shippingFee":5,"differencePrice":-5.36,"GoodsUrl":"https://book.kongfz.com/805022/8818083745","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/effcbfda/26f92cfd9c8dd9a7_b.jpg","GoodsImgCount":"1","onSaleCount":150,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501965281","title":"透视课堂","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38.879999999999995,"price":28.88,"shippingFee":10,"differencePrice":-38.879999999999995,"GoodsUrl":"https://book.kongfz.com/795093/8817748428","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edbddced/3cc78a67adce3057_b.jpg","GoodsImgCount":"14","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522615448","title":"系统架构设计师考试32小时通关","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.18,"price":16.18,"shippingFee":5,"differencePrice":-21.18,"GoodsUrl":"https://book.kongfz.com/893135/8183887786","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdedeed/82c6861b1cb9f559_b.jpg","GoodsImgCount":"1","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535446732","title":"跟谁较劲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.24,"price":2.74,"shippingFee":1.5,"differencePrice":-4.24,"GoodsUrl":"https://book.kongfz.com/774690/8186965131","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D8/C3/p4YBAFqYxLeAD1cDAAC30cOaVPw558_b.jpg","GoodsImgCount":"1","onSaleCount":338,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224085945","title":"白纪年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":14,"shippingFee":8,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/608824/8429279676","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfbdebf/bee101b98e926b96_b.jpg","GoodsImgCount":"10","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521754247","title":"价值投费3.0","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/813529/7760121091","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9937843/6f65ca503c24bca1_b.jpg","GoodsImgCount":"1","onSaleCount":137,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115602602","title":"AI医学图像处理杨慧芳人民邮电出版社9787115602602","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.76,"price":29.76,"shippingFee":0,"differencePrice":-29.76,"GoodsUrl":"https://book.kongfz.com/248516/8801231646","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/000b6943df4e0b96_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534785375","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801716088","title":"中国现代小说经典文库:刘云若","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.01,"price":0.01,"shippingFee":3,"differencePrice":-3.01,"GoodsUrl":"https://book.kongfz.com/581989/6091380883","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddeadba/bad6dfa20af585fa_b.jpg","GoodsImgCount":"5","onSaleCount":727,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111673835","title":"汽车底盘振动与噪声控制","quality":0,"qualityText":"","originalPrice":0,"totalPrice":108,"price":96,"shippingFee":12,"differencePrice":-108,"GoodsUrl":"https://book.kongfz.com/594145/6738070561","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beffefff/1b999c09e1bbfc57_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020037155","title":"欧·亨利短篇小说选。","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.89,"price":0.09,"shippingFee":4.8,"differencePrice":-4.89,"GoodsUrl":"https://book.kongfz.com/780405/7571655710","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeebeccd/81c7e5db13f25a44_b.jpg","GoodsImgCount":"4","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561554272","title":"闽南话教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":6,"shippingFee":5,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/365590/6700057055","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbeedbc/ee350c61e535d96a_b.jpg","GoodsImgCount":"4","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559725943","title":"汤汤奇幻童年故事本 注音版:美人树","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.64,"price":10.14,"shippingFee":6.5,"differencePrice":-16.64,"GoodsUrl":"https://book.kongfz.com/758962/8723946119","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afadbfae/be23dd9f6ed74436_b.jpg","GoodsImgCount":"5","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509116418","title":"拔罐疗法治百病(第3版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":6,"shippingFee":8,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/667587/5549578255","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daccdbde/eec7103f90685857_b.jpg","GoodsImgCount":"5","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801797674","title":"周易正义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.9,"price":8.9,"shippingFee":5,"differencePrice":-13.9,"GoodsUrl":"https://book.kongfz.com/261116/8497958314","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcfebef/ed2a4baa1dece5f9_b.jpg","GoodsImgCount":"1","onSaleCount":158,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787555021933","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500423379","title":"米诺托之恋 32开","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":2,"shippingFee":8,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/2731/8305886847","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbecedaf/fd432f72526a0677_b.jpg","GoodsImgCount":"3","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506546294","title":"兵书与商战:《孙子兵法》在企业经营管理中的应用","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.11,"price":11.11,"shippingFee":3,"differencePrice":-14.11,"GoodsUrl":"https://book.kongfz.com/11070/5792723770","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfcafefb/4267f82702444e97_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802568228","title":"正版 {塑封}凤舞未央:吕雉传.壹[社版] 大爱无痕 9787802568228","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.439999999999998,"price":11.94,"shippingFee":4.5,"differencePrice":-16.439999999999998,"GoodsUrl":"https://book.kongfz.com/8094/8801323849","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceeeeafe/219b26a6d6d8fcd7_b.jpg","GoodsImgCount":"10","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521424812","title":"《药性歌括四百味》详解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/260959/8653606389","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efddfbea/26a0c67edea8a345_b.jpg","GoodsImgCount":"3","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200026429","title":"佛学精华 下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53.9,"price":45,"shippingFee":8.9,"differencePrice":-53.9,"GoodsUrl":"https://book.kongfz.com/303525/7008507926","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddbacda/577a88c16787e620_b.jpg","GoodsImgCount":"15","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559665218","title":"深话浅说,把话说到点子上的超级沟通术!","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.3,"price":15.5,"shippingFee":2.8,"differencePrice":-18.3,"GoodsUrl":"https://book.kongfz.com/41819/8874019077","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1578691/618e7aa77d18b321_b.jpg","GoodsImgCount":"4","onSaleCount":120,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787551144636","title":"这不是一本科学书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.78,"price":1.78,"shippingFee":5,"differencePrice":-6.78,"GoodsUrl":"https://book.kongfz.com/202798/8898900360","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbabbbe/11e45c6436a68d08_b.jpg","GoodsImgCount":"1","onSaleCount":97,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201131634","title":"精简 日式精要主义生活法则","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":3.1,"shippingFee":5,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/1207201/8801526319","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfcdbfe/9c2b3e7d1e41114a_b.jpg","GoodsImgCount":"1","onSaleCount":94,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201198910","title":"【未翻阅】吕著中国通史:中国政治史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":6,"shippingFee":4,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/578827/8429230684","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecbfcf/e01cd053daf6e07a_b.jpg","GoodsImgCount":"2","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539617473","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108032577","title":"仙骨佛心:家具、紫砂与明清文人","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.4,"price":4.4,"shippingFee":10,"differencePrice":-14.4,"GoodsUrl":"https://book.kongfz.com/683738/7098697332","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeceefcb/027ba9058aa5f099_b.jpg","GoodsImgCount":"4","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530948460","title":"西风独自凉","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.99,"price":0.99,"shippingFee":3,"differencePrice":-3.99,"GoodsUrl":"https://book.kongfz.com/903324/8732698209","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdecacaa/5829bc5de36da17a_b.jpg","GoodsImgCount":"5","onSaleCount":256,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308133326","title":"一本书读懂财报 肖星著 浙江大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.73,"price":7.73,"shippingFee":5,"differencePrice":-12.73,"GoodsUrl":"https://book.kongfz.com/180897/8899723904","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faebfade/22273c2907c42499_b.jpg","GoodsImgCount":"1","onSaleCount":193,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565422034","title":"传媒经济","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":22,"shippingFee":7,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/793471/8403961276","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedabeae/107e1049b5db2e80_b.jpg","GoodsImgCount":"4","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509664728","title":"大学二级学院院长的角色认知与管理之道","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40.21,"price":36.21,"shippingFee":4,"differencePrice":-40.21,"GoodsUrl":"https://book.kongfz.com/502990/8262079169","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aacadfdd/74291c5b7c3535d5_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518059195","title":"提高抗挫力培养内心强大的孩子","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":2,"shippingFee":8,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/642191/8020261360","imgBigUrl":"https://www0.kfzimg.com/G07/M00/F3/41/qoYBAFx_IDKAZ76lAAI2qNaQMek283_b.jpg","GoodsImgCount":"1","onSaleCount":56,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305198632","title":"陶艺设计 陈卢鹏 南京大学出版社 9787305198632","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.98,"price":3.98,"shippingFee":0,"differencePrice":-3.98,"GoodsUrl":"https://book.kongfz.com/2845/8726272938","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcacebde/e3d61e23ccebbfc2_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564800994","title":"学校艺术教育60年(1949-2009)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":23,"shippingFee":0,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/544739/4134318917","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbebddbc/11ba1c8ac23ca92d_b.jpg","GoodsImgCount":"9","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561457207","title":"隐形的尾巴系列:梦中的巨叶 彩图版中英对照","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":25,"shippingFee":0,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/545819/8248024889","imgBigUrl":"https://www0.kfzimg.com/G06/M00/CF/70/p4YBAFqo5jaAXl6NAABP0PiNKsA890_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520202091","title":"儿童职业启蒙百科长大后我要做什么 陈昕编著 中国大百科全书出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.82,"price":9.82,"shippingFee":5,"differencePrice":-14.82,"GoodsUrl":"https://book.kongfz.com/398369/8780865875","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deaebdef/cf5e69203d43afc8_b.jpg","GoodsImgCount":"1","onSaleCount":188,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534951978","title":"烘焙新手必备的第一本书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5600000000000005,"price":0.56,"shippingFee":4,"differencePrice":-4.5600000000000005,"GoodsUrl":"https://book.kongfz.com/660948/8726976124","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebcbcfbd/d44f0b660d82a285_b.jpg","GoodsImgCount":"2","onSaleCount":304,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500410898","title":"社科学术文库:中国革命法制史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.07,"price":13.07,"shippingFee":6,"differencePrice":-19.07,"GoodsUrl":"https://book.kongfz.com/792848/8126466099","imgBigUrl":"https://www0.kfzimg.com/G06/M00/87/CE/p4YBAFrJd_eAVtUOAACH4Dc3UTs299_b.jpg","GoodsImgCount":"1","onSaleCount":74,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214222213","title":"西顿动物故事集/统编语文教材必读名著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.43,"price":2.43,"shippingFee":3,"differencePrice":-5.43,"GoodsUrl":"https://book.kongfz.com/774181/8781126790","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabdeeeb/4c70980aa56a6179_b.jpg","GoodsImgCount":"4","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108028167","title":"西班牙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.1,"price":7.1,"shippingFee":5,"differencePrice":-12.1,"GoodsUrl":"https://book.kongfz.com/802508/8630726160","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dafcfebf/38916c84832bb9e5_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516764589","title":"整理收纳师培训实用教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42.68,"price":34.68,"shippingFee":8,"differencePrice":-42.68,"GoodsUrl":"https://book.kongfz.com/158878/8133003913","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4893319/0fc6cd33a6998f78_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535460783","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515509433","title":"实体店这样做绝不输电商:实体店+互联网,这样运营更有效","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.21,"price":4.2,"shippingFee":0.01,"differencePrice":-4.21,"GoodsUrl":"https://book.kongfz.com/171447/8557690684","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efafdcda/e5451ef584b5dac0_b.jpg","GoodsImgCount":"1","onSaleCount":200,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508644660","title":"数据之巅:大数据革命,历史、现实与未来","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":0.8,"shippingFee":3,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/880498/8863679996","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F0/78/p4YBAFqZNLWAH1kmAAGLQlVha0I822_b.jpg","GoodsImgCount":"1","onSaleCount":1923,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108035455","title":"游观美国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":4.2,"shippingFee":3,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/566350/8848525346","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcfdeeae/d8e0990506ae25ee_b.jpg","GoodsImgCount":"5","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515517018","title":"达·芬奇笔记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.9,"price":25,"shippingFee":3.9,"differencePrice":-28.9,"GoodsUrl":"https://book.kongfz.com/293289/8863618280","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdaabce/99e10484c9bb4d68_b.jpg","GoodsImgCount":"1","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538290554","title":"高中必备古诗文 第4次修订","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.54,"price":0.54,"shippingFee":3,"differencePrice":-3.54,"GoodsUrl":"https://book.kongfz.com/371891/8511078129","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbadebaa/e65202c29d831318_b.jpg","GoodsImgCount":"3","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208141384","title":"告别霸权 全球体系中的权力与影响力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.73,"price":10.73,"shippingFee":5,"differencePrice":-15.73,"GoodsUrl":"https://book.kongfz.com/907853/8590170185","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adbbedeb/74860687d74261cc_b.jpg","GoodsImgCount":"1","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030520784","title":"内页干净 数字电子技术基础 第二版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/186710/8891553985","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceacecbf/5dc142c596b99bb7_b.jpg","GoodsImgCount":"5","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550017719","title":"答案之书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.32,"price":1.32,"shippingFee":3,"differencePrice":-4.32,"GoodsUrl":"https://book.kongfz.com/566350/8837190195","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aadedfee/a9c15bdf17802e77_b.jpg","GoodsImgCount":"5","onSaleCount":586,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544282437","title":"点与线【正版书籍,实拍图发货,16点前订单当天发出-1112】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":2,"shippingFee":10,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/1208551/8761113973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceefdffa/fee05513763e9ffb_b.jpg","GoodsImgCount":"4","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550106383","title":"卖故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.38,"price":4.37,"shippingFee":0.01,"differencePrice":-4.38,"GoodsUrl":"https://book.kongfz.com/877749/8772134551","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/56f2b8bf0930afe3_b.jpg","GoodsImgCount":"3","onSaleCount":242,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508652801","title":"救命饮食Ⅱ:反思营养学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":13,"shippingFee":6,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/302512/8854227529","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daefedee/aa1240d7fc51d6dc_b.jpg","GoodsImgCount":"9","onSaleCount":105,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530838846","title":"长效针灸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":92.62,"price":81.12,"shippingFee":11.5,"differencePrice":-92.62,"GoodsUrl":"https://book.kongfz.com/1121862/8620201407","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23602004/bc1be7f1013d5f16_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547400289","title":"恐龙宝贝 18失踪的公主.","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/240738/6964968829","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/49/01c16a6e44d6eefc_b.jpg","GoodsImgCount":"5","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504936004","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787566422859","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802255913","title":"第十二张牌 林肯 莱姆系列之六","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":2.9,"shippingFee":5,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/261116/8727732660","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbffccc/dfc8550b211d9e53_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111331834","title":"(二手书)离散数学 冯伟森栾新成石兵 机械工业出版社 2011年03月01日 9787111331834","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.4,"price":9.4,"shippingFee":4,"differencePrice":-13.4,"GoodsUrl":"https://book.kongfz.com/704408/6180539887","imgBigUrl":"https://www0.kfzimg.com/G06/M00/91/AE/p4YBAFqeLhKAW5d5AADl92ZwcOg893_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300096728","title":"民法典体系研究 王利明著 16开 中国人民大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.610000000000001,"price":8.21,"shippingFee":2.4,"differencePrice":-10.610000000000001,"GoodsUrl":"https://book.kongfz.com/691158/8420929169","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbdcbac/d39298c4ffe420f0_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534487484","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514857719","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787517057314","title":"中文版AutoCAD 2018从入门到精通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.04,"price":3.04,"shippingFee":2,"differencePrice":-5.04,"GoodsUrl":"https://book.kongfz.com/624177/8858791962","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeabffeb/61322e6d9183c96c_b.jpg","GoodsImgCount":"2","onSaleCount":174,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559662897","title":"你可以链接任何人","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/718390/8279878590","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cebadccd/f3d70455d1372df0_b.jpg","GoodsImgCount":"9","onSaleCount":214,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539861753","title":"经典碑帖笔法临析大全:汉 张迁碑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":25,"shippingFee":5,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/626307/8191067601","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceecbcfd/5a4122d8aacde8e1_b.jpg","GoodsImgCount":"3","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214022448","title":"走出蒙昧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.09,"price":2.09,"shippingFee":3,"differencePrice":-5.09,"GoodsUrl":"https://book.kongfz.com/880498/8552588955","imgBigUrl":"https://www0.kfzimg.com/G06/M00/4C/C2/p4YBAFqbzkiANU8yAABXKCNtm0I243_b.jpg","GoodsImgCount":"1","onSaleCount":100,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801820716","title":"034-最高人民法院关于审理未成年人刑事案件的若干规定——司法解释配套规定(30)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/773547/8882061995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abcbedbe/3f86089883b36df9_b.jpg","GoodsImgCount":"3","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565603785","title":"高中地理知识清单第七次修订","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9099999999999997,"price":0.11,"shippingFee":3.8,"differencePrice":-3.9099999999999997,"GoodsUrl":"https://book.kongfz.com/237705/8296401548","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/becedeca/85f3d8d0cf0507fc_b.jpg","GoodsImgCount":"1","onSaleCount":312,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300227931","title":"摇滚狂人:奥兹·奥斯本自传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":357.93,"price":347.93,"shippingFee":10,"differencePrice":-357.93,"GoodsUrl":"https://book.kongfz.com/885269/8721211625","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C6/CD/p4YBAFqYPm6AA58NAADmk-bczug630_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040165333","title":"服装缝制工艺","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.030000000000001,"price":4.03,"shippingFee":5,"differencePrice":-9.030000000000001,"GoodsUrl":"https://book.kongfz.com/234408/8617852599","imgBigUrl":"https://www0.kfzimg.com/G06/M00/49/E5/p4YBAFqklnyAOs0PAADPm0kfy34750_b.jpg","GoodsImgCount":"1","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805260341","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540756369","title":"我的教育思考:李镇西30年教育感悟精华","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/244916/7101323168","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbddcdee/0b130d050743b880_b.jpg","GoodsImgCount":"3","onSaleCount":85,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506318037","title":"庞中华书法百日通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.8,"price":1.8,"shippingFee":5,"differencePrice":-6.8,"GoodsUrl":"https://book.kongfz.com/1207201/8872215438","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acadcfea/50504c6043d60888_b.jpg","GoodsImgCount":"1","onSaleCount":118,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534865725","title":"【正版库存书,无写划,当天发货】候气术-古人观念中天地人之纽带","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":39,"shippingFee":10,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/792783/8292451687","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdffeffa/1d238d1e8b570fc8_b.jpg","GoodsImgCount":"2","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309141238","title":"媒介考古学:方法、路径和意涵","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.3,"price":37.8,"shippingFee":1.5,"differencePrice":-39.3,"GoodsUrl":"https://book.kongfz.com/772556/8643035154","imgBigUrl":"https://www0.kfzimg.com/G07/M00/74/9F/q4YBAFy9za6APejXAACbgxAfVOA618_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807492078","title":"中国油灯","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":19,"shippingFee":5,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/3092/8404148550","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abdafddd/ae84e3b815c551f1_b.jpg","GoodsImgCount":"5","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535558121","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100047944","title":"现代汉语词典 大字本【第5版】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":46.2,"price":43.2,"shippingFee":3,"differencePrice":-46.2,"GoodsUrl":"https://book.kongfz.com/567465/8684141730","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afeacdfc/27dbc7df6e4790d0_b.jpg","GoodsImgCount":"11","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214061652","title":"[正版现货实拍]左与右","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":25,"shippingFee":5,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/593972/8831688302","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabcbffc/6acb11c332afb1ac_b.jpg","GoodsImgCount":"2","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565645136","title":"理想树2019新版 高考必刷题 化学合订本 67高考总复?习辅导用书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.23,"price":0.23,"shippingFee":4,"differencePrice":-4.23,"GoodsUrl":"https://book.kongfz.com/841736/7806737988","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eacfdcfc/d53e57da439477b1_b.jpg","GoodsImgCount":"1","onSaleCount":170,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301327678","title":"手机摄影从入门到精通(视频教程版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.96,"price":4.96,"shippingFee":3,"differencePrice":-7.96,"GoodsUrl":"https://book.kongfz.com/814259/7155878213","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11956018/23ecdf560f51fc15_b.jpg","GoodsImgCount":"0","onSaleCount":151,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501242757","title":"稳行高处","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.29,"price":11.29,"shippingFee":5,"differencePrice":-16.29,"GoodsUrl":"https://book.kongfz.com/202798/8790783794","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdeeabf/f0e02fb82665f1a7_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516147948","title":"雷州文化概论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.85,"price":5.35,"shippingFee":5.5,"differencePrice":-10.85,"GoodsUrl":"https://book.kongfz.com/673095/8836493176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eadccdee/b6cdf1498eaa5a5d_b.jpg","GoodsImgCount":"1","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787307196872","title":"西线空战:二战德国空军第26战斗机联队战史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34,"price":28,"shippingFee":6,"differencePrice":-34,"GoodsUrl":"https://book.kongfz.com/255987/6951927055","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcffded/00890ff233c0e961_b.jpg","GoodsImgCount":"8","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535729309","title":"中国湘菜湘点.地方菜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":6,"shippingFee":10,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/794521/8854071538","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbfdcdd/ce5af34277bfbf6d_b.jpg","GoodsImgCount":"15","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787103027660","title":"音乐学:历史、文献与写作","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.97,"price":17.97,"shippingFee":2,"differencePrice":-19.97,"GoodsUrl":"https://book.kongfz.com/877749/8009479476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccadfcdd/59e0599bef87bcc2_b.jpg","GoodsImgCount":"2","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537402484","title":"枭雄百传第三部12世界政坛枭雄之一","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":1.5,"shippingFee":3,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/500139/6001151895","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffddfbcc/623f0323273297b1_b.jpg","GoodsImgCount":"4","onSaleCount":217,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514803723","title":"幼儿文学百年经典:科学 和风卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.1,"price":6.6,"shippingFee":2.5,"differencePrice":-9.1,"GoodsUrl":"https://book.kongfz.com/836247/7706451696","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcfebeb/2055a85b2f62f6cc_b.jpg","GoodsImgCount":"2","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505135482","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010223445","title":"共产党执政规律研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.09,"price":0.09,"shippingFee":5,"differencePrice":-5.09,"GoodsUrl":"https://book.kongfz.com/23607/8529134364","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddcececa/931db1e7f06bbbb1_b.jpg","GoodsImgCount":"1","onSaleCount":324,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506085892","title":"指月录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":24,"shippingFee":6,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/715232/8775324286","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efffcbfb/ac5bb42fd1eb8cfd_b.jpg","GoodsImgCount":"8","onSaleCount":174,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535457646","title":"蒙曼说隋(下):隋炀帝杨广","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.4,"price":11.5,"shippingFee":2.9,"differencePrice":-14.4,"GoodsUrl":"https://book.kongfz.com/566350/8780637754","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfaffafa/7c735695c0ad2658_b.jpg","GoodsImgCount":"8","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508617930","title":"一分钟百万富翁","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.5,"price":5,"shippingFee":5.5,"differencePrice":-10.5,"GoodsUrl":"https://book.kongfz.com/78763/8656091664","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdeffaeb/f97188c16b7bdf05_b.jpg","GoodsImgCount":"4","onSaleCount":100,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301317273","title":"中华茶文化概论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.58,"price":9.58,"shippingFee":0,"differencePrice":-9.58,"GoodsUrl":"https://book.kongfz.com/22758/8269768638","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3159/02b0e79a478be0806a_b.jpg","GoodsImgCount":"1","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802011540","title":"书法碑帖 墨迹精印 隋 智永真草千字文 姚建杭 中国和平出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.9,"price":5.9,"shippingFee":5,"differencePrice":-10.9,"GoodsUrl":"https://book.kongfz.com/910533/8841066585","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decdeecf/5b9eb240e4cf2f07_b.jpg","GoodsImgCount":"1","onSaleCount":156,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516927304","title":"传奇如谜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.29,"price":25.29,"shippingFee":7,"differencePrice":-32.29,"GoodsUrl":"https://book.kongfz.com/238778/8228231786","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/16915416/c05e7a1b0d97ccac_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208018907","title":"中国的奇迹:发展战略与经济改革","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.72,"price":1.72,"shippingFee":5,"differencePrice":-6.72,"GoodsUrl":"https://book.kongfz.com/890432/8720058621","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddecacc/fa7dcc44fce0b0a5_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787110059753","title":"海洋","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":6,"shippingFee":3,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/838443/8896001587","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbbbbded/5ca2371ad0f6c234_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531358305","title":"萧军萧红交游考释","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":9.6,"shippingFee":4.4,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/321650/8279664994","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3974/037bf1538f5fc99ac7_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513335157","title":"最后的守护者","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.5,"price":32,"shippingFee":7.5,"differencePrice":-39.5,"GoodsUrl":"https://book.kongfz.com/161407/7322660044","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbfcceb/aaaede1c711ebe7a_b.jpg","GoodsImgCount":"5","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802257313","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801410016","title":"台湾史志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.73,"price":1.73,"shippingFee":5,"differencePrice":-6.73,"GoodsUrl":"https://book.kongfz.com/798675/8040942996","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaaefed/232c9fe6560dc0d3_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572606052","title":"拉塞-玛娅侦探所 第三辑 自行车迷案","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.890000000000001,"price":2.89,"shippingFee":2,"differencePrice":-4.890000000000001,"GoodsUrl":"https://book.kongfz.com/769044/8524727079","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faafecfc/2145ab50be5e1ccf_b.jpg","GoodsImgCount":"2","onSaleCount":229,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572231353","title":"咖啡帝国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":51,"price":36,"shippingFee":15,"differencePrice":-51,"GoodsUrl":"https://book.kongfz.com/649298/8649997321","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbaefcf/9704f4aa5c669110_b.jpg","GoodsImgCount":"7","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515807263","title":"茶铎八音","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2,"shippingFee":5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/261116/8559980205","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addcaffe/b756d1e8b0eeafb9_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562010326","title":"公司法论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.9,"price":27.9,"shippingFee":2,"differencePrice":-29.9,"GoodsUrl":"https://book.kongfz.com/241290/8326980017","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcfccbf/eed05bc7c12dd20f_b.jpg","GoodsImgCount":"4","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787554513514","title":"记忆传授人:“记忆传授人”四部曲 1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":5,"shippingFee":10,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/661692/8614596277","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcabcada/0013bde7267e5d37_b.jpg","GoodsImgCount":"3","onSaleCount":94,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309168846","title":"婴幼儿保教综合实训","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.24,"price":24.24,"shippingFee":2,"differencePrice":-26.24,"GoodsUrl":"https://book.kongfz.com/472611/8823269026","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fadceaad/f662f7d243246515_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531825494","title":"乌龙院大长篇漫画系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/410862/8714471607","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaafbdbb/2b9d0462e1b8b767_b.jpg","GoodsImgCount":"3","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807408550","title":"正版实拍 下厨记 III","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.13,"price":0.13,"shippingFee":5,"differencePrice":-5.13,"GoodsUrl":"https://book.kongfz.com/400965/8873428467","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efdcafef/08f462f18045e276_b.jpg","GoodsImgCount":"1","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787209126441","title":"不购买的习惯 日 金子由纪子著 山东人民出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.2,"price":6.2,"shippingFee":5,"differencePrice":-11.2,"GoodsUrl":"https://book.kongfz.com/910533/8800769752","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdaadad/ce4e50b49763be2f_b.jpg","GoodsImgCount":"1","onSaleCount":105,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501172740","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530652817","title":"小说月报:412期","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":5.8,"shippingFee":2.3,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/364403/4247581312","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3367/02e16f42ee18f1dbd6_b.jpg","GoodsImgCount":"4","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218120232","title":"梁冬说庄子 养生主","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":3.8,"shippingFee":6,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/914189/8243318884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abefeddf/2c6a08c3f4dc1ba2_b.jpg","GoodsImgCount":"9","onSaleCount":185,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111439066","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213112072","title":"财之道丛书·奥地利学派经济学简史:米塞斯的视角","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.4,"price":8,"shippingFee":10.4,"differencePrice":-18.4,"GoodsUrl":"https://book.kongfz.com/668091/8661535563","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbbfadfd/b4493c0b0d8ea96a_b.jpg","GoodsImgCount":"10","onSaleCount":121,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522500522","title":"正版现货桑梓誉重归名宗陈新森主编9787522500522新华仓库多仓直发","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.16,"price":9.16,"shippingFee":4,"differencePrice":-13.16,"GoodsUrl":"https://book.kongfz.com/170527/8156889048","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cddfebdd/32e201fc94025693_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020017232","title":"《发货快》忏悔录 [法]卢梭 著,范希衡 译 人民文学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.07,"price":7.57,"shippingFee":0.5,"differencePrice":-8.07,"GoodsUrl":"https://book.kongfz.com/156492/8384830037","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4362605/38ec4061f3fe6f66_b.jpg","GoodsImgCount":"1","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229081799","title":"生态文明:人类历史发展的必然选择(32开平装 全1册)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.41,"price":12.41,"shippingFee":6,"differencePrice":-18.41,"GoodsUrl":"https://book.kongfz.com/669893/8313786940","imgBigUrl":"https://www0.kfzimg.com/G06/M00/25/C9/p4YBAFsMoJSAPkWRAABSFJoSyoY034_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500872535","title":"我们的青春","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.39,"price":6.4,"shippingFee":5.99,"differencePrice":-12.39,"GoodsUrl":"https://book.kongfz.com/468773/6807539323","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedbcadb/3b900667369fa822_b.jpg","GoodsImgCount":"3","onSaleCount":62,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519445454","title":"2020年山西省普通高校专升本考试专用教材英语山西省在校专升本研究组/光明日报出版社9787519445454","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.9,"price":10.9,"shippingFee":0,"differencePrice":-10.9,"GoodsUrl":"https://book.kongfz.com/248516/8585444909","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/a64c0e9c50f98710_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559801791","title":"汉文佛教文献研究 佛教文献研究译丛","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55,"price":45,"shippingFee":10,"differencePrice":-55,"GoodsUrl":"https://book.kongfz.com/403/8540586001","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbfdeaa/d8216b91b56cedb8_b.jpg","GoodsImgCount":"2","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302476160","title":"系统规划与管理师教程(全国计算机技术与软件专业技术资格(水平)考试指定用书)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":2.2,"shippingFee":5,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/398369/8197191369","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baccedbc/5d9742e389b4a01e_b.jpg","GoodsImgCount":"1","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516810637","title":"儿童的人格教育","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.75,"price":1.75,"shippingFee":3,"differencePrice":-4.75,"GoodsUrl":"https://book.kongfz.com/783956/8696984436","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faeadeea/927cdef692f8076a_b.jpg","GoodsImgCount":"1","onSaleCount":210,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513930970","title":"特殊罪案调查组2","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.82,"price":5.82,"shippingFee":5,"differencePrice":-10.82,"GoodsUrl":"https://book.kongfz.com/1092446/8817399954","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbdaffb/eda37e39d3acd1ba_b.jpg","GoodsImgCount":"1","onSaleCount":156,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547405826","title":"金刚经 心经 国学经典读本丛书 金刚经心经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.65,"price":4.25,"shippingFee":2.4,"differencePrice":-6.65,"GoodsUrl":"https://book.kongfz.com/561672/8830865409","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfcdaca/dc3cf0b7d7e039d5_b.jpg","GoodsImgCount":"1","onSaleCount":86,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010218908","title":"夏商西周散文传播研究:基于先秦文献的考察","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.8,"price":16.8,"shippingFee":5,"differencePrice":-21.8,"GoodsUrl":"https://book.kongfz.com/475714/8882481687","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2344/01db6e7c5a748513a1_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560070216","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108047052","title":"陈寅恪的最后二十年(修订本)(精装)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40,"price":35,"shippingFee":5,"differencePrice":-40,"GoodsUrl":"https://book.kongfz.com/626307/8183197623","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdbbbfc/492dfd0042fef08c_b.jpg","GoodsImgCount":"3","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101140521","title":"造物记云南古茶园的秘密","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.7,"price":37.7,"shippingFee":2,"differencePrice":-39.7,"GoodsUrl":"https://book.kongfz.com/1214248/8773603177","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecbdbfd/384816fe4b359bb4_b.jpg","GoodsImgCount":"4","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505204324","title":"正方.反方.评方--历届大学生辩论会","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":2,"shippingFee":3,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/839152/8830821017","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcfefbed/6df83dc8f9f4eb3e_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787107174261","title":"滥觞与辉煌:朱永新教育文集(卷二)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.92,"price":3.92,"shippingFee":3,"differencePrice":-6.92,"GoodsUrl":"https://book.kongfz.com/566350/8848531607","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efededba/8793fe0e5f859d15_b.jpg","GoodsImgCount":"7","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300085425","title":"经验与理论:中国社会、经济与法律的实践历史研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":91,"price":85,"shippingFee":6,"differencePrice":-91,"GoodsUrl":"https://book.kongfz.com/26986/8505318233","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffebaceb/5e665fe35d11e0d6_b.jpg","GoodsImgCount":"4","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553743356","title":"跟着大厨学做宴客菜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.99,"price":2.99,"shippingFee":2,"differencePrice":-4.99,"GoodsUrl":"https://book.kongfz.com/779125/8445844689","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edecdbcb/1f663356d75b3fc1_b.jpg","GoodsImgCount":"1","onSaleCount":227,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500925774","title":"陈式太极拳精义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/204681/8857864879","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccecdacf/a4fbff5bf6a42616_b.jpg","GoodsImgCount":"7","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553924571","title":"20世纪中国科学口述史·走自己的路——吴文俊口述自传(正版\\内页干净\\实物拍摄)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":51,"price":45,"shippingFee":6,"differencePrice":-51,"GoodsUrl":"https://book.kongfz.com/218311/8625508085","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acddbbcb/1d9a5ae19c383ddb_b.jpg","GoodsImgCount":"4","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534501043","title":"实用武当气功","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":9,"shippingFee":7,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/14581/8817086084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbccbcbe/ead694ffe452f428_b.jpg","GoodsImgCount":"8","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509138052","title":"周耀庭讲小儿温病","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":17,"shippingFee":6,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/270515/8661563982","imgBigUrl":"https://www0.kfzimg.com/G07/M00/75/F2/q4YBAFvlRaeAYNaJAABkY-JAiVw250_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519122263","title":"【正版二手】大学素养语文第三版金振邦第3版9787519122263教育科学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.29,"price":3.29,"shippingFee":0,"differencePrice":-3.29,"GoodsUrl":"https://book.kongfz.com/783101/8471284217","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abdbfefa/6189125599d2f3e6_b.jpg","GoodsImgCount":"6","onSaleCount":216,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0}],"condition":85,"imageSelect":1,"userId":"1967112570379649025","taskId":"中心书库发布VB_0;BS_0;OMS_0;IllP_0;IA_0;BCS_2,999999;SCS_5,999999;userId_1967112570379649025;rand_1759227336656-3","way":"0"} +【2025-09-30 18:25:05】【返回参数】{"code":"200","success":true,"message":"执行成功"} +【2025-09-30 18:25:05】【日志结束,方法名称:centerBooks】【centerBooksAdd】中心书库发布商品 +【2025-09-30 18:27:05】【日志开始,方法名称:centerBooks】【centerBooksAdd】中心书库发布商品 +【2025-09-30 18:27:05】【执行参数】{"result":[{"isbn":"9787568918695","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572019722","title":"中学生思辨日知录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.41,"price":22.41,"shippingFee":1,"differencePrice":-23.41,"GoodsUrl":"https://book.kongfz.com/250369/7507863640","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4986191/4593582d712cdd2c_b.jpg","GoodsImgCount":"1","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518418466","title":"萨巴厨房 粗粮细做","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.3,"price":3.3,"shippingFee":5,"differencePrice":-8.3,"GoodsUrl":"https://book.kongfz.com/802508/8631264293","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dffbcfeb/6b008f588aa38d92_b.jpg","GoodsImgCount":"1","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514810813","title":"植物大战僵尸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":8,"shippingFee":3,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/566350/8842775522","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bebcbeee/b169dfd45b2c6889_b.jpg","GoodsImgCount":"5","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535688316","title":"(未拆封)小王子(唯美绘本典藏版,凯特·格林威大奖提名曼纽拉·阿德雷亚尼全新绘制)【浦睿文化出品】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2,"shippingFee":5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/695844/8215712304","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaddfcfe/5f734b0719ebcbe7_b.jpg","GoodsImgCount":"6","onSaleCount":99,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501559565","title":"诗词格律手册,,","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":4,"shippingFee":8,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/241320/6143640925","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbfdfacc/9361917dd464d637_b.jpg","GoodsImgCount":"4","onSaleCount":50,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100023085","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020157563","title":"西藏天空(茅盾文学奖得主、《尘埃落定》作者阿来作品。人如何才能成为真正的人?平等的爱才能铸就幸福)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/9617/8175403971","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1149758/0861d76b41b79344_b.jpg","GoodsImgCount":"3","onSaleCount":129,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521729405","title":"长期有耐心美团的成长与进化逻辑 丁西坡 中信出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.3,"price":15.3,"shippingFee":5,"differencePrice":-20.3,"GoodsUrl":"https://book.kongfz.com/910533/8776640084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdfcbfce/dc3b3f0f770b2564_b.jpg","GoodsImgCount":"1","onSaleCount":141,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559607577","title":"正版书籍命运:掌控你人生的命脉玄机 重塑人生主宰命运改变人生成功与运气","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.98,"price":8.98,"shippingFee":5,"differencePrice":-13.98,"GoodsUrl":"https://book.kongfz.com/442545/7044016865","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/12608860/b7aaf035a46742d8_b.jpg","GoodsImgCount":"1","onSaleCount":195,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546347110","title":"国学典藏 偏方秘方","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":0.5,"shippingFee":5,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/820017/8708620849","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daeddaef/0236a2498e1ea631_b.jpg","GoodsImgCount":"3","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522201573","title":"影子老师实战指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.15,"price":24.15,"shippingFee":2,"differencePrice":-26.15,"GoodsUrl":"https://book.kongfz.com/476106/8289838819","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaffcfff/5b82a2549640e185_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503322457","title":"实拍图 雄师劲旅 中国人民解放军第十一军征战纪实","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.689999999999998,"price":15.69,"shippingFee":4,"differencePrice":-19.689999999999998,"GoodsUrl":"https://book.kongfz.com/330788/8779037628","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddaadcd/354fcf459e2bc020_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508228327","title":"异国主食美味30种","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.9,"price":5.4,"shippingFee":3.5,"differencePrice":-8.9,"GoodsUrl":"https://book.kongfz.com/719470/7147511958","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/18693003/824e38ad750a4f7c_b.jpg","GoodsImgCount":"4","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506503945","title":"黄石公三略浅说","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":5,"shippingFee":9,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/16576/8322316451","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adcbcefe/735dcc4a5c9de005_b.jpg","GoodsImgCount":"4","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510408366","title":"实拍图 百弊放言","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.77,"price":5.77,"shippingFee":4,"differencePrice":-9.77,"GoodsUrl":"https://book.kongfz.com/330788/8655240012","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbabdeaa/d18897da754846a8_b.jpg","GoodsImgCount":"1","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122197689","title":"化工分离过程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.2,"price":1.2,"shippingFee":3,"differencePrice":-4.2,"GoodsUrl":"https://book.kongfz.com/774181/8784846555","imgBigUrl":"httpstotalPrice://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeccdcc/b03249bc4a0bff33_b.jpg","GoodsImgCount":"10","onSaleCount":145,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508649986","title":"正版二手书光荣与梦想(4)9787508649986","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.89,"price":6.89,"shippingFee":0,"differencePrice":-6.89,"GoodsUrl":"https://book.kongfz.com/765962/8807354840","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/facebfde/3179c1dbe9a1a3e1_b.jpg","GoodsImgCount":"1","onSaleCount":607,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787306038234","title":"新媒渠:中国营销实践版1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.98,"price":6.98,"shippingFee":0,"differencePrice":-6.98,"GoodsUrl":"https://book.kongfz.com/356195/8831898825","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/80acda36e6792b24_b.jpg","GoodsImgCount":"7","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550831971","title":"琴道(论古琴的思想体系)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":44,"price":34,"shippingFee":10,"differencePrice":-44,"GoodsUrl":"https://book.kongfz.com/471874/8103918813","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbcefca/3eaa20070e97dc68_b.jpg","GoodsImgCount":"10","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511517661","title":"中国梦 中国的奋斗与复兴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.199999999999999,"price":4.8,"shippingFee":2.4,"differencePrice":-7.199999999999999,"GoodsUrl":"https://book.kongfz.com/13534/8836412957","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdaaecc/f6e075e551b87645_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538731293","title":"本草纲目","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.35,"price":6.35,"shippingFee":5,"differencePrice":-11.35,"GoodsUrl":"https://book.kongfz.com/798675/8753394509","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afeedaca/c47788d5f78c4552_b.jpg","GoodsImgCount":"1","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805532752","title":"世界名曲欣赏·2·俄罗斯部分","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.5,"price":2.5,"shippingFee":5,"differencePrice":-7.5,"GoodsUrl":"https://book.kongfz.com/469122/8625940704","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feddbdba/17478803856c6a77_b.jpg","GoodsImgCount":"9","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787566801715","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117237321","title":"英汉对照护理英语会话(第2版 英汉对照)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/508346/8881986880","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfdacfb/eecb8ef0a9eceff3_b.jpg","GoodsImgCount":"9","onSaleCount":104,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807058953","title":"景丽瑜伽:瑜伽初级入门(升级版)附光盘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":3.3,"shippingFee":0,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/840504/8228479927","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adfedacd/19bfd9488c0fbb11_b.jpg","GoodsImgCount":"7","onSaleCount":448,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122270795","title":"新SAT阅读长难句精讲30天第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.559999999999999,"price":4.06,"shippingFee":4.5,"differencePrice":-8.559999999999999,"GoodsUrl":"https://book.kongfz.com/877194/8511050402","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fafafbfd/6b7b13835b41f7ec_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508224664","title":"英语语法表解手册 (修订版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":38,"shippingFee":10,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/269417/5120887447","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faecbabe/9519270017db1bd6_b.jpg","GoodsImgCount":"2","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534736025","title":"中国国家地理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.9399999999999995,"price":4.93,"shippingFee":0.01,"differencePrice":-4.9399999999999995,"GoodsUrl":"https://book.kongfz.com/545601/8761272941","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14322431/d91e5ce59a592a24_b.jpg","GoodsImgCount":"2","onSaleCount":151,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787107346361","title":"普通高中教科书教师教学用书生物学选择性必修2生物与环境 人民教育出版社课程教材研究所生物课程教材研究开发中心编著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.5,"price":10.5,"shippingFee":3,"differencePrice":-13.5,"GoodsUrl":"https://book.kongfz.com/681595/8811715235","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdefffb/0fbe52d7dda4ef04_b.jpg","GoodsImgCount":"3","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030207500","title":"大学应用物理 蒲利春 张雪峰 科学出版社 9787030207500","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.87,"price":1.87,"shippingFee":3,"differencePrice":-4.87,"GoodsUrl":"https://book.kongfz.com/195620/8312037668","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5749161/6e89f9d1af7e7989_b.jpg","GoodsImgCount":"1","onSaleCount":72,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213104589","title":"颠覆:马斯克的商业逻辑和创新法则(九品)9787213104589","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.9,"price":9.3,"shippingFee":2.6,"differencePrice":-11.9,"GoodsUrl":"https://book.kongfz.com/20579/8802296569","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbadefca/15c37dc77ff955cf_b.jpg","GoodsImgCount":"1","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535364456","title":"古代传说中的怪物【正版 塑封 发货快】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/891652/8853257427","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acceceed/610520b76a3ebe80_b.jpg","GoodsImgCount":"5","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560417035","title":"对农民让利:一个乡镇党委书记的工作笔记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.8,"price":2.8,"shippingFee":10,"differencePrice":-12.8,"GoodsUrl":"https://book.kongfz.com/20238/6553568561","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2388552/6b834f981ec7e865_b.jpg","GoodsImgCount":"7","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545560978","title":"邓小平","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.18,"price":9.18,"shippingFee":5,"differencePrice":-14.18,"GoodsUrl":"https://book.kongfz.com/805022/8530275546","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21340856/36aaf5bffbf85d8c_b.jpg","GoodsImgCount":"1","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569506563","title":"活着,就该尽点儿兴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":8,"shippingFee":5,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/364917/8345040086","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecccebaa/eae7ce24870491e4_b.jpg","GoodsImgCount":"3","onSaleCount":139,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534338755","title":"中国文化史教程第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.49,"price":1.49,"shippingFee":4,"differencePrice":-5.49,"GoodsUrl":"https://book.kongfz.com/878042/8490636209","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaadffef/7807b51707816c48_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500319368","title":"历代画谱类编:山水(12)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":52,"price":40,"shippingFee":12,"differencePrice":-52,"GoodsUrl":"https://book.kongfz.com/25728/8440709404","imgBigUrl":"https://www0.kfzimg.com/G06/M00/14/79/p4YBAFqisNaAIasgAABrIQx-ikM832_b.jpg","GoodsImgCount":"1","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533258030","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802257481","title":"希腊棺材之谜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.73,"price":12.73,"shippingFee":5,"differencePrice":-17.73,"GoodsUrl":"https://book.kongfz.com/202798/8894676974","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccccbdec/2343a3c4f807db86_b.jpg","GoodsImgCount":"1","onSaleCount":85,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117055352","title":"妇产科手术学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":28,"shippingFee":10,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/760393/8899580666","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffaecbce/b54811d7b2204a06_b.jpg","GoodsImgCount":"3","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532522453","title":"韩愈散文选集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":6,"shippingFee":6,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/263916/8292153110","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abacbbfc/82ed778ad7f2030c_b.jpg","GoodsImgCount":"7","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301347775","title":"中国现代文学三十年(第三版)北京大学钱理群、温儒敏、吴福辉教授著 现当代文学书及中文系考研重要参考书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":13,"shippingFee":10,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/574881/7680988794","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deffdbae/bb726b02bcf65138_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500166207","title":"疫情后中国经济新发展格局","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":1.5,"shippingFee":3,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/838443/8749381946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebecdcad/222250eecf4e488c_b.jpg","GoodsImgCount":"1","onSaleCount":323,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546420950","title":"7岁对了,一辈子就对了","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/712812/7340204569","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbffeec/79cd4560b8c5de05_b.jpg","GoodsImgCount":"4","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807676447","title":"云冈石窟","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.5,"price":8,"shippingFee":4.5,"differencePrice":-12.5,"GoodsUrl":"https://book.kongfz.com/81946/6302388964","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baeaffef/65208eca36d1432c_b.jpg","GoodsImgCount":"4","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305120305","title":"正版新书现货 文学理论读本/IAS励学文丛 9787305120305 阎嘉|主编:周宪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.66,"price":32.66,"shippingFee":5,"differencePrice":-37.66,"GoodsUrl":"https://book.kongfz.com/311632/8812587135","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babdccad/2ba0f4a400d24004_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540485818","title":"散落星河的记忆4:璀璨","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":12,"shippingFee":8,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/639697/5243750723","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfecffea/f776a0acf017e68f_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559652737","title":"看国宝 和爸妈游博物馆","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.9,"price":1.8,"shippingFee":3.1,"differencePrice":-4.9,"GoodsUrl":"https://book.kongfz.com/894143/8701969746","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaabafee/f2595c7b2fd4a550_b.jpg","GoodsImgCount":"6","onSaleCount":261,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503943348","title":"献给阿尔吉侬的花束","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":10,"shippingFee":10,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/498915/7429202611","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbebfaec/d6256a6ee6537fa6_b.jpg","GoodsImgCount":"10","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301085493","title":"简单机械(中文翻译版)——国家地理阅读与写作训练丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/395221/5519963069","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1098/c6f60cc2ccbee2bb_b.jpg","GoodsImgCount":"2","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543211018","title":"寺庙自助游完全手册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":15,"shippingFee":0,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/700859/7742663957","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acecbabc/2d6e70c49c17570e_b.jpg","GoodsImgCount":"3","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801491589","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561327265","title":"正版二手书二手正版重返普罗旺斯97875613272659787561327265","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/765962/8631594226","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babdaece/b00ebe69df5166ff_b.jpg","GoodsImgCount":"1","onSaleCount":341,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543225589","title":"信用评级理论与实务 第二版叶伟春 编格致出版社9787543225589","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.17,"price":4.17,"shippingFee":0,"differencePrice":-4.17,"GoodsUrl":"https://book.kongfz.com/443530/8601138144","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11958278/4e1eb16e9d1c0462_b.jpg","GoodsImgCount":"1","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507547092","title":"我们生命里的“七七”(许倬云、郝柏村、齐邦媛、星云大师等用生命记录一篇篇撼动心灵的故事)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":35,"shippingFee":8,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/274410/7932527162","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddedaaac/5cabe80609502ec1_b.jpg","GoodsImgCount":"7","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787555373070","title":"2023秋状元导学案名师教学设计数学三年级上册样书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":5,"shippingFee":9,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/381029/8749671888","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcedeaf/6bf3c05878ca8f83_b.jpg","GoodsImgCount":"3","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540206956","title":"中国谋略宝鉴第十六卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.01,"price":0.01,"shippingFee":3,"differencePrice":-3.01,"GoodsUrl":"https://book.kongfz.com/360813/5966263658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdbfdfa/62959300371438f8_b.jpg","GoodsImgCount":"2","onSaleCount":330,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518051625","title":"肿瘤医院营养师的防癌抗癌吃法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.790000000000001,"price":5.19,"shippingFee":1.6,"differencePrice":-6.790000000000001,"GoodsUrl":"https://book.kongfz.com/457799/7915187178","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C3/5E/p4YBAFuRCEOAGxQ5AAC90eEIDkQ669_b.jpg","GoodsImgCount":"0","onSaleCount":220,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508079165","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787102041223","title":"物色黑白","quality":0,"qualityText":"","originalPrice":0,"totalPrice":66,"price":66,"shippingFee":0,"differencePrice":-66,"GoodsUrl":"https://book.kongfz.com/319064/8795448603","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbeefaca/c584b2d59a425bfc_b.jpg","GoodsImgCount":"8","onSaleCount":76,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787220108211","title":"瑜伽文库〔5〕:阿育吠陀瑜伽","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.8,"price":19.8,"shippingFee":13,"differencePrice":-32.8,"GoodsUrl":"https://book.kongfz.com/402676/8643741176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeaabefd/2a392099ec628856_b.jpg","GoodsImgCount":"9","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810103855","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806498439","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545435702","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539186887","title":"我的第一本科学漫画书寻宝记系列:巴西寻宝记11","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.51,"price":0.01,"shippingFee":4.5,"differencePrice":-4.51,"GoodsUrl":"https://book.kongfz.com/825588/8886241126","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccedcffa/61ddbfc1f57a12af_b.jpg","GoodsImgCount":"5","onSaleCount":248,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537144704","title":"写给小读者之快乐精灵","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":2,"shippingFee":3,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/774181/8597113775","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfcffafb/d701ee2510c5ed23_b.jpg","GoodsImgCount":"5","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115106124","title":"WindowsAPI函数参考手册 WindowsAPI函数参考手册 编写组编 人民邮电出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.37,"price":24.37,"shippingFee":4,"differencePrice":-28.37,"GoodsUrl":"https://book.kongfz.com/878042/8495444282","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfbeabaa/96a386fdb8bce4df_b.jpg","GoodsImgCount":"1","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535612793","title":"论摄影","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":12,"shippingFee":0,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/26771/8136858550","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eabfccee/3ca1daf23bce666c_b.jpg","GoodsImgCount":"4","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532785445","title":"近代文学批评史(全八卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":411.88,"price":401.88,"shippingFee":10,"differencePrice":-411.88,"GoodsUrl":"https://book.kongfz.com/471874/8695951046","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdabfceb/3089afd17e730b90_b.jpg","GoodsImgCount":"5","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504758415","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500311133","title":"徽派与徽州篆刻研究专辑:西泠印社(总第21辑)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.11,"price":16.11,"shippingFee":0,"differencePrice":-16.11,"GoodsUrl":"https://book.kongfz.com/897296/8237009972","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23068564/6d816b75de4e44ee_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111180623","title":"物业管理沟通艺术","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31,"price":24,"shippingFee":7,"differencePrice":-31,"GoodsUrl":"https://book.kongfz.com/912353/8289311525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdfcefa/39fd857445991f96_b.jpg","GoodsImgCount":"6","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532520756","title":"天涯侠侣册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.26,"price":4.26,"shippingFee":2,"differencePrice":-6.26,"GoodsUrl":"https://book.kongfz.com/1214361/8873449966","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbbddcb/8610a576eb08226a_b.jpg","GoodsImgCount":"4","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787109200845","title":"榨汁机美味食谱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.5,"price":20,"shippingFee":3.5,"differencePrice":-23.5,"GoodsUrl":"https://book.kongfz.com/719470/8585565450","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/18693003/0bfa2608b791ef68_b.jpg","GoodsImgCount":"3","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544763035","title":"三个女人 罗伯特 穆齐尔 译林出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.69,"price":9.69,"shippingFee":4,"differencePrice":-13.69,"GoodsUrl":"https://book.kongfz.com/766912/8858942814","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdefddae/bfa6459d0d82fb08_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541736247","title":"2007年最佳小故事排行榜TOP100感动卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/1207077/8702929036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efcbbdfa/2d9763b9c691fc8d_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507838336","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556021703","title":"女儿的故事 梅子涵 9787556021703 长江少年儿童出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.18,"price":1.68,"shippingFee":2.5,"differencePrice":-4.18,"GoodsUrl":"https://book.kongfz.com/237713/8792049160","imgBigUrl":"https://www0.kfzimg.com/G06/M00/38/4F/p4YBAFqjzVGAQ2WRAABJeXbuA7o046_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533937928","title":"迷狂 精装32开一版一印","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/696299/5906512396","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afabbcbb/9090a343c388e169_b.jpg","GoodsImgCount":"5","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565513671","title":"普通土壤学(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/506902/4876475660","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abbefebc/96f603e5373aadfd_b.jpg","GoodsImgCount":"2","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805646862","title":"野性的证明","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.98,"price":1.98,"shippingFee":3,"differencePrice":-4.98,"GoodsUrl":"https://book.kongfz.com/557002/5846843192","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbaeffbf/4b2a328969a84da5_b.jpg","GoodsImgCount":"6","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501767939","title":"期货-财富永动机","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":2,"shippingFee":4.9,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/26937/3839324520","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbfccfbb/f0d427a5206db5af_b.jpg","GoodsImgCount":"4","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787204009978","title":"红砂勾魂手 品好","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":19,"shippingFee":9,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/303616/8201886650","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafbbaba/e4d9bb837f6179d2_b.jpg","GoodsImgCount":"13","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020165650","title":"岁月静好:蒋勋的日常功课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.46,"price":18.46,"shippingFee":0,"differencePrice":-18.46,"GoodsUrl":"https://book.kongfz.com/792408/8898218361","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2790/02552e196a86ee0f77_b.jpg","GoodsImgCount":"1","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509823743","title":"红色之路烽火","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/730214/8858116427","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbeeebe/f500632e8ecee420_b.jpg","GoodsImgCount":"4","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536472129","title":"拉玛迷境","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34,"price":22,"shippingFee":12,"differencePrice":-34,"GoodsUrl":"https://book.kongfz.com/151474/8535484987","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbddebe/867cffc401ca09c4_b.jpg","GoodsImgCount":"7","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121211515","title":"学而思 培优辅导:初二物理跟踪练习(上下)附答案","quality":0,"qualityText":"","originalPrice":0,"totalPrice":120,"price":110,"shippingFee":10,"differencePrice":-120,"GoodsUrl":"https://book.kongfz.com/23910/8754936757","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3161432/7d4639abda234b4e_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224054538","title":"心血运动论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.67,"price":3.77,"shippingFee":3.9,"differencePrice":-7.67,"GoodsUrl":"https://book.kongfz.com/261575/7984459895","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecfcdcfa/b3872a57908ad1e8_b.jpg","GoodsImgCount":"5","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020081776","title":"芥川龙之介读本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":12,"shippingFee":8,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/689520/8843157283","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babacfce/8db8bcfa2d41f417_b.jpg","GoodsImgCount":"7","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532603763","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510430008","title":"新青瓷之窑变","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.06,"price":3.06,"shippingFee":5,"differencePrice":-8.06,"GoodsUrl":"https://book.kongfz.com/1207077/8886789761","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfdabcaa/1796162e1d9f2e4b_b.jpg","GoodsImgCount":"1","onSaleCount":251,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536564343","title":"夜翼天使","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/470358/4339829959","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfdffca/d07df374b3e13496_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550708471","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507850642","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544624770","title":"新编高级英语语法:A New Advanced English Grammar","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32,"price":20,"shippingFee":12,"differencePrice":-32,"GoodsUrl":"https://book.kongfz.com/830099/8882431094","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbaccbf/781a6310a0eb776e_b.jpg","GoodsImgCount":"9","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115495372","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506290227","title":"墓志书法百品","quality":0,"qualityText":"","originalPrice":0,"totalPrice":57.82,"price":46.82,"shippingFee":11,"differencePrice":-57.82,"GoodsUrl":"https://book.kongfz.com/509141/8585650720","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14014041/28964975e7dc309e_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559634351","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303135660","title":"顾明远教育口述史(增订)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/17747/5768445516","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1970964/2e94e4bdc50d3792_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800880452","title":"龙虎群英 中","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":1.5,"shippingFee":4,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/203004/8899012503","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdabaaea/64e07e07529c21b6_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538290622","title":"PASS初中英语巧记2000词","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":2,"shippingFee":3,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/841015/8684297376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcfffbab/4b67a6d547944648_b.jpg","GoodsImgCount":"4","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101084894","title":"中华经典精粹解读:史记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/702814/8179518138","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/defadbfe/4eea5c6a4809568e_b.jpg","GoodsImgCount":"4","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301270189","title":"文本的隐与显 中国现代文学文献校读论稿 解志熙著 北京大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.8,"price":25.8,"shippingFee":5,"differencePrice":-30.8,"GoodsUrl":"https://book.kongfz.com/903313/8547742130","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfeacbae/ddfb49783c133365_b.jpg","GoodsImgCount":"1","onSaleCount":85,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787552569421","title":"阅读理解超快提分公式","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":10,"shippingFee":0,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/34480/7649697434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/15505652/d3d2322c7ec0cb86_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511717306","title":"中央编译局文库 中国的民主治理 理论与实践 效率政府","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.059999999999999,"price":5.06,"shippingFee":3,"differencePrice":-8.059999999999999,"GoodsUrl":"https://book.kongfz.com/783956/8891177168","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acacbaae/5200429427f763ac_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571209483","title":"墨点字帖:2025秋英语写字同步练习册·必修第三册(新教材)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.01,"price":4.51,"shippingFee":4.5,"differencePrice":-9.01,"GoodsUrl":"https://book.kongfz.com/757284/8792634933","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbefcfaa/0cffeeed9f3fd774_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539448374","title":"历代书法名碑名帖精选:隶书(2)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/27190/365578569","imgBigUrl":"https://www0.kfzimg.com/G03/M01/70/45/pYYBAFWvkZeAZ3boAADmaxNa8ss048_b.jpg","GoodsImgCount":"3","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544246255","title":"星期三的战争 美 加里 施密特著 高雪莲译 南海出版公司","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.3,"price":1.3,"shippingFee":5,"differencePrice":-6.3,"GoodsUrl":"https://book.kongfz.com/672601/8709251624","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfddfcdd/b6b4d1110bf4f714_b.jpg","GoodsImgCount":"1","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787205094157","title":"红楼人物家庭角色论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":81,"price":71,"shippingFee":10,"differencePrice":-81,"GoodsUrl":"https://book.kongfz.com/20509/2274876206","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1930/017c3cfaea4867b6f6_b.jpg","GoodsImgCount":"1","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569912647","title":"美在举手投足间 一个人若举止优雅 心灵也会变得更坚强","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.7,"price":12.7,"shippingFee":5,"differencePrice":-17.7,"GoodsUrl":"https://book.kongfz.com/398369/8265506509","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/debccfdc/6d2d3253fb537795_b.jpg","GoodsImgCount":"1","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538724554","title":"毕淑敏作品2·话说孩子毕淑敏时代文艺出版社9787538724554","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.64,"price":4.64,"shippingFee":0,"differencePrice":-4.64,"GoodsUrl":"https://book.kongfz.com/366030/8301042871","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/29e82405eff322db_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534759819","title":"理学古文史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":5,"shippingFee":10,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/233973/8223713174","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbfabab/c49dd1ce62c4a5fb_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787307043114","title":"数字测图原理与方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/603269/8864023084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aacfabef/22ba103e580191bb_b.jpg","GoodsImgCount":"7","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801516091","title":"我信我能我要","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43.21,"price":32.21,"shippingFee":11,"differencePrice":-43.21,"GoodsUrl":"https://book.kongfz.com/878875/8142977482","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22516043/bd4ef387b1384988_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020161638","title":"袁枚诗选(中国古典文学读本丛书典藏)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.36,"price":21.36,"shippingFee":2,"differencePrice":-23.36,"GoodsUrl":"https://book.kongfz.com/476106/8283375310","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebcdbcdd/18643d009e705fdc_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787220040528","title":"历代笔记小说精华 第四卷 清","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.3,"price":23.3,"shippingFee":5,"differencePrice":-28.3,"GoodsUrl":"https://book.kongfz.com/261116/8560390036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceceadad/4cef7455f3e00ef9_b.jpg","GoodsImgCount":"1","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537733373","title":"少林拳术图说","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/210450/4528748517","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D7/AB/p4YBAFqYwJuAJtQPAACd0cT9L9o331_b.jpg","GoodsImgCount":"1","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800063107","title":"汉语方言词汇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":66.5,"price":61,"shippingFee":5.5,"differencePrice":-66.5,"GoodsUrl":"https://book.kongfz.com/405080/7310375008","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daeceecf/30475e68c2096095_b.jpg","GoodsImgCount":"1","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020075782","title":"唐宋词简释","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.2,"price":7.7,"shippingFee":3.5,"differencePrice":-11.2,"GoodsUrl":"https://book.kongfz.com/206421/8501383468","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6147505/9dea4fd349d3d63a_b.jpg","GoodsImgCount":"2","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531855354","title":"东汉演义之二十八《武瘟神下山》","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":25,"shippingFee":0,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/712837/6676396249","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbfaaede/5fd873f0845c0e19_b.jpg","GoodsImgCount":"6","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516100516","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806683200","title":"上海探戈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.79,"price":1.59,"shippingFee":3.2,"differencePrice":-4.79,"GoodsUrl":"https://book.kongfz.com/739740/7152710203","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbacecee/cac0ec945280e864_b.jpg","GoodsImgCount":"4","onSaleCount":228,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502705329","title":"正版 (同系3本包邮)中国古代航海 中国传统民俗文化政治经济制度系列古代航海活动 海上丝绸之路 郑和下西洋指南针的发明与航海等古代航海事业 9787502705329","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.3,"price":14.3,"shippingFee":6,"differencePrice":-20.3,"GoodsUrl":"https://book.kongfz.com/14409/8719267733","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1570906/9b5183c8dd9004c0_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300305042","title":"小学儿童心理学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":5.5,"shippingFee":1.5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/774690/8698078134","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/12774130/3dec28e005f0c72f_b.jpg","GoodsImgCount":"1","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543579217","title":"少年时飞机大解剖","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6,"price":3,"shippingFee":3,"differencePrice":-6,"GoodsUrl":"https://book.kongfz.com/838443/8811129821","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffaeffad/54baa2c8e92b3e4a_b.jpg","GoodsImgCount":"1","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802128125","title":"中国分省系列地图集 河北省地图集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":7,"shippingFee":5,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/911327/8701948242","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdccbec/8f996e037aa30df2_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101015485","title":"祥云县志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":126,"price":120,"shippingFee":6,"differencePrice":-126,"GoodsUrl":"https://book.kongfz.com/409331/3661003725","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eccfbcdd/733430ba3bdecdfb_b.jpg","GoodsImgCount":"6","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117267304","title":"正版二手 变态心理学(第3版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.69,"price":16.69,"shippingFee":0,"differencePrice":-16.69,"GoodsUrl":"https://book.kongfz.com/549116/8830860499","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D4/28/p4YBAFt-5veAPPw7AABq9rtHFGs112_b.jpg","GoodsImgCount":"1","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218045627","title":"现象学的始基","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.16,"price":32.16,"shippingFee":0,"differencePrice":-32.16,"GoodsUrl":"https://book.kongfz.com/792228/8885481303","imgBigUrl":"https://www0.kfzimg.com/G06/M00/62/A7/p4YBAFuCZAWAOEfaAAA_Rk5xTx8034_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513312097","title":"人骨拼图:林肯·莱姆系列之一","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.27,"price":13.27,"shippingFee":10,"differencePrice":-23.27,"GoodsUrl":"https://book.kongfz.com/915406/8415906199","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecfbead/4d4a0685889879f4_b.jpg","GoodsImgCount":"3","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513653343","title":"商社就是天网","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.94,"price":16.94,"shippingFee":5,"differencePrice":-21.94,"GoodsUrl":"https://book.kongfz.com/202798/8568284655","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfafbfc/c08df37a7d16dd93_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040079869","title":"电子技术基础数字部分第4版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":0.5,"shippingFee":5,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/820017/8732562193","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaecdacd/e70eef6ce74fdfbe_b.jpg","GoodsImgCount":"2","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505725508","title":"盗墓笔记5 谜海归巢","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.92,"price":4.12,"shippingFee":2.8,"differencePrice":-6.92,"GoodsUrl":"https://book.kongfz.com/1093663/8899378239","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daffabac/fe727b4b941bbc33_b.jpg","GoodsImgCount":"1","onSaleCount":362,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509155189","title":"颈腰关节疼痛及注射疗法 第5版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":184,"price":168,"shippingFee":16,"differencePrice":-184,"GoodsUrl":"https://book.kongfz.com/165055/8254619732","imgBigUrl":"https://www0.kfzimg.com/G05/M00/F1/D0/p4YBAFmNI22AdqQ1AAT058m6zlw056_b.jpg","GoodsImgCount":"9","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509641651","title":"实拍图 文化的逻辑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.74,"price":4.74,"shippingFee":5,"differencePrice":-9.74,"GoodsUrl":"https://book.kongfz.com/802501/8561762805","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbabfcdc/6980f786578b04a8_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200044867","title":"梦断紫禁城","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.08,"price":2.08,"shippingFee":3,"differencePrice":-5.08,"GoodsUrl":"https://book.kongfz.com/832065/8677126488","imgBigUrl":"https://www0.kfzimg.com/G06/M00/B0/84/p4YBAFrBjlSAJZRXAADDlnNLY8U712_b.jpg","GoodsImgCount":"1","onSaleCount":162,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801123596","title":"中国民主建国会史稿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":2.2,"shippingFee":3.3,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/912942/8547857084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcefdeae/6c07c7d88214a065_b.jpg","GoodsImgCount":"2","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301139899","title":"地质学原理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":29,"shippingFee":9,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/521012/8429778365","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfbbdbcd/7e66c3c7cba28ccd_b.jpg","GoodsImgCount":"4","onSaleCount":150,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787104019404","title":"中国现代话剧教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":2,"shippingFee":8,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/23363/8631048802","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3089567/3d8d13eefa1391ea_b.jpg","GoodsImgCount":"3","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506671965","title":"温室气体核算体系:企业价值链(范围三)核算与报告标准","quality":0,"qualityText":"","originalPrice":0,"totalPrice":88,"price":78,"shippingFee":10,"differencePrice":-88,"GoodsUrl":"https://book.kongfz.com/12885/7710497039","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aeaedccf/213af3af7a5412cd_b.jpg","GoodsImgCount":"3","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108016850","title":"人·兽·鬼","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.779999999999999,"price":5.77,"shippingFee":0.01,"differencePrice":-5.779999999999999,"GoodsUrl":"https://book.kongfz.com/877749/8801481679","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/421097e73bed945d_b.jpg","GoodsImgCount":"3","onSaleCount":382,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111350118","title":"材料力学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":14,"shippingFee":8,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/190848/8546617490","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebfbffac/bbc9b45a3879d75e_b.jpg","GoodsImgCount":"1","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539996301","title":"纳粹医生:医学屠杀与种族灭绝心理学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":22,"shippingFee":7,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/677955/8132923615","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efaecfbb/b6bb3ab2cfa17bb1_b.jpg","GoodsImgCount":"10","onSaleCount":171,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117141598","title":"实地解剖学(本科创新教材)(第2版)羊惠君9787117141598人民卫生出版社羊惠君 编人民卫生出版社9787117141598","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":10,"shippingFee":0,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/810267/8649014717","imgBigUrl":"https://www0.kfzimg.com/G06/M00/20/51/p4YBAFqaTeyAWKo9AAB4_CSZkNs668_b.jpg","GoodsImgCount":"2","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532785230","title":"彩虹几度","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.5,"price":10,"shippingFee":7.5,"differencePrice":-17.5,"GoodsUrl":"https://book.kongfz.com/274142/6240614349","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbfddad/7d7cfe731f17e04d_b.jpg","GoodsImgCount":"4","onSaleCount":103,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801456915","title":"世界艳史 彩图版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.36,"price":1.36,"shippingFee":3,"differencePrice":-4.36,"GoodsUrl":"https://book.kongfz.com/791250/8511647318","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babfecff/e3ea21a762374dc7_b.jpg","GoodsImgCount":"1","onSaleCount":285,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805202174","title":"白话尚书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.2,"price":8.2,"shippingFee":4,"differencePrice":-12.2,"GoodsUrl":"https://book.kongfz.com/203004/8424128025","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdebccad/0b4a13e8667c9f38_b.jpg","GoodsImgCount":"1","onSaleCount":50,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100240147","title":"回望;西南联大沉思录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":44.9,"price":42.9,"shippingFee":2,"differencePrice":-44.9,"GoodsUrl":"https://book.kongfz.com/531424/8836849831","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfecbfde/300a0427a530a221_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556841233","title":"我的第一本科学漫画书 世界寻宝记26 意大利1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.53,"price":1.03,"shippingFee":4.5,"differencePrice":-5.53,"GoodsUrl":"https://book.kongfz.com/1148054/8608793479","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddaabcec/c7db2f605b3fe3d5_b.jpg","GoodsImgCount":"1","onSaleCount":136,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521728057","title":"薛暮桥年谱 1904-1952","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":24.8,"shippingFee":5,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/180897/8428895461","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceceafce/caceb3157ab2e82e_b.jpg","GoodsImgCount":"1","onSaleCount":128,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547258569","title":"你若不勇敢谁替你坚强思履编9787547258569","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":0.5,"shippingFee":2.8,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/783757/8331651577","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdeddde/efd4c2250ad6a94d_b.jpg","GoodsImgCount":"1","onSaleCount":337,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547122990","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560082073","title":"剑桥雅思听力精练","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.03,"price":9.03,"shippingFee":4,"differencePrice":-13.03,"GoodsUrl":"https://book.kongfz.com/884251/8122170338","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaeeafee/47b06a1e8e364586_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550605015","title":"高盛在中国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3,"price":4.29,"shippingFee":0.01,"differencePrice":-4.3,"GoodsUrl":"https://book.kongfz.com/836621/8847676368","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeccebf/0ebeedb9d50da249_b.jpg","GoodsImgCount":"4","onSaleCount":263,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559639769","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302112785","title":"第三次改革:中国非营利部门战略研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.89,"price":6.39,"shippingFee":1.5,"differencePrice":-7.89,"GoodsUrl":"https://book.kongfz.com/774690/8186180572","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AB/04/p4YBAFr8MJuAGAghAAA1z6WS3zI917_b.jpg","GoodsImgCount":"1","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530771389","title":"35公斤的希望","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.84,"price":8.04,"shippingFee":3.8,"differencePrice":-11.84,"GoodsUrl":"https://book.kongfz.com/1213190/8836708018","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dafaafec/7cf7665548548831_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533937102","title":"名家散文典藏·平凹散文:丑石","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.9,"price":5.9,"shippingFee":3,"differencePrice":-8.9,"GoodsUrl":"https://book.kongfz.com/681595/8690093248","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddbdffb/4f941801eb25debf_b.jpg","GoodsImgCount":"3","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536015920","title":"周易八卦实解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34,"price":28,"shippingFee":6,"differencePrice":-34,"GoodsUrl":"https://book.kongfz.com/907443/8170308109","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafeecaf/897ff4b8c0710df5_b.jpg","GoodsImgCount":"7","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516606476","title":"实干成就梦想","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":4.8,"shippingFee":5,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/350027/5033853984","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcacdab/2a63dd061ea42499_b.jpg","GoodsImgCount":"7","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301354377","title":"你写的论文,为什么老师总看不上?","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.58,"price":26.58,"shippingFee":3,"differencePrice":-29.58,"GoodsUrl":"https://book.kongfz.com/787155/8780056007","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13196094/1eec498b7026e22c_b.jpg","GoodsImgCount":"1","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122223289","title":"【正版二手】建筑结构与选型崔钦淑9787122223289化学工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.78,"price":3.78,"shippingFee":0,"differencePrice":-3.78,"GoodsUrl":"https://book.kongfz.com/805904/7166459946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/febaefaf/7e1ada906fcd9fe5_b.jpg","GoodsImgCount":"6","onSaleCount":101,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530215982","title":"风声","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.4,"price":7.4,"shippingFee":4,"differencePrice":-11.4,"GoodsUrl":"https://book.kongfz.com/203004/8422969956","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcaedba/f9c5e1712684ca6f_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511273048","title":"麻省理工商学院最具影响力的商业哲学课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.66,"price":12.66,"shippingFee":0,"differencePrice":-12.66,"GoodsUrl":"https://book.kongfz.com/792228/8901674659","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E2/0D/p4YBAFqY5zyAO8BbAADniLoteH8960_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502844684","title":"主力行为盘口解密二 随机发","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":6,"shippingFee":2,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/755561/8872649902","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbcffdcc/041163d5f287171b_b.jpg","GoodsImgCount":"3","onSaleCount":152,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504486004","title":"中国传统民俗文化 中国古代城墙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.8100000000000005,"price":1.81,"shippingFee":5,"differencePrice":-6.8100000000000005,"GoodsUrl":"https://book.kongfz.com/23607/8261593719","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deacabba/95b12624c888dc2c_b.jpg","GoodsImgCount":"1","onSaleCount":147,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507753936","title":"环喜马拉雅区域研究编译文集二——佐米亚、边疆与跨界","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33.3,"price":27.3,"shippingFee":6,"differencePrice":-33.3,"GoodsUrl":"https://book.kongfz.com/522587/8886443261","imgBigUrl":"https://www0.kfzimg.com/G06/M00/37/D8/p4YBAFsnavWAAHndAABM74pZ9cE770_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504691422","title":"百年耕耘 金善宝传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.58,"price":24.58,"shippingFee":5,"differencePrice":-29.58,"GoodsUrl":"https://book.kongfz.com/716746/8485861144","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddccfdfa/320fa35108c02c52_b.jpg","GoodsImgCount":"2","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121350894","title":"服装设计效果图手绘教程 全彩","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.6899999999999995,"price":0.69,"shippingFee":5,"differencePrice":-5.6899999999999995,"GoodsUrl":"https://book.kongfz.com/1215524/8813604508","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decedfeb/df55bfbeacd0bdc0_b.jpg","GoodsImgCount":"2","onSaleCount":110,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530858394","title":"最具人气的110篇微型小说","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":2.2,"shippingFee":5,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/820017/8708554212","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dedacdcd/5f5491cc457f068e_b.jpg","GoodsImgCount":"2","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509130520","title":"吕仁和临床经验集(第二辑)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":38,"shippingFee":10,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/273906/7915510103","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afaccaba/e01e4552aa321dbb_b.jpg","GoodsImgCount":"5","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101021264","title":"启功丛稿 论文卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/15897/8530660645","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebfcbfae/f929a4dd9ca3e4b8_b.jpg","GoodsImgCount":"6","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541126628","title":"和气生财","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.39,"price":0.89,"shippingFee":4.5,"differencePrice":-5.39,"GoodsUrl":"https://book.kongfz.com/898393/8830817137","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedbcfde/d399a83aa69886b0_b.jpg","GoodsImgCount":"3","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561716977","title":"天然美容法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.98,"price":6.98,"shippingFee":4,"differencePrice":-10.98,"GoodsUrl":"https://book.kongfz.com/787407/7457083905","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beedbcfc/e65d9aa20e1a0495_b.jpg","GoodsImgCount":"5","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513177245","title":"原生家庭创伤和疗愈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.49,"price":3.49,"shippingFee":5,"differencePrice":-8.49,"GoodsUrl":"https://book.kongfz.com/716746/8530263030","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccaeaddb/d3877c98415ad8ec_b.jpg","GoodsImgCount":"1","onSaleCount":94,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549622993","title":"七种武器 2 碧玉九 多情环 古龙 文汇出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.65,"price":8.65,"shippingFee":4,"differencePrice":-12.65,"GoodsUrl":"https://book.kongfz.com/878042/8892052988","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebfebeff/ee8c98cacf018c9f_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516123911","title":"正学 第1辑 程水金 主编中国社会科学出版社9787516123911","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.3,"price":6.3,"shippingFee":0,"differencePrice":-6.3,"GoodsUrl":"https://book.kongfz.com/248516/8445608487","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/5695f680954765b6_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541541247","title":"白话资治通鉴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.08,"price":4.48,"shippingFee":1.6,"differencePrice":-6.08,"GoodsUrl":"https://book.kongfz.com/457799/8458628865","imgBigUrl":"https://www0.kfzimg.com/G06/M00/DB/5D/p4YBAFqYz9yAHTnOAADftrtdLbw543_b.jpg","GoodsImgCount":"1","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547908471","title":"《增广贤文》行楷硬笔字帖","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.19,"price":18.19,"shippingFee":0,"differencePrice":-18.19,"GoodsUrl":"https://book.kongfz.com/792228/8894526011","imgBigUrl":"https://www0.kfzimg.com/G06/M00/5B/8A/p4YBAFqcjB6AXbWlAACxpMJRAxM805_b.jpg","GoodsImgCount":"1","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806051467","title":"中国当代散文精品大观","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.7,"price":5.7,"shippingFee":5,"differencePrice":-10.7,"GoodsUrl":"https://book.kongfz.com/1207201/8732056718","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fadbdafc/d7ca7a014dc6ecd4_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229011628","title":"数字X线成像技术操作规范与剂量优化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.5,"price":14.5,"shippingFee":2,"differencePrice":-16.5,"GoodsUrl":"https://book.kongfz.com/181222/7301030202","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21084698/936f69f883c7f63f_b.jpg","GoodsImgCount":"1","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030438393","title":"原子物理与量子力学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":19,"shippingFee":6,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/219170/8854670030","imgBigUrl":"https://www0.kfzimg.com/G06/M00/0B/61/p4YBAFqZ--OAGdjqAACto8Azpr0414_b.jpg","GoodsImgCount":"1","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535110008","title":"楚辞文化背景研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/257645/8385818159","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eecbadab/53120eaadf8ddada_b.jpg","GoodsImgCount":"13","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559632340","title":"火:鲁米抒情诗","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.8,"price":14,"shippingFee":5.8,"differencePrice":-19.8,"GoodsUrl":"https://book.kongfz.com/1184610/8732818645","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fefffcdc/ef95dd5ef39a5110_b.jpg","GoodsImgCount":"1","onSaleCount":155,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807592501","title":"孔子家语插图本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.859999999999999,"price":0.06,"shippingFee":4.8,"differencePrice":-4.859999999999999,"GoodsUrl":"https://book.kongfz.com/245306/8519611266","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fedfadef/9ceb5bc75d4c177d_b.jpg","GoodsImgCount":"1","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020131617","title":"弹吧 莫扎特 弹吧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":6.1,"shippingFee":5.6,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/1151143/8891642184","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/debdabbc/1d8c6f57855cbebb_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567530416","title":"大夏书系·我的教育信条","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":3,"shippingFee":7,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/251066/6314429244","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dddbfebd/e08eb5004a5a2688_b.jpg","GoodsImgCount":"6","onSaleCount":149,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508698144","title":"认知尺度","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.14,"price":6.54,"shippingFee":1.6,"differencePrice":-8.14,"GoodsUrl":"https://book.kongfz.com/457799/8340498745","imgBigUrl":"https://www0.kfzimg.com/G07/M00/5D/39/qoYBAFxtK26AJQSTAAEIhLXCEPk917_b.jpg","GoodsImgCount":"1","onSaleCount":168,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108056115","title":"蔡澜作品自选集9:一缕余香","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.76,"price":17.76,"shippingFee":5,"differencePrice":-22.76,"GoodsUrl":"https://book.kongfz.com/640398/8325606114","imgBigUrl":"https://www0.kfzimg.com/G06/M00/92/9B/p4YBAFqeNLeATHCWAACUTSWV7sA518_b.jpg","GoodsImgCount":"1","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534084669","title":"自怡书迹(篆书卷)/黄宾虹书法集粹","quality":0,"qualityText":"","originalPrice":0,"totalPrice":300,"price":290,"shippingFee":10,"differencePrice":-300,"GoodsUrl":"https://book.kongfz.com/668742/7408798391","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eccfdcab/c60bd3db8bb088c3_b.jpg","GoodsImgCount":"1","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500083498","title":"亚洲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.58,"price":23.58,"shippingFee":0,"differencePrice":-23.58,"GoodsUrl":"https://book.kongfz.com/492548/8866390914","imgBigUrl":"https://www0.kfzimg.com/G06/M00/83/39/p4YBAFsp0mWAAVA_AAF056wk3DA841_b.jpg","GoodsImgCount":"1","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787210115472","title":"锁定高端:中小企业的出路【正版 塑封 发货快】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":62.8,"price":52.8,"shippingFee":10,"differencePrice":-62.8,"GoodsUrl":"https://book.kongfz.com/891652/8701830203","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebbfacbc/3f994e3345e47706_b.jpg","GoodsImgCount":"5","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301188378","title":"我要做个好家长:家庭教育的核心理念和操作方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.68,"price":4.68,"shippingFee":0,"differencePrice":-4.68,"GoodsUrl":"https://book.kongfz.com/840504/8515494439","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfdbaebd/c66372e6c229f47e_b.jpg","GoodsImgCount":"8","onSaleCount":101,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550623736","title":"子海精华编:四存编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":11,"shippingFee":5,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/737771/8807102818","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F6/AD/p4YBAFqyPJaAVf3fAABnbpaPYeo653_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539670140","title":"一念永恒6 耳根 安徽文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35.67,"price":30.67,"shippingFee":5,"differencePrice":-35.67,"GoodsUrl":"https://book.kongfz.com/878060/8899600389","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbabfcbb/b37d38ca1a66ebf0_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509716229","title":"社会学之思","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.5,"price":12.5,"shippingFee":6,"differencePrice":-18.5,"GoodsUrl":"https://book.kongfz.com/770286/8333236126","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeefbcb/2d1619b6ae1c99c7_b.jpg","GoodsImgCount":"10","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800735912","title":"最大化你的自尊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.88,"price":4.38,"shippingFee":3.5,"differencePrice":-7.88,"GoodsUrl":"https://book.kongfz.com/819139/8780150484","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbcbafcf/16ff682d72d85325_b.jpg","GoodsImgCount":"5","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117117968","title":"一病一页速成系列·症状与体征(翻译版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":30,"shippingFee":5,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/244916/7672342792","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcbafce/36e348e3b2781add_b.jpg","GoodsImgCount":"5","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503419843","title":"国民党将领谈国共大决战:战场较量","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.16,"price":8.66,"shippingFee":1.5,"differencePrice":-10.16,"GoodsUrl":"https://book.kongfz.com/774690/8698048698","imgBigUrl":"https://www0.kfzimg.com/G06/M00/90/C0/p4YBAFqnIWGAZPmWAACgYFH2BdA325_b.jpg","GoodsImgCount":"1","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535437822","title":"谈美书简:大家文论经典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.89,"price":0.09,"shippingFee":4.8,"differencePrice":-4.89,"GoodsUrl":"https://book.kongfz.com/780405/7794576703","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bebffdbd/621954b1d9ca687b_b.jpg","GoodsImgCount":"4","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511708991","title":"光明大手印:实修心髓(下卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/271386/8128810121","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdeefdfc/812225588f075059_b.jpg","GoodsImgCount":"6","onSaleCount":172,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512516236","title":"等我·遇繁","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.2,"price":8.2,"shippingFee":2,"differencePrice":-10.2,"GoodsUrl":"https://book.kongfz.com/545601/8868078177","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdedecc/1f05c7eabb2dae12_b.jpg","GoodsImgCount":"2","onSaleCount":255,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501255726","title":"与爱有关 1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.779999999999999,"price":3.28,"shippingFee":1.5,"differencePrice":-4.779999999999999,"GoodsUrl":"https://book.kongfz.com/772556/8042035571","imgBigUrl":"https://www0.kfzimg.com/G06/M00/37/61/p4YBAFqbSJeAI6TRAAC8PL7kUTA655_b.jpg","GoodsImgCount":"1","onSaleCount":125,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806845394","title":"第三届全国会计知识大赛法规汇编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2.5,"shippingFee":4.5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/285622/5472130653","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfaccbbc/877daef6e53689dc_b.jpg","GoodsImgCount":"3","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545823349","title":"中国城市轨道交通年鉴2023","quality":0,"qualityText":"","originalPrice":0,"totalPrice":88,"price":80,"shippingFee":8,"differencePrice":-88,"GoodsUrl":"https://book.kongfz.com/15878/8635018981","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdbbefdf/7203761aa85bddbe_b.jpg","GoodsImgCount":"7","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520206716","title":"故宫里的大怪兽 木之精灵","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":0.5,"shippingFee":4.5,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/531994/8811950065","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daddabbc/19753635be32a51a_b.jpg","GoodsImgCount":"1","onSaleCount":176,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806960325","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515307497","title":"结构与明暗 素描几何形体单体训练","quality":0,"qualityText":"","originalPrice":0,"totalPrice":60,"price":50,"shippingFee":10,"differencePrice":-60,"GoodsUrl":"https://book.kongfz.com/28297/8404195016","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aacefaab/a69030f0b920a813_b.jpg","GoodsImgCount":"4","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113253271","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539169903","title":"怪杰佐罗力之魔法师的弟子","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":4.4,"shippingFee":2.5,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/782278/8853393863","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdcecfc/7a4f8f77be4872f0_b.jpg","GoodsImgCount":"4","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505411937","title":"东风破","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.65,"price":2.25,"shippingFee":2.4,"differencePrice":-4.65,"GoodsUrl":"https://book.kongfz.com/692223/8848001982","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeabbada/18d4a6e00b5282e5_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540776886","title":"极简黄河史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.899999999999999,"price":5.3,"shippingFee":5.6,"differencePrice":-10.899999999999999,"GoodsUrl":"https://book.kongfz.com/1151143/8749172406","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbfaddcc/1c4188e8273e071e_b.jpg","GoodsImgCount":"2","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801432322","title":"中国的危机 下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.7,"price":0.7,"shippingFee":5,"differencePrice":-5.7,"GoodsUrl":"https://book.kongfz.com/1207201/8732160973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bffaacfd/55b5e6a712210d46_b.jpg","GoodsImgCount":"1","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522511986","title":"心知肚明9787522511986","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.32,"price":26.32,"shippingFee":4,"differencePrice":-30.32,"GoodsUrl":"https://book.kongfz.com/655396/8896033621","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9868355/0c51063e3a790f70_b.jpg","GoodsImgCount":"1","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508668680","title":"理性的非理性:人人都需要的十堂营销心理课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":10.2,"shippingFee":4.8,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/22176/8708259911","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F1/A6/p4YBAFqZN7eAT8t7AADm2HMJsK8866_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545428117","title":"《市场赢家生存智慧》丛书·高级波段交易:预期、确认、交易期货市场波段的交易策略","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40,"price":35,"shippingFee":5,"differencePrice":-40,"GoodsUrl":"https://book.kongfz.com/806881/8791937670","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdeafbbd/4a7a74100aaf4936_b.jpg","GoodsImgCount":"9","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532757060","title":"培根随笔全集培根","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":7,"shippingFee":0,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/576646/8248968682","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faeebaaf/5aedb15807c176ce_b.jpg","GoodsImgCount":"1","onSaleCount":89,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507322910","title":"中国“三农”问题研究(下)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.9,"price":14,"shippingFee":7.9,"differencePrice":-21.9,"GoodsUrl":"https://book.kongfz.com/266593/8514771412","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edefdaad/eefd5c7965a65e96_b.jpg","GoodsImgCount":"1","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806456095","title":"旋风再起林志颖","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.990000000000002,"price":13.99,"shippingFee":3,"differencePrice":-16.990000000000002,"GoodsUrl":"https://book.kongfz.com/525062/7952933376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffccdbfb/d89b4ebf5e73be91_b.jpg","GoodsImgCount":"4","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519882723","title":"综合能源服务百家实践案例集(2023年版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":95,"price":88,"shippingFee":7,"differencePrice":-95,"GoodsUrl":"https://book.kongfz.com/363535/8017764796","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efbbfadc/fb12de80869054a3_b.jpg","GoodsImgCount":"3","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514367324","title":"【正版二手,当日发货,所见即所得】直指生命的真相","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25.5,"price":15.5,"shippingFee":10,"differencePrice":-25.5,"GoodsUrl":"https://book.kongfz.com/314591/8873898618","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbaeadba/ce7c89c2b3d883b0_b.jpg","GoodsImgCount":"2","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561367186","title":"道德经的奥秘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/327097/8898096706","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daededeb/4052728ffcad3402_b.jpg","GoodsImgCount":"11","onSaleCount":261,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020033232","title":"人有病 :一九四九年后中国文坛纪实","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":2,"shippingFee":15,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/702376/8574002491","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdcbfbed/8f994a0ce4511fd7_b.jpg","GoodsImgCount":"9","onSaleCount":146,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546343815","title":"鲁迅经典文集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":1,"shippingFee":3,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/832065/8677403155","imgBigUrl":"https://www0.kfzimg.com/G06/M00/8F/2B/p4YBAFrJk8GAcBv1AAD2D_aSEjw105_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302611257","title":"趣味数学300题","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.34,"price":23.14,"shippingFee":3.2,"differencePrice":-26.34,"GoodsUrl":"https://book.kongfz.com/739740/8455964241","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabaadee/c56a8a360873d9bf_b.jpg","GoodsImgCount":"4","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515341132","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556073115","title":"李毓佩数学故事智斗系列·数学小子杜鲁克","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.54,"price":6.54,"shippingFee":0,"differencePrice":-6.54,"GoodsUrl":"https://book.kongfz.com/196857/8660963953","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E2/9B/p4YBAFskolqAGC7PAAD-YhhDpOQ512_b.jpg","GoodsImgCount":"1","onSaleCount":99,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805926230","title":"心香泪酒祭吴宓","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.4,"price":2.4,"shippingFee":5,"differencePrice":-7.4,"GoodsUrl":"https://book.kongfz.com/1207077/8774008733","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bceafceb/e6e84c0a6968bedb_b.jpg","GoodsImgCount":"1","onSaleCount":167,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513919159","title":"万物简史 布森特 民主与建设出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.1,"price":2.1,"shippingFee":5,"differencePrice":-7.1,"GoodsUrl":"https://book.kongfz.com/180897/8769178321","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdabbaee/25c282fef18ab380_b.jpg","GoodsImgCount":"1","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787107274169","title":"数学 八年级下 教师教学用书 9787107274169","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.8,"price":6.3,"shippingFee":4.5,"differencePrice":-10.8,"GoodsUrl":"https://book.kongfz.com/1121890/8881703556","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcabafca/a28f75df568c2578_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534607820","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534237003","title":"童年的云彩——冰心儿童文学新作奖获奖作者丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3100000000000005,"price":1.42,"shippingFee":2.89,"differencePrice":-4.3100000000000005,"GoodsUrl":"https://book.kongfz.com/826403/8655659602","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fefdbaec/0ac8ce22befd9b77_b.jpg","GoodsImgCount":"2","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807256465","title":"交通银行史画 中英文本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36,"price":31,"shippingFee":5,"differencePrice":-36,"GoodsUrl":"https://book.kongfz.com/766980/8311121800","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eecbbcfc/36be02eef1c632ec_b.jpg","GoodsImgCount":"1","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546122649","title":"中国文化源与流X-GM","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":7.2,"shippingFee":4.5,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/473622/8709248209","imgBigUrl":"https://www0.kfzimg.com/G06/M00/17/08/p4YBAFsYv3KASa21AAB3m2dwVTA494_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535657886","title":"绯弹的亚里亚.3.蜂蜜色陷阱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.5,"price":12.9,"shippingFee":1.6,"differencePrice":-14.5,"GoodsUrl":"https://book.kongfz.com/464363/8082360131","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1303/f3ae13fed07610a2_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516100158","title":"当代中国简帛学研究:1949-2009","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.6,"price":13.6,"shippingFee":5,"differencePrice":-18.6,"GoodsUrl":"https://book.kongfz.com/285265/8420474812","imgBigUrl":"https://www0.kfzimg.com/G06/M00/09/94/p4YBAFqiQTqAfU-fAAB8biLxNVg251_b.jpg","GoodsImgCount":"0","onSaleCount":89,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562153719","title":"数字媒体艺术设计概论谢成开西南师范大学出版社9787562153719","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.98,"price":3.98,"shippingFee":0,"differencePrice":-3.98,"GoodsUrl":"https://book.kongfz.com/366030/8389757114","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/ab8853cb8613e942_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507744088","title":"中医儿科杂病调治 临床验案心得","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.4,"price":8.4,"shippingFee":5,"differencePrice":-13.4,"GoodsUrl":"https://book.kongfz.com/1146983/8731284798","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccabaeea/bec4a3f3ca202604_b.jpg","GoodsImgCount":"1","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562491927","title":"焦虑症和恐惧症:一种认知的观点","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/722553/8053935000","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbbbefb/06a98a8307a77647_b.jpg","GoodsImgCount":"10","onSaleCount":113,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787215063983","title":"人学的科学之路","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":38,"shippingFee":10,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/677747/5525845992","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebefffaa/2aae35f9a9c3c119_b.jpg","GoodsImgCount":"3","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540736590","title":"《发货快》冰心作品精编 冰心 著,卓如 选编 漓江出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.29,"price":4.29,"shippingFee":0,"differencePrice":-4.29,"GoodsUrl":"https://book.kongfz.com/156492/8477626078","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4362605/2b017963221ae54e_b.jpg","GoodsImgCount":"1","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559602589","title":"*超脑/团灭","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.8,"price":11.9,"shippingFee":3.9,"differencePrice":-15.8,"GoodsUrl":"https://book.kongfz.com/622913/8781293258","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1C/A7/p4YBAFqaPyaASO8OAADjaotTI2g047_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509209028","title":"节能技术(一)(二)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.04,"price":3.04,"shippingFee":5,"differencePrice":-8.04,"GoodsUrl":"https://book.kongfz.com/821188/8009266743","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcbddaa/4441735d2fc83d12_b.jpg","GoodsImgCount":"4","onSaleCount":53,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787557614034","title":"糖尿病调养三部曲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.93,"price":5.93,"shippingFee":3,"differencePrice":-8.93,"GoodsUrl":"https://book.kongfz.com/364423/8154767176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11281955/b1d32f99f88a512f_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807429777","title":"黄庭禅","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40,"price":33,"shippingFee":7,"differencePrice":-40,"GoodsUrl":"https://book.kongfz.com/251066/8876471272","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbbcafe/cc28a29941eab7d3_b.jpg","GoodsImgCount":"8","onSaleCount":74,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111385479","title":"管理者每天读点韩非子","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.4,"price":14.4,"shippingFee":5,"differencePrice":-19.4,"GoodsUrl":"https://book.kongfz.com/1207201/8642575748","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edfbaeff/3799b38ac41be0c2_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787313270368","title":"初中英语语法专练 大字版 知识点梳理 全国 中学英语专练百分百","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.11,"price":12.61,"shippingFee":1.5,"differencePrice":-14.11,"GoodsUrl":"https://book.kongfz.com/772556/7933482079","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10317333/28422663cee46d73_b.jpg","GoodsImgCount":"1","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121357961","title":"HTML+CSS+JavaScript编程从入门到精通 html5+css3基础自学教程web前端开发 网站网页前端设计制作建设","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":3.8,"shippingFee":0,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/590687/8602236711","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/578/6f71cebe6e2fe3c2_b.jpg","GoodsImgCount":"1","onSaleCount":149,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553646091","title":"新东方 直通托福基础教程 写作教育科技集团美国本科考试研究院浙江教育出版社9787553646091","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3,"price":4.3,"shippingFee":0,"differencePrice":-4.3,"GoodsUrl":"https://book.kongfz.com/248516/8440860798","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/7c0909d9fac80f7c_b.jpg","GoodsImgCount":"1","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519777418","title":"国家公诉人出庭指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":107.9,"price":99.9,"shippingFee":8,"differencePrice":-107.9,"GoodsUrl":"https://book.kongfz.com/218476/8455920813","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcbfaae/2f5ea8d721d8f099_b.jpg","GoodsImgCount":"8","onSaleCount":97,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535396464","title":"赛尔号精灵传说第二季5女神的愤怒","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.2,"price":1.2,"shippingFee":3,"differencePrice":-4.2,"GoodsUrl":"https://book.kongfz.com/902124/8232461903","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abacdfca/24cae20760f51e8c_b.jpg","GoodsImgCount":"4","onSaleCount":128,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508251738","title":"跌打损伤偏方验方疗法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":11,"shippingFee":9,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/879205/8386867884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadcbdeb/d46616aff116f328_b.jpg","GoodsImgCount":"4","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810971843","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539673882","title":"诡秘之主 10","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36,"price":30,"shippingFee":6,"differencePrice":-36,"GoodsUrl":"https://book.kongfz.com/738944/8666813116","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebebefcf/5b8c2f0af154a990_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550217454","title":"上帝掷骰子吗?:量子物理史话","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/522252/8881101832","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcedbffe/3bc31a21a55e85fe_b.jpg","GoodsImgCount":"10","onSaleCount":535,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533196677","title":"颞下颌关节外科手术图谱【未开封】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":40,"shippingFee":8,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/20113/8708722394","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2368075/5cc59fca61418e15_b.jpg","GoodsImgCount":"6","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545581447","title":"特工小品 小品绘著 天地出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.6,"price":3.6,"shippingFee":4,"differencePrice":-7.6,"GoodsUrl":"https://book.kongfz.com/878042/8780122369","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aabdbfaf/4c6e809d5f8ac283_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520717281","title":"基层中国:国家治理的基石","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":8,"shippingFee":8,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/836297/8270087899","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecbffbbb/e7eba40da48936ea_b.jpg","GoodsImgCount":"5","onSaleCount":221,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503971549","title":"流动的博物馆李德庚9787503971549文化艺术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.6,"price":34.1,"shippingFee":5.5,"differencePrice":-39.6,"GoodsUrl":"https://book.kongfz.com/405080/7310559973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddbfdca/ddfaa51954478712_b.jpg","GoodsImgCount":"1","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301233009","title":"中外物理学精品书系·前沿系列:从抛物线谈起(混沌动力学引论)(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/785604/8009702581","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eefaffee/c4ebf23f89793c3e_b.jpg","GoodsImgCount":"9","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040150780","title":"高中新课程老师教育系列教材:高中音乐新课程教学论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39,"price":30,"shippingFee":9,"differencePrice":-39,"GoodsUrl":"https://book.kongfz.com/233641/6012616143","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdcedcd/c986845d3a146f0c_b.jpg","GoodsImgCount":"18","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508229942","title":"偏方验方治病丛书:胃病偏方验方疗法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/10563/4619429987","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbebdbef/fde06ecabc17f303_b.jpg","GoodsImgCount":"4","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802282452","title":"寒武纪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.4,"price":0.4,"shippingFee":3,"differencePrice":-3.4,"GoodsUrl":"https://book.kongfz.com/884527/8123402741","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfcebaeb/45e505eaf81204fa_b.jpg","GoodsImgCount":"4","onSaleCount":295,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501170388","title":"42部文学名著导读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":3.1,"shippingFee":5,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/700512/8535927223","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbcfbba/7b00d27ca9cbaa29_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516641590","title":"电信诈骗话语模式解读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":12,"shippingFee":5,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/758933/8311513802","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbdaabbc/85b378309fc2d5cf_b.jpg","GoodsImgCount":"2","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508679327","title":"会动的立体小汽车 超级工程车","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.03,"price":15.23,"shippingFee":2.8,"differencePrice":-18.03,"GoodsUrl":"https://book.kongfz.com/1093663/8881837238","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aedffeab/2fc4c6c70426a7cc_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302451402","title":"四川重庆古建筑地图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":132,"price":124,"shippingFee":8,"differencePrice":-132,"GoodsUrl":"https://book.kongfz.com/750186/6510117695","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accbaafc/7966d331b607474d_b.jpg","GoodsImgCount":"2","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560078403","title":"韩国语基础教程4 学生用书韩国西江大学韩国语教育院 著外语教学与研究出版社9787560078403","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.88,"price":4.88,"shippingFee":0,"differencePrice":-4.88,"GoodsUrl":"https://book.kongfz.com/366030/8432554732","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/8c0716368a76c0e7_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802551268","title":"财务报表就像一本故事书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/3092/8441875353","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbafffed/53bad65e508c1600_b.jpg","GoodsImgCount":"5","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564345402","title":"铁路线路与站场","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.9,"price":20.9,"shippingFee":9,"differencePrice":-29.9,"GoodsUrl":"https://book.kongfz.com/900492/8399542894","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23095665/8f6596c31f51ae90_b.jpg","GoodsImgCount":"1","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802543416","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562476443","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513330251","title":"变色龙马克斯","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.52,"price":3.52,"shippingFee":5,"differencePrice":-8.52,"GoodsUrl":"https://book.kongfz.com/716746/8573685578","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efcbddac/009ecce6718456e3_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101115253","title":"古钱极品/中国钱币丛书乙种本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":32,"shippingFee":11,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/23380/8891015518","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaadefed/cc33c8659337be72_b.jpg","GoodsImgCount":"6","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531327493","title":"我恋爱 我容易吗 二手书实拍图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.27,"price":1.77,"shippingFee":5.5,"differencePrice":-7.27,"GoodsUrl":"https://book.kongfz.com/898097/8767090319","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcafceed/ae1ea8b5b115d524_b.jpg","GoodsImgCount":"2","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539198675","title":"我要炼出黄金","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.61,"price":0.11,"shippingFee":2.5,"differencePrice":-2.61,"GoodsUrl":"https://book.kongfz.com/903233/8497337794","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbaedeaf/04d5fa349cc307a6_b.jpg","GoodsImgCount":"7","onSaleCount":405,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117333016","title":"颞下颌关节紊乱病临床诊疗解析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":86.4,"price":77,"shippingFee":9.4,"differencePrice":-86.4,"GoodsUrl":"https://book.kongfz.com/755104/8486452382","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdbcdef/cd8b52f5f18d0870_b.jpg","GoodsImgCount":"11","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533547981","title":"传世中医秘方","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":9,"shippingFee":3,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/566350/8858398045","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edcddbdb/e499acd32b9e1737_b.jpg","GoodsImgCount":"12","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547277898","title":"谭延闿临麻姑仙坛记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":47.35,"price":41.35,"shippingFee":6,"differencePrice":-47.35,"GoodsUrl":"https://book.kongfz.com/533712/7445542462","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdacdfcc/747808d442d68dbd_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122168108","title":"伟大的声音 演讲的力量 高温消毒发货 俞敏洪编 化学工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.199999999999996,"price":35.4,"shippingFee":1.8,"differencePrice":-37.199999999999996,"GoodsUrl":"https://book.kongfz.com/110/8696450340","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffdfacdf/23cd709fa1189c02_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565834691","title":"做最好的自己【全新】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.5,"price":0.5,"shippingFee":3,"differencePrice":-3.5,"GoodsUrl":"https://book.kongfz.com/241879/8585409526","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9187761/e00b22696eefd681_b.jpg","GoodsImgCount":"1","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115558534","title":"我的世界 年鉴2021","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":10,"shippingFee":7,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/696405/6634553010","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afccacdb/d9bfc72e1eb7dc88_b.jpg","GoodsImgCount":"10","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122185471","title":"电子电工技术全图解全集:PLC技术·变频技术速成全图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/760233/6672966429","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfcccaa/b1d730a43c135807_b.jpg","GoodsImgCount":"5","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800471193","title":"紫禁城的黄昏","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":10,"shippingFee":9,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/17163/6977347845","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afedfdcf/0e2cef314cfd9a14_b.jpg","GoodsImgCount":"3","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787574108943","title":"中国古代服饰结构图集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.5,"price":34.5,"shippingFee":7,"differencePrice":-41.5,"GoodsUrl":"https://book.kongfz.com/633822/8836490919","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5126996/a3aa257bc59f9af3_b.jpg","GoodsImgCount":"1","onSaleCount":168,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531004691","title":"邓散木印集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/189253/924912293","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1E/7D/p4YBAFsmYxmAEyJlAAKI5tlWFsM222_b.jpg","GoodsImgCount":"6","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500060833","title":"华罗庚学校初中物理试题解析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/690706/8016636203","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfcaabfb/9f3293f6168eadfd_b.jpg","GoodsImgCount":"10","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539753775","title":"北极熊王:中外动物小说精品","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/437976/8801246014","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbbdecbc/3ca925e159754de4_b.jpg","GoodsImgCount":"2","onSaleCount":140,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547722091","title":"地道英文写作进阶:外刊实用短语句型精选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":57,"price":57,"shippingFee":0,"differencePrice":-57,"GoodsUrl":"https://book.kongfz.com/356195/8896018285","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/c3ee7195f7455908_b.jpg","GoodsImgCount":"6","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302165309","title":"电子商务网站建设实验指导","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.93,"price":13.93,"shippingFee":10,"differencePrice":-23.93,"GoodsUrl":"https://book.kongfz.com/885269/8596565983","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D6/B2/p4YBAFqYvI-ADYiFAAC7RDvbnYE984_b.jpg","GoodsImgCount":"1","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538899429","title":"家有小学生的营养早餐","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.28,"price":0.5,"shippingFee":2.78,"differencePrice":-3.28,"GoodsUrl":"https://book.kongfz.com/785333/8671961291","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdacedec/7f7eb8b6035a3c34_b.jpg","GoodsImgCount":"1","onSaleCount":439,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010086798","title":"家庭文化学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/462357/8563912467","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbebcedf/9544c30b47cda303_b.jpg","GoodsImgCount":"11","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806862339","title":"大画幅摄影","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.85,"price":7.35,"shippingFee":1.5,"differencePrice":-8.85,"GoodsUrl":"https://book.kongfz.com/701775/8774482003","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfdbeabb/07a9faf8ce7aaefc_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572501159","title":"儿童和青少年普拉提 英 切莱斯特 科里 索菲奇 Celeste Corey Zopich 布雷特 霍华德 Brett Howard 道恩玛丽 伊克斯 Dawn Marie Ickes 主编 河南科学技术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.65,"price":15.65,"shippingFee":5,"differencePrice":-20.65,"GoodsUrl":"https://book.kongfz.com/903313/8867129101","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbaecdae/9a66480f20211491_b.jpg","GoodsImgCount":"1","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514222944","title":"洞见 赵昂 文化发展出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.4,"price":1.4,"shippingFee":5,"differencePrice":-6.4,"GoodsUrl":"https://book.kongfz.com/398369/8756316997","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abebbffb/38c9650f51d3487e_b.jpg","GoodsImgCount":"1","onSaleCount":146,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117263764","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787119079493","title":"吃喝玩乐超实用英语会话一本通 希伯伦股份有限公司编 外文出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":4.8,"shippingFee":5,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/180897/8441994084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afffeeaa/477bc761e5ae81c2_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502615178","title":"百战狐狸:职业机构实战操盘讲义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.77,"price":1.27,"shippingFee":5.5,"differencePrice":-6.77,"GoodsUrl":"https://book.kongfz.com/250120/8708646976","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dabebaeb/c9eea535bcbe11db_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561126028","title":"高等学校理工科物理类规划教材:量子力学(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":13,"shippingFee":7,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/217161/6851259518","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbceffdb/21857aa37ee9847a_b.jpg","GoodsImgCount":"4","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787554174623","title":"初一预习视频课英语","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9799999999999995,"price":4.18,"shippingFee":3.8,"differencePrice":-7.9799999999999995,"GoodsUrl":"https://book.kongfz.com/237705/8613570433","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafdfaeb/241850ced0e78c1a_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513533140","title":"英语. 二年级. 上册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.9899999999999998,"price":0.01,"shippingFee":2.98,"differencePrice":-2.9899999999999998,"GoodsUrl":"https://book.kongfz.com/840438/8166411046","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfafdbea/d633d70cee3e5f71_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121436604","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518440917","title":"读醉:宁夏酒庄指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":20,"shippingFee":0,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/10991/8852891015","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addfbadb/e166df1a5914a696_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514507799","title":"斗破苍穹(23)一版一印","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9,"price":0.9,"shippingFee":3,"differencePrice":-3.9,"GoodsUrl":"https://book.kongfz.com/668354/7024201760","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bacbcdcf/c0b24ea31449a10b_b.jpg","GoodsImgCount":"4","onSaleCount":243,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558902406","title":"不一样的圣诞节 达妮拉库洛特,方素珍 少年儿童出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":5.1,"shippingFee":3,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/521005/8337317394","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1B/43/p4YBAFqaO6-ADWX-AACLI7p96U4392_b.jpg","GoodsImgCount":"1","onSaleCount":117,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800420313","title":"难经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":65.9,"price":59.9,"shippingFee":6,"differencePrice":-65.9,"GoodsUrl":"https://book.kongfz.com/169274/8450740779","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbefdeb/17dce85a175b8604_b.jpg","GoodsImgCount":"4","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504747914","title":"王敬之讲田黄 9787504747914 王敬之 著 中国物资出版社 有疑问咨询客服","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.65,"price":12.65,"shippingFee":4,"differencePrice":-16.65,"GoodsUrl":"https://book.kongfz.com/790574/8853963934","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abbddeec/2595703d5b185aa7_b.jpg","GoodsImgCount":"1","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558911934","title":"海豚绘本花园:一家好认真好认真的餐厅","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.51,"price":10.91,"shippingFee":1.6,"differencePrice":-12.51,"GoodsUrl":"https://book.kongfz.com/470338/8091876352","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/16223501/d0ac2cf21ff67db3_b.jpg","GoodsImgCount":"0","onSaleCount":70,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121363634","title":"我超喜欢的趣味数学书 小学四年级 第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.59,"price":6.19,"shippingFee":2.4,"differencePrice":-8.59,"GoodsUrl":"https://book.kongfz.com/692223/8853556029","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adffadfd/7fc165d6fe4fbb20_b.jpg","GoodsImgCount":"1","onSaleCount":139,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509222133","title":"房地产企业全程会计核算与税务处理(第六版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":56,"price":50,"shippingFee":6,"differencePrice":-56,"GoodsUrl":"https://book.kongfz.com/520656/7331763806","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfcdfed/66caec80f6229f38_b.jpg","GoodsImgCount":"4","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510226991","title":"十大业务系列教材——职务犯罪检察业务","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":40,"shippingFee":8,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/584570/8436769476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdeafad/895dbfc10f7deb10_b.jpg","GoodsImgCount":"14","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810756075","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567597013","title":"大夏书系·教育的100种语言:丹麦教育见闻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.5,"price":10,"shippingFee":4.5,"differencePrice":-14.5,"GoodsUrl":"https://book.kongfz.com/585799/8333731294","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14917819/d342c68268bd6844_b.jpg","GoodsImgCount":"5","onSaleCount":90,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506749145","title":"医学衷中参西录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":50,"price":40,"shippingFee":10,"differencePrice":-50,"GoodsUrl":"https://book.kongfz.com/730822/8433255540","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/facdecbd/5cc0c5684378b427_b.jpg","GoodsImgCount":"5","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111288954","title":"供应链物流管理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.1,"price":4.1,"shippingFee":0,"differencePrice":-4.1,"GoodsUrl":"https://book.kongfz.com/733352/8279417108","imgBigUrl":"https://www0.kfzimg.com/G06/M00/58/FA/p4YBAFqcKLyANGCJAAErWD_1er4153_b.jpg","GoodsImgCount":"1","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214287892","title":"海外中国研究丛书·艺术系列 《中正之笔:颜真卿书法与宋代文人政治》赠包","quality":0,"qualityText":"","originalPrice":0,"totalPrice":60.08,"price":60.08,"shippingFee":0,"differencePrice":-60.08,"GoodsUrl":"https://book.kongfz.com/457799/8830585867","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/15505652/82c39efb161a5c45_b.jpg","GoodsImgCount":"1","onSaleCount":117,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501256730","title":"教育就是培养好习惯","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":1.3,"shippingFee":2,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/667558/8863965946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baadebdb/b72ce315488f2b9f_b.jpg","GoodsImgCount":"1","onSaleCount":431,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111326793","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540484958","title":"人类群星闪耀时","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.02,"price":5.42,"shippingFee":1.6,"differencePrice":-7.02,"GoodsUrl":"https://book.kongfz.com/457799/8321235881","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F7/BA/p4YBAFqhnLeANWRTAABg9lSn2Ks131_b.jpg","GoodsImgCount":"1","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556869824","title":"大中华寻宝系列26 新疆寻宝记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.5,"price":6.5,"shippingFee":5,"differencePrice":-11.5,"GoodsUrl":"https://book.kongfz.com/697065/8817518628","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdeffed/4edad2afd5490255_b.jpg","GoodsImgCount":"3","onSaleCount":193,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535429704","title":"少年天子 凌力著 长江文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.99,"price":4.99,"shippingFee":5,"differencePrice":-9.99,"GoodsUrl":"https://book.kongfz.com/1146983/8811740152","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcddced/5334a2f79e1bd2da_b.jpg","GoodsImgCount":"1","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532560868","title":"贾题韬讲坛经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/23153/8780563654","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/effabcae/0243a97a1d72ba14_b.jpg","GoodsImgCount":"15","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507535198","title":"暮色紫禁城 洋帝师眼中的溥仪与近代中国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.25,"price":2.85,"shippingFee":2.4,"differencePrice":-5.25,"GoodsUrl":"https://book.kongfz.com/692223/8222719769","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eabfeccd/807382cae33649cd_b.jpg","GoodsImgCount":"1","onSaleCount":175,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303086641","title":"说话的力量【封面几层书页有被顶破小洞】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":7,"shippingFee":7,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/211464/7174616446","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdceddbd/482a0066db3d5e28_b.jpg","GoodsImgCount":"9","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100034975","title":"美洲三书 扉页有水渍","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/12142/6630865417","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdedcae/cf96f3bd07d5c0df_b.jpg","GoodsImgCount":"7","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506449045","title":"开·合:纽扣拉链的连接艺术(书页干净无笔画。)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/273362/2564607312","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2593/022091c08a2390131d_b.jpg","GoodsImgCount":"4","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302364832","title":"国际物流黄新祥 等主编清华大学出版社9787302364832","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":0.5,"shippingFee":4,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/420387/8678386948","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/12298542/57d47de2dbc7168d_b.jpg","GoodsImgCount":"1","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302025207","title":"实用软件工程 第二版郑人杰等 编著清华大学出版社9787302025207","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.75,"price":3.75,"shippingFee":0,"differencePrice":-3.75,"GoodsUrl":"https://book.kongfz.com/366030/8275536127","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/e72b7e2e2cfde181_b.jpg","GoodsImgCount":"1","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208164208","title":"正版新书现货 宏观航运经济学 9787208164208 (希) 伊莱亚斯·卡拉基索斯, 兰布罗斯·瓦纳维兹著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31.26,"price":26.26,"shippingFee":5,"differencePrice":-31.26,"GoodsUrl":"https://book.kongfz.com/1181534/8500474938","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffaaddac/39f58d121b1b8db4_b.jpg","GoodsImgCount":"1","onSaleCount":67,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533951610","title":"吉姆:吉卜林作品(精装本)2018年1版1印","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.5,"price":25.5,"shippingFee":2,"differencePrice":-27.5,"GoodsUrl":"https://book.kongfz.com/1996/8650425365","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecedaeee/da61038dbe97ad9c_b.jpg","GoodsImgCount":"3","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801739261","title":"秦书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":50,"price":46,"shippingFee":4,"differencePrice":-50,"GoodsUrl":"https://book.kongfz.com/521036/8800425189","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbdafec/d093e26f8cc2c73f_b.jpg","GoodsImgCount":"8","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500690696","title":"边城","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.1,"price":4.1,"shippingFee":0,"differencePrice":-4.1,"GoodsUrl":"https://book.kongfz.com/880899/8678253491","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeedabd/1c5c446cb92761b3_b.jpg","GoodsImgCount":"2","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787570110940","title":"小学生叙事作文 思维导图作文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":1.5,"shippingFee":3,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/783956/8818428031","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffccbfba/91f578f8e6cdd416_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535295439","title":"张景中科普文集:漫话数学(精装典藏版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.84,"price":10.44,"shippingFee":4.4,"differencePrice":-14.84,"GoodsUrl":"https://book.kongfz.com/321650/8279680042","imgBigUrl":"https://www0.kfzimg.com/G06/M00/FE/71/p4YBAFqZclaARCtwAACby3byH0g317_b.jpg","GoodsImgCount":"1","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810462761","title":"大学英语精读-(3)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.14,"price":0.14,"shippingFee":3,"differencePrice":-3.14,"GoodsUrl":"https://book.kongfz.com/1092190/8867494474","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeefbab/adc884da026a2cc7_b.jpg","GoodsImgCount":"1","onSaleCount":257,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544678667","title":"大学英语基础口语教程 3(第2版)学生用书(附光盘)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.14,"price":26.14,"shippingFee":6,"differencePrice":-32.14,"GoodsUrl":"https://book.kongfz.com/444647/8628763673","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dffafdeb/aafce3d1f21adfff_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801567048","title":"中西医结合精神病学/新世纪全国高等医药院校规划教材","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31,"price":31,"shippingFee":0,"differencePrice":-31,"GoodsUrl":"https://book.kongfz.com/698100/8721476824","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceccdbbc/cad5c1ae98d17471_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787576049688","title":"奥数教程 六年级","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.17,"price":20.37,"shippingFee":3.8,"differencePrice":-24.17,"GoodsUrl":"https://book.kongfz.com/624030/8505456371","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4893319/c0ed3496e5c5bbb6_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805183671","title":"晚清小说史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":9,"shippingFee":10,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/179226/7693867371","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbdceed/20efe77062ee6a6f_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500909514","title":"中国武术人名辞典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37,"price":29,"shippingFee":8,"differencePrice":-37,"GoodsUrl":"https://book.kongfz.com/204356/7119094838","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdbdcadd/acc1900622c92670_b.jpg","GoodsImgCount":"7","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533003395","title":"武氏祠汉画像石","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":30,"shippingFee":13,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/24485/304549598","imgBigUrl":"https://www0.kfzimg.com/G03/M01/A0/E8/pYYBAFStYTyAK1C2AAElEuFY5XY899_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200120837","title":"大家小书 中国古代衣食住行","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":6,"shippingFee":4,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/20902/8727045221","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdbdccf/b167e6589d0bbda4_b.jpg","GoodsImgCount":"2","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564071028","title":"蒙台梭利早教方案:0-3岁智力及语言系统训练全书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8600000000000003,"price":1.86,"shippingFee":2,"differencePrice":-3.8600000000000003,"GoodsUrl":"https://book.kongfz.com/624177/8228419387","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadbfcaf/dd1d18ccaac06855_b.jpg","GoodsImgCount":"3","onSaleCount":540,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115602763","title":"孕期冥想心理课","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.04,"price":13.04,"shippingFee":2,"differencePrice":-15.04,"GoodsUrl":"https://book.kongfz.com/738826/8492472031","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbbfecda/4b467c05a7ff0e49_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787202025154","title":"河北通史 民国上卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.11,"price":13.11,"shippingFee":5,"differencePrice":-18.11,"GoodsUrl":"https://book.kongfz.com/1154627/8790091931","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafcfaad/346ccaf3ae2ecc3e_b.jpg","GoodsImgCount":"2","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117139618","title":"中药名方现代研究与应用·四物汤现代研究与应用","quality":0,"qualityText":"","originalPrice":0,"totalPrice":73.77,"price":69.27,"shippingFee":4.5,"differencePrice":-73.77,"GoodsUrl":"https://book.kongfz.com/792669/7996883998","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecacccb/cabb099d4ffa62eb_b.jpg","GoodsImgCount":"2","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200131475","title":"向解放军学习有效率组织的管理之道精编版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.14,"price":3.64,"shippingFee":4.5,"differencePrice":-8.14,"GoodsUrl":"https://book.kongfz.com/884575/8886801797","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdcabfd/c4649fe683ed4712_b.jpg","GoodsImgCount":"1","onSaleCount":335,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569912883","title":"雪球帮:为什么世界是今天这样的?","quality":0,"qualityText":"","originalPrice":0,"totalPrice":93,"price":90,"shippingFee":3,"differencePrice":-93,"GoodsUrl":"https://book.kongfz.com/889351/8359062152","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbeedbcc/46cba327d8dc3331_b.jpg","GoodsImgCount":"6","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801752093","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562622963","title":"大学军事教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.58,"price":0.59,"shippingFee":2.99,"differencePrice":-3.58,"GoodsUrl":"https://book.kongfz.com/784293/8214414858","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daacbdaf/63c3a8955499e0dd_b.jpg","GoodsImgCount":"5","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559617910","title":"和孩子一起去艺术博物馆","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":10,"shippingFee":10,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/265261/8694353313","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaebafae/e8ab83ffb9b4f994_b.jpg","GoodsImgCount":"7","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547260388","title":"全新小学生必背文言文注音版小学一二三四五六年级6-12岁语文教材必背文言文全集阅读小古文经典诵读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.99,"price":3.99,"shippingFee":0,"differencePrice":-3.99,"GoodsUrl":"https://book.kongfz.com/787255/8088016248","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1760/01588e892e1dfa98e4_b.jpg","GoodsImgCount":"1","onSaleCount":141,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502963460","title":"气象统计分析与预报方法(第4版)(首页有字迹)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/269417/7879872024","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdacbfe/4f1c6c5fe9e7ab60_b.jpg","GoodsImgCount":"5","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549850372","title":"意林18周年纪念书.B","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.89,"price":2.89,"shippingFee":0,"differencePrice":-2.89,"GoodsUrl":"https://book.kongfz.com/711444/8643457434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20517473/2b74e8a9e24dfb85_b.jpg","GoodsImgCount":"0","onSaleCount":507,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533643638","title":"魅力口才","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.05,"price":0.05,"shippingFee":5,"differencePrice":-5.05,"GoodsUrl":"https://book.kongfz.com/805022/8631298088","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbcaaac/3ebabf676af610eb_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807553274","title":"妖怪山","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.73,"price":3.23,"shippingFee":4.5,"differencePrice":-7.73,"GoodsUrl":"https://book.kongfz.com/765432/8854682434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbcccae/704257a20943f31f_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532137435","title":"静欲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1.5,"shippingFee":3.5,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/253683/8613551636","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6887408/5c50a923c692899b_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506545433","title":"古今中外心理战100例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":10,"shippingFee":7,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/20331/8181661495","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2868/0269943c229e5f365c_b.jpg","GoodsImgCount":"2","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121451928","title":"人人都能玩赚ChatGPT 高温消毒发货 黄小刀 电子工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.3,"price":2.5,"shippingFee":1.8,"differencePrice":-4.3,"GoodsUrl":"https://book.kongfz.com/259056/8887865046","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceaeddfd/444fd0181d292df1_b.jpg","GoodsImgCount":"1","onSaleCount":333,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201150321","title":"男孩故事 彩图注音有声版 笨笨狼童书坊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.1,"price":15.1,"shippingFee":5,"differencePrice":-20.1,"GoodsUrl":"https://book.kongfz.com/911923/8608024464","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecaccefc/d5a348a22b1aba4d_b.jpg","GoodsImgCount":"1","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115510907","title":"用图表说话如何简单有效地做数据分析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.8,"price":0.8,"shippingFee":5,"differencePrice":-5.8,"GoodsUrl":"https://book.kongfz.com/700512/8743345578","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebafedac/360e136d8247ad57_b.jpg","GoodsImgCount":"1","onSaleCount":119,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530638491","title":"现代西方历史的故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/6856/8690577625","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddddafae/afdd629a50acab25_b.jpg","GoodsImgCount":"14","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539990378","title":"虹口大爆炸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.48,"price":1.48,"shippingFee":5,"differencePrice":-6.48,"GoodsUrl":"https://book.kongfz.com/750161/8211811207","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fffaeced/9cd2a7b72eb0f4ac_b.jpg","GoodsImgCount":"1","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544542524","title":"从课本到奥数难题点拨 小学五年级 全新升级版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.7,"price":3.7,"shippingFee":3,"differencePrice":-6.7,"GoodsUrl":"https://book.kongfz.com/838443/8877688994","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdfddeb/3a9a15a02db2c2a7_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115477217","title":"足球战术与阵形图解:思路解说、案例分析及训练方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.5,"price":15,"shippingFee":5.5,"differencePrice":-20.5,"GoodsUrl":"https://book.kongfz.com/669776/8842681155","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbfdaca/86189842b664a053_b.jpg","GoodsImgCount":"3","onSaleCount":88,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530653180","title":"师陀散文选集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":1,"shippingFee":7,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/784196/8071376720","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbebaacf/387d7985239551bb_b.jpg","GoodsImgCount":"2","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030409836","title":"化学实验教学论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.16,"price":41.16,"shippingFee":0,"differencePrice":-41.16,"GoodsUrl":"https://book.kongfz.com/1120807/8901560862","imgBigUrl":"https://www0.kfzimg.com/G06/M00/57/62/p4YBAFqcDtqAYjz_AABOWff5Al4841_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806033494","title":"猫国春秋","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25.8,"price":20,"shippingFee":5.8,"differencePrice":-25.8,"GoodsUrl":"https://book.kongfz.com/914318/8378334053","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddbfdbf/f07a2f247617134c_b.jpg","GoodsImgCount":"2","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508534701","title":"超级梦想家像天才一样思考","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.05,"price":1.67,"shippingFee":5.38,"differencePrice":-7.05,"GoodsUrl":"https://book.kongfz.com/311927/8249147995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efffecaf/9f5fba8331161639_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530214008","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543231214","title":"吃掉情绪?——和食物的斗争","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":7,"shippingFee":6,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/22916/7541247337","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3008554/b610294fb1f49931_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521750393","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521300789","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509654163","title":"电力市场经济学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":71,"price":65,"shippingFee":6,"differencePrice":-71,"GoodsUrl":"https://book.kongfz.com/722278/8595373194","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edafadbf/7506fe39a352972e_b.jpg","GoodsImgCount":"7","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111321118","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213093449","title":"如何启动黄金圈思维","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53.49,"price":47.99,"shippingFee":5.5,"differencePrice":-53.49,"GoodsUrl":"https://book.kongfz.com/1153783/8871587942","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22135404/73612320da1a5cec_b.jpg","GoodsImgCount":"4","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806451427","title":"鲁迅书话","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.48,"price":19.98,"shippingFee":6.5,"differencePrice":-26.48,"GoodsUrl":"https://book.kongfz.com/18747/5221530317","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abecbfad/69d613574c951abc_b.jpg","GoodsImgCount":"13","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224140859","title":"现代文分类提升练·语文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.890000000000001,"price":3.89,"shippingFee":3,"differencePrice":-6.890000000000001,"GoodsUrl":"https://book.kongfz.com/771462/8574561248","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdbbead/c63a292e6fe6cc59_b.jpg","GoodsImgCount":"4","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550243576","title":"中华国学经典精粹·蒙学家训必读本:三字经·百家姓·千字文·弟子规","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.09,"price":1.09,"shippingFee":2,"differencePrice":-3.09,"GoodsUrl":"https://book.kongfz.com/624177/8743682753","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edccbabb/8141fa7ddeaca3c0_b.jpg","GoodsImgCount":"2","onSaleCount":764,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200030402","title":"苍生 华夏出版社编 北京出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":6.7,"shippingFee":5,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/398369/8618810522","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acabddfb/87e80f30013d13a0_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805937731","title":"二胡启蒙教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.46,"price":15.96,"shippingFee":3.5,"differencePrice":-19.46,"GoodsUrl":"https://book.kongfz.com/648701/8612669580","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C1/CE/p4YBAFqw4IGAHMeGAAECW5fmF94515_b.jpg","GoodsImgCount":"1","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537852838","title":"红楼梦—八十回回解精鉴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":148,"price":148,"shippingFee":0,"differencePrice":-148,"GoodsUrl":"https://book.kongfz.com/16743/7232736010","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdcebef/655584802429999d_b.jpg","GoodsImgCount":"1","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805191225","title":"金元明清词鉴赏辞典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":20,"shippingFee":9,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/883669/7889815425","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deaaefec/b7bf4814e6897207_b.jpg","GoodsImgCount":"6","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546358055","title":"美联储的秘密","quality":0,"qualityText":"","originalPrice":0,"totalPrice":60,"price":50,"shippingFee":10,"differencePrice":-60,"GoodsUrl":"https://book.kongfz.com/593893/8299743873","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eccffbbf/0b8db257b042f3e0_b.jpg","GoodsImgCount":"4","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300062372","title":"戴高乐书系:我的父亲戴高乐","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.5,"price":9.5,"shippingFee":8,"differencePrice":-17.5,"GoodsUrl":"https://book.kongfz.com/180278/8511632615","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccccaffe/e139d6f440938797_b.jpg","GoodsImgCount":"12","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556125227","title":"画知道答案","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.3,"price":6.3,"shippingFee":5,"differencePrice":-11.3,"GoodsUrl":"https://book.kongfz.com/893135/8473380609","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabefcfc/34f7142558ae9ce0_b.jpg","GoodsImgCount":"1","onSaleCount":153,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122135674","title":"正版二手 现代生物化学 第三版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.55,"price":13.55,"shippingFee":0,"differencePrice":-13.55,"GoodsUrl":"https://book.kongfz.com/745839/8780452119","imgBigUrl":"https://www0.kfzimg.com/G06/M00/CC/AF/p4YBAFqYnVSAGvflAAGZAQiLoGs040_b.jpg","GoodsImgCount":"0","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500168171","title":"极简元宇宙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.01,"price":2.01,"shippingFee":2,"differencePrice":-4.01,"GoodsUrl":"https://book.kongfz.com/755561/8129818306","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aeeaaefa/2ab5dd065e2dd348_b.jpg","GoodsImgCount":"2","onSaleCount":248,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549286348","title":"你哄我一下2 签名本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":3,"shippingFee":9,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/381029/8362454944","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddcbeadb/45eac4be85e7634e_b.jpg","GoodsImgCount":"7","onSaleCount":81,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532759095","title":"意大利风光","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":20,"shippingFee":9,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/638707/5528411427","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/17015971/bb54277e8cd73700_b.jpg","GoodsImgCount":"5","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513321174","title":"巴比伦时代","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.1,"price":9.1,"shippingFee":3,"differencePrice":-12.1,"GoodsUrl":"https://book.kongfz.com/808455/8886959658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbbcaeee/dfc8b85fc3bece6e_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807696001","title":"南烟以北","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.08,"price":0.08,"shippingFee":5,"differencePrice":-5.08,"GoodsUrl":"https://book.kongfz.com/878060/8738813937","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aeacadcc/9dbeb09260474062_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545801064","title":"浑家 拙荆 夫人 刘绍铭 上海书店出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":23,"shippingFee":5,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/878060/8575285157","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abaddfea/2da8202ac0a5e1a4_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513108577","title":"新世纪心理与心理健康教育文库9 人格心理学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.34,"price":4.34,"shippingFee":5,"differencePrice":-9.34,"GoodsUrl":"https://book.kongfz.com/23607/8458656434","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deecddbd/1c5a5efca63348db_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535917393","title":"广东茶点:[图集]","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":5,"shippingFee":4,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/769904/8539241272","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcccfcab/4cb012ab8cc45886_b.jpg","GoodsImgCount":"5","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810321556","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800504174","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540213169","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020110971","title":"普希金代表作上尉的女儿 俄 普希金著 磊然译 人民文学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.54,"price":6.54,"shippingFee":5,"differencePrice":-11.54,"GoodsUrl":"https://book.kongfz.com/672601/8830859922","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafebffc/0014b4a285f792dc_b.jpg","GoodsImgCount":"1","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544775854","title":"文学名著经典译林 欧也妮葛朗台 新版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.55,"price":2.55,"shippingFee":3,"differencePrice":-5.55,"GoodsUrl":"https://book.kongfz.com/1181761/8875292333","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbdadbf/1b838edc8ecf18b4_b.jpg","GoodsImgCount":"1","onSaleCount":174,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111523642","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301326640","title":"9787301326640 21世纪教师教育系列~ 外国高等教育史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34.07,"price":29.67,"shippingFee":4.4,"differencePrice":-34.07,"GoodsUrl":"https://book.kongfz.com/27495/8343052854","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4756272/1e6e8023f7617217_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301227671","title":"法律史译评","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.35,"price":15.35,"shippingFee":8,"differencePrice":-23.35,"GoodsUrl":"https://book.kongfz.com/820711/8391037776","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecbffba/bda90fee6c7c1436_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301209974","title":"理解美国:美国文化指南","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.6,"price":2.6,"shippingFee":3,"differencePrice":-5.6,"GoodsUrl":"https://book.kongfz.com/736627/8382555942","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadcbeda/860f249185e56c97_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503400490","title":"名僧录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":15,"shippingFee":5,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/398369/8195974665","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceabbfae/a43ce3e5787c2a5a_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301320327","title":"侠义三千年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":15,"shippingFee":0,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/419134/4596898069","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeedbec/96ecee234f4f480c_b.jpg","GoodsImgCount":"1","onSaleCount":135,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507514704","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113197445","title":"新手学开公司:创业融资常识","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1,"shippingFee":4,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/1210014/8842706502","imgBigUrl":"https://www0.kfzimg.com/G06/M00/04/EC/p4YBAFqZ55SAPmxSAADXtJjYMto864_b.jpg","GoodsImgCount":"1","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534247293","title":"史记故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.4,"price":4.4,"shippingFee":2,"differencePrice":-6.4,"GoodsUrl":"https://book.kongfz.com/667558/8898517027","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaecaffe/a6a58d3c0ae45e3d_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802113022","title":"人类与宗教","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53.2,"price":42,"shippingFee":11.2,"differencePrice":-53.2,"GoodsUrl":"https://book.kongfz.com/890580/8054767633","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decaefca/8f5bc4523bca53c2_b.jpg","GoodsImgCount":"6","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562858201","title":"中日跨文化交际实用教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.71,"price":3.71,"shippingFee":0,"differencePrice":-3.71,"GoodsUrl":"https://book.kongfz.com/892397/8511714742","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/206/24ff4c4e636a8af1_b.jpg","GoodsImgCount":"1","onSaleCount":162,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506007252","title":"十批判书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.95,"price":18.95,"shippingFee":2,"differencePrice":-20.95,"GoodsUrl":"https://book.kongfz.com/877749/8349858098","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/610ef12388c7aae3_b.jpg","GoodsImgCount":"3","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565107610","title":"幼儿园早期阅读资源. 幸福的种子 大班 导读手册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.8,"price":1.8,"shippingFee":3,"differencePrice":-4.8,"GoodsUrl":"https://book.kongfz.com/225395/6586000622","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabdbbce/277268d26c84ada2_b.jpg","GoodsImgCount":"6","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111607915","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100014205","title":"狄德罗传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/565102/7684520458","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afbfdeaf/49dfb3ffb3e393b9_b.jpg","GoodsImgCount":"9","onSaleCount":76,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532360437","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303113255","title":"伦理学经典著作选读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":52,"price":40,"shippingFee":12,"differencePrice":-52,"GoodsUrl":"https://book.kongfz.com/633074/5274343343","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeaeacae/eb4784a0715850e4_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535378569","title":"芭比小公主影院 芭比之公主学校 新版畅销版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9,"price":1.1,"shippingFee":2.8,"differencePrice":-3.9,"GoodsUrl":"https://book.kongfz.com/1093663/8697070175","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcbcecb/74f6ac0d15ec88fc_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567591547","title":"数学家画传·吴文俊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":10,"shippingFee":9,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/507602/7478663525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ababcabf/f04da9e185cf94d2_b.jpg","GoodsImgCount":"6","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500931003","title":":篮球运动教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.41,"price":3.41,"shippingFee":0,"differencePrice":-3.41,"GoodsUrl":"https://book.kongfz.com/20179/8594547518","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F2/CE/p4YBAFqZPEqAaXIFAAD8_GCgzIw699_b.jpg","GoodsImgCount":"1","onSaleCount":366,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521740196","title":"生命密码3:瘟疫传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":11,"shippingFee":6,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/624944/8895449656","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeeeddc/a0cdba4fddc59c7e_b.jpg","GoodsImgCount":"8","onSaleCount":283,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508235202","title":"职业技能培训丛书:电焊工入门与技巧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.24,"price":9.24,"shippingFee":2,"differencePrice":-11.24,"GoodsUrl":"https://book.kongfz.com/767143/8725850207","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdddabbd/5e8247e98682f766_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040506655","title":"西方政治思想史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":4.5,"shippingFee":0,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/638685/8638161704","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/445/5932042ae57cc3ce_b.jpg","GoodsImgCount":"1","onSaleCount":288,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538725421","title":"《希区柯克悬念故事集》-午夜追踪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.41,"price":4.91,"shippingFee":0.5,"differencePrice":-5.41,"GoodsUrl":"https://book.kongfz.com/156492/8287023578","imgBigUrl":"https://www0.kfzimg.com/G06/M00/4A/BF/p4YBAFqbw2CAMtcwAACLHc8-Kmw376_b.jpg","GoodsImgCount":"1","onSaleCount":127,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229148935","title":"少即是多:北欧自由生活意见新版与断舍离并提的人生整理术,樊登读书会创始人樊登亲自讲书推荐","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.92,"price":9.92,"shippingFee":5,"differencePrice":-14.92,"GoodsUrl":"https://book.kongfz.com/400965/8684128772","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddffccde/e26c93777dcaddbf_b.jpg","GoodsImgCount":"1","onSaleCount":140,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040402025","title":"管理心理学第二2版王晓钧 主编高等教育出版社9787040402025","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.72,"price":3.72,"shippingFee":0,"differencePrice":-3.72,"GoodsUrl":"https://book.kongfz.com/248516/8445959763","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/de788cd5eee0ea96_b.jpg","GoodsImgCount":"1","onSaleCount":126,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500081029","title":"曹汝霖一生之回忆","quality":0,"qualityText":"","originalPrice":0,"totalPrice":107.8,"price":102,"shippingFee":5.8,"differencePrice":-107.8,"GoodsUrl":"https://book.kongfz.com/51215/8461562441","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaefdbce/8c562bf3869c30fd_b.jpg","GoodsImgCount":"3","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030656407","title":"大学物理实验","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.1,"price":1.1,"shippingFee":3,"differencePrice":-4.1,"GoodsUrl":"https://book.kongfz.com/891713/8560427068","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aabafbce/ba4bec806b56ffe0_b.jpg","GoodsImgCount":"3","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122180339","title":"白菜与国王,心与手","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.9,"price":4.9,"shippingFee":0,"differencePrice":-4.9,"GoodsUrl":"https://book.kongfz.com/842883/8265631544","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceaeaadf/e35077eb4df6c14d_b.jpg","GoodsImgCount":"20","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547312964","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301302866","title":"法律研习的方法:作业、考试和论文写作","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":3,"shippingFee":10,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/891541/8813242545","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbdeecf/81217bf603b8cd44_b.jpg","GoodsImgCount":"2","onSaleCount":167,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506240789","title":"GRE 语文仿真试题","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.55,"price":2.55,"shippingFee":4,"differencePrice":-6.55,"GoodsUrl":"https://book.kongfz.com/203004/8427844598","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddcafaaf/ac83988286fb5146_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510454585","title":"中国社会科学全球化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35.81,"price":32.31,"shippingFee":3.5,"differencePrice":-35.81,"GoodsUrl":"https://book.kongfz.com/904671/8421015503","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbeeedeb/033d993974bafbe5_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558308178","title":"肖云峰阳光成长小说系列:我的筷子班主任","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":0.5,"shippingFee":4,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/768172/8469297539","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcfddbee/d237e91dc5b7f728_b.jpg","GoodsImgCount":"4","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040024135","title":"艺术概论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.8,"price":1.8,"shippingFee":3,"differencePrice":-4.8,"GoodsUrl":"https://book.kongfz.com/602194/6362597815","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbdecfeb/5da7fa93a557f9aa_b.jpg","GoodsImgCount":"4","onSaleCount":214,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535631329","title":"湖湘篆刻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":90,"price":80,"shippingFee":10,"differencePrice":-90,"GoodsUrl":"https://book.kongfz.com/27254/8219331776","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deeeddaf/74aeb2b4b131791a_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787570612352","title":"小学数学竞赛年鉴:MO2020","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":8,"shippingFee":5,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/426911/7902501351","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/7611848/fda903b85b9134bc_b.jpg","GoodsImgCount":"4","onSaleCount":124,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040285246","title":"正版二手 地球与空间科学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.7,"price":4.7,"shippingFee":0,"differencePrice":-4.7,"GoodsUrl":"https://book.kongfz.com/549116/8836455149","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/917/a23746764cd07ab3_b.jpg","GoodsImgCount":"1","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545812886","title":"三苏评传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":70,"price":58,"shippingFee":12,"differencePrice":-70,"GoodsUrl":"https://book.kongfz.com/23265/8181755497","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addddfac/fa013300f5292783_b.jpg","GoodsImgCount":"7","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510446566","title":"500美元问鼎百事CEO:全球头号女强人卢英德的经营哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/592021/5550361559","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddabecfa/dbc1bfe082195815_b.jpg","GoodsImgCount":"4","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121380440","title":"电气控制与plc技术应用 大中专理科水利电力 刘小春","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":13,"shippingFee":10,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/712076/8416032209","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dccdcafa/dec1e5d38d5f38ee_b.jpg","GoodsImgCount":"6","onSaleCount":53,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542618368","title":"德意志精神漫游","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.31,"price":17.31,"shippingFee":0,"differencePrice":-17.31,"GoodsUrl":"https://book.kongfz.com/919786/8892987379","imgBigUrl":"https://www0.kfzimg.com/G06/M00/6F/AB/p4YBAFqdEgyAcQgWAABHsHusPPc676_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787304008789","title":"艺术赏析概要","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.5,"price":0.5,"shippingFee":3,"differencePrice":-3.5,"GoodsUrl":"https://book.kongfz.com/838443/8859718589","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecffaac/dcae10f91c4a308b_b.jpg","GoodsImgCount":"1","onSaleCount":171,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562296195","title":"考点同步解读 高中化学 选择性必修一 化学反应原理 有笔记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":23,"shippingFee":3,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/211077/7520896879","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceaccafa/ab450e1ce8320b0e_b.jpg","GoodsImgCount":"4","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539947235","title":"铠甲勇士:神秘的陨石1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23.8,"price":18,"shippingFee":5.8,"differencePrice":-23.8,"GoodsUrl":"https://book.kongfz.com/747887/6880955959","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbcefbbc/682c32a3d38bb55d_b.jpg","GoodsImgCount":"7","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115375438","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564817688","title":"二手财经应用文写作9787564817688刘鑫","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":2.6,"shippingFee":2.9,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/750659/8426123356","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/affafccf/9af32edd2ccd7249_b.jpg","GoodsImgCount":"1","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503318443","title":"白登之围3 帝国草原三部曲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.5,"price":7.5,"shippingFee":5,"differencePrice":-12.5,"GoodsUrl":"https://book.kongfz.com/798681/8249118687","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeafdca/8450b15747941350_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787557014858","title":"诡秘之主4","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.46,"price":10.46,"shippingFee":5,"differencePrice":-15.46,"GoodsUrl":"https://book.kongfz.com/771462/8867879036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accbddaf/f6fcebe29db0cd77_b.jpg","GoodsImgCount":"4","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787225013046","title":"黄埔军校百将传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.98,"price":4,"shippingFee":2.98,"differencePrice":-6.98,"GoodsUrl":"https://book.kongfz.com/840438/8881985399","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfedbef/5eadb46b1348058c_b.jpg","GoodsImgCount":"2","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539798387","title":"妄想银行星新一 李盈春安徽少年儿童出版社9787539798387","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.19,"price":5.19,"shippingFee":0,"differencePrice":-5.19,"GoodsUrl":"https://book.kongfz.com/366030/8864056391","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/b0cc76b216b8cb24_b.jpg","GoodsImgCount":"1","onSaleCount":103,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544323086","title":"张家界旅游导读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/778224/6948456565","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfebdfee/1911341d2cf4b3cd_b.jpg","GoodsImgCount":"1","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516922811","title":"集体的失忆 杨定一全部生命系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33.65,"price":30.65,"shippingFee":3,"differencePrice":-33.65,"GoodsUrl":"https://book.kongfz.com/762329/8780202649","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10564427/c571335c6e98d724_b.jpg","GoodsImgCount":"0","onSaleCount":97,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302249085","title":"国际物流:国际贸易中的运作管理(第2版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":73.06,"price":61.06,"shippingFee":12,"differencePrice":-73.06,"GoodsUrl":"https://book.kongfz.com/795825/7334746188","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14523379/51ba99736a77252f_b.jpg","GoodsImgCount":"2","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810035750","title":"截拳道","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/233440/4385393174","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecbecbe/4a6d598b9537b021_b.jpg","GoodsImgCount":"4","onSaleCount":219,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807205913","title":"古玉收藏三百问 鉴宝 大众收藏3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":3,"shippingFee":2.4,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/561672/8415735311","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaccbcc/f11e6347fa684356_b.jpg","GoodsImgCount":"1","onSaleCount":128,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805747637","title":"西塘民间建筑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.1,"price":7.6,"shippingFee":5.5,"differencePrice":-13.1,"GoodsUrl":"https://book.kongfz.com/250120/8810679961","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edccedac/3fe60dbba98c7088_b.jpg","GoodsImgCount":"3","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100186506","title":"钱颖一对话录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":68,"price":58,"shippingFee":10,"differencePrice":-68,"GoodsUrl":"https://book.kongfz.com/17030/8830419237","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffceeede/2e8b3b3f24aa0fb7_b.jpg","GoodsImgCount":"7","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508673073","title":"茶当酒集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":4.5,"shippingFee":3.5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/401024/8872498867","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cacabaec/912f51c1b0fefcbd_b.jpg","GoodsImgCount":"2","onSaleCount":193,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801211453","title":"妇科病外治独特新疗法--内病外治·外病外治独特新疗法丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":15,"shippingFee":5,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/16472/6638610438","imgBigUrl":"https://www0.kfzimg.com/G06/M00/6D/DF/p4YBAFt2j6eAVdSMAAHEQyrZmzw541_b.jpg","GoodsImgCount":"2","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505438132","title":"探索·科学专题百科绘本 :植物的奥秘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":18,"shippingFee":10,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/427935/8151202484","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cffbddcd/b9350271a6c67aac_b.jpg","GoodsImgCount":"4","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113284220","title":"城市轨道交通信号技术(第二版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55.82,"price":49.82,"shippingFee":6,"differencePrice":-55.82,"GoodsUrl":"https://book.kongfz.com/533712/7445893108","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fffddefa/e3eecc18ea41d9a3_b.jpg","GoodsImgCount":"1","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560826462","title":"老上海名宅赏析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21,"price":12,"shippingFee":9,"differencePrice":-21,"GoodsUrl":"https://book.kongfz.com/366445/8584945980","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eabffdea/b445c31f3017c8ec_b.jpg","GoodsImgCount":"7","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805112329","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544786218","title":"小译林国际大奖童书:我的哥哥吹黑管","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.99,"price":4.99,"shippingFee":6,"differencePrice":-10.99,"GoodsUrl":"https://book.kongfz.com/273843/8153980235","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deffacda/736311caf50ede76_b.jpg","GoodsImgCount":"2","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504770356","title":"加盟连锁招商模式顶级设计思维 李松 李爽 9787504770356 中国财富出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.62,"price":5.12,"shippingFee":2.5,"differencePrice":-7.62,"GoodsUrl":"https://book.kongfz.com/237713/8695995574","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/940/a676d512dc1104ae_b.jpg","GoodsImgCount":"1","onSaleCount":165,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539168975","title":"胡平文集:百年误读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.46,"price":16.46,"shippingFee":2,"differencePrice":-18.46,"GoodsUrl":"https://book.kongfz.com/1214248/8872764563","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abbcffec/36a14534af372c1d_b.jpg","GoodsImgCount":"2","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534808944","title":"野叟曝言 下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.879999999999999,"price":4.88,"shippingFee":5,"differencePrice":-9.879999999999999,"GoodsUrl":"https://book.kongfz.com/750161/8080623189","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdfbabfb/bd7efa40cb71d18c_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810367899","title":"杨桃文化·新手食谱系列 41~45","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1,"shippingFee":4,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/891293/8009230723","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbffdadd/2dc8960a8a687a9f_b.jpg","GoodsImgCount":"3","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569931549","title":"看见梵高:孤独与伟大(写给大家的360度艺术启蒙书)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":2,"shippingFee":10,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/453237/8801143694","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acddcacb/fd041a1fd8b81733_b.jpg","GoodsImgCount":"11","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800220272","title":"常见病简易中医疗法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/322775/7550848376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cddccbec/e7fbcfaad8043cd4_b.jpg","GoodsImgCount":"11","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533758684","title":"超级秀·小学英语随堂故事:三年级","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.470000000000002,"price":27.87,"shippingFee":1.6,"differencePrice":-29.470000000000002,"GoodsUrl":"https://book.kongfz.com/470338/8595088507","imgBigUrl":"https://www0.kfzimg.com/G06/M00/FB/9F/p4YBAFqh40GANBXkAADzfKO38vM478_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553122250","title":"中国雕塑史 梁思成 著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.8,"price":18.8,"shippingFee":4,"differencePrice":-22.8,"GoodsUrl":"https://book.kongfz.com/651345/8071240129","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4893319/632f3df473149970_b.jpg","GoodsImgCount":"1","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806890356","title":"金田一探案集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.9,"price":6,"shippingFee":4.9,"differencePrice":-10.9,"GoodsUrl":"https://book.kongfz.com/588886/8817249258","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fddedbab/536b81fb83ff03a4_b.jpg","GoodsImgCount":"6","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122112309","title":"典型液压气动回路600例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27,"price":22,"shippingFee":5,"differencePrice":-27,"GoodsUrl":"https://book.kongfz.com/891499/8842174912","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eefdafbb/afc934890793788e_b.jpg","GoodsImgCount":"6","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500625827","title":"马说陶瓷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.8,"price":32,"shippingFee":5.8,"differencePrice":-37.8,"GoodsUrl":"https://book.kongfz.com/681126/8811277816","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbbbdfeb/569966dc1788862d_b.jpg","GoodsImgCount":"2","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214254863","title":"诗意人生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35.8,"price":29,"shippingFee":6.8,"differencePrice":-35.8,"GoodsUrl":"https://book.kongfz.com/13883/8535361435","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdafdced/5137129530c3717e_b.jpg","GoodsImgCount":"2","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535548887","title":"玻璃城堡","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":5,"shippingFee":4,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/512101/5119116553","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14073610/877fc17482e5334d_b.jpg","GoodsImgCount":"4","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787112273393","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534253621","title":"世界少年文学经典文库 叶圣陶作品精选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.48,"price":0.48,"shippingFee":3,"differencePrice":-3.48,"GoodsUrl":"https://book.kongfz.com/791250/8878211228","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aebcbced/163c2c611b494d45_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810035927","title":"奇门护身暗器练法(一版一印)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":30,"shippingFee":8,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/137604/7693281367","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfafeaac/d69912592ceffad6_b.jpg","GoodsImgCount":"5","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565659676","title":"最新五年中考满分作文大全","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/911923/8806310513","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbadcca/b8961895538c4451_b.jpg","GoodsImgCount":"1","onSaleCount":120,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040519297","title":"中学语文教学设计 郑桂华 9787040519297 高等教育出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.99,"price":5.99,"shippingFee":3,"differencePrice":-8.99,"GoodsUrl":"https://book.kongfz.com/240018/8661063245","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/424/549f95263f2b8049_b.jpg","GoodsImgCount":"0","onSaleCount":137,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550243552","title":"中华国学经典精粹·历史地理必读本:三国志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.8899999999999997,"price":0.11,"shippingFee":2.78,"differencePrice":-2.8899999999999997,"GoodsUrl":"https://book.kongfz.com/785333/8761856529","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbbebddd/b733d5d903cb7b1d_b.jpg","GoodsImgCount":"1","onSaleCount":789,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571103408","title":"中国现当代作家作品专题研究/河南省高等教育自学考试汉语言文学专业本科教材","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":18,"shippingFee":6,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/778238/8492605781","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdfafbca/e1fb525eb35a401b_b.jpg","GoodsImgCount":"12","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532614813","title":"8848我为歌狂终结本漫画版·楚天歌篇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33,"price":25,"shippingFee":8,"differencePrice":-33,"GoodsUrl":"https://book.kongfz.com/778785/7495502311","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecedbdcd/21cedd66962c506c_b.jpg","GoodsImgCount":"5","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539443744","title":"历代书法名迹技法选讲(第1辑):王铎诗卷.","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/18033/8237184983","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdffaecd/9190e5260d56e5dc_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515360607","title":"念力的秘密:2:2","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.2,"price":3.2,"shippingFee":5,"differencePrice":-8.2,"GoodsUrl":"https://book.kongfz.com/180897/8428663147","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dddfcdbd/210a611eee19a8eb_b.jpg","GoodsImgCount":"1","onSaleCount":144,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539154541","title":"绿山墙的安妮","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":4,"shippingFee":4,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/413068/2855797793","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3373/02e31e12e618d9a492_b.jpg","GoodsImgCount":"3","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539731766","title":"虹猫蓝兔七侠传.2","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.5,"price":1.5,"shippingFee":4,"differencePrice":-5.5,"GoodsUrl":"https://book.kongfz.com/198833/8806246345","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5862318/af620f5bab4bd51e_b.jpg","GoodsImgCount":"1","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544131834","title":"郑振铎藏本红楼梦","quality":0,"qualityText":"","originalPrice":0,"totalPrice":73,"price":65,"shippingFee":8,"differencePrice":-73,"GoodsUrl":"https://book.kongfz.com/25093/8534180256","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feabbbed/4e83283b2d4203e9_b.jpg","GoodsImgCount":"9","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511828156","title":"法律方法论 (书面有划横伤)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.9,"price":1.9,"shippingFee":8,"differencePrice":-9.9,"GoodsUrl":"https://book.kongfz.com/271477/8201797030","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffebdafa/76c5fecaf81060f1_b.jpg","GoodsImgCount":"5","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806657607","title":"明清小品选评 高温消毒发货 杨义著 李玫著 岳麓书社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.89,"price":8.09,"shippingFee":1.8,"differencePrice":-9.89,"GoodsUrl":"https://book.kongfz.com/110/8696629154","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caebcddd/7a1589c89b1a04c4_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787523202487","title":"2024世图版第二版英语皮考研真题逐词逐句精讲册 基础试卷版2004-2010曾鸣 张剑 刘京霄世界图书出版公司9787523202487","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":6.9,"shippingFee":0,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/248516/8585451759","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/1b6430cf81a207af_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108043597","title":"坚忍与守望 近代韩江下游的福音姿娘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.05,"price":12.55,"shippingFee":5.5,"differencePrice":-18.05,"GoodsUrl":"https://book.kongfz.com/244432/8796690963","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffeefbad/6720ba4115d67751_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535436375","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787830054038","title":"男科疾病诊断治疗指南(2022 版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":30,"shippingFee":5,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/196496/7650931803","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdebcfdf/e3d909f5ed9a00c8_b.jpg","GoodsImgCount":"6","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111307921","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544714587","title":"猫和老鼠:浪漫的代价","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.5,"price":0.5,"shippingFee":6,"differencePrice":-6.5,"GoodsUrl":"https://book.kongfz.com/570846/8637927606","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbcddccc/42e5131764a6ee79_b.jpg","GoodsImgCount":"7","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111244813","title":"HyperWorks分析应用实例9787111244813李楚琳机械工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.2,"price":16.7,"shippingFee":2.5,"differencePrice":-19.2,"GoodsUrl":"https://book.kongfz.com/1092759/8781226015","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbdedaf/05761766ae23af61_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513352109","title":"早期中国的鬼","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.85,"price":19.85,"shippingFee":3,"differencePrice":-22.85,"GoodsUrl":"https://book.kongfz.com/791250/8897892698","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaceecf/57e4bbc2456853dd_b.jpg","GoodsImgCount":"1","onSaleCount":160,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121253799","title":"体验引擎:游戏设计全景探秘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.48,"price":24.48,"shippingFee":0,"differencePrice":-24.48,"GoodsUrl":"https://book.kongfz.com/492548/8866402714","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C5/31/p4YBAFqYOW-AMOJ-AADBpjNYdUU066_b.jpg","GoodsImgCount":"1","onSaleCount":183,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508396170","title":"国家电网公司生产技能人员职业能力培训通用教材 继电保护及自动","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.45,"price":12.95,"shippingFee":4.5,"differencePrice":-17.45,"GoodsUrl":"https://book.kongfz.com/654834/8738560594","imgBigUrl":"https://www0.kfzimg.com/G06/M00/1C/8B/p4YBAFq7vXaAM8zEAADX1CViJh8024_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213086113","title":"【正版】创造自然9787213086113","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.86,"price":28.86,"shippingFee":0,"differencePrice":-28.86,"GoodsUrl":"https://book.kongfz.com/774490/8790671476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedbbfba/1175b5720aeccb00_b.jpg","GoodsImgCount":"1","onSaleCount":123,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535441058","title":"白色群像","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.2800000000000002,"price":0.28,"shippingFee":3,"differencePrice":-3.2800000000000002,"GoodsUrl":"https://book.kongfz.com/885099/8677269564","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfdeebbc/0c1b88098d1c3758_b.jpg","GoodsImgCount":"4","onSaleCount":513,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506026468","title":"斯大林的女儿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":9,"shippingFee":8,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/280648/7012552257","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdeadaca/fc65bfaccdc26af3_b.jpg","GoodsImgCount":"10","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501948802","title":"高温消毒发货 100种天然食物营养治病全新彩装","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.18,"price":4.38,"shippingFee":1.8,"differencePrice":-6.18,"GoodsUrl":"https://book.kongfz.com/110/8853611246","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbcacbda/2b0d9fb3a6dffbdf_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503424182","title":"政协主席","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.5,"price":6.5,"shippingFee":5,"differencePrice":-11.5,"GoodsUrl":"https://book.kongfz.com/1207201/8642380606","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deffcaae/e40f087108ded6db_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208145405","title":"殷墟青铜器研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33,"price":27,"shippingFee":6,"differencePrice":-33,"GoodsUrl":"https://book.kongfz.com/592236/8433015685","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daafbefb/968585acf2692335_b.jpg","GoodsImgCount":"13","onSaleCount":74,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301244869","title":"俄罗斯文学史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.76,"price":3.26,"shippingFee":1.5,"differencePrice":-4.76,"GoodsUrl":"https://book.kongfz.com/774690/8696568956","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C7/FD/p4YBAFqYQpWAbJXyAAC4ESrSO-U746_b.jpg","GoodsImgCount":"1","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542844064","title":"隐喻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49.8,"price":39.8,"shippingFee":10,"differencePrice":-49.8,"GoodsUrl":"https://book.kongfz.com/302127/7140352552","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AB/1A/p4YBAFr8MQOAND_6AAC1fo4rTZA063_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787568287760","title":"梅兰妮·克莱因儿童心理学:嫉羡与感恩","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.2,"price":11.2,"shippingFee":5,"differencePrice":-16.2,"GoodsUrl":"https://book.kongfz.com/1155304/8779916761","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3038/02939e282aadcbb13b_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532740680","title":"还原论的局限 来自活细胞的训诫","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":26,"shippingFee":3.8,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/1937/8841925682","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccfcafba/14d8bbf616f6cca3_b.jpg","GoodsImgCount":"6","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501056361","title":"嘉德日历2019","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":6,"shippingFee":10,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/593645/7150712837","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eadecbcb/e27d123c6ae6f237_b.jpg","GoodsImgCount":"6","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502848378","title":"怎么选择成长股 美 菲利普 A 费舍 地震出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.75,"price":7.75,"shippingFee":5,"differencePrice":-12.75,"GoodsUrl":"https://book.kongfz.com/180897/8899731120","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecaaabee/4d03e36f79e8d89c_b.jpg","GoodsImgCount":"1","onSaleCount":313,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571404512","title":"真相只有一个","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":1,"shippingFee":4,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/893934/8882047074","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbcdefeb/8e226b7ee365b547_b.jpg","GoodsImgCount":"3","onSaleCount":275,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302649847","title":"微积分","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.14,"price":37.34,"shippingFee":3.8,"differencePrice":-41.14,"GoodsUrl":"https://book.kongfz.com/717628/8773767244","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13270436/44c070d95076cb9a_b.jpg","GoodsImgCount":"1","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513662109","title":"年度经营计划制订与管理企业管理年度计划","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.62,"price":18.62,"shippingFee":6,"differencePrice":-24.62,"GoodsUrl":"https://book.kongfz.com/339693/8767370008","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2196/01b864aa0eea225d39_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101124163","title":"中国兵器史稿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/766211/7869531760","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdaaaae/1ae140e68d413e75_b.jpg","GoodsImgCount":"2","onSaleCount":126,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040212495","title":"肥胖症咨询","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.89,"price":15.89,"shippingFee":6,"differencePrice":-21.89,"GoodsUrl":"https://book.kongfz.com/903355/8146162281","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AB/70/p4YBAFqnmtuAcKiLAACq2BdpEts751_b.jpg","GoodsImgCount":"0","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111536659","title":"创业八讲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9000000000000004,"price":0.2,"shippingFee":3.7,"differencePrice":-3.9000000000000004,"GoodsUrl":"https://book.kongfz.com/682861/6931289851","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afffdaff/55c74a8b7dc93c83_b.jpg","GoodsImgCount":"3","onSaleCount":293,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532785049","title":"旅行的艺术(阿兰·德波顿作品集) [英]阿兰·德波顿 著,南治国 彭俊豪 何世原 译 上海译文出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.4,"price":13.4,"shippingFee":3,"differencePrice":-16.4,"GoodsUrl":"https://book.kongfz.com/521005/8637635084","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2926/0277dc937e68954c4f_b.jpg","GoodsImgCount":"1","onSaleCount":141,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532727308","title":"上尉的女儿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.5,"price":8,"shippingFee":4.5,"differencePrice":-12.5,"GoodsUrl":"https://book.kongfz.com/563726/4981987527","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbfdfcde/746d3d61e7061c4a_b.jpg","GoodsImgCount":"9","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787568028318","title":"说服力 如何讲好一个故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.99,"price":2.29,"shippingFee":3.7,"differencePrice":-5.99,"GoodsUrl":"https://book.kongfz.com/760748/8801361701","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcceffd/a729199af997ee71_b.jpg","GoodsImgCount":"3","onSaleCount":59,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508679709","title":"汉字有意思(精装)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":23,"shippingFee":5,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/735780/8827432116","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accfbccf/622e02efc4893d76_b.jpg","GoodsImgCount":"4","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540479343","title":"聪明人的一张纸工作整理术:完美图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.279999999999999,"price":2.78,"shippingFee":1.5,"differencePrice":-4.279999999999999,"GoodsUrl":"https://book.kongfz.com/772556/7315801571","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D2/B7/p4YBAFqYsP6Abfz2AACosblIHW0452_b.jpg","GoodsImgCount":"1","onSaleCount":324,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546342399","title":"黑色记事本 二手书实拍图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.809999999999999,"price":5.21,"shippingFee":5.6,"differencePrice":-10.809999999999999,"GoodsUrl":"https://book.kongfz.com/899541/8721283986","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/babdebfe/c531fae696961d1c_b.jpg","GoodsImgCount":"1","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121287183","title":"视觉型团队 应用可视化工具开创团队创新新模式双色","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.7,"price":25.7,"shippingFee":5,"differencePrice":-30.7,"GoodsUrl":"https://book.kongfz.com/666339/8521897933","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddddceac/3da6222201dfdb6b_b.jpg","GoodsImgCount":"1","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111134916","title":"4+2什么对企业真正有效","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/847200/8208211887","imgBigUrl":"https://www0.kfzimg.com/G06/M00/FF/A5/p4YBAFqh9_KAOFbPAACEsYfS-Qk627_b.jpg","GoodsImgCount":"1","onSaleCount":101,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030722485","title":"中药炮制学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33.3,"price":33.3,"shippingFee":0,"differencePrice":-33.3,"GoodsUrl":"https://book.kongfz.com/196857/8732055060","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/7445133/1aaae00ef9686a5d_b.jpg","GoodsImgCount":"1","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805236988","title":"红楼梦","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/256283/8754312169","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decabaff/80a154bafe4d9f70_b.jpg","GoodsImgCount":"9","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308080125","title":"文化产业概论(第二版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.01,"price":0.01,"shippingFee":4,"differencePrice":-4.01,"GoodsUrl":"https://book.kongfz.com/781353/7169578229","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baaefbfb/8732ca3425966bcc_b.jpg","GoodsImgCount":"1","onSaleCount":179,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549259618","title":"明朝市井周刊","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9,"price":3.9,"shippingFee":3,"differencePrice":-6.9,"GoodsUrl":"https://book.kongfz.com/783956/8836247359","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aebbfbcf/12ee2b7c2fb85771_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508098586","title":"太平洋地缘政治学:地理与历史之间关系的研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":44,"price":32,"shippingFee":12,"differencePrice":-44,"GoodsUrl":"https://book.kongfz.com/256234/7416926912","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecfdce/6940ef59d0e3093f_b.jpg","GoodsImgCount":"12","onSaleCount":99,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510711213","title":"平安中国年鉴 2023 碟子在","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":7,"shippingFee":5,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/878710/8454275891","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbfedcbc/950dd6c01187f526_b.jpg","GoodsImgCount":"1","onSaleCount":104,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559655479","title":"子不语:完全珍藏版.3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":10,"shippingFee":10,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/624390/6910763145","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eecfcffc/22d5dc8a606de24c_b.jpg","GoodsImgCount":"5","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787204044559","title":"中国偏方全书 肝病 肾病泌尿病","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.08,"price":0.08,"shippingFee":5,"differencePrice":-5.08,"GoodsUrl":"https://book.kongfz.com/716746/8631109464","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcafcfaa/4e57320326499aca_b.jpg","GoodsImgCount":"1","onSaleCount":286,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541445026","title":"魔法少女①——寻找百变裙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6,"price":6,"shippingFee":0,"differencePrice":-6,"GoodsUrl":"https://book.kongfz.com/461620/5735289715","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eefedaae/806a6210a4e2dfb3_b.jpg","GoodsImgCount":"4","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787228064564","title":"中国九十年代诗歌精选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.35,"price":6.35,"shippingFee":5,"differencePrice":-11.35,"GoodsUrl":"https://book.kongfz.com/820017/8795346716","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fffceade/974ba7bca5ddfc42_b.jpg","GoodsImgCount":"2","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224013887","title":"中国善恶报应习俗","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":3,"shippingFee":7,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/679518/7011532548","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddfebbdb/feef7a302dcd8e57_b.jpg","GoodsImgCount":"3","onSaleCount":51,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115597533","title":"新潮职业","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/911923/8655383401","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cebcdddb/6e45ffcdec9a8925_b.jpg","GoodsImgCount":"1","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506073486","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541128509","title":"不会吟诗也会吟 诗词创作十日谈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.96,"price":8.96,"shippingFee":5,"differencePrice":-13.96,"GoodsUrl":"https://book.kongfz.com/798681/8340108119","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecdfddf/da80026a3f1892fe_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545303964","title":"副省长女秘书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2,"shippingFee":5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/1207077/8689348274","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcaebab/610f32d42234c9ec_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308030458","title":"大学写作陈建新 主编浙江大学出版社9787308030458","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.03,"price":4.03,"shippingFee":0,"differencePrice":-4.03,"GoodsUrl":"https://book.kongfz.com/366030/8589381214","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/093b49e8b778b4c2_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544707510","title":"林先生的小孙女","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34.7,"price":29.7,"shippingFee":5,"differencePrice":-34.7,"GoodsUrl":"https://book.kongfz.com/911923/8761066348","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbdfebfb/29358101e6344448_b.jpg","GoodsImgCount":"1","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500923909","title":"陈式太极拳五功八法十三势","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.7,"price":4.9,"shippingFee":5.8,"differencePrice":-10.7,"GoodsUrl":"https://book.kongfz.com/703680/8288986467","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecffcff/7ec83cb4d94bafd5_b.jpg","GoodsImgCount":"3","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506367608","title":"那个骑轮箱来的蜜儿","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/788761/8822390367","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddecfeba/cdd744b263a7e6e1_b.jpg","GoodsImgCount":"1","onSaleCount":108,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505619050","title":"抵岸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":45,"shippingFee":4,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/585018/8894888641","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaafcdcb/89e23d1b5842789f_b.jpg","GoodsImgCount":"8","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522609096","title":"安顿自己 76岁日本女性专家真理子奶奶教你如何过好这一生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":3,"shippingFee":2.4,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/692223/8526088916","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcfbaad/756f18d7352b9e62_b.jpg","GoodsImgCount":"1","onSaleCount":170,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534190711","title":"补益中药实用技巧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.5,"price":3,"shippingFee":3.5,"differencePrice":-6.5,"GoodsUrl":"https://book.kongfz.com/884581/8442926178","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbdcebac/cef24561f15d8822_b.jpg","GoodsImgCount":"5","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500621775","title":"篆刻欣赏 9787500621775","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.65,"price":3.15,"shippingFee":3.5,"differencePrice":-6.65,"GoodsUrl":"https://book.kongfz.com/507381/7533225690","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13271240/a8653532485645de_b.jpg","GoodsImgCount":"1","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108003461","title":"红楼启示录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/398369/8193296634","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfdaabaf/892c48e88bbcdc59_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532139255","title":"考骨纪 北疆生死契 张硕 上海文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/398369/8420118970","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aafafbed/94ce7550b610293d_b.jpg","GoodsImgCount":"1","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519296544","title":"心理学考研重难点1200题","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/135543/8584685391","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbfbfcf/2462ed352d3f44f8_b.jpg","GoodsImgCount":"2","onSaleCount":56,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301279816","title":"贝壳博物馆 博物文库/自然博物馆丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":234,"price":230,"shippingFee":4,"differencePrice":-234,"GoodsUrl":"https://book.kongfz.com/884382/8100768943","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beeeccfa/6424ef37f54fd9bf_b.jpg","GoodsImgCount":"13","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302563273","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301326381","title":"股权、控制权与公司治理:120个实务问题解析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/11146/8755374340","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaaeebd/0672c84311716bdf_b.jpg","GoodsImgCount":"8","onSaleCount":113,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558609701","title":"中外经典故事连环画——中国古代神话故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":13,"shippingFee":0,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/622488/5080907449","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdaebdb/b76efed91207d395_b.jpg","GoodsImgCount":"2","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787571400064","title":"说手—太极拳静思录(承道篇)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42,"price":34,"shippingFee":8,"differencePrice":-42,"GoodsUrl":"https://book.kongfz.com/597518/8053281899","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccecdcda/aeab93b2adf2a81c_b.jpg","GoodsImgCount":"7","onSaleCount":100,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540000103","title":"罗通扫北","quality":0,"qualityText":"","originalPrice":0,"totalPrice":46,"price":46,"shippingFee":0,"differencePrice":-46,"GoodsUrl":"https://book.kongfz.com/370626/7929080243","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aefbedbc/a4fc65d52116f37f_b.jpg","GoodsImgCount":"3","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511327925","title":"读史有智慧用史有学问","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":14,"shippingFee":3,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/268442/8600009342","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bafbcbab/396f0e52bd7a25d9_b.jpg","GoodsImgCount":"9","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787226038857","title":"中国近代文物事业简史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":16,"shippingFee":10,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/15851/688431873","imgBigUrl":"https://www0.kfzimg.com/W03/14/12/141221cee4836b17ae8e215d8c10180e_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540421434","title":"跟我学手风琴弹唱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.8,"price":9.8,"shippingFee":6,"differencePrice":-15.8,"GoodsUrl":"https://book.kongfz.com/257028/1108204319","imgBigUrl":"https://www0.kfzimg.com/G07/M00/E0/92/qoYBAFwjPOCAZqP-AAGp7_le9_0427_b.jpg","GoodsImgCount":"3","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539317311","title":"福建印人传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36,"price":30,"shippingFee":6,"differencePrice":-36,"GoodsUrl":"https://book.kongfz.com/26986/8178082271","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcfccecd/014b311a1df3276d_b.jpg","GoodsImgCount":"4","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787114114298","title":"物流产业发展规划理论与实践","quality":0,"qualityText":"","originalPrice":0,"totalPrice":777780.3,"price":777780.3,"shippingFee":0,"differencePrice":-777780.3,"GoodsUrl":"https://book.kongfz.com/390985/8890465732","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C4/B6/p4YBAFq4r2iAEiqwAAC_IROI4fY072_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806227794","title":"揭开雍正皇帝隐秘的面纱","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.5,"price":7.5,"shippingFee":10,"differencePrice":-17.5,"GoodsUrl":"https://book.kongfz.com/603552/7638624490","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afcbdbda/df84853aea96acc6_b.jpg","GoodsImgCount":"1","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562050445","title":"程序即是惩罚:基层刑事法院的案件处理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.14,"price":9.14,"shippingFee":6,"differencePrice":-15.14,"GoodsUrl":"https://book.kongfz.com/560577/8422900551","imgBigUrl":"https://www0.kfzimg.com/G06/M00/63/D0/p4YBAFq-KauAZ5KrAACo4MqJ-oY907_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512721722","title":"不止文静","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.3500000000000005,"price":1.7,"shippingFee":5.65,"differencePrice":-7.3500000000000005,"GoodsUrl":"https://book.kongfz.com/743642/8767293788","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfeebade/d7b6b7c62b2a40e5_b.jpg","GoodsImgCount":"3","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535795168","title":"第一推动丛书 物理系列:完美理论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":6,"shippingFee":6,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/206084/8817868442","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6137288/629b1a53703318bb_b.jpg","GoodsImgCount":"6","onSaleCount":113,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559623102","title":"顶级销售的111条军规","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.57,"price":7.57,"shippingFee":4,"differencePrice":-11.57,"GoodsUrl":"https://book.kongfz.com/607359/8796692730","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E7/C4/p4YBAFt_h6uANn-6AADhap7U0Cs462_b.jpg","GoodsImgCount":"1","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531214151","title":"名家彩图鉴赏名杉崎由绮琉 琉璃色的天使","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":8,"shippingFee":0,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/208724/6365919000","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6206642/305ac1b89c25cda6_b.jpg","GoodsImgCount":"3","onSaleCount":208,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511883018","title":"中华人民共和国森林法 最新修订版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.54,"price":0.04,"shippingFee":4.5,"differencePrice":-4.54,"GoodsUrl":"https://book.kongfz.com/757209/8460373718","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaedbbba/b0b467ad7807e8c8_b.jpg","GoodsImgCount":"2","onSaleCount":57,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510143618","title":"邦臣小红花 神奇洞洞书 这是什么颜色 北京小红花图书工作室 中国人口出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.73,"price":2.73,"shippingFee":5,"differencePrice":-7.73,"GoodsUrl":"https://book.kongfz.com/263231/8827442067","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daebfcdd/21853a8d3d6b6f4e_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108028310","title":"语文常谈:中学图书馆文库","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":3,"shippingFee":7,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/346280/8715238629","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebecffaa/c0082bbaa022388a_b.jpg","GoodsImgCount":"4","onSaleCount":93,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539050904","title":"图解黄帝内经(中国养生第一书 经典图解畅销版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":10,"shippingFee":4,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/20902/8088357878","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beacfaae/051481bdbde5a4c7_b.jpg","GoodsImgCount":"3","onSaleCount":313,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111326236","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508095950","title":"我命在我也在天:道家筋经内传指略","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":20,"shippingFee":5,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/849894/8780983692","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccfbfbeb/c181eed498b667bd_b.jpg","GoodsImgCount":"6","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535971531","title":"潮式风味点心制作工艺(广东省“粤菜师傅”工程培训教材)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.89,"price":8.89,"shippingFee":5,"differencePrice":-13.89,"GoodsUrl":"https://book.kongfz.com/502929/8245471444","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdfddbb/7d433d18b88839e7_b.jpg","GoodsImgCount":"11","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501400881","title":"谍海沉浮三十年:休.汉布尔顿的双重生涯(//1988-07一版一印馆藏未翻阅自然旧近10品/见描述/2)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":10,"shippingFee":14,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/7229/644810045","imgBigUrl":"https://www0.kfzimg.com/G05/M00/05/41/p4YBAFjFSF2Ab6FaAAClse2zg6k836_b.jpg","GoodsImgCount":"3","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505920514","title":"中国神仙养生大全","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38,"price":28,"shippingFee":10,"differencePrice":-38,"GoodsUrl":"https://book.kongfz.com/233973/8813481496","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafadabd/21780c3c3a50a749_b.jpg","GoodsImgCount":"5","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040433647","title":"环境工程原理第3版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.4699999999999998,"price":0.47,"shippingFee":3,"differencePrice":-3.4699999999999998,"GoodsUrl":"https://book.kongfz.com/830714/8836053658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faddeebf/73e1130a978eb2ab_b.jpg","GoodsImgCount":"1","onSaleCount":333,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562353416","title":"我们这样做生本教育·数学篇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.730000000000004,"price":26.73,"shippingFee":6,"differencePrice":-32.730000000000004,"GoodsUrl":"https://book.kongfz.com/701775/8673274568","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fddbbdea/243269b1eea9ec2d_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208093973","title":"忧伤的老板","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/284909/6860484341","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feeddceb/3070df6c3b2af8ed_b.jpg","GoodsImgCount":"7","onSaleCount":119,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507532890","title":"蒋经国传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.11,"price":15.11,"shippingFee":6,"differencePrice":-21.11,"GoodsUrl":"https://book.kongfz.com/845061/7763922871","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cebaaefb/007eff2770c0243f_b.jpg","GoodsImgCount":"9","onSaleCount":319,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111497929","title":"零基础学内部审计","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":36,"shippingFee":7,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/521179/7169944650","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbfcfaf/ec51ee601eb33d49_b.jpg","GoodsImgCount":"4","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511575678","title":"北京四中语文课:细说诗文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":15,"shippingFee":5,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/902933/8887092520","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edbebdaa/f72f2a49d8f650cd_b.jpg","GoodsImgCount":"4","onSaleCount":136,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559629906","title":"新书-- 后浪·因为我有生活:电影美术师杨占家从艺录(精装)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":7,"shippingFee":7,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/680109/8164552567","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/306/3af6ecaa708cfe4d_b.jpg","GoodsImgCount":"1","onSaleCount":160,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787810035767","title":"三皇炮捶一北京镖局拳术功法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":78,"price":68,"shippingFee":10,"differencePrice":-78,"GoodsUrl":"https://book.kongfz.com/17030/7934731735","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faacbdfe/9dd500da308d84fb_b.jpg","GoodsImgCount":"6","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532256327","title":"中外设计艺术论著精读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.2,"price":7.2,"shippingFee":5,"differencePrice":-12.2,"GoodsUrl":"https://book.kongfz.com/180897/8429017414","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/affbbacd/c725a34076a44bc5_b.jpg","GoodsImgCount":"1","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787576406528","title":"环境法调整范围问题研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.72,"price":13.72,"shippingFee":7,"differencePrice":-20.72,"GoodsUrl":"https://book.kongfz.com/753811/8420113257","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14256494/0c2399ce4c56befd_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530522493","title":"棋魂·光之棋(15)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.8,"price":3.8,"shippingFee":12,"differencePrice":-15.8,"GoodsUrl":"https://book.kongfz.com/259232/3263082368","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efbaeadf/d6e0defb6c2112d3_b.jpg","GoodsImgCount":"3","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115455611","title":"股市T+0交易实战技法图解升级版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.45,"price":6.95,"shippingFee":5.5,"differencePrice":-12.45,"GoodsUrl":"https://book.kongfz.com/898097/8767386927","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/debffbda/75ccfb20d83a74a1_b.jpg","GoodsImgCount":"2","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547717455","title":"来点给力的正能量 让我更加积极向上的故事 做最好的自己","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.52,"price":1.12,"shippingFee":2.4,"differencePrice":-3.52,"GoodsUrl":"https://book.kongfz.com/561672/8424838977","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfafacec/f67f9a463082e593_b.jpg","GoodsImgCount":"1","onSaleCount":116,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303099771","title":"自信的提升","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":15,"shippingFee":0,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/783975/7001458250","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecbbaac/c1db02303b2b0bbc_b.jpg","GoodsImgCount":"5","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513318365","title":"二手昆虫漫话科普经典文库新星","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.49,"price":4.49,"shippingFee":2,"differencePrice":-6.49,"GoodsUrl":"https://book.kongfz.com/769044/7879074016","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caaeebac/90432555072321fe_b.jpg","GoodsImgCount":"3","onSaleCount":214,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117172028","title":"·医学影像学第7版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.88,"price":0.08,"shippingFee":3.8,"differencePrice":-3.88,"GoodsUrl":"https://book.kongfz.com/237705/8801387036","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaddeaff/0a5c6cac3826b2fc_b.jpg","GoodsImgCount":"1","onSaleCount":325,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787312027079","title":"高等学校过渡教材读本 高中数学大学数学基本习题练习高三学生升大学大一新生数学过渡 谢盛刚 中国科学技术大学出版社图书籍","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.37,"price":7.37,"shippingFee":10,"differencePrice":-17.37,"GoodsUrl":"https://book.kongfz.com/374786/8679077396","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11488598/edc93870210278b7_b.jpg","GoodsImgCount":"1","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506731584","title":"孰能无错:创建更加安全的医疗卫生保健系统","quality":0,"qualityText":"","originalPrice":0,"totalPrice":119.47,"price":107.47,"shippingFee":12,"differencePrice":-119.47,"GoodsUrl":"https://book.kongfz.com/912097/8236582135","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23092773/64be6ccad3f4056e_b.jpg","GoodsImgCount":"2","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806325162","title":"股市预测方法大全","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.7,"price":6.7,"shippingFee":5,"differencePrice":-11.7,"GoodsUrl":"https://book.kongfz.com/911923/8760299166","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfafeeed/53759abb4d28ec0a_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501167326","title":"斯大林:鲜为人知的剖面","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.13,"price":19.13,"shippingFee":3,"differencePrice":-22.13,"GoodsUrl":"https://book.kongfz.com/566350/8837106767","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abcfdcca/3069be6490f47334_b.jpg","GoodsImgCount":"6","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544430548","title":"中国近现代学校音乐教育(1840-1949)(1949-1995)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":20,"shippingFee":6,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/27200/6963259840","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeaacada/c8352f4dd943f78f_b.jpg","GoodsImgCount":"5","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121281839","title":"内分泌决定女人健康","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.5,"price":7,"shippingFee":2.5,"differencePrice":-9.5,"GoodsUrl":"https://book.kongfz.com/361618/8008064383","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dccddaee/22195ad9be22f208_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506322751","title":"巴黎 艺术至上","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.9399999999999995,"price":1.94,"shippingFee":5,"differencePrice":-6.9399999999999995,"GoodsUrl":"https://book.kongfz.com/820017/8872308665","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcaabdff/8609546f9f9d59d4_b.jpg","GoodsImgCount":"2","onSaleCount":110,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559437839","title":"遗忘","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":8,"shippingFee":3,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/268442/8358622148","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dceaeeaf/d6f93765fd88c265_b.jpg","GoodsImgCount":"6","onSaleCount":143,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521740288","title":"华为组织力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":15,"shippingFee":9,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/762356/6953163766","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14883503/80b35d52657b3996_b.jpg","GoodsImgCount":"1","onSaleCount":135,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201161969","title":"地球上线.3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.779999999999999,"price":4.77,"shippingFee":0.01,"differencePrice":-4.779999999999999,"GoodsUrl":"https://book.kongfz.com/754078/8661022100","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbacffdf/639fc984f5b2e115_b.jpg","GoodsImgCount":"2","onSaleCount":515,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516116890","title":"美国研究十年回顾(2001-2010)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.1,"price":10.1,"shippingFee":5,"differencePrice":-15.1,"GoodsUrl":"https://book.kongfz.com/619532/7045149457","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdaacece/05f659a51981a4d6_b.jpg","GoodsImgCount":"4","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521715613","title":"航海少年团1·古灯塔的神秘之门","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.89,"price":0.09,"shippingFee":4.8,"differencePrice":-4.89,"GoodsUrl":"https://book.kongfz.com/780405/7827920500","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcabbed/2ac0d0a49357653f_b.jpg","GoodsImgCount":"4","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553734088","title":"神农本草经(精版) 9787553734088","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.86,"price":12.86,"shippingFee":2,"differencePrice":-14.86,"GoodsUrl":"https://book.kongfz.com/755561/8095945895","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cccaedbc/a2944602ab786932_b.jpg","GoodsImgCount":"2","onSaleCount":202,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533935085","title":"各自的朝圣路","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":4.5,"shippingFee":0,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/356195/8895884096","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/a1472ea00606d477_b.jpg","GoodsImgCount":"5","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802504004","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030080509","title":"接口电路入门","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":3,"shippingFee":8,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/737383/6250535451","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdaaaec/4255d8b549208d2b_b.jpg","GoodsImgCount":"6","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508056180","title":"内功是怎样炼成的","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":26.8,"shippingFee":3,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/1087817/8643065121","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adfaaafb/dc1ba998f7f55ecf_b.jpg","GoodsImgCount":"6","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300089089","title":"传播学专业英语教程(第四版) 巴兰 中国人民大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":4.9,"shippingFee":3,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/521005/8353652390","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C6/1B/p4YBAFqYPGyAGqpqAAC62maQM4A311_b.jpg","GoodsImgCount":"1","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787563399789","title":"诗歌读本(学前卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25.22,"price":14.22,"shippingFee":11,"differencePrice":-25.22,"GoodsUrl":"https://book.kongfz.com/832731/7502436066","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22203957/acb0519120203613_b.jpg","GoodsImgCount":"2","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508659121","title":"小熊很忙中英双语厚纸板游戏书:快乐的假期","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":1,"shippingFee":10,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/281327/8827437261","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddaafcaf/7c85a7abd7215d33_b.jpg","GoodsImgCount":"6","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516530399","title":"未来世界","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.690000000000001,"price":6.69,"shippingFee":5,"differencePrice":-11.690000000000001,"GoodsUrl":"https://book.kongfz.com/1212927/8625774682","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabfaeed/effb81294d8913ec_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507305227","title":"从宝塔山到中南海","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":20,"shippingFee":15,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/669739/8486939181","imgBigUrl":"https://www0.kfzimg.com/G07/M00/FA/0C/q4YBAFywU4aAImriAABJ4X3BxME372_b.jpg","GoodsImgCount":"1","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541018961","title":"【涵套装】中国西部太阳谷——得荣:[中英藏文本]","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":26,"shippingFee":9,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/439962/6640113502","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caddfaca/d7cc825d53483bca_b.jpg","GoodsImgCount":"30","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544774277","title":"远处的拉莫","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.93,"price":19.93,"shippingFee":5,"differencePrice":-24.93,"GoodsUrl":"https://book.kongfz.com/202798/8665745337","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcabcbac/c0577cb97558c6f2_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501048014","title":"大美之佛像:犍陀罗艺术(16开精装 全1册)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":104.88,"price":98.88,"shippingFee":6,"differencePrice":-104.88,"GoodsUrl":"https://book.kongfz.com/386071/8241300300","imgBigUrl":"https://www0.kfzimg.com/G06/M00/EB/82/p4YBAFqhN8yAXG-yAADLMdZzwV4982_b.jpg","GoodsImgCount":"1","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547259863","title":"回话的技术","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.7800000000000002,"price":0.78,"shippingFee":2,"differencePrice":-2.7800000000000002,"GoodsUrl":"https://book.kongfz.com/738826/8530510157","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdcadebc/80a28b6c4a823131_b.jpg","GoodsImgCount":"1","onSaleCount":1640,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519102586","title":"【正版二手书籍】 幼儿园科学领域教育精要:关键经验与活动指导 175-5-2-127","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.95,"price":8.95,"shippingFee":2,"differencePrice":-10.95,"GoodsUrl":"https://book.kongfz.com/826462/8673356833","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22052838/3f2484448a8e7784_b.jpg","GoodsImgCount":"3","onSaleCount":105,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533263423","title":"没有秘密长不大","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.01,"price":0.01,"shippingFee":3,"differencePrice":-3.01,"GoodsUrl":"https://book.kongfz.com/891713/7988364522","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdbefbe/fe803e1c2690f4d9_b.jpg","GoodsImgCount":"4","onSaleCount":830,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806598436","title":"佛教灵验记研究:以晋唐为中心","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":40,"shippingFee":8,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/23842/8011951958","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3149222/bc752f79a0734a0f_b.jpg","GoodsImgCount":"5","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564129255","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115352491","title":"Photoshop CS6实战从入门到精通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.5,"price":3.5,"shippingFee":0,"differencePrice":-3.5,"GoodsUrl":"https://book.kongfz.com/372285/8607946044","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbdafff/0e356f4ae5d6050d_b.jpg","GoodsImgCount":"4","onSaleCount":236,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506382298","title":"三重门-十五周年纪念版9787506382298","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.2,"price":3.6,"shippingFee":2.6,"differencePrice":-6.2,"GoodsUrl":"https://book.kongfz.com/20579/8888133382","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfcbdfb/c68163ee23660130_b.jpg","GoodsImgCount":"1","onSaleCount":53,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560381299","title":"拉马努金遗失笔记(第一卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":110,"price":105,"shippingFee":5,"differencePrice":-110,"GoodsUrl":"https://book.kongfz.com/319561/8249081973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcecbafe/c29d43db77317553_b.jpg","GoodsImgCount":"9","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500869016","title":"诡盗团","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.4,"price":10,"shippingFee":5.4,"differencePrice":-15.4,"GoodsUrl":"https://book.kongfz.com/7546/8297358995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abdbfdde/76f2d0edb31829de_b.jpg","GoodsImgCount":"2","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540343927","title":"中华成语全典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":90,"price":78,"shippingFee":12,"differencePrice":-90,"GoodsUrl":"https://book.kongfz.com/602730/8697095825","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbaccafa/924c480acee402ce_b.jpg","GoodsImgCount":"4","onSaleCount":5,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553420394","title":"西方经典哲学之旅系列 荣格的性格哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.859999999999999,"price":0.06,"shippingFee":4.8,"differencePrice":-4.859999999999999,"GoodsUrl":"https://book.kongfz.com/245306/8510038095","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdeafdd/43d52666b500e80f_b.jpg","GoodsImgCount":"1","onSaleCount":188,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502541897","title":"润滑剂与润滑(有水印)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":39,"shippingFee":10,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/353752/8432573477","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deeecfdd/2761ee960fe2bd5b_b.jpg","GoodsImgCount":"6","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572617270","title":"《我准备好了,变老也没关系》","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.9,"price":11.9,"shippingFee":6,"differencePrice":-17.9,"GoodsUrl":"https://book.kongfz.com/901995/8697497893","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13196094/c59e3bd7277ec52d_b.jpg","GoodsImgCount":"1","onSaleCount":161,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508663920","title":"商业区块链 开启加密经济新时代威廉 穆贾雅 著 林华 等 译中信出版社9787508663920","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.01,"price":4.01,"shippingFee":0,"differencePrice":-4.01,"GoodsUrl":"https://book.kongfz.com/248516/8732168980","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/f4e2971f8af4ba85_b.jpg","GoodsImgCount":"1","onSaleCount":331,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308022279","title":"中央银行关金券·金圆券","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":10,"shippingFee":6,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/364294/8442165598","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedfbadc/a39d3b2c67fb7320_b.jpg","GoodsImgCount":"4","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503883880","title":"IUCN自然保护地管理分类应用指南:纪念中国自然保护区建设60周年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/274216/8872061006","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adefaafa/ec00a58c55648b0d_b.jpg","GoodsImgCount":"4","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221041524","title":"大唐西域记全译","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":23,"shippingFee":5,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/1207201/8690378400","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abacbffd/2e48df6c99d72e02_b.jpg","GoodsImgCount":"1","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506748438","title":"国医大师颜德馨","quality":0,"qualityText":"","originalPrice":0,"totalPrice":43,"price":36,"shippingFee":7,"differencePrice":-43,"GoodsUrl":"https://book.kongfz.com/15548/6439625257","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceffcafa/676a35c42ee7db3f_b.jpg","GoodsImgCount":"3","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221158017","title":"我当心理咨询师遇到的那些怪诞事件3","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.8,"price":8,"shippingFee":3.8,"differencePrice":-11.8,"GoodsUrl":"https://book.kongfz.com/198833/7419472199","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/5862318/942b1c4a6bced624_b.jpg","GoodsImgCount":"1","onSaleCount":49,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522604435","title":"安英的魅力口才","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.33,"price":7.33,"shippingFee":3,"differencePrice":-10.33,"GoodsUrl":"https://book.kongfz.com/566350/8859451482","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/15424286/0c9700a9eeda2a28_b.jpg","GoodsImgCount":"1","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787574204058","title":"新编医圣张仲景奇方妙治","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.24,"price":3.24,"shippingFee":5,"differencePrice":-8.24,"GoodsUrl":"https://book.kongfz.com/1154627/8795652570","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfacacce/1f4e1df9d8365907_b.jpg","GoodsImgCount":"2","onSaleCount":246,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547908051","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503232589","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549630356","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111674887","title":"Rhino7犀利建模","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.86,"price":7.86,"shippingFee":0,"differencePrice":-7.86,"GoodsUrl":"https://book.kongfz.com/638685/8631701848","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3656/0329a70d76c057ea6f_b.jpg","GoodsImgCount":"1","onSaleCount":143,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532924899","title":"请大家保护自己的腰/新活力作家文丛","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55.98,"price":45.98,"shippingFee":10,"differencePrice":-55.98,"GoodsUrl":"https://book.kongfz.com/832982/7495387597","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22231533/28e7f7f1bdb87c7f_b.jpg","GoodsImgCount":"2","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502419035","title":"重有色金属冶炼设计手册:冶炼烟气收尘·通用工程(常用数据卷)(藏书\\无笔记\\实物拍摄)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":228,"price":220,"shippingFee":8,"differencePrice":-228,"GoodsUrl":"https://book.kongfz.com/218311/7537560196","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/effdedef/6c145f37a0818a46_b.jpg","GoodsImgCount":"14","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787304093150","title":"DK玩出来的百科:棋子数学游戏(新版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/678667/7919607286","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bffefdbb/7bfd77f54abb77e1_b.jpg","GoodsImgCount":"4","onSaleCount":163,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500475965","title":"精英与资本:转型期中国乡村精英结构变迁的实证研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.4,"price":5,"shippingFee":4.4,"differencePrice":-9.4,"GoodsUrl":"https://book.kongfz.com/12041/8322135237","imgBigUrl":"https://www0.kfzimg.com/G06/M00/2E/97/p4YBAFs0qnmAL_i4AACf9Lup5DI641_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534059308","title":"排球少年!! 2:最高处的风景","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.5,"price":4.5,"shippingFee":6,"differencePrice":-10.5,"GoodsUrl":"https://book.kongfz.com/648064/8020657037","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbfddbcd/2983bfa0f566d3be_b.jpg","GoodsImgCount":"7","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787563392926","title":"浮生:清美凄凉的伶人传奇 馆藏无笔迹","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.2,"price":0.2,"shippingFee":6,"differencePrice":-6.2,"GoodsUrl":"https://book.kongfz.com/180265/5033827968","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feecdbac/ef77ae61ce991e03_b.jpg","GoodsImgCount":"2","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508682945","title":"我的世界就是一座花园","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.6,"price":17.6,"shippingFee":10,"differencePrice":-27.6,"GoodsUrl":"https://book.kongfz.com/901511/8212002579","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caddcbaf/376c04b8d6e29e64_b.jpg","GoodsImgCount":"4","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101040418","title":"三曹资料汇编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":54.42,"price":45.42,"shippingFee":9,"differencePrice":-54.42,"GoodsUrl":"https://book.kongfz.com/797172/8353517037","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21462970/467b1a4dcf01baf8_b.jpg","GoodsImgCount":"1","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530888469","title":"健康有捷径:气血旺 百病消","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/262475/4642903053","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfddfdfd/292f2b4eb304bb3e_b.jpg","GoodsImgCount":"9","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544789332","title":"人文与社会译丛:风险社会","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20,"price":12,"shippingFee":8,"differencePrice":-20,"GoodsUrl":"https://book.kongfz.com/591983/8368601013","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baeafbdb/ba8a68ab686c5496_b.jpg","GoodsImgCount":"5","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201110066","title":"正版 小鹿斑比 费利克斯 萨尔腾一部关于爱 成长与生命的童话 迪士尼同名动画原著小说 儿童文学 迪士尼 果麦图书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":45.5,"price":33.5,"shippingFee":12,"differencePrice":-45.5,"GoodsUrl":"https://book.kongfz.com/765896/6847101073","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20763945/401ff2ad8d22b54c_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521702019","title":"地球","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.93,"price":18.93,"shippingFee":10,"differencePrice":-28.93,"GoodsUrl":"https://book.kongfz.com/791821/8547538750","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/564/6d855bb66320948e_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787121288579","title":"高效运作项目管理办公室:PMO实践、案例和启示 张富民 著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.04,"price":12.04,"shippingFee":0,"differencePrice":-12.04,"GoodsUrl":"https://book.kongfz.com/169647/8662261121","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/3674971/90a67a9cc84613ca_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511361547","title":"股市心理战:一位资深股民的投资哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":35,"price":25,"shippingFee":10,"differencePrice":-35,"GoodsUrl":"https://book.kongfz.com/356104/4811368206","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaefbafe/a5e0de1094aec3d8_b.jpg","GoodsImgCount":"3","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547239438","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800689659","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040274202","title":"设计原理彭澎编著高等教育出版社9787040274202","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.79,"price":4.79,"shippingFee":0,"differencePrice":-4.79,"GoodsUrl":"https://book.kongfz.com/366030/8354018430","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/03d8b190e2261d50_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542847621","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801786029","title":"【原版闪电发货】原《金口诀应用学》(各类实战例题解读)/张得计大小六壬入门四柱学盲派书籍图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":50.4,"price":40.4,"shippingFee":10,"differencePrice":-50.4,"GoodsUrl":"https://book.kongfz.com/274158/7360476472","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9625326/3ee67f794e6b1f58_b.jpg","GoodsImgCount":"2","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787503400032","title":"忆往谈旧录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.1,"price":8.1,"shippingFee":3,"differencePrice":-11.1,"GoodsUrl":"https://book.kongfz.com/577988/7210036783","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdffcae/40a87de7683567d9_b.jpg","GoodsImgCount":"3","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559608710","title":"高敏感是种天赋 拯救全球15亿人的心灵之书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.55,"price":6.05,"shippingFee":1.5,"differencePrice":-7.55,"GoodsUrl":"https://book.kongfz.com/825417/8696502179","imgBigUrl":"https://www0.kfzimg.com/G06/M00/CB/77/p4YBAFqYl1eAXrB-AADwJUlM01E764_b.jpg","GoodsImgCount":"0","onSaleCount":467,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532264643","title":"铠甲勇士·刑天:对战大图鉴1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":20,"shippingFee":8,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/261367/8881674842","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dacfeccc/2c82927f965d5eea_b.jpg","GoodsImgCount":"11","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553443751","title":"菲尔博士率众前来","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":9,"shippingFee":8,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/188947/8481004836","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbdacdf/05ba38b868d0fca8_b.jpg","GoodsImgCount":"7","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305032974","title":"孟子评传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":148,"price":148,"shippingFee":0,"differencePrice":-148,"GoodsUrl":"https://book.kongfz.com/15335/8300858073","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baccaafc/a39615a199559525_b.jpg","GoodsImgCount":"8","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508678993","title":"我愿意等,熊猫先生(单册价格,套装咨询客服)(单册价格,套装咨询客服)(单册价格,套装咨询客服)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.91,"price":7.91,"shippingFee":2,"differencePrice":-9.91,"GoodsUrl":"https://book.kongfz.com/769044/8613050954","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecdbfbdf/00d80d1cc0ca28cc_b.jpg","GoodsImgCount":"2","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538550368","title":"疯了!桂宝(第贰卷)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.09,"price":0.09,"shippingFee":5,"differencePrice":-5.09,"GoodsUrl":"https://book.kongfz.com/11912/5836900069","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbaecaeb/c5c246f371e9cc2a_b.jpg","GoodsImgCount":"4","onSaleCount":161,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532750108","title":"炎夏之都","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32,"price":23,"shippingFee":9,"differencePrice":-32,"GoodsUrl":"https://book.kongfz.com/810477/8511733932","imgBigUrl":"https://www0.kfzimg.com/G06/M00/DE/4B/p4YBAFrUlHCAH8skAAB13jNBPts242_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514302646","title":"素食达人","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.95,"price":4.95,"shippingFee":4,"differencePrice":-8.95,"GoodsUrl":"https://book.kongfz.com/1027325/8690643837","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccafdaaf/ecd79dc361fa7827_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500489559","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787549559299","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115525932","title":"建筑施工会计真账实操全流程演练第2版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.82,"price":6.82,"shippingFee":0,"differencePrice":-6.82,"GoodsUrl":"https://book.kongfz.com/548348/8649348889","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/801/8da2143eeaea7a0b_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302165682","title":"清华大学化学类教材:简明物理化学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":31.78,"price":24.78,"shippingFee":7,"differencePrice":-31.78,"GoodsUrl":"https://book.kongfz.com/722739/8596219163","imgBigUrl":"https://www0.kfzimg.com/G06/M00/42/8C/p4YBAFqbhNuARHsYAAB-WYFXRzQ862_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101100938","title":"宋词三百首","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.780000000000001,"price":4.78,"shippingFee":4,"differencePrice":-8.780000000000001,"GoodsUrl":"https://book.kongfz.com/330788/8429376914","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbaffcff/acaca30e37ab4659_b.jpg","GoodsImgCount":"1","onSaleCount":145,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787800137495","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512679436","title":"原来化学可以这样学 化学奇谈","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.25,"price":0.25,"shippingFee":5,"differencePrice":-5.25,"GoodsUrl":"https://book.kongfz.com/202798/8459717610","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcecdaaf/b6227047461d7a66_b.jpg","GoodsImgCount":"1","onSaleCount":237,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9780375813658","title":"Magic Tree House Books #1-4神奇树屋合辑(1-4)(缺3册)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":4,"shippingFee":8,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/5669/7756604676","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1278/ecde0a6674bba01f_b.jpg","GoodsImgCount":"3","onSaleCount":72,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556828623","title":"苍蝇和大象的足球赛米切尔 恩德20周年纪念版精装","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.86,"price":5.86,"shippingFee":5,"differencePrice":-10.86,"GoodsUrl":"https://book.kongfz.com/911923/8827352288","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dacdaecc/d202436c78aecf55_b.jpg","GoodsImgCount":"1","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300145365","title":"刑法各论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/265019/8666457069","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C7/25/p4YBAFqYP2SACg9mAACfG_cnNJI045_b.jpg","GoodsImgCount":"1","onSaleCount":86,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787551715843","title":"VI设计9787551715843","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.69,"price":0.19,"shippingFee":3.5,"differencePrice":-3.69,"GoodsUrl":"https://book.kongfz.com/1152148/8524904150","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/becaaeef/50d6f4ba2c5a29e3_b.jpg","GoodsImgCount":"3","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532793365","title":"安娜·卡列尼娜的真实故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.8,"price":25,"shippingFee":4.8,"differencePrice":-29.8,"GoodsUrl":"https://book.kongfz.com/567272/8398230717","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abcfbbca/a0f81346232c398b_b.jpg","GoodsImgCount":"1","onSaleCount":124,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556101429","title":"爸爸去哪儿(实用版)超级龙蛋王亲子互动漫画(未拆封)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.5,"price":15,"shippingFee":5.5,"differencePrice":-20.5,"GoodsUrl":"https://book.kongfz.com/346699/4684397376","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/6198840/45e55b1a2a1686ca_b.jpg","GoodsImgCount":"3","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511354785","title":"高效经营法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17,"price":7,"shippingFee":10,"differencePrice":-17,"GoodsUrl":"https://book.kongfz.com/356060/8256005905","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcfceede/8183e6993263453c_b.jpg","GoodsImgCount":"3","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535692023","title":"浮世绘【浦睿文化出品】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.99,"price":22.99,"shippingFee":5,"differencePrice":-27.99,"GoodsUrl":"https://book.kongfz.com/914444/8566543484","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abccddda/84545b02d8c7d573_b.jpg","GoodsImgCount":"8","onSaleCount":151,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787507737172","title":"神农本草经读","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36.14,"price":24.14,"shippingFee":12,"differencePrice":-36.14,"GoodsUrl":"https://book.kongfz.com/795825/7321125946","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14523379/60a9962271d44fca_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787556240944","title":"儿童英语轻松学系列 儿童英语启蒙1000词","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.050000000000001,"price":2.16,"shippingFee":2.89,"differencePrice":-5.050000000000001,"GoodsUrl":"https://book.kongfz.com/785333/8282614242","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebbbeebb/ec1d8b32a5bea2e3_b.jpg","GoodsImgCount":"1","onSaleCount":121,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550042308","title":"丰子恺给孩子的阅读写作课 游记卷 丰子恺著绘 张伟锋点评 白马时光出品 百花洲文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":2.9,"shippingFee":5,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/398369/8726837081","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addfdfdc/53c3f12c6f960ff8_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111667278","title":"IT运维服务管理","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.26,"price":16.26,"shippingFee":0,"differencePrice":-16.26,"GoodsUrl":"https://book.kongfz.com/196857/8731918717","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2750/02491aeaaef30c5f3b_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544490337","title":"白马湖书系 培养真正的阅读者 整本书阅读之理论基础 吴欣歆 上海教育出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.59,"price":7.59,"shippingFee":5,"differencePrice":-12.59,"GoodsUrl":"https://book.kongfz.com/903313/8744997561","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efeeabfe/6b03cfc027eedc60_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539554594","title":"云梦泽屠龙记鬼谷学校 第五卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.01,"price":4.01,"shippingFee":3,"differencePrice":-7.01,"GoodsUrl":"https://book.kongfz.com/1181761/8874528061","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daceffce/ebcdaf1d65f390fb_b.jpg","GoodsImgCount":"1","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309079418","title":"三十七道品偈诵释义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":6,"shippingFee":6,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/386898/7963978478","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daefeadc/063dce8cf89efcab_b.jpg","GoodsImgCount":"3","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535957450","title":"寻味广东丛书:百年老店·广州老食肆与老食语","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":10,"shippingFee":4,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/203004/8386290176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfeebdfa/811d13534a3f61d4_b.jpg","GoodsImgCount":"1","onSaleCount":81,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305022906","title":"数学奥林匹克题典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":17,"shippingFee":7,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/188968/7578688674","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accadcff/4b343540fbb642e0_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787546376806","title":"西游记 吴承恩著 9787546376806 吉林出版集团有限责任公司","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.48,"price":3.98,"shippingFee":2.5,"differencePrice":-6.48,"GoodsUrl":"https://book.kongfz.com/237713/8683926712","imgBigUrl":"https://www0.kfzimg.com/G06/M00/49/0D/p4YBAFqbt_2AQMoYAABFGK4V49k913_b.jpg","GoodsImgCount":"1","onSaleCount":145,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521714074","title":"外国摄影师镜头里的中国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":72,"price":65,"shippingFee":7,"differencePrice":-72,"GoodsUrl":"https://book.kongfz.com/281199/8410912596","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfffacae/d2279aa3b06bc73f_b.jpg","GoodsImgCount":"11","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531171423","title":"嘻哈小天才. 9","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26,"price":16,"shippingFee":10,"differencePrice":-26,"GoodsUrl":"https://book.kongfz.com/497994/8873990567","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afaefffa/165fe0bdd58127cb_b.jpg","GoodsImgCount":"10","onSaleCount":16,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530500606","title":"欧洲绘画简史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.5,"price":5,"shippingFee":6.5,"differencePrice":-11.5,"GoodsUrl":"https://book.kongfz.com/754002/7204027658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdddbbcd/56f24b5b0f8784bb_b.jpg","GoodsImgCount":"4","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787510888489","title":"周易本义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":20,"shippingFee":8,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/228843/6865717081","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdfdfafb/dce8a087d28c2705_b.jpg","GoodsImgCount":"1","onSaleCount":133,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213013386","title":"人生絮语","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":3,"shippingFee":4,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/727057/8432652339","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbacfccd/b9fed35ba00032e8_b.jpg","GoodsImgCount":"7","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506748544","title":"国医大师唐由之","quality":0,"qualityText":"","originalPrice":0,"totalPrice":99.09,"price":90.09,"shippingFee":9,"differencePrice":-99.09,"GoodsUrl":"https://book.kongfz.com/465465/7167355375","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E2/3C/p4YBAFqY552AUUL5AACreTJSD6s208_b.jpg","GoodsImgCount":"1","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501946983","title":"家庭治疗基础","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38.9,"price":33.9,"shippingFee":5,"differencePrice":-38.9,"GoodsUrl":"https://book.kongfz.com/911923/8779777083","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cadeeebc/3589bebebfa3f806_b.jpg","GoodsImgCount":"1","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520822022","title":"中国古琴","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.51,"price":8.51,"shippingFee":3,"differencePrice":-11.51,"GoodsUrl":"https://book.kongfz.com/718844/7361733092","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/19134004/9c42134fc4f080b2_b.jpg","GoodsImgCount":"1","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530149188","title":"正版图书 蒲公英中国儿童文学名家精品丛书:小巫婆的大扫帚(注音版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":15,"shippingFee":10,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/525155/8129835817","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfededad/b9702bb478982502_b.jpg","GoodsImgCount":"9","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309016987","title":"孟子旁通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":11,"shippingFee":2,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/624177/8000572501","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedefadf/97ba0db0d0c9eeef_b.jpg","GoodsImgCount":"3","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544428651","title":"华师大二附中","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.4,"price":5.9,"shippingFee":5.5,"differencePrice":-11.4,"GoodsUrl":"https://book.kongfz.com/1182056/8831011997","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/1632/013b0116920fd5ef7a_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501986002","title":"家具专业英语实务(普通高等教育室内与家具设计专业十二五规划教材)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":47.1,"price":40.7,"shippingFee":6.4,"differencePrice":-47.1,"GoodsUrl":"https://book.kongfz.com/561989/8852981910","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbeebcf/437692bc37429777_b.jpg","GoodsImgCount":"1","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787558606212","title":"正版二手书书画巨匠艺库:傅抱石·傅抱石中国画法要论(精装本)9787558606212","quality":0,"qualityText":"","originalPrice":0,"totalPrice":106,"price":106,"shippingFee":0,"differencePrice":-106,"GoodsUrl":"https://book.kongfz.com/765962/8143826136","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbefebd/2596c704c26b9418_b.jpg","GoodsImgCount":"1","onSaleCount":98,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544878227","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506382014","title":"西班牙在心中:反法西斯诗选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":154,"price":145,"shippingFee":9,"differencePrice":-154,"GoodsUrl":"https://book.kongfz.com/758397/8540606900","imgBigUrl":"https://www0.kfzimg.com/G06/M00/A7/E1/p4YBAFqevjeAUjMWAABuc9xLDZQ430_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500112396","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787517147213","title":"铜雀锁金钗 民国虐心必看榜单神作 高温消毒发货 世味煮茶 中国言实出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":20.4,"price":18.4,"shippingFee":2,"differencePrice":-20.4,"GoodsUrl":"https://book.kongfz.com/1113/8677185936","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbbaede/051a0d80939bf3c7_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506086943","title":"噼里啪啦牙菌来啦","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.99,"price":4.99,"shippingFee":5,"differencePrice":-9.99,"GoodsUrl":"https://book.kongfz.com/375512/8829692617","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccfafccd/0e5374b790a97b04_b.jpg","GoodsImgCount":"4","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530640333","title":"李叔同影事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.35,"price":5.85,"shippingFee":5.5,"differencePrice":-11.35,"GoodsUrl":"https://book.kongfz.com/789796/8145140253","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaaeacdf/bc6e13229b611f82_b.jpg","GoodsImgCount":"14","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539958316","title":"能量场","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32,"price":26,"shippingFee":6,"differencePrice":-32,"GoodsUrl":"https://book.kongfz.com/398434/8881638801","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbaeabc/7827a2f39328e335_b.jpg","GoodsImgCount":"1","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540477240","title":"《发货快》留学口语从头学 赖世雄, 吴纪维 湖南文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.37,"price":6.87,"shippingFee":0.5,"differencePrice":-7.37,"GoodsUrl":"https://book.kongfz.com/156492/8283749461","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4362605/b9672e2119790224_b.jpg","GoodsImgCount":"1","onSaleCount":62,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509629727","title":"破解股市陷阱系列之二:技术指标虚假信号及破解方法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22.38,"price":22.38,"shippingFee":0,"differencePrice":-22.38,"GoodsUrl":"https://book.kongfz.com/792228/8894405073","imgBigUrl":"https://www0.kfzimg.com/G06/M00/27/6C/p4YBAFqaeZOARcnDAACg7i988Vw421_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807243991","title":"5分钟和陌生人成为朋友","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.57,"price":3.57,"shippingFee":0,"differencePrice":-3.57,"GoodsUrl":"https://book.kongfz.com/887808/8391689793","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bccbffae/f8debbec62ce7351_b.jpg","GoodsImgCount":"7","onSaleCount":685,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542644916","title":"诗人的迟缓【全新带塑封】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":21,"shippingFee":8,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/85357/7659329715","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2747720/00bc6133660a1e42_b.jpg","GoodsImgCount":"10","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300279107","title":"自媒体营销施薇 李灿辉 肖凭中国人民大学出版社9787300279107","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.97,"price":3.97,"shippingFee":0,"differencePrice":-3.97,"GoodsUrl":"https://book.kongfz.com/366030/8472562730","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/b8aec546a3b2d85b_b.jpg","GoodsImgCount":"1","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806749012","title":"中央美术学院教学素描典藏2:油画系1978级至2000级","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":39,"shippingFee":10,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/353476/8412551966","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdfbdcaf/03d7eb67b33a5434_b.jpg","GoodsImgCount":"8","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508612690","title":"美国怎么了?:一个自由主义者的良知","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":3.8,"shippingFee":0,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/356195/8832243949","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/10764816/39296172e9a70322_b.jpg","GoodsImgCount":"5","onSaleCount":688,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530914144","title":"外国文学小百科","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":5,"shippingFee":8,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/266365/1600675441","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/459/5bec61e229676ba7_b.jpg","GoodsImgCount":"5","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218123943","title":"早起的奇迹:那些能够在早晨8:00前改变人生的秘密","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.6,"price":6.6,"shippingFee":4,"differencePrice":-10.6,"GoodsUrl":"https://book.kongfz.com/1210014/8818511610","imgBigUrl":"https://www0.kfzimg.com/G06/M00/BE/35/p4YBAFsjew-AZMa4AADQy1ZsI-E761_b.jpg","GoodsImgCount":"0","onSaleCount":800,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559468185","title":"今日喜你(2)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30.18,"price":27.28,"shippingFee":2.9,"differencePrice":-30.18,"GoodsUrl":"https://book.kongfz.com/566350/8416910242","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfadadcb/ab01eb1968feebe1_b.jpg","GoodsImgCount":"2","onSaleCount":4,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806769300","title":"上海电影图史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.41,"price":11.41,"shippingFee":2,"differencePrice":-13.41,"GoodsUrl":"https://book.kongfz.com/769034/8690883878","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdebedb/8a4108e8115dcd59_b.jpg","GoodsImgCount":"3","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787517503569","title":"2019年政策粮食库存大清查培训教材 经济理论、法规 政策粮食库存数量和质量大清查部际协调机制办公室编 新华正版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.96,"price":0.06,"shippingFee":7.9,"differencePrice":-7.96,"GoodsUrl":"https://book.kongfz.com/266593/8181243192","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffeffcdf/08facbab7c467c40_b.jpg","GoodsImgCount":"3","onSaleCount":48,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218112039","title":"走进客家历史田野","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.67,"price":13.67,"shippingFee":2,"differencePrice":-15.67,"GoodsUrl":"https://book.kongfz.com/877749/8552934938","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/dbe28f6f66ba679c_b.jpg","GoodsImgCount":"2","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806460733","title":"千古名赋 咬文嚼字书林 吟诵卷 高建中选注 上海文化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.280000000000001,"price":7.28,"shippingFee":5,"differencePrice":-12.280000000000001,"GoodsUrl":"https://book.kongfz.com/180897/8848284913","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feefcbda/544e560d07370a8f_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221126634","title":"在血与火中穿行","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.4399999999999995,"price":1.44,"shippingFee":3,"differencePrice":-4.4399999999999995,"GoodsUrl":"https://book.kongfz.com/371891/3670304267","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cafcdcea/832f209afe7f1e48_b.jpg","GoodsImgCount":"7","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501035120","title":"吴门篆刻史研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.46,"price":28.96,"shippingFee":3.5,"differencePrice":-32.46,"GoodsUrl":"https://book.kongfz.com/904671/8420602978","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dedcceac/a3f246f9df94771a_b.jpg","GoodsImgCount":"1","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522901176","title":"烹饪原料学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":9,"shippingFee":7,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/791901/8236858701","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbaafabd/d14d90ded1b4853a_b.jpg","GoodsImgCount":"14","onSaleCount":37,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515304786","title":"器材大师2佳能EOS60D数码单反摄影完全攻略","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.05,"price":7.55,"shippingFee":4.5,"differencePrice":-12.05,"GoodsUrl":"https://book.kongfz.com/531994/8713723345","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfaaedc/5774b1aee3694d8d_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535557865","title":"经济学大纲李达著湖南教育出版社正版马克思主义经济学教科书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":96.60000000000001,"price":86.7,"shippingFee":9.9,"differencePrice":-96.60000000000001,"GoodsUrl":"https://book.kongfz.com/498749/7330285594","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/13768817/f620e30b590271c7_b.jpg","GoodsImgCount":"5","onSaleCount":4,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100007986","title":"外国地名译名手册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":10,"shippingFee":3,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/783956/8818059184","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddadbdae/0c467f31d5f788c4_b.jpg","GoodsImgCount":"1","onSaleCount":118,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807283690","title":"饭前好汤","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.49,"price":1.51,"shippingFee":2.98,"differencePrice":-4.49,"GoodsUrl":"https://book.kongfz.com/761854/8327314613","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbeddfff/771d2b0ef4627887_b.jpg","GoodsImgCount":"2","onSaleCount":50,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501946822","title":"发展心理学:心理学导读系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":10,"shippingFee":8,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/619676/8100134597","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfebddff/67fab02ba70db394_b.jpg","GoodsImgCount":"10","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020152513","title":"哈利 波特与密室1 英 J K 罗琳著 马爱农 马爱新译 人民文学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.02,"price":2.02,"shippingFee":5,"differencePrice":-7.02,"GoodsUrl":"https://book.kongfz.com/180897/8899464885","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdaeaadb/03de942e85445e90_b.jpg","GoodsImgCount":"1","onSaleCount":192,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301138731","title":"经济发展与转型 思潮 战略与自生能力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.75,"price":1.75,"shippingFee":5,"differencePrice":-6.75,"GoodsUrl":"https://book.kongfz.com/263231/8460658424","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfcfefff/4a059682c31d1bf7_b.jpg","GoodsImgCount":"1","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122145031","title":"人生没有假如 一个 渐冻人 的悟与行 王甲著 化学工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/1146983/8773150111","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddecdabb/1a7c05d00ab28762_b.jpg","GoodsImgCount":"1","onSaleCount":200,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807657590","title":"楚留香新传4:新月传奇·午夜兰花","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":11,"shippingFee":8,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/623665/8695112105","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeaacdc/c5c542d15f9601b9_b.jpg","GoodsImgCount":"9","onSaleCount":81,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553443133","title":"星火英语·专4新题型标准阅读180篇","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.86,"price":0.06,"shippingFee":3.8,"differencePrice":-3.86,"GoodsUrl":"https://book.kongfz.com/237705/8785081658","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffdeffbe/1fadee5fe9aa9939_b.jpg","GoodsImgCount":"1","onSaleCount":75,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020073948","title":"思无邪","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.6,"price":0.6,"shippingFee":3,"differencePrice":-3.6,"GoodsUrl":"https://book.kongfz.com/903324/8684232524","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabbfacc/a28a9fc194d8bb7e_b.jpg","GoodsImgCount":"4","onSaleCount":552,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787554709719","title":"中国线描 钟馗迎祥纳福百图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":7,"shippingFee":5,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/735086/6940082430","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfdddfbc/d60edd964b638b70_b.jpg","GoodsImgCount":"5","onSaleCount":95,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111527077","title":"质量总监成长记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28,"price":24.2,"shippingFee":3.8,"differencePrice":-28,"GoodsUrl":"https://book.kongfz.com/237705/8642867339","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedfaddf/ef6b31285894943a_b.jpg","GoodsImgCount":"1","onSaleCount":44,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521723311","title":"地球的故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":111.96,"price":102.96,"shippingFee":9,"differencePrice":-111.96,"GoodsUrl":"https://book.kongfz.com/518589/8629261141","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3457/02f88e006ed44dea44_b.jpg","GoodsImgCount":"1","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787502850449","title":"十年三","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.21,"price":2.21,"shippingFee":5,"differencePrice":-7.21,"GoodsUrl":"https://book.kongfz.com/714758/7591149701","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/badfefcf/bfbebc21eedd5e0e_b.jpg","GoodsImgCount":"2","onSaleCount":221,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513256698","title":"中国孩子中医养:坐月子怎么吃(全彩)用适合中国人的方式让宝妈不落病奶水足,宝宝不生病长得壮!","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/462171/8660821950","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbebeecf/2f6e7e0bf01a00d5_b.jpg","GoodsImgCount":"2","onSaleCount":89,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542621641","title":"近代私法史下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":97,"price":93,"shippingFee":4,"differencePrice":-97,"GoodsUrl":"https://book.kongfz.com/330788/8423978555","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeffbcd/a893aaab265655e0_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787542837875","title":"相对论的意义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/246207/8481578074","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfabecbe/a2e86389c5114683_b.jpg","GoodsImgCount":"6","onSaleCount":22,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500421900","title":"佛陀和原始佛教思想","quality":0,"qualityText":"","originalPrice":0,"totalPrice":76.92,"price":71.42,"shippingFee":5.5,"differencePrice":-76.92,"GoodsUrl":"https://book.kongfz.com/250120/8708990278","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddddeaad/33b05c5af02f72b6_b.jpg","GoodsImgCount":"3","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532158263","title":"眼睛游戏 二手书实拍图","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.719999999999999,"price":7.12,"shippingFee":5.6,"differencePrice":-12.719999999999999,"GoodsUrl":"https://book.kongfz.com/899541/8749220703","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecfdeda/8b6bf25d96064288_b.jpg","GoodsImgCount":"1","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111669531","title":"SiC/GaN功率半导体封装和可靠性评估技术","quality":0,"qualityText":"","originalPrice":0,"totalPrice":45.27,"price":38.27,"shippingFee":7,"differencePrice":-45.27,"GoodsUrl":"https://book.kongfz.com/162938/8886458225","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3374/02e33f6a36d6a2b377_b.jpg","GoodsImgCount":"1","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518033645","title":"为什么你说话别人不爱听张鸿9787518033645","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.3,"price":0.5,"shippingFee":2.8,"differencePrice":-3.3,"GoodsUrl":"https://book.kongfz.com/881983/7867281773","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaebadcb/3cd42d6ced8893f8_b.jpg","GoodsImgCount":"1","onSaleCount":550,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787543981515","title":"从陪伴到放手:复旦五浦汇丛书-说李白黄玉峰","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13,"price":8,"shippingFee":5,"differencePrice":-13,"GoodsUrl":"https://book.kongfz.com/15335/8689567387","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcbfadf/be78bc3cc126b571_b.jpg","GoodsImgCount":"4","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505740570","title":"七根凶简渔线人偶仙人指路 尾鱼 中国友谊出版公司","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.71,"price":10.71,"shippingFee":5,"differencePrice":-15.71,"GoodsUrl":"https://book.kongfz.com/903313/8601974525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaecddef/9c5814706496e1ad_b.jpg","GoodsImgCount":"1","onSaleCount":164,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111604518","title":"数据化运营:系统方法与实践案例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.61,"price":8.61,"shippingFee":0,"differencePrice":-8.61,"GoodsUrl":"https://book.kongfz.com/768603/8897179135","imgBigUrl":"https://www0.kfzimg.com/G06/M00/0A/A8/p4YBAFuMo-KAabDXAABizTiDPo4865_b.jpg","GoodsImgCount":"1","onSaleCount":136,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544733434","title":"战争临到美国:丘吉尔第二次世界大战回忆录06","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.83,"price":8.83,"shippingFee":2,"differencePrice":-10.83,"GoodsUrl":"https://book.kongfz.com/754405/8464078588","imgBigUrl":"https://www0.kfzimg.com/G06/M00/AD/60/p4YBAFqfHMGAE36pAAEpfYi4KYI348_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802031623","title":"冯德全早教方案:三岁缔造一生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9,"price":0.9,"shippingFee":3,"differencePrice":-3.9,"GoodsUrl":"https://book.kongfz.com/832065/8677106895","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E4/42/p4YBAFqY74iAIP61AADPFXvXBAk285_b.jpg","GoodsImgCount":"1","onSaleCount":287,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787112243693","title":"自然与道德(古代永州地区城市规划设计研究)/人居环境科学丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":51.37,"price":49.37,"shippingFee":2,"differencePrice":-51.37,"GoodsUrl":"https://book.kongfz.com/476106/8289767243","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdfbdcfc/d5c28fc209e2480f_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504662774","title":"老科学家学术成长资料采集工程丛书国科学院院士传记丛书大音希声应崇福传 王传超著 国科学技术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.1,"price":6.1,"shippingFee":5,"differencePrice":-11.1,"GoodsUrl":"https://book.kongfz.com/911923/8642786730","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eedbfedb/0ee80689f3f1f141_b.jpg","GoodsImgCount":"1","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532763399","title":"第二性","quality":0,"qualityText":"","originalPrice":0,"totalPrice":48,"price":39,"shippingFee":9,"differencePrice":-48,"GoodsUrl":"https://book.kongfz.com/24286/8655519438","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdbbcff/11326043b66b78d8_b.jpg","GoodsImgCount":"8","onSaleCount":208,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787221181442","title":"西游密档 死亡诅咒","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.190000000000001,"price":6.19,"shippingFee":3,"differencePrice":-9.190000000000001,"GoodsUrl":"https://book.kongfz.com/774181/8822974772","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/16365868/be960223de05f0da_b.jpg","GoodsImgCount":"1","onSaleCount":107,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108056283","title":"窥视日本","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.4,"price":14.4,"shippingFee":5,"differencePrice":-19.4,"GoodsUrl":"https://book.kongfz.com/640398/8325622171","imgBigUrl":"https://www0.kfzimg.com/G06/M00/61/9C/p4YBAFqctU6AC_foAAC3m52T-Pg635_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522510606","title":"别再说我恋爱脑 亲密关系 金钱与自我 孙能能 九州出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":2.9,"shippingFee":5,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/878060/8575274097","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeedfbcd/cf34c35618e4846a_b.jpg","GoodsImgCount":"1","onSaleCount":185,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010136479","title":"日本如何面对历史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.9,"price":4.9,"shippingFee":5,"differencePrice":-9.9,"GoodsUrl":"https://book.kongfz.com/398369/8886414153","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeabacd/414f2354130e7c2b_b.jpg","GoodsImgCount":"1","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537863407","title":"沈从文全集·补遗卷(历经十七年搜集、整理的遗落于《沈从文全集》之外的篇目)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":151.8,"price":151.8,"shippingFee":0,"differencePrice":-151.8,"GoodsUrl":"https://book.kongfz.com/506993/8197585884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddbdadc/863af2d42f64a712_b.jpg","GoodsImgCount":"4","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564365103","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787512501010","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534069109","title":"画猫.雅宋:宋朝风情绘卷 16开 原价68元 ,画集以猫拟人,用千姿百态的猫咪演绎宋朝的绝代佳人、名士才子、休闲娱乐、生活习俗以及饮食文化等内容,收录五十张插画,分为【宋朝红颜谱】【宋朝才俊传】【宋朝闲乐篇】【宋朝百家事】【宋朝食事说】五大部分,展现出独特的宋朝风貌。","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":16,"shippingFee":0,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/22178/8842692481","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabfaccc/296ab20dabec1d3d_b.jpg","GoodsImgCount":"8","onSaleCount":68,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787555102571","title":"你了解动物朋友吗/思考的魅力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.88,"price":0.08,"shippingFee":3.8,"differencePrice":-3.88,"GoodsUrl":"https://book.kongfz.com/237705/8818015350","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddbeada/454883a43146e865_b.jpg","GoodsImgCount":"1","onSaleCount":96,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801273963","title":"心灵导师 情绪管理全书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.6,"price":0.6,"shippingFee":3,"differencePrice":-3.6,"GoodsUrl":"https://book.kongfz.com/791250/8376938616","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daafbaca/99cdf254dc0503cf_b.jpg","GoodsImgCount":"1","onSaleCount":328,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550285811","title":"很老很老的老偏方 :","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.06,"price":4.05,"shippingFee":0.01,"differencePrice":-4.06,"GoodsUrl":"https://book.kongfz.com/778027/8309893135","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eafeceea/577f1db4f57123fd_b.jpg","GoodsImgCount":"5","onSaleCount":622,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504468079","title":"煤矿 科学环境风水学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.8,"price":7.8,"shippingFee":5,"differencePrice":-12.8,"GoodsUrl":"https://book.kongfz.com/903313/8491513788","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23176617/284894c1eaa3b820_b.jpg","GoodsImgCount":"2","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787102080901","title":"中华砚文化汇典:砚谱卷:归云楼砚谱新编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":118.48,"price":114.08,"shippingFee":4.4,"differencePrice":-118.48,"GoodsUrl":"https://book.kongfz.com/27495/8065738536","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/14256494/e9d0ec6a139e5a6d_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122387813","title":"变频器故障检修260例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":46.2,"price":40.2,"shippingFee":6,"differencePrice":-46.2,"GoodsUrl":"https://book.kongfz.com/1118298/8825504310","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/7445133/6b80c75aef1c1c8d_b.jpg","GoodsImgCount":"1","onSaleCount":64,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530415702","title":"小学生作文大全 创新作文","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.1,"price":0.1,"shippingFee":3,"differencePrice":-3.1,"GoodsUrl":"https://book.kongfz.com/371891/5644920378","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acedfbbf/2d736b34bda93f2c_b.jpg","GoodsImgCount":"3","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509141892","title":"30年临证实验录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55.92,"price":45.92,"shippingFee":10,"differencePrice":-55.92,"GoodsUrl":"https://book.kongfz.com/833207/7490953622","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22165297/2cd24e3e0d92cfc5_b.jpg","GoodsImgCount":"2","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201161693","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108009234","title":"大剖面:不可思议的剖面","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53,"price":45,"shippingFee":8,"differencePrice":-53,"GoodsUrl":"https://book.kongfz.com/310577/5906903518","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dedcfdcb/ee738917471fe03f_b.jpg","GoodsImgCount":"6","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515406466","title":"回忆萧华:纪念开国上将萧华诞辰100周年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":69,"price":60,"shippingFee":9,"differencePrice":-69,"GoodsUrl":"https://book.kongfz.com/634974/8146082829","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addeffcf/50b393dd54382db6_b.jpg","GoodsImgCount":"6","onSaleCount":27,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505907294","title":"人类性爱史话","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.5,"price":1.5,"shippingFee":5,"differencePrice":-6.5,"GoodsUrl":"https://book.kongfz.com/890432/8719655764","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fddffafa/1b2b73ba2dc29f83_b.jpg","GoodsImgCount":"1","onSaleCount":177,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787806155073","title":"金点子赚大钱赚钱点子 金 字系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.1,"price":0.1,"shippingFee":5,"differencePrice":-5.1,"GoodsUrl":"https://book.kongfz.com/1207201/8801350603","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddccedcf/bc869c63b26b2662_b.jpg","GoodsImgCount":"1","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787303119752","title":"20世纪西方文论新编 陈太胜 9787303119752 北京师范大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.53,"price":1.53,"shippingFee":3,"differencePrice":-4.53,"GoodsUrl":"https://book.kongfz.com/240018/8665248260","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C8/18/p4YBAFqotxaAffdjAADUpAcClLs234_b.jpg","GoodsImgCount":"1","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541126895","title":"三国演义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.29,"price":3.79,"shippingFee":2.5,"differencePrice":-6.29,"GoodsUrl":"https://book.kongfz.com/782278/8848213757","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afffccde/20b47fe8625e47a6_b.jpg","GoodsImgCount":"1","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500436867","title":"二手正版在下沉、下沉的世界里上升、上升9787500436867","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":4,"shippingFee":0,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/765962/6746217821","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eaeeefbd/ccebe6c255823c7a_b.jpg","GoodsImgCount":"1","onSaleCount":60,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553313368","title":"不会说话,你就输了","quality":0,"qualityText":"","originalPrice":0,"totalPrice":2.9,"price":0.9,"shippingFee":2,"differencePrice":-2.9,"GoodsUrl":"https://book.kongfz.com/738826/8619357112","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adcaaddb/f1b58548dcfe64be_b.jpg","GoodsImgCount":"1","onSaleCount":1327,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787576007565","title":"从课本到奥数 7年级 第2学期 A版 第3版·视频讲解版 吴建平熊斌主编 华东师范大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.25,"price":14.75,"shippingFee":3.5,"differencePrice":-18.25,"GoodsUrl":"https://book.kongfz.com/610883/8510316729","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ecfaafff/60aabde21e985ecd_b.jpg","GoodsImgCount":"5","onSaleCount":54,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787557548193","title":"我叫丁 隐形的朋友 杨校艳 吉林美术出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":4.8,"shippingFee":5,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/263231/8583717995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/befeffda/7748c91965d89732_b.jpg","GoodsImgCount":"1","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559620668","title":"你要如何衡量你的人生","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.36,"price":9.36,"shippingFee":5,"differencePrice":-14.36,"GoodsUrl":"https://book.kongfz.com/750161/8749953015","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddafebab/9ee757288f1baef8_b.jpg","GoodsImgCount":"1","onSaleCount":115,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532552726","title":"周易虞氏易象释易则","quality":0,"qualityText":"","originalPrice":0,"totalPrice":108,"price":90,"shippingFee":18,"differencePrice":-108,"GoodsUrl":"https://book.kongfz.com/476973/4795679344","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edafaabb/a4e9fc477f428e7d_b.jpg","GoodsImgCount":"5","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530220771","title":"绘本 三国志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37,"price":31,"shippingFee":6,"differencePrice":-37,"GoodsUrl":"https://book.kongfz.com/283241/8877731096","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbadebae/8da18a79e50e7791_b.jpg","GoodsImgCount":"9","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115449238","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535218292","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787541151408","title":"昆仑.大结局","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":8,"shippingFee":7,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/624391/5408060815","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcbfadbb/07c3be2711e5771a_b.jpg","GoodsImgCount":"12","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537728317","title":"梁秀清临床经验选","quality":0,"qualityText":"","originalPrice":0,"totalPrice":108,"price":98,"shippingFee":10,"differencePrice":-108,"GoodsUrl":"https://book.kongfz.com/12117/8755654368","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eafaffdb/a731ef1a1cca7b58_b.jpg","GoodsImgCount":"2","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511536600","title":"人民日报记者说:典型人物采访与写作","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":7.2,"shippingFee":0,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/27736/8222096683","imgBigUrl":"https://www0.kfzimg.com/G06/M00/5F/DB/p4YBAFqlT3GAMPjmAACYZ6OExoQ676_b.jpg","GoodsImgCount":"1","onSaleCount":247,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801702715","title":"王树声传 王树声传 编写组编 当代中国出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":33,"price":28,"shippingFee":5,"differencePrice":-33,"GoodsUrl":"https://book.kongfz.com/911923/8772814849","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abeedcfa/bdd7e96d5ebd45fe_b.jpg","GoodsImgCount":"1","onSaleCount":90,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787219045039","title":"中国吴氏通书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":238,"price":228,"shippingFee":10,"differencePrice":-238,"GoodsUrl":"https://book.kongfz.com/388938/5635734530","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedacdfd/776fd9e3856a5399_b.jpg","GoodsImgCount":"4","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564061128","title":"聪明的女人不生气","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.48,"price":0.48,"shippingFee":3,"differencePrice":-3.48,"GoodsUrl":"https://book.kongfz.com/566350/8631713045","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcccbcda/e73ef67510e788b8_b.jpg","GoodsImgCount":"9","onSaleCount":175,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539272757","title":"货币哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.35,"price":32.35,"shippingFee":5,"differencePrice":-37.35,"GoodsUrl":"https://book.kongfz.com/403679/8309828791","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F8/D9/p4YBAFqZU3CAcNrGAACsHGgv654706_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787532775903","title":"竞艳(永井荷风小说精选)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":18,"shippingFee":0,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/274136/6161792990","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdcbddc/2a54d839359d76b4_b.jpg","GoodsImgCount":"11","onSaleCount":39,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787117308953","title":"人卫版 考试达人 2021全国护师资格考试 随身记 2021新版 职称考试","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.57,"price":0.57,"shippingFee":4,"differencePrice":-4.57,"GoodsUrl":"https://book.kongfz.com/692632/8421322348","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcdfbba/af38ab15b897f2a2_b.jpg","GoodsImgCount":"1","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787545206647","title":"狩魔手记 No. 3:在光与暗之间","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":6,"shippingFee":8,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/80269/8337622370","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3306/02d1a0dc6ad04aec0f_b.jpg","GoodsImgCount":"6","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513245272","title":"中草药的美丽传说 读故事知中医丛书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.31,"price":8.81,"shippingFee":4.5,"differencePrice":-13.31,"GoodsUrl":"https://book.kongfz.com/263924/8359098604","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/accbccaa/71741a85ae819b1a_b.jpg","GoodsImgCount":"1","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787209091251","title":"明代朝鲜使臣胶东纪行诗探析","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/27544/2973684514","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3630/0322c3fee2285943c6_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787204010592","title":"八仙醉行剑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":64.7,"price":54.7,"shippingFee":10,"differencePrice":-64.7,"GoodsUrl":"https://book.kongfz.com/832982/7421669386","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22231533/acc445679116fa70_b.jpg","GoodsImgCount":"2","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111611455","title":"体验式零售樊文花3000家连锁店的奥秘 刘琼雄著 机械工业出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":0.4,"shippingFee":5,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/910533/8534925404","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedfbefa/e9108bf55a3c5726_b.jpg","GoodsImgCount":"1","onSaleCount":165,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787567529731","title":"美学是未来的教育学德育世界的探寻 檀传宝著 上海 华东师范大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":62,"price":57,"shippingFee":5,"differencePrice":-62,"GoodsUrl":"https://book.kongfz.com/910533/8594193674","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdfeffa/d771f7f1133412b9_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559840653","title":"法哲学沉思录(增订注释版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42.88,"price":32.88,"shippingFee":10,"differencePrice":-42.88,"GoodsUrl":"https://book.kongfz.com/795574/8482826703","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/2498932/25a228594e7c8698_b.jpg","GoodsImgCount":"1","onSaleCount":86,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501209880","title":"信主独一 伊斯兰教","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.740000000000002,"price":14.74,"shippingFee":5,"differencePrice":-19.740000000000002,"GoodsUrl":"https://book.kongfz.com/802508/8561749878","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/feedacfa/144d6e447f607a6f_b.jpg","GoodsImgCount":"1","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020064304","title":"刘白羽散文:插图珍藏版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/16713/7428025070","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1825943/089638a0dcdcc20c_b.jpg","GoodsImgCount":"3","onSaleCount":35,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787536030497","title":"非神化","quality":0,"qualityText":"","originalPrice":0,"totalPrice":17.97,"price":13.97,"shippingFee":4,"differencePrice":-17.97,"GoodsUrl":"https://book.kongfz.com/797722/8362753281","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cadeaadd/b275ab6824ca0dc7_b.jpg","GoodsImgCount":"4","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562488002","title":"工程造价确定与控制 第7版吴学伟 谭德精 郑文建 主编重庆大学出版社9787562488002","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.7,"price":3.7,"shippingFee":0,"differencePrice":-3.7,"GoodsUrl":"https://book.kongfz.com/366030/8613584644","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11311919/7028af8b53465ac6_b.jpg","GoodsImgCount":"1","onSaleCount":148,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540783884","title":"溺水者","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.5,"price":8,"shippingFee":2.5,"differencePrice":-10.5,"GoodsUrl":"https://book.kongfz.com/361618/7588004292","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfcbcdb/d4f4881569709583_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040458749","title":"2017年 全国硕士研究生招生考试法律硕士","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4,"price":1,"shippingFee":3,"differencePrice":-4,"GoodsUrl":"https://book.kongfz.com/684559/8441884801","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bacbeaac/97523a1d94c76d53_b.jpg","GoodsImgCount":"2","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214049544","title":"中华帝国的法律","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":16,"shippingFee":6,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/61222/8696597261","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceccaadf/3fa7aa8a06b334c7_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562440673","title":"会展项目策划与组织9787562440673","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.4,"price":5.4,"shippingFee":0,"differencePrice":-5.4,"GoodsUrl":"https://book.kongfz.com/797928/7133987476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/21491677/092f9249b4885775_b.jpg","GoodsImgCount":"1","onSaleCount":25,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807348566","title":"水利水电工程专业案例应试辅导与习题集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36.97,"price":33.17,"shippingFee":3.8,"differencePrice":-36.97,"GoodsUrl":"https://book.kongfz.com/717628/8773851320","imgBigUrl":"https://www0.kfzimg.com/G06/M00/91/5F/p4YBAFrJoHGALyMyAABxymwcVA4723_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560017181","title":"汉英口译入门","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.98,"price":5.48,"shippingFee":2.5,"differencePrice":-7.98,"GoodsUrl":"https://book.kongfz.com/749193/8497283264","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbbfadec/40d5813e2d448723_b.jpg","GoodsImgCount":"2","onSaleCount":65,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508690469","title":"切尔诺贝利的祭祷 斯韦特兰娜 亚历山德罗夫娜 阿列克谢耶维著 孙 中信出版集团 中信出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.6,"price":5.6,"shippingFee":5,"differencePrice":-10.6,"GoodsUrl":"https://book.kongfz.com/398369/8732751738","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecaebbb/61df20b5adc43022_b.jpg","GoodsImgCount":"1","onSaleCount":343,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538465365","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122177568","title":"3天完成超人气简单钩针编织披肩 围巾 毛衣","quality":0,"qualityText":"","originalPrice":0,"totalPrice":27.73,"price":22.73,"shippingFee":5,"differencePrice":-27.73,"GoodsUrl":"https://book.kongfz.com/798596/8841462997","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fecedfec/0acd92a7b4e82865_b.jpg","GoodsImgCount":"1","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802515062","title":"30天精通哲学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.65,"price":3.65,"shippingFee":4,"differencePrice":-7.65,"GoodsUrl":"https://book.kongfz.com/841736/7819318114","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffbadeae/97389454709a0395_b.jpg","GoodsImgCount":"1","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531339038","title":"小阿卡那王国的十二天 塔罗牌的冒险游戏 3 李榕 春风文艺出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41,"price":36,"shippingFee":5,"differencePrice":-41,"GoodsUrl":"https://book.kongfz.com/398369/8525948579","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdbdaaef/502feffcdc5a83f2_b.jpg","GoodsImgCount":"1","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802545137","title":"宗教团体教规制度汇编","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.3,"price":3.5,"shippingFee":3.8,"differencePrice":-7.3,"GoodsUrl":"https://book.kongfz.com/570268/4507336198","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aebfbafd/f0e5c62ff57592db_b.jpg","GoodsImgCount":"3","onSaleCount":78,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559830425","title":"致一百年以后的你:茨维塔耶娃诗选(布罗茨基和帕斯捷尔纳克推崇备至,虚伪年代里她发出了天上真理的声音)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":37.6,"price":37.6,"shippingFee":0,"differencePrice":-37.6,"GoodsUrl":"https://book.kongfz.com/464998/5836803688","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dadefded/38fcb773d15f75f9_b.jpg","GoodsImgCount":"3","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513276764","title":"正版中医经典能力等级考试学习备要 一二级 大学教材 对一二级全部条文中的关键知识点进行规范解读 经典条文全解中国中医药出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":72,"price":64,"shippingFee":8,"differencePrice":-72,"GoodsUrl":"https://book.kongfz.com/667710/8264576689","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/17848986/06d71c99a14262d1_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020070985","title":"名著名译插图本:格林童话全集","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.92,"price":4.92,"shippingFee":5,"differencePrice":-9.92,"GoodsUrl":"https://book.kongfz.com/481057/8714237544","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdeddecc/130f2902b9a8a4c3_b.jpg","GoodsImgCount":"1","onSaleCount":43,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787569901856","title":"论重要之事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":22,"shippingFee":8,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/665570/8689983587","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daaddebc/4d6909ac7a702e44_b.jpg","GoodsImgCount":"4","onSaleCount":56,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533073640","title":"中国石刻书法精粹冈山入楞伽经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":47.8,"price":42,"shippingFee":5.8,"differencePrice":-47.8,"GoodsUrl":"https://book.kongfz.com/1120159/8821041704","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdeccece/327c94577b5df77b_b.jpg","GoodsImgCount":"3","onSaleCount":84,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562418863","title":"电脑中文五笔字型编码字典","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6,"price":6,"shippingFee":0,"differencePrice":-6,"GoodsUrl":"https://book.kongfz.com/731554/6197072537","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdadbcae/8248e5748581be30_b.jpg","GoodsImgCount":"4","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530483565","title":"法式烘焙圣经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":18,"shippingFee":4,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/716704/8005098362","imgBigUrl":"https://www0.kfzimg.com/G06/M00/E0/B8/p4YBAFqY5ImAP-xTAAD-aKAGaq0152_b.jpg","GoodsImgCount":"0","onSaleCount":24,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111485681","title":"放空一下,大脑更有活力:发呆或深度睡眠的时间,正是大脑整理信息、巩固记忆的宝贵时刻","quality":0,"qualityText":"","originalPrice":0,"totalPrice":41.58,"price":39.98,"shippingFee":1.6,"differencePrice":-41.58,"GoodsUrl":"https://book.kongfz.com/457799/8898556222","imgBigUrl":"https://www0.kfzimg.com/G06/M00/61/B6/p4YBAFqctaaAZShRAAB7qAPX2I4591_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787511702463","title":"一个冬夜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.99,"price":1.01,"shippingFee":2.98,"differencePrice":-3.99,"GoodsUrl":"https://book.kongfz.com/761854/8282360559","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbefaaaa/bdd6bbbf29672624_b.jpg","GoodsImgCount":"2","onSaleCount":73,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801305312","title":"图解住宅禁忌","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":4,"shippingFee":10,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/289461/8750166897","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbfeada/ff4d3e78ae4f33e4_b.jpg","GoodsImgCount":"4","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559052407","title":"儿童权利宣言","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/302893/3001668407","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/390/4cdb424a175a6bc1_b.jpg","GoodsImgCount":"1","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539967486","title":"波吉亚家族","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42,"price":34,"shippingFee":8,"differencePrice":-42,"GoodsUrl":"https://book.kongfz.com/316589/8786458274","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecefce/858ca722b85e3531_b.jpg","GoodsImgCount":"11","onSaleCount":63,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115227409","title":"FPGA应用开发入门与典型实例","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24.9,"price":24.9,"shippingFee":0,"differencePrice":-24.9,"GoodsUrl":"https://book.kongfz.com/792228/8893341825","imgBigUrl":"https://www0.kfzimg.com/G06/M00/66/FF/p4YBAFql1cSAbYjSAABg-cl_KK8164_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559461674","title":"毛姆短篇小说全集江苏凤凰文艺出版社册第三册","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.9,"price":13.9,"shippingFee":2,"differencePrice":-15.9,"GoodsUrl":"https://book.kongfz.com/769034/8877458642","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecaaea/595a1d153417c057_b.jpg","GoodsImgCount":"4","onSaleCount":147,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787563801084","title":"如何正确购买股票","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.39,"price":0.39,"shippingFee":6,"differencePrice":-6.39,"GoodsUrl":"https://book.kongfz.com/732025/7658617884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aafdfdfa/3a4f774764fbc683_b.jpg","GoodsImgCount":"14","onSaleCount":6,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500303176","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560036908","title":"蓝宝伴侣:GRE词汇逆序突破肖静波 杨媚","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":10,"shippingFee":0,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/576646/8181293652","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeeefbdd/fc709d318be41ab9_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506313803","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544717991","title":"译林名著精选:童年《图片实拍》","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.49,"price":1.49,"shippingFee":2,"differencePrice":-3.49,"GoodsUrl":"https://book.kongfz.com/892872/8841398697","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eacfdfcc/665f0977eb140373_b.jpg","GoodsImgCount":"5","onSaleCount":344,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787811002201","title":"羽毛球教学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":75.72,"price":63.72,"shippingFee":12,"differencePrice":-75.72,"GoodsUrl":"https://book.kongfz.com/876767/7810979890","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/22552668/642a62ea85b3b7ad_b.jpg","GoodsImgCount":"2","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787533290221","title":"阳光姐姐小书房-补习班的毕业狗","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.59,"price":0.59,"shippingFee":3,"differencePrice":-3.59,"GoodsUrl":"https://book.kongfz.com/891713/7982111525","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bdcebace/2f1de291a31baeb2_b.jpg","GoodsImgCount":"4","onSaleCount":212,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553332925","title":"看晚风吹动香椿树","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":7,"shippingFee":7,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/906778/8175138950","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/17787432/b4ed61571e964018_b.jpg","GoodsImgCount":"4","onSaleCount":9,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535715807","title":"时间之箭:揭开时间最大奥秘之科旅程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":3.8,"shippingFee":0,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/437976/8789758974","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdbbedba/b68db3d7454fdc01_b.jpg","GoodsImgCount":"4","onSaleCount":639,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518426096","title":"非瘦不可","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":4,"shippingFee":6,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/191396/8547026612","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbadccb/53f868482c984b7e_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229011338","title":"夫妻按摩保健图解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":10,"shippingFee":5,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/3092/8222548065","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dffedfea/afe59603b8ebe5ee_b.jpg","GoodsImgCount":"6","onSaleCount":26,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787113276508","title":"股市稳定盈利——寻找最小阻力位9787113276508毕文锋中国铁道出","quality":0,"qualityText":"","originalPrice":0,"totalPrice":36.8,"price":34.3,"shippingFee":2.5,"differencePrice":-36.8,"GoodsUrl":"https://book.kongfz.com/1092759/8885035777","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebacebce/399a4692deda6697_b.jpg","GoodsImgCount":"1","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521719208","title":"通往衰败之路经济学如何掌控我们的生活","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/825106/7894333431","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcffaffb/546c29ed56f49d38_b.jpg","GoodsImgCount":"6","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787122339980","title":"抗癌秘验方(第3版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.38,"price":8.38,"shippingFee":3,"differencePrice":-11.38,"GoodsUrl":"https://book.kongfz.com/902124/8346316359","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcdbacbe/405f74ef1d91f332_b.jpg","GoodsImgCount":"8","onSaleCount":146,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300112275","title":"普通公司法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":160,"price":150,"shippingFee":10,"differencePrice":-160,"GoodsUrl":"https://book.kongfz.com/593645/8588413426","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deacbcff/f813861f1b55e16a_b.jpg","GoodsImgCount":"30","onSaleCount":29,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787551101455","title":"幼儿衔接训练营数学 10以内数的加减法","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.36,"price":0.36,"shippingFee":5,"differencePrice":-5.36,"GoodsUrl":"https://book.kongfz.com/805022/8818083745","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/effcbfda/26f92cfd9c8dd9a7_b.jpg","GoodsImgCount":"1","onSaleCount":150,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501965281","title":"透视课堂","quality":0,"qualityText":"","originalPrice":0,"totalPrice":38.879999999999995,"price":28.88,"shippingFee":10,"differencePrice":-38.879999999999995,"GoodsUrl":"https://book.kongfz.com/795093/8817748428","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edbddced/3cc78a67adce3057_b.jpg","GoodsImgCount":"14","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522615448","title":"系统架构设计师考试32小时通关","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.18,"price":16.18,"shippingFee":5,"differencePrice":-21.18,"GoodsUrl":"https://book.kongfz.com/893135/8183887786","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcdedeed/82c6861b1cb9f559_b.jpg","GoodsImgCount":"1","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535446732","title":"跟谁较劲","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.24,"price":2.74,"shippingFee":1.5,"differencePrice":-4.24,"GoodsUrl":"https://book.kongfz.com/774690/8186965131","imgBigUrl":"https://www0.kfzimg.com/G06/M00/D8/C3/p4YBAFqYxLeAD1cDAAC30cOaVPw558_b.jpg","GoodsImgCount":"1","onSaleCount":338,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787224085945","title":"白纪年","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":14,"shippingFee":8,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/608824/8429279676","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acfbdebf/bee101b98e926b96_b.jpg","GoodsImgCount":"10","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521754247","title":"价值投费3.0","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":20,"shippingFee":10,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/813529/7760121091","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/9937843/6f65ca503c24bca1_b.jpg","GoodsImgCount":"1","onSaleCount":137,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787115602602","title":"AI医学图像处理杨慧芳人民邮电出版社9787115602602","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.76,"price":29.76,"shippingFee":0,"differencePrice":-29.76,"GoodsUrl":"https://book.kongfz.com/248516/8801231646","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/000b6943df4e0b96_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534785375","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801716088","title":"中国现代小说经典文库:刘云若","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.01,"price":0.01,"shippingFee":3,"differencePrice":-3.01,"GoodsUrl":"https://book.kongfz.com/581989/6091380883","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddeadba/bad6dfa20af585fa_b.jpg","GoodsImgCount":"5","onSaleCount":727,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111673835","title":"汽车底盘振动与噪声控制","quality":0,"qualityText":"","originalPrice":0,"totalPrice":108,"price":96,"shippingFee":12,"differencePrice":-108,"GoodsUrl":"https://book.kongfz.com/594145/6738070561","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/beffefff/1b999c09e1bbfc57_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020037155","title":"欧·亨利短篇小说选。","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.89,"price":0.09,"shippingFee":4.8,"differencePrice":-4.89,"GoodsUrl":"https://book.kongfz.com/780405/7571655710","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeebeccd/81c7e5db13f25a44_b.jpg","GoodsImgCount":"4","onSaleCount":131,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561554272","title":"闽南话教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":6,"shippingFee":5,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/365590/6700057055","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbeedbc/ee350c61e535d96a_b.jpg","GoodsImgCount":"4","onSaleCount":87,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559725943","title":"汤汤奇幻童年故事本 注音版:美人树","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.64,"price":10.14,"shippingFee":6.5,"differencePrice":-16.64,"GoodsUrl":"https://book.kongfz.com/758962/8723946119","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afadbfae/be23dd9f6ed74436_b.jpg","GoodsImgCount":"5","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509116418","title":"拔罐疗法治百病(第3版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":6,"shippingFee":8,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/667587/5549578255","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daccdbde/eec7103f90685857_b.jpg","GoodsImgCount":"5","onSaleCount":55,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801797674","title":"周易正义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.9,"price":8.9,"shippingFee":5,"differencePrice":-13.9,"GoodsUrl":"https://book.kongfz.com/261116/8497958314","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdcfebef/ed2a4baa1dece5f9_b.jpg","GoodsImgCount":"1","onSaleCount":158,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787555021933","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500423379","title":"米诺托之恋 32开","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":2,"shippingFee":8,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/2731/8305886847","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbecedaf/fd432f72526a0677_b.jpg","GoodsImgCount":"3","onSaleCount":14,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506546294","title":"兵书与商战:《孙子兵法》在企业经营管理中的应用","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.11,"price":11.11,"shippingFee":3,"differencePrice":-14.11,"GoodsUrl":"https://book.kongfz.com/11070/5792723770","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfcafefb/4267f82702444e97_b.jpg","GoodsImgCount":"2","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802568228","title":"正版 {塑封}凤舞未央:吕雉传.壹[社版] 大爱无痕 9787802568228","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.439999999999998,"price":11.94,"shippingFee":4.5,"differencePrice":-16.439999999999998,"GoodsUrl":"https://book.kongfz.com/8094/8801323849","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceeeeafe/219b26a6d6d8fcd7_b.jpg","GoodsImgCount":"10","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787521424812","title":"《药性歌括四百味》详解","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":15,"shippingFee":8,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/260959/8653606389","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efddfbea/26a0c67edea8a345_b.jpg","GoodsImgCount":"3","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787200026429","title":"佛学精华 下","quality":0,"qualityText":"","originalPrice":0,"totalPrice":53.9,"price":45,"shippingFee":8.9,"differencePrice":-53.9,"GoodsUrl":"https://book.kongfz.com/303525/7008507926","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bddbacda/577a88c16787e620_b.jpg","GoodsImgCount":"15","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559665218","title":"深话浅说,把话说到点子上的超级沟通术!","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.3,"price":15.5,"shippingFee":2.8,"differencePrice":-18.3,"GoodsUrl":"https://book.kongfz.com/41819/8874019077","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/1578691/618e7aa77d18b321_b.jpg","GoodsImgCount":"4","onSaleCount":120,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787551144636","title":"这不是一本科学书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.78,"price":1.78,"shippingFee":5,"differencePrice":-6.78,"GoodsUrl":"https://book.kongfz.com/202798/8898900360","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cdbabbbe/11e45c6436a68d08_b.jpg","GoodsImgCount":"1","onSaleCount":97,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201131634","title":"精简 日式精要主义生活法则","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":3.1,"shippingFee":5,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/1207201/8801526319","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfcdbfe/9c2b3e7d1e41114a_b.jpg","GoodsImgCount":"1","onSaleCount":94,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787201198910","title":"【未翻阅】吕著中国通史:中国政治史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":6,"shippingFee":4,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/578827/8429230684","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/caecbfcf/e01cd053daf6e07a_b.jpg","GoodsImgCount":"2","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539617473","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108032577","title":"仙骨佛心:家具、紫砂与明清文人","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.4,"price":4.4,"shippingFee":10,"differencePrice":-14.4,"GoodsUrl":"https://book.kongfz.com/683738/7098697332","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeceefcb/027ba9058aa5f099_b.jpg","GoodsImgCount":"4","onSaleCount":80,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530948460","title":"西风独自凉","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.99,"price":0.99,"shippingFee":3,"differencePrice":-3.99,"GoodsUrl":"https://book.kongfz.com/903324/8732698209","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdecacaa/5829bc5de36da17a_b.jpg","GoodsImgCount":"5","onSaleCount":256,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787308133326","title":"一本书读懂财报 肖星著 浙江大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.73,"price":7.73,"shippingFee":5,"differencePrice":-12.73,"GoodsUrl":"https://book.kongfz.com/180897/8899723904","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faebfade/22273c2907c42499_b.jpg","GoodsImgCount":"1","onSaleCount":193,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565422034","title":"传媒经济","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29,"price":22,"shippingFee":7,"differencePrice":-29,"GoodsUrl":"https://book.kongfz.com/793471/8403961276","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cedabeae/107e1049b5db2e80_b.jpg","GoodsImgCount":"4","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509664728","title":"大学二级学院院长的角色认知与管理之道","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40.21,"price":36.21,"shippingFee":4,"differencePrice":-40.21,"GoodsUrl":"https://book.kongfz.com/502990/8262079169","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aacadfdd/74291c5b7c3535d5_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787518059195","title":"提高抗挫力培养内心强大的孩子","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":2,"shippingFee":8,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/642191/8020261360","imgBigUrl":"https://www0.kfzimg.com/G07/M00/F3/41/qoYBAFx_IDKAZ76lAAI2qNaQMek283_b.jpg","GoodsImgCount":"1","onSaleCount":56,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787305198632","title":"陶艺设计 陈卢鹏 南京大学出版社 9787305198632","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.98,"price":3.98,"shippingFee":0,"differencePrice":-3.98,"GoodsUrl":"https://book.kongfz.com/2845/8726272938","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcacebde/e3d61e23ccebbfc2_b.jpg","GoodsImgCount":"1","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787564800994","title":"学校艺术教育60年(1949-2009)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":23,"shippingFee":0,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/544739/4134318917","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbebddbc/11ba1c8ac23ca92d_b.jpg","GoodsImgCount":"9","onSaleCount":10,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787561457207","title":"隐形的尾巴系列:梦中的巨叶 彩图版中英对照","quality":0,"qualityText":"","originalPrice":0,"totalPrice":25,"price":25,"shippingFee":0,"differencePrice":-25,"GoodsUrl":"https://book.kongfz.com/545819/8248024889","imgBigUrl":"https://www0.kfzimg.com/G06/M00/CF/70/p4YBAFqo5jaAXl6NAABP0PiNKsA890_b.jpg","GoodsImgCount":"1","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787520202091","title":"儿童职业启蒙百科长大后我要做什么 陈昕编著 中国大百科全书出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.82,"price":9.82,"shippingFee":5,"differencePrice":-14.82,"GoodsUrl":"https://book.kongfz.com/398369/8780865875","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/deaebdef/cf5e69203d43afc8_b.jpg","GoodsImgCount":"1","onSaleCount":188,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534951978","title":"烘焙新手必备的第一本书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5600000000000005,"price":0.56,"shippingFee":4,"differencePrice":-4.5600000000000005,"GoodsUrl":"https://book.kongfz.com/660948/8726976124","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ebcbcfbd/d44f0b660d82a285_b.jpg","GoodsImgCount":"2","onSaleCount":304,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500410898","title":"社科学术文库:中国革命法制史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.07,"price":13.07,"shippingFee":6,"differencePrice":-19.07,"GoodsUrl":"https://book.kongfz.com/792848/8126466099","imgBigUrl":"https://www0.kfzimg.com/G06/M00/87/CE/p4YBAFrJd_eAVtUOAACH4Dc3UTs299_b.jpg","GoodsImgCount":"1","onSaleCount":74,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214222213","title":"西顿动物故事集/统编语文教材必读名著","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.43,"price":2.43,"shippingFee":3,"differencePrice":-5.43,"GoodsUrl":"https://book.kongfz.com/774181/8781126790","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cabdeeeb/4c70980aa56a6179_b.jpg","GoodsImgCount":"4","onSaleCount":20,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108028167","title":"西班牙","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.1,"price":7.1,"shippingFee":5,"differencePrice":-12.1,"GoodsUrl":"https://book.kongfz.com/802508/8630726160","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dafcfebf/38916c84832bb9e5_b.jpg","GoodsImgCount":"1","onSaleCount":79,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516764589","title":"整理收纳师培训实用教程","quality":0,"qualityText":"","originalPrice":0,"totalPrice":42.68,"price":34.68,"shippingFee":8,"differencePrice":-42.68,"GoodsUrl":"https://book.kongfz.com/158878/8133003913","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4893319/0fc6cd33a6998f78_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535460783","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515509433","title":"实体店这样做绝不输电商:实体店+互联网,这样运营更有效","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.21,"price":4.2,"shippingFee":0.01,"differencePrice":-4.21,"GoodsUrl":"https://book.kongfz.com/171447/8557690684","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efafdcda/e5451ef584b5dac0_b.jpg","GoodsImgCount":"1","onSaleCount":200,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508644660","title":"数据之巅:大数据革命,历史、现实与未来","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.8,"price":0.8,"shippingFee":3,"differencePrice":-3.8,"GoodsUrl":"https://book.kongfz.com/880498/8863679996","imgBigUrl":"https://www0.kfzimg.com/G06/M00/F0/78/p4YBAFqZNLWAH1kmAAGLQlVha0I822_b.jpg","GoodsImgCount":"1","onSaleCount":1923,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108035455","title":"游观美国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":4.2,"shippingFee":3,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/566350/8848525346","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcfdeeae/d8e0990506ae25ee_b.jpg","GoodsImgCount":"5","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515517018","title":"达·芬奇笔记","quality":0,"qualityText":"","originalPrice":0,"totalPrice":28.9,"price":25,"shippingFee":3.9,"differencePrice":-28.9,"GoodsUrl":"https://book.kongfz.com/293289/8863618280","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbdaabce/99e10484c9bb4d68_b.jpg","GoodsImgCount":"1","onSaleCount":82,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787538290554","title":"高中必备古诗文 第4次修订","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.54,"price":0.54,"shippingFee":3,"differencePrice":-3.54,"GoodsUrl":"https://book.kongfz.com/371891/8511078129","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cbadebaa/e65202c29d831318_b.jpg","GoodsImgCount":"3","onSaleCount":91,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208141384","title":"告别霸权 全球体系中的权力与影响力","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15.73,"price":10.73,"shippingFee":5,"differencePrice":-15.73,"GoodsUrl":"https://book.kongfz.com/907853/8590170185","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adbbedeb/74860687d74261cc_b.jpg","GoodsImgCount":"1","onSaleCount":61,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787030520784","title":"内页干净 数字电子技术基础 第二版","quality":0,"qualityText":"","originalPrice":0,"totalPrice":22,"price":15,"shippingFee":7,"differencePrice":-22,"GoodsUrl":"https://book.kongfz.com/186710/8891553985","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceacecbf/5dc142c596b99bb7_b.jpg","GoodsImgCount":"5","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550017719","title":"答案之书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.32,"price":1.32,"shippingFee":3,"differencePrice":-4.32,"GoodsUrl":"https://book.kongfz.com/566350/8837190195","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aadedfee/a9c15bdf17802e77_b.jpg","GoodsImgCount":"5","onSaleCount":586,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787544282437","title":"点与线【正版书籍,实拍图发货,16点前订单当天发出-1112】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12,"price":2,"shippingFee":10,"differencePrice":-12,"GoodsUrl":"https://book.kongfz.com/1208551/8761113973","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceefdffa/fee05513763e9ffb_b.jpg","GoodsImgCount":"4","onSaleCount":77,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787550106383","title":"卖故事","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.38,"price":4.37,"shippingFee":0.01,"differencePrice":-4.38,"GoodsUrl":"https://book.kongfz.com/877749/8772134551","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/20696186/56f2b8bf0930afe3_b.jpg","GoodsImgCount":"3","onSaleCount":242,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508652801","title":"救命饮食Ⅱ:反思营养学","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19,"price":13,"shippingFee":6,"differencePrice":-19,"GoodsUrl":"https://book.kongfz.com/302512/8854227529","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/daefedee/aa1240d7fc51d6dc_b.jpg","GoodsImgCount":"9","onSaleCount":105,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530838846","title":"长效针灸","quality":0,"qualityText":"","originalPrice":0,"totalPrice":92.62,"price":81.12,"shippingFee":11.5,"differencePrice":-92.62,"GoodsUrl":"https://book.kongfz.com/1121862/8620201407","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/23602004/bc1be7f1013d5f16_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547400289","title":"恐龙宝贝 18失踪的公主.","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/240738/6964968829","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/49/01c16a6e44d6eefc_b.jpg","GoodsImgCount":"5","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787504936004","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787566422859","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802255913","title":"第十二张牌 林肯 莱姆系列之六","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.9,"price":2.9,"shippingFee":5,"differencePrice":-7.9,"GoodsUrl":"https://book.kongfz.com/261116/8727732660","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbffccc/dfc8550b211d9e53_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111331834","title":"(二手书)离散数学 冯伟森栾新成石兵 机械工业出版社 2011年03月01日 9787111331834","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.4,"price":9.4,"shippingFee":4,"differencePrice":-13.4,"GoodsUrl":"https://book.kongfz.com/704408/6180539887","imgBigUrl":"https://www0.kfzimg.com/G06/M00/91/AE/p4YBAFqeLhKAW5d5AADl92ZwcOg893_b.jpg","GoodsImgCount":"1","onSaleCount":19,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300096728","title":"民法典体系研究 王利明著 16开 中国人民大学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.610000000000001,"price":8.21,"shippingFee":2.4,"differencePrice":-10.610000000000001,"GoodsUrl":"https://book.kongfz.com/691158/8420929169","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bfbdcbac/d39298c4ffe420f0_b.jpg","GoodsImgCount":"1","onSaleCount":33,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534487484","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514857719","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787517057314","title":"中文版AutoCAD 2018从入门到精通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.04,"price":3.04,"shippingFee":2,"differencePrice":-5.04,"GoodsUrl":"https://book.kongfz.com/624177/8858791962","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eeabffeb/61322e6d9183c96c_b.jpg","GoodsImgCount":"2","onSaleCount":174,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559662897","title":"你可以链接任何人","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":3,"shippingFee":6,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/718390/8279878590","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cebadccd/f3d70455d1372df0_b.jpg","GoodsImgCount":"9","onSaleCount":214,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787539861753","title":"经典碑帖笔法临析大全:汉 张迁碑","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":25,"shippingFee":5,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/626307/8191067601","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ceecbcfd/5a4122d8aacde8e1_b.jpg","GoodsImgCount":"3","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214022448","title":"走出蒙昧","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.09,"price":2.09,"shippingFee":3,"differencePrice":-5.09,"GoodsUrl":"https://book.kongfz.com/880498/8552588955","imgBigUrl":"https://www0.kfzimg.com/G06/M00/4C/C2/p4YBAFqbzkiANU8yAABXKCNtm0I243_b.jpg","GoodsImgCount":"1","onSaleCount":100,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801820716","title":"034-最高人民法院关于审理未成年人刑事案件的若干规定——司法解释配套规定(30)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8,"price":3,"shippingFee":5,"differencePrice":-8,"GoodsUrl":"https://book.kongfz.com/773547/8882061995","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abcbedbe/3f86089883b36df9_b.jpg","GoodsImgCount":"3","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565603785","title":"高中地理知识清单第七次修订","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.9099999999999997,"price":0.11,"shippingFee":3.8,"differencePrice":-3.9099999999999997,"GoodsUrl":"https://book.kongfz.com/237705/8296401548","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/becedeca/85f3d8d0cf0507fc_b.jpg","GoodsImgCount":"1","onSaleCount":312,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300227931","title":"摇滚狂人:奥兹·奥斯本自传","quality":0,"qualityText":"","originalPrice":0,"totalPrice":357.93,"price":347.93,"shippingFee":10,"differencePrice":-357.93,"GoodsUrl":"https://book.kongfz.com/885269/8721211625","imgBigUrl":"https://www0.kfzimg.com/G06/M00/C6/CD/p4YBAFqYPm6AA58NAADmk-bczug630_b.jpg","GoodsImgCount":"1","onSaleCount":7,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787040165333","title":"服装缝制工艺","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.030000000000001,"price":4.03,"shippingFee":5,"differencePrice":-9.030000000000001,"GoodsUrl":"https://book.kongfz.com/234408/8617852599","imgBigUrl":"https://www0.kfzimg.com/G06/M00/49/E5/p4YBAFqklnyAOs0PAADPm0kfy34750_b.jpg","GoodsImgCount":"1","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787805260341","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787540756369","title":"我的教育思考:李镇西30年教育感悟精华","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10,"price":5,"shippingFee":5,"differencePrice":-10,"GoodsUrl":"https://book.kongfz.com/244916/7101323168","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbddcdee/0b130d050743b880_b.jpg","GoodsImgCount":"3","onSaleCount":85,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506318037","title":"庞中华书法百日通","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.8,"price":1.8,"shippingFee":5,"differencePrice":-6.8,"GoodsUrl":"https://book.kongfz.com/1207201/8872215438","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acadcfea/50504c6043d60888_b.jpg","GoodsImgCount":"1","onSaleCount":118,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534865725","title":"【正版库存书,无写划,当天发货】候气术-古人观念中天地人之纽带","quality":0,"qualityText":"","originalPrice":0,"totalPrice":49,"price":39,"shippingFee":10,"differencePrice":-49,"GoodsUrl":"https://book.kongfz.com/792783/8292451687","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdffeffa/1d238d1e8b570fc8_b.jpg","GoodsImgCount":"2","onSaleCount":12,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309141238","title":"媒介考古学:方法、路径和意涵","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.3,"price":37.8,"shippingFee":1.5,"differencePrice":-39.3,"GoodsUrl":"https://book.kongfz.com/772556/8643035154","imgBigUrl":"https://www0.kfzimg.com/G07/M00/74/9F/q4YBAFy9za6APejXAACbgxAfVOA618_b.jpg","GoodsImgCount":"1","onSaleCount":46,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807492078","title":"中国油灯","quality":0,"qualityText":"","originalPrice":0,"totalPrice":24,"price":19,"shippingFee":5,"differencePrice":-24,"GoodsUrl":"https://book.kongfz.com/3092/8404148550","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abdafddd/ae84e3b815c551f1_b.jpg","GoodsImgCount":"5","onSaleCount":28,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535558121","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787100047944","title":"现代汉语词典 大字本【第5版】","quality":0,"qualityText":"","originalPrice":0,"totalPrice":46.2,"price":43.2,"shippingFee":3,"differencePrice":-46.2,"GoodsUrl":"https://book.kongfz.com/567465/8684141730","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afeacdfc/27dbc7df6e4790d0_b.jpg","GoodsImgCount":"11","onSaleCount":47,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787214061652","title":"[正版现货实拍]左与右","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":25,"shippingFee":5,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/593972/8831688302","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fabcbffc/6acb11c332afb1ac_b.jpg","GoodsImgCount":"2","onSaleCount":34,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787565645136","title":"理想树2019新版 高考必刷题 化学合订本 67高考总复?习辅导用书","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.23,"price":0.23,"shippingFee":4,"differencePrice":-4.23,"GoodsUrl":"https://book.kongfz.com/841736/7806737988","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eacfdcfc/d53e57da439477b1_b.jpg","GoodsImgCount":"1","onSaleCount":170,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301327678","title":"手机摄影从入门到精通(视频教程版)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.96,"price":4.96,"shippingFee":3,"differencePrice":-7.96,"GoodsUrl":"https://book.kongfz.com/814259/7155878213","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/11956018/23ecdf560f51fc15_b.jpg","GoodsImgCount":"0","onSaleCount":151,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501242757","title":"稳行高处","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16.29,"price":11.29,"shippingFee":5,"differencePrice":-16.29,"GoodsUrl":"https://book.kongfz.com/202798/8790783794","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acdeeabf/f0e02fb82665f1a7_b.jpg","GoodsImgCount":"1","onSaleCount":42,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516147948","title":"雷州文化概论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.85,"price":5.35,"shippingFee":5.5,"differencePrice":-10.85,"GoodsUrl":"https://book.kongfz.com/673095/8836493176","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eadccdee/b6cdf1498eaa5a5d_b.jpg","GoodsImgCount":"1","onSaleCount":66,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787307196872","title":"西线空战:二战德国空军第26战斗机联队战史","quality":0,"qualityText":"","originalPrice":0,"totalPrice":34,"price":28,"shippingFee":6,"differencePrice":-34,"GoodsUrl":"https://book.kongfz.com/255987/6951927055","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcffded/00890ff233c0e961_b.jpg","GoodsImgCount":"8","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535729309","title":"中国湘菜湘点.地方菜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":6,"shippingFee":10,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/794521/8854071538","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddbfdcdd/ce5af34277bfbf6d_b.jpg","GoodsImgCount":"15","onSaleCount":21,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787103027660","title":"音乐学:历史、文献与写作","quality":0,"qualityText":"","originalPrice":0,"totalPrice":19.97,"price":17.97,"shippingFee":2,"differencePrice":-19.97,"GoodsUrl":"https://book.kongfz.com/877749/8009479476","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccadfcdd/59e0599bef87bcc2_b.jpg","GoodsImgCount":"2","onSaleCount":40,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787537402484","title":"枭雄百传第三部12世界政坛枭雄之一","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.5,"price":1.5,"shippingFee":3,"differencePrice":-4.5,"GoodsUrl":"https://book.kongfz.com/500139/6001151895","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffddfbcc/623f0323273297b1_b.jpg","GoodsImgCount":"4","onSaleCount":217,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787514803723","title":"幼儿文学百年经典:科学 和风卷","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.1,"price":6.6,"shippingFee":2.5,"differencePrice":-9.1,"GoodsUrl":"https://book.kongfz.com/836247/7706451696","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdcfebeb/2055a85b2f62f6cc_b.jpg","GoodsImgCount":"2","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505135482","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010223445","title":"共产党执政规律研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.09,"price":0.09,"shippingFee":5,"differencePrice":-5.09,"GoodsUrl":"https://book.kongfz.com/23607/8529134364","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ddcececa/931db1e7f06bbbb1_b.jpg","GoodsImgCount":"1","onSaleCount":324,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787506085892","title":"指月录","quality":0,"qualityText":"","originalPrice":0,"totalPrice":30,"price":24,"shippingFee":6,"differencePrice":-30,"GoodsUrl":"https://book.kongfz.com/715232/8775324286","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efffcbfb/ac5bb42fd1eb8cfd_b.jpg","GoodsImgCount":"8","onSaleCount":174,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787535457646","title":"蒙曼说隋(下):隋炀帝杨广","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14.4,"price":11.5,"shippingFee":2.9,"differencePrice":-14.4,"GoodsUrl":"https://book.kongfz.com/566350/8780637754","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dfaffafa/7c735695c0ad2658_b.jpg","GoodsImgCount":"8","onSaleCount":111,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787508617930","title":"一分钟百万富翁","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.5,"price":5,"shippingFee":5.5,"differencePrice":-10.5,"GoodsUrl":"https://book.kongfz.com/78763/8656091664","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fdeffaeb/f97188c16b7bdf05_b.jpg","GoodsImgCount":"4","onSaleCount":100,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787301317273","title":"中华茶文化概论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.58,"price":9.58,"shippingFee":0,"differencePrice":-9.58,"GoodsUrl":"https://book.kongfz.com/22758/8269768638","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3159/02b0e79a478be0806a_b.jpg","GoodsImgCount":"1","onSaleCount":92,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802011540","title":"书法碑帖 墨迹精印 隋 智永真草千字文 姚建杭 中国和平出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.9,"price":5.9,"shippingFee":5,"differencePrice":-10.9,"GoodsUrl":"https://book.kongfz.com/910533/8841066585","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/decdeecf/5b9eb240e4cf2f07_b.jpg","GoodsImgCount":"1","onSaleCount":156,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516927304","title":"传奇如谜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":32.29,"price":25.29,"shippingFee":7,"differencePrice":-32.29,"GoodsUrl":"https://book.kongfz.com/238778/8228231786","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/16915416/c05e7a1b0d97ccac_b.jpg","GoodsImgCount":"1","onSaleCount":15,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787208018907","title":"中国的奇迹:发展战略与经济改革","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.72,"price":1.72,"shippingFee":5,"differencePrice":-6.72,"GoodsUrl":"https://book.kongfz.com/890432/8720058621","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/eddecacc/fa7dcc44fce0b0a5_b.jpg","GoodsImgCount":"1","onSaleCount":130,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787110059753","title":"海洋","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9,"price":6,"shippingFee":3,"differencePrice":-9,"GoodsUrl":"https://book.kongfz.com/838443/8896001587","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dbbbbded/5ca2371ad0f6c234_b.jpg","GoodsImgCount":"1","onSaleCount":109,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531358305","title":"萧军萧红交游考释","quality":0,"qualityText":"","originalPrice":0,"totalPrice":14,"price":9.6,"shippingFee":4.4,"differencePrice":-14,"GoodsUrl":"https://book.kongfz.com/321650/8279664994","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3974/037bf1538f5fc99ac7_b.jpg","GoodsImgCount":"1","onSaleCount":83,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513335157","title":"最后的守护者","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.5,"price":32,"shippingFee":7.5,"differencePrice":-39.5,"GoodsUrl":"https://book.kongfz.com/161407/7322660044","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcbfcceb/aaaede1c711ebe7a_b.jpg","GoodsImgCount":"5","onSaleCount":11,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787802257313","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787801410016","title":"台湾史志","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.73,"price":1.73,"shippingFee":5,"differencePrice":-6.73,"GoodsUrl":"https://book.kongfz.com/798675/8040942996","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaaaefed/232c9fe6560dc0d3_b.jpg","GoodsImgCount":"1","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572606052","title":"拉塞-玛娅侦探所 第三辑 自行车迷案","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.890000000000001,"price":2.89,"shippingFee":2,"differencePrice":-4.890000000000001,"GoodsUrl":"https://book.kongfz.com/769044/8524727079","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faafecfc/2145ab50be5e1ccf_b.jpg","GoodsImgCount":"2","onSaleCount":229,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787572231353","title":"咖啡帝国","quality":0,"qualityText":"","originalPrice":0,"totalPrice":51,"price":36,"shippingFee":15,"differencePrice":-51,"GoodsUrl":"https://book.kongfz.com/649298/8649997321","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acbaefcf/9704f4aa5c669110_b.jpg","GoodsImgCount":"7","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787515807263","title":"茶铎八音","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7,"price":2,"shippingFee":5,"differencePrice":-7,"GoodsUrl":"https://book.kongfz.com/261116/8559980205","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/addcaffe/b756d1e8b0eeafb9_b.jpg","GoodsImgCount":"1","onSaleCount":106,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787562010326","title":"公司法论","quality":0,"qualityText":"","originalPrice":0,"totalPrice":29.9,"price":27.9,"shippingFee":2,"differencePrice":-29.9,"GoodsUrl":"https://book.kongfz.com/241290/8326980017","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfcfccbf/eed05bc7c12dd20f_b.jpg","GoodsImgCount":"4","onSaleCount":32,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787554513514","title":"记忆传授人:“记忆传授人”四部曲 1","quality":0,"qualityText":"","originalPrice":0,"totalPrice":15,"price":5,"shippingFee":10,"differencePrice":-15,"GoodsUrl":"https://book.kongfz.com/661692/8614596277","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcabcada/0013bde7267e5d37_b.jpg","GoodsImgCount":"3","onSaleCount":94,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787309168846","title":"婴幼儿保教综合实训","quality":0,"qualityText":"","originalPrice":0,"totalPrice":26.24,"price":24.24,"shippingFee":2,"differencePrice":-26.24,"GoodsUrl":"https://book.kongfz.com/472611/8823269026","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fadceaad/f662f7d243246515_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787531825494","title":"乌龙院大长篇漫画系列","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11,"price":5,"shippingFee":6,"differencePrice":-11,"GoodsUrl":"https://book.kongfz.com/410862/8714471607","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/aaafbdbb/2b9d0462e1b8b767_b.jpg","GoodsImgCount":"3","onSaleCount":13,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787807408550","title":"正版实拍 下厨记 III","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5.13,"price":0.13,"shippingFee":5,"differencePrice":-5.13,"GoodsUrl":"https://book.kongfz.com/400965/8873428467","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efdcafef/08f462f18045e276_b.jpg","GoodsImgCount":"1","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787209126441","title":"不购买的习惯 日 金子由纪子著 山东人民出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":11.2,"price":6.2,"shippingFee":5,"differencePrice":-11.2,"GoodsUrl":"https://book.kongfz.com/910533/8800769752","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcdaadad/ce4e50b49763be2f_b.jpg","GoodsImgCount":"1","onSaleCount":105,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787501172740","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787530652817","title":"小说月报:412期","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.1,"price":5.8,"shippingFee":2.3,"differencePrice":-8.1,"GoodsUrl":"https://book.kongfz.com/364403/4247581312","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/3367/02e16f42ee18f1dbd6_b.jpg","GoodsImgCount":"4","onSaleCount":58,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787218120232","title":"梁冬说庄子 养生主","quality":0,"qualityText":"","originalPrice":0,"totalPrice":9.8,"price":3.8,"shippingFee":6,"differencePrice":-9.8,"GoodsUrl":"https://book.kongfz.com/914189/8243318884","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abefeddf/2c6a08c3f4dc1ba2_b.jpg","GoodsImgCount":"9","onSaleCount":185,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787111439066","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787213112072","title":"财之道丛书·奥地利学派经济学简史:米塞斯的视角","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.4,"price":8,"shippingFee":10.4,"differencePrice":-18.4,"GoodsUrl":"https://book.kongfz.com/668091/8661535563","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fbbfadfd/b4493c0b0d8ea96a_b.jpg","GoodsImgCount":"10","onSaleCount":121,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787522500522","title":"正版现货桑梓誉重归名宗陈新森主编9787522500522新华仓库多仓直发","quality":0,"qualityText":"","originalPrice":0,"totalPrice":13.16,"price":9.16,"shippingFee":4,"differencePrice":-13.16,"GoodsUrl":"https://book.kongfz.com/170527/8156889048","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cddfebdd/32e201fc94025693_b.jpg","GoodsImgCount":"1","onSaleCount":52,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787020017232","title":"《发货快》忏悔录 [法]卢梭 著,范希衡 译 人民文学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":8.07,"price":7.57,"shippingFee":0.5,"differencePrice":-8.07,"GoodsUrl":"https://book.kongfz.com/156492/8384830037","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/4362605/38ec4061f3fe6f66_b.jpg","GoodsImgCount":"1","onSaleCount":138,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787229081799","title":"生态文明:人类历史发展的必然选择(32开平装 全1册)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18.41,"price":12.41,"shippingFee":6,"differencePrice":-18.41,"GoodsUrl":"https://book.kongfz.com/669893/8313786940","imgBigUrl":"https://www0.kfzimg.com/G06/M00/25/C9/p4YBAFsMoJSAPkWRAABSFJoSyoY034_b.jpg","GoodsImgCount":"1","onSaleCount":8,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500872535","title":"我们的青春","quality":0,"qualityText":"","originalPrice":0,"totalPrice":12.39,"price":6.4,"shippingFee":5.99,"differencePrice":-12.39,"GoodsUrl":"https://book.kongfz.com/468773/6807539323","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bedbcadb/3b900667369fa822_b.jpg","GoodsImgCount":"3","onSaleCount":62,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519445454","title":"2020年山西省普通高校专升本考试专用教材英语山西省在校专升本研究组/光明日报出版社9787519445454","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.9,"price":10.9,"shippingFee":0,"differencePrice":-10.9,"GoodsUrl":"https://book.kongfz.com/248516/8585444909","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/8042428/a64c0e9c50f98710_b.jpg","GoodsImgCount":"1","onSaleCount":36,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787559801791","title":"汉文佛教文献研究 佛教文献研究译丛","quality":0,"qualityText":"","originalPrice":0,"totalPrice":55,"price":45,"shippingFee":10,"differencePrice":-55,"GoodsUrl":"https://book.kongfz.com/403/8540586001","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cfbfdeaa/d8216b91b56cedb8_b.jpg","GoodsImgCount":"2","onSaleCount":31,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787302476160","title":"系统规划与管理师教程(全国计算机技术与软件专业技术资格(水平)考试指定用书)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":7.2,"price":2.2,"shippingFee":5,"differencePrice":-7.2,"GoodsUrl":"https://book.kongfz.com/398369/8197191369","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/baccedbc/5d9742e389b4a01e_b.jpg","GoodsImgCount":"1","onSaleCount":203,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787516810637","title":"儿童的人格教育","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.75,"price":1.75,"shippingFee":3,"differencePrice":-4.75,"GoodsUrl":"https://book.kongfz.com/783956/8696984436","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/faeadeea/927cdef692f8076a_b.jpg","GoodsImgCount":"1","onSaleCount":210,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787513930970","title":"特殊罪案调查组2","quality":0,"qualityText":"","originalPrice":0,"totalPrice":10.82,"price":5.82,"shippingFee":5,"differencePrice":-10.82,"GoodsUrl":"https://book.kongfz.com/1092446/8817399954","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bcbdaffb/eda37e39d3acd1ba_b.jpg","GoodsImgCount":"1","onSaleCount":156,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787547405826","title":"金刚经 心经 国学经典读本丛书 金刚经心经","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.65,"price":4.25,"shippingFee":2.4,"differencePrice":-6.65,"GoodsUrl":"https://book.kongfz.com/561672/8830865409","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/dcfcdaca/dc3cf0b7d7e039d5_b.jpg","GoodsImgCount":"1","onSaleCount":86,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787010218908","title":"夏商西周散文传播研究:基于先秦文献的考察","quality":0,"qualityText":"","originalPrice":0,"totalPrice":21.8,"price":16.8,"shippingFee":5,"differencePrice":-21.8,"GoodsUrl":"https://book.kongfz.com/475714/8882481687","imgBigUrl":"https://www0.kfzimg.com/sw/kfzimg/2344/01db6e7c5a748513a1_b.jpg","GoodsImgCount":"1","onSaleCount":30,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787560070216","title":"","quality":0,"qualityText":"","originalPrice":0,"totalPrice":0,"price":0,"shippingFee":0,"differencePrice":0,"GoodsUrl":"","imgBigUrl":"","GoodsImgCount":"","onSaleCount":0,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":0,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787108047052","title":"陈寅恪的最后二十年(修订本)(精装)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":40,"price":35,"shippingFee":5,"differencePrice":-40,"GoodsUrl":"https://book.kongfz.com/626307/8183197623","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/afdbbbfc/492dfd0042fef08c_b.jpg","GoodsImgCount":"3","onSaleCount":114,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787101140521","title":"造物记云南古茶园的秘密","quality":0,"qualityText":"","originalPrice":0,"totalPrice":39.7,"price":37.7,"shippingFee":2,"differencePrice":-39.7,"GoodsUrl":"https://book.kongfz.com/1214248/8773603177","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cecbdbfd/384816fe4b359bb4_b.jpg","GoodsImgCount":"4","onSaleCount":45,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787505204324","title":"正方.反方.评方--历届大学生辩论会","quality":0,"qualityText":"","originalPrice":0,"totalPrice":5,"price":2,"shippingFee":3,"differencePrice":-5,"GoodsUrl":"https://book.kongfz.com/839152/8830821017","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/fcfefbed/6df83dc8f9f4eb3e_b.jpg","GoodsImgCount":"1","onSaleCount":71,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787107174261","title":"滥觞与辉煌:朱永新教育文集(卷二)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":6.92,"price":3.92,"shippingFee":3,"differencePrice":-6.92,"GoodsUrl":"https://book.kongfz.com/566350/8848531607","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/efededba/8793fe0e5f859d15_b.jpg","GoodsImgCount":"7","onSaleCount":38,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787300085425","title":"经验与理论:中国社会、经济与法律的实践历史研究","quality":0,"qualityText":"","originalPrice":0,"totalPrice":91,"price":85,"shippingFee":6,"differencePrice":-91,"GoodsUrl":"https://book.kongfz.com/26986/8505318233","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ffebaceb/5e665fe35d11e0d6_b.jpg","GoodsImgCount":"4","onSaleCount":41,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553743356","title":"跟着大厨学做宴客菜","quality":0,"qualityText":"","originalPrice":0,"totalPrice":4.99,"price":2.99,"shippingFee":2,"differencePrice":-4.99,"GoodsUrl":"https://book.kongfz.com/779125/8445844689","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/edecdbcb/1f663356d75b3fc1_b.jpg","GoodsImgCount":"1","onSaleCount":227,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787500925774","title":"陈式太极拳精义","quality":0,"qualityText":"","originalPrice":0,"totalPrice":18,"price":8,"shippingFee":10,"differencePrice":-18,"GoodsUrl":"https://book.kongfz.com/204681/8857864879","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/ccecdacf/a4fbff5bf6a42616_b.jpg","GoodsImgCount":"7","onSaleCount":69,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787553924571","title":"20世纪中国科学口述史·走自己的路——吴文俊口述自传(正版\\内页干净\\实物拍摄)","quality":0,"qualityText":"","originalPrice":0,"totalPrice":51,"price":45,"shippingFee":6,"differencePrice":-51,"GoodsUrl":"https://book.kongfz.com/218311/8625508085","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/acddbbcb/1d9a5ae19c383ddb_b.jpg","GoodsImgCount":"4","onSaleCount":18,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787534501043","title":"实用武当气功","quality":0,"qualityText":"","originalPrice":0,"totalPrice":16,"price":9,"shippingFee":7,"differencePrice":-16,"GoodsUrl":"https://book.kongfz.com/14581/8817086084","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/bbccbcbe/ead694ffe452f428_b.jpg","GoodsImgCount":"8","onSaleCount":17,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787509138052","title":"周耀庭讲小儿温病","quality":0,"qualityText":"","originalPrice":0,"totalPrice":23,"price":17,"shippingFee":6,"differencePrice":-23,"GoodsUrl":"https://book.kongfz.com/270515/8661563982","imgBigUrl":"https://www0.kfzimg.com/G07/M00/75/F2/q4YBAFvlRaeAYNaJAABkY-JAiVw250_b.jpg","GoodsImgCount":"1","onSaleCount":23,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0},{"isbn":"9787519122263","title":"【正版二手】大学素养语文第三版金振邦第3版9787519122263教育科学出版社","quality":0,"qualityText":"","originalPrice":0,"totalPrice":3.29,"price":3.29,"shippingFee":0,"differencePrice":-3.29,"GoodsUrl":"https://book.kongfz.com/783101/8471284217","imgBigUrl":"https://www0.kfzimg.com/sw/kfz-cos/kfzimg/abdbfefa/6189125599d2f3e6_b.jpg","GoodsImgCount":"6","onSaleCount":216,"soldCount":0,"shopAvgShippingTime":"","shopSuccessOrderRate":"","dataType":2,"shouldRetry":false,"platformId":0,"skuId":0}],"condition":85,"imageSelect":1,"userId":"1967112570379649025","taskId":"中心书库发布VB_0;BS_0;OMS_0;IllP_0;IA_0;BCS_2,999999;SCS_5,999999;userId_1967112570379649025;rand_1759227336656-3","way":"0"} +【2025-09-30 18:27:08】【返回参数】{"code":"200","success":true,"message":"执行成功"} +【2025-09-30 18:27:09】【日志结束,方法名称:centerBooks】【centerBooksAdd】中心书库发布商品 \ No newline at end of file diff --git a/file/log/centerBooksAdd_1983373997176135681_33.txt b/file/log/centerBooksAdd_1983373997176135681_33.txt new file mode 100644 index 0000000..79d5fd1 --- /dev/null +++ b/file/log/centerBooksAdd_1983373997176135681_33.txt @@ -0,0 +1,5 @@ + +【2026-05-28 15:01:10】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-05-28 15:01:10】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":293,"fileName":"task_template_1779944336050.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/4bc95289-eeb0-4722-8531-3deee41a9729_task_template_1779944336050.xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2059892720069992449\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":"1983373997176135681","proportion":100,"addNum":0}],"shopIds":"2059539257909739521","synchronizationType":"1","bookCategory":"0"},"userId":"1983373997176135681"} +【2026-05-28 15:02:23】【返回参数】null +【2026-05-28 15:02:23】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods \ No newline at end of file diff --git a/file/log/centerBooksAdd_1_1.txt b/file/log/centerBooksAdd_1_1.txt new file mode 100644 index 0000000..ad31979 --- /dev/null +++ b/file/log/centerBooksAdd_1_1.txt @@ -0,0 +1,203 @@ + +【2025-09-18 18:03:25】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-09-18 18:03:26】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1968616845749116930","taskType":"1","shopIds":"1968345938572304386","shopNames":"棵韵KEOYURNE图书旗舰店","fileName":"excel表格上传:知书上货模版 - 副本.xlsx","dataNum":33,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","way":"0","listStatus":"0","bookCategory":"0","shopIds":"1968345938572304386","data":{"total":33,"fileName":"知书上货模版 - 副本.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/b0bb2e99-ba12-440d-b4b2-306abcd2aef3_知书上货模版 - 副本.xlsx"},"imageSelect":"1","deleteNum":0},"userId":1} +【2025-09-18 18:04:13】【系统异常】【异常方法】addGoods +【2025-09-18 18:04:13】【系统异常】【异常内容】java.lang.RuntimeException: java.lang.RuntimeException: 读取Excel失败: Server returned HTTP response code: 400 for URL: https://book.center.file.buzhiyushu.cn/TaskExcel/b0bb2e99-ba12-440d-b4b2-306abcd2aef3_知书上货模版 - 副本.xlsx + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:233) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) +Caused by: java.lang.RuntimeException: 读取Excel失败: Server returned HTTP response code: 400 for URL: https://book.center.file.buzhiyushu.cn/TaskExcel/b0bb2e99-ba12-440d-b4b2-306abcd2aef3_知书上货模版 - 副本.xlsx + at org.dromara.zhishu.util.EasyExcelUtil.readExcelFromUrl(EasyExcelUtil.java:309) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:231) + ... 24 more +Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://book.center.file.buzhiyushu.cn/TaskExcel/b0bb2e99-ba12-440d-b4b2-306abcd2aef3_知书上货模版 - 副本.xlsx + at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:2018) + at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1610) + at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224) + at java.base/java.net.URL.openStream(URL.java:1161) + at org.dromara.zhishu.util.EasyExcelUtil.readExcelFromUrl(EasyExcelUtil.java:303) + ... 25 more + +【2025-09-18 18:04:13】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-09-18 18:05:47】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-09-18 18:05:47】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1968617440169996290","taskType":"1","shopIds":"1968345938572304386","shopNames":"棵韵KEOYURNE图书旗舰店","fileName":"excel表格上传:知书上货模版.xlsx","dataNum":33,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","way":"0","listStatus":"1","bookCategory":"0","shopIds":"1968345938572304386","data":{"total":33,"fileName":"知书上货模版.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/570eb2d9-9ec7-48d9-a4b0-eb7f5788c925_知书上货模版.xlsx"},"imageSelect":"1","deleteNum":0},"userId":1} +【2025-09-18 18:08:07】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-09-18 18:08:07】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1968618027657789441","taskType":"1","shopIds":"1968345938572304386","shopNames":"棵韵KEOYURNE图书旗舰店","fileName":"excel表格上传:知书上货模版.xlsx","dataNum":33,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","way":"0","listStatus":"1","bookCategory":"0","shopIds":"1968345938572304386","data":{"total":33,"fileName":"知书上货模版.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/aa38cb76-3464-4b93-8ffa-c378b025981e_知书上货模版.xlsx"},"imageSelect":"1","deleteNum":0},"userId":1} +【2025-09-18 18:09:47】【返回参数】null +【2025-09-18 18:09:47】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-10-09 20:36:50】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-10-09 20:36:50】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1976265599406866434","taskType":"1","shopIds":"1976212171971805186","shopNames":"欲泽居家拖鞋专营店","fileName":"excel表格上传:1 (2).xlsx","dataNum":115788,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","way":"2","listStatus":"1","bookCategory":"0","shopIds":"1976212171971805186","data":{"total":115788,"fileName":"1 (2).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/f88e7c48-c4f7-4ac3-b00e-b9059912b4c0_1 (2).xlsx"},"imageSelect":"1","deleteNum":0},"userId":1} +【2025-10-09 20:37:27】【系统异常】【异常方法】addGoods +【2025-10-09 20:37:27】【系统异常】【异常内容】java.lang.RuntimeException: java.lang.RuntimeException: 读取Excel失败: Server returned HTTP response code: 400 for URL: https://book.center.file.buzhiyushu.cn/TaskExcel/f88e7c48-c4f7-4ac3-b00e-b9059912b4c0_1 (2).xlsx + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:234) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:842) +Caused by: java.lang.RuntimeException: 读取Excel失败: Server returned HTTP response code: 400 for URL: https://book.center.file.buzhiyushu.cn/TaskExcel/f88e7c48-c4f7-4ac3-b00e-b9059912b4c0_1 (2).xlsx + at org.dromara.zhishu.util.EasyExcelUtil.readExcelFromUrl(EasyExcelUtil.java:309) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:232) + ... 24 more +Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://book.center.file.buzhiyushu.cn/TaskExcel/f88e7c48-c4f7-4ac3-b00e-b9059912b4c0_1 (2).xlsx + at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:2018) + at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1610) + at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224) + at java.base/java.net.URL.openStream(URL.java:1161) + at org.dromara.zhishu.util.EasyExcelUtil.readExcelFromUrl(EasyExcelUtil.java:303) + ... 25 more + +【2025-10-09 20:37:27】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-10-14 14:16:18】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2025-10-14 14:16:18】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":"1977981773408706561","taskType":"1","shopIds":"1977668615057432578","shopNames":"云眠书籍专营店","fileName":"excel表格上传:1.xlsx","dataNum":58628,"taskStatus":"0","status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","way":"2","listStatus":"1","bookCategory":"0","shopIds":"1977668615057432578","data":{"total":58628,"fileName":"1.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/f7d49467-3805-4f0f-b8b2-a30490b5fc87_1.xlsx"},"imageSelect":"1","deleteNum":0},"userId":1} +【2026-04-03 14:12:12】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:12:12】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/c54e1f5d-4a0d-46a7-9ca5-2333e9bba455_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039949064445775874\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 14:12:14】【返回参数】null +【2026-04-03 14:12:14】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:31:05】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:31:05】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ddb09ef2-3402-4a3a-84f7-5a498e09556e_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039953815631712258\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 14:31:08】【返回参数】null +【2026-04-03 14:31:08】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:37:40】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:37:40】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/ef416bf3-0f56-4adc-b950-be4c6343141d_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039955473279373313\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 14:37:43】【返回参数】null +【2026-04-03 14:37:43】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:42:30】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:42:30】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/96f302c4-ec51-4144-97af-875389c2a769_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039956688440545282\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 14:42:33】【返回参数】null +【2026-04-03 14:42:33】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:50:33】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 14:50:33】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/276af74c-8e55-41e5-9e62-5faee13ff42e_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"1","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039958713328881665\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 14:51:52】【返回参数】null +【2026-04-03 14:51:52】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:01:56】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:01:56】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/0a4466b1-28de-42fb-a926-4cc221a9016e_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039961581154881538\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 15:31:30】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:31:30】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":40,"fileName":"4.2上传发布(1).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/64be1f86-09df-41e0-a87a-c116eb2d838d_4.2上传发布(1).xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039969020432515073\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 15:32:55】【返回参数】null +【2026-04-03 15:32:55】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:37:19】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:37:19】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"proportion":100,"addNum":0}],"data":{"total":51,"fileName":"4.3上传发布.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/7144a800-d9d3-4bb4-b385-75494669d824_4.3上传发布.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039970485242855425\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 15:38:14】【返回参数】null +【2026-04-03 15:38:14】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:42:15】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:42:15】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":51,"fileName":"4.3上传发布.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/228912ff-8e20-4881-8e3f-8db839b520da_4.3上传发布.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039971725540491265\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 15:42:16】【系统异常】【异常方法】addGoods +【2026-04-03 15:42:16】【系统异常】【异常内容】org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error on POST request for "http://36.212.20.113:8182/api/goods/simple": "{"code":500,"message":"系统内部错误","success":false}" + at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:102) + at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:189) + at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:147) + at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:953) + at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:902) + at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801) + at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:549) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:264) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:257) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:840) + +【2026-04-03 15:42:16】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:45:04】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-04-03 15:45:04】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null},"map":{"taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"data":{"total":51,"fileName":"4.3上传发布.xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/5d89e6b8-7fb4-4840-8817-beeaf1e19951_4.3上传发布.xlsx"},"imageSelect":"1","deleteNum":0,"shopIds":"2039603208249057282","listStatus":"0","synchronizationType":"1","bookCategory":"0","way":"2","createResStr":"{\"code\":\"200\",\"data\":\"2039972434512084994\",\"msg\":\"成功\"}\n"},"userId":1} +【2026-04-03 15:45:10】【系统异常】【异常方法】addGoods +【2026-04-03 15:45:10】【系统异常】【异常内容】org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error on POST request for "http://36.212.20.113:8182/api/goods/simple": "{"code":500,"message":"系统内部错误","success":false}" + at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:102) + at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:189) + at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:147) + at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:953) + at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:902) + at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801) + at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:549) + at org.dromara.zhishu.util.InterfaceUtils.postForm(InterfaceUtils.java:264) + at org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(TaskServiceImpl.java:257) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) + at org.dromara.zhishu.util.RunningLogUtils.runningLog(RunningLogUtils.java:42) + at org.dromara.zhishu.aspect.CenterAspect.addGoods(CenterAspect.java:88) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:638) + at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:628) + at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) + at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727) + at org.dromara.zhishu.service.impl.TaskServiceImpl$$SpringCGLIB$$0.addGoods() + at org.dromara.zhishu.util.TaskRunnable.run(TaskRunnable.java:39) + at java.base/java.lang.Thread.run(Thread.java:840) + +【2026-04-03 15:45:10】【日志结束,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-06-04 17:34:51】【日志开始,方法名称:addGoods】【centerBooksAdd】中心书库发布商品发布方法addGoods +【2026-06-04 17:34:51】【执行参数】{"taskBo":{"createDept":null,"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"id":null,"taskType":null,"shopIds":null,"shopNames":null,"fileName":null,"dataNum":null,"taskStatus":null,"status":null,"threadId":null,"relationId":null,"way":"0"},"map":{"bookCategoryAppoint":0,"data":{"total":34237,"fileName":"漫游鲸童书奥莱店(更新价格库存).xlsx","url":"https://book.center.file.buzhiyushu.cn/TaskExcel/433e6243-db36-4fb3-9bf9-bea1242c9f48_漫游鲸童书奥莱店(更新价格库存).xlsx"},"imageSelect":"1","deleteNum":0,"listStatus":"0","way":"0","createResStr":"{\"code\":\"200\",\"data\":\"2062468107744514049\",\"msg\":\"成功\"}\n","taskType":"1","priceAdjustments":[{"userId":1,"proportion":100,"addNum":0}],"shopIds":"2062044901082611714","synchronizationType":"1","bookCategory":"0"},"userId":1} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..24f163c --- /dev/null +++ b/pom.xml @@ -0,0 +1,520 @@ + + + 4.0.0 + + org.dromara + ruoyi-vue-plus + ${revision} + + ZhiShu + https://gitee.com/dromara/RuoYi-Vue-Plus + Dromara RuoYi-Vue-Plus多租户管理系统 + + + 5.3.0 + 3.4.2 + UTF-8 + UTF-8 + 17 + 3.5.16 + 2.8.4 + 0.15.0 + 4.0.3 + 2.3 + 1.40.0 + 3.5.10 + 3.9.1 + 5.8.35 + 3.4.1 + 3.44.0 + 2.2.7 + 4.3.1 + 1.3.0 + 1.4.6 + 0.2.0 + 1.18.36 + 1.76 + 1.16.7 + + 2.7.0 + + + 2.28.22 + 0.31.3 + + 3.3.3 + + 1.2.83 + + 8.7.2-20250101 + + 1.6.6 + + + 3.2.2 + 3.2.2 + 3.11.0 + 3.1.2 + 1.3.0 + + + + + local + + + local + info + ruoyi + 123456 + + + + dev + + + dev + info + ruoyi + 123456 + + + + true + + + + prod + + prod + warn + ruoyi + 123456 + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + cn.hutool + hutool-bom + ${hutool.version} + pom + import + + + + + org.dromara.warm + warm-flow-mybatis-plus-sb3-starter + ${warm-flow.version} + + + org.dromara.warm + warm-flow-plugin-ui-sb-web + ${warm-flow.version} + + + + + me.zhyd.oauth + JustAuth + ${justauth.version} + + + + + org.dromara + ruoyi-common-bom + ${revision} + pom + import + + + + org.springdoc + springdoc-openapi-starter-webmvc-api + ${springdoc.version} + + + + com.github.therapi + therapi-runtime-javadoc + ${therapi-javadoc.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + com.alibaba + easyexcel + ${easyexcel.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + cn.dev33 + sa-token-spring-boot3-starter + ${satoken.version} + + + + cn.dev33 + sa-token-jwt + ${satoken.version} + + + cn.hutool + hutool-all + + + + + cn.dev33 + sa-token-core + ${satoken.version} + + + + + com.baomidou + dynamic-datasource-spring-boot3-starter + ${dynamic-ds.version} + + + + org.mybatis + mybatis + ${mybatis.version} + + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-jsqlparser + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-annotation + ${mybatis-plus.version} + + + + + p6spy + p6spy + ${p6spy.version} + + + + + software.amazon.awssdk + s3 + ${aws.sdk.version} + + + + software.amazon.awssdk.crt + aws-crt + ${aws.crt.version} + + + + software.amazon.awssdk + s3-transfer-manager + ${aws.sdk.version} + + + + org.dromara.sms4j + sms4j-spring-boot-starter + ${sms4j.version} + + + + de.codecentric + spring-boot-admin-starter-server + ${spring-boot-admin.version} + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + com.baomidou + lock4j-redisson-spring-boot-starter + ${lock4j.version} + + + + + com.aizuda + snail-job-client-starter + ${snailjob.version} + + + + com.aizuda + snail-job-client-job-core + ${snailjob.version} + + + + com.aizuda + snail-job-client-retry-core + ${snail-job.version} + + + + org.bouncycastle + bcprov-jdk15to18 + ${bouncycastle.version} + + + + io.github.linpeilie + mapstruct-plus-spring-boot-starter + ${mapstruct-plus.version} + + + + + org.lionsoul + ip2region + ${ip2region.version} + + + + commons-io + commons-io + 2.15.0 + + + + com.alibaba + fastjson + ${fastjson.version} + + + + org.dromara + ruoyi-system + ${revision} + + + + org.dromara + ruoyi-zhishu + ${revision} + + + + org.dromara + ruoyi-job + ${revision} + + + + org.dromara + ruoyi-generator + ${revision} + + + + org.dromara + ruoyi-demo + ${revision} + + + + + org.dromara + ruoyi-workflow + ${revision} + + + + + + + ruoyi-admin + ruoyi-common + ruoyi-extend + ruoyi-modules + + pom + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + com.github.therapi + therapi-runtime-javadoc-scribe + ${therapi-javadoc.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + + + io.github.linpeilie + mapstruct-plus-processor + ${mapstruct-plus.version} + + + org.projectlombok + lombok-mapstruct-binding + ${mapstruct-plus.lombok.version} + + + + -parameters + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + -Dfile.encoding=UTF-8 + + ${profiles.active} + + exclude + + true + + + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + + + src/main/resources + + false + + + src/main/resources + + + application* + bootstrap* + banner* + + + true + + + + + + + public + huawei nexus + https://mirrors.huaweicloud.com/repository/maven/ + + true + + + + + + + public + huawei nexus + https://mirrors.huaweicloud.com/repository/maven/ + + true + + + false + + + + + + + diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile new file mode 100644 index 0000000..b489ab5 --- /dev/null +++ b/ruoyi-admin/Dockerfile @@ -0,0 +1,30 @@ +# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ +FROM bellsoft/liberica-openjdk-debian:17.0.11-cds +#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +#FROM findepi/graalvm:java17-native + +LABEL maintainer="Lion Li" + +RUN mkdir -p /ruoyi/server/logs \ + /ruoyi/server/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/server + +ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-admin.jar ./app.jar +# 工作流字体文件 +ADD ./zhFonts/ /usr/share/fonts/zhFonts/ + +SHELL ["/bin/bash", "-c"] + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + # 应用名称 如果想区分集群节点监控 改成不同的名称即可 + #-Dskywalking.agent.service_name=ruoyi-server \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ + -jar app.jar + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml new file mode 100644 index 0000000..6c1fa0e --- /dev/null +++ b/ruoyi-admin/pom.xml @@ -0,0 +1,181 @@ + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + jar + ruoyi-admin + + + web服务入口 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.mysql + mysql-connector-j + + + + + + + + + + + + + + + + + + + + + + + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-social + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-system + + + + org.dromara + ruoyi-zhishu + + + + org.dromara + ruoyi-job + + + + + org.dromara + ruoyi-generator + + + + + org.dromara + ruoyi-demo + + + + + org.dromara + ruoyi-workflow + + + + de.codecentric + spring-boot-admin-starter-client + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + + + + + + + + + commons-logging + commons-logging + 1.2 + + + + com.google.code.gson + gson + 2.8.5 + + + + + + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + ${project.artifactId} + + + + + + diff --git a/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java b/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java new file mode 100644 index 0000000..066a683 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java @@ -0,0 +1,18 @@ +package org.dromara; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author Lion Li + */ +public class DromaraServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(DromaraApplication.class); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java new file mode 100644 index 0000000..2c1a8ef --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -0,0 +1,507 @@ +package org.dromara.web.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.*; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.*; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.*; +import org.dromara.web.domain.vo.LoginTenantVo; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.domain.vo.TenantListVo; +import org.dromara.web.domain.vo.WxLoginVo; +import org.dromara.web.domain.vo.dto.UserLoginDTO; +import org.dromara.web.domain.vo.dto.WxRegisterDTO; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.dromara.web.service.SysRegisterService; +import org.dromara.zhishu.service.SignGeneratorService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * 认证 + * + * @author Lion Li + */ +@Slf4j +@SaIgnore +@RequiredArgsConstructor +@RestController +@RequestMapping("/auth") +@CrossOrigin(origins = "https://erp.newadmin.buzhiyushu.cn",maxAge = 3600) +public class AuthController { + + private final SocialProperties socialProperties; + private final SysLoginService loginService; + private final SysRegisterService registerService; + private final ISysConfigService configService; + private final ISysTenantService tenantService; + private final ISysSocialService socialUserService; + private final ISysClientService clientService; + private final ScheduledExecutorService scheduledExecutorService; + private final ISysUserService userService; + private final SignGeneratorService signGeneratorService; + @Value("${wechat.appid}") + private String appid; + + @Value("${wechat.secret}") + private String secret; + + @Value("${wechat.jscode2session-url}") + private String loginUrl; + + + /** + * 登录方法 + * + * @param body 登录信息 + * @return 结果 + */ + //@ApiEncrypt + @PostMapping("/login") + public R login(@RequestBody String body) { +// System.out.println("body:" + body); + LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); + long timestamp1 = System.currentTimeMillis() / 1000; + String sign = null; + if (loginBody != null) { + sign = signGeneratorService.generateCallbackSign(loginBody.getLogin_code(), timestamp1, "erp_callback_sk_7f8a9b2c4d5e6f1a3b7c9d2e4f5a6b8c"); + } + + + ValidatorUtils.validate(loginBody); + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); +// System.out.println("===============" + grantType); + SysClientVo client = clientService.queryByClientId(clientId); +// System.out.println(client); + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } else if (SystemConstants.NORMAL.equals(client.getStatus())) { + return R.fail(MessageUtils.message("auth.grant.type.blocked")); + } + // 校验租户 + loginService.checkTenant(loginBody.getTenantId()); + // 登录 + LoginVo loginVo = IAuthStrategy.login(body, client, grantType); + + if (!StringUtils.isEmpty(loginBody.getLogin_code())){ + // 调用 ERP 回调 API + try { + //入口层 + String callbackUrl = "https://wallet.api.buzhiyushu.cn/api/oauth/erp/callback"; + URL url = new URL(callbackUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + connection.setRequestProperty("Accept", "application/json"); + + // URL编码所有参数值 + StringBuilder postData = new StringBuilder(); + postData.append("login_code=").append(URLEncoder.encode( + String.valueOf(loginBody.getLogin_code()), "UTF-8")); + postData.append("&erp_user_id=").append(URLEncoder.encode( + String.valueOf(LoginHelper.getUserId()), "UTF-8")); + + postData.append("&erp_token=").append(URLEncoder.encode( + String.valueOf(loginVo.getAccessToken()), "UTF-8")); + postData.append("&erp_username=").append(URLEncoder.encode( + String.valueOf(userService.selectUserById(LoginHelper.getUserId()).getUserName()), "UTF-8")); + postData.append("×tamp=").append(URLEncoder.encode( + String.valueOf(timestamp1), "UTF-8")); + postData.append("&sign=").append(URLEncoder.encode( + String.valueOf(sign), "UTF-8")); + + // 打印请求信息用于调试 + log.info("发送请求到: {}, 参数: {}", callbackUrl, postData.toString()); + + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); + connection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); + + try (OutputStream os = connection.getOutputStream()) { + os.write(postDataBytes); + os.flush(); + } + + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + log.error("ERP 回调 API 调用失败,状态码: {}", responseCode); + + // 读取错误信息 + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + log.error("错误响应: {}", response.toString()); + } + } else { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + log.info("ERP 回调 API 调用成功,响应: {}", response.toString()); + } + } + connection.disconnect(); + } catch (Exception e) { + log.error("调用 ERP 回调 API 时发生异常", e); + } + } + + Long userId = LoginHelper.getUserId(); + scheduledExecutorService.schedule(() -> { + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("欢迎登录知书图书助理后台管理系统"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 5, TimeUnit.SECONDS); +// System.out.println("000000000000" + loginVo); + return R.ok(loginVo); + } + + @PostMapping("/interFaceLogin") + public R interFaceLogin(InterfaceLoginBody loginBody){ +// System.out.println("body:" + loginBody); + String clientId = loginBody.getClientId(); + SysClientVo client = clientService.queryByClientId(clientId); + String phoneNumber = loginBody.getPhoneNumber(); + String password = loginBody.getPassword(); + SysUserVo userVo = userService.selectUserByPhonenumber(phoneNumber); + if (userVo == null) { + log.error("用户手机号 {} 未找到对应的用户记录", phoneNumber); + throw new ServiceException("用户未找到对应的用户记录"); + } + // 验证密码是否正确 + if (!BCrypt.checkpw(password, userVo.getPassword())) { + log.error("用户密码不正确"); + throw new ServiceException("用户密码不正确"); + } + LoginUser loginUser = loginService.buildLoginUser(userVo); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + loginVo.setPhoneNumber(phoneNumber); + loginVo.setNickName(loginUser.getNickname()); + loginVo.setUserId(userVo.getUserId()); + return R.ok(loginVo); + } + + + /** + * 获取跳转URL + * + * @param source 登录来源 + * @return 结果 + */ + @GetMapping("/binding/{source}") + public R authBinding(@PathVariable("source") String source, + @RequestParam String tenantId, @RequestParam String domain) { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + return R.fail(source + "平台账号暂不支持"); + } + AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); + Map map = new HashMap<>(); + map.put("tenantId", tenantId); + map.put("domain", domain); + map.put("state", AuthStateUtils.createState()); + String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8)); + return R.ok("操作成功", authorizeUrl); + } + + /** + * 前端回调绑定授权(需要token) + * + * @param loginBody 请求体 + * @return 结果 + */ + @PostMapping("/social/callback") + public R socialCallback(@RequestBody SocialLoginBody loginBody) { + // 校验token + StpUtil.checkLogin(); + // 获取第三方登录信息 + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + AuthUser authUserData = response.getData(); + // 判断授权响应是否成功 + if (!response.ok()) { + return R.fail(response.getMsg()); + } + loginService.socialRegister(authUserData); + return R.ok(); + } + + + /** + * 取消授权(需要token) + * + * @param socialId socialId + */ + @DeleteMapping(value = "/unlock/{socialId}") + public R unlockSocial(@PathVariable Long socialId) { + // 校验token + StpUtil.checkLogin(); + Boolean rows = socialUserService.deleteWithValidById(socialId); + return rows ? R.ok() : R.fail("取消授权失败"); + } + + + /** + * 退出登录 + */ + @PostMapping("/logout") + public R logout() { + loginService.logout(); + return R.ok("退出成功"); + } + + /** + * 用户注册 + */ +// @ApiEncrypt + @PostMapping("/register") + @SaIgnore + public R register(@Validated @RequestBody RegisterBody user) { +// if (!configService.selectRegisterEnabled(user.getTenantId())) { +// return R.fail("当前系统没有开启注册功能!"); +// } + registerService.register(user); + return R.ok(); + } + + /** + * 登录页面租户下拉框 + * + * @return 租户列表 + */ + @GetMapping("/tenant/list") + public R tenantList(HttpServletRequest request) throws Exception { + // 返回对象 + LoginTenantVo result = new LoginTenantVo(); + boolean enable = TenantHelper.isEnable(); + result.setTenantEnabled(enable); + // 如果未开启租户这直接返回 + if (!enable) { + return R.ok(result); + } + + List tenantList = tenantService.queryList(new SysTenantBo()); + List voList = MapstructUtils.convert(tenantList, TenantListVo.class); + try { + // 如果只超管返回所有租户 + if (LoginHelper.isSuperAdmin()) { + result.setVoList(voList); + return R.ok(result); + } + } catch (NotLoginException ignored) { + } + + // 获取域名 + String host; + String referer = request.getHeader("referer"); + if (StringUtils.isNotBlank(referer)) { + // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试 + host = referer.split("//")[1].split("/")[0]; + } else { + host = new URL(request.getRequestURL().toString()).getHost(); + } + // 根据域名进行筛选 + List list = StreamUtils.filter(voList, vo -> + StringUtils.equalsIgnoreCase(vo.getDomain(), host)); + result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); + return R.ok(result); + } + + @SneakyThrows + @PostMapping("/wxLogin") + public ResponseEntity wxLogin(@Valid @RequestBody UserLoginDTO userLoginDTO) { + String code = userLoginDTO.getCode(); + try { + String requestUrl = loginUrl + "?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code"; + URL url = new URL(requestUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + StringBuilder response = new StringBuilder(); + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + JSONObject jsonObject = JSONObject.parseObject(response.toString()); + if (jsonObject.containsKey("openid") && jsonObject.containsKey("session_key")) { + String openid = jsonObject.getString("openid"); + String sessionKey = jsonObject.getString("session_key"); + String token = generateToken(openid, sessionKey); + WxLoginVo loginVo = new WxLoginVo(); + loginVo.setOpenid(openid); + loginVo.setToken(token); + return ResponseEntity.ok(loginVo); + } else { + return ResponseEntity.badRequest().build(); + } + } catch (IOException e) { + return ResponseEntity.internalServerError().build(); + } + } + + private String generateToken(String openid, String sessionKey) { + return openid + "_" + sessionKey; + } + + @PostMapping("/wxRegister") + @SaIgnore + public R wxRegister(@RequestBody WxRegisterDTO wxRegisterDTO) { + registerService.WxRegister(wxRegisterDTO); + return R.ok(); + } + + @PostMapping("/getUserName") + @SaIgnore + public List getUserName() { + return userService.selectUserName(); + } + + @GetMapping("/autoLogin") + @SaIgnore + public ModelAndView autoLoginGet(@RequestParam("userId") Long userId, HttpServletResponse response) throws IOException { +// System.out.println("开始自动登录流程 - 用户ID: " + userId); + // 1. 查询用户 + SysUserVo user = userService.selectUserByUserId(userId); + System.out.println("获取用户信息结果: " + (user != null ? "成功" : "失败")); +// System.out.println("用户信息: " + user); + // 2. 构建LoginUser + LoginUser loginUser = loginService.buildLoginUser(user); + loginUser.setClientKey("pc"); + loginUser.setDeviceType("pc"); + SaLoginModel model = new SaLoginModel(); + model.setDevice("pc"); + model.setTimeout(604800); + model.setActiveTimeout(1800); + model.setExtra(LoginHelper.CLIENT_KEY, "e5cd7e4891bf95d1d19206ce24a7b32e"); + LoginHelper.login(loginUser, model); + String token = StpUtil.getTokenValue(); + Cookie cookie = new Cookie("satoken", token); + cookie.setPath("/"); + cookie.setMaxAge(604800); + response.addCookie(cookie); + response.setHeader("Authorization", "Bearer " + token); +// System.out.println("登录完成,token: " + StpUtil.getTokenValue()); + System.out.println("====进行跳转"); + System.out.println("准备跳转到首页"); + return new ModelAndView(new RedirectView("https://api.buzhiyushu.cn/reigsn?token=" + token)); + } + + @GetMapping("/test") + @SaIgnore + public ModelAndView test(HttpServletResponse response) throws IOException { + System.out.println("开始测试登录流程"); + + Long userId = 1L; + // 1. 查询用户 + // 1. 查询用户 + SysUserVo user = userService.selectUserByUserId(userId); + System.out.println("获取用户信息结果: " + (user != null ? "成功" : "失败")); +// System.out.println("用户信息: " + user); + // 2. 构建LoginUser + LoginUser loginUser = loginService.buildLoginUser(user); + loginUser.setClientKey("pc"); + loginUser.setDeviceType("pc"); + SaLoginModel model = new SaLoginModel(); + model.setDevice("pc"); + model.setTimeout(604800); + model.setActiveTimeout(1800); + model.setExtra(LoginHelper.CLIENT_KEY, "e5cd7e4891bf95d1d19206ce24a7b32e"); + LoginHelper.login(loginUser, model); + + String token = StpUtil.getTokenValue(); + Cookie cookie = new Cookie("satoken", token); + cookie.setPath("/"); + cookie.setMaxAge(604800); + response.addCookie(cookie); + response.setHeader("Authorization", "Bearer " + token); +// System.out.println("登录完成,token: " + StpUtil.getTokenValue()); + System.out.println("====进行跳转"); + System.out.println("准备跳转到首页"); + return new ModelAndView(new RedirectView("https://erp.buzhiyushu.cn/index?token=" + token)); + } + + + + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java new file mode 100644 index 0000000..7338d3c --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -0,0 +1,139 @@ +package org.dromara.web.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.mail.config.properties.MailProperties; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.ratelimiter.enums.LimitType; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.config.properties.CaptchaProperties; +import org.dromara.common.web.enums.CaptchaType; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.web.domain.vo.CaptchaVo; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; +import java.util.LinkedHashMap; + +/** + * 验证码操作处理 + * + * @author Lion Li + */ +@SaIgnore +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@CrossOrigin(origins = "https://erp.newadmin.buzhiyushu.cn",maxAge = 3600) +public class CaptchaController { + + private final CaptchaProperties captchaProperties; + private final MailProperties mailProperties; + + /** + * 短信验证码 + * + * @param phonenumber 用户手机号 + */ + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + @GetMapping("/resource/sms/code") + public R smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + // 验证码模板id 自行处理 (查数据库或写死均可) + String templateId = ""; + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); + if (!smsResponse.isSuccess()) { + log.error("验证码短信发送异常 => {}", smsResponse); + return R.fail(smsResponse.getData().toString()); + } + return R.ok(); + } + + /** + * 邮箱验证码 + * + * @param email 邮箱 + */ + @RateLimiter(key = "#email", time = 60, count = 1) + @GetMapping("/resource/email/code") + public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { + if (!mailProperties.getEnabled()) { + return R.fail("当前系统没有开启邮箱功能!"); + } + String key = GlobalConstants.CAPTCHA_CODE_KEY + email; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + try { + MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); + } catch (Exception e) { + log.error("验证码短信发送异常 => {}", e.getMessage()); + return R.fail(e.getMessage()); + } + return R.ok(); + } + + /** + * 生成验证码 + */ + @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) + @GetMapping("/auth/code") + @SaIgnore + public R getCode() { + CaptchaVo captchaVo = new CaptchaVo(); + boolean captchaEnabled = captchaProperties.getEnable(); + if (!captchaEnabled) { + captchaVo.setCaptchaEnabled(false); + return R.ok(captchaVo); + } + // 保存验证码信息 + String uuid = IdUtil.simpleUUID(); + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; + // 生成验证码 + CaptchaType captchaType = captchaProperties.getType(); + boolean isMath = CaptchaType.MATH == captchaType; + Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength(); + CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length); + AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz()); + captcha.setGenerator(codeGenerator); + captcha.createCode(); + // 如果是数学验证码,使用SpEL表达式处理验证码结果 + String code = captcha.getCode(); + if (isMath) { + ExpressionParser parser = new SpelExpressionParser(); + Expression exp = parser.parseExpression(StringUtils.remove(code, "=")); + code = exp.getValue(String.class); + } + RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + captchaVo.setUuid(uuid); + captchaVo.setImg(captcha.getImageBase64()); + return R.ok(captchaVo); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java new file mode 100644 index 0000000..0a83ace --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java @@ -0,0 +1,25 @@ +package org.dromara.web.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 登录租户对象 + * + * @author Michelle.Chung + */ +@Data +public class LoginTenantVo { + + /** + * 租户开关 + */ + private Boolean tenantEnabled; + + /** + * 租户对象列表 + */ + private List voList; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java new file mode 100644 index 0000000..db9c271 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java @@ -0,0 +1,31 @@ +package org.dromara.web.domain.vo; + +import org.dromara.system.domain.vo.SysTenantVo; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +/** + * 租户列表 + * + * @author Lion Li + */ +@Data +@AutoMapper(target = SysTenantVo.class) +public class TenantListVo { + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 域名 + */ + private String domain; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/WxLoginVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/WxLoginVo.java new file mode 100644 index 0000000..8a0b85f --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/WxLoginVo.java @@ -0,0 +1,12 @@ +package org.dromara.web.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class WxLoginVo { + private Long id; + private String openid; + private String token; + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/dto/WxRegisterDTO.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/dto/WxRegisterDTO.java new file mode 100644 index 0000000..e3927fc --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/dto/WxRegisterDTO.java @@ -0,0 +1,16 @@ +package org.dromara.web.domain.vo.dto; + +import lombok.Data; +import org.dromara.common.core.domain.model.LoginBody; + +@Data +public class WxRegisterDTO extends LoginBody { + private String username; + private String password; + private String userType; + + /** + * 邀请码 + */ + private String inviteCode; +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java new file mode 100644 index 0000000..07595e0 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -0,0 +1,165 @@ +package org.dromara.web.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.domain.dto.UserOnlineDTO; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Component; + +import java.time.Duration; + +/** + * 用户行为 侦听器的实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + private final SaTokenConfig tokenConfig; + private final SysLoginService loginService; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + UserOnlineDTO dto = new UserOnlineDTO(); + dto.setIpaddr(ip); + dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + dto.setBrowser(userAgent.getBrowser().getName()); + dto.setOs(userAgent.getOs().getName()); + dto.setLoginTime(System.currentTimeMillis()); + dto.setTokenId(tokenValue); + String username = (String) loginModel.getExtra(LoginHelper.USER_NAME_KEY); + String tenantId = (String) loginModel.getExtra(LoginHelper.TENANT_KEY); + dto.setUserName(username); + dto.setClientKey((String) loginModel.getExtra(LoginHelper.CLIENT_KEY)); + dto.setDeviceType(loginModel.getDevice()); + dto.setDeptName((String) loginModel.getExtra(LoginHelper.DEPT_NAME_KEY)); + TenantHelper.dynamic(tenantId, () -> { + if(tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); + } else { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout())); + } + }); + // 记录登录日志 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(Constants.LOGIN_SUCCESS); + logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + // 更新登录信息 + loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip); + log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); + log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); + log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY)); + TenantHelper.dynamic(tenantId, () -> { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + }); + log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId, String service) { + } + + /** + * 每次打开二级认证时触发 + */ + @Override + public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCloseSafe(String loginType, String tokenValue, String service) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + /** + * 每次Token续期时触发 + */ + @Override + public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java new file mode 100644 index 0000000..424fd78 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java @@ -0,0 +1,49 @@ +package org.dromara.web.service; + + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.web.domain.vo.LoginVo; + +/** + * 授权策略 + * + * @author Michelle.Chung + */ +public interface IAuthStrategy { + + String BASE_NAME = "AuthStrategy"; + + /** + * 登录 + * + * @param body 登录对象 + * @param client 授权管理视图对象 + * @param grantType 授权类型 + * @return 登录验证信息 + */ + static LoginVo login(String body, SysClientVo client, String grantType) { + // 授权类型和客户端id + if(grantType.equals("social")) { + grantType = "password"; + } + String beanName = grantType + BASE_NAME; + if (!SpringUtils.containsBean(beanName)) { + throw new ServiceException("授权类型不正确!"); + } + IAuthStrategy instance = SpringUtils.getBean(beanName); + return instance.login(body, client); + } + + /** + * 登录 + * + * @param body 登录对象 + * @param client 授权管理视图对象 + * @return 登录验证信息 + */ + LoginVo login(String body, SysClientVo client); + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java new file mode 100644 index 0000000..41a802b --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -0,0 +1,251 @@ +package org.dromara.web.service; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Opt; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.lock.annotation.Lock4j; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthUser; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.dto.PostDTO; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.*; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.exception.TenantException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.*; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.Date; +import java.util.List; +import java.util.function.Supplier; + +/** + * 登录校验方法 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysLoginService { + + @Value("${user.password.maxRetryCount}") + private Integer maxRetryCount; + + @Value("${user.password.lockTime}") + private Integer lockTime; + + private final ISysTenantService tenantService; + private final ISysPermissionService permissionService; + private final ISysSocialService sysSocialService; + private final ISysRoleService roleService; + private final ISysDeptService deptService; + private final ISysPostService postService; + private final SysUserMapper userMapper; + + + /** + * 绑定第三方用户 + * + * @param authUserData 授权响应实体 + */ + @Lock4j + public void socialRegister(AuthUser authUserData) { + String authId = authUserData.getSource() + authUserData.getUuid(); + // 第三方用户信息 + SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class); + BeanUtil.copyProperties(authUserData.getToken(), bo); + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + bo.setAuthId(authId); + bo.setOpenId(authUserData.getUuid()); + bo.setUserName(authUserData.getUsername()); + bo.setNickName(authUserData.getNickname()); + List checkList = sysSocialService.selectByAuthId(authId); + if (CollUtil.isNotEmpty(checkList)) { + throw new ServiceException("此三方账号已经被绑定!"); + } + // 查询是否已经绑定用户 + SysSocialBo params = new SysSocialBo(); + params.setUserId(userId); + params.setSource(bo.getSource()); + List list = sysSocialService.queryList(params); + if (CollUtil.isEmpty(list)) { + // 没有绑定用户, 新增用户信息 + sysSocialService.insertByBo(bo); + } else { + // 更新用户信息 + bo.setId(list.get(0).getId()); + sysSocialService.updateByBo(bo); + // 如果要绑定的平台账号已经被绑定过了 是否抛异常自行决断 + // throw new ServiceException("此平台账号已经被绑定!"); + } + } + + + /** + * 退出登录 + */ + public void logout() { + try { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } + recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + } catch (NotLoginException ignored) { + } finally { + try { + StpUtil.logout(); + } catch (NotLoginException ignored) { + } + } + } + + /** + * 记录登录信息 + * + * @param tenantId 租户ID + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + */ + public void recordLogininfor(String tenantId, String username, String status, String message) { + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + + /** + * 构建登录用户 + */ + public LoginUser buildLoginUser(SysUserVo user) { + LoginUser loginUser = new LoginUser(); + Long userId = user.getUserId(); + loginUser.setTenantId(user.getTenantId()); + loginUser.setUserId(userId); + loginUser.setDeptId(user.getDeptId()); + loginUser.setUsername(user.getUserName()); + loginUser.setNickname(user.getNickName()); + loginUser.setUserType(user.getUserType()); + loginUser.setMenuPermission(permissionService.getMenuPermission(userId)); + loginUser.setRolePermission(permissionService.getRolePermission(userId)); + if (ObjectUtil.isNotNull(user.getDeptId())) { + Opt deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); + loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); + loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY)); + } + List roles = roleService.selectRolesByUserId(userId); + List posts = postService.selectPostsByUserId(userId); + loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class)); + loginUser.setPosts(BeanUtil.copyToList(posts, PostDTO.class)); + return loginUser; + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId, String ip) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(ip); + sysUser.setLoginDate(DateUtils.getNowDate()); + sysUser.setUpdateBy(userId); + DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); + } + + /** + * 登录校验 + */ + public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { + String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; + String loginFail = Constants.LOGIN_FAIL; + + // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); + // 锁定时间内登录 则踢出 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } + + if (supplier.get()) { + // 错误次数递增 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + // 达到规定错误次数 则锁定登录 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } else { + // 未达到规定错误次数 + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); + throw new UserException(loginType.getRetryLimitCount(), errorNumber); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(errorKey); + } + + /** + * 校验租户 + * + * @param tenantId 租户ID + */ + public void checkTenant(String tenantId) { + if (!TenantHelper.isEnable()) { + return; + } + if (StringUtils.isBlank(tenantId)) { + throw new TenantException("tenant.number.not.blank"); + } + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + return; + } + SysTenantVo tenant = tenantService.queryByTenantId(tenantId); + if (ObjectUtil.isNull(tenant)) { + log.info("登录租户:{} 不存在.", tenantId); + throw new TenantException("tenant.not.exists"); + } else if (SystemConstants.DISABLE.equals(tenant.getStatus())) { + log.info("登录租户:{} 已被停用.", tenantId); + throw new TenantException("tenant.blocked"); + } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) + && new Date().after(tenant.getExpireTime())) { + log.info("登录租户:{} 已超过有效期.", tenantId); + throw new TenantException("tenant.expired"); + } + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java new file mode 100644 index 0000000..11b9eee --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -0,0 +1,185 @@ +package org.dromara.web.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.pdd.pop.sdk.common.util.JsonUtil; +import io.swagger.v3.core.util.Json; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.PasswordLoginBody; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.config.properties.CaptchaProperties; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * 密码认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("password" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class PasswordAuthStrategy implements IAuthStrategy { + + private final CaptchaProperties captchaProperties; + private final SysLoginService loginService; + private final SysUserMapper userMapper; + + @Override + public LoginVo login(String body, SysClientVo client) { + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); +// String username = loginBody.getUsername(); + String phoneNumber=loginBody.getPhoneNumber(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + + boolean captchaEnabled = captchaProperties.getEnable(); + // 验证码开关 + if (captchaEnabled) { +// validateCaptcha(tenantId, username, code, uuid); + validateCaptcha(tenantId, phoneNumber, code, uuid); + } + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { +// SysUserVo user = loadUserByUsername(username); + SysUserVo user = loadUserByPhone(phoneNumber); + + +// loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); + loginService.checkLogin(LoginType.PASSWORD, tenantId, phoneNumber, () -> !BCrypt.checkpw(password, user.getPassword())); + // 此处可根据登录用户的数据不同 自行创建 loginUser + return loginService.buildLoginUser(user); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + // 登录其他 + Map newLoginMap = new HashMap(); + newLoginMap.put("username",phoneNumber); + newLoginMap.put("password",password); + newLoginMap.put("about_id",loginUser.getUserId().toString()); + String res = InterfaceUtils.postForm(UrlUtil.getNewWarehouse(),"/api/login/128",newLoginMap); + Map resMap = JsonUtil.transferToObj(res,Map.class); + if (resMap.get("msg") != null && resMap.get("msg").equals("用户不存在")){ + Map employeeMap = new HashMap(); + employeeMap.put("username",phoneNumber); + employeeMap.put("password",password); + employeeMap.put("about_id",loginUser.getUserId().toString()); + employeeMap.put("fid","0"); + employeeMap.put("name",phoneNumber); + employeeMap.put("phone",phoneNumber); + employeeMap.put("from","ERP"); + String employeeRes = InterfaceUtils.postForm(UrlUtil.getNewWarehouse(),"/api/employee/reg",employeeMap); + Map employeeResMap = JsonUtil.transferToObj(employeeRes,Map.class); + if (employeeResMap.get("message") != null && employeeResMap.get("message").equals("添加成功")){ + res = InterfaceUtils.postForm(UrlUtil.getNewWarehouse(),"/api/login/128",newLoginMap); + resMap = JsonUtil.transferToObj(res,Map.class); + + if (resMap.get("msg") != null && resMap.get("msg").equals("登录成功")){ + Map data = (Map) resMap.get("data"); + loginUser.setWarehouseLoginUser(data); + } + } + }else if (resMap.get("msg") != null && resMap.get("msg").equals("登录成功")){ + if (resMap.get("msg") != null && resMap.get("msg").equals("登录成功")){ + Map data = (Map) resMap.get("data"); + loginUser.setWarehouseLoginUser(data); + } + } + + + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + private void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + private SysUserVo loadUserByUsername(String username) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UserException("user.not.exists", username); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; + } + +// 新增方法 + private SysUserVo loadUserByPhone(String username) { +// SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getPhonenumber, username)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UserException("user.not.exists", username); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java new file mode 100644 index 0000000..419dbd6 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -0,0 +1,131 @@ +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.SocialLoginBody; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysSocialService; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * 第三方授权策略 + * + * @author thiszhc is 三三 + */ +@Slf4j +@Service("social" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SocialAuthStrategy implements IAuthStrategy { + + private final SocialProperties socialProperties; + private final ISysSocialService sysSocialService; + private final SysUserMapper userMapper; + private final SysLoginService loginService; + + /** + * 登录-第三方授权登录 + * + * @param body 登录信息 + * @param client 客户端信息 + */ + @Override + public LoginVo login(String body, SysClientVo client) { + SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); + ValidatorUtils.validate(loginBody); + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + if (!response.ok()) { + throw new ServiceException(response.getMsg()); + } + AuthUser authUserData = response.getData(); + if ("GITEE".equals(authUserData.getSource())) { + // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + } + + List list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (CollUtil.isEmpty(list)) { + throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); + } + SysSocialVo social; + if (TenantHelper.isEnable()) { + Optional opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId())); + if (opt.isEmpty()) { + throw new ServiceException("对不起,你没有权限登录当前租户!"); + } + social = opt.get(); + } else { + social = list.get(0); + } + LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> { + SysUserVo user = loadUser(social.getUserId()); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + private SysUserVo loadUser(Long userId) { + SysUserVo user = userMapper.selectVoById(userId); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", ""); + throw new UserException("user.not.exists", ""); + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", ""); + throw new UserException("user.blocked", ""); + } + return user; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java new file mode 100644 index 0000000..33adc49 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java @@ -0,0 +1,153 @@ +package org.dromara.web.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.request.AuthWechatMiniProgramRequest; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.model.XcxLoginBody; +import org.dromara.common.core.domain.model.XcxLoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; +import org.dromara.web.domain.vo.LoginVo; +import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.service.SysLoginService; +import org.springframework.stereotype.Service; + +/** + * 小程序认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("xcx" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class XcxAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + private final ISysUserService userService; + @Override + public LoginVo login(String body, SysClientVo client) { + XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); + ValidatorUtils.validate(loginBody); + // xcxCode 为 小程序调用 wx.login 授权后获取 + String xcxCode = loginBody.getXcxCode(); + // 多个小程序识别使用 + String appid = loginBody.getAppid(); + // 参数校验 + if (StringUtils.isBlank(appid) || StringUtils.isBlank(xcxCode)) { + throw new ServiceException("appid 或 xcxCode 不能为空"); + } + // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid + AuthRequest authRequest = new AuthWechatMiniProgramRequest(AuthConfig.builder() + .clientId(appid).clientSecret("c691dea9dfde1da7ae51c34f5a6d3d53") + .ignoreCheckRedirectUri(true).ignoreCheckState(true).build()); + AuthCallback authCallback = new AuthCallback(); + authCallback.setCode(xcxCode); + AuthResponse resp = authRequest.login(authCallback); + String openid, unionId; + if (resp.ok()) { + AuthToken token = resp.getData().getToken(); + openid = token.getOpenId(); + // 微信小程序只有关联到微信开放平台下之后才能获取到 unionId,因此unionId不一定能返回。 + unionId = token.getUnionId(); + // 把 openId 存到对应用户中 + log.info("登录成功,openid: {}, unionId: {}", openid, unionId); + } else { + log.error("微信小程序登录失败,错误信息: {}", resp.getMsg()); + throw new ServiceException(resp.getMsg()); + } + + // 把openId存到对应用户中 + String phoneNumber = loginBody.getPhoneNumber(); + String password = loginBody.getPassword(); + SysUserVo user1 = userService.selectUserByPhonenumber(phoneNumber); +// System.out.println("============="+user1); + if (user1 == null) { + log.error("用户手机号 {} 未找到对应的用户记录", phoneNumber); + throw new ServiceException("用户未找到对应的用户记录"); + } + + // 验证密码是否正确 + if (!BCrypt.checkpw(password, user1.getPassword())) { + log.error("用户密码不正确"); + throw new ServiceException("用户密码不正确"); + } + + // 检查 openId 是否为 null 或者不等于传入的 openid + String existingOpenId = user1.getOpenId(); + if (existingOpenId == null || !existingOpenId.equals(openid)) { + // 如果 openId 不匹配,则更新数据库中的 openId + userService.insertUserOpenId(openid, user1.getPhonenumber()); + } + + + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + SysUserVo user = loadUserByOpenid(openid,loginBody.getPhoneNumber()); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + XcxLoginUser loginUser = new XcxLoginUser(); + loginUser.setTenantId(user.getTenantId()); + loginUser.setUserId(user.getUserId()); + loginUser.setUsername(user.getUserName()); + loginUser.setNickname(user.getNickName()); + loginUser.setUserType(user.getUserType()); + loginUser.setPhoneNumber(user.getPhonenumber()); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + loginUser.setOpenid(openid); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + loginVo.setOpenid(openid); + loginVo.setPhoneNumber(phoneNumber); + loginVo.setNickName(loginUser.getNickname()); + loginVo.setUserId(user1.getUserId()); + return loginVo; + } + + private SysUserVo loadUserByOpenid(String openid, String phoneNumber) { + // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 + // todo 自行实现 userService.selectUserByOpenid(openid); + SysUserVo user = userService.selectUserByOpenid(openid,phoneNumber); +// SysUserVo user = new SysUserVo(); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", openid); + // todo 用户不存在 业务逻辑自行实现 + + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", openid); + // todo 用户已被停用 业务逻辑自行实现 + } + return user; + + } + + + +} diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4f5820f --- /dev/null +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -0,0 +1,290 @@ +--- # 监控中心配置 +spring.boot.admin.client: + # 增加客户端开关 + enabled: false + url: http://localhost:9090/admin + instance: + service-host-type: IP + metadata: + username: ${spring.boot.admin.client.username} + userpassword: ${spring.boot.admin.client.password} + username: @monitor.username@ + password: @monitor.password@ + +--- # snail-job 配置 +snail-job: + enabled: false + # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 + group: "ruoyi_group" + # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表 + token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" + server: + host: 127.0.0.1 + port: 17888 + # 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段 + namespace: ${spring.profiles.active} + # 随主应用端口漂移 + port: 2${server.port} + # 客户端ip指定 + host: + # RPC类型: netty, grpc + rpc-type: grpc + +--- # 数据源配置 +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content + dynamic: + # 性能分析插件(有性能损耗 不建议生产环境使用) + p6spy: true + # 设置默认的数据源或者数据源组,默认值即为 master + primary: master + # 严格模式 匹配不到数据源则报错 + strict: true + datasource: + # 主库数据源 + master: + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 + # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) + # url: jdbc:mysql://111.229.25.150:3306/zhishu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://146.56.227.42:3306/zhishu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: zhishu + password: XsRR4K3ATizyc5BK + # 腾讯云数据库 + slave: + lazy: true + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://nj-cynosdbmysql-grp-1v6vxn5f.sql.tencentcdb.com:26247/task?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: root + password: Long6166@@ + taskSlave: + lazy: true + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://36.212.12.247:3306/zhishu_slave?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: zhishu_slave + password: 7DpixiEdCs5p3PEr + psi: + lazy: true + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://175.27.224.66:3306/psi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: root + password: 5e07c0eec1770c94 +# oracle: +# type: ${spring.datasource.type} +# driverClassName: oracle.jdbc.OracleDriver +# url: jdbc:oracle:thin:@//localhost:1521/XE +# username: ROOT +# password: root +# postgres: +# type: ${spring.datasource.type} +# driverClassName: org.postgresql.Driver +# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true +# username: root +# password: root +# sqlserver: +# type: ${spring.datasource.type} +# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver +# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true +# username: SA +# password: root + hikari: + # 最大连接池数量 + maxPoolSize: 20 + # 最小空闲线程数量 + minIdle: 10 + # 配置获取连接等待超时的时间 + connectionTimeout: 30000 + # 校验超时时间 + validationTimeout: 5000 + # 空闲连接存活最大时间,默认10分钟 + idleTimeout: 600000 + # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟 + maxLifetime: 1800000 + # 多久检查一次连接的活性 + keepaliveTime: 30000 + +--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) +spring.data: + redis: + # 地址 + host: 146.56.227.42 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # redis 密码必须配置 + password: Qq123123 + # 连接超时时间 + timeout: 10s + # 是否开启ssl + ssl.enabled: false + +# redisson 配置 +redisson: + # redis key前缀 + keyPrefix: + # 线程池数量 + threads: 4 + # Netty线程池数量 + nettyThreads: 8 + # 单节点配置 + singleServerConfig: + # 客户端名称 + clientName: ${ruoyi.name} + # 最小空闲连接数 + connectionMinimumIdleSize: 8 + # 连接池大小 + connectionPoolSize: 32 + # 连接空闲超时,单位:毫秒 + idleConnectionTimeout: 10000 + # 命令等待超时,单位:毫秒 + timeout: 3000 + # 发布和订阅连接池大小 + subscriptionConnectionPoolSize: 50 + +--- # mail 邮件发送 +mail: + enabled: false + host: smtp.163.com + port: 465 + # 是否需要用户名密码验证 + auth: true + # 发送方,遵循RFC-822标准 + from: xxx@163.com + # 用户名(注意:如果使用foxmail邮箱,此处user为qq号) + user: xxx@163.com + # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助) + pass: xxxxxxxxxx + # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 + starttlsEnable: true + # 使用SSL安全连接 + sslEnable: true + # SMTP超时时长,单位毫秒,缺省值不超时 + timeout: 0 + # Socket连接超时值,单位毫秒,缺省值不超时 + connectionTimeout: 0 + +--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 +# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用 +sms: + # 配置源类型用于标定配置来源(interface,yaml) + config-type: yaml + # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制 + restricted: true + # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效 + minute-max: 1 + # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效 + account-max: 30 + # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中 + blends: + # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可 + # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户 + config1: + # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: alibaba + # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。 + access-key-id: 您的accessKey + # 称为accessSecret有些称之为apiSecret + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + config2: + # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 + supplier: tencent + access-key-id: 您的accessKey + access-key-secret: 您的accessKeySecret + signature: 您的短信签名 + sdk-app-id: 您的sdkAppId + + +--- # 三方授权 +justauth: + # 前端外网访问地址 + address: http://localhost:80 + type: + maxkey: + # maxkey 服务器地址 + # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据 + server-url: http://sso.maxkey.top + client-id: 876892492581044224 + client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 + redirect-uri: ${justauth.address}/social-callback?source=maxkey + topiam: + # topiam 服务器地址 + server-url: http://127.0.0.1:1898/api/v1/authorize/y0q************spq***********8ol + client-id: 449c4*********937************759 + client-secret: ac7***********1e0************28d + redirect-uri: ${justauth.address}/social-callback?source=topiam + scopes: [openid, email, phone, profile] + qq: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=qq + union-id: false + weibo: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=weibo + gitee: + client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98 + client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac + redirect-uri: ${justauth.address}/social-callback?source=gitee + dingtalk: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=dingtalk + baidu: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=baidu + csdn: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=csdn + coding: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=coding + coding-group-name: xx + oschina: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=oschina + alipay_wallet: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet + alipay-public-key: MIIB**************DAQAB + wechat_open: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_open + wechat_mp: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_mp + wechat_enterprise: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise + agent-id: 1000002 + gitlab: + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitlab + +# zhishu业务配置 +zhishu: + url: ./file/ + filterUrl: ./file/fiter/ + kfz-service-url: http://localhost:8095 + history-shop-god-s-excel-file-path: D:\ShopGoodsData\HistoryGoodsData + new-shop-god-s-excel-file-path: D:\ShopGoodsData\NewShopGoodsData + changed-shop-god-s-excel-file-path: D:\ShopGoodsData\ChangedShopGoodsData + error-shop-god-s-excel-file-path: D:\ShopGoodsData\ErrorShopGoodsData \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml new file mode 100644 index 0000000..968d9c0 --- /dev/null +++ b/ruoyi-admin/src/main/resources/application.yml @@ -0,0 +1,317 @@ +# 项目相关配置 +ruoyi: + # 名称 + name: ZhiShu + # 版本 + version: ${revision} + # 版权年份 + copyrightYear: 2024 + # 配置IP地址 +# ipurl: localhost:81 + ipurl: erp.buzhiyushu.cn + +# 邀请码配置 +invite: + url: + # 邀请码链接前缀,需要修改为实际的前端注册页面地址 + prefix: https://erp.buzhiyushu.cn/register?code= + +captcha: + enable: true + # 页面 <参数设置> 可开启关闭 验证码校验 + # 验证码类型 math 数组计算 char 字符验证 + type: MATH + # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 + category: CIRCLE + # 数字验证码位数 + numberLength: 1 + # 字符验证码长度 + charLength: 4 + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + servlet: + # 应用的访问路径 + context-path: / + # undertow 配置 + undertow: + # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的zhishu/shopOrder/listByOrderSn + max-http-post-size: -1 + # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 + # 每块buffer的空间大小,越小的空间被利用越充分 + buffer-size: 512 + # 是否分配的直接内存 + direct-buffers: true + threads: + # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 + io: 8 + # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 + worker: 256 + +# 日志配置 +logging: + level: + org.dromara: @logging.level@ + org.springframework: info + org.mybatis.spring.mapper: error + org.apache.fury: warn + config: classpath:logback-plus.xml + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + application: + name: ${ruoyi.name} + threads: + # 开启虚拟线程 仅jdk21可用 + virtual: + enabled: false + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: @profiles.active@ + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 30MB + # 设置总上传的文件大小 + max-request-size: 100MB + mvc: + # 设置静态资源路径 防止所有请求都去查静态资源 + static-path-pattern: /static/** + format: + date-time: yyyy-MM-dd HH:mm:ss + jackson: + # 日期格式化 + date-format: yyyy-MM-dd HH:mm:ss + serialization: + # 格式化输出 + indent_output: false + # 忽略无法转换的对象 + fail_on_empty_beans: false + deserialization: + # 允许对象忽略json中不存在的属性 + fail_on_unknown_properties: false + +# Sa-Token配置 +sa-token: + # token名称 (同时也是cookie名称) + token-name: Authorization + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # jwt秘钥 + jwt-secret-key: abcdefghijklmnopqrstuvwxyz + +# security配置 +security: + # 排除路径 + excludes: + - /*.html + - /**/*.html + - /**/*.css + - /**/*.js + - /favicon.ico + - /error + - /*/api-docs + - /*/api-docs/** + - /warm-flow-ui/token-name + +# 多租户配置 +tenant: + # 是否开启 + enable: true + # 排除表 + excludes: + - sys_menu + - sys_tenant + - sys_tenant_package + - sys_role_dept + - sys_role_menu + - sys_user_post + - sys_user_role + - sys_client + - sys_oss_config + - t_district + - t_invite_codes + +# MyBatisPlus配置 +# https://baomidou.com/config/ +mybatis-plus: + # 自定义配置 是否全局开启逻辑删除 关闭后 所有逻辑删除功能将失效 + enableLogicDelete: true + # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper + mapperPackage: org.dromara.**.mapper + # 对应的 XML 文件位置 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: org.dromara.**.domain + global-config: + dbConfig: + # 主键类型 + # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID + # 如需改为自增 需要将数据库表全部设置为自增 + idType: ASSIGN_ID + # 是否开启MyBatis Plus sql执行日志 +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 数据加密 +mybatis-encryptor: + # 是否开启加密 + enable: false + # 默认加密算法 + algorithm: BASE64 + # 编码方式 BASE64/HEX。默认BASE64 + encode: BASE64 + # 安全秘钥 对称算法的秘钥 如:AES,SM4 + password: + # 公私钥 非对称算法的公私钥 如:SM2,RSA + publicKey: + privateKey: + +# api接口加密 +api-decrypt: + # 是否开启全局接口加密 + enabled: true + # AES 加密头标识 + headerFlag: encrypt-key + # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 + # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= + publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ== + # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 + # 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== + privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= + +springdoc: + api-docs: + # 是否开启接口文档 + enabled: true +# swagger-ui: +# # 持久化认证数据 +# persistAuthorization: true + info: + # 标题 + title: '标题:${ruoyi.name}多租户管理系统_接口文档' + # 描述 + description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...' + # 版本 + version: '版本号: ${ruoyi.version}' + # 作者信息 + contact: + name: Lion Li + email: crazylionli@163.com + url: https://gitee.com/dromara/RuoYi-Vue-Plus + components: + # 鉴权方式配置 + security-schemes: + apiKey: + type: APIKEY + in: HEADER + name: ${sa-token.token-name} + #这里定义了两个分组,可定义多个,也可以不定义 + group-configs: + - group: 1.演示模块 + packages-to-scan: org.dromara.demo + - group: 2.通用模块 + packages-to-scan: org.dromara.web + - group: 3.系统模块 + packages-to-scan: org.dromara.system + - group: 4.代码生成模块 + packages-to-scan: org.dromara.generator + - group: 5.工作流模块 + packages-to-scan: org.dromara.workflow + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludeUrls: + - /system/notice + - /warm-flow/save-xml + +# 全局线程池相关配置 +# 如使用JDK21请直接使用虚拟线程 不要开启此配置 +thread-pool: + # 是否开启线程池 + enabled: false + # 队列最大长度 + queueCapacity: 128 + # 线程池维护线程所允许的空闲时间 + keepAliveSeconds: 300 + +--- # 分布式锁 lock4j 全局配置 +lock4j: + # 获取分布式锁超时时间,默认为 3000 毫秒 + acquire-timeout: 3000 + # 分布式锁的超时时间,默认为 30 秒 + expire: 30000 + +--- # Actuator 监控端点的配置项 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: ALWAYS + logfile: + external-file: ./logs/sys-console.log + +--- # 默认/推荐使用sse推送 +sse: + enabled: true + path: /resource/sse + +--- # websocket +websocket: + # 如果关闭 需要和前端开关一起关闭 + enabled: false + # 路径 + path: /resource/websocket + # 设置访问源地址 + allowedOrigins: '*' + +--- # warm-flow工作流配置 +warm-flow: + # 是否开启工作流,默认true + enabled: true + # 是否开启设计器ui + ui: true + # 默认Authorization,如果有多个token,用逗号分隔 + token-name: ${sa-token.token-name},clientid + + +pdd: + app: + clientId: 203c5a7ba8bd4b8488d5e26f93052642 + clientSecret: 892ffaa86e12b7a3d8d2942b669d9aa520ad8179 + +kongfz: + appId: 12345 + appSecret: 4d9829df96cc9ec60b2754453e88fe3e68b187a1407c72774667aaf2b457c12a + accessToken: your_access_token_here +wechat: + appid: wx703b8fb6c3da692a + secret: c691dea9dfde1da7ae51c34f5a6d3d53 + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session + +forest: + max-connections: 2000 # 连接池最大连接数 + connect-timeout: 6000 # 连接超时时间,单位为毫秒 + read-timeout: 6000 # 数据读取超时时间,单位为毫秒 \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..cce11c8 --- /dev/null +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,61 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=对不起, 您的账号:{0} 不存在. +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号:{0} 已被删除 +user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 +length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.blank=用户名不能为空 +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.username.length.valid=账户长度必须在{min}到{max}个字符之间 +user.password.not.blank=用户密码不能为空 +user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 +user.password.not.valid=* 5-50个字符 +user.email.not.valid=邮箱格式错误 +user.email.not.blank=邮箱不能为空 +user.phonenumber.not.blank=用户手机号不能为空 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.register.save.error=保存用户 {0} 失败,注册账号已存在 +user.register.error=注册失败,请联系系统管理人员 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 +auth.grant.type.error=认证权限类型错误 +auth.grant.type.blocked=认证权限类型已禁用 +auth.grant.type.not.blank=认证权限类型不能为空 +auth.clientid.not.blank=认证客户端id不能为空 +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 +sms.code.not.blank=短信验证码不能为空 +sms.code.retry.limit.count=短信验证码输入错误{0}次 +sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟 +email.code.not.blank=邮箱验证码不能为空 +email.code.retry.limit.count=邮箱验证码输入错误{0}次 +email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟 +xcx.code.not.blank=小程序[code]不能为空 +social.source.not.blank=第三方登录平台[source]不能为空 +social.code.not.blank=第三方登录平台[code]不能为空 +social.state.not.blank=第三方登录平台[state]不能为空 +##租户 +tenant.number.not.blank=租户编号不能为空 +tenant.not.exists=对不起, 您的租户不存在,请联系管理员 +tenant.blocked=对不起,您的租户已禁用,请联系管理员 +tenant.expired=对不起,您的租户已过期,请联系管理员 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties new file mode 100644 index 0000000..cce11c8 --- /dev/null +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -0,0 +1,61 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=对不起, 您的账号:{0} 不存在. +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号:{0} 已被删除 +user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 +length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.blank=用户名不能为空 +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.username.length.valid=账户长度必须在{min}到{max}个字符之间 +user.password.not.blank=用户密码不能为空 +user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 +user.password.not.valid=* 5-50个字符 +user.email.not.valid=邮箱格式错误 +user.email.not.blank=邮箱不能为空 +user.phonenumber.not.blank=用户手机号不能为空 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.register.save.error=保存用户 {0} 失败,注册账号已存在 +user.register.error=注册失败,请联系系统管理人员 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 +auth.grant.type.error=认证权限类型错误 +auth.grant.type.blocked=认证权限类型已禁用 +auth.grant.type.not.blank=认证权限类型不能为空 +auth.clientid.not.blank=认证客户端id不能为空 +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 +sms.code.not.blank=短信验证码不能为空 +sms.code.retry.limit.count=短信验证码输入错误{0}次 +sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟 +email.code.not.blank=邮箱验证码不能为空 +email.code.retry.limit.count=邮箱验证码输入错误{0}次 +email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟 +xcx.code.not.blank=小程序[code]不能为空 +social.source.not.blank=第三方登录平台[source]不能为空 +social.code.not.blank=第三方登录平台[code]不能为空 +social.state.not.blank=第三方登录平台[state]不能为空 +##租户 +tenant.number.not.blank=租户编号不能为空 +tenant.not.exists=对不起, 您的租户不存在,请联系管理员 +tenant.blocked=对不起,您的租户已禁用,请联系管理员 +tenant.expired=对不起,您的租户已过期,请联系管理员 diff --git a/ruoyi-admin/src/main/resources/mapper/zhishu/BookBaseInfoMapper.xml b/ruoyi-admin/src/main/resources/mapper/zhishu/BookBaseInfoMapper.xml new file mode 100644 index 0000000..2687d35 --- /dev/null +++ b/ruoyi-admin/src/main/resources/mapper/zhishu/BookBaseInfoMapper.xml @@ -0,0 +1,21 @@ + + + + + + UPDATE book_base_info + SET + vio_book = #{vioBook}, + book_set = #{bookSet}, + onenum_mbooks = #{onenumMbooks}, + ill_publisher = #{illPublisher}, + ill_author=#{illAuthor}, + update_time = NOW() + WHERE id IN + + #{ids} + + + diff --git a/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java new file mode 100644 index 0000000..dba2323 --- /dev/null +++ b/ruoyi-admin/src/test/java/org/dromara/test/AssertUnitTest.java @@ -0,0 +1,45 @@ +package org.dromara.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * 断言单元测试案例 + * + * @author Lion Li + */ +@DisplayName("断言单元测试案例") +public class AssertUnitTest { + + @DisplayName("测试 assertEquals 方法") + @Test + public void testAssertEquals() { + Assertions.assertEquals("666", new String("666")); + Assertions.assertNotEquals("666", new String("666")); + } + + @DisplayName("测试 assertSame 方法") + @Test + public void testAssertSame() { + Object obj = new Object(); + Object obj1 = obj; + Assertions.assertSame(obj, obj1); + Assertions.assertNotSame(obj, obj1); + } + + @DisplayName("测试 assertTrue 方法") + @Test + public void testAssertTrue() { + Assertions.assertTrue(true); + Assertions.assertFalse(true); + } + + @DisplayName("测试 assertNull 方法") + @Test + public void testAssertNull() { + Assertions.assertNull(null); + Assertions.assertNotNull(null); + } + +} diff --git a/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java new file mode 100644 index 0000000..1db51df --- /dev/null +++ b/ruoyi-admin/src/test/java/org/dromara/test/ParamUnitTest.java @@ -0,0 +1,72 @@ +package org.dromara.test; + +import org.dromara.common.core.enums.UserType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * 带参数单元测试案例 + * + * @author Lion Li + */ +@DisplayName("带参数单元测试案例") +public class ParamUnitTest { + + @DisplayName("测试 @ValueSource 注解") + @ParameterizedTest + @ValueSource(strings = {"t1", "t2", "t3"}) + public void testValueSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @NullSource 注解") + @ParameterizedTest + @NullSource + public void testNullSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @EnumSource 注解") + @ParameterizedTest + @EnumSource(UserType.class) + public void testEnumSource(UserType type) { + System.out.println(type.getUserType()); + } + + @DisplayName("测试 @MethodSource 注解") + @ParameterizedTest + @MethodSource("getParam") + public void testMethodSource(String str) { + System.out.println(str); + } + + public static Stream getParam() { + List list = new ArrayList<>(); + list.add("t1"); + list.add("t2"); + list.add("t3"); + return list.stream(); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-admin/zhFonts/.uuid b/ruoyi-admin/zhFonts/.uuid new file mode 100644 index 0000000..cee5cdd --- /dev/null +++ b/ruoyi-admin/zhFonts/.uuid @@ -0,0 +1 @@ +3f2ee348-0303-40ca-bf03-03f48d2d2141 \ No newline at end of file diff --git a/ruoyi-admin/zhFonts/fonts.dir b/ruoyi-admin/zhFonts/fonts.dir new file mode 100644 index 0000000..fed9544 --- /dev/null +++ b/ruoyi-admin/zhFonts/fonts.dir @@ -0,0 +1,4 @@ +3 +SIMSUN.TTC -misc-simsun-medium-r-normal--0-0-0-0-p-0-iso10646-1 +SIMSUN.TTC -misc-simsun-medium-r-normal--0-0-0-0-p-0-iso8859-1 +SIMSUN.TTC -misc-simsun-medium-r-normal--0-0-0-0-p-0-koi8-r diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml new file mode 100644 index 0000000..2930fd0 --- /dev/null +++ b/ruoyi-common/pom.xml @@ -0,0 +1,46 @@ + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + + + ruoyi-common-bom + ruoyi-common-social + ruoyi-common-core + ruoyi-common-doc + ruoyi-common-excel + ruoyi-common-idempotent + ruoyi-common-job + ruoyi-common-log + ruoyi-common-mail + ruoyi-common-mybatis + ruoyi-common-oss + ruoyi-common-ratelimiter + ruoyi-common-redis + ruoyi-common-satoken + ruoyi-common-security + ruoyi-common-sms + ruoyi-common-web + ruoyi-common-translation + ruoyi-common-sensitive + ruoyi-common-json + ruoyi-common-encrypt + ruoyi-common-tenant + ruoyi-common-websocket + ruoyi-common-sse + + + ruoyi-common + pom + + + common 通用模块 + + + diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml new file mode 100644 index 0000000..24acb08 --- /dev/null +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -0,0 +1,185 @@ + + + 4.0.0 + + org.dromara + ruoyi-common-bom + ${revision} + pom + + + ruoyi-common-bom common依赖项 + + + + 5.3.0 + + + + + + + org.dromara + ruoyi-common-core + ${revision} + + + + + org.dromara + ruoyi-common-doc + ${revision} + + + + + org.dromara + ruoyi-common-excel + ${revision} + + + + + org.dromara + ruoyi-common-idempotent + ${revision} + + + + + org.dromara + ruoyi-common-job + ${revision} + + + + + org.dromara + ruoyi-common-log + ${revision} + + + + + org.dromara + ruoyi-common-mail + ${revision} + + + + + org.dromara + ruoyi-common-mybatis + ${revision} + + + + + org.dromara + ruoyi-common-oss + ${revision} + + + + + org.dromara + ruoyi-common-ratelimiter + ${revision} + + + + + org.dromara + ruoyi-common-redis + ${revision} + + + + + org.dromara + ruoyi-common-satoken + ${revision} + + + + + org.dromara + ruoyi-common-security + ${revision} + + + + + org.dromara + ruoyi-common-sms + ${revision} + + + + org.dromara + ruoyi-common-social + ${revision} + + + + + org.dromara + ruoyi-common-web + ${revision} + + + + + org.dromara + ruoyi-common-translation + ${revision} + + + + + org.dromara + ruoyi-common-sensitive + ${revision} + + + + + org.dromara + ruoyi-common-json + ${revision} + + + + + org.dromara + ruoyi-common-encrypt + ${revision} + + + + + org.dromara + ruoyi-common-tenant + ${revision} + + + + + org.dromara + ruoyi-common-websocket + ${revision} + + + + + org.dromara + ruoyi-common-sse + ${revision} + + + + + + diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml new file mode 100644 index 0000000..ad37e90 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -0,0 +1,99 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-core + + + ruoyi-common-core 核心模块 + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.apache.commons + commons-lang3 + + + + + jakarta.servlet + jakarta.servlet-api + + + + cn.hutool + hutool-core + + + + cn.hutool + hutool-http + + + + cn.hutool + hutool-extra + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-configuration-processor + + + + org.springframework.boot + spring-boot-properties-migrator + runtime + + + + io.github.linpeilie + mapstruct-plus-spring-boot-starter + + + + + org.lionsoul + ip2region + + + + + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java new file mode 100644 index 0000000..d9f70e4 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java @@ -0,0 +1,17 @@ +package org.dromara.common.core.config; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * 程序注解配置 + * + * @author Lion Li + */ +@AutoConfiguration +@EnableAspectJAutoProxy +@EnableAsync(proxyTargetClass = true) +public class ApplicationConfig { + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java new file mode 100644 index 0000000..d357d3d --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java @@ -0,0 +1,38 @@ +package org.dromara.common.core.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author Lion Li + */ + +@Data +@Component +@ConfigurationProperties(prefix = "ruoyi") +public class RuoYiConfig { + + /** + * 项目名称 + */ + private String name; + + /** + * 版本 + */ + private String version; + + /** + * 版权年份 + */ + private String copyrightYear; + + /** + * 后台调用前台url + */ + private String ipurl; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java new file mode 100644 index 0000000..2630485 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java @@ -0,0 +1,87 @@ +package org.dromara.common.core.config; + +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.dromara.common.core.config.properties.ThreadPoolProperties; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.Threads; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.core.task.VirtualThreadTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置 + * + * @author Lion Li + **/ +@Slf4j +@AutoConfiguration +@EnableConfigurationProperties(ThreadPoolProperties.class) +public class ThreadPoolConfig { + + /** + * 核心线程数 = cpu 核心数 + 1 + */ + private final int core = Runtime.getRuntime().availableProcessors() + 1; + + private ScheduledExecutorService scheduledExecutorService; + + @Bean(name = "threadPoolTaskExecutor") + @ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true") + public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(core); + executor.setMaxPoolSize(core * 2); + executor.setQueueCapacity(threadPoolProperties.getQueueCapacity()); + executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds()); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() { + // daemon 必须为 true + BasicThreadFactory.Builder builder = new BasicThreadFactory.Builder().daemon(true); + if (SpringUtils.isVirtual()) { + builder.namingPattern("virtual-schedule-pool-%d").wrappedFactory(new VirtualThreadTaskExecutor().getVirtualThreadFactory()); + } else { + builder.namingPattern("schedule-pool-%d"); + } + ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(core, + builder.build(), + new ThreadPoolExecutor.CallerRunsPolicy()) { + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + this.scheduledExecutorService = scheduledThreadPoolExecutor; + return scheduledThreadPoolExecutor; + } + + /** + * 销毁事件 + */ + @PreDestroy + public void destroy() { + try { + log.info("====关闭后台任务任务线程池===="); + Threads.shutdownAndAwaitTermination(scheduledExecutorService); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java new file mode 100644 index 0000000..45c5bd1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java @@ -0,0 +1,40 @@ +package org.dromara.common.core.config; + +import jakarta.validation.Validator; +import org.hibernate.validator.HibernateValidator; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; + +import java.util.Properties; + +/** + * 校验框架配置类 + * + * @author Lion Li + */ +@AutoConfiguration +public class ValidatorConfig { + + /** + * 配置校验框架 快速返回模式 + */ + @Bean + public Validator validator(MessageSource messageSource) { + try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) { + // 国际化 + factoryBean.setValidationMessageSource(messageSource); + // 设置使用 HibernateValidator 校验器 + factoryBean.setProviderClass(HibernateValidator.class); + Properties properties = new Properties(); + // 设置 快速异常返回 + properties.setProperty("hibernate.validator.fail_fast", "true"); + factoryBean.setValidationProperties(properties); + // 加载配置 + factoryBean.afterPropertiesSet(); + return factoryBean.getValidator(); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ZhishuConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ZhishuConfig.java new file mode 100644 index 0000000..e1b23e9 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ZhishuConfig.java @@ -0,0 +1,58 @@ +package org.dromara.common.core.config; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.dromara.common.core.factory.YmlPropertySourceFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * @author: Sheldon Jia + * @ClassName: LoginConfig + * @Description: 登录功能配置项 + * @date: 2025/05/04 + */ +@Data +@Component +@ConfigurationProperties(prefix = "zhishu") +// @PropertySource(value = "classpath:base-${spring.profiles.active:dev}.yml", factory = YmlPropertySourceFactory.class) +public class ZhishuConfig { + + /** + * url + */ + private String url; + + /** + * filterUrl + */ + private String filterUrl; + + /** + * kfz服务地址 + */ + private String kfzServiceUrl; + + /** + * 历史商品Excel文件目录地址 + */ + private String historyShopGodSExcelFilePath; + + /** + * 新增商品Excel文件暂存目录地址 + */ + private String newShopGodSExcelFilePath; + + /** + * 变更商品Excel文件暂存目录地址 + */ + private String changedShopGodSExcelFilePath; + + /** + * 异常商品Excel文件暂存目录地址 + */ + private String errorShopGodSExcelFilePath; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java new file mode 100644 index 0000000..820564f --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 线程池 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "thread-pool") +public class ThreadPoolProperties { + + /** + * 是否开启线程池 + */ + private boolean enabled; + + /** + * 队列最大长度 + */ + private int queueCapacity; + + /** + * 线程池维护线程所允许的空闲时间 + */ + private int keepAliveSeconds; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java new file mode 100644 index 0000000..ceb8370 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.constant; + +/** + * 缓存的key 常量 + * + * @author Lion Li + */ +public interface CacheConstants { + + /** + * 在线用户 redis key + */ + String ONLINE_TOKEN_KEY = "online_tokens:"; + + /** + * 参数管理 cache key + */ + String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + String SYS_DICT_KEY = "sys_dict:"; + + /** + * 登录账户密码错误次数 redis key + */ + String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java new file mode 100644 index 0000000..273c734 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java @@ -0,0 +1,76 @@ +package org.dromara.common.core.constant; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public interface Constants { + + /** + * UTF-8 字符集 + */ + String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + String GBK = "GBK"; + + /** + * www主域 + */ + String WWW = "www."; + + /** + * http请求 + */ + String HTTP = "http://"; + + /** + * https请求 + */ + String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + String FAIL = "1"; + + /** + * 登录成功 + */ + String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + String LOGOUT = "Logout"; + + /** + * 注册 + */ + String REGISTER = "Register"; + + /** + * 登录失败 + */ + String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + Integer CAPTCHA_EXPIRATION = 2; + + /** + * 顶级父级id + */ + Long TOP_PARENT_ID = 0L; + +} + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java new file mode 100644 index 0000000..85566e8 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java @@ -0,0 +1,93 @@ +package org.dromara.common.core.constant; + +/** + * 返回状态码 + * + * @author Lion Li + */ +public interface HttpStatus { + /** + * 操作成功 + */ + int SUCCESS = 200; + + /** + * 对象创建成功 + */ + int CREATED = 201; + + /** + * 请求已经被接受 + */ + int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + int MOVED_PERM = 301; + + /** + * 重定向 + */ + int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + int BAD_REQUEST = 400; + + /** + * 未授权 + */ + int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + int ERROR = 500; + + /** + * 接口未实现 + */ + int NOT_IMPLEMENTED = 501; + + /** + * 系统警告消息 + */ + int WARN = 601; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java new file mode 100644 index 0000000..55240bb --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java @@ -0,0 +1,75 @@ +package org.dromara.common.core.constant; + +/** + * 系统常量信息 + * + * @author Lion Li + */ +public interface SystemConstants { + + /** + * 正常状态 + */ + String NORMAL = "0"; + + /** + * 异常状态 + */ + String DISABLE = "1"; + + /** + * 是否为系统默认(是) + */ + String YES = "Y"; + + /** + * 是否为系统默认(否) + */ + String NO = "N"; + + /** + * 是否菜单外链(是) + */ + String YES_FRAME = "0"; + + /** + * 是否菜单外链(否) + */ + String NO_FRAME = "1"; + + /** + * 菜单类型(目录) + */ + String TYPE_DIR = "M"; + + /** + * 菜单类型(菜单) + */ + String TYPE_MENU = "C"; + + /** + * 菜单类型(按钮) + */ + String TYPE_BUTTON = "F"; + + /** + * Layout组件标识 + */ + String LAYOUT = "Layout"; + + /** + * ParentView组件标识 + */ + String PARENT_VIEW = "ParentView"; + + /** + * InnerLink组件标识 + */ + String INNER_LINK = "InnerLink"; + + /** + * 超级管理员ID + */ + Long SUPER_ADMIN_ID = 1L; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java new file mode 100644 index 0000000..33ce0cf --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java @@ -0,0 +1,35 @@ +package org.dromara.common.core.constant; + +/** + * 租户常量信息 + * + * @author Lion Li + */ +public interface TenantConstants { + + /** + * 超级管理员ID + */ + Long SUPER_ADMIN_ID = 1L; + + /** + * 超级管理员角色 roleKey + */ + String SUPER_ADMIN_ROLE_KEY = "superadmin"; + + /** + * 租户管理员角色 roleKey + */ + String TENANT_ADMIN_ROLE_KEY = "admin"; + + /** + * 租户管理员角色名称 + */ + String TENANT_ADMIN_ROLE_NAME = "管理员"; + + /** + * 默认租户ID + */ + String DEFAULT_TENANT_ID = "000000"; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java new file mode 100644 index 0000000..be85805 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java @@ -0,0 +1,110 @@ +package org.dromara.common.core.domain; + +import org.dromara.common.core.constant.HttpStatus; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class R implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 成功 + */ + public static final int SUCCESS = 200; + + /** + * 失败 + */ + public static final int FAIL = 500; + + private int code; + + private String msg; + + private T data; + + public static R ok() { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(String msg) { + return restResult(null, SUCCESS, msg); + } + + public static R ok(String msg, T data) { + return restResult(data, SUCCESS, msg); + } + + public static R fail() { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(String msg, T data) { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) { + return restResult(null, code, msg); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static R warn(String msg) { + return restResult(null, HttpStatus.WARN, msg); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static R warn(String msg, T data) { + return restResult(data, HttpStatus.WARN, msg); + } + + private static R restResult(T data, int code, String msg) { + R r = new R<>(); + r.setCode(code); + r.setData(data); + r.setMsg(msg); + return r; + } + + public static Boolean isError(R ret) { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java new file mode 100644 index 0000000..2e63f8a --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/CompleteTaskDTO.java @@ -0,0 +1,71 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 办理任务请求对象 + * + * @author may + */ +@Data +public class CompleteTaskDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + private Long taskId; + + /** + * 附件id + */ + private String fileId; + + /** + * 抄送人员 + */ + private List flowCopyList; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 办理意见 + */ + private String message; + + /** + * 消息通知 + */ + private String notice; + + /** + * 流程变量 + */ + private Map variables; + + /** + * 扩展变量(此处为逗号分隔的ossId) + */ + private String ext; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java new file mode 100644 index 0000000..2f20b21 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/FlowCopyDTO.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 抄送 + * + * @author may + */ +@Data +public class FlowCopyDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名称 + */ + private String userName; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java new file mode 100644 index 0000000..463821c --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/OssDTO.java @@ -0,0 +1,46 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * OSS对象 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class OssDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java new file mode 100644 index 0000000..aea8e7a --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java @@ -0,0 +1,42 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 角色 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RoleDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java new file mode 100644 index 0000000..9bcbd12 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessReturnDTO.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.domain.dto; + + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 启动流程返回对象 + * + * @author Lion Li + */ +@Data +public class StartProcessReturnDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程实例id + */ + private Long processInstanceId; + + /** + * 任务id + */ + private Long taskId; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java new file mode 100644 index 0000000..85893e1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/TaskAssigneeDTO.java @@ -0,0 +1,101 @@ +package org.dromara.common.core.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 任务受让人 + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class TaskAssigneeDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 总大小 + */ + private Long total = 0L; + + /** + * + */ + private List list; + + public TaskAssigneeDTO(Long total, List list) { + this.total = total; + this.list = list; + } + + /** + * 将源列表转换为 TaskHandler 列表 + * + * @param 通用类型 + * @param sourceList 待转换的源列表 + * @param storageId 提取 storageId 的函数 + * @param handlerCode 提取 handlerCode 的函数 + * @param handlerName 提取 handlerName 的函数 + * @param groupName 提取 groupName 的函数 + * @param createTimeMapper 提取 createTime 的函数 + * @return 转换后的 TaskHandler 列表 + */ + public static List convertToHandlerList( + List sourceList, + Function storageId, + Function handlerCode, + Function handlerName, + Function groupName, + Function createTimeMapper) { + return sourceList.stream() + .map(item -> new TaskHandler( + String.valueOf(storageId.apply(item)), + handlerCode.apply(item), + handlerName.apply(item), + groupName != null ? String.valueOf(groupName.apply(item)) : null, + createTimeMapper.apply(item) + )).collect(Collectors.toList()); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class TaskHandler { + + /** + * 主键 + */ + private String storageId; + + /** + * 权限编码 + */ + private String handlerCode; + + /** + * 权限名称 + */ + private String handlerName; + + /** + * 权限分组 + */ + private String groupName; + + /** + * 创建时间 + */ + private Date createTime; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java new file mode 100644 index 0000000..43d8c3c --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java @@ -0,0 +1,72 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 当前在线会话 + * + * @author ruoyi + */ + +@Data +@NoArgsConstructor +public class UserOnlineDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java new file mode 100644 index 0000000..33bc6e5 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java @@ -0,0 +1,44 @@ +package org.dromara.common.core.domain.event; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流程办理监听 + * + * @author may + */ +@Data +public class ProcessTaskEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 审批节点编码 + */ + private String nodeCode; + + /** + * 任务id + */ + private Long taskId; + + /** + * 业务id + */ + private String businessId; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java new file mode 100644 index 0000000..ffde8c6 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java @@ -0,0 +1,31 @@ +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 邮件登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class EmailLoginBody extends LoginBody { + + /** + * 邮箱 + */ + @NotBlank(message = "{user.email.not.blank}") + @Email(message = "{user.email.not.valid}") + private String email; + + /** + * 邮箱code + */ + @NotBlank(message = "{email.code.not.blank}") + private String emailCode; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/InterfaceLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/InterfaceLoginBody.java new file mode 100644 index 0000000..3ca771a --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/InterfaceLoginBody.java @@ -0,0 +1,14 @@ +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class InterfaceLoginBody extends LoginBody { + + /** + * 用户密码 + */ + private String password; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java new file mode 100644 index 0000000..846ae33 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -0,0 +1,66 @@ +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户登录对象 + * + * @author Lion Li + */ + +@Data +public class LoginBody implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 客户端id + */ + @NotBlank(message = "{auth.clientid.not.blank}") + private String clientId; + + /** + * 授权类型 + */ + @NotBlank(message = "{auth.grant.type.not.blank}") + private String grantType; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + + private String phoneNumber; + + /** + * 用户名 + */ + private String userName; + + /** + * longinCode + */ + private String login_code; + + /** + * token + */ + private String token; +} + + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java new file mode 100644 index 0000000..0ae3205 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java @@ -0,0 +1,153 @@ +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.dto.PostDTO; +import org.dromara.common.core.domain.dto.RoleDTO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 登录用户身份权限 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class LoginUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门类别编码 + */ + private String deptCategory; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 用户昵称 + */ + private String nickname; + + /** + * 角色对象 + */ + private List roles; + + /** + * 岗位对象 + */ + private List posts; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 新仓库系统登录信息 + */ + private Map warehouseLoginUser; + /** + * 获取登录id + */ + public String getLoginId() { + if (userType == null) { + throw new IllegalArgumentException("用户类型不能为空"); + } + if (userId == null) { + throw new IllegalArgumentException("用户ID不能为空"); + } + return userType + ":" + userId; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java new file mode 100644 index 0000000..a878348 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java @@ -0,0 +1,29 @@ +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 短信登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsLoginBody extends LoginBody { + + /** + * 手机号 + */ + @NotBlank(message = "{user.phonenumber.not.blank}") + private String phonenumber; + + /** + * 短信code + */ + @NotBlank(message = "{sms.code.not.blank}") + private String smsCode; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java new file mode 100644 index 0000000..0d1b121 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java @@ -0,0 +1,35 @@ +package org.dromara.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SocialLoginBody extends LoginBody { + + /** + * 第三方登录平台 + */ + @NotBlank(message = "{social.source.not.blank}") + private String source; + + /** + * 第三方登录code + */ + @NotBlank(message = "{social.code.not.blank}") + private String socialCode; + + /** + * 第三方登录socialState + */ + @NotBlank(message = "{social.state.not.blank}") + private String socialState; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java new file mode 100644 index 0000000..0cbed2f --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/TaskAssigneeBody.java @@ -0,0 +1,56 @@ +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 任务受让人 + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class TaskAssigneeBody implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 权限编码 + */ + private String handlerCode; + + /** + * 权限名称 + */ + private String handlerName; + + /** + * 权限分组 + */ + private String groupId; + + /** + * 开始时间 + */ + private String beginTime; + + /** + * 结束时间 + */ + private String endTime; + + /** + * 当前页 + */ + private Integer pageNum = 1; + + /** + * 每页显示条数 + */ + private Integer pageSize = 10; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java new file mode 100644 index 0000000..dbadfc2 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java @@ -0,0 +1,37 @@ +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对一套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DeviceType { + + /** + * pc端 + */ + PC("pc"), + + /** + * app端 + */ + APP("app"), + + /** + * 小程序端 + */ + XCX("xcx"), + + /** + * social第三方端 + */ + SOCIAL("social"); + + private final String device; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java new file mode 100644 index 0000000..f9cac66 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java @@ -0,0 +1,44 @@ +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum LoginType { + + /** + * 密码登录 + */ + PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"), + + /** + * 短信登录 + */ + SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"), + + /** + * 邮箱登录 + */ + EMAIL("email.code.retry.limit.exceed", "email.code.retry.limit.count"), + + /** + * 小程序登录 + */ + XCX("", ""); + + /** + * 登录重试超出限制提示 + */ + final String retryLimitExceed; + + /** + * 登录重试限制计数提示 + */ + final String retryLimitCount; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java new file mode 100644 index 0000000..be7e44d --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户状态 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum UserStatus { + /** + * 正常 + */ + OK("0", "正常"), + /** + * 停用 + */ + DISABLE("1", "停用"), + /** + * 删除 + */ + DELETED("2", "删除"); + + private final String code; + private final String info; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java new file mode 100644 index 0000000..69e4753 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java @@ -0,0 +1,37 @@ +package org.dromara.common.core.enums; + +import org.dromara.common.core.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对多套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum UserType { + + /** + * pc端 + */ + SYS_USER("sys_user"), + + /** + * app端 + */ + APP_USER("app_user"); + + private final String userType; + + public static UserType getUserType(String str) { + for (UserType value : values()) { + if (StringUtils.contains(str, value.getUserType())) { + return value; + } + } + throw new RuntimeException("'UserType' not found By " + str); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java new file mode 100644 index 0000000..e9dc6ec --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java @@ -0,0 +1,59 @@ +package org.dromara.common.core.exception; + +import lombok.*; + +import java.io.Serial; + +/** + * 业务异常 + * + * @author ruoyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public final class ServiceException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + */ + private String detailMessage; + + public ServiceException(String message) { + this.message = message; + } + + public ServiceException(String message, Integer code) { + this.message = message; + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java new file mode 100644 index 0000000..a76e16d --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/SseException.java @@ -0,0 +1,62 @@ +package org.dromara.common.core.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * sse 特制异常 + * + * @author LionLi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public final class SseException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + */ + private String detailMessage; + + public SseException(String message) { + this.message = message; + } + + public SseException(String message, Integer code) { + this.message = message; + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public SseException setMessage(String message) { + this.message = message; + return this; + } + + public SseException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..af98124 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.exception.file; + +import java.io.Serial; + +/** + * 文件名称超长限制异常类 + * + * @author ruoyi + */ +public class FileNameLengthLimitExceededException extends FileException { + + @Serial + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) { + super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..1eb8d40 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.exception.file; + +import java.io.Serial; + +/** + * 文件名大小限制异常类 + * + * @author ruoyi + */ +public class FileSizeLimitExceededException extends FileException { + + @Serial + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) { + super("upload.exceed.maxSize", new Object[]{defaultMaxSize}); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java new file mode 100644 index 0000000..43824e0 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.exception.user; + +import java.io.Serial; + +/** + * 验证码错误异常类 + * + * @author ruoyi + */ +public class CaptchaException extends UserException { + + @Serial + private static final long serialVersionUID = 1L; + + public CaptchaException() { + super("user.jcaptcha.error"); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java new file mode 100644 index 0000000..f4b8cac --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.exception.user; + +import java.io.Serial; + +/** + * 验证码失效异常类 + * + * @author ruoyi + */ +public class CaptchaExpireException extends UserException { + + @Serial + private static final long serialVersionUID = 1L; + + public CaptchaExpireException() { + super("user.jcaptcha.expire"); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java new file mode 100644 index 0000000..024fed6 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java @@ -0,0 +1,20 @@ +package org.dromara.common.core.exception.user; + +import org.dromara.common.core.exception.base.BaseException; + +import java.io.Serial; + +/** + * 用户信息异常类 + * + * @author ruoyi + */ +public class UserException extends BaseException { + + @Serial + private static final long serialVersionUID = 1L; + + public UserException(String code, Object... args) { + super("user", code, args, null); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java new file mode 100644 index 0000000..7328c69 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/ConfigService.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.service; + +/** + * 通用 参数配置服务 + * + * @author Lion Li + */ +public interface ConfigService { + + /** + * 根据参数 key 获取参数值 + * + * @param configKey 参数 key + * @return 参数值 + */ + String getConfigValue(String configKey); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java new file mode 100644 index 0000000..f93d177 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DeptService.java @@ -0,0 +1,37 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.DeptDTO; + +import java.util.List; + +/** + * 通用 部门服务 + * + * @author Lion Li + */ +public interface DeptService { + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + + /** + * 根据部门ID查询部门负责人 + * + * @param deptId 部门ID,用于指定需要查询的部门 + * @return 返回该部门的负责人ID + */ + Long selectDeptLeaderById(Long deptId); + + /** + * 查询部门 + * + * @return 部门列表 + */ + List selectDeptsByList(); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java new file mode 100644 index 0000000..1a52de0 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/OssService.java @@ -0,0 +1,29 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.OssDTO; + +import java.util.List; + +/** + * 通用 OSS服务 + * + * @author Lion Li + */ +public interface OssService { + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + String selectUrlByIds(String ossIds); + + /** + * 通过ossId查询列表 + * + * @param ossIds ossId串逗号分隔 + * @return 列表 + */ + List selectByIds(String ossIds); +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java new file mode 100644 index 0000000..41d4e83 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -0,0 +1,10 @@ +package org.dromara.common.core.service; + +/** + * 通用 岗位服务 + * + * @author AprilWind + */ +public interface PostService { + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java new file mode 100644 index 0000000..ba62c82 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/RoleService.java @@ -0,0 +1,10 @@ +package org.dromara.common.core.service; + +/** + * 通用 角色服务 + * + * @author AprilWind + */ +public interface RoleService { + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java new file mode 100644 index 0000000..1221755 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -0,0 +1,299 @@ +package org.dromara.common.core.utils; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.dromara.common.core.enums.FormatsType; +import org.dromara.common.core.exception.ServiceException; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +/** + * 时间工具类 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + private static final String[] PARSE_PATTERNS = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + @Deprecated + private DateUtils() { + } + + /** + * 获取当前日期和时间 + * + * @return 当前日期和时间的 Date 对象表示 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获取当前日期的字符串表示,格式为YYYY-MM-DD + * + * @return 当前日期的字符串表示 + */ + public static String getDate() { + return dateTimeNow(FormatsType.YYYY_MM_DD); + } + + /** + * 获取当前日期的字符串表示,格式为yyyyMMdd + * + * @return 当前日期的字符串表示 + */ + public static String getCurrentDate() { + return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat()); + } + + /** + * 获取当前日期的路径格式字符串,格式为"yyyy/MM/dd" + * + * @return 当前日期的路径格式字符串 + */ + public static String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat()); + } + + /** + * 获取当前时间的字符串表示,格式为YYYY-MM-DD HH:MM:SS + * + * @return 当前时间的字符串表示 + */ + public static String getTime() { + return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS); + } + + /** + * 获取当前时间的字符串表示,格式为 "HH:MM:SS" + * + * @return 当前时间的字符串表示,格式为 "HH:MM:SS" + */ + public static String getTimeWithHourMinuteSecond() { + return dateTimeNow(FormatsType.HH_MM_SS); + } + + /** + * 获取当前日期和时间的字符串表示,格式为YYYYMMDDHHMMSS + * + * @return 当前日期和时间的字符串表示 + */ + public static String dateTimeNow() { + return dateTimeNow(FormatsType.YYYYMMDDHHMMSS); + } + + public static String dataYMD(){ + return dateTimeNow(FormatsType.YYYY_MM_DD); + } + + /** + * 获取当前日期和时间的指定格式的字符串表示 + * + * @param format 日期时间格式,例如"YYYY-MM-DD HH:MM:SS" + * @return 当前日期和时间的字符串表示 + */ + public static String dateTimeNow(final FormatsType format) { + return parseDateToStr(format, new Date()); + } + + /** + * 将指定日期格式化为 YYYY-MM-DD 格式的字符串 + * + * @param date 要格式化的日期对象 + * @return 格式化后的日期字符串 + */ + public static String formatDate(final Date date) { + return parseDateToStr(FormatsType.YYYY_MM_DD, date); + } + + /** + * 将指定日期格式化为 YYYY-MM-DD HH:MM:SS 格式的字符串 + * + * @param date 要格式化的日期对象 + * @return 格式化后的日期时间字符串 + */ + public static String formatDateTime(final Date date) { + return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date); + } + + /** + * 将指定日期按照指定格式进行格式化 + * + * @param format 要使用的日期时间格式,例如"YYYY-MM-DD HH:MM:SS" + * @param date 要格式化的日期对象 + * @return 格式化后的日期时间字符串 + */ + public static String parseDateToStr(final FormatsType format, final Date date) { + return new SimpleDateFormat(format.getTimeFormat()).format(date); + } + + /** + * 将指定格式的日期时间字符串转换为 Date 对象 + * + * @param format 要解析的日期时间格式,例如"YYYY-MM-DD HH:MM:SS" + * @param ts 要解析的日期时间字符串 + * @return 解析后的 Date 对象 + * @throws RuntimeException 如果解析过程中发生异常 + */ + public static Date parseDateTime(final FormatsType format, final String ts) { + try { + return new SimpleDateFormat(format.getTimeFormat()).parse(ts); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * 将对象转换为日期对象 + * + * @param str 要转换的对象,通常是字符串 + * @return 转换后的日期对象,如果转换失败或输入为null,则返回null + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return parseDate(str.toString(), PARSE_PATTERNS); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + * + * @return 服务器启动时间的 Date 对象表示 + */ + public static Date getServerStartDate() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算两个日期之间的天数差(以毫秒为单位) + * + * @param date1 第一个日期 + * @param date2 第二个日期 + * @return 两个日期之间的天数差的绝对值 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算两个日期之间的时间差,并以天、小时和分钟的格式返回 + * + * @param endDate 结束日期 + * @param nowDate 当前日期 + * @return 表示时间差的字符串,格式为"天 小时 分钟" + */ + public static String getDatePoor(Date endDate, Date nowDate) { + long diffInMillis = endDate.getTime() - nowDate.getTime(); + long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); + long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; + long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; + return String.format("%d天 %d小时 %d分钟", day, hour, min); + } + + /** + * 计算两个时间点的差值(天、小时、分钟、秒),当值为0时不显示该单位 + * + * @param endDate 结束时间 + * @param nowDate 当前时间 + * @return 时间差字符串,格式为 "x天 x小时 x分钟 x秒",若为 0 则不显示 + */ + public static String getTimeDifference(Date endDate, Date nowDate) { + long diffInMillis = endDate.getTime() - nowDate.getTime(); + long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); + long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; + long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; + long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60; + // 构建时间差字符串,条件是值不为0才显示 + StringBuilder result = new StringBuilder(); + if (day > 0) { + result.append(String.format("%d天 ", day)); + } + if (hour > 0) { + result.append(String.format("%d小时 ", hour)); + } + if (min > 0) { + result.append(String.format("%d分钟 ", min)); + } + if (sec > 0) { + result.append(String.format("%d秒", sec)); + } + return result.length() > 0 ? result.toString().trim() : "0秒"; + } + + /** + * 将 LocalDateTime 对象转换为 Date 对象 + * + * @param temporalAccessor 要转换的 LocalDateTime 对象 + * @return 转换后的 Date 对象 + */ + public static Date toDate(LocalDateTime temporalAccessor) { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 将 LocalDate 对象转换为 Date 对象 + * + * @param temporalAccessor 要转换的 LocalDate 对象 + * @return 转换后的 Date 对象 + */ + public static Date toDate(LocalDate temporalAccessor) { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 校验日期范围 + * + * @param startDate 开始日期 + * @param endDate 结束日期 + * @param maxValue 最大时间跨度的限制值 + * @param unit 时间跨度的单位,可选择 "DAYS"、"HOURS" 或 "MINUTES" + */ + public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) { + // 校验结束日期不能早于开始日期 + if (endDate.before(startDate)) { + throw new ServiceException("结束日期不能早于开始日期"); + } + + // 计算时间跨度 + long diffInMillis = endDate.getTime() - startDate.getTime(); + + // 根据单位转换时间跨度 + long diff = switch (unit) { + case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis); + case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis); + case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis); + default -> throw new IllegalArgumentException("不支持的时间单位"); + }; + + // 校验时间跨度不超过最大限制 + if (diff > maxValue) { + throw new ServiceException("最大时间跨度为 " + maxValue + " " + unit.toString().toLowerCase()); + } + } + + /** + * 获取当前时间+1天的时间 + * @return + */ + public static Date getNextDay() { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return DateUtils.parseDateTime(FormatsType.YYYY_MM_DD_HH_MM_SS,df.format(new Date().getTime()+1*24*3600*1000)); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java new file mode 100644 index 0000000..48dfc08 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MessageUtils.java @@ -0,0 +1,33 @@ +package org.dromara.common.core.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.context.MessageSource; +import org.springframework.context.NoSuchMessageException; +import org.springframework.context.i18n.LocaleContextHolder; + +/** + * 获取i18n资源文件 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MessageUtils { + + private static final MessageSource MESSAGE_SOURCE = SpringUtils.getBean(MessageSource.class); + + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) { + try { + return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); + } catch (NoSuchMessageException e) { + return code; + } + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java new file mode 100644 index 0000000..bd1aab8 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ServletUtils.java @@ -0,0 +1,289 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.convert.Convert; +import cn.hutool.extra.servlet.JakartaServletUtil; +import cn.hutool.http.HttpStatus; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedCaseInsensitiveMap; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.IOException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * 客户端工具类,提供获取请求参数、响应处理、头部信息等常用操作 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ServletUtils extends JakartaServletUtil { + + /** + * 获取指定名称的 String 类型的请求参数 + * + * @param name 参数名 + * @return 参数值 + */ + public static String getParameter(String name) { + return getRequest().getParameter(name); + } + + /** + * 获取指定名称的 String 类型的请求参数,若参数不存在,则返回默认值 + * + * @param name 参数名 + * @param defaultValue 默认值 + * @return 参数值或默认值 + */ + public static String getParameter(String name, String defaultValue) { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取指定名称的 Integer 类型的请求参数 + * + * @param name 参数名 + * @return 参数值 + */ + public static Integer getParameterToInt(String name) { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取指定名称的 Integer 类型的请求参数,若参数不存在,则返回默认值 + * + * @param name 参数名 + * @param defaultValue 默认值 + * @return 参数值或默认值 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取指定名称的 Boolean 类型的请求参数 + * + * @param name 参数名 + * @return 参数值 + */ + public static Boolean getParameterToBool(String name) { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取指定名称的 Boolean 类型的请求参数,若参数不存在,则返回默认值 + * + * @param name 参数名 + * @param defaultValue 默认值 + * @return 参数值或默认值 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取所有请求参数(以 Map 的形式返回) + * + * @param request 请求对象{@link ServletRequest} + * @return 请求参数的 Map,键为参数名,值为参数值数组 + */ + public static Map getParams(ServletRequest request) { + final Map map = request.getParameterMap(); + return Collections.unmodifiableMap(map); + } + + /** + * 获取所有请求参数(以 Map 的形式返回,值为字符串形式的拼接) + * + * @param request 请求对象{@link ServletRequest} + * @return 请求参数的 Map,键为参数名,值为拼接后的字符串 + */ + public static Map getParamMap(ServletRequest request) { + Map params = new HashMap<>(); + for (Map.Entry entry : getParams(request).entrySet()) { + params.put(entry.getKey(), StringUtils.join(entry.getValue(), StringUtils.SEPARATOR)); + } + return params; + } + + /** + * 获取当前 HTTP 请求对象 + * + * @return 当前 HTTP 请求对象 + */ + public static HttpServletRequest getRequest() { + try { + return getRequestAttributes().getRequest(); + } catch (Exception e) { + return null; + } + } + + /** + * 获取当前 HTTP 响应对象 + * + * @return 当前 HTTP 响应对象 + */ + public static HttpServletResponse getResponse() { + try { + return getRequestAttributes().getResponse(); + } catch (Exception e) { + return null; + } + } + + /** + * 获取当前请求的 HttpSession 对象 + *

+ * 如果当前请求已经关联了一个会话(即已经存在有效的 session ID), + * 则返回该会话对象;如果没有关联会话,则会创建一个新的会话对象并返回。 + *

+ * HttpSession 用于存储会话级别的数据,如用户登录信息、购物车内容等, + * 可以在多个请求之间共享会话数据 + * + * @return 当前请求的 HttpSession 对象 + */ + public static HttpSession getSession() { + return getRequest().getSession(); + } + + /** + * 获取当前请求的请求属性 + * + * @return {@link ServletRequestAttributes} 请求属性对象 + */ + public static ServletRequestAttributes getRequestAttributes() { + try { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } catch (Exception e) { + return null; + } + } + + /** + * 获取指定请求头的值,如果头部为空则返回空字符串 + * + * @param request 请求对象 + * @param name 头部名称 + * @return 头部值 + */ + public static String getHeader(HttpServletRequest request, String name) { + String value = request.getHeader(name); + if (StringUtils.isEmpty(value)) { + return StringUtils.EMPTY; + } + return urlDecode(value); + } + + /** + * 获取所有请求头的 Map,键为头部名称,值为头部值 + * + * @param request 请求对象 + * @return 请求头的 Map + */ + public static Map getHeaders(HttpServletRequest request) { + Map map = new LinkedCaseInsensitiveMap<>(); + Enumeration enumeration = request.getHeaderNames(); + if (enumeration != null) { + while (enumeration.hasMoreElements()) { + String key = enumeration.nextElement(); + String value = request.getHeader(key); + map.put(key, value); + } + } + return map; + } + + /** + * 将字符串渲染到客户端(以 JSON 格式返回) + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + */ + public static void renderString(HttpServletResponse response, String string) { + try { + response.setStatus(HttpStatus.HTTP_OK); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); + response.getWriter().print(string); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 判断当前请求是否为 Ajax 异步请求 + * + * @param request 请求对象 + * @return 是否为 Ajax 请求 + */ + public static boolean isAjaxRequest(HttpServletRequest request) { + + // 判断 Accept 头部是否包含 application/json + String accept = request.getHeader("accept"); + if (accept != null && accept.contains(MediaType.APPLICATION_JSON_VALUE)) { + return true; + } + + // 判断 X-Requested-With 头部是否包含 XMLHttpRequest + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) { + return true; + } + + // 判断 URI 后缀是否为 .json 或 .xml + String uri = request.getRequestURI(); + if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) { + return true; + } + + // 判断请求参数 __ajax 是否为 json 或 xml + String ajax = request.getParameter("__ajax"); + return StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml"); + } + + /** + * 获取客户端 IP 地址 + * + * @return 客户端 IP 地址 + */ + public static String getClientIP() { + return getClientIP(getRequest()); + } + + /** + * 对内容进行 URL 编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) { + return URLEncoder.encode(str, StandardCharsets.UTF_8); + } + + /** + * 对内容进行 URL 解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) { + return URLDecoder.decode(str, StandardCharsets.UTF_8); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java new file mode 100644 index 0000000..169c6e2 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java @@ -0,0 +1,67 @@ +package org.dromara.common.core.utils; + +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.boot.autoconfigure.thread.Threading; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * spring工具类 + * + * @author Lion Li + */ +@Component +public final class SpringUtils extends SpringUtil { + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + */ + public static boolean containsBean(String name) { + return getBeanFactory().containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 + * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return getBeanFactory().isSingleton(name); + } + + /** + * @return Class 注册对象的类型 + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return getBeanFactory().getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return getBeanFactory().getAliases(name); + } + + /** + * 获取aop代理对象 + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) getBean(invoker.getClass()); + } + + + /** + * 获取spring上下文 + */ + public static ApplicationContext context() { + return getApplicationContext(); + } + + public static boolean isVirtual() { + return Threading.VIRTUAL.isActive(getBean(Environment.class)); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java new file mode 100644 index 0000000..1342deb --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java @@ -0,0 +1,283 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * stream 流工具类 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class StreamUtils { + + /** + * 将collection过滤 + * + * @param collection 需要转化的集合 + * @param function 过滤方法 + * @return 过滤后的list + */ + public static List filter(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + return collection.stream().filter(function).collect(Collectors.toList()); + } + + /** + * 找到流中满足条件的第一个元素 + * + * @param collection 需要查询的集合 + * @param function 过滤方法 + * @return 找到符合条件的第一个元素,没有则返回null + */ + public static E findFirst(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return null; + } + return collection.stream().filter(function).findFirst().orElse(null); + } + + /** + * 找到流中任意一个满足条件的元素 + * + * @param collection 需要查询的集合 + * @param function 过滤方法 + * @return 找到符合条件的任意一个元素,没有则返回null + */ + public static Optional findAny(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return Optional.empty(); + } + return collection.stream().filter(function).findAny(); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function) { + return join(collection, function, StringUtils.SEPARATOR); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @param delimiter 拼接符 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function, CharSequence delimiter) { + if (CollUtil.isEmpty(collection)) { + return StringUtils.EMPTY; + } + return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter)); + } + + /** + * 将collection排序 + * + * @param collection 需要转化的集合 + * @param comparing 排序方法 + * @return 排序后的list + */ + public static List sorted(Collection collection, Comparator comparing) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + return collection.stream().filter(Objects::nonNull).sorted(comparing).collect(Collectors.toList()); + } + + /** + * 将collection转化为类型不变的map
+ * {@code Collection ----> Map} + * + * @param collection 需要转化的集合 + * @param key V类型转化为K类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @return 转化后的map + */ + public static Map toIdentityMap(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); + } + + /** + * 将Collection转化为map(value类型与collection的泛型不同)
+ * {@code Collection -----> Map } + * + * @param collection 需要转化的集合 + * @param key E类型转化为K类型的lambda方法 + * @param value E类型转化为V类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @param map中的value类型 + * @return 转化后的map + */ + public static Map toMap(Collection collection, Function key, Function value) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, value, (l, r) -> l)); + } + + /** + * 将collection按照规则(比如有相同的班级id)分类成map
+ * {@code Collection -------> Map> } + * + * @param collection 需要分类的集合 + * @param key 分类的规则 + * @param collection中的泛型 + * @param map中的key类型 + * @return 分类后的map + */ + public static Map> groupByKey(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList())); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map>> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 集合元素类型 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @return 分类后的map + */ + public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList()))); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @param collection中的泛型 + * @return 分类后的map + */ + public static Map> group2Map(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { + return MapUtil.newHashMap(); + } + return collection + .stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l))); + } + + /** + * 将collection转化为List集合,但是两者的泛型不同
+ * {@code Collection ------> List } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为list泛型的lambda表达式 + * @param collection中的泛型 + * @param List中的泛型 + * @return 转化后的list + */ + public static List toList(Collection collection, Function function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + .collect(Collectors.toList()); + } + + /** + * 将collection转化为Set集合,但是两者的泛型不同
+ * {@code Collection ------> Set } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为set泛型的lambda表达式 + * @param collection中的泛型 + * @param Set中的泛型 + * @return 转化后的Set + */ + public static Set toSet(Collection collection, Function function) { + if (CollUtil.isEmpty(collection) || function == null) { + return CollUtil.newHashSet(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + + /** + * 合并两个相同key类型的map + * + * @param map1 第一个需要合并的 map + * @param map2 第二个需要合并的 map + * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 + * @param map中的key类型 + * @param 第一个 map的value类型 + * @param 第二个 map的value类型 + * @param 最终map的value类型 + * @return 合并后的map + */ + public static Map merge(Map map1, Map map2, BiFunction merge) { + if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { + return MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map1)) { + map1 = MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map2)) { + map2 = MapUtil.newHashMap(); + } + Set key = new HashSet<>(); + key.addAll(map1.keySet()); + key.addAll(map2.keySet()); + Map map = new HashMap<>(); + for (K t : key) { + X x = map1.get(t); + Y y = map2.get(t); + V z = merge.apply(x, y); + if (z != null) { + map.put(t, z); + } + } + return map; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java new file mode 100644 index 0000000..1663eef --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -0,0 +1,406 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; +import org.springframework.util.AntPathMatcher; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 字符串工具类 + * + * @author Lion Li + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + public static final String SEPARATOR = ","; + + public static final String SLASH = "/"; + + @Deprecated + private StringUtils() { + } + + /** + * 获取参数不为空值 + * + * @param str defaultValue 要判断的value + * @return value 返回值 + */ + public static String blankToDefault(String str, String defaultValue) { + return StrUtil.blankToDefault(str, defaultValue); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return StrUtil.isEmpty(str); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return StrUtil.trim(str); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + return substring(str, start, str.length()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + return StrUtil.sub(str, start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is {} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + return StrUtil.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return Validator.isUrl(link); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static Set str2Set(String str, String sep) { + return new HashSet<>(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList<>(); + if (isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && isBlank(string)) { + continue; + } + if (trim) { + string = trim(string); + } + list.add(string); + } + + return list; + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + return StrUtil.toUnderlineCase(str); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + return StrUtil.equalsAnyIgnoreCase(str, strs); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + return StrUtil.upperFirst(StrUtil.toCamelCase(name)); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + return StrUtil.toCamelCase(s); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || CollUtil.isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static String padl(final Number num, final int size) { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static String padl(final String s, final int size, final char c) { + final StringBuilder sb = new StringBuilder(size); + if (s != null) { + final int len = s.length(); + if (s.length() <= size) { + sb.append(String.valueOf(c).repeat(size - len)); + sb.append(s); + } else { + return s.substring(len - size, len); + } + } else { + sb.append(String.valueOf(c).repeat(Math.max(0, size))); + } + return sb.toString(); + } + + /** + * 切分字符串(分隔符默认逗号) + * + * @param str 被切分的字符串 + * @return 分割后的数据列表 + */ + public static List splitList(String str) { + return splitTo(str, Convert::toStr); + } + + /** + * 切分字符串 + * + * @param str 被切分的字符串 + * @param separator 分隔符 + * @return 分割后的数据列表 + */ + public static List splitList(String str, String separator) { + return splitTo(str, separator, Convert::toStr); + } + + /** + * 切分字符串自定义转换(分隔符默认逗号) + * + * @param str 被切分的字符串 + * @param mapper 自定义转换 + * @return 分割后的数据列表 + */ + public static List splitTo(String str, Function mapper) { + return splitTo(str, SEPARATOR, mapper); + } + + /** + * 切分字符串自定义转换 + * + * @param str 被切分的字符串 + * @param separator 分隔符 + * @param mapper 自定义转换 + * @return 分割后的数据列表 + */ + public static List splitTo(String str, String separator, Function mapper) { + if (isBlank(str)) { + return new ArrayList<>(0); + } + return StrUtil.split(str, separator) + .stream() + .filter(Objects::nonNull) + .map(mapper) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 不区分大小写检查 CharSequence 是否以指定的前缀开头。 + * + * @param str 要检查的 CharSequence 可能为 null + * @param prefixs 要查找的前缀可能为 null + * @return 是否包含 + */ + public static boolean startWithAnyIgnoreCase(CharSequence str, CharSequence... prefixs) { + // 判断是否是以指定字符串开头 + for (CharSequence prefix : prefixs) { + if (StringUtils.startsWithIgnoreCase(str, prefix)) { + return true; + } + } + return false; + } + + public static String getFirstCharToUpper(String input) { + if (input == null || input.isEmpty()) { + return ""; // 如果字符串为空或长度为0,返回空字符串 + } + // 获取第一个字符并转为大写 + return String.valueOf(input.charAt(0)).toUpperCase(); + } + + /** + * 裁剪字符串,保留指定长度的字符(中文占2个字符,其他占1个字符) + * + * @param input 输入字符串 + * @param maxLength 最大字符长度 + * @return 裁剪后的字符串 + */ + public static String truncateString(String input, int maxLength) { + if (input == null || maxLength <= 0) { + return ""; + } + int length = 0; + StringBuilder result = new StringBuilder(); + for (int i = 0; i < input.length(); i++) { + char c = input.charAt(i); + // 判断是否为中文字符 + if (isChinese(c)) { + length += 2; + } else { + length += 1; + } + // 如果超过最大长度,则停止 + if (length > maxLength) { + break; + } + result.append(c); + } + + return result.toString(); + } + + /** + * 判断字符是否为中文字符 + * + * @param c 字符 + * @return 是否为中文字符 + */ + public static boolean isChinese(char c) { + Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); + + if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS + + || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS + + || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A + + || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION + + || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION + + || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { + return true; + + } + return false; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java new file mode 100644 index 0000000..2ab42cb --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -0,0 +1,96 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.lang.tree.parser.NodeParser; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 扩展 hutool TreeUtil 封装系统树构建 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TreeBuildUtils extends TreeUtil { + + /** + * 根据前端定制差异化字段 + */ + public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); + + /** + * 构建树形结构 + * + * @param 输入节点的类型 + * @param 节点ID的类型 + * @param list 节点列表,其中包含了要构建树形结构的所有节点 + * @param nodeParser 解析器,用于将输入节点转换为树节点 + * @return 构建好的树形结构列表 + */ + public static List> build(List list, NodeParser nodeParser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + K k = ReflectUtils.invokeGetter(list.get(0), "parentId"); + return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser); + } + + /** + * 构建树形结构 + * + * @param 输入节点的类型 + * @param 节点ID的类型 + * @param parentId 顶级节点 + * @param list 节点列表,其中包含了要构建树形结构的所有节点 + * @param nodeParser 解析器,用于将输入节点转换为树节点 + * @return 构建好的树形结构列表 + */ + public static List> build(List list, K parentId, NodeParser nodeParser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); + } + + /** + * 获取节点列表中所有节点的叶子节点 + * + * @param 节点ID的类型 + * @param nodes 节点列表 + * @return 包含所有叶子节点的列表 + */ + public static List> getLeafNodes(List> nodes) { + if (CollUtil.isEmpty(nodes)) { + return CollUtil.newArrayList(); + } + return nodes.stream() + .flatMap(TreeBuildUtils::extractLeafNodes) + .collect(Collectors.toList()); + } + + /** + * 获取指定节点下的所有叶子节点 + * + * @param 节点ID的类型 + * @param node 要查找叶子节点的根节点 + * @return 包含所有叶子节点的列表 + */ + private static Stream> extractLeafNodes(Tree node) { + if (!node.hasChild()) { + return Stream.of(node); + } else { + // 递归调用,获取所有子节点的叶子节点 + return node.getChildren().stream() + .flatMap(TreeBuildUtils::extractLeafNodes); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java new file mode 100644 index 0000000..06b8fd6 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ValidatorUtils.java @@ -0,0 +1,35 @@ +package org.dromara.common.core.utils; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validator; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Set; + +/** + * Validator 校验框架工具 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ValidatorUtils { + + private static final Validator VALID = SpringUtils.getBean(Validator.class); + + /** + * 对给定对象进行参数校验,并根据指定的校验组进行校验 + * + * @param object 要进行校验的对象 + * @param groups 校验组 + * @throws ConstraintViolationException 如果校验不通过,则抛出参数校验异常 + */ + public static void validate(T object, Class... groups) { + Set> validate = VALID.validate(object, groups); + if (!validate.isEmpty()) { + throw new ConstraintViolationException("参数校验异常", validate); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..23fa2cf --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java @@ -0,0 +1,40 @@ +package org.dromara.common.core.utils.file; + +/** + * 媒体类型工具类 + * + * @author ruoyi + */ +public class MimeTypeUtils { + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"}; + + public static final String[] FLASH_EXTENSION = {"swf", "flv"}; + + public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb"}; + + public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"}; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf"}; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java new file mode 100644 index 0000000..3f7cd57 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -0,0 +1,33 @@ +package org.dromara.common.core.utils.ip; + +import cn.hutool.core.net.NetUtil; +import cn.hutool.http.HtmlUtil; +import org.dromara.common.core.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 获取地址类 + * + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AddressUtils { + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) { + if (StringUtils.isBlank(ip)) { + return UNKNOWN; + } + // 内网不查询 + ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); + if (NetUtil.isInnerIP(ip)) { + return "内网IP"; + } + return RegionUtils.getCityInfo(ip); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java new file mode 100644 index 0000000..6dde129 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java @@ -0,0 +1,31 @@ +package org.dromara.common.core.utils.regex; + + +import cn.hutool.core.util.ReUtil; +import org.dromara.common.core.constant.RegexConstants; + +/** + * 正则相关工具类 + * + * @author Feng + */ +public final class RegexUtils extends ReUtil { + + /** + * 从输入字符串中提取匹配的部分,如果没有匹配则返回默认值 + * + * @param input 要提取的输入字符串 + * @param regex 用于匹配的正则表达式,可以使用 {@link RegexConstants} 中定义的常量 + * @param defaultInput 如果没有匹配时返回的默认值 + * @return 如果找到匹配的部分,则返回匹配的部分,否则返回默认值 + */ + public static String extractFromString(String input, String regex, String defaultInput) { + try { + String str = ReUtil.get(regex, input, 1); + return str == null ? defaultInput : str; + } catch (Exception e) { + return defaultInput; + } + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java new file mode 100644 index 0000000..c0dda20 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java @@ -0,0 +1,105 @@ +package org.dromara.common.core.utils.regex; + +import cn.hutool.core.exceptions.ValidateException; +import cn.hutool.core.lang.Validator; +import org.dromara.common.core.factory.RegexPatternPoolFactory; + +import java.util.regex.Pattern; + +/** + * 正则字段校验器 + * 主要验证字段非空、是否为满足指定格式等 + * + * @author Feng + */ +public class RegexValidator extends Validator { + + /** + * 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) + */ + public static final Pattern DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE; + + /** + * 身份证号码(后6位) + */ + public static final Pattern ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6; + + /** + * QQ号码 + */ + public static final Pattern QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER; + + /** + * 邮政编码 + */ + public static final Pattern POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE; + + /** + * 注册账号 + */ + public static final Pattern ACCOUNT = RegexPatternPoolFactory.ACCOUNT; + + /** + * 密码:包含至少8个字符,包括大写字母、小写字母、数字和特殊字符 + */ + public static final Pattern PASSWORD = RegexPatternPoolFactory.PASSWORD; + + /** + * 通用状态(0表示正常,1表示停用) + */ + public static final Pattern STATUS = RegexPatternPoolFactory.STATUS; + + + /** + * 检查输入的账号是否匹配预定义的规则 + * + * @param value 要验证的账号 + * @return 如果账号符合规则,返回 true;否则,返回 false。 + */ + public static boolean isAccount(CharSequence value) { + return isMatchRegex(ACCOUNT, value); + } + + /** + * 验证输入的账号是否符合规则,如果不符合,则抛出 ValidateException 异常 + * + * @param value 要验证的账号 + * @param errorMsg 验证失败时抛出的异常消息 + * @param CharSequence 的子类型 + * @return 如果验证通过,返回输入的账号 + * @throws ValidateException 如果验证失败 + */ + public static T validateAccount(T value, String errorMsg) throws ValidateException { + if (!isAccount(value)) { + throw new ValidateException(errorMsg); + } + return value; + } + + /** + * 检查输入的状态是否匹配预定义的规则 + * + * @param value 要验证的状态 + * @return 如果状态符合规则,返回 true;否则,返回 false。 + */ + public static boolean isStatus(CharSequence value) { + return isMatchRegex(STATUS, value); + } + + /** + * 验证输入的状态是否符合规则,如果不符合,则抛出 ValidateException 异常 + * + * @param value 要验证的状态 + * @param errorMsg 验证失败时抛出的异常消息 + * @param CharSequence 的子类型 + * @return 如果验证通过,返回输入的状态 + * @throws ValidateException 如果验证失败 + */ + public static T validateStatus(T value, String errorMsg) throws ValidateException { + if (!isStatus(value)) { + throw new ValidateException(errorMsg); + } + return value; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java new file mode 100644 index 0000000..77c5040 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/EditGroup.java @@ -0,0 +1,9 @@ +package org.dromara.common.core.validate; + +/** + * 校验分组 edit + * + * @author Lion Li + */ +public interface EditGroup { +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java new file mode 100644 index 0000000..02a0ac2 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/QueryGroup.java @@ -0,0 +1,9 @@ +package org.dromara.common.core.validate; + +/** + * 校验分组 query + * + * @author Lion Li + */ +public interface QueryGroup { +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java new file mode 100644 index 0000000..923c423 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java @@ -0,0 +1,37 @@ +package org.dromara.common.core.validate.enumd; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; + +/** + * 自定义枚举校验注解实现 + * + * @author 秋辞未寒 + * @date 2024-12-09 + */ +public class EnumPatternValidator implements ConstraintValidator { + + private EnumPattern annotation;; + + @Override + public void initialize(EnumPattern annotation) { + ConstraintValidator.super.initialize(annotation); + this.annotation = annotation; + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + if (StringUtils.isNotBlank(value)) { + String fieldName = annotation.fieldName(); + for (Object e : annotation.type().getEnumConstants()) { + if (value.equals(ReflectUtils.invokeGetter(e, fieldName))) { + return true; + } + } + } + return false; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java new file mode 100644 index 0000000..9c32563 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java @@ -0,0 +1,21 @@ +package org.dromara.common.core.xss; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.http.HtmlUtil; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +/** + * 自定义xss校验注解实现 + * + * @author Lion Li + */ +public class XssValidator implements ConstraintValidator { + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + return !ReUtil.contains(HtmlUtil.RE_HTML_MARK, value); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..3395e73 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,6 @@ +org.dromara.common.core.config.ApplicationConfig +org.dromara.common.core.config.AsyncConfig +org.dromara.common.core.config.RuoYiConfig +org.dromara.common.core.config.ThreadPoolConfig +org.dromara.common.core.config.ValidatorConfig +org.dromara.common.core.utils.SpringUtils diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java new file mode 100644 index 0000000..069ef9a --- /dev/null +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java @@ -0,0 +1,126 @@ +package org.dromara.common.doc.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.doc.config.properties.SpringDocProperties; +import org.dromara.common.doc.handler.OpenApiHandler; +import org.springdoc.core.configuration.SpringDocConfiguration; +import org.springdoc.core.customizers.OpenApiBuilderCustomizer; +import org.springdoc.core.customizers.OpenApiCustomizer; +import org.springdoc.core.customizers.ServerBaseUrlCustomizer; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springdoc.core.providers.JavadocProvider; +import org.springdoc.core.service.OpenAPIService; +import org.springdoc.core.service.SecurityService; +import org.springdoc.core.utils.PropertyResolverUtils; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +/** + * Swagger 文档配置 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@AutoConfiguration(before = SpringDocConfiguration.class) +@EnableConfigurationProperties(SpringDocProperties.class) +@ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true) +public class SpringDocConfig { + + private final ServerProperties serverProperties; + + @Bean + @ConditionalOnMissingBean(OpenAPI.class) + public OpenAPI openApi(SpringDocProperties properties) { + OpenAPI openApi = new OpenAPI(); + // 文档基本信息 + SpringDocProperties.InfoProperties infoProperties = properties.getInfo(); + Info info = convertInfo(infoProperties); + openApi.info(info); + // 扩展文档信息 + openApi.externalDocs(properties.getExternalDocs()); + openApi.tags(properties.getTags()); + openApi.paths(properties.getPaths()); + openApi.components(properties.getComponents()); + Set keySet = properties.getComponents().getSecuritySchemes().keySet(); + List list = new ArrayList<>(); + SecurityRequirement securityRequirement = new SecurityRequirement(); + keySet.forEach(securityRequirement::addList); + list.add(securityRequirement); + openApi.security(list); + + return openApi; + } + + private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) { + Info info = new Info(); + info.setTitle(infoProperties.getTitle()); + info.setDescription(infoProperties.getDescription()); + info.setContact(infoProperties.getContact()); + info.setLicense(infoProperties.getLicense()); + info.setVersion(infoProperties.getVersion()); + return info; + } + + /** + * 自定义 openapi 处理器 + */ + @Bean + public OpenAPIService openApiBuilder(Optional openAPI, + SecurityService securityParser, + SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, + Optional> openApiBuilderCustomisers, + Optional> serverBaseUrlCustomisers, Optional javadocProvider) { + return new OpenApiHandler(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider); + } + + /** + * 对已经生成好的 OpenApi 进行自定义操作 + */ + @Bean + public OpenApiCustomizer openApiCustomizer() { + String contextPath = serverProperties.getServlet().getContextPath(); + String finalContextPath; + if (StringUtils.isBlank(contextPath) || "/".equals(contextPath)) { + finalContextPath = ""; + } else { + finalContextPath = contextPath; + } + // 对所有路径增加前置上下文路径 + return openApi -> { + Paths oldPaths = openApi.getPaths(); + if (oldPaths instanceof PlusPaths) { + return; + } + PlusPaths newPaths = new PlusPaths(); + oldPaths.forEach((k, v) -> newPaths.addPathItem(finalContextPath + k, v)); + openApi.setPaths(newPaths); + }; + } + + /** + * 单独使用一个类便于判断 解决springdoc路径拼接重复问题 + * + * @author Lion Li + */ + static class PlusPaths extends Paths { + + public PlusPaths() { + super(); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java new file mode 100644 index 0000000..eae3b4c --- /dev/null +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/properties/SpringDocProperties.java @@ -0,0 +1,94 @@ +package org.dromara.common.doc.config.properties; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.tags.Tag; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +import java.util.List; + +/** + * swagger 配置属性 + * + * @author Lion Li + */ +@Data +@ConfigurationProperties(prefix = "springdoc") +public class SpringDocProperties { + + /** + * 文档基本信息 + */ + @NestedConfigurationProperty + private InfoProperties info = new InfoProperties(); + + /** + * 扩展文档地址 + */ + @NestedConfigurationProperty + private ExternalDocumentation externalDocs; + + /** + * 标签 + */ + private List tags = null; + + /** + * 路径 + */ + @NestedConfigurationProperty + private Paths paths = null; + + /** + * 组件 + */ + @NestedConfigurationProperty + private Components components = null; + + /** + *

+ * 文档的基础属性信息 + *

+ * + * @see io.swagger.v3.oas.models.info.Info + * + * 为了 springboot 自动生产配置提示信息,所以这里复制一个类出来 + */ + @Data + public static class InfoProperties { + + /** + * 标题 + */ + private String title = null; + + /** + * 描述 + */ + private String description = null; + + /** + * 联系人信息 + */ + @NestedConfigurationProperty + private Contact contact = null; + + /** + * 许可证 + */ + @NestedConfigurationProperty + private License license = null; + + /** + * 版本 + */ + private String version = null; + + } + +} diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java new file mode 100644 index 0000000..56b7369 --- /dev/null +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java @@ -0,0 +1,253 @@ +package org.dromara.common.doc.handler; + +import cn.hutool.core.io.IoUtil; +import io.swagger.v3.core.jackson.TypeNameResolver; +import io.swagger.v3.core.util.AnnotationsUtils; +import io.swagger.v3.oas.annotations.tags.Tags; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.springdoc.core.customizers.OpenApiBuilderCustomizer; +import org.springdoc.core.customizers.ServerBaseUrlCustomizer; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springdoc.core.providers.JavadocProvider; +import org.springdoc.core.service.OpenAPIService; +import org.springdoc.core.service.SecurityService; +import org.springdoc.core.utils.PropertyResolverUtils; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.web.method.HandlerMethod; + +import java.io.StringReader; +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 自定义 openapi 处理器 + * 对源码功能进行修改 增强使用 + */ +@Slf4j +@SuppressWarnings("all") +public class OpenApiHandler extends OpenAPIService { + + /** + * The Basic error controller. + */ + private static Class basicErrorController; + + /** + * The Security parser. + */ + private final SecurityService securityParser; + + /** + * The Mappings map. + */ + private final Map mappingsMap = new HashMap<>(); + + /** + * The Springdoc tags. + */ + private final Map springdocTags = new HashMap<>(); + + /** + * The Open api builder customisers. + */ + private final Optional> openApiBuilderCustomisers; + + /** + * The server base URL customisers. + */ + private final Optional> serverBaseUrlCustomizers; + + /** + * The Spring doc config properties. + */ + private final SpringDocConfigProperties springDocConfigProperties; + + /** + * The Cached open api map. + */ + private final Map cachedOpenAPI = new HashMap<>(); + + /** + * The Property resolver utils. + */ + private final PropertyResolverUtils propertyResolverUtils; + + /** + * The javadoc provider. + */ + private final Optional javadocProvider; + + /** + * The Context. + */ + private ApplicationContext context; + + /** + * The Open api. + */ + private OpenAPI openAPI; + + /** + * The Is servers present. + */ + private boolean isServersPresent; + + /** + * The Server base url. + */ + private String serverBaseUrl; + + /** + * Instantiates a new Open api builder. + * + * @param openAPI the open api + * @param securityParser the security parser + * @param springDocConfigProperties the spring doc config properties + * @param propertyResolverUtils the property resolver utils + * @param openApiBuilderCustomizers the open api builder customisers + * @param serverBaseUrlCustomizers the server base url customizers + * @param javadocProvider the javadoc provider + */ + public OpenApiHandler(Optional openAPI, SecurityService securityParser, + SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils, + Optional> openApiBuilderCustomizers, + Optional> serverBaseUrlCustomizers, + Optional javadocProvider) { + super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); + if (openAPI.isPresent()) { + this.openAPI = openAPI.get(); + if (this.openAPI.getComponents() == null) + this.openAPI.setComponents(new Components()); + if (this.openAPI.getPaths() == null) + this.openAPI.setPaths(new Paths()); + if (!CollectionUtils.isEmpty(this.openAPI.getServers())) + this.isServersPresent = true; + } + this.propertyResolverUtils = propertyResolverUtils; + this.securityParser = securityParser; + this.springDocConfigProperties = springDocConfigProperties; + this.openApiBuilderCustomisers = openApiBuilderCustomizers; + this.serverBaseUrlCustomizers = serverBaseUrlCustomizers; + this.javadocProvider = javadocProvider; + if (springDocConfigProperties.isUseFqn()) + TypeNameResolver.std.setUseFqn(true); + } + + @Override + public Operation buildTags(HandlerMethod handlerMethod, Operation operation, OpenAPI openAPI, Locale locale) { + + Set tags = new HashSet<>(); + Set tagsStr = new HashSet<>(); + + buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr, locale); + buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr, locale); + + if (!CollectionUtils.isEmpty(tagsStr)) + tagsStr = tagsStr.stream() + .map(str -> propertyResolverUtils.resolve(str, locale)) + .collect(Collectors.toSet()); + + if (springdocTags.containsKey(handlerMethod)) { + io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod); + tagsStr.add(tag.getName()); + if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { + openAPI.addTagsItem(tag); + } + } + + if (!CollectionUtils.isEmpty(tagsStr)) { + if (CollectionUtils.isEmpty(operation.getTags())) + operation.setTags(new ArrayList<>(tagsStr)); + else { + Set operationTagsSet = new HashSet<>(operation.getTags()); + operationTagsSet.addAll(tagsStr); + operation.getTags().clear(); + operation.getTags().addAll(operationTagsSet); + } + } + + if (isAutoTagClasses(operation)) { + + + if (javadocProvider.isPresent()) { + String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType()); + if (StringUtils.isNotBlank(description)) { + io.swagger.v3.oas.models.tags.Tag tag = new io.swagger.v3.oas.models.tags.Tag(); + + // 自定义部分 修改使用java注释当tag名 + List list = IoUtil.readLines(new StringReader(description), new ArrayList<>()); + // tag.setName(tagAutoName); + tag.setName(list.get(0)); + operation.addTagsItem(list.get(0)); + + tag.setDescription(description); + if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) { + openAPI.addTagsItem(tag); + } + } + } else { + String tagAutoName = splitCamelCase(handlerMethod.getBeanType().getSimpleName()); + operation.addTagsItem(tagAutoName); + } + } + + if (!CollectionUtils.isEmpty(tags)) { + // Existing tags + List openApiTags = openAPI.getTags(); + if (!CollectionUtils.isEmpty(openApiTags)) + tags.addAll(openApiTags); + openAPI.setTags(new ArrayList<>(tags)); + } + + // Handle SecurityRequirement at operation level + io.swagger.v3.oas.annotations.security.SecurityRequirement[] securityRequirements = securityParser + .getSecurityRequirements(handlerMethod); + if (securityRequirements != null) { + if (securityRequirements.length == 0) + operation.setSecurity(Collections.emptyList()); + else + securityParser.buildSecurityRequirement(securityRequirements, operation); + } + + return operation; + } + + private void buildTagsFromMethod(Method method, Set tags, Set tagsStr, Locale locale) { + // method tags + Set tagsSet = AnnotatedElementUtils + .findAllMergedAnnotations(method, Tags.class); + Set methodTags = tagsSet.stream() + .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet()); + methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class)); + if (!CollectionUtils.isEmpty(methodTags)) { + tagsStr.addAll(StreamUtils.toSet(methodTags, tag -> propertyResolverUtils.resolve(tag.name(), locale))); + List allTags = new ArrayList<>(methodTags); + addTags(allTags, tags, locale); + } + } + + private void addTags(List sourceTags, Set tags, Locale locale) { + Optional> optionalTagSet = AnnotationsUtils + .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true); + optionalTagSet.ifPresent(tagsSet -> { + tagsSet.forEach(tag -> { + tag.name(propertyResolverUtils.resolve(tag.getName(), locale)); + tag.description(propertyResolverUtils.resolve(tag.getDescription(), locale)); + if (tags.stream().noneMatch(t -> t.getName().equals(tag.getName()))) + tags.add(tag); + }); + }); + } + +} diff --git a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..fe11e76 --- /dev/null +++ b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.doc.config.SpringDocConfig diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java new file mode 100644 index 0000000..7f52de8 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/ApiEncrypt.java @@ -0,0 +1,20 @@ +package org.dromara.common.encrypt.annotation; + +import java.lang.annotation.*; + +/** + * 强制加密注解 + * + * @author Michelle.Chung + */ +@Documented +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiEncrypt { + + /** + * 响应加密忽略,默认不加密,为 true 时加密 + */ + boolean response() default false; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java new file mode 100644 index 0000000..d357d72 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/annotation/EncryptField.java @@ -0,0 +1,44 @@ +package org.dromara.common.encrypt.annotation; + +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; + +import java.lang.annotation.*; + +/** + * 字段加密注解 + * + * @author 老马 + */ +@Documented +@Inherited +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface EncryptField { + + /** + * 加密算法 + */ + AlgorithmType algorithm() default AlgorithmType.DEFAULT; + + /** + * 秘钥。AES、SM4需要 + */ + String password() default ""; + + /** + * 公钥。RSA、SM2需要 + */ + String publicKey() default ""; + + /** + * 私钥。RSA、SM2需要 + */ + String privateKey() default ""; + + /** + * 编码方式。对加密算法为BASE64的不起作用 + */ + EncodeType encode() default EncodeType.DEFAULT; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java new file mode 100644 index 0000000..098f6bc --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java @@ -0,0 +1,32 @@ +package org.dromara.common.encrypt.config; + +import jakarta.servlet.DispatcherType; +import org.dromara.common.encrypt.filter.CryptoFilter; +import org.dromara.common.encrypt.properties.ApiDecryptProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * api 解密自动配置 + * + * @author wdhcr + */ +@AutoConfiguration +@EnableConfigurationProperties(ApiDecryptProperties.class) +@ConditionalOnProperty(value = "api-decrypt.enabled", havingValue = "true") +public class ApiDecryptAutoConfiguration { + + @Bean + public FilterRegistrationBean cryptoFilterRegistration(ApiDecryptProperties properties) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new CryptoFilter(properties)); + registration.addUrlPatterns("/*"); + registration.setName("cryptoFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + return registration; + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java new file mode 100644 index 0000000..fbc4e52 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/EncryptorAutoConfiguration.java @@ -0,0 +1,49 @@ +package org.dromara.common.encrypt.config; + +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.encrypt.core.EncryptorManager; +import org.dromara.common.encrypt.interceptor.MybatisDecryptInterceptor; +import org.dromara.common.encrypt.interceptor.MybatisEncryptInterceptor; +import org.dromara.common.encrypt.properties.EncryptorProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * 加解密配置 + * + * @author 老马 + * @version 4.6.0 + */ +@AutoConfiguration(after = MybatisPlusAutoConfiguration.class) +@EnableConfigurationProperties(EncryptorProperties.class) +@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") +@Slf4j +public class EncryptorAutoConfiguration { + + @Autowired + private EncryptorProperties properties; + + @Bean + public EncryptorManager encryptorManager(MybatisPlusProperties mybatisPlusProperties) { + return new EncryptorManager(mybatisPlusProperties.getTypeAliasesPackage()); + } + + @Bean + public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { + return new MybatisEncryptInterceptor(encryptorManager, properties); + } + + @Bean + public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { + return new MybatisDecryptInterceptor(encryptorManager, properties); + } + +} + + + diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java new file mode 100644 index 0000000..dbc4420 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/IEncryptor.java @@ -0,0 +1,35 @@ +package org.dromara.common.encrypt.core; + +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; + +/** + * 加解者 + * + * @author 老马 + * @version 4.6.0 + */ +public interface IEncryptor { + + /** + * 获得当前算法 + */ + AlgorithmType algorithm(); + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + * @return 加密后的字符串 + */ + String encrypt(String value, EncodeType encodeType); + + /** + * 解密 + * + * @param value 待加密字符串 + * @return 解密后的字符串 + */ + String decrypt(String value); +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java new file mode 100644 index 0000000..858d229 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/AbstractEncryptor.java @@ -0,0 +1,18 @@ +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.core.IEncryptor; + +/** + * 所有加密执行者的基类 + * + * @author 老马 + * @version 4.6.0 + */ +public abstract class AbstractEncryptor implements IEncryptor { + + public AbstractEncryptor(EncryptContext context) { + // 用户配置校验与配置注入 + } + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java new file mode 100644 index 0000000..5f03a4b --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/RsaEncryptor.java @@ -0,0 +1,62 @@ +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + + +/** + * RSA算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class RsaEncryptor extends AbstractEncryptor { + + private final EncryptContext context; + + public RsaEncryptor(EncryptContext context) { + super(context); + String privateKey = context.getPrivateKey(); + String publicKey = context.getPublicKey(); + if (StringUtils.isAnyEmpty(privateKey, publicKey)) { + throw new IllegalArgumentException("RSA公私钥均需要提供,公钥加密,私钥解密。"); + } + this.context = context; + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.RSA; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + if (encodeType == EncodeType.HEX) { + return EncryptUtils.encryptByRsaHex(value, context.getPublicKey()); + } else { + return EncryptUtils.encryptByRsa(value, context.getPublicKey()); + } + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptByRsa(value, context.getPrivateKey()); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java new file mode 100644 index 0000000..aec5d82 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/Sm2Encryptor.java @@ -0,0 +1,61 @@ +package org.dromara.common.encrypt.core.encryptor; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; + +/** + * sm2算法实现 + * + * @author 老马 + * @version 4.6.0 + */ +public class Sm2Encryptor extends AbstractEncryptor { + + private final EncryptContext context; + + public Sm2Encryptor(EncryptContext context) { + super(context); + String privateKey = context.getPrivateKey(); + String publicKey = context.getPublicKey(); + if (StringUtils.isAnyEmpty(privateKey, publicKey)) { + throw new IllegalArgumentException("SM2公私钥均需要提供,公钥加密,私钥解密。"); + } + this.context = context; + } + + /** + * 获得当前算法 + */ + @Override + public AlgorithmType algorithm() { + return AlgorithmType.SM2; + } + + /** + * 加密 + * + * @param value 待加密字符串 + * @param encodeType 加密后的编码格式 + */ + @Override + public String encrypt(String value, EncodeType encodeType) { + if (encodeType == EncodeType.HEX) { + return EncryptUtils.encryptBySm2Hex(value, context.getPublicKey()); + } else { + return EncryptUtils.encryptBySm2(value, context.getPublicKey()); + } + } + + /** + * 解密 + * + * @param value 待加密字符串 + */ + @Override + public String decrypt(String value) { + return EncryptUtils.decryptBySm2(value, context.getPrivateKey()); + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java new file mode 100644 index 0000000..26ee1ee --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java @@ -0,0 +1,48 @@ +package org.dromara.common.encrypt.enumd; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.encrypt.core.encryptor.*; + +/** + * 算法名称 + * + * @author 老马 + * @version 4.6.0 + */ +@Getter +@AllArgsConstructor +public enum AlgorithmType { + + /** + * 默认走yml配置 + */ + DEFAULT(null), + + /** + * base64 + */ + BASE64(Base64Encryptor.class), + + /** + * aes + */ + AES(AesEncryptor.class), + + /** + * rsa + */ + RSA(RsaEncryptor.class), + + /** + * sm2 + */ + SM2(Sm2Encryptor.class), + + /** + * sm4 + */ + SM4(Sm4Encryptor.class); + + private final Class clazz; +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java new file mode 100644 index 0000000..f471221 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/EncodeType.java @@ -0,0 +1,26 @@ +package org.dromara.common.encrypt.enumd; + +/** + * 编码类型 + * + * @author 老马 + * @version 4.6.0 + */ +public enum EncodeType { + + /** + * 默认使用yml配置 + */ + DEFAULT, + + /** + * base64编码 + */ + BASE64, + + /** + * 16进制编码 + */ + HEX; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java new file mode 100644 index 0000000..98f4bc7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java @@ -0,0 +1,94 @@ +package org.dromara.common.encrypt.filter; + +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.encrypt.utils.EncryptUtils; +import org.springframework.http.MediaType; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** + * 解密请求参数工具类 + * + * @author wdhcr + */ +public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper { + + private final byte[] body; + + public DecryptRequestBodyWrapper(HttpServletRequest request, String privateKey, String headerFlag) throws IOException { + super(request); + // 获取 AES 密码 采用 RSA 加密 + String headerRsa = request.getHeader(headerFlag); + String decryptAes = EncryptUtils.decryptByRsa(headerRsa, privateKey); + // 解密 AES 密码 + String aesPassword = EncryptUtils.decryptByBase64(decryptAes); + request.setCharacterEncoding(Constants.UTF8); + byte[] readBytes = IoUtil.readBytes(request.getInputStream(), false); + String requestBody = new String(readBytes, StandardCharsets.UTF_8); + // 解密 body 采用 AES 加密 + String decryptBody = EncryptUtils.decryptByAes(requestBody, aesPassword); + body = decryptBody.getBytes(StandardCharsets.UTF_8); + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + + @Override + public int getContentLength() { + return body.length; + } + + @Override + public long getContentLengthLong() { + return body.length; + } + + @Override + public String getContentType() { + return MediaType.APPLICATION_JSON_VALUE; + } + + + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() { + @Override + public int read() { + return bais.read(); + } + + @Override + public int available() { + return body.length; + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + }; + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java new file mode 100644 index 0000000..c0af232 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java @@ -0,0 +1,121 @@ +package org.dromara.common.encrypt.filter; + +import cn.hutool.core.util.RandomUtil; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; +import org.dromara.common.encrypt.utils.EncryptUtils; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * 加密响应参数包装类 + * + * @author Michelle.Chung + */ +public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { + + private final ByteArrayOutputStream byteArrayOutputStream; + private final ServletOutputStream servletOutputStream; + private final PrintWriter printWriter; + + public EncryptResponseBodyWrapper(HttpServletResponse response) throws IOException { + super(response); + this.byteArrayOutputStream = new ByteArrayOutputStream(); + this.servletOutputStream = this.getOutputStream(); + this.printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream)); + } + + @Override + public PrintWriter getWriter() { + return printWriter; + } + + @Override + public void flushBuffer() throws IOException { + if (servletOutputStream != null) { + servletOutputStream.flush(); + } + if (printWriter != null) { + printWriter.flush(); + } + } + + @Override + public void reset() { + byteArrayOutputStream.reset(); + } + + public byte[] getResponseData() throws IOException { + flushBuffer(); + return byteArrayOutputStream.toByteArray(); + } + + public String getContent() throws IOException { + flushBuffer(); + return byteArrayOutputStream.toString(); + } + + /** + * 获取加密内容 + * + * @param servletResponse response + * @param publicKey RSA公钥 (用于加密 AES 秘钥) + * @param headerFlag 请求头标志 + * @return 加密内容 + * @throws IOException + */ + public String getEncryptContent(HttpServletResponse servletResponse, String publicKey, String headerFlag) throws IOException { + // 生成秘钥 + String aesPassword = RandomUtil.randomString(32); + // 秘钥使用 Base64 编码 + String encryptAes = EncryptUtils.encryptByBase64(aesPassword); + // Rsa 公钥加密 Base64 编码 + String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey); + + // 设置响应头 + servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag); + servletResponse.setHeader(headerFlag, encryptPassword); + servletResponse.setHeader("Access-Control-Allow-Origin", "*"); + servletResponse.setHeader("Access-Control-Allow-Methods", "*"); + servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString()); + + // 获取原始内容 + String originalBody = this.getContent(); + // 对内容进行加密 + return EncryptUtils.encryptByAes(originalBody, aesPassword); + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return new ServletOutputStream() { + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + + @Override + public void write(int b) throws IOException { + byteArrayOutputStream.write(b); + } + + @Override + public void write(byte[] b) throws IOException { + byteArrayOutputStream.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + byteArrayOutputStream.write(b, off, len); + } + }; + } + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java new file mode 100644 index 0000000..460aa36 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java @@ -0,0 +1,120 @@ +package org.dromara.common.encrypt.interceptor; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.resultset.ResultSetHandler; +import org.apache.ibatis.plugin.*; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.core.EncryptorManager; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.properties.EncryptorProperties; + +import java.lang.reflect.Field; +import java.sql.Statement; +import java.util.*; + +/** + * 出参解密拦截器 + * + * @author 老马 + * @version 4.6.0 + */ +@Slf4j +@Intercepts({@Signature( + type = ResultSetHandler.class, + method = "handleResultSets", + args = {Statement.class}) +}) +@AllArgsConstructor +public class MybatisDecryptInterceptor implements Interceptor { + + private final EncryptorManager encryptorManager; + private final EncryptorProperties defaultProperties; + + @Override + public Object intercept(Invocation invocation) throws Throwable { + // 获取执行mysql执行结果 + Object result = invocation.proceed(); + if (result == null) { + return null; + } + decryptHandler(result); + return result; + } + + /** + * 解密对象 + * + * @param sourceObject 待加密对象 + */ + private void decryptHandler(Object sourceObject) { + if (ObjectUtil.isNull(sourceObject)) { + return; + } + if (sourceObject instanceof Map map) { + new HashSet<>(map.values()).forEach(this::decryptHandler); + return; + } + if (sourceObject instanceof List list) { + if(CollUtil.isEmpty(list)) { + return; + } + // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 + Object firstItem = list.get(0); + if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { + return; + } + list.forEach(this::decryptHandler); + return; + } + // 不在缓存中的类,就是没有加密注解的类(当然也有可能是typeAliasesPackage写错) + Set fields = encryptorManager.getFieldCache(sourceObject.getClass()); + if(ObjectUtil.isNull(fields)){ + return; + } + try { + for (Field field : fields) { + field.set(sourceObject, this.decryptField(Convert.toStr(field.get(sourceObject)), field)); + } + } catch (Exception e) { + log.error("处理解密字段时出错", e); + } + } + + /** + * 字段值进行加密。通过字段的批注注册新的加密算法 + * + * @param value 待加密的值 + * @param field 待加密字段 + * @return 加密后结果 + */ + private String decryptField(String value, Field field) { + if (ObjectUtil.isNull(value)) { + return null; + } + EncryptField encryptField = field.getAnnotation(EncryptField.class); + EncryptContext encryptContext = new EncryptContext(); + encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); + encryptContext.setEncode(encryptField.encode() == EncodeType.DEFAULT ? defaultProperties.getEncode() : encryptField.encode()); + encryptContext.setPassword(StringUtils.isBlank(encryptField.password()) ? defaultProperties.getPassword() : encryptField.password()); + encryptContext.setPrivateKey(StringUtils.isBlank(encryptField.privateKey()) ? defaultProperties.getPrivateKey() : encryptField.privateKey()); + encryptContext.setPublicKey(StringUtils.isBlank(encryptField.publicKey()) ? defaultProperties.getPublicKey() : encryptField.publicKey()); + return this.encryptorManager.decrypt(value, encryptContext); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java new file mode 100644 index 0000000..bcc2f4c --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java @@ -0,0 +1,124 @@ +package org.dromara.common.encrypt.interceptor; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.parameter.ParameterHandler; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Signature; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.core.EncryptContext; +import org.dromara.common.encrypt.core.EncryptorManager; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import org.dromara.common.encrypt.properties.EncryptorProperties; + +import java.lang.reflect.Field; +import java.sql.PreparedStatement; +import java.util.*; + +/** + * 入参加密拦截器 + * + * @author 老马 + * @version 4.6.0 + */ +@Slf4j +@Intercepts({@Signature( + type = ParameterHandler.class, + method = "setParameters", + args = {PreparedStatement.class}) +}) +@AllArgsConstructor +public class MybatisEncryptInterceptor implements Interceptor { + + private final EncryptorManager encryptorManager; + private final EncryptorProperties defaultProperties; + + @Override + public Object intercept(Invocation invocation) throws Throwable { + return invocation; + } + + @Override + public Object plugin(Object target) { + if (target instanceof ParameterHandler parameterHandler) { + // 进行加密操作 + Object parameterObject = parameterHandler.getParameterObject(); + if (ObjectUtil.isNotNull(parameterObject) && !(parameterObject instanceof String)) { + this.encryptHandler(parameterObject); + } + } + return target; + } + + /** + * 加密对象 + * + * @param sourceObject 待加密对象 + */ + private void encryptHandler(Object sourceObject) { + if (ObjectUtil.isNull(sourceObject)) { + return; + } + if (sourceObject instanceof Map map) { + new HashSet<>(map.values()).forEach(this::encryptHandler); + return; + } + if (sourceObject instanceof List list) { + if(CollUtil.isEmpty(list)) { + return; + } + // 判断第一个元素是否含有注解。如果没有直接返回,提高效率 + Object firstItem = list.get(0); + if (ObjectUtil.isNull(firstItem) || CollUtil.isEmpty(encryptorManager.getFieldCache(firstItem.getClass()))) { + return; + } + list.forEach(this::encryptHandler); + return; + } + // 不在缓存中的类,就是没有加密注解的类(当然也有可能是typeAliasesPackage写错) + Set fields = encryptorManager.getFieldCache(sourceObject.getClass()); + if(ObjectUtil.isNull(fields)){ + return; + } + try { + for (Field field : fields) { + field.set(sourceObject, this.encryptField(Convert.toStr(field.get(sourceObject)), field)); + } + } catch (Exception e) { + log.error("处理加密字段时出错", e); + } + } + + /** + * 字段值进行加密。通过字段的批注注册新的加密算法 + * + * @param value 待加密的值 + * @param field 待加密字段 + * @return 加密后结果 + */ + private String encryptField(String value, Field field) { + if (ObjectUtil.isNull(value)) { + return null; + } + EncryptField encryptField = field.getAnnotation(EncryptField.class); + EncryptContext encryptContext = new EncryptContext(); + encryptContext.setAlgorithm(encryptField.algorithm() == AlgorithmType.DEFAULT ? defaultProperties.getAlgorithm() : encryptField.algorithm()); + encryptContext.setEncode(encryptField.encode() == EncodeType.DEFAULT ? defaultProperties.getEncode() : encryptField.encode()); + encryptContext.setPassword(StringUtils.isBlank(encryptField.password()) ? defaultProperties.getPassword() : encryptField.password()); + encryptContext.setPrivateKey(StringUtils.isBlank(encryptField.privateKey()) ? defaultProperties.getPrivateKey() : encryptField.privateKey()); + encryptContext.setPublicKey(StringUtils.isBlank(encryptField.publicKey()) ? defaultProperties.getPublicKey() : encryptField.publicKey()); + return this.encryptorManager.encrypt(value, encryptContext); + } + + + @Override + public void setProperties(Properties properties) { + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java new file mode 100644 index 0000000..6aadb3e --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java @@ -0,0 +1,34 @@ +package org.dromara.common.encrypt.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * api解密属性配置类 + * @author wdhcr + */ +@Data +@ConfigurationProperties(prefix = "api-decrypt") +public class ApiDecryptProperties { + + /** + * 加密开关 + */ + private Boolean enabled; + + /** + * 头部标识 + */ + private String headerFlag; + + /** + * 响应加密公钥 + */ + private String publicKey; + + /** + * 请求解密私钥 + */ + private String privateKey; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java new file mode 100644 index 0000000..ba445c1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/EncryptorProperties.java @@ -0,0 +1,48 @@ +package org.dromara.common.encrypt.properties; + +import org.dromara.common.encrypt.enumd.AlgorithmType; +import org.dromara.common.encrypt.enumd.EncodeType; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 加解密属性配置类 + * + * @author 老马 + * @version 4.6.0 + */ +@Data +@ConfigurationProperties(prefix = "mybatis-encryptor") +public class EncryptorProperties { + + /** + * 过滤开关 + */ + private Boolean enable; + + /** + * 默认算法 + */ + private AlgorithmType algorithm; + + /** + * 安全秘钥 + */ + private String password; + + /** + * 公钥 + */ + private String publicKey; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 编码方式,base64/hex + */ + private EncodeType encode; + +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java new file mode 100644 index 0000000..2a096ee --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java @@ -0,0 +1,313 @@ +package org.dromara.common.encrypt.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.SmUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.crypto.asymmetric.SM2; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * 安全相关工具类 + * + * @author 老马 + */ +public class EncryptUtils { + + /** + * 公钥 + */ + public static final String PUBLIC_KEY = "publicKey"; + + /** + * 私钥 + */ + public static final String PRIVATE_KEY = "privateKey"; + + /** + * Base64加密 + * + * @param data 待加密数据 + * @return 加密后字符串 + */ + public static String encryptByBase64(String data) { + return Base64.encode(data, StandardCharsets.UTF_8); + } + + /** + * Base64解密 + * + * @param data 待解密数据 + * @return 解密后字符串 + */ + public static String decryptByBase64(String data) { + return Base64.decodeStr(data, StandardCharsets.UTF_8); + } + + /** + * AES加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptByAes(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("AES需要传入秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if (!ArrayUtil.contains(array, password.length())) { + throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); + } + return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); + } + + /** + * AES加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptByAesHex(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("AES需要传入秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if (!ArrayUtil.contains(array, password.length())) { + throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); + } + return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).encryptHex(data, StandardCharsets.UTF_8); + } + + /** + * AES解密 + * + * @param data 待解密数据 + * @param password 秘钥字符串 + * @return 解密后字符串 + */ + public static String decryptByAes(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("AES需要传入秘钥信息"); + } + // aes算法的秘钥要求是16位、24位、32位 + int[] array = {16, 24, 32}; + if (!ArrayUtil.contains(array, password.length())) { + throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位"); + } + return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); + } + + /** + * sm4加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptBySm4(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("SM4需要传入秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + int sm4PasswordLength = 16; + if (sm4PasswordLength != password.length()) { + throw new IllegalArgumentException("SM4秘钥长度要求为16位"); + } + return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptBase64(data, StandardCharsets.UTF_8); + } + + /** + * sm4加密 + * + * @param data 待加密数据 + * @param password 秘钥字符串 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptBySm4Hex(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("SM4需要传入秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + int sm4PasswordLength = 16; + if (sm4PasswordLength != password.length()) { + throw new IllegalArgumentException("SM4秘钥长度要求为16位"); + } + return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).encryptHex(data, StandardCharsets.UTF_8); + } + + /** + * sm4解密 + * + * @param data 待解密数据 + * @param password 秘钥字符串 + * @return 解密后字符串 + */ + public static String decryptBySm4(String data, String password) { + if (StrUtil.isBlank(password)) { + throw new IllegalArgumentException("SM4需要传入秘钥信息"); + } + // sm4算法的秘钥要求是16位长度 + int sm4PasswordLength = 16; + if (sm4PasswordLength != password.length()) { + throw new IllegalArgumentException("SM4秘钥长度要求为16位"); + } + return SmUtil.sm4(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8); + } + + /** + * 产生sm2加解密需要的公钥和私钥 + * + * @return 公私钥Map + */ + public static Map generateSm2Key() { + Map keyMap = new HashMap<>(2); + SM2 sm2 = SmUtil.sm2(); + keyMap.put(PRIVATE_KEY, sm2.getPrivateKeyBase64()); + keyMap.put(PUBLIC_KEY, sm2.getPublicKeyBase64()); + return keyMap; + } + + /** + * sm2公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptBySm2(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("SM2需要传入公钥进行加密"); + } + SM2 sm2 = SmUtil.sm2(null, publicKey); + return sm2.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * sm2公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptBySm2Hex(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("SM2需要传入公钥进行加密"); + } + SM2 sm2 = SmUtil.sm2(null, publicKey); + return sm2.encryptHex(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * sm2私钥解密 + * + * @param data 待解密数据 + * @param privateKey 私钥 + * @return 解密后字符串 + */ + public static String decryptBySm2(String data, String privateKey) { + if (StrUtil.isBlank(privateKey)) { + throw new IllegalArgumentException("SM2需要传入私钥进行解密"); + } + SM2 sm2 = SmUtil.sm2(privateKey, null); + return sm2.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); + } + + /** + * 产生RSA加解密需要的公钥和私钥 + * + * @return 公私钥Map + */ + public static Map generateRsaKey() { + Map keyMap = new HashMap<>(2); + RSA rsa = SecureUtil.rsa(); + keyMap.put(PRIVATE_KEY, rsa.getPrivateKeyBase64()); + keyMap.put(PUBLIC_KEY, rsa.getPublicKeyBase64()); + return keyMap; + } + + /** + * rsa公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Base64编码 + */ + public static String encryptByRsa(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("RSA需要传入公钥进行加密"); + } + RSA rsa = SecureUtil.rsa(null, publicKey); + return rsa.encryptBase64(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * rsa公钥加密 + * + * @param data 待加密数据 + * @param publicKey 公钥 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptByRsaHex(String data, String publicKey) { + if (StrUtil.isBlank(publicKey)) { + throw new IllegalArgumentException("RSA需要传入公钥进行加密"); + } + RSA rsa = SecureUtil.rsa(null, publicKey); + return rsa.encryptHex(data, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * rsa私钥解密 + * + * @param data 待解密数据 + * @param privateKey 私钥 + * @return 解密后字符串 + */ + public static String decryptByRsa(String data, String privateKey) { + if (StrUtil.isBlank(privateKey)) { + throw new IllegalArgumentException("RSA需要传入私钥进行解密"); + } + RSA rsa = SecureUtil.rsa(privateKey, null); + return rsa.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8); + } + + /** + * md5加密 + * + * @param data 待加密数据 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptByMd5(String data) { + return SecureUtil.md5(data); + } + + /** + * sha256加密 + * + * @param data 待加密数据 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptBySha256(String data) { + return SecureUtil.sha256(data); + } + + /** + * sm3加密 + * + * @param data 待加密数据 + * @return 加密后字符串, 采用Hex编码 + */ + public static String encryptBySm3(String data) { + return SmUtil.sm3(data); + } + +} diff --git a/ruoyi-common/ruoyi-common-excel/pom.xml b/ruoyi-common/ruoyi-common-excel/pom.xml new file mode 100644 index 0000000..dd4a5ee --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/pom.xml @@ -0,0 +1,30 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-excel + + + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-json + + + + com.alibaba + easyexcel + + + + diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java new file mode 100644 index 0000000..6b9211b --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/CellMerge.java @@ -0,0 +1,29 @@ +package org.dromara.common.excel.annotation; + +import org.dromara.common.excel.core.CellMergeStrategy; + +import java.lang.annotation.*; + +/** + * excel 列单元格合并(合并列相同项) + * + * 需搭配 {@link CellMergeStrategy} 策略使用 + * + * @author Lion Li + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface CellMerge { + + /** + * col index + */ + int index() default -1; + + /** + * 合并需要依赖的其他字段名称 + */ + String[] mergeBy() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java new file mode 100644 index 0000000..5c51842 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelDictFormat.java @@ -0,0 +1,32 @@ +package org.dromara.common.excel.annotation; + +import org.dromara.common.core.utils.StringUtils; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * @author Lion Li + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelDictFormat { + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + String separator() default StringUtils.SEPARATOR; + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java new file mode 100644 index 0000000..290379d --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelEnumFormat.java @@ -0,0 +1,30 @@ +package org.dromara.common.excel.annotation; + +import java.lang.annotation.*; + +/** + * 枚举格式化 + * + * @author Liang + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelEnumFormat { + + /** + * 字典枚举类型 + */ + Class> enumClass(); + + /** + * 字典枚举类中对应的code属性名称,默认为code + */ + String codeField() default "code"; + + /** + * 字典枚举类中对应的text属性名称,默认为text + */ + String textField() default "text"; + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java new file mode 100644 index 0000000..f358afc --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java @@ -0,0 +1,24 @@ +package org.dromara.common.excel.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 批注 + * @author guzhouyanyu + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelNotation { + + /** + * col index + */ + int index() default -1; + /** + * 批注内容 + */ + String value() default ""; +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java new file mode 100644 index 0000000..15784e1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java @@ -0,0 +1,26 @@ +package org.dromara.common.excel.annotation; + +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 是否必填 + * @author guzhouyanyu + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelRequired { + + /** + * col index + */ + int index() default -1; + /** + * 字体颜色 + */ + IndexedColors fontColor() default IndexedColors.RED; +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java new file mode 100644 index 0000000..61eeabf --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java @@ -0,0 +1,73 @@ +package org.dromara.common.excel.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.utils.ExcelUtil; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; + +/** + * 字典格式化转换处理 + * + * @author Lion Li + */ +@Slf4j +public class ExcelDictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String label = cellData.getStringValue(); + String value; + if (StringUtils.isBlank(type)) { + value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); + } else { + value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator()); + } + return Convert.convert(contentProperty.getField().getType(), value); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNull(object)) { + return new WriteCellData<>(""); + } + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String value = Convert.toStr(object); + String label; + if (StringUtils.isBlank(type)) { + label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); + } else { + label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator()); + } + return new WriteCellData<>(label); + } + + private ExcelDictFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java new file mode 100644 index 0000000..b948ea7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java @@ -0,0 +1,87 @@ +package org.dromara.common.excel.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.excel.annotation.ExcelEnumFormat; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * 枚举格式化转换处理 + * + * @author Liang + */ +@Slf4j +public class ExcelEnumConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + cellData.checkEmpty(); + // Excel中填入的是枚举中指定的描述 + Object textValue = switch (cellData.getType()) { + case STRING, DIRECT_STRING, RICH_TEXT_STRING -> cellData.getStringValue(); + case NUMBER -> cellData.getNumberValue(); + case BOOLEAN -> cellData.getBooleanValue(); + default -> throw new IllegalArgumentException("单元格类型异常!"); + }; + // 如果是空值 + if (ObjectUtil.isNull(textValue)) { + return null; + } + Map enumCodeToTextMap = beforeConvert(contentProperty); + // 从Java输出至Excel是code转text + // 因此从Excel转Java应该将text与code对调 + Map enumTextToCodeMap = new HashMap<>(); + enumCodeToTextMap.forEach((key, value) -> enumTextToCodeMap.put(value, key)); + // 应该从text -> code中查找 + Object codeValue = enumTextToCodeMap.get(textValue); + return Convert.convert(contentProperty.getField().getType(), codeValue); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNull(object)) { + return new WriteCellData<>(""); + } + Map enumValueMap = beforeConvert(contentProperty); + String value = Convert.toStr(enumValueMap.get(object), ""); + return new WriteCellData<>(value); + } + + private Map beforeConvert(ExcelContentProperty contentProperty) { + ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); + Map enumValueMap = new HashMap<>(); + Enum[] enumConstants = anno.enumClass().getEnumConstants(); + for (Enum enumConstant : enumConstants) { + Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); + String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); + enumValueMap.put(codeValue, textValue); + } + return enumValueMap; + } + + private ExcelEnumFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelEnumFormat.class); + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java new file mode 100644 index 0000000..7c7721c --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java @@ -0,0 +1,157 @@ +package org.dromara.common.excel.core; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.handler.WorkbookWriteHandler; +import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.excel.annotation.CellMerge; + +import java.lang.reflect.Field; +import java.util.*; + +/** + * 列值重复合并策略 + * + * @author Lion Li + */ +@Slf4j +public class CellMergeStrategy extends AbstractMergeStrategy implements WorkbookWriteHandler { + + private final List cellList; + private final boolean hasTitle; + private int rowIndex; + + public CellMergeStrategy(List list, boolean hasTitle) { + this.hasTitle = hasTitle; + // 行合并开始下标 + this.rowIndex = hasTitle ? 1 : 0; + this.cellList = handle(list, hasTitle); + } + + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { + //单元格写入了,遍历合并区域,如果该Cell在区域内,但非首行,则清空 + final int rowIndex = cell.getRowIndex(); + if (CollUtil.isNotEmpty(cellList)){ + for (CellRangeAddress cellAddresses : cellList) { + final int firstRow = cellAddresses.getFirstRow(); + if (cellAddresses.isInRange(cell) && rowIndex != firstRow){ + cell.setBlank(); + } + } + } + } + + @Override + public void afterWorkbookDispose(final WorkbookWriteHandlerContext context) { + //当前表格写完后,统一写入 + if (CollUtil.isNotEmpty(cellList)){ + for (CellRangeAddress item : cellList) { + context.getWriteContext().writeSheetHolder().getSheet().addMergedRegion(item); + } + } + } + + @SneakyThrows + private List handle(List list, boolean hasTitle) { + List cellList = new ArrayList<>(); + if (CollUtil.isEmpty(list)) { + return cellList; + } + Field[] fields = ReflectUtils.getFields(list.get(0).getClass(), field -> !"serialVersionUID".equals(field.getName())); + + // 有注解的字段 + List mergeFields = new ArrayList<>(); + List mergeFieldsIndex = new ArrayList<>(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + if (field.isAnnotationPresent(CellMerge.class)) { + CellMerge cm = field.getAnnotation(CellMerge.class); + mergeFields.add(field); + mergeFieldsIndex.add(cm.index() == -1 ? i : cm.index()); + if (hasTitle) { + ExcelProperty property = field.getAnnotation(ExcelProperty.class); + rowIndex = Math.max(rowIndex, property.value().length); + } + } + } + + Map map = new HashMap<>(); + // 生成两两合并单元格 + for (int i = 0; i < list.size(); i++) { + for (int j = 0; j < mergeFields.size(); j++) { + Field field = mergeFields.get(j); + Object val = ReflectUtils.invokeGetter(list.get(i), field.getName()); + + int colNum = mergeFieldsIndex.get(j); + if (!map.containsKey(field)) { + map.put(field, new RepeatCell(val, i)); + } else { + RepeatCell repeatCell = map.get(field); + Object cellValue = repeatCell.getValue(); + if (cellValue == null || "".equals(cellValue)) { + // 空值跳过不合并 + continue; + } + + if (!cellValue.equals(val)) { + if ((i - repeatCell.getCurrent() > 1)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + map.put(field, new RepeatCell(val, i)); + } else if (i == list.size() - 1) { + if (i > repeatCell.getCurrent() && isMerge(list, i, field)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum)); + } + } else if (!isMerge(list, i, field)) { + if ((i - repeatCell.getCurrent() > 1)) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + map.put(field, new RepeatCell(val, i)); + } + } + } + } + return cellList; + } + + private boolean isMerge(List list, int i, Field field) { + boolean isMerge = true; + CellMerge cm = field.getAnnotation(CellMerge.class); + final String[] mergeBy = cm.mergeBy(); + if (StrUtil.isAllNotBlank(mergeBy)) { + //比对当前list(i)和list(i - 1)的各个属性值一一比对 如果全为真 则为真 + for (String fieldName : mergeBy) { + final Object valCurrent = ReflectUtil.getFieldValue(list.get(i), fieldName); + final Object valPre = ReflectUtil.getFieldValue(list.get(i - 1), fieldName); + if (!Objects.equals(valPre, valCurrent)) { + //依赖字段如有任一不等值,则标记为不可合并 + isMerge = false; + } + } + } + return isMerge; + } + + @Data + @AllArgsConstructor + static class RepeatCell { + + private Object value; + + private int current; + + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java new file mode 100644 index 0000000..b6fa0b4 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java @@ -0,0 +1,104 @@ +package org.dromara.common.excel.core; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelAnalysisException; +import com.alibaba.excel.exception.ExcelDataConvertException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.Set; + +/** + * Excel 导入监听 + * + * @author Yjoioooo + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor +public class DefaultExcelListener extends AnalysisEventListener implements ExcelListener { + + /** + * 是否Validator检验,默认为是 + */ + private Boolean isValidate = Boolean.TRUE; + + /** + * excel 表头数据 + */ + private Map headMap; + + /** + * 导入回执 + */ + private ExcelResult excelResult; + + public DefaultExcelListener(boolean isValidate) { + this.excelResult = new DefaultExcelResult<>(); + this.isValidate = isValidate; + } + + /** + * 处理异常 + * + * @param exception ExcelDataConvertException + * @param context Excel 上下文 + */ + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + String errMsg = null; + if (exception instanceof ExcelDataConvertException excelDataConvertException) { + // 如果是某一个单元格的转换异常 能获取到具体行号 + Integer rowIndex = excelDataConvertException.getRowIndex(); + Integer columnIndex = excelDataConvertException.getColumnIndex(); + errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常
", + rowIndex + 1, columnIndex + 1, headMap.get(columnIndex)); + if (log.isDebugEnabled()) { + log.error(errMsg); + } + } + if (exception instanceof ConstraintViolationException constraintViolationException) { + Set> constraintViolations = constraintViolationException.getConstraintViolations(); + String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", "); + errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg); + if (log.isDebugEnabled()) { + log.error(errMsg); + } + } + excelResult.getErrorList().add(errMsg); + throw new ExcelAnalysisException(errMsg); + } + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + this.headMap = headMap; + log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); + } + + @Override + public void invoke(T data, AnalysisContext context) { + if (isValidate) { + ValidatorUtils.validate(data); + } + excelResult.getList().add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + log.debug("所有数据解析完成!"); + } + + @Override + public ExcelResult getExcelResult() { + return excelResult; + } + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java new file mode 100644 index 0000000..32fee7a --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -0,0 +1,399 @@ +package org.dromara.common.excel.core; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.metadata.FieldCache; +import com.alibaba.excel.metadata.FieldWrapper; +import com.alibaba.excel.util.ClassUtils; +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.ss.util.WorkbookUtil; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.annotation.ExcelEnumFormat; + +import java.lang.reflect.Field; +import java.util.*; + +/** + *

Excel表格下拉选操作

+ * 考虑到下拉选过多可能导致Excel打开缓慢的问题,只校验前1000行 + *

+ * 即只有前1000行的数据可以用下拉框,超出的自行通过限制数据量的形式,第二次输出 + * + * @author Emil.Zhang + */ +@Slf4j +public class ExcelDownHandler implements SheetWriteHandler { + + /** + * Excel表格中的列名英文 + * 仅为了解析列英文,禁止修改 + */ + private static final String EXCEL_COLUMN_NAME = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + /** + * 单选数据Sheet名 + */ + private static final String OPTIONS_SHEET_NAME = "options"; + /** + * 联动选择数据Sheet名的头 + */ + private static final String LINKED_OPTIONS_SHEET_NAME = "linkedOptions"; + /** + * 下拉可选项 + */ + private final List dropDownOptions; + private final DictService dictService; + /** + * 当前单选进度 + */ + private int currentOptionsColumnIndex; + /** + * 当前联动选择进度 + */ + private int currentLinkedOptionsSheetIndex; + + public ExcelDownHandler(List options) { + this.dropDownOptions = options; + this.currentOptionsColumnIndex = 0; + this.currentLinkedOptionsSheetIndex = 0; + this.dictService = SpringUtils.getBean(DictService.class); + } + + /** + *

开始创建下拉数据

+ * 1.通过解析传入的@ExcelProperty同级是否标注有@DropDown选项 + * 如果有且设置了value值,则将其直接置为下拉可选项 + *

+ * 2.或者在调用ExcelUtil时指定了可选项,将依据传入的可选项做下拉 + *

+ * 3.二者并存,注意调用方式 + */ + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + Sheet sheet = writeSheetHolder.getSheet(); + // 开始设置下拉框 HSSFWorkbook + DataValidationHelper helper = sheet.getDataValidationHelper(); + Workbook workbook = writeWorkbookHolder.getWorkbook(); + FieldCache fieldCache = ClassUtils.declaredFields(writeWorkbookHolder.getClazz(), writeWorkbookHolder); + for (Map.Entry entry : fieldCache.getSortedFieldMap().entrySet()) { + Integer index = entry.getKey(); + FieldWrapper wrapper = entry.getValue(); + Field field = wrapper.getField(); + // 循环实体中的每个属性 + // 可选的下拉值 + List options = new ArrayList<>(); + if (field.isAnnotationPresent(ExcelDictFormat.class)) { + // 如果指定了@ExcelDictFormat,则使用字典的逻辑 + ExcelDictFormat format = field.getDeclaredAnnotation(ExcelDictFormat.class); + String dictType = format.dictType(); + String converterExp = format.readConverterExp(); + if (StringUtils.isNotBlank(dictType)) { + // 如果传递了字典名,则依据字典建立下拉 + Collection values = Optional.ofNullable(dictService.getAllDictByDictType(dictType)) + .orElseThrow(() -> new ServiceException(String.format("字典 %s 不存在", dictType))) + .values(); + options = new ArrayList<>(values); + } else if (StringUtils.isNotBlank(converterExp)) { + // 如果指定了确切的值,则直接解析确切的值 + List strList = StringUtils.splitList(converterExp, format.separator()); + options = StreamUtils.toList(strList, s -> StringUtils.split(s, "=")[1]); + } + } else if (field.isAnnotationPresent(ExcelEnumFormat.class)) { + // 否则如果指定了@ExcelEnumFormat,则使用枚举的逻辑 + ExcelEnumFormat format = field.getDeclaredAnnotation(ExcelEnumFormat.class); + List values = EnumUtil.getFieldValues(format.enumClass(), format.textField()); + options = StreamUtils.toList(values, String::valueOf); + } + if (ObjectUtil.isNotEmpty(options)) { + // 仅当下拉可选项不为空时执行 + if (options.size() > 20) { + // 这里限制如果可选项大于20,则使用额外表形式 + dropDownWithSheet(helper, workbook, sheet, index, options); + } else { + // 否则使用固定值形式 + dropDownWithSimple(helper, sheet, index, options); + } + } + } + if (CollUtil.isEmpty(dropDownOptions)) { + return; + } + dropDownOptions.forEach(everyOptions -> { + // 如果传递了下拉框选择器参数 + if (!everyOptions.getNextOptions().isEmpty()) { + // 当二级选项不为空时,使用额外关联表的形式 + dropDownLinkedOptions(helper, workbook, sheet, everyOptions); + } else if (everyOptions.getOptions().size() > 10) { + // 当一级选项参数个数大于10,使用额外表的形式 + dropDownWithSheet(helper, workbook, sheet, everyOptions.getIndex(), everyOptions.getOptions()); + } else { + // 否则使用默认形式 + dropDownWithSimple(helper, sheet, everyOptions.getIndex(), everyOptions.getOptions()); + } + }); + } + + /** + *

简单下拉框

+ * 直接将可选项拼接为指定列的数据校验值 + * + * @param celIndex 列index + * @param value 下拉选可选值 + */ + private void dropDownWithSimple(DataValidationHelper helper, Sheet sheet, Integer celIndex, List value) { + if (ObjectUtil.isEmpty(value)) { + return; + } + this.markOptionsToSheet(helper, sheet, celIndex, helper.createExplicitListConstraint(ArrayUtil.toArray(value, String.class))); + } + + /** + *

额外表格形式的级联下拉框

+ * + * @param options 额外表格形式存储的下拉可选项 + */ + private void dropDownLinkedOptions(DataValidationHelper helper, Workbook workbook, Sheet sheet, DropDownOptions options) { + String linkedOptionsSheetName = String.format("%s_%d", LINKED_OPTIONS_SHEET_NAME, currentLinkedOptionsSheetIndex); + // 创建联动下拉数据表 + Sheet linkedOptionsDataSheet = workbook.createSheet(WorkbookUtil.createSafeSheetName(linkedOptionsSheetName)); + // 将下拉表隐藏 + workbook.setSheetHidden(workbook.getSheetIndex(linkedOptionsDataSheet), true); + // 选项数据 + List firstOptions = options.getOptions(); + Map> secoundOptionsMap = options.getNextOptions(); + + // 采用按行填充数据的方式,避免EasyExcel出现数据无法写入的问题 + // Attempting to write a row in the range that is already written to disk + + // 使用ArrayList记载数据,防止乱序 + List columnNames = new ArrayList<>(); + // 写入第一行,即第一级的数据 + Row firstRow = linkedOptionsDataSheet.createRow(0); + for (int columnIndex = 0; columnIndex < firstOptions.size(); columnIndex++) { + String columnName = firstOptions.get(columnIndex); + firstRow.createCell(columnIndex) + .setCellValue(columnName); + columnNames.add(columnName); + } + + // 创建名称管理器 + Name name = workbook.createName(); + // 设置名称管理器的别名 + name.setNameName(linkedOptionsSheetName); + // 以横向第一行创建一级下拉拼接引用位置 + String firstOptionsFunction = String.format("%s!$%s$1:$%s$1", + linkedOptionsSheetName, + getExcelColumnName(0), + getExcelColumnName(firstOptions.size()) + ); + // 设置名称管理器的引用位置 + name.setRefersToFormula(firstOptionsFunction); + // 设置数据校验为序列模式,引用的是名称管理器中的别名 + this.markOptionsToSheet(helper, sheet, options.getIndex(), helper.createFormulaListConstraint(linkedOptionsSheetName)); + + // 创建二级选项的名称管理器 + for (int columIndex = 0; columIndex < columnNames.size(); columIndex++) { + // 列名 + String firstOptionsColumnName = getExcelColumnName(columIndex); + // 对应的一级值 + String thisFirstOptionsValue = columnNames.get(columIndex); + + // 以该一级选项值创建子名称管理器 + Name sonName = workbook.createName(); + // 设置名称管理器的别名 + sonName.setNameName(thisFirstOptionsValue); + // 以第二行该列数据拼接引用位置 + String sonFunction = String.format("%s!$%s$2:$%s$%d", + linkedOptionsSheetName, + firstOptionsColumnName, + firstOptionsColumnName, + // 二级选项存在则设置为(选项个数+1)行,否则设置为2行 + Math.max(Optional.ofNullable(secoundOptionsMap.get(thisFirstOptionsValue)) + .orElseGet(ArrayList::new).size(), 1) + 1 + ); + // 设置名称管理器的引用位置 + sonName.setRefersToFormula(sonFunction); + // 数据验证为序列模式,引用到每一个主表中的二级选项位置 + // 创建子项的名称管理器,只是为了使得Excel可以识别到数据 + String mainSheetFirstOptionsColumnName = getExcelColumnName(options.getIndex()); + for (int i = 0; i < 100; i++) { + // 以一级选项对应的主体所在位置创建二级下拉 + String secondOptionsFunction = String.format("=INDIRECT(%s%d)", mainSheetFirstOptionsColumnName, i + 1); + // 二级只能主表每一行的每一列添加二级校验 + markLinkedOptionsToSheet(helper, sheet, i, options.getNextIndex(), helper.createFormulaListConstraint(secondOptionsFunction)); + } + } + + // 将二级数据处理为按行区分 + Map> columnValueMap = new HashMap<>(); + int currentRow = 1; + while (currentRow >= 0) { + boolean flag = false; + List rowData = new ArrayList<>(); + for (String columnName : columnNames) { + List data = secoundOptionsMap.get(columnName); + if (CollUtil.isEmpty(data)) { + // 添加空字符串填充位置 + rowData.add(" "); + continue; + } + // 取第一个 + String str = data.get(0); + rowData.add(str); + // 通过移除的方式避免重复 + data.remove(0); + // 设置可以继续 + flag = true; + } + columnValueMap.put(currentRow, rowData); + // 可以继续,则增加行数,否则置为负数跳出循环 + if (flag) { + currentRow++; + } else { + currentRow = -1; + } + } + + // 填充第二级选项数据 + columnValueMap.forEach((rowIndex, rowValues) -> { + Row row = linkedOptionsDataSheet.createRow(rowIndex); + for (int columnIndex = 0; columnIndex < rowValues.size(); columnIndex++) { + String rowValue = rowValues.get(columnIndex); + // 填充位置的部分不渲染 + if (StrUtil.isNotBlank(rowValue)) { + row.createCell(columnIndex) + .setCellValue(rowValue); + } + } + }); + + currentLinkedOptionsSheetIndex++; + } + + /** + *

额外表格形式的普通下拉框

+ * 由于下拉框可选值数量过多,为提升Excel打开效率,使用额外表格形式做下拉 + * + * @param celIndex 下拉选 + * @param value 下拉选可选值 + */ + private void dropDownWithSheet(DataValidationHelper helper, Workbook workbook, Sheet sheet, Integer celIndex, List value) { + // 创建下拉数据表 + Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))) + .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))); + // 将下拉表隐藏 + workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true); + // 完善纵向的一级选项数据表 + for (int i = 0; i < value.size(); i++) { + int finalI = i; + // 获取每一选项行,如果没有则创建 + Row row = Optional.ofNullable(simpleDataSheet.getRow(i)) + .orElseGet(() -> simpleDataSheet.createRow(finalI)); + // 获取本级选项对应的选项列,如果没有则创建 + Cell cell = Optional.ofNullable(row.getCell(currentOptionsColumnIndex)) + .orElseGet(() -> row.createCell(currentOptionsColumnIndex)); + // 设置值 + cell.setCellValue(value.get(i)); + } + + // 创建名称管理器 + Name name = workbook.createName(); + // 设置名称管理器的别名 + String nameName = String.format("%s_%d", OPTIONS_SHEET_NAME, celIndex); + name.setNameName(nameName); + // 以纵向第一列创建一级下拉拼接引用位置 + String function = String.format("%s!$%s$1:$%s$%d", + OPTIONS_SHEET_NAME, + getExcelColumnName(currentOptionsColumnIndex), + getExcelColumnName(currentOptionsColumnIndex), + value.size()); + // 设置名称管理器的引用位置 + name.setRefersToFormula(function); + // 设置数据校验为序列模式,引用的是名称管理器中的别名 + this.markOptionsToSheet(helper, sheet, celIndex, helper.createFormulaListConstraint(nameName)); + currentOptionsColumnIndex++; + } + + /** + * 挂载下拉的列,仅限一级选项 + */ + private void markOptionsToSheet(DataValidationHelper helper, Sheet sheet, Integer celIndex, + DataValidationConstraint constraint) { + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, celIndex, celIndex); + markDataValidationToSheet(helper, sheet, constraint, addressList); + } + + /** + * 挂载下拉的列,仅限二级选项 + */ + private void markLinkedOptionsToSheet(DataValidationHelper helper, Sheet sheet, Integer rowIndex, + Integer celIndex, DataValidationConstraint constraint) { + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList addressList = new CellRangeAddressList(rowIndex, rowIndex, celIndex, celIndex); + markDataValidationToSheet(helper, sheet, constraint, addressList); + } + + /** + * 应用数据校验 + */ + private void markDataValidationToSheet(DataValidationHelper helper, Sheet sheet, + DataValidationConstraint constraint, CellRangeAddressList addressList) { + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, addressList); + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + //数据校验 + dataValidation.setSuppressDropDownArrow(true); + //错误提示 + dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP); + dataValidation.createErrorBox("提示", "此值与单元格定义数据不一致"); + dataValidation.setShowErrorBox(true); + //选定提示 + dataValidation.createPromptBox("填写说明:", "填写内容只能为下拉中数据,其他数据将导致导入失败"); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + *

依据列index获取列名英文

+ * 依据列index转换为Excel中的列名英文 + *

例如第1列,index为0,解析出来为A列

+ * 第27列,index为26,解析为AA列 + *

第28列,index为27,解析为AB列

+ * + * @param columnIndex 列index + * @return 列index所在得英文名 + */ + private String getExcelColumnName(int columnIndex) { + // 26一循环的次数 + int columnCircleCount = columnIndex / 26; + // 26一循环内的位置 + int thisCircleColumnIndex = columnIndex % 26; + // 26一循环的次数大于0,则视为栏名至少两位 + String columnPrefix = columnCircleCount == 0 + ? StrUtil.EMPTY + : StrUtil.subWithLength(EXCEL_COLUMN_NAME, columnCircleCount - 1, 1); + // 从26一循环内取对应的栏位名 + String columnNext = StrUtil.subWithLength(EXCEL_COLUMN_NAME, thisCircleColumnIndex, 1); + // 将二者拼接即为最终的栏位名 + return columnPrefix + columnNext; + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java new file mode 100644 index 0000000..2d0340f --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java @@ -0,0 +1,14 @@ +package org.dromara.common.excel.core; + +import com.alibaba.excel.read.listener.ReadListener; + +/** + * Excel 导入监听 + * + * @author Lion Li + */ +public interface ExcelListener extends ReadListener { + + ExcelResult getExcelResult(); + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java new file mode 100644 index 0000000..0c2a418 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelResult.java @@ -0,0 +1,26 @@ +package org.dromara.common.excel.core; + +import java.util.List; + +/** + * excel返回对象 + * + * @author Lion Li + */ +public interface ExcelResult { + + /** + * 对象列表 + */ + List getList(); + + /** + * 错误列表 + */ + List getErrorList(); + + /** + * 导入回执 + */ + String getAnalysis(); +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java new file mode 100644 index 0000000..a2aa495 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java @@ -0,0 +1,135 @@ +package org.dromara.common.excel.handler; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.metadata.data.DataFormatData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.util.StyleUtil; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.excel.annotation.ExcelNotation; +import org.dromara.common.excel.annotation.ExcelRequired; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * 批注、必填 + * + * @author guzhouyanyu + */ +public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { + + /** + * 批注 + */ + private final Map notationMap; + + /** + * 头列字体颜色 + */ + private final Map headColumnMap; + + + public DataWriteHandler(Class clazz) { + notationMap = getNotationMap(clazz); + headColumnMap = getRequiredMap(clazz); + } + + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + if (CollUtil.isEmpty(notationMap) && CollUtil.isEmpty(headColumnMap)) { + return; + } + WriteCellData cellData = context.getFirstCellData(); + WriteCellStyle writeCellStyle = cellData.getOrCreateStyle(); + + DataFormatData dataFormatData = new DataFormatData(); + // 单元格设置为文本格式 + dataFormatData.setIndex((short) 49); + writeCellStyle.setDataFormatData(dataFormatData); + + if (context.getHead()) { + Cell cell = context.getCell(); + WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); + Sheet sheet = writeSheetHolder.getSheet(); + Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); + Drawing drawing = sheet.createDrawingPatriarch(); + // 设置标题字体样式 + WriteFont headWriteFont = new WriteFont(); + // 加粗 + headWriteFont.setBold(true); + if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getColumnIndex())) { + // 设置字体颜色 + headWriteFont.setColor(headColumnMap.get(cell.getColumnIndex())); + } + writeCellStyle.setWriteFont(headWriteFont); + CellStyle cellStyle = StyleUtil.buildCellStyle(workbook, null, writeCellStyle); + cell.setCellStyle(cellStyle); + + if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getColumnIndex())) { + // 批注内容 + String notationContext = notationMap.get(cell.getColumnIndex()); + // 创建绘图对象 + Comment comment = drawing.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) 5, 5)); + comment.setString(new XSSFRichTextString(notationContext)); + cell.setCellComment(comment); + } + } + } + + /** + * 获取必填列 + */ + private static Map getRequiredMap(Class clazz) { + Map requiredMap = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + // 检查 fields 数组是否为空 + if (fields.length == 0) { + return requiredMap; + } + Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); + + for (int i = 0; i < filteredFields.length; i++) { + Field field = filteredFields[i]; + if (!field.isAnnotationPresent(ExcelRequired.class)) { + continue; + } + ExcelRequired excelRequired = field.getAnnotation(ExcelRequired.class); + int columnIndex = excelRequired.index() == -1 ? i : excelRequired.index(); + requiredMap.put(columnIndex, excelRequired.fontColor().getIndex()); + } + return requiredMap; + } + + /** + * 获取批注 + */ + private static Map getNotationMap(Class clazz) { + Map notationMap = new HashMap<>(); + Field[] fields = clazz.getDeclaredFields(); + // 检查 fields 数组是否为空 + if (fields.length == 0) { + return notationMap; + } + Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); + for (int i = 0; i < filteredFields.length; i++) { + Field field = filteredFields[i]; + if (!field.isAnnotationPresent(ExcelNotation.class)) { + continue; + } + ExcelNotation excelNotation = field.getAnnotation(ExcelNotation.class); + int columnIndex = excelNotation.index() == -1 ? i : excelNotation.index(); + notationMap.put(columnIndex, excelNotation.value()); + } + return notationMap; + } +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java new file mode 100644 index 0000000..e6f9f82 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -0,0 +1,453 @@ +package org.dromara.common.excel.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.util.IdUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.excel.write.metadata.fill.FillWrapper; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.excel.convert.ExcelBigNumberConvert; +import org.dromara.common.excel.core.*; +import org.dromara.common.excel.handler.DataWriteHandler; +import org.dromara.zhishu.annotation.EnableExcelComment; +import org.dromara.zhishu.handler.EmptyListTipHandler; +import org.dromara.zhishu.handler.HeadCommentWriteHandler; +import org.dromara.zhishu.handler.TipRowWriteHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * Excel相关处理 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ExcelUtil { + + /** + * 同步导入(适用于小数据量) + * + * @param is 输入流 + * @return 转换后集合 + */ + public static List importExcel(InputStream is, Class clazz) { + return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); + } + + + /** + * 使用校验监听器 异步导入 同步返回 + * + * @param is 输入流 + * @param clazz 对象类型 + * @param isValidate 是否 Validator 检验 默认为是 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, boolean isValidate) { + DefaultExcelListener listener = new DefaultExcelListener<>(isValidate); + EasyExcel.read(is, clazz, listener).headRowNumber(1).sheet().doRead(); + return listener.getExcelResult(); + } + + /** + * 使用自定义监听器 异步导入 自定义返回 + * + * @param is 输入流 + * @param clazz 对象类型 + * @param listener 自定义监听器 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, ExcelListener listener) { + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param response 响应体 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, false, os, null); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param response 响应体 + * @param options 级联下拉选 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response, List options) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, false, os, options); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param response 响应体 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, merge, os, null); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param response 响应体 + * @param options 级联下拉选 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response, List options) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, merge, os, options); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param os 输出流 + */ + public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os) { + exportExcel(list, sheetName, clazz, false, os, null); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param os 输出流 + * @param options 级联下拉选内容 + */ + public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os, List options) { + exportExcel(list, sheetName, clazz, false, os, options); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param os 输出流 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, + OutputStream os, List options) { + ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) + .autoCloseStream(false) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .registerConverter(new ExcelBigNumberConvert()) + .registerWriteHandler(new DataWriteHandler(clazz)) + .sheet(sheetName); + + if (clazz.isAnnotationPresent(EnableExcelComment.class)) { + builder.registerWriteHandler(new HeadCommentWriteHandler()); + // 根据 list 是否为空,注册不同的处理器 + if (list == null || list.isEmpty()) { + // 空LIST:使用 EmptyListTipHandler + builder.registerWriteHandler(new EmptyListTipHandler()); + } else { + // 有数据:使用 TipRowWriteHandler + builder.registerWriteHandler(new TipRowWriteHandler()); + } + } + if (merge) { + builder.registerWriteHandler(new CellMergeStrategy(list, true)); + } + + builder.registerWriteHandler(new ExcelDownHandler(options)); + builder.doWrite(list); + } + + /** + * 单表多数据模板导出 模板格式为 {.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplate(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 单表多数据模板导出 模板格式为 {.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplate(List data, String templatePath, OutputStream os) { + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .registerWriteHandler(new DataWriteHandler(data.get(0).getClass())) + .build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + // 单表多数据导出 模板格式为 {.属性} + for (T d : data) { + excelWriter.fill(d, writeSheet); + } + excelWriter.finish(); + } + + /** + * 多表多数据模板导出 模板格式为 {key.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplateMultiList(Map data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiList(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 多sheet模板导出 模板格式为 {key.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiSheet(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 多表多数据模板导出 模板格式为 {key.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + for (Map.Entry map : data.entrySet()) { + // 设置列表后续还有数据 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 多表导出必须使用 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + excelWriter.finish(); + } + + /** + * 多sheet模板导出 模板格式为 {key.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + for (int i = 0; i < data.size(); i++) { + WriteSheet writeSheet = EasyExcel.writerSheet(i).build(); + for (Map.Entry map : data.get(i).entrySet()) { + // 设置列表后续还有数据 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 多表导出必须使用 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + } + excelWriter.finish(); + } + + /** + * 重置响应体 + */ + private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { + String filename = encodingFilename(sheetName); + FileUtils.setAttachmentResponseHeader(response, filename); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(StringUtils.SEPARATOR); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(StringUtils.SEPARATOR); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 编码文件名 + */ + public static String encodingFilename(String filename) { + return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; + } + +} diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/annotation/EnableExcelComment.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/annotation/EnableExcelComment.java new file mode 100644 index 0000000..ca14dcc --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/annotation/EnableExcelComment.java @@ -0,0 +1,9 @@ +package org.dromara.zhishu.annotation; + +import java.lang.annotation.*; + +// 创建标记注解 +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface EnableExcelComment { +} \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/EmptyListTipHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/EmptyListTipHandler.java new file mode 100644 index 0000000..a314bf3 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/EmptyListTipHandler.java @@ -0,0 +1,74 @@ +package org.dromara.zhishu.handler; + +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.handler.context.SheetWriteHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; + +@Slf4j +public class EmptyListTipHandler implements SheetWriteHandler { + + private final java.util.Map tipMap = new java.util.HashMap<>(); + private CellStyle cachedTipStyle; + private boolean executed = false; + + public EmptyListTipHandler() { + tipMap.put(5, "表头文字不要有任何改动。"); // 第6行 + tipMap.put(7, "发布商品任务ISBN、价格、库存列必须有且必填。"); // 第8行 + tipMap.put(8, "修改价格、库存、上下架状态任务 ISBN、商品ID、商品编码必填其中一个"); // 第9行 + tipMap.put(10, "用鼠标指向每列的标题都有详细的说明。"); // 第11行 + } + + @Override + public void afterSheetCreate(SheetWriteHandlerContext context) { + if (executed) { + return; + } + + Sheet sheet = context.getWriteSheetHolder().getSheet(); + + // 检查是否有数据行(除了表头之外的行) + // 在 Sheet 刚创建时,还没有数据,所以这个方法会在数据写入之前执行 + // 我们需要判断是否为空 LIST,这个判断在调用方做 + + // 设置L列宽度 + sheet.setColumnWidth(11, 80 * 256); + + // 创建提示行 + Workbook workbook = sheet.getWorkbook(); + CellStyle tipStyle = getOrCreateTipStyle(workbook); + + for (java.util.Map.Entry entry : tipMap.entrySet()) { + int rowIndex = entry.getKey(); + Row row = sheet.getRow(rowIndex); + if (row == null) { + row = sheet.createRow(rowIndex); + } + Cell cell = row.getCell(11); + if (cell == null) { + cell = row.createCell(11); + } + cell.setCellValue(entry.getValue()); + cell.setCellStyle(tipStyle); + } + + executed = true; + log.info("空LIST场景:已在L6、L8、L9、L11添加提示文字"); + } + + private CellStyle getOrCreateTipStyle(Workbook workbook) { + if (cachedTipStyle == null) { + Font font = workbook.createFont(); + font.setBold(true); + font.setFontHeightInPoints((short) 12); + font.setColor(IndexedColors.RED.getIndex()); + + cachedTipStyle = workbook.createCellStyle(); + cachedTipStyle.setFont(font); + cachedTipStyle.setWrapText(true); + cachedTipStyle.setAlignment(HorizontalAlignment.LEFT); + cachedTipStyle.setVerticalAlignment(VerticalAlignment.CENTER); + } + return cachedTipStyle; + } +} \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/TipRowWriteHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/TipRowWriteHandler.java new file mode 100644 index 0000000..423b986 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/zhishu/handler/TipRowWriteHandler.java @@ -0,0 +1,110 @@ +package org.dromara.zhishu.handler; + +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; + +@Slf4j +public class TipRowWriteHandler implements RowWriteHandler { + + private final java.util.Map tipMap = new java.util.HashMap<>(); + private CellStyle cachedTipStyle; + private boolean columnWidthSet = false; + private boolean hasData = false; // 标记是否有数据 + + public TipRowWriteHandler() { + tipMap.put(5, "表头文字不要有任何改动。"); // 第6行 + tipMap.put(7, "发布商品任务ISBN、价格、库存列必须有且必填。"); // 第8行 + tipMap.put(8, "修改价格、库存、上下架状态任务 ISBN、商品ID、商品编码必填其中一个"); // 第9行 + tipMap.put(10, "用鼠标指向每列的标题都有详细的说明。"); // 第11行 + } + + @Override + public void beforeRowCreate(RowWriteHandlerContext context) { + // 设置L列宽度(只一次) + if (!columnWidthSet && context.getRowIndex() == 0) { + Sheet sheet = context.getWriteSheetHolder().getSheet(); + sheet.setColumnWidth(11, 80 * 256); + columnWidthSet = true; + log.info("已设置L列宽度为80个字符"); + } + } + + @Override + public void afterRowDispose(RowWriteHandlerContext context) { + int rowIndex = context.getRowIndex(); + + // 检查是否有数据(除了表头之外的行) + if (rowIndex > 0) { + hasData = true; + } + + // 检查当前行是否是需要写入提示的行 + if (tipMap.containsKey(rowIndex)) { + Sheet sheet = context.getWriteSheetHolder().getSheet(); + Workbook workbook = sheet.getWorkbook(); + + Row row = sheet.getRow(rowIndex); + if (row == null) { + row = sheet.createRow(rowIndex); + } + + Cell cell = row.getCell(11); + if (cell == null) { + cell = row.createCell(11); + } + + cell.setCellValue(tipMap.get(rowIndex)); + cell.setCellStyle(getOrCreateTipStyle(workbook)); + + log.debug("已在L{}单元格添加提示文字", rowIndex + 1); + } + + // 判断是否是最后一行(空LIST时,只有rowIndex=0,不会进入这里) + // 如果有数据,走上面的逻辑;如果空LIST,不会进入afterRowDispose + } + + /** + * 供外部调用的方法:空LIST时手动触发提示写入 + */ + public void addTipsForEmptyList(Sheet sheet) { + if (sheet == null) { + return; + } + Workbook workbook = sheet.getWorkbook(); + CellStyle tipStyle = getOrCreateTipStyle(workbook); + + for (java.util.Map.Entry entry : tipMap.entrySet()) { + int rowIndex = entry.getKey(); + Row row = sheet.getRow(rowIndex); + if (row == null) { + row = sheet.createRow(rowIndex); + } + Cell cell = row.getCell(11); + if (cell == null) { + cell = row.createCell(11); + } + cell.setCellValue(entry.getValue()); + cell.setCellStyle(tipStyle); + } + + log.info("空LIST场景:已在L6、L8、L9、L11添加提示文字"); + } + + private CellStyle getOrCreateTipStyle(Workbook workbook) { + if (cachedTipStyle == null) { + Font font = workbook.createFont(); + font.setBold(true); + font.setFontHeightInPoints((short) 12); + font.setColor(IndexedColors.RED.getIndex()); + + cachedTipStyle = workbook.createCellStyle(); + cachedTipStyle.setFont(font); + cachedTipStyle.setWrapText(true); + cachedTipStyle.setAlignment(HorizontalAlignment.LEFT); + cachedTipStyle.setVerticalAlignment(VerticalAlignment.CENTER); + } + return cachedTipStyle; + } +} \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-idempotent/pom.xml b/ruoyi-common/ruoyi-common-idempotent/pom.xml new file mode 100644 index 0000000..64418b4 --- /dev/null +++ b/ruoyi-common/ruoyi-common-idempotent/pom.xml @@ -0,0 +1,41 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-idempotent + + + ruoyi-common-idempotent 幂等功能 + + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-redis + + + + cn.hutool + hutool-crypto + + + + cn.dev33 + sa-token-core + + + + + diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java new file mode 100644 index 0000000..42ae802 --- /dev/null +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/annotation/RepeatSubmit.java @@ -0,0 +1,29 @@ +package org.dromara.common.idempotent.annotation; + +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + +/** + * 自定义注解防止表单重复提交 + * + * @author Lion Li + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit { + + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + int interval() default 5000; + + TimeUnit timeUnit() default TimeUnit.MILLISECONDS; + + /** + * 提示消息 支持国际化 格式为 {code} + */ + String message() default "{repeat.submit.message}"; + +} diff --git a/ruoyi-common/ruoyi-common-job/pom.xml b/ruoyi-common/ruoyi-common-job/pom.xml new file mode 100644 index 0000000..3a4a0cb --- /dev/null +++ b/ruoyi-common/ruoyi-common-job/pom.xml @@ -0,0 +1,46 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-job + + + ruoyi-common-job 定时任务 + + + + + + org.springframework.boot + spring-boot-autoconfigure + + + + + com.aizuda + snail-job-client-starter + + + com.aizuda + snail-job-client-job-core + + + + org.projectlombok + lombok + + + + org.dromara + ruoyi-common-core + + + + diff --git a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..3aa1881 --- /dev/null +++ b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.job.config.SnailJobConfig diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java new file mode 100644 index 0000000..8752353 --- /dev/null +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/BigNumberSerializer.java @@ -0,0 +1,42 @@ +package org.dromara.common.json.handler; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import com.fasterxml.jackson.databind.ser.std.NumberSerializer; + +import java.io.IOException; + +/** + * 超出 JS 最大最小值 处理 + * + * @author Lion Li + */ +@JacksonStdImpl +public class BigNumberSerializer extends NumberSerializer { + + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + + public BigNumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化为字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } +} diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java new file mode 100644 index 0000000..65c2faa --- /dev/null +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java @@ -0,0 +1,170 @@ +package org.dromara.common.json.utils; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.MismatchedInputException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author 芋道源码 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class JsonUtils { + + private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } + + /** + * 将对象转换为JSON格式的字符串 + * + * @param object 要转换的对象 + * @return JSON格式的字符串,如果对象为null,则返回null + * @throws RuntimeException 如果转换过程中发生JSON处理异常,则抛出运行时异常 + */ + public static String toJsonString(Object object) { + if (ObjectUtil.isNull(object)) { + return null; + } + try { + return OBJECT_MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为指定类型的对象 + * + * @param text JSON格式的字符串 + * @param clazz 要转换的目标对象类型 + * @param 目标对象的泛型类型 + * @return 转换后的对象,如果字符串为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static T parseObject(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将字节数组转换为指定类型的对象 + * + * @param bytes 字节数组 + * @param clazz 要转换的目标对象类型 + * @param 目标对象的泛型类型 + * @return 转换后的对象,如果字节数组为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(bytes, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为指定类型的对象,支持复杂类型 + * + * @param text JSON格式的字符串 + * @param typeReference 指定类型的TypeReference对象 + * @param 目标对象的泛型类型 + * @return 转换后的对象,如果字符串为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static T parseObject(String text, TypeReference typeReference) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, typeReference); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为Dict对象 + * + * @param text JSON格式的字符串 + * @return 转换后的Dict对象,如果字符串为空或者不是JSON格式则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static Dict parseMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); + } catch (MismatchedInputException e) { + // 类型不匹配说明不是json + return null; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为Dict对象的列表 + * + * @param text JSON格式的字符串 + * @return 转换后的Dict对象的列表,如果字符串为空则返回null + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static List parseArrayMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将JSON格式的字符串转换为指定类型对象的列表 + * + * @param text JSON格式的字符串 + * @param clazz 要转换的目标对象类型 + * @param 目标对象的泛型类型 + * @return 转换后的对象的列表,如果字符串为空则返回空列表 + * @throws RuntimeException 如果转换过程中发生IO异常,则抛出运行时异常 + */ + public static List parseArray(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-log/pom.xml b/ruoyi-common/ruoyi-common-log/pom.xml new file mode 100644 index 0000000..1e2b33b --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/pom.xml @@ -0,0 +1,32 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-log + + + ruoyi-common-log 日志记录 + + + + + + org.dromara + ruoyi-common-satoken + + + + org.dromara + ruoyi-common-json + + + + + diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java new file mode 100644 index 0000000..2dced97 --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/annotation/Log.java @@ -0,0 +1,48 @@ +package org.dromara.common.log.annotation; + +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; + +import java.lang.annotation.*; + +/** + * 自定义操作日志记录注解 + * + * @author ruoyi + */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log { + /** + * 模块 + */ + String title() default ""; + + /** + * 功能 + */ + BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + boolean isSaveResponseData() default true; + + + /** + * 排除指定的请求参数 + */ + String[] excludeParamNames() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java new file mode 100644 index 0000000..8ab2719 --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -0,0 +1,219 @@ +package org.dromara.common.log.aspect; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.StopWatch; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessStatus; +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.http.HttpMethod; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; +import java.util.Map; +import java.util.StringJoiner; + +/** + * 操作日志记录处理 + * + * @author Lion Li + */ +@Slf4j +@Aspect +@AutoConfiguration +public class LogAspect { + + /** + * 排除敏感属性字段 + */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + + /** + * 计时 key + */ + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(controllerLog)") + public void doBefore(JoinPoint joinPoint, Log controllerLog) { + StopWatch stopWatch = new StopWatch(); + KEY_CACHE.set(stopWatch); + stopWatch.start(); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { + try { + + // *========数据库日志=========*// + OperLogEvent operLog = new OperLogEvent(); + operLog.setTenantId(LoginHelper.getTenantId()); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = ServletUtils.getClientIP(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + LoginUser loginUser = LoginHelper.getLoginUser(); + operLog.setOperName(loginUser.getUsername()); + operLog.setDeptName(loginUser.getDeptName()); + + if (e != null) { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 3800)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 设置消耗时间 + StopWatch stopWatch = KEY_CACHE.get(); + stopWatch.stop(); + operLog.setCostTime(stopWatch.getDuration().toMillis()); + // 发布事件保存数据库 + SpringUtils.context().publishEvent(operLog); + } catch (Exception exp) { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + } finally { + KEY_CACHE.remove(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogEvent operLog, Object jsonResult) throws Exception { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog, log.excludeParamNames()); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && ObjectUtil.isNotNull(jsonResult)) { + operLog.setJsonResult(StringUtils.substring(JsonUtils.toJsonString(jsonResult), 0, 3800)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, OperLogEvent operLog, String[] excludeParamNames) throws Exception { + Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); + String requestMethod = operLog.getRequestMethod(); + if (MapUtil.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name())) { + String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + operLog.setOperParam(StringUtils.substring(params, 0, 3800)); + } else { + MapUtil.removeAny(paramsMap, EXCLUDE_PROPERTIES); + MapUtil.removeAny(paramsMap, excludeParamNames); + operLog.setOperParam(StringUtils.substring(JsonUtils.toJsonString(paramsMap), 0, 3800)); + } + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) { + StringJoiner params = new StringJoiner(" "); + if (ArrayUtil.isEmpty(paramsArray)) { + return params.toString(); + } + for (Object o : paramsArray) { + if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { + String str = JsonUtils.toJsonString(o); + Dict dict = JsonUtils.parseMap(str); + if (MapUtil.isNotEmpty(dict)) { + MapUtil.removeAny(dict, EXCLUDE_PROPERTIES); + MapUtil.removeAny(dict, excludeParamNames); + str = JsonUtils.toJsonString(dict); + } + params.add(str); + } + } + return params.toString(); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) { + Class clazz = o.getClass(); + if (clazz.isArray()) { + return MultipartFile.class.isAssignableFrom(clazz.getComponentType()); + } else if (Collection.class.isAssignableFrom(clazz)) { + Collection collection = (Collection) o; + for (Object value : collection) { + return value instanceof MultipartFile; + } + } else if (Map.class.isAssignableFrom(clazz)) { + Map map = (Map) o; + for (Object value : map.values()) { + return value instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java new file mode 100644 index 0000000..de9328b --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/enums/OperatorType.java @@ -0,0 +1,23 @@ +package org.dromara.common.log.enums; + +/** + * 操作人类别 + * + * @author ruoyi + */ +public enum OperatorType { + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java new file mode 100644 index 0000000..938eaad --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java @@ -0,0 +1,52 @@ +package org.dromara.common.log.event; + +import lombok.Data; + +import jakarta.servlet.http.HttpServletRequest; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 登录事件 + * + * @author Lion Li + */ + +@Data +public class LogininforEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户账号 + */ + private String username; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 提示消息 + */ + private String message; + + /** + * 请求体 + */ + private HttpServletRequest request; + + /** + * 其他参数 + */ + private Object[] args; + +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java new file mode 100644 index 0000000..0386192 --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java @@ -0,0 +1,115 @@ +package org.dromara.common.log.event; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志事件 + * + * @author Lion Li + */ + +@Data +public class OperLogEvent implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; +} diff --git a/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..6893020 --- /dev/null +++ b/ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.log.aspect.LogAspect diff --git a/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java new file mode 100644 index 0000000..0ea3007 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mail/src/main/java/org/dromara/common/mail/config/MailConfig.java @@ -0,0 +1,37 @@ +package org.dromara.common.mail.config; + +import cn.hutool.extra.mail.MailAccount; +import org.dromara.common.mail.config.properties.MailProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * JavaMail 配置 + * + * @author Michelle.Chung + */ +@AutoConfiguration +@EnableConfigurationProperties(MailProperties.class) +public class MailConfig { + + @Bean + @ConditionalOnProperty(value = "mail.enabled", havingValue = "true") + public MailAccount mailAccount(MailProperties mailProperties) { + MailAccount account = new MailAccount(); + account.setHost(mailProperties.getHost()); + account.setPort(mailProperties.getPort()); + account.setAuth(mailProperties.getAuth()); + account.setFrom(mailProperties.getFrom()); + account.setUser(mailProperties.getUser()); + account.setPass(mailProperties.getPass()); + account.setSocketFactoryPort(mailProperties.getPort()); + account.setStarttlsEnable(mailProperties.getStarttlsEnable()); + account.setSslEnable(mailProperties.getSslEnable()); + account.setTimeout(mailProperties.getTimeout()); + account.setConnectionTimeout(mailProperties.getConnectionTimeout()); + return account; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/pom.xml b/ruoyi-common/ruoyi-common-mybatis/pom.xml new file mode 100644 index 0000000..d79ba28 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/pom.xml @@ -0,0 +1,52 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-mybatis + + + ruoyi-common-mybatis 数据库服务 + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-satoken + + + + + com.baomidou + dynamic-datasource-spring-boot3-starter + + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + + com.baomidou + mybatis-plus-jsqlparser + + + + + p6spy + p6spy + + + + diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java new file mode 100644 index 0000000..2879b9d --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java @@ -0,0 +1,40 @@ +package org.dromara.common.mybatis.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限注解,用于标记数据权限的占位符关键字和替换值 + *

+ * 一个注解只能对应一个模板 + *

+ * + * @author Lion Li + * @version 3.5.0 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataColumn { + + /** + * 数据权限模板的占位符关键字,默认为 "deptName" + * + * @return 占位符关键字数组 + */ + String[] key() default "deptName"; + + /** + * 数据权限模板的占位符替换值,默认为 "dept_id" + * + * @return 占位符替换值数组 + */ + String[] value() default "dept_id"; + + /** + * 权限标识符 用于通过菜单权限标识符来获取数据权限 + * 拥有此标识符的角色 将不会拼接此角色的数据过滤sql + * + * @return 权限标识符 + */ + String permission() default ""; +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java new file mode 100644 index 0000000..f5f22d5 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java @@ -0,0 +1,30 @@ +package org.dromara.common.mybatis.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限组注解,用于标记数据权限配置数组 + * + * @author Lion Li + * @version 3.5.0 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + /** + * 数据权限配置数组,用于指定数据权限的占位符关键字和替换值 + * + * @return 数据权限配置数组 + */ + DataColumn[] value(); + + /** + * 权限拼接标识符(用于指定连接语句的sql符号) + * 如不填 默认 select 用 OR 其他语句用 AND + * 内容 OR 或者 AND + */ + String joinStr() default ""; + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java new file mode 100644 index 0000000..1c83cc3 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAspect.java @@ -0,0 +1,50 @@ +package org.dromara.common.mybatis.aspect; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.helper.DataPermissionHelper; + +/** + * 数据权限处理 + * + * @author Lion Li + */ +@Slf4j +@Aspect +public class DataPermissionAspect { + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(dataPermission)") + public void doBefore(JoinPoint joinPoint, DataPermission dataPermission) { + DataPermissionHelper.setPermission(dataPermission); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(dataPermission)") + public void doAfterReturning(JoinPoint joinPoint, DataPermission dataPermission) { + DataPermissionHelper.removePermission(); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(dataPermission)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, DataPermission dataPermission, Exception e) { + DataPermissionHelper.removePermission(); + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java new file mode 100644 index 0000000..3912524 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java @@ -0,0 +1,139 @@ +package org.dromara.common.mybatis.config; + +import cn.hutool.core.net.NetUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler; +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.dromara.common.core.factory.YmlPropertySourceFactory; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.mybatis.aspect.DataPermissionAspect; +import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler; +import org.dromara.common.mybatis.handler.MybatisExceptionHandler; +import org.dromara.common.mybatis.handler.PlusPostInitTableInfoHandler; +import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.BeansException; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * mybatis-plus配置类(下方注释有插件介绍) + * + * @author Lion Li + */ +@EnableTransactionManagement(proxyTargetClass = true) +@MapperScan("${mybatis-plus.mapperPackage}") +@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 多租户插件 必须放到第一位 + try { + TenantLineInnerInterceptor tenant = SpringUtils.getBean(TenantLineInnerInterceptor.class); + interceptor.addInnerInterceptor(tenant); + } catch (BeansException ignore) { + } + paginationInnerInterceptor().setMaxLimit(1000L); + // 数据权限处理 + interceptor.addInnerInterceptor(dataPermissionInterceptor()); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + return interceptor; + } + + /** + * 数据权限拦截器 + */ + public PlusDataPermissionInterceptor dataPermissionInterceptor() { + return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage")); + } + + /** + * 数据权限切面处理器 + */ + @Bean + public DataPermissionAspect dataPermissionAspect() { + return new DataPermissionAspect(); + } + + /** + * 分页插件,自动识别数据库类型 + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 分页合理化 + paginationInnerInterceptor.setOverflow(true); + return paginationInnerInterceptor; + } + + /** + * 乐观锁插件 + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 元对象字段填充控制器 + */ + @Bean + public MetaObjectHandler metaObjectHandler() { + return new InjectionMetaObjectHandler(); + } + + /** + * 使用网卡信息绑定雪花生成器 + * 防止集群雪花ID重复 + */ + @Bean + public IdentifierGenerator idGenerator() { + return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); + } + + /** + * 异常处理器 + */ + @Bean + public MybatisExceptionHandler mybatisExceptionHandler() { + return new MybatisExceptionHandler(); + } + + /** + * 初始化表对象处理器 + */ + @Bean + public PostInitTableInfoHandler postInitTableInfoHandler() { + return new PlusPostInitTableInfoHandler(); + } + + /** + * PaginationInnerInterceptor 分页插件,自动识别数据库类型 + * https://baomidou.com/pages/97710a/ + * OptimisticLockerInnerInterceptor 乐观锁插件 + * https://baomidou.com/pages/0d93c0/ + * MetaObjectHandler 元对象字段填充控制器 + * https://baomidou.com/pages/4c6bcf/ + * ISqlInjector sql注入器 + * https://baomidou.com/pages/42ea4a/ + * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 + * https://baomidou.com/pages/f9a237/ + * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) + * IdentifierGenerator 自定义主键策略 + * https://baomidou.com/pages/568eb2/ + * TenantLineInnerInterceptor 多租户插件 + * https://baomidou.com/pages/aef2f2/ + * DynamicTableNameInnerInterceptor 动态表名插件 + * https://baomidou.com/pages/2a45ff/ + */ + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java new file mode 100644 index 0000000..13a7941 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -0,0 +1,70 @@ +package org.dromara.common.mybatis.core.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity基类 + * + * @author Lion Li + */ +@Data +public class BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 搜索值 + */ + @JsonIgnore + @TableField(exist = false) + private String searchValue; + + /** + * 创建部门 + */ + @TableField(fill = FieldFill.INSERT) + private Long createDept; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java new file mode 100644 index 0000000..89dbbe2 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -0,0 +1,354 @@ +package org.dromara.common.mybatis.core.mapper; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 自定义 Mapper 接口, 实现 自定义扩展 + * + * @param table 泛型 + * @param vo 泛型 + * @author Lion Li + * @since 2021-05-13 + */ +@SuppressWarnings("unchecked") +public interface BaseMapperPlus extends BaseMapper { + + Log log = LogFactory.getLog(BaseMapperPlus.class); + + /** + * 获取当前实例对象关联的泛型类型 V 的 Class 对象 + * + * @return 返回当前实例对象关联的泛型类型 V 的 Class 对象 + */ + default Class currentVoClass() { + return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1]; + } + + /** + * 获取当前实例对象关联的泛型类型 T 的 Class 对象 + * + * @return 返回当前实例对象关联的泛型类型 T 的 Class 对象 + */ + default Class currentModelClass() { + return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0]; + } + + /** + * 使用默认的查询条件查询并返回结果列表 + * + * @return 返回查询结果的列表 + */ + default List selectList() { + return this.selectList(new QueryWrapper<>()); + } + + /** + * 批量插入实体对象集合 + * + * @param entityList 实体对象集合 + * @return 插入操作是否成功的布尔值 + */ + default boolean insertBatch(Collection entityList) { + return Db.saveBatch(entityList); + } + + /** + * 批量根据ID更新实体对象集合 + * + * @param entityList 实体对象集合 + * @return 更新操作是否成功的布尔值 + */ + default boolean updateBatchById(Collection entityList) { + return Db.updateBatchById(entityList); + } + + /** + * 批量插入或更新实体对象集合 + * + * @param entityList 实体对象集合 + * @return 插入或更新操作是否成功的布尔值 + */ + default boolean insertOrUpdateBatch(Collection entityList) { + return Db.saveOrUpdateBatch(entityList); + } + + /** + * 批量插入实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 插入操作是否成功的布尔值 + */ + default boolean insertBatch(Collection entityList, int batchSize) { + return Db.saveBatch(entityList, batchSize); + } + + /** + * 批量根据ID更新实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 更新操作是否成功的布尔值 + */ + default boolean updateBatchById(Collection entityList, int batchSize) { + return Db.updateBatchById(entityList, batchSize); + } + + /** + * 批量插入或更新实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 插入或更新操作是否成功的布尔值 + */ + default boolean insertOrUpdateBatch(Collection entityList, int batchSize) { + return Db.saveOrUpdateBatch(entityList, batchSize); + } + + /** + * 根据ID查询单个VO对象 + * + * @param id 主键ID + * @return 查询到的单个VO对象 + */ + default V selectVoById(Serializable id) { + return selectVoById(id, this.currentVoClass()); + } + + /** + * 根据ID查询单个VO对象并将其转换为指定的VO类 + * + * @param id 主键ID + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 + */ + default C selectVoById(Serializable id, Class voClass) { + T obj = this.selectById(id); + if (ObjectUtil.isNull(obj)) { + return null; + } + return MapstructUtils.convert(obj, voClass); + } + + /** + * 根据ID集合批量查询VO对象列表 + * + * @param idList 主键ID集合 + * @return 查询到的VO对象列表 + */ + default List selectVoByIds(Collection idList) { + return selectVoByIds(idList, this.currentVoClass()); + } + + /** + * 根据ID集合批量查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param idList 主键ID集合 + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoByIds(Collection idList, Class voClass) { + List list = this.selectByIds(idList); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(list, voClass); + } + + /** + * 根据查询条件Map查询VO对象列表 + * + * @param map 查询条件Map + * @return 查询到的VO对象列表 + */ + default List selectVoByMap(Map map) { + return selectVoByMap(map, this.currentVoClass()); + } + + /** + * 根据查询条件Map查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param map 查询条件Map + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoByMap(Map map, Class voClass) { + List list = this.selectByMap(map); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(list, voClass); + } + + /** + * 根据条件查询单个VO对象 + * + * @param wrapper 查询条件Wrapper + * @return 查询到的单个VO对象 + */ + default V selectVoOne(Wrapper wrapper) { + return selectVoOne(wrapper, this.currentVoClass()); + } + + /** + * 根据条件查询单个VO对象,并根据需要决定是否抛出异常 + * + * @param wrapper 查询条件Wrapper + * @param throwEx 是否抛出异常的标志 + * @return 查询到的单个VO对象 + */ + default V selectVoOne(Wrapper wrapper, boolean throwEx) { + return selectVoOne(wrapper, this.currentVoClass(), throwEx); + } + + /** + * 根据条件查询单个VO对象,并指定返回的VO对象的类型 + * + * @param wrapper 查询条件Wrapper + * @param voClass 返回的VO对象的Class对象 + * @param 返回的VO对象的类型 + * @return 查询到的单个VO对象,经过类型转换为指定的VO类后返回 + */ + default C selectVoOne(Wrapper wrapper, Class voClass) { + return selectVoOne(wrapper, voClass, true); + } + + /** + * 根据条件查询单个实体对象,并将其转换为指定的VO对象 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param throwEx 是否抛出异常的标志 + * @param VO类的类型 + * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 + */ + default C selectVoOne(Wrapper wrapper, Class voClass, boolean throwEx) { + T obj = this.selectOne(wrapper, throwEx); + if (ObjectUtil.isNull(obj)) { + return null; + } + return MapstructUtils.convert(obj, voClass); + } + + /** + * 查询所有VO对象列表 + * + * @return 查询到的VO对象列表 + */ + default List selectVoList() { + return selectVoList(new QueryWrapper<>(), this.currentVoClass()); + } + + /** + * 根据条件查询VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @return 查询到的VO对象列表 + */ + default List selectVoList(Wrapper wrapper) { + return selectVoList(wrapper, this.currentVoClass()); + } + + /** + * 根据条件查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoList(Wrapper wrapper, Class voClass) { + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(list, voClass); + } + + /** + * 根据条件分页查询VO对象列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @return 查询到的VO对象分页列表 + */ + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + /** + * 根据条件分页查询实体对象列表,并将其转换为指定的VO对象分页列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @param

VO对象分页列表的类型 + * @return 查询到的VO对象分页列表,经过转换为指定的VO类后返回 + */ + default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + // 根据条件分页查询实体对象列表 + List list = this.selectList(page, wrapper); + // 创建一个新的VO对象分页列表,并设置分页信息 + IPage voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); + if (CollUtil.isEmpty(list)) { + return (P) voPage; + } + voPage.setRecords(MapstructUtils.convert(list, voClass)); + return (P) voPage; + } + + /** + * 根据条件查询符合条件的对象,并将其转换为指定类型的对象列表 + * + * @param wrapper 查询条件Wrapper + * @param mapper 转换函数,用于将查询到的对象转换为指定类型的对象 + * @param 要转换的对象的类型 + * @return 查询到的符合条件的对象列表,经过转换为指定类型的对象后返回 + */ + default List selectObjs(Wrapper wrapper, Function mapper) { + return StreamUtils.toList(this.selectObjs(wrapper), mapper); + } + @Select("SELECT 't_depot' AS table_name, id FROM t_depot WHERE name = #{depotName} " + + "UNION ALL " + + "SELECT 't_freight' AS table_name, id FROM t_freight WHERE name = #{freightName} " + + "UNION ALL " + + "SELECT 't_shelves' AS table_name, id FROM t_shelves WHERE name = #{shelvesName}") + Map getIdsByNames(String depotName, String freightName, String shelvesName); + + + @Select("select id from t_shelves where code = #{shelvesName} AND depot_id = #{depotId}") + Long getShelvesIdByName(String shelvesName,Long depotId); + + @Select("select id from t_depot where name = #{depotName} AND user_id= #{userId}") + Long getDepotIdByName(String depotName, Long userId); + + @Select("select user_id from sys_user where phonenumber = #{phoneNumber}") + Long selectUserIdByNameAndPassWord(String phoneNumber); + + @Insert("insert into sys_user_role(user_id, role_id) values(#{userId},#{roleId})") + void insertUserRole(Long userId, Long roleId); +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java new file mode 100644 index 0000000..370f479 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -0,0 +1,91 @@ +package org.dromara.common.mybatis.core.page; + +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class TableDataInfo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, long total) { + this.rows = list; + this.total = total; + this.code = HttpStatus.HTTP_OK; + this.msg = "查询成功"; + } + + /** + * 根据分页对象构建表格分页数据对象 + */ + public static TableDataInfo build(IPage page) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(page.getRecords()); + rspData.setTotal(page.getTotal()); + return rspData; + } + + /** + * 根据数据列表构建表格分页数据对象 + */ + public static TableDataInfo build(List list) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(list.size()); + return rspData; + } + + /** + * 构建表格分页数据对象 + */ + public static TableDataInfo build() { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + return rspData; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java new file mode 100644 index 0000000..5084424 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java @@ -0,0 +1,58 @@ +package org.dromara.common.mybatis.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; + +/** + * 数据库类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DataBaseType { + + /** + * MySQL + */ + MY_SQL("MySQL"), + + /** + * Oracle + */ + ORACLE("Oracle"), + + /** + * PostgreSQL + */ + POSTGRE_SQL("PostgreSQL"), + + /** + * SQL Server + */ + SQL_SERVER("Microsoft SQL Server"); + + /** + * 数据库类型 + */ + private final String type; + + /** + * 根据数据库产品名称查找对应的数据库类型 + * + * @param databaseProductName 数据库产品名称 + * @return 对应的数据库类型枚举值,如果未找到则返回 null + */ + public static DataBaseType find(String databaseProductName) { + if (StringUtils.isBlank(databaseProductName)) { + return null; + } + for (DataBaseType type : values()) { + if (type.getType().equals(databaseProductName)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java new file mode 100644 index 0000000..fec2579 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -0,0 +1,102 @@ +package org.dromara.common.mybatis.handler; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.satoken.utils.LoginHelper; + +import java.util.Date; + +/** + * MP注入处理器 + * + * @author Lion Li + * @date 2021/4/25 + */ +@Slf4j +public class InjectionMetaObjectHandler implements MetaObjectHandler { + + /** + * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息 + * + * @param metaObject 元对象,用于获取原始对象并进行填充 + */ + @Override + public void insertFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 获取当前时间作为创建时间和更新时间,如果创建时间不为空,则使用创建时间,否则使用当前时间 + Date current = ObjectUtils.notNull(baseEntity.getCreateTime(), new Date()); + baseEntity.setCreateTime(current); + baseEntity.setUpdateTime(current); + + // 如果创建人为空,则填充当前登录用户的信息 + if (ObjectUtil.isNull(baseEntity.getCreateBy())) { + LoginUser loginUser = getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + Long userId = loginUser.getUserId(); + // 填充创建人、更新人和创建部门信息 + baseEntity.setCreateBy(userId); + baseEntity.setUpdateBy(userId); + baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); + } + } + } else { + Date date = new Date(); + this.strictInsertFill(metaObject, "createTime", Date.class, date); + this.strictInsertFill(metaObject, "updateTime", Date.class, date); + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } + + /** + * 更新填充方法,用于在更新数据时自动填充实体对象中的更新时间和更新人信息 + * + * @param metaObject 元对象,用于获取原始对象并进行填充 + */ + @Override + public void updateFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 获取当前时间作为更新时间,无论原始对象中的更新时间是否为空都填充 + Date current = new Date(); + baseEntity.setUpdateTime(current); + + // 获取当前登录用户的ID,并填充更新人信息 + Long userId = LoginHelper.getUserId(); + if (ObjectUtil.isNotNull(userId)) { + baseEntity.setUpdateBy(userId); + } + } else { + this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } + + /** + * 获取当前登录用户信息 + * + * @return 当前登录用户的信息,如果用户未登录则返回 null + */ + private LoginUser getLoginUser() { + LoginUser loginUser; + try { + loginUser = LoginHelper.getLoginUser(); + } catch (Exception e) { + log.warn("自动注入警告 => 用户未登录"); + return null; + } + return loginUser; + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java new file mode 100644 index 0000000..518d52d --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java @@ -0,0 +1,46 @@ +package org.dromara.common.mybatis.handler; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.mybatis.spring.MyBatisSystemException; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * Mybatis异常处理器 + * + * @author Lion Li + */ +@Slf4j +@RestControllerAdvice +public class MybatisExceptionHandler { + + /** + * 主键或UNIQUE索引,数据重复异常 + */ + @ExceptionHandler(DuplicateKeyException.class) + public R handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',数据库中已存在记录'{}'", requestURI, e.getMessage()); + return R.fail("数据库中已存在该记录,请联系管理员确认"); + } + + /** + * Mybatis系统异常 通用处理 + */ + @ExceptionHandler(MyBatisSystemException.class) + public R handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + String message = e.getMessage(); + if (StringUtils.contains("CannotFindDataSourceException", message)) { + log.error("请求地址'{}', 未找到数据源", requestURI); + return R.fail("未找到数据源,请联系管理员确认"); + } + log.error("请求地址'{}', Mybatis系统异常", requestURI, e); + return R.fail(message); + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java new file mode 100644 index 0000000..a354707 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -0,0 +1,332 @@ +package org.dromara.common.mybatis.handler; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.apache.ibatis.io.Resources; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.enums.DataScopeType; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.ClassMetadata; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.expression.*; +import org.springframework.expression.common.TemplateParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.util.ClassUtils; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** + * 数据权限过滤 + * + * @author Lion Li + * @version 3.5.0 + */ +@Slf4j +public class PlusDataPermissionHandler { + + /** + * 类名称与注解的映射关系缓存(由于aop无法拦截mybatis接口类上的注解 只能通过启动预扫描的方式进行) + */ + private final Map dataPermissionCacheMap = new ConcurrentHashMap<>(); + + /** + * spel 解析器 + */ + private final ExpressionParser parser = new SpelExpressionParser(); + private final ParserContext parserContext = new TemplateParserContext(); + /** + * bean解析器 用于处理 spel 表达式中对 bean 的调用 + */ + private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); + + /** + * 构造方法,扫描指定包下的 Mapper 类并初始化缓存 + * + * @param mapperPackage Mapper 类所在的包路径 + */ + public PlusDataPermissionHandler(String mapperPackage) { + scanMapperClasses(mapperPackage); + } + + /** + * 获取数据过滤条件的 SQL 片段 + * + * @param where 原始的查询条件表达式 + * @param mappedStatementId Mapper 方法的 ID + * @param isSelect 是否为查询语句 + * @return 数据过滤条件的 SQL 片段 + */ + public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { + try { + // 获取数据权限配置 + DataPermission dataPermission = getDataPermission(mappedStatementId); + // 获取当前登录用户信息 + LoginUser currentUser = DataPermissionHelper.getVariable("user"); + if (ObjectUtil.isNull(currentUser)) { + currentUser = LoginHelper.getLoginUser(); + DataPermissionHelper.setVariable("user", currentUser); + } + // 如果是超级管理员或租户管理员,则不过滤数据 + if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { + return where; + } + // 构造数据过滤条件的 SQL 片段 + String dataFilterSql = buildDataFilter(dataPermission, isSelect); + if (StringUtils.isBlank(dataFilterSql)) { + return where; + } + Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql); + // 数据权限使用单独的括号 防止与其他条件冲突 + ParenthesedExpressionList parenthesis = new ParenthesedExpressionList<>(expression); + if (ObjectUtil.isNotNull(where)) { + return new AndExpression(where, parenthesis); + } else { + return parenthesis; + } + } catch (JSQLParserException e) { + throw new ServiceException("数据权限解析异常 => " + e.getMessage()); + } finally { + DataPermissionHelper.removePermission(); + } + } + + /** + * 构建数据过滤条件的 SQL 语句 + * + * @param dataPermission 数据权限注解 + * @param isSelect 标志当前操作是否为查询操作,查询操作和更新或删除操作在处理过滤条件时会有不同的处理方式 + * @return 构建的数据过滤条件的 SQL 语句 + * @throws ServiceException 如果角色的数据范围异常或者 key 与 value 的长度不匹配,则抛出 ServiceException 异常 + */ + private String buildDataFilter(DataPermission dataPermission, boolean isSelect) { + // 更新或删除需满足所有条件 + String joinStr = isSelect ? " OR " : " AND "; + if (StringUtils.isNotBlank(dataPermission.joinStr())) { + joinStr = " " + dataPermission.joinStr() + " "; + } + LoginUser user = DataPermissionHelper.getVariable("user"); + Object defaultValue = "-1"; + NullSafeStandardEvaluationContext context = new NullSafeStandardEvaluationContext(defaultValue); + context.addPropertyAccessor(new NullSafePropertyAccessor(context.getPropertyAccessors().get(0), defaultValue)); + context.setBeanResolver(beanResolver); + DataPermissionHelper.getContext().forEach(context::setVariable); + Set conditions = new HashSet<>(); + // 优先设置变量 + List keys = new ArrayList<>(); + Map ignoreMap = new HashMap<>(); + for (DataColumn dataColumn : dataPermission.value()) { + if (dataColumn.key().length != dataColumn.value().length) { + throw new ServiceException("角色数据范围异常 => key与value长度不匹配"); + } + // 包含权限标识符 这直接跳过 + if (StringUtils.isNotBlank(dataColumn.permission()) && + CollUtil.contains(user.getMenuPermission(), dataColumn.permission()) + ) { + ignoreMap.put(dataColumn, Boolean.TRUE); + continue; + } + // 设置注解变量 key 为表达式变量 value 为变量值 + for (int i = 0; i < dataColumn.key().length; i++) { + context.setVariable(dataColumn.key()[i], dataColumn.value()[i]); + } + keys.addAll(Arrays.stream(dataColumn.key()).map(key -> "#" + key).toList()); + } + + for (RoleDTO role : user.getRoles()) { + user.setRoleId(role.getRoleId()); + // 获取角色权限泛型 + DataScopeType type = DataScopeType.findCode(role.getDataScope()); + if (ObjectUtil.isNull(type)) { + throw new ServiceException("角色数据范围异常 => " + role.getDataScope()); + } + // 全部数据权限直接返回 + if (type == DataScopeType.ALL) { + return StringUtils.EMPTY; + } + boolean isSuccess = false; + for (DataColumn dataColumn : dataPermission.value()) { + // 包含权限标识符 这直接跳过 + if (ignoreMap.containsKey(dataColumn)) { + // 修复多角色与权限标识符共用问题 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IB4CS4 + conditions.add(joinStr + " 1 = 1 "); + isSuccess = true; + continue; + } + // 不包含 key 变量 则不处理 + if (!StringUtils.containsAny(type.getSqlTemplate(), keys.toArray(String[]::new))) { + continue; + } + // 当前注解不满足模板 不处理 + if (!StringUtils.containsAny(type.getSqlTemplate(), dataColumn.key())) { + continue; + } + // 忽略数据权限 防止spel表达式内有其他sql查询导致死循环调用 + String sql = DataPermissionHelper.ignore(() -> + parser.parseExpression(type.getSqlTemplate(), parserContext).getValue(context, String.class) + ); + // 解析sql模板并填充 + conditions.add(joinStr + sql); + isSuccess = true; + } + // 未处理成功则填充兜底方案 + if (!isSuccess && StringUtils.isNotBlank(type.getElseSql())) { + conditions.add(joinStr + type.getElseSql()); + } + } + + if (CollUtil.isNotEmpty(conditions)) { + String sql = StreamUtils.join(conditions, Function.identity(), ""); + return sql.substring(joinStr.length()); + } + return StringUtils.EMPTY; + } + + /** + * 扫描指定包下的 Mapper 类,并查找其中带有特定注解的方法或类 + * + * @param mapperPackage Mapper 类所在的包路径 + */ + private void scanMapperClasses(String mapperPackage) { + // 创建资源解析器和元数据读取工厂 + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); + // 将 Mapper 包路径按分隔符拆分为数组 + String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); + String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; + try { + for (String packagePattern : packagePatternArray) { + // 将包路径转换为资源路径 + String path = ClassUtils.convertClassNameToResourcePath(packagePattern); + // 获取指定路径下的所有 .class 文件资源 + Resource[] resources = resolver.getResources(classpath + path + "/*.class"); + for (Resource resource : resources) { + // 获取资源的类元数据 + ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); + // 获取资源对应的类对象 + Class clazz = Resources.classForName(classMetadata.getClassName()); + // 查找类中的特定注解 + if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { + DataPermission dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); + dataPermissionCacheMap.put(clazz.getName(), dataPermission); + } + } + } + } catch (Exception e) { + log.error("初始化数据安全缓存时出错:{}", e.getMessage()); + } + } + + /** + * 根据映射语句 ID 或类名获取对应的 DataPermission 注解对象 + * + * @param mapperId 映射语句 ID + * @return DataPermission 注解对象,如果不存在则返回 null + */ + public DataPermission getDataPermission(String mapperId) { + // 检查上下文中是否包含映射语句 ID 对应的 DataPermission 注解对象 + if (DataPermissionHelper.getPermission() != null) { + return DataPermissionHelper.getPermission(); + } + // 如果缓存中不包含映射语句 ID 对应的 DataPermission 注解对象,则尝试使用类名作为键查找 + String clazzName = mapperId.substring(0, mapperId.lastIndexOf(".")); + if (dataPermissionCacheMap.containsKey(clazzName)) { + return dataPermissionCacheMap.get(clazzName); + } + return null; + } + + /** + * 检查给定的映射语句 ID 是否有效,即是否能够找到对应的 DataPermission 注解对象 + * + * @param mapperId 映射语句 ID + * @return 如果找到对应的 DataPermission 注解对象,则返回 false;否则返回 true + */ + public boolean invalid(String mapperId) { + return getDataPermission(mapperId) == null; + } + + /** + * 对所有null变量找不到的变量返回默认值 + */ + @AllArgsConstructor + private static class NullSafeStandardEvaluationContext extends StandardEvaluationContext { + + private final Object defaultValue; + + @Override + public Object lookupVariable(String name) { + Object obj = super.lookupVariable(name); + // 如果读取到的值是 null,则返回默认值 + if (obj == null) { + return defaultValue; + } + return obj; + } + + } + + /** + * 对所有null变量找不到的变量返回默认值 委托模式 将不需要处理的方法委托给原处理器 + */ + @AllArgsConstructor + private static class NullSafePropertyAccessor implements PropertyAccessor { + + private final PropertyAccessor delegate; + private final Object defaultValue; + + @Override + public Class[] getSpecificTargetClasses() { + return delegate.getSpecificTargetClasses(); + } + + @Override + public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException { + return delegate.canRead(context, target, name); + } + + @Override + public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException { + TypedValue value = delegate.read(context, target, name); + // 如果读取到的值是 null,则返回默认值 + if (value.getValue() == null) { + return new TypedValue(defaultValue); + } + return value; + } + + @Override + public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException { + return delegate.canWrite(context, target, name); + } + + @Override + public void write(EvaluationContext context, Object target, String name, Object newValue) throws AccessException { + delegate.write(context, target, name, newValue); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java new file mode 100644 index 0000000..60ca20b --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusPostInitTableInfoHandler.java @@ -0,0 +1,27 @@ +package org.dromara.common.mybatis.handler; + +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.session.Configuration; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; + +/** + * 修改表信息初始化方式 + * 目前用于全局修改是否使用逻辑删除 + * + * @author Lion Li + */ +public class PlusPostInitTableInfoHandler implements PostInitTableInfoHandler { + + @Override + public void postTableInfo(TableInfo tableInfo, Configuration configuration) { + String flag = SpringUtils.getProperty("mybatis-plus.enableLogicDelete", "true"); + // 只有关闭时 统一设置false 为true时mp自动判断不处理 + if (!Convert.toBool(flag)) { + ReflectUtils.setFieldValue(tableInfo, "withLogicDelete", false); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java new file mode 100644 index 0000000..cd43c68 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java @@ -0,0 +1,81 @@ +package org.dromara.common.mybatis.helper; + +import cn.hutool.core.convert.Convert; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.mybatis.enums.DataBaseType; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据库助手 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DataBaseHelper { + + private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); + + /** + * 获取当前数据库类型 + */ + public static DataBaseType getDataBaseType() { + DataSource dataSource = DS.determineDataSource(); + try (Connection conn = dataSource.getConnection()) { + DatabaseMetaData metaData = conn.getMetaData(); + String databaseProductName = metaData.getDatabaseProductName(); + return DataBaseType.find(databaseProductName); + } catch (SQLException e) { + throw new ServiceException(e.getMessage()); + } + } + + public static boolean isMySql() { + return DataBaseType.MY_SQL == getDataBaseType(); + } + + public static boolean isOracle() { + return DataBaseType.ORACLE == getDataBaseType(); + } + + public static boolean isPostgerSql() { + return DataBaseType.POSTGRE_SQL == getDataBaseType(); + } + + public static boolean isSqlServer() { + return DataBaseType.SQL_SERVER == getDataBaseType(); + } + + public static String findInSet(Object var1, String var2) { + DataBaseType dataBasyType = getDataBaseType(); + String var = Convert.toStr(var1); + if (dataBasyType == DataBaseType.SQL_SERVER) { + // charindex(',100,' , ',0,100,101,') <> 0 + return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2); + } else if (dataBasyType == DataBaseType.POSTGRE_SQL) { + // (select strpos(',0,100,101,' , ',100,')) <> 0 + return "(select strpos(','||%s||',' , ',%s,')) <> 0".formatted(var2, var); + } else if (dataBasyType == DataBaseType.ORACLE) { + // instr(',0,100,101,' , ',100,') <> 0 + return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var); + } + // find_in_set(100 , '0,100,101') + return "find_in_set('%s' , %s) <> 0".formatted(var, var2); + } + + /** + * 获取当前加载的数据库名 + */ + public static List getDataSourceNameList() { + return new ArrayList<>(DS.getDataSources().keySet()); + } +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java new file mode 100644 index 0000000..f03d74e --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -0,0 +1,176 @@ +package org.dromara.common.mybatis.helper; + +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.context.model.SaStorage; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.mybatis.annotation.DataPermission; + +import java.util.HashMap; +import java.util.Map; +import java.util.Stack; +import java.util.function.Supplier; + +/** + * 数据权限助手 + * + * @author Lion Li + * @version 3.5.0 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@SuppressWarnings("unchecked cast") +public class DataPermissionHelper { + + private static final String DATA_PERMISSION_KEY = "data:permission"; + + private static final ThreadLocal> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new); + + private static final ThreadLocal PERMISSION_CACHE = new ThreadLocal<>(); + + /** + * 获取当前执行mapper权限注解 + * + * @return 返回当前执行mapper权限注解 + */ + public static DataPermission getPermission() { + return PERMISSION_CACHE.get(); + } + + /** + * 设置当前执行mapper权限注解 + * + * @param dataPermission 数据权限注解 + */ + public static void setPermission(DataPermission dataPermission) { + PERMISSION_CACHE.set(dataPermission); + } + + /** + * 删除当前执行mapper权限注解 + */ + public static void removePermission() { + PERMISSION_CACHE.remove(); + } + + /** + * 从上下文中获取指定键的变量值,并将其转换为指定的类型 + * + * @param key 变量的键 + * @param 变量值的类型 + * @return 指定键的变量值,如果不存在则返回 null + */ + public static T getVariable(String key) { + Map context = getContext(); + return (T) context.get(key); + } + + /** + * 向上下文中设置指定键的变量值 + * + * @param key 要设置的变量的键 + * @param value 要设置的变量值 + */ + public static void setVariable(String key, Object value) { + Map context = getContext(); + context.put(key, value); + } + + /** + * 获取数据权限上下文 + * + * @return 存储在SaStorage中的Map对象,用于存储数据权限相关的上下文信息 + * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException + */ + public static Map getContext() { + SaStorage saStorage = SaHolder.getStorage(); + Object attribute = saStorage.get(DATA_PERMISSION_KEY); + if (ObjectUtil.isNull(attribute)) { + saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); + attribute = saStorage.get(DATA_PERMISSION_KEY); + } + if (attribute instanceof Map map) { + return map; + } + throw new NullPointerException("data permission context type exception"); + } + + private static IgnoreStrategy getIgnoreStrategy() { + Object ignoreStrategyLocal = ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + if (ignoreStrategyLocal instanceof ThreadLocal IGNORE_STRATEGY_LOCAL) { + if (IGNORE_STRATEGY_LOCAL.get() instanceof IgnoreStrategy ignoreStrategy) { + return ignoreStrategy; + } + } + return null; + } + + /** + * 开启忽略数据权限(开启后需手动调用 {@link #disableIgnore()} 关闭) + */ + public static void enableIgnore() { + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNull(ignoreStrategy)) { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); + } else { + ignoreStrategy.setDataPermission(true); + } + Stack reentrantStack = REENTRANT_IGNORE.get(); + reentrantStack.push(reentrantStack.size() + 1); + } + + /** + * 关闭忽略数据权限 + */ + public static void disableIgnore() { + IgnoreStrategy ignoreStrategy = getIgnoreStrategy(); + if (ObjectUtil.isNotNull(ignoreStrategy)) { + boolean noOtherIgnoreStrategy = !Boolean.TRUE.equals(ignoreStrategy.getDynamicTableName()) + && !Boolean.TRUE.equals(ignoreStrategy.getBlockAttack()) + && !Boolean.TRUE.equals(ignoreStrategy.getIllegalSql()) + && !Boolean.TRUE.equals(ignoreStrategy.getTenantLine()) + && CollectionUtil.isEmpty(ignoreStrategy.getOthers()); + Stack reentrantStack = REENTRANT_IGNORE.get(); + boolean empty = reentrantStack.isEmpty() || reentrantStack.pop() == 1; + if (noOtherIgnoreStrategy && empty) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } else if (empty) { + ignoreStrategy.setDataPermission(false); + } + + } + } + + /** + * 在忽略数据权限中执行 + * + * @param handle 处理执行方法 + */ + public static void ignore(Runnable handle) { + enableIgnore(); + try { + handle.run(); + } finally { + disableIgnore(); + } + } + + /** + * 在忽略数据权限中执行 + * + * @param handle 处理执行方法 + */ + public static T ignore(Supplier handle) { + enableIgnore(); + try { + return handle.get(); + } finally { + disableIgnore(); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java new file mode 100644 index 0000000..85a4d0a --- /dev/null +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java @@ -0,0 +1,181 @@ +package org.dromara.common.mybatis.interceptor; + +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler; +import com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SetOperationList; +import net.sf.jsqlparser.statement.update.Update; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.dromara.common.mybatis.handler.PlusDataPermissionHandler; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +/** + * 数据权限拦截器 + * + * @author Lion Li + * @version 3.5.0 + */ +@Slf4j +public class PlusDataPermissionInterceptor extends BaseMultiTableInnerInterceptor implements InnerInterceptor { + + private final PlusDataPermissionHandler dataPermissionHandler; + + /** + * 构造函数,初始化 PlusDataPermissionHandler 实例 + * + * @param mapperPackage 扫描的映射器包 + */ + public PlusDataPermissionInterceptor(String mapperPackage) { + this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage); + } + + /** + * 在执行查询之前,检查并处理数据权限相关逻辑 + * + * @param executor MyBatis 执行器对象 + * @param ms 映射语句对象 + * @param parameter 方法参数 + * @param rowBounds 分页对象 + * @param resultHandler 结果处理器 + * @param boundSql 绑定的 SQL 对象 + * @throws SQLException 如果发生 SQL 异常 + */ + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { + // 检查是否需要忽略数据权限处理 + if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { + return; + } + // 检查是否缺少有效的数据权限注解 + if (dataPermissionHandler.invalid(ms.getId())) { + return; + } + // 解析 sql 分配对应方法 + PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); + mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); + } + + /** + * 在准备 SQL 语句之前,检查并处理更新和删除操作的数据权限相关逻辑 + * + * @param sh MyBatis StatementHandler 对象 + * @param connection 数据库连接对象 + * @param transactionTimeout 事务超时时间 + */ + @Override + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + // 获取 SQL 命令类型(增、删、改、查) + SqlCommandType sct = ms.getSqlCommandType(); + + // 只处理更新和删除操作的 SQL 语句 + if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { + if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { + return; + } + // 检查是否缺少有效的数据权限注解 + if (dataPermissionHandler.invalid(ms.getId())) { + return; + } + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + mpBs.sql(parserMulti(mpBs.sql(), ms.getId())); + } + } + + /** + * 处理 SELECT 查询语句中的 WHERE 条件 + * + * @param select SELECT 查询对象 + * @param index 查询语句的索引 + * @param sql 查询语句 + * @param obj WHERE 条件参数 + */ + @Override + protected void processSelect(Select select, int index, String sql, Object obj) { + if (select instanceof PlainSelect) { + this.setWhere((PlainSelect) select, (String) obj); + } else if (select instanceof SetOperationList setOperationList) { + List + SELECT * FROM test_demo ${ew.customSqlSegment} + + + diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml new file mode 100644 index 0000000..d7975ec --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java new file mode 100644 index 0000000..8c0f352 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -0,0 +1,105 @@ +package org.dromara.generator.config; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.anyline.data.datasource.DataSourceMonitor; +import org.anyline.data.runtime.DataRuntime; +import org.anyline.util.ConfigTable; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.util.HashMap; +import java.util.Map; + +/** + * anyline 适配 动态数据源改造 + * + * @author Lion Li + */ +@Slf4j +@Component +public class MyBatisDataSourceMonitor implements DataSourceMonitor { + + public MyBatisDataSourceMonitor() { + // 调整执行模式为自定义 + ConfigTable.KEEP_ADAPTER = 2; + // 禁用缓存 + ConfigTable.METADATA_CACHE_SCOPE = 0; + } + + private final Map features = new HashMap<>(); + + /** + * 数据源特征 用来定准 adapter 包含数据库或JDBC协议关键字
+ * 一般会通过 产品名_url 合成 如果返回null 上层方法会通过driver_产品名_url合成 + * + * @param datasource 数据源 + * @return String 返回null由上层自动提取 + */ + @Override + public String feature(DataRuntime runtime, Object datasource) { + String feature = null; + if (datasource instanceof JdbcTemplate jdbc) { + DataSource ds = jdbc.getDataSource(); + if (ds instanceof DynamicRoutingDataSource) { + String key = DynamicDataSourceContextHolder.peek(); + feature = features.get(key); + if (null == feature) { + Connection con = null; + try { + con = DataSourceUtils.getConnection(ds); + DatabaseMetaData meta = con.getMetaData(); + String url = meta.getURL(); + feature = meta.getDatabaseProductName().toLowerCase().replace(" ", "") + "_" + url; + features.put(key, feature); + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + if (null != con && !DataSourceUtils.isConnectionTransactional(con, ds)) { + DataSourceUtils.releaseConnection(con, ds); + } + } + } + } + } + return feature; + } + + /** + * 数据源唯一标识 如果不实现则默认feature + * @param datasource 数据源 + * @return String 返回null由上层自动提取 + */ + @Override + public String key(DataRuntime runtime, Object datasource) { + if(datasource instanceof JdbcTemplate jdbc){ + DataSource ds = jdbc.getDataSource(); + if(ds instanceof DynamicRoutingDataSource){ + return DynamicDataSourceContextHolder.peek(); + } + } + return runtime.getKey(); + } + + /** + * ConfigTable.KEEP_ADAPTER=2 : 根据当前接口判断是否保持同一个数据源绑定同一个adapter
+ * DynamicRoutingDataSource类型的返回false,因为同一个DynamicRoutingDataSource可能对应多类数据库, 如果项目中只有一种数据库 应该直接返回true + * + * @param datasource 数据源 + * @return boolean + */ + @Override + public boolean keepAdapter(DataRuntime runtime, Object datasource) { + if (datasource instanceof JdbcTemplate jdbc) { + DataSource ds = jdbc.getDataSource(); + return !(ds instanceof DynamicRoutingDataSource); + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java new file mode 100644 index 0000000..b9888fb --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/constant/GenConstants.java @@ -0,0 +1,186 @@ +package org.dromara.generator.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public interface GenConstants { + /** + * 单表(增删改查) + */ + String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + String TPL_TREE = "tree"; + + /** + * 树编码字段 + */ + String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2"}; + + /** + * 数据库文本类型 + */ + String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob", + "ntext", "image", "bytea"}; + + /** + * 数据库时间类型 + */ + String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval", + "smalldatetime", "datetime2", "datetimeoffset", "timestamptz"}; + + /** + * 数据库数字类型 + */ + String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer", + "bit", "bigint", "float", "float4", "float8", "double", "decimal", "numeric", "real", "double precision", + "smallserial", "serial", "bigserial", "money", "smallmoney"}; + + /** + * BO对象 不需要添加字段 + */ + String[] COLUMNNAME_NOT_ADD = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要编辑字段 + */ + String[] COLUMNNAME_NOT_EDIT = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * VO对象 不需要返回字段 + */ + String[] COLUMNNAME_NOT_LIST = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要查询字段 + */ + String[] COLUMNNAME_NOT_QUERY = {"id", "create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark", "version", "tenant_id"}; + + /** + * Entity基类字段 + */ + String[] BASE_ENTITY = {"createDept", "createBy", "createTime", "updateBy", "updateTime", "tenantId"}; + + /** + * 文本框 + */ + String HTML_INPUT = "input"; + + /** + * 文本域 + */ + String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + String HTML_SELECT = "select"; + + /** + * 单选框 + */ + String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + String TYPE_STRING = "String"; + + /** + * 整型 + */ + String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + String QUERY_LIKE = "LIKE"; + + /** + * 相等查询 + */ + String QUERY_EQ = "EQ"; + + /** + * 需要 + */ + String REQUIRE = "1"; +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java new file mode 100644 index 0000000..e3d4c08 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java @@ -0,0 +1,217 @@ +package org.dromara.generator.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; +import org.dromara.generator.service.IGenTableService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成 操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController { + + private final IGenTableService genTableService; + + /** + * 查询代码生成列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageGenTableList(genTable, pageQuery); + } + + /** + * 修改代码生成业务 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:query") + @GetMapping(value = "/{tableId}") + public R> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap<>(3); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return R.ok(map); + } + + /** + * 查询数据库列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageDbTableList(genTable, pageQuery); + } + + /** + * 查询数据表字段列表 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { + TableDataInfo dataInfo = new TableDataInfo<>(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + * + * @param tables 表名串 + */ + @SaCheckPermission("tool:gen:import") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public R importTableSave(String tables, String dataName) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames, dataName); + genTableService.importGenTable(tableList, dataName); + return R.ok(); + } + + /** + * 修改保存代码生成业务 + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public R editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return R.ok(); + } + + /** + * 删除代码生成 + * + * @param tableIds 表ID串 + */ + @SaCheckPermission("tool:gen:remove") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public R remove(@PathVariable Long[] tableIds) { + genTableService.deleteGenTableByIds(tableIds); + return R.ok(); + } + + /** + * 预览代码 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:preview") + @GetMapping("/preview/{tableId}") + public R> preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return R.ok(dataMap); + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableId}") + public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException { + byte[] data = genTableService.downloadCode(tableId); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableId}") + public R genCode(@PathVariable("tableId") Long tableId) { + genTableService.generatorCode(tableId); + return R.ok(); + } + + /** + * 同步数据库 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableId}") + public R synchDb(@PathVariable("tableId") Long tableId) { + genTableService.synchDb(tableId); + return R.ok(); + } + + /** + * 批量生成代码 + * + * @param tableIdStr 表ID串 + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException { + String[] tableIds = Convert.toStrArray(tableIdStr); + byte[] data = genTableService.downloadCode(tableIds); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.write(response.getOutputStream(), false, data); + } + + /** + * 查询数据源名称列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/getDataNames") + public R getCurrentDataSourceNameList(){ + return R.ok(DataBaseHelper.getDataSourceNameList()); + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java new file mode 100644 index 0000000..6b2e429 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java @@ -0,0 +1,222 @@ +package org.dromara.generator.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.ibatis.type.JdbcType; + +import jakarta.validation.constraints.NotBlank; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table_column") +public class GenTableColumn extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "column_id") + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isPk; + + /** + * 是否自增(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isIncrement; + + /** + * 是否必填(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isEdit; + + /** + * 是否列表字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isList; + + /** + * 是否查询字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) + private String isQuery; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public boolean isPk() { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public boolean isIncrement() { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public boolean isRequired() { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public boolean isInsert() { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public boolean isEdit() { + return isEdit(this.isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public boolean isList() { + return isList(this.isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public boolean isQuery() { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", + // TreeEntity + "parentName", "parentId"); + } + + public boolean isUsableColumn() { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append(StringUtils.EMPTY).append(startStr).append("=").append(endStr).append(StringUtils.SEPARATOR); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return this.columnComment; + } + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..ed8ed20 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,15 @@ +package org.dromara.generator.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.generator.domain.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableColumnMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..1798b4b --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/mapper/GenTableMapper.java @@ -0,0 +1,51 @@ +package org.dromara.generator.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.generator.domain.GenTable; + +import java.util.List; + +/** + * 业务 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableMapper extends BaseMapperPlus { + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + GenTable selectGenTableByName(String tableName); + + /** + * 查询指定数据源下的所有表名列表 + * + * @param dataName 数据源名称,用于选择不同的数据源 + * @return 当前数据库中的表名列表 + * + * @DS("") 使用默认数据源执行查询操作 + */ + @DS("") + List selectTableNameList(String dataName); +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java new file mode 100644 index 0000000..6b9e606 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -0,0 +1,582 @@ +package org.dromara.generator.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.anyline.metadata.Column; +import org.anyline.metadata.Table; +import org.anyline.proxy.ServiceProxy; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.generator.constant.GenConstants; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; +import org.dromara.generator.mapper.GenTableColumnMapper; +import org.dromara.generator.mapper.GenTableMapper; +import org.dromara.generator.util.GenUtils; +import org.dromara.generator.util.VelocityInitializer; +import org.dromara.generator.util.VelocityUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class GenTableServiceImpl implements IGenTableService { + + private final GenTableMapper baseMapper; + private final GenTableColumnMapper genTableColumnMapper; + private final IdentifierGenerator identifierGenerator; + + private static final String[] TABLE_IGNORE = new String[]{"sj_", "flow_", "gen_"}; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); + } + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + GenTable genTable = baseMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + @Override + public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); + return TableDataInfo.build(page); + } + + private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { + Map params = genTable.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper + .eq(StringUtils.isNotEmpty(genTable.getDataName()), "data_name", genTable.getDataName()) + .like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) + .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "create_time", params.get("beginTime"), params.get("endTime")) + .orderByDesc("update_time"); + return wrapper; + } + + /** + * 查询数据库列表 + * + * @param genTable 包含查询条件的GenTable对象 + * @param pageQuery 包含分页信息的PageQuery对象 + * @return 包含分页结果的TableDataInfo对象 + */ + @DS("#genTable.dataName") + @Override + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + // 获取查询条件 + String tableName = genTable.getTableName(); + String tableComment = genTable.getTableComment(); + + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); + if (CollUtil.isEmpty(tablesMap)) { + return TableDataInfo.build(); + } + List tableNames = baseMapper.selectTableNameList(genTable.getDataName()); + String[] tableArrays; + if (CollUtil.isNotEmpty(tableNames)) { + tableArrays = tableNames.toArray(new String[0]); + } else { + tableArrays = new String[0]; + } + // 过滤并转换表格数据 + List tables = tablesMap.values().stream() + .filter(x -> !StringUtils.startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE)) + .filter(x -> { + if (CollUtil.isEmpty(tableNames)) { + return true; + } + return !StringUtils.equalsAnyIgnoreCase(x.getName(), tableArrays); + }) + .filter(x -> { + boolean nameMatches = true; + boolean commentMatches = true; + // 进行表名称的模糊查询 + if (StringUtils.isNotBlank(tableName)) { + nameMatches = StringUtils.containsIgnoreCase(x.getName(), tableName); + } + // 进行表描述的模糊查询 + if (StringUtils.isNotBlank(tableComment)) { + commentMatches = StringUtils.containsIgnoreCase(x.getComment(), tableComment); + } + // 同时匹配名称和描述 + return nameMatches && commentMatches; + }) + .map(x -> { + GenTable gen = new GenTable(); + gen.setTableName(x.getName()); + gen.setTableComment(x.getComment()); + // postgresql的表元数据没有创建时间这个东西(好奇葩) 只能new Date代替 + gen.setCreateTime(ObjectUtil.defaultIfNull(x.getCreateTime(), new Date())); + gen.setUpdateTime(x.getUpdateTime()); + return gen; + }).sorted(Comparator.comparing(GenTable::getCreateTime).reversed()) + .toList(); + + IPage page = pageQuery.build(); + page.setTotal(tables.size()); + // 手动分页 set数据 + page.setRecords(CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tables)); + return TableDataInfo.build(page); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + @DS("#dataName") + @Override + public List selectDbTableListByNames(String[] tableNames, String dataName) { + Set tableNameSet = new HashSet<>(List.of(tableNames)); + LinkedHashMap> tablesMap = ServiceProxy.metadata().tables(); + + if (CollUtil.isEmpty(tablesMap)) { + return new ArrayList<>(); + } + + List> tableList = tablesMap.values().stream() + .filter(x -> !StringUtils.startWithAnyIgnoreCase(x.getName(), TABLE_IGNORE)) + .filter(x -> tableNameSet.contains(x.getName())).toList(); + + if (CollUtil.isEmpty(tableList)) { + return new ArrayList<>(); + } + return tableList.stream().map(x -> { + GenTable gen = new GenTable(); + gen.setDataName(dataName); + gen.setTableName(x.getName()); + gen.setTableComment(x.getComment()); + gen.setCreateTime(x.getCreateTime()); + gen.setUpdateTime(x.getUpdateTime()); + return gen; + }).toList(); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + return baseMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void updateGenTable(GenTable genTable) { + String options = JsonUtils.toJsonString(genTable.getParams()); + genTable.setOptions(options); + int row = baseMapper.updateById(genTable); + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { + genTableColumnMapper.updateById(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteGenTableByIds(Long[] tableIds) { + List ids = Arrays.asList(tableIds); + baseMapper.deleteByIds(ids); + genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + @DSTransactional + @Override + public void importGenTable(List tableList, String dataName) { + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table); + table.setDataName(dataName); + int row = baseMapper.insert(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(tableName, dataName); + List saveColumns = new ArrayList<>(); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + saveColumns.add(column); + } + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertBatch(saveColumns); + } + } + } + } catch (Exception e) { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + @DS("#dataName") + @Override + public List selectDbTableColumnsByName(String tableName, String dataName) { + Table table = ServiceProxy.metadata().table(tableName); + if (ObjectUtil.isNull(table)) { + return new ArrayList<>(); + } + LinkedHashMap columns = table.getColumns(); + List tableColumns = new ArrayList<>(); + columns.forEach((columnName, column) -> { + GenTableColumn tableColumn = new GenTableColumn(); + tableColumn.setIsPk(String.valueOf(column.isPrimaryKey())); + tableColumn.setColumnName(column.getName()); + tableColumn.setColumnComment(column.getComment()); + tableColumn.setColumnType(column.getOriginType().toLowerCase()); + tableColumn.setSort(column.getPosition()); + tableColumn.setIsRequired(column.isNullable() == 0 ? "1" : "0"); + tableColumn.setIsIncrement(column.isAutoIncrement() == -1 ? "0" : "1"); + tableColumns.add(tableColumn); + }); + return tableColumns; + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(Long tableId) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableId, zip); + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + @Override + public void generatorCode(Long tableId) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + FileUtils.writeUtf8String(sw.toString(), path); + } catch (Exception e) { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + @DSTransactional + @Override + public void synchDb(Long tableId) { + GenTable table = baseMapper.selectGenTableById(tableId); + List tableColumns = table.getColumns(); + Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); + + List dbTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + if (CollUtil.isEmpty(dbTableColumns)) { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = StreamUtils.toList(dbTableColumns, GenTableColumn::getColumnName); + + List saveColumns = new ArrayList<>(); + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + } + saveColumns.add(column); + }); + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertOrUpdateBatch(saveColumns); + } + List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName())); + if (CollUtil.isNotEmpty(delColumns)) { + List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId); + if (CollUtil.isNotEmpty(ids)) { + genTableColumnMapper.deleteByIds(ids); + } + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableIds) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableId : tableIds) { + generatorCode(Long.parseLong(tableId), zip); + } + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(Long tableId, ZipOutputStream zip) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString()); + IoUtil.close(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JsonUtils.toJsonString(genTable.getParams()); + Dict paramsObj = JsonUtils.parseMap(options); + if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_CODE))) { + throw new ServiceException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { + throw new ServiceException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_NAME))) { + throw new ServiceException("树名称字段不能为空"); + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (ObjectUtil.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + if (ObjectUtil.isNotNull(paramsObj)) { + String treeCode = paramsObj.getStr(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + Long parentMenuId = paramsObj.getLong(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} + diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java new file mode 100644 index 0000000..b2c20c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java @@ -0,0 +1,141 @@ +package org.dromara.generator.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; + +import java.util.List; +import java.util.Map; + +/** + * 业务 服务层 + * + * @author Lion Li + */ +public interface IGenTableService { + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames, String dataName); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + */ + void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + void importGenTable(List tableList, String dataName); + + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + List selectDbTableColumnsByName(String tableName, String dataName); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + byte[] downloadCode(Long tableId); + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + void generatorCode(Long tableId); + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + void synchDb(Long tableId); + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + byte[] downloadCode(String[] tableIds); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + void validateEdit(GenTable genTable); +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java new file mode 100644 index 0000000..6e111e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java @@ -0,0 +1,341 @@ +package org.dromara.generator.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import org.dromara.generator.constant.GenConstants; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.VelocityContext; + +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityUtils { + + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); + } + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList<>(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/bo.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + if (DataBaseHelper.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (DataBaseHelper.isPostgerSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else if (DataBaseHelper.isSqlServer()) { + templates.add("vm/sql/sqlserver/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } + templates.add("vm/ts/api.ts.vm"); + templates.add("vm/ts/types.ts.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("vo.java.vm")) { + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + } + if (template.contains("bo.java.vm")) { + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); + } + if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName); + } else if (template.contains("types.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + HashSet importList = new HashSet<>(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) { + importList.add("org.dromara.common.translation.annotation.Translation"); + importList.add("org.dromara.common.translation.constant.TransConstant"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet<>(); + addDicts(dicts, columns); + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(Map paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..fc1c610 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..78aa852 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + SELECT t.table_id, t.data_name, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark, + c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort + FROM gen_table t + LEFT JOIN gen_table_column c ON t.table_id = c.table_id + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm new file mode 100644 index 0000000..511d37c --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/bo.java.vm @@ -0,0 +1,50 @@ +package ${packageName}.domain.bo; + +import ${packageName}.domain.${ClassName}; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +#foreach ($import in $importList) +import ${import}; +#end + +/** + * ${functionName}业务对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ${ClassName}.class, reverseConvertGenerate = false) +public class ${ClassName}Bo extends BaseEntity { + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField) && ($column.query || $column.insert || $column.edit)) + /** + * $column.columnComment + */ +#if($column.insert && $column.edit) +#set($Group="AddGroup.class, EditGroup.class") +#elseif($column.insert) +#set($Group="AddGroup.class") +#elseif($column.edit) +#set($Group="EditGroup.class") +#end +#if($column.required) +#if($column.javaType == 'String') + @NotBlank(message = "$column.columnComment不能为空", groups = { $Group }) +#else + @NotNull(message = "$column.columnComment不能为空", groups = { $Group }) +#end +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..205fb73 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,60 @@ +package ${packageName}.domain; + +#foreach ($column in $columns) +#if($column.javaField=='tenantId') +#set($IsTenant=1) +#end +#end +#if($IsTenant==1) +import org.dromara.common.tenant.core.TenantEntity; +#else +import org.dromara.common.mybatis.core.domain.BaseEntity; +#end +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +#foreach ($import in $importList) +import ${import}; +#end + +import java.io.Serial; + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($IsTenant==1) +#set($Entity="TenantEntity") +#else +#set($Entity="BaseEntity") +#end +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("${tableName}") +public class ${ClassName} extends ${Entity} { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** + * $column.columnComment + */ +#if($column.javaField=='delFlag') + @TableLogic +#end +#if($column.javaField=='version') + @Version +#end +#if($column.isPk==1) + @TableId(value = "$column.columnName") +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..0922401 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,15 @@ +package ${packageName}.mapper; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.domain.vo.${ClassName}Vo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> { + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..4db9030 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,72 @@ +package ${packageName}.service; + +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +#if($table.crud) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +#end + +import java.util.Collection; +import java.util.List; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service { + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} 主键 + * @return ${functionName} + */ + ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); + +#if($table.crud) + /** + * 分页查询${functionName}列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return ${functionName}分页列表 + */ + TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); +#end + + /** + * 查询符合条件的${functionName}列表 + * + * @param bo 查询条件 + * @return ${functionName}列表 + */ + List<${ClassName}Vo> queryList(${ClassName}Bo bo); + + /** + * 新增${functionName} + * + * @param bo ${functionName} + * @return 是否新增成功 + */ + Boolean insertByBo(${ClassName}Bo bo); + + /** + * 修改${functionName} + * + * @param bo ${functionName} + * @return 是否修改成功 + */ + Boolean updateByBo(${ClassName}Bo bo); + + /** + * 校验并批量删除${functionName}信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..48cc8b1 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,158 @@ +package ${packageName}.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +#if($table.crud) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +#end +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.${ClassName}; +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.service.I${ClassName}Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@RequiredArgsConstructor +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service { + + private final ${ClassName}Mapper baseMapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} 主键 + * @return ${functionName} + */ + @Override + public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ + return baseMapper.selectVoById(${pkColumn.javaField}); + } + +#if($table.crud) + /** + * 分页查询${functionName}列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return ${functionName}分页列表 + */ + @Override + public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { + LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + Page<${ClassName}Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } +#end + + /** + * 查询符合条件的${functionName}列表 + * + * @param bo 查询条件 + * @return ${functionName}列表 + */ + @Override + public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { + LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); +#foreach($column in $columns) +#if($column.query) +#set($queryType=$column.queryType) +#set($javaField=$column.javaField) +#set($javaType=$column.javaType) +#set($columnName=$column.columnName) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($mpMethod=$column.queryType.toLowerCase()) +#if($queryType != 'BETWEEN') +#if($javaType == 'String') +#set($condition='StringUtils.isNotBlank(bo.get'+$AttrName+'())') +#else +#set($condition='bo.get'+$AttrName+'() != null') +#end + lqw.$mpMethod($condition, ${ClassName}::get$AttrName, bo.get$AttrName()); +#else + lqw.between(params.get("begin$AttrName") != null && params.get("end$AttrName") != null, + ${ClassName}::get$AttrName ,params.get("begin$AttrName"), params.get("end$AttrName")); +#end +#end +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#if($column.isPk==1) + lqw.orderByAsc(${ClassName}::get$AttrName); +#end +#end + return lqw; + } + + /** + * 新增${functionName} + * + * @param bo ${functionName} + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(${ClassName}Bo bo) { + ${ClassName} add = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; +#set($pk=$pkColumn.javaField.substring(0,1).toUpperCase() + ${pkColumn.javaField.substring(1)}) + if (flag) { + bo.set$pk(add.get$pk()); + } + return flag; + } + + /** + * 修改${functionName} + * + * @param bo ${functionName} + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(${ClassName}Bo bo) { + ${ClassName} update = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(${ClassName} entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除${functionName}信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm new file mode 100644 index 0000000..5591f97 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm @@ -0,0 +1,66 @@ +package ${packageName}.domain.vo; + +#foreach ($import in $importList) +import ${import}; +#end +import ${packageName}.domain.${ClassName}; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * ${functionName}视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ${ClassName}.class) +public class ${ClassName}Vo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if(${column.dictType} && ${column.dictType} != '') + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "${column.dictType}") +#elseif($parentheseIndex != -1) + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") +#else + @ExcelProperty(value = "${comment}") +#end + private $column.javaType $column.javaField; + +#if($column.htmlType == "imageUpload") + /** + * ${column.columnComment}Url + */ + @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "${column.javaField}") + private String ${column.javaField}Url; +#end +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm new file mode 100644 index 0000000..f6638be --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate, null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate, null, null, ''); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm new file mode 100644 index 0000000..0923392 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm @@ -0,0 +1,20 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, now(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, now(), null, null, ''); + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..01824c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate(), null, null, ''); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm new file mode 100644 index 0000000..bdf166e --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, getdate(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, getdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, getdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, getdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, getdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, getdate(), null, null, ''); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm new file mode 100644 index 0000000..3aa4a5f --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/api.ts.vm @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { ${BusinessName}VO, ${BusinessName}Form, ${BusinessName}Query } from '@/api/${moduleName}/${businessName}/types'; + +/** + * 查询${functionName}列表 + * @param query + * @returns {*} + */ + +export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<${BusinessName}VO[]> => { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }); +}; + +/** + * 查询${functionName}详细 + * @param ${pkColumn.javaField} + */ +export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }); +}; + +/** + * 新增${functionName} + * @param data + */ +export const add${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }); +}; + +/** + * 修改${functionName} + * @param data + */ +export const update${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }); +}; + +/** + * 删除${functionName} + * @param ${pkColumn.javaField} + */ +export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array) => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }); +}; diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..caf3472 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,498 @@ + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..a92d19a --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,459 @@ + + + diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..9fb48d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml new file mode 100644 index 0000000..b022088 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -0,0 +1,52 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + jar + ruoyi-job + + + 任务调度 + + + + + + + org.dromara + ruoyi-common-json + + + + org.dromara + ruoyi-common-job + + + com.pdd + com.pdd + 1.92.52 + compile + + + com.github.therapi + therapi-runtime-javadoc + + + com.google.code.gson + gson + + + org.dromara + ruoyi-zhishu + + + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/domains/ShopOrderVO.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/domains/ShopOrderVO.java new file mode 100644 index 0000000..4e84b18 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/domains/ShopOrderVO.java @@ -0,0 +1,17 @@ +package org.dromara.job.domains; + +import lombok.Data; + +import java.util.List; + +@Data +public class ShopOrderVO { + + private Integer page; + + private Integer mallId;//店铺id + + private String shopName;//店铺名称 + + private String accessToken; +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/mapper/ShopOrderDetailMapper.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/mapper/ShopOrderDetailMapper.java new file mode 100644 index 0000000..1646c68 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/mapper/ShopOrderDetailMapper.java @@ -0,0 +1,10 @@ +package org.dromara.job.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.TShopOrderDetail; +import org.dromara.zhishu.domain.vo.TShopOrderDetailVo; + + +public interface ShopOrderDetailMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/impl/PddServiceImpl.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/impl/PddServiceImpl.java new file mode 100644 index 0000000..82f3555 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/impl/PddServiceImpl.java @@ -0,0 +1,1121 @@ +package org.dromara.job.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.gson.*; +import com.google.j2objc.annotations.LoopTranslation; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddOrderListGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddOrderNumberListIncrementGetRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddOrderListGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddOrderNumberListIncrementGetResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.aspectj.weaver.Utils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.job.mapper.ShopOrderDetailMapper; +import org.dromara.job.mapper.ShopOrderMapper; +import org.dromara.job.service.IPddService; +import org.dromara.zhishu.domain.TShopOrder; +import org.dromara.zhishu.domain.TShopOrderDetail; +import org.dromara.zhishu.enums.PddOrderEnum; +import org.dromara.zhishu.enums.PddResCodeEnum; +import org.dromara.zhishu.util.JsonObjUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.dromara.job.domains.ShopOrderVO; + + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@RequiredArgsConstructor +@Log4j2 +@Service("pddJobServiceImpl") +public class PddServiceImpl implements IPddService { + + private final ShopOrderMapper shopOrderMapper; + private final ShopOrderDetailMapper shopOrderDetailMapper; + + //同步三个月以内历史订单(根据成交时间) + @Override + @Transactional(rollbackFor = Exception.class) + public void getConfirmOrderList(ShopOrderVO orderVO) throws Exception { + //todo 租户编码暂时写死tenant_id 000000 + String clientId = "203c5a7ba8bd4b8488d5e26f93052642"; + String clientSecret = "892ffaa86e12b7a3d8d2942b669d9aa520ad8179"; +// String accessToken = "6778e421d0ac477e81fb009418ca8f056842cba0"; + PopClient client = new PopHttpClient(clientId, clientSecret); + + PddOrderListGetRequest request = new PddOrderListGetRequest(); + + //获取日期,遍历三个月内时间作比较,查询近三个月每一天的订单 + + //当前日期 + LocalDate today = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + today = LocalDate.parse(today.format(formatter), formatter); + + LocalDate threeMonthsAgo = today.minusMonths(3); + System.out.println("------------------三月前的日期"+threeMonthsAgo+"--------------"); + + + QueryWrapper orderQueryWrapper = new QueryWrapper<>(); + orderQueryWrapper.select("DISTINCT DATE(confirm_time) as confirm_date") + .groupBy("DATE(confirm_time)"); + + List shopOrderList = shopOrderMapper.selectObjs(orderQueryWrapper); + + // 遍历三个月里的每一天 + LocalDate currentDate = threeMonthsAgo; + + String formattedDate = ""; + + while (!currentDate.isAfter(today)) { + + formattedDate = currentDate.format(DateTimeFormatter.ISO_DATE); + + // 检查 shopOrderList 中是否包含当前日期 + boolean dateExists = false; + for (Object orderDate : shopOrderList) { + if (orderDate != null && orderDate.toString().contains(formattedDate)) { + dateExists = true; + break; + } + } + + // 如果当前日期不在 shopOrderList 中,停止遍历 + if (!dateExists) { + System.out.println("日期 " + formattedDate + " 不在订单列表中,停止遍历。"); + break; + } + + // 继续遍历下一天 + currentDate = currentDate.plusDays(1); + } + + //时间戳转换 + LocalDate date = LocalDate.parse(formattedDate, DateTimeFormatter.ISO_DATE); + + // 指定时区(例如 UTC 或 Asia/Shanghai) + ZoneId zone = ZoneId.of("Asia/Shanghai"); // 或 + + // 获取当天的开始时间 (00:00:00) + LocalDateTime startOfDay = date.atStartOfDay(); + long startTimestamp = startOfDay.atZone(zone).toEpochSecond(); // 以秒为单位 + + // 获取当天的结束时间 (23:59:59) + LocalDateTime endOfDay = date.atTime(23, 59, 59); + long endTimestamp = endOfDay.atZone(zone).toEpochSecond(); // 以秒为单位 + + System.out.println("--------开始时间:"+startTimestamp+"-------结束时间:"+endTimestamp); + + request.setStartConfirmAt(startTimestamp); + request.setEndConfirmAt(endTimestamp); + request.setOrderStatus(5); + if (ObjectUtils.isNotEmpty(orderVO.getPage())){ + request.setPage(orderVO.getPage()); + } +// request.setPage(page);默认1 +// request.setPageSize(100);默认100 + request.setRefundStatus(5); + request.setTradeType(0); + request.setUseHasNext(true); + PddOrderListGetResponse response = client.syncInvoke(request, orderVO.getAccessToken()); + System.out.println(JsonUtil.transferToJson(response)); + String res = JsonUtil.transferToJson(response); + Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); + //字符串转换成对象 + JsonObject obj = gson.fromJson(res, JsonObject.class); + + if (ObjectUtils.isNotEmpty(obj.getAsJsonObject("error_response"))){ + JsonObject error_response = obj.getAsJsonObject("error_response"); + log.error( "数据异常" +error_response.get("error_msg").toString()); + return; + } + + // 获取根对象 + JsonObject object = obj.getAsJsonObject("order_list_get_response"); + + // 获取 has_next 字段 + boolean hasNext = object.get("has_next").getAsBoolean(); + System.out.println("Has next: " + hasNext); + +// int total_count = object.get("total_count").getAsInt(); +// if (total_count == 0){ +// log.info("日期:"+formattedDate+"此天无订单"); +// TShopOrder order = new TShopOrder(); +// order.setConfirmTime(formattedDate); +// shopOrderMapper.insert(order); +// } + + // 获取 order_list 数组 + JsonArray orderList = object.getAsJsonArray("order_list"); + + if (ObjectUtils.isEmpty(orderList)){ + log.info("日期:"+formattedDate+"此天无订单"); + if ( !today.toString().equals(formattedDate)){ + TShopOrder order = new TShopOrder(); + order.setConfirmTime(formattedDate); + shopOrderMapper.insert(order); + } + } + + // 遍历订单列表 + for (JsonElement orderElement : orderList) { + JsonObject order = orderElement.getAsJsonObject(); + + + // 提取订单字段 + //根据订单编号判断 + String orderSn = order.get("order_sn").getAsString(); + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("order_sn", orderSn); + + TShopOrder shopOrder = shopOrderMapper.selectOne(queryWrapper); + if (ObjectUtils.isEmpty(shopOrder)){ + shopOrder = new TShopOrder(); + shopOrder.setOrderSn(orderSn); + } + + //todo地址-加密 + String address = order.get("address").getAsString(); +// shopOrder.setAddress(address); + + //地址 + String addressMask = order.get("address_mask").getAsString(); + shopOrder.setAddressMask(addressMask); + + //售后状态 + int afterSalesStatus = order.get("after_sales_status").getAsInt(); + shopOrder.setAfterSalesStatus(afterSalesStatus); + + //买家留言信息 + String buyerMemo = order.get("buyer_memo").getAsString(); + shopOrder.setBuyerMemo(buyerMemo); + + //成交状态 + int confirmStatus = order.get("confirm_status").getAsInt(); + shopOrder.setConfirmStatus(confirmStatus); + + //成交时间 + String confirmTime = order.get("confirm_time").getAsString(); + shopOrder.setConfirmTime(confirmTime); + + //订单创建时间 + String createdTime = order.get("created_time").getAsString(); + shopOrder.setCreatedTime(createdTime); + + //是否当日发货: 1-是,0-否 + int deliveryOneDay = order.get("delivery_one_day").getAsInt(); + if (deliveryOneDay == 1){ + shopOrder.setDeliveryOneDay("是"); + } + if (deliveryOneDay == 0){ + shopOrder.setDeliveryOneDay("否"); + } + + //折扣金额 + double discountAmount = order.get("discount_amount").getAsDouble(); + shopOrder.setDiscountAmount(new BigDecimal(discountAmount)); + + //多多支付立减金额 + if (ObjectUtils.isNotEmpty(order.get("duo_duo_pay_reduction"))){ + double duoDuoPayReduction = order.get("duo_duo_pay_reduction").getAsDouble(); + shopOrder.setDuoDuoPayReduction(new BigDecimal(duoDuoPayReduction)); + } + + + //是否多多批发 + int duoduoWholesale = order.get("duoduo_wholesale").getAsInt(); + shopOrder.setDuoduoWholesale(duoduoWholesale); + + //商品金额 + double goodsAmount = order.get("goods_amount").getAsDouble(); + shopOrder.setGoodsAmount(new BigDecimal(goodsAmount)); + + //仓库编码 + if (ObjectUtils.isNotEmpty(order.get("depot_code"))){ + String depotCode = order.get("depot_code").getAsString(); + shopOrder.setDepotCode(depotCode); + } + + + //仓库信息 + if (ObjectUtils.isNotEmpty(order.get("order_depot_info"))){ + Object orderDepotInfo = order.get("order_depot_info"); + shopOrder.setOrderDepotInfo(String.valueOf(orderDepotInfo)); + } + + //仓库id + if (ObjectUtils.isNotEmpty(order.get("depot_id"))){ + long depotId = order.get("depot_id").getAsLong(); + shopOrder.setDepotId(String.valueOf(depotId)); + } + + //仓库名称 + if (ObjectUtils.isNotEmpty(order.get("depot_name"))){ + + String depotName = order.get("depot_name").getAsString(); + shopOrder.setDepotName(depotName); + } + + //仓库类型 + if (ObjectUtils.isNotEmpty(order.get("depot_type"))){ + int depotType = order.get("depot_type").getAsInt(); + shopOrder.setDepotType(depotType); + } + + //货品id + if (ObjectUtils.isNotEmpty(order.get("ware_id"))){ + long wareId = order.get("ware_id").getAsLong(); + shopOrder.setWareId(wareId); + } + + + //货品名称 + if (ObjectUtils.isNotEmpty(order.get("ware_name"))){ + String wareName = order.get("ware_name").getAsString(); + shopOrder.setWareName(wareName); + } + + + //货品编码 + if (ObjectUtils.isNotEmpty(order.get("ware_sn"))){ + String wareSn = order.get("ware_sn").getAsString(); + shopOrder.setWareSn(wareSn); + } + + + //货品类型 + if (ObjectUtils.isNotEmpty(order.get("ware_type"))){ + int wareType = order.get("ware_type").getAsInt(); + shopOrder.setWareType(wareType); + } + + + //订单状态 + int orderStatus = order.get("order_status").getAsInt(); + shopOrder.setOrderStatus(orderStatus); + + //支付金额 + double payAmount = order.get("pay_amount").getAsDouble(); + shopOrder.setPayAmount(new BigDecimal(payAmount)); + + //支付单号 + if (ObjectUtils.isNotEmpty(order.get("pay_no"))){ + String payNo = order.get("pay_no").getAsString(); + shopOrder.setPayNo(payNo); + } + + //支付时间 + String payTime = order.get("pay_time").getAsString(); + shopOrder.setPayTime(payTime); + + //支付方式 + String payType = order.get("pay_type").getAsString(); + shopOrder.setPayType(payType); + + //平台优惠金额 + double platformDiscount = order.get("platform_discount").getAsDouble(); + shopOrder.setPlatformDiscount(new BigDecimal(platformDiscount)); + + //邮费 + double postage = order.get("postage").getAsDouble(); + shopOrder.setPostage(new BigDecimal(postage)); + + //预售时间 + String preSaleTime = order.get("pre_sale_time").getAsString(); + shopOrder.setPreSaleTime(preSaleTime); + + //承诺送达时间 + if (ObjectUtils.isNotEmpty(order.get("promise_delivery_time"))){ + String promiseDeliveryTime = order.get("promise_delivery_time").getAsString(); + shopOrder.setPromiseDeliveryTime(promiseDeliveryTime); + } + + //省份 + String province = order.get("province").getAsString(); + shopOrder.setProvince(province); + + //省份编码 + String provinceId = order.get("province_id").getAsString(); + shopOrder.setProvinceId(provinceId); + + //确认收货时间 + if (ObjectUtils.isNotEmpty(order.get("receive_time"))){ + String receiveTime = order.get("receive_time").getAsString(); + shopOrder.setReceiveTime(receiveTime); + } + + //收件人地址 + String receiverAddress = order.get("receiver_address").getAsString(); + shopOrder.setReceiverAddress(receiverAddress); + + //收件人地址(打码) + String receiverAddressMask = order.get("receiver_address_mask").getAsString(); + shopOrder.setReceiverAddressMask(receiverAddressMask); + + //收件人姓名 + String receiverName = order.get("receiver_name").getAsString(); + shopOrder.setReceiverName(receiverName); + + //收件人姓名 + String receiverNameMask = order.get("receiver_name_mask").getAsString(); + shopOrder.setReceiverNameMask(receiverNameMask); + + //收件人手机号 + String receiverPhone = order.get("receiver_phone").getAsString(); + shopOrder.setReceiverPhone(receiverPhone); + + //收件人手机号(打码) + String receiverPhoneMask = order.get("receiver_phone_mask").getAsString(); + shopOrder.setReceiverPhoneMask(receiverPhoneMask); + + //售后状态 + int refundStatus = order.get("refund_status").getAsInt(); + shopOrder.setRefundStatus(refundStatus); + + //订单备注 + String remark = order.get("remark").getAsString(); + shopOrder.setRemark(remark); + + //订单备注标记 + if (ObjectUtils.isNotEmpty(order.get("remark_tag"))){ + String remarkTag = order.get("remark_tag").getAsString(); + String remarkTagColor; + switch (remarkTag) { + case "1": + remarkTagColor = "红色"; + break; + case "2": + remarkTagColor = "黄色"; + break; + case "3": + remarkTagColor = "绿色"; + break; + case "4": + remarkTagColor = "蓝色"; + break; + case "5": + remarkTagColor = "紫色"; + break; + default: + remarkTagColor = "未知颜色"; + break; + } + shopOrder.setRemarkTag(remarkTagColor); + } + + + //订单备注标记名称 + if (ObjectUtils.isNotEmpty(order.get("remark_tag_name"))) { + String remarkTagName = order.get("remark_tag_name").getAsString(); + shopOrder.setRemarkTagName(remarkTagName); + } + + //退货包运费 + Integer returnFreightPayer = order.get("return_freight_payer").getAsInt(); + shopOrder.setReturnFreightPayer(returnFreightPayer); + + //订单审核状态 + Integer riskControlStatus = order.get("risk_control_status").getAsInt(); + shopOrder.setRiskControlStatus(riskControlStatus); + + //是否门店自提 + Integer selfContained = order.get("self_contained").getAsInt(); + shopOrder.setSelfContained(selfContained); + + //商家优惠金额 + BigDecimal sellerDiscount = new BigDecimal(order.get("seller_discount").getAsString()); + shopOrder.setSellerDiscount(sellerDiscount); + + //缺货处理状态 + Integer stockOutHandleStatus = order.get("stock_out_handle_status").getAsInt(); + shopOrder.setStockOutHandleStatus(stockOutHandleStatus); + + //全国联保 + Integer supportNationwideWarranty = order.get("support_nationwide_warranty").getAsInt(); + shopOrder.setSupportNationwideWarranty(supportNationwideWarranty); + + //区,乡镇 + String town = order.get("town").getAsString(); + shopOrder.setTown(town); + + //区县编码 + String townId = order.get("town_id").getAsString(); + shopOrder.setTownId(townId); + + //快递单号 + String trackingNumber = order.get("tracking_number").getAsString(); + shopOrder.setTrackingNumber(trackingNumber); + + //以旧换新国家补贴金额 + if (ObjectUtils.isNotEmpty(order.get("trade_in_national_subsidy_amount"))){ + double tradeInNationalSubsidyAmount = order.get("trade_in_national_subsidy_amount").getAsDouble(); + shopOrder.setTradeInNationalSubsidyAmount(new BigDecimal(tradeInNationalSubsidyAmount)); + } + + //订单类型 + int tradeType = order.get("trade_type").getAsInt(); + shopOrder.setTradeType(tradeType); + + //订单的更新时间 + if (ObjectUtils.isNotEmpty(order.get("updated_at"))) { + String updatedAt = order.get("updated_at").getAsString(); + shopOrder.setUpdatedAt(updatedAt); + } + + + //催发货时间 + if (ObjectUtils.isNotEmpty(order.get("urge_shipping_time"))) { + String urgeShippingTime = order.get("urge_shipping_time").getAsString(); + shopOrder.setUrgeShippingTime(urgeShippingTime); + } + + + //预约配送日期 + if (ObjectUtils.isNotEmpty(order.get("yyps_date"))) { + String yypsDate = order.get("yyps_date").getAsString(); + shopOrder.setYypsDate(yypsDate); + } + + + //预约配送时段 + if (ObjectUtils.isNotEmpty(order.get("yyps_time"))) { + String yypsTime = order.get("yyps_time").getAsString(); + shopOrder.setYypsTime(yypsTime); + } + + + //合单ID2 + if (ObjectUtils.isNotEmpty(order.get("open_address_id2"))){ + String openAddressId2 = order.get("open_address_id2").getAsString(); + shopOrder.setOpenAddressId2(openAddressId2); + } + + //商品信息列表 + Object itemList = order.get("item_list"); + shopOrder.setItemList(String.valueOf(itemList)); + + + //店铺名称 + shopOrder.setShopName(orderVO.getShopName()); + //店铺id + shopOrder.setShopId(String.valueOf(orderVO.getMallId())); + + //todo 租户编码写死 + shopOrder.setTenantId("000000"); +// String city = order.get("city").getAsString(); +// shopOrder.setCity(city); +// +// int cityId = order.get("city_id").getAsInt(); +// shopOrder.setCityId(cityId); + + // 快递公司编号 +// int logisticsId = order.get("logistics_id").getAsInt(); +// shopOrder.setLogisticsId(logisticsId); + + //是否顺丰包邮,1-是 0-否 +// int freeSf = order.get("free_sf").getAsInt(); +// shopOrder.setFreeSf(freeSf); + //是否缺货 0-无缺货处理 1: 有缺货处理 +// int isStockOut = order.get("is_stock_out").getAsInt(); +// shopOrder.setIsStockOut(isStockOut); + + + if (ObjectUtils.isNotEmpty(shopOrder.getId())){ + shopOrderMapper.updateById(shopOrder); + }else { + shopOrderMapper.insert(shopOrder); + } + + JsonArray orderItemList = order.getAsJsonArray("item_list"); + + if (ObjectUtils.isNotEmpty(orderItemList)) { + //遍历商品详情 + for (JsonElement orderItem : orderItemList) { + JsonObject item = orderItem.getAsJsonObject(); + + QueryWrapper detailQueryWrapper = new QueryWrapper<>(); + detailQueryWrapper.eq("order_id", shopOrder.getId()); + TShopOrderDetail detail = shopOrderDetailMapper.selectOne(detailQueryWrapper); + + if (ObjectUtils.isEmpty(detail)) { + detail = new TShopOrderDetail(); + detail.setOrderId(shopOrder.getId()); + detail.setOrderSn(shopOrder.getOrderSn()); + } + + int goodsCount = item.get("goods_count").getAsInt(); + detail.setGoodsCount(goodsCount); + + String goodsId = item.get("goods_id").getAsString(); + detail.setGoodsId(goodsId); + + String goodsImg = item.get("goods_img").getAsString(); + detail.setGoodsImg(goodsImg); + + String goodsName = item.get("goods_name").getAsString(); + detail.setGoodsName(goodsName); + + double goodsPrice = item.get("goods_price").getAsDouble(); + detail.setGoodsPrice(new BigDecimal(goodsPrice)); + + String goodsSpec = item.get("goods_spec").getAsString(); + detail.setGoodsSpec(goodsSpec); + + String outerGoodsId = item.get("outer_goods_id").getAsString(); + detail.setOuterGoodsId(outerGoodsId); + + String outerId = item.get("outer_id").getAsString(); + detail.setOuterId(outerId); + + String skuId = item.get("sku_id").getAsString(); + detail.setSkuId(skuId); + + //店铺名称 + detail.setShopName(orderVO.getShopName()); + //店铺id + detail.setShopId(String.valueOf(orderVO.getMallId())); + + detail.setTenantId("000000"); + + if (ObjectUtils.isEmpty(detail.getId())) { + shopOrderDetailMapper.insert(detail); + } else { + shopOrderDetailMapper.updateById(detail); + } + } + } + + } + + // 获取 has_next 字段 + boolean next = object.get("has_next").getAsBoolean(); + + if (next){ + orderVO.setPage(orderVO.getPage() + 1); + getConfirmOrderList(orderVO); + } + } + + //订单增量接口(时间跨度为30分钟) + @Override + public void getNowOrderList(ShopOrderVO orderVO) throws Exception { + + + String clientId = "203c5a7ba8bd4b8488d5e26f93052642"; + String clientSecret = "892ffaa86e12b7a3d8d2942b669d9aa520ad8179"; +// String accessToken = orderVO.getAccessToken(); + PopClient client = new PopHttpClient(clientId, clientSecret); + + //设置时间 end_updated_at - start_updated_at<= 30min + // 获取当前时间 + LocalDateTime now = LocalDateTime.now(); + + // 指定时区(例如 UTC 或 Asia/Shanghai) + ZoneId zone = ZoneId.of("Asia/Shanghai"); + + // 获取三十分钟之前的时间 + LocalDateTime tenMinutesAgo = now.minusMinutes(20); + + // 将当前时间转换为 UNIX 时间戳(秒) + long nowTimestamp = now.atZone(zone).toEpochSecond(); + + // 将三十分钟之前的时间转换为 UNIX 时间戳(秒) + long tenMinutesAgoTimestamp = tenMinutesAgo.atZone(zone).toEpochSecond(); + + System.out.println("开始时间----------"+nowTimestamp+":"+now); + System.out.println("结束时间----------"+tenMinutesAgoTimestamp+":"+tenMinutesAgo); + + PddOrderNumberListIncrementGetRequest request = new PddOrderNumberListIncrementGetRequest(); + + request.setStartUpdatedAt(tenMinutesAgoTimestamp);//开始时间 + request.setEndUpdatedAt(nowTimestamp);//结束时间 + + request.setIsLuckyFlag(0);//订单类型(是否抽奖订单),0-全部,1-非抽奖订单,2-抽奖订单 + request.setOrderStatus(5);//发货状态,1-待发货,2-已发货待签收,3-已签收,5-全部 + request.setRefundStatus(5);//售后状态,1-无售后或售后关闭,2-售后处理中,3-退款中,4-退款成功 5-全部 + request.setUseHasNext(true); + +// request.setTradeType(1);//订单类型: 0-普通订单、1-定金订单 不传为全部 +// request.setPage(1);//默认1 +// request.setPageSize(1);//默认100 + + System.out.println(JsonUtil.transferToJson(request)); + + PddOrderNumberListIncrementGetResponse response = client.syncInvoke(request, orderVO.getAccessToken()); + System.out.println(JsonUtil.transferToJson(response)); + + + + String res = JsonUtil.transferToJson(response); + Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); + //字符串转换成对象 + JsonObject obj = gson.fromJson(res, JsonObject.class); + + if (ObjectUtils.isNotEmpty(obj.getAsJsonObject("error_response"))){ + JsonObject error_response = obj.getAsJsonObject("error_response"); + log.error( "数据异常" +error_response.get("error_msg").toString()); + return; + } + + // 获取根对象 + JsonObject object = obj.getAsJsonObject("order_sn_increment_get_response"); + + // 获取 has_next 字段 + boolean hasNext = object.get("has_next").getAsBoolean(); + System.out.println("Has next: " + hasNext); + + + // 获取 order_list 数组 + JsonArray orderList = object.getAsJsonArray("order_sn_list"); + + // 遍历订单列表 + for (JsonElement orderElement : orderList) { + JsonObject order = orderElement.getAsJsonObject(); + + + // 提取订单字段 + //根据订单编号判断 + String orderSn = order.get("order_sn").getAsString(); + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("order_sn", orderSn); + + TShopOrder shopOrder = shopOrderMapper.selectOne(queryWrapper); + if (ObjectUtils.isEmpty(shopOrder)){ + shopOrder = new TShopOrder(); + shopOrder.setOrderSn(orderSn); + } + + //todo地址 加密 + String address = order.get("address").getAsString(); +// shopOrder.setAddress(address); + + //地址 + String addressMask = order.get("address_mask").getAsString(); + shopOrder.setAddressMask(addressMask); + + //售后状态 + int afterSalesStatus = order.get("after_sales_status").getAsInt(); + shopOrder.setAfterSalesStatus(afterSalesStatus); + + //买家留言信息 + String buyerMemo = order.get("buyer_memo").getAsString(); + shopOrder.setBuyerMemo(buyerMemo); + + //成交状态 + int confirmStatus = order.get("confirm_status").getAsInt(); + shopOrder.setConfirmStatus(confirmStatus); + + //成交时间 + String confirmTime = order.get("confirm_time").getAsString(); + shopOrder.setConfirmTime(confirmTime); + + //订单创建时间 + String createdTime = order.get("created_time").getAsString(); + shopOrder.setCreatedTime(createdTime); + + //是否当日发货: 1-是,0-否 + int deliveryOneDay = order.get("delivery_one_day").getAsInt(); + if (deliveryOneDay == 1){ + shopOrder.setDeliveryOneDay("是"); + } + if (deliveryOneDay == 0){ + shopOrder.setDeliveryOneDay("否"); + } + + //折扣金额 + double discountAmount = order.get("discount_amount").getAsDouble(); + shopOrder.setDiscountAmount(new BigDecimal(discountAmount)); + + //多多支付立减金额 + if (ObjectUtils.isNotEmpty(order.get("duo_duo_pay_reduction"))){ + double duoDuoPayReduction = order.get("duo_duo_pay_reduction").getAsDouble(); + shopOrder.setDuoDuoPayReduction(new BigDecimal(duoDuoPayReduction)); + } + + + //是否多多批发 + int duoduoWholesale = order.get("duoduo_wholesale").getAsInt(); + shopOrder.setDuoduoWholesale(duoduoWholesale); + + //商品金额 + double goodsAmount = order.get("goods_amount").getAsDouble(); + shopOrder.setGoodsAmount(new BigDecimal(goodsAmount)); + + //仓库编码 + if (ObjectUtils.isNotEmpty(order.get("depot_code"))){ + String depotCode = order.get("depot_code").getAsString(); + shopOrder.setDepotCode(depotCode); + } + + + //仓库信息 + if (ObjectUtils.isNotEmpty(order.get("order_depot_info"))){ + Object orderDepotInfo = order.get("order_depot_info"); + shopOrder.setOrderDepotInfo(String.valueOf(orderDepotInfo)); + } + + //仓库id + if (ObjectUtils.isNotEmpty(order.get("depot_id"))){ + long depotId = order.get("depot_id").getAsLong(); + shopOrder.setDepotId(String.valueOf(depotId)); + } + + //仓库名称 + if (ObjectUtils.isNotEmpty(order.get("depot_name"))){ + + String depotName = order.get("depot_name").getAsString(); + shopOrder.setDepotName(depotName); + } + + //仓库类型 + if (ObjectUtils.isNotEmpty(order.get("depot_type"))){ + int depotType = order.get("depot_type").getAsInt(); + shopOrder.setDepotType(depotType); + } + + //货品id + if (ObjectUtils.isNotEmpty(order.get("ware_id"))){ + long wareId = order.get("ware_id").getAsLong(); + shopOrder.setWareId(wareId); + } + + + //货品名称 + if (ObjectUtils.isNotEmpty(order.get("ware_name"))){ + String wareName = order.get("ware_name").getAsString(); + shopOrder.setWareName(wareName); + } + + + //货品编码 + if (ObjectUtils.isNotEmpty(order.get("ware_sn"))){ + String wareSn = order.get("ware_sn").getAsString(); + shopOrder.setWareSn(wareSn); + } + + + //货品类型 + if (ObjectUtils.isNotEmpty(order.get("ware_type"))){ + int wareType = order.get("ware_type").getAsInt(); + shopOrder.setWareType(wareType); + } + + + //订单状态 + int orderStatus = order.get("order_status").getAsInt(); + shopOrder.setOrderStatus(orderStatus); + + //支付金额 + double payAmount = order.get("pay_amount").getAsDouble(); + shopOrder.setPayAmount(new BigDecimal(payAmount)); + + //支付单号 + if (ObjectUtils.isNotEmpty(order.get("pay_no"))){ + String payNo = order.get("pay_no").getAsString(); + shopOrder.setPayNo(payNo); + } + + //支付时间 + String payTime = order.get("pay_time").getAsString(); + shopOrder.setPayTime(payTime); + + //支付方式 + String payType = order.get("pay_type").getAsString(); + shopOrder.setPayType(payType); + + //平台优惠金额 + double platformDiscount = order.get("platform_discount").getAsDouble(); + shopOrder.setPlatformDiscount(new BigDecimal(platformDiscount)); + + //邮费 + double postage = order.get("postage").getAsDouble(); + shopOrder.setPostage(new BigDecimal(postage)); + + //预售时间 + String preSaleTime = order.get("pre_sale_time").getAsString(); + shopOrder.setPreSaleTime(preSaleTime); + + //承诺送达时间 + if (ObjectUtils.isNotEmpty(order.get("promise_delivery_time"))){ + String promiseDeliveryTime = order.get("promise_delivery_time").getAsString(); + shopOrder.setPromiseDeliveryTime(promiseDeliveryTime); + } + + //省份 + String province = order.get("province").getAsString(); + shopOrder.setProvince(province); + + //省份编码 + String provinceId = order.get("province_id").getAsString(); + shopOrder.setProvinceId(provinceId); + + //确认收货时间 + if (ObjectUtils.isNotEmpty(order.get("receive_time"))){ + String receiveTime = order.get("receive_time").getAsString(); + shopOrder.setReceiveTime(receiveTime); + } + + //收件人地址 + String receiverAddress = order.get("receiver_address").getAsString(); + shopOrder.setReceiverAddress(receiverAddress); + + //收件人地址(打码) + String receiverAddressMask = order.get("receiver_address_mask").getAsString(); + shopOrder.setReceiverAddressMask(receiverAddressMask); + + //收件人姓名 + String receiverName = order.get("receiver_name").getAsString(); + shopOrder.setReceiverName(receiverName); + + //收件人姓名 + String receiverNameMask = order.get("receiver_name_mask").getAsString(); + shopOrder.setReceiverNameMask(receiverNameMask); + + //收件人手机号 + String receiverPhone = order.get("receiver_phone").getAsString(); + shopOrder.setReceiverPhone(receiverPhone); + + //收件人手机号(打码) + String receiverPhoneMask = order.get("receiver_phone_mask").getAsString(); + shopOrder.setReceiverPhoneMask(receiverPhoneMask); + + //售后状态 + int refundStatus = order.get("refund_status").getAsInt(); + shopOrder.setRefundStatus(refundStatus); + + //订单备注 + String remark = order.get("remark").getAsString(); + shopOrder.setRemark(remark); + + //订单备注标记 + if (ObjectUtils.isNotEmpty(order.get("remark_tag"))){ + String remarkTag = order.get("remark_tag").getAsString(); + String remarkTagColor; + switch (remarkTag) { + case "1": + remarkTagColor = "红色"; + break; + case "2": + remarkTagColor = "黄色"; + break; + case "3": + remarkTagColor = "绿色"; + break; + case "4": + remarkTagColor = "蓝色"; + break; + case "5": + remarkTagColor = "紫色"; + break; + default: + remarkTagColor = "未知颜色"; + break; + } + shopOrder.setRemarkTag(remarkTagColor); + } + + + //订单备注标记名称 + if (ObjectUtils.isNotEmpty(order.get("remark_tag_name"))) { + String remarkTagName = order.get("remark_tag_name").getAsString(); + shopOrder.setRemarkTagName(remarkTagName); + } + + //退货包运费 + Integer returnFreightPayer = order.get("return_freight_payer").getAsInt(); + shopOrder.setReturnFreightPayer(returnFreightPayer); + + //订单审核状态 + Integer riskControlStatus = order.get("risk_control_status").getAsInt(); + shopOrder.setRiskControlStatus(riskControlStatus); + + //是否门店自提 + Integer selfContained = order.get("self_contained").getAsInt(); + shopOrder.setSelfContained(selfContained); + + //商家优惠金额 + BigDecimal sellerDiscount = new BigDecimal(order.get("seller_discount").getAsString()); + shopOrder.setSellerDiscount(sellerDiscount); + + //缺货处理状态 + Integer stockOutHandleStatus = order.get("stock_out_handle_status").getAsInt(); + shopOrder.setStockOutHandleStatus(stockOutHandleStatus); + + //全国联保 + Integer supportNationwideWarranty = order.get("support_nationwide_warranty").getAsInt(); + shopOrder.setSupportNationwideWarranty(supportNationwideWarranty); + + //区,乡镇 + String town = order.get("town").getAsString(); + shopOrder.setTown(town); + + //区县编码 + String townId = order.get("town_id").getAsString(); + shopOrder.setTownId(townId); + + //快递单号 + String trackingNumber = order.get("tracking_number").getAsString(); + shopOrder.setTrackingNumber(trackingNumber); + + //以旧换新国家补贴金额 + if (ObjectUtils.isNotEmpty(order.get("trade_in_national_subsidy_amount"))){ + double tradeInNationalSubsidyAmount = order.get("trade_in_national_subsidy_amount").getAsDouble(); + shopOrder.setTradeInNationalSubsidyAmount(new BigDecimal(tradeInNationalSubsidyAmount)); + } + + //订单类型 + int tradeType = order.get("trade_type").getAsInt(); + shopOrder.setTradeType(tradeType); + + //订单的更新时间 + if (ObjectUtils.isNotEmpty(order.get("updated_at"))) { + String updatedAt = order.get("updated_at").getAsString(); + shopOrder.setUpdatedAt(updatedAt); + } + + + //催发货时间 + if (ObjectUtils.isNotEmpty(order.get("urge_shipping_time"))) { + String urgeShippingTime = order.get("urge_shipping_time").getAsString(); + shopOrder.setUrgeShippingTime(urgeShippingTime); + } + + + //预约配送日期 + if (ObjectUtils.isNotEmpty(order.get("yyps_date"))) { + String yypsDate = order.get("yyps_date").getAsString(); + shopOrder.setYypsDate(yypsDate); + } + + + //预约配送时段 + if (ObjectUtils.isNotEmpty(order.get("yyps_time"))) { + String yypsTime = order.get("yyps_time").getAsString(); + shopOrder.setYypsTime(yypsTime); + } + + + //合单ID2 + if (ObjectUtils.isNotEmpty(order.get("open_address_id2"))){ + String openAddressId2 = order.get("open_address_id2").getAsString(); + shopOrder.setOpenAddressId2(openAddressId2); + } + + //商品信息列表 + Object itemList = order.get("item_list"); + shopOrder.setItemList(String.valueOf(itemList)); + + + //店铺名称 + shopOrder.setShopName(orderVO.getShopName()); + //店铺id + shopOrder.setShopId(String.valueOf(orderVO.getMallId())); + + + //todo 租户编码写死 + shopOrder.setTenantId("000000"); + + if (ObjectUtils.isNotEmpty(shopOrder.getId())){ + shopOrderMapper.updateById(shopOrder); + }else { + shopOrderMapper.insert(shopOrder); + } + + JsonArray orderItemList = order.getAsJsonArray("item_list"); + + if (ObjectUtils.isNotEmpty(orderItemList)) { + //遍历商品详情 + for (JsonElement orderItem : orderItemList) { + JsonObject item = orderItem.getAsJsonObject(); + + QueryWrapper detailQueryWrapper = new QueryWrapper<>(); + detailQueryWrapper.eq("order_id", shopOrder.getId()); + TShopOrderDetail detail = shopOrderDetailMapper.selectOne(detailQueryWrapper); + + if (ObjectUtils.isEmpty(detail)) { + detail = new TShopOrderDetail(); + detail.setOrderId(shopOrder.getId()); + detail.setOrderSn(shopOrder.getOrderSn()); + } + + int goodsCount = item.get("goods_count").getAsInt(); + detail.setGoodsCount(goodsCount); + + String goodsId = item.get("goods_id").getAsString(); + detail.setGoodsId(goodsId); + + String goodsImg = item.get("goods_img").getAsString(); + detail.setGoodsImg(goodsImg); + + String goodsName = item.get("goods_name").getAsString(); + detail.setGoodsName(goodsName); + + double goodsPrice = item.get("goods_price").getAsDouble(); + detail.setGoodsPrice(new BigDecimal(goodsPrice)); + + String goodsSpec = item.get("goods_spec").getAsString(); + detail.setGoodsSpec(goodsSpec); + + String outerGoodsId = item.get("outer_goods_id").getAsString(); + detail.setOuterGoodsId(outerGoodsId); + + String outerId = item.get("outer_id").getAsString(); + detail.setOuterId(outerId); + + String skuId = item.get("sku_id").getAsString(); + detail.setSkuId(skuId); + + //店铺名称 + detail.setShopName(orderVO.getShopName()); + //店铺id + detail.setShopId(String.valueOf(orderVO.getMallId())); + + + //todo 租户编码写死 + detail.setTenantId("000000"); + + if (ObjectUtils.isEmpty(detail.getId())) { + shopOrderDetailMapper.insert(detail); + } else { + shopOrderDetailMapper.updateById(detail); + } + } + } + + } + + // 获取 has_next 字段 + boolean next = object.get("has_next").getAsBoolean(); + + if (next){ + orderVO.setPage(orderVO.getPage() + 1); + getConfirmOrderList(orderVO); + } + + + + + + + + + + } + + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/CatsGetJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/CatsGetJobExecutor.java new file mode 100644 index 0000000..5a86628 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/CatsGetJobExecutor.java @@ -0,0 +1,34 @@ +package org.dromara.job.snailjob; + + +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; + +import org.dromara.zhishu.service.IPddService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +@JobExecutor(name = "catsGetJobExecutor") +public class CatsGetJobExecutor { + + @Autowired + public IPddService pddService; + + //todo 拿不到未支付订单 + //增量订单 (30分钟之内) + public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception { + + //todo -获取图书类目导航栏信息 +// pddService.getCats(15543L); + + return ExecuteResult.success("-----获取图书类目导航栏信息-----"); + } + + + + + + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/GetOrderNowJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/GetOrderNowJobExecutor.java new file mode 100644 index 0000000..f3640f8 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/GetOrderNowJobExecutor.java @@ -0,0 +1,40 @@ +package org.dromara.job.snailjob; + + +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import org.dromara.common.core.utils.PddUtil; +import org.dromara.job.domains.ShopOrderVO; +import org.dromara.job.service.IPddService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +@JobExecutor(name = "getOrderNowJobExecutor") +public class GetOrderNowJobExecutor { + + @Autowired + public IPddService pddService; + + //todo 拿不到未支付订单 + //增量订单 (30分钟之内) + public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception { + + //todo 多店铺需要同步 + ShopOrderVO shopOrderVO = new ShopOrderVO(); + shopOrderVO.setMallId(146727039); + shopOrderVO.setShopName("古威教辅专营店"); + shopOrderVO.setAccessToken(PddUtil.getToken()); + + pddService.getNowOrderList(shopOrderVO); + + return ExecuteResult.success("-----增量订单同步成功-----"); + } + + + + + + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java new file mode 100644 index 0000000..6f7c21f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java @@ -0,0 +1,19 @@ +package org.dromara.job.snailjob; + +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.job.core.executor.AbstractJobExecutor; +import com.aizuda.snailjob.client.model.ExecuteResult; +import org.springframework.stereotype.Component; + +/** + * @author opensnail + * @date 2024-05-17 + */ +@Component +public class TestClassJobExecutor extends AbstractJobExecutor { + + @Override + protected ExecuteResult doJobExecute(JobArgs jobArgs) { + return ExecuteResult.success("TestJobExecutor测试成功"); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java new file mode 100644 index 0000000..6b7499a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -0,0 +1,55 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.domain.vo.CacheListInfoVo; +import lombok.RequiredArgsConstructor; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +/** + * 缓存监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/cache") +public class CacheController { + + private final RedissonConnectionFactory connectionFactory; + + /** + * 获取缓存监控列表 + */ + @SaCheckPermission("monitor:cache:list") + @GetMapping() + public R getInfo() throws Exception { + RedisConnection connection = connectionFactory.getConnection(); + Properties commandStats = connection.commands().info("commandstats"); + + List> pieList = new ArrayList<>(); + if (commandStats != null) { + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + } + + CacheListInfoVo infoVo = new CacheListInfoVo(); + infoVo.setInfo(connection.commands().info()); + infoVo.setDbSize(connection.commands().dbSize()); + infoVo.setCommandStats(pieList); + return R.ok(infoVo); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..98ac2d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -0,0 +1,89 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统访问记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController { + + private final ISysLogininforService logininforService; + + /** + * 获取系统访问记录列表 + */ + @SaCheckPermission("monitor:logininfor:list") + @GetMapping("/list") + public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { + return logininforService.selectPageLogininforList(logininfor, pageQuery); + } + + /** + * 导出系统访问记录列表 + */ + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:logininfor:export") + @PostMapping("/export") + public void export(SysLogininforBo logininfor, HttpServletResponse response) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); + } + + /** + * 批量删除登录日志 + * @param infoIds 日志ids + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public R remove(@PathVariable Long[] infoIds) { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + /** + * 清理系统访问记录 + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + logininforService.cleanLogininfor(); + return R.ok(); + } + + @SaCheckPermission("monitor:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public R unlock(@PathVariable("userName") String userName) { + String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; + if (RedisUtils.hasKey(loginName)) { + RedisUtils.deleteObject(loginName); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..1cab232 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,131 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.dto.UserOnlineDTO; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysUserOnline; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 在线用户监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController { + + /** + * 获取在线用户监控列表 + * + * @param ipaddr IP地址 + * @param userName 用户名 + */ + @SaCheckPermission("monitor:online:list") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + // 获取所有未过期的 token + Collection keys = RedisUtils.keys(CacheConstants.ONLINE_TOKEN_KEY + "*"); + List userOnlineDTOList = new ArrayList<>(); + for (String key : keys) { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + continue; + } + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); + } + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) + ); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退用户 + * + * @param tokenId token值 + */ + @SaCheckPermission("monitor:online:forceLogout") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public R forceLogout(@PathVariable String tokenId) { + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException ignored) { + } + return R.ok(); + } + + /** + * 获取当前用户登录在线设备 + */ + @GetMapping() + public TableDataInfo getInfo() { + // 获取指定账号 id 的 token 集合 + List tokenIds = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); + List userOnlineDTOList = tokenIds.stream() + .filter(token -> StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) >= -1) + .map(token -> (UserOnlineDTO) RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)) + .collect(Collectors.toList()); + //复制和处理 SysUserOnline 对象列表 + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退当前在线设备 + * + * @param tokenId token值 + */ + @Log(title = "在线设备", businessType = BusinessType.FORCE) + @DeleteMapping("/myself/{tokenId}") + public R remove(@PathVariable("tokenId") String tokenId) { + try { + // 获取指定账号 id 的 token 集合 + List keys = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); + keys.stream() + .filter(key -> key.equals(tokenId)) + .findFirst() + .ifPresent(key -> StpUtil.kickoutByTokenValue(tokenId)); + } catch (NotLoginException ignored) { + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java new file mode 100644 index 0000000..eaed068 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java @@ -0,0 +1,115 @@ +package org.dromara.system.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.service.ISysClientService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 客户端管理 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/client") +public class SysClientController extends BaseController { + + private final ISysClientService sysClientService; + + /** + * 查询客户端管理列表 + */ + @SaCheckPermission("system:client:list") + @GetMapping("/list") + public TableDataInfo list(SysClientBo bo, PageQuery pageQuery) { + return sysClientService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户端管理列表 + */ + @SaCheckPermission("system:client:export") + @Log(title = "客户端管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysClientBo bo, HttpServletResponse response) { + List list = sysClientService.queryList(bo); + ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response); + } + + /** + * 获取客户端管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:client:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysClientService.queryById(id)); + } + + /** + * 新增客户端管理 + */ + @SaCheckPermission("system:client:add") + @Log(title = "客户端管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.insertByBo(bo)); + } + + /** + * 修改客户端管理 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateClientStatus(bo.getClientId(), bo.getStatus())); + } + + /** + * 删除客户端管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:client:remove") + @Log(title = "客户端管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysClientService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java new file mode 100644 index 0000000..c73c386 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -0,0 +1,137 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.service.ISysConfigService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 参数配置 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController { + + private final ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @SaCheckPermission("system:config:list") + @GetMapping("/list") + public TableDataInfo list(SysConfigBo config, PageQuery pageQuery) { + return configService.selectPageConfigList(config, pageQuery); + } + + /** + * 导出参数配置列表 + */ + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:config:export") + @PostMapping("/export") + public void export(SysConfigBo config, HttpServletResponse response) { + List list = configService.selectConfigList(config); + ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); + } + + /** + * 根据参数编号获取详细信息 + * + * @param configId 参数ID + */ + @SaCheckPermission("system:config:query") + @GetMapping(value = "/{configId}") + public R getInfo(@PathVariable Long configId) { + return R.ok(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + * + * @param configKey 参数Key + */ + @GetMapping(value = "/configKey/{configKey}") + public R getConfigKey(@PathVariable String configKey) { + return R.ok("操作成功", configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @SaCheckPermission("system:config:add") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.insertConfig(config); + return R.ok(); + } + + /** + * 修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.updateConfig(config); + return R.ok(); + } + + /** + * 根据参数键名修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateByKey") + public R updateByKey(@RequestBody SysConfigBo config) { + configService.updateConfig(config); + return R.ok(); + } + + /** + * 删除参数配置 + * + * @param configIds 参数ID串 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public R remove(@PathVariable Long[] configIds) { + configService.deleteConfigByIds(configIds); + return R.ok(); + } + + /** + * 刷新参数缓存 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + configService.resetConfigCache(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java new file mode 100644 index 0000000..45b8418 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -0,0 +1,140 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysPostService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 部门信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController { + + private final ISysDeptService deptService; + private final ISysPostService postService; + + /** + * 获取部门列表 + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list") + public R> list(SysDeptBo dept) { + List depts = deptService.selectDeptList(dept); + return R.ok(depts); + } + + /** + * 查询部门列表(排除节点) + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list/exclude/{deptId}") + public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new SysDeptBo()); + depts.removeIf(d -> d.getDeptId().equals(deptId) + || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); + return R.ok(depts); + } + + /** + * 根据部门编号获取详细信息 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:query") + @GetMapping(value = "/{deptId}") + public R getInfo(@PathVariable Long deptId) { + deptService.checkDeptDataScope(deptId); + return R.ok(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @SaCheckPermission("system:dept:add") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDeptBo dept) { + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @SaCheckPermission("system:dept:edit") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDeptBo dept) { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(SystemConstants.DISABLE, dept.getStatus())) { + if (deptService.selectNormalChildrenDeptById(deptId) > 0) { + return R.fail("该部门包含未停用的子部门!"); + } else if (deptService.checkDeptExistUser(deptId)) { + return R.fail("该部门下存在已分配用户,不能禁用!"); + } + } + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:remove") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public R remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { + return R.warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return R.warn("部门存在用户,不允许删除"); + } + if (postService.countPostByDeptId(deptId) > 0) { + return R.warn("部门存在岗位,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } + + /** + * 获取部门选择框列表 + * + * @param deptIds 部门ID串 + */ + @SaCheckPermission("system:dept:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] deptIds) { + return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds))); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java new file mode 100644 index 0000000..5752751 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -0,0 +1,123 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; +import org.dromara.system.service.ISysDictTypeService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController { + + private final ISysDictDataService dictDataService; + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典数据列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictDataBo dictData, PageQuery pageQuery) { + return dictDataService.selectPageDictDataList(dictData, pageQuery); + } + + /** + * 导出字典数据列表 + */ + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictDataBo dictData, HttpServletResponse response) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); + } + + /** + * 查询字典数据详细 + * + * @param dictCode 字典code + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictCode}") + public R getInfo(@PathVariable Long dictCode) { + return R.ok(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public R> dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(data); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictDataBo dict) { + if (!dictDataService.checkDictDataUnique(dict)) { + return R.fail("新增字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); + } + dictDataService.insertDictData(dict); + return R.ok(); + } + + /** + * 修改保存字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictDataBo dict) { + if (!dictDataService.checkDictDataUnique(dict)) { + return R.fail("修改字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); + } + dictDataService.updateDictData(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictCodes 字典code串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public R remove(@PathVariable Long[] dictCodes) { + dictDataService.deleteDictDataByIds(dictCodes); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..67c1f51 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -0,0 +1,125 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.service.ISysDictTypeService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController { + + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典类型列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictTypeBo dictType, PageQuery pageQuery) { + return dictTypeService.selectPageDictTypeList(dictType, pageQuery); + } + + /** + * 导出字典类型列表 + */ + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictTypeBo dictType, HttpServletResponse response) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); + } + + /** + * 查询字典类型详细 + * + * @param dictId 字典ID + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictId}") + public R getInfo(@PathVariable Long dictId) { + return R.ok(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.insertDictType(dict); + return R.ok(); + } + + /** + * 修改字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.updateDictType(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictIds 字典ID串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public R remove(@PathVariable Long[] dictIds) { + dictTypeService.deleteDictTypeByIds(dictIds); + return R.ok(); + } + + /** + * 刷新字典缓存 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + dictTypeService.resetDictCache(); + return R.ok(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return R.ok(dictTypes); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java new file mode 100644 index 0000000..c53e366 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -0,0 +1,178 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.lang.tree.Tree; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MenuTreeSelectVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.service.ISysMenuService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController { + + private final ISysMenuService menuService; + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("/getRouters") + public R> getRouters() { + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); + return R.ok(menuService.buildMenus(menus)); + } + + /** + * 获取菜单列表 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:list") + @GetMapping("/list") + public R> list(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menus); + } + + /** + * 根据菜单编号获取详细信息 + * + * @param menuId 菜单ID + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/{menuId}") + public R getInfo(@PathVariable Long menuId) { + return R.ok(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @SaCheckPermission("system:menu:query") + @GetMapping("/treeselect") + public R>> treeselect(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 加载对应租户套餐菜单列表树 + * + * @param packageId 租户套餐ID + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") + public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 新增菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:add") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (SystemConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:edit") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (SystemConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + * + * @param menuId 菜单ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:remove") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public R remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return R.warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return R.warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java new file mode 100644 index 0000000..5d65137 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -0,0 +1,90 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.service.DictService; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 公告 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController { + + private final ISysNoticeService noticeService; + private final DictService dictService; + + /** + * 获取通知公告列表 + */ + @SaCheckPermission("system:notice:list") + @GetMapping("/list") + public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); + } + + /** + * 根据通知公告编号获取详细信息 + * + * @param noticeId 公告ID + */ + @SaCheckPermission("system:notice:query") + @GetMapping(value = "/{noticeId}") + public R getInfo(@PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @SaCheckPermission("system:notice:add") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysNoticeBo notice) { + int rows = noticeService.insertNotice(notice); + if (rows <= 0) { + return R.fail(); + } + String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); + SseMessageUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); + return R.ok(); + } + + /** + * 修改通知公告 + */ + @SaCheckPermission("system:notice:edit") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysNoticeBo notice) { + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + * + * @param noticeIds 公告ID串 + */ + @SaCheckPermission("system:notice:remove") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public R remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java new file mode 100644 index 0000000..24ddaff --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java @@ -0,0 +1,105 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOssConfigBo; +import org.dromara.system.domain.vo.SysOssConfigVo; +import org.dromara.system.service.ISysOssConfigService; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 对象存储配置 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/resource/oss/config") +public class SysOssConfigController extends BaseController { + + private final ISysOssConfigService ossConfigService; + + /** + * 查询对象存储配置列表 + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { + return ossConfigService.queryPageList(bo, pageQuery); + } + + /** + * 获取对象存储配置详细信息 + * + * @param ossConfigId OSS配置ID + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/{ossConfigId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long ossConfigId) { + return R.ok(ossConfigService.queryById(ossConfigId)); + } + + /** + * 新增对象存储配置 + */ + @SaCheckPermission("system:ossConfig:add") + @Log(title = "对象存储配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(ossConfigService.insertByBo(bo)); + } + + /** + * 修改对象存储配置 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(ossConfigService.updateByBo(bo)); + } + + /** + * 删除对象存储配置 + * + * @param ossConfigIds OSS配置ID串 + */ + @SaCheckPermission("system:ossConfig:remove") + @Log(title = "对象存储配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossConfigIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossConfigIds) { + return toAjax(ossConfigService.deleteWithValidByIds(List.of(ossConfigIds), true)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysOssConfigBo bo) { + return toAjax(ossConfigService.updateOssConfigStatus(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java new file mode 100644 index 0000000..81200c1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java @@ -0,0 +1,108 @@ +package org.dromara.system.controller.system; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOssBo; +import org.dromara.system.domain.vo.SysOssUploadVo; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.service.ISysOssService; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * 文件上传 控制层 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/resource/oss") +public class SysOssController extends BaseController { + + private final ISysOssService ossService; + + /** + * 查询OSS对象存储列表 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { + return ossService.queryPageList(bo, pageQuery); + } + + /** + * 查询OSS对象基于id串 + * + * @param ossIds OSS对象ID串 + */ + @SaCheckPermission("system:oss:query") + @GetMapping("/listByIds/{ossIds}") + public R> listByIds(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + List list = ossService.listByIds(Arrays.asList(ossIds)); + return R.ok(list); + } + + /** + * 上传OSS对象存储 + * + * @param file 文件 + */ + @SaCheckPermission("system:oss:upload") + @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + SysOssVo oss = ossService.upload(file); + SysOssUploadVo uploadVo = new SysOssUploadVo(); + uploadVo.setUrl(oss.getUrl()); + uploadVo.setFileName(oss.getOriginalName()); + uploadVo.setOssId(oss.getOssId().toString()); + return R.ok(uploadVo); + } + + /** + * 下载OSS对象 + * + * @param ossId OSS对象ID + */ + @SaCheckPermission("system:oss:download") + @GetMapping("/download/{ossId}") + public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + ossService.download(ossId, response); + } + + /** + * 删除OSS对象存储 + * + * @param ossIds OSS对象ID串 + */ + @SaCheckPermission("system:oss:remove") + @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java new file mode 100644 index 0000000..5333a4a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -0,0 +1,133 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.service.ISysPostService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 岗位信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController { + + private final ISysPostService postService; + + /** + * 获取岗位列表 + */ + @SaCheckPermission("system:post:list") + @GetMapping("/list") + public TableDataInfo list(SysPostBo post, PageQuery pageQuery) { + return postService.selectPagePostList(post, pageQuery); + } + + /** + * 导出岗位列表 + */ + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:post:export") + @PostMapping("/export") + public void export(SysPostBo post, HttpServletResponse response) { + List list = postService.selectPostList(post); + ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); + } + + /** + * 根据岗位编号获取详细信息 + * + * @param postId 岗位ID + */ + @SaCheckPermission("system:post:query") + @GetMapping(value = "/{postId}") + public R getInfo(@PathVariable Long postId) { + return R.ok(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @SaCheckPermission("system:post:add") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @SaCheckPermission("system:post:edit") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } else if (SystemConstants.DISABLE.equals(post.getStatus()) + && postService.countUserPostById(post.getPostId()) > 0) { + return R.fail("该岗位下存在已分配用户,不能禁用!"); + } + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + * + * @param postIds 岗位ID串 + */ + @SaCheckPermission("system:post:remove") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public R remove(@PathVariable Long[] postIds) { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + * + * @param postIds 岗位ID串 + * @param deptId 部门id + */ + @SaCheckPermission("system:post:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] postIds, @RequestParam(required = false) Long deptId) { + List list = new ArrayList<>(); + if (ObjectUtil.isNotNull(deptId)) { + SysPostBo post = new SysPostBo(); + post.setDeptId(deptId); + list = postService.selectPostList(post); + } else if (postIds != null) { + list = postService.selectPostByIds(List.of(postIds)); + } + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java new file mode 100644 index 0000000..9a85b5a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -0,0 +1,137 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.bo.SysUserPasswordBo; +import org.dromara.system.domain.bo.SysUserProfileBo; +import org.dromara.system.domain.vo.AvatarVo; +import org.dromara.system.domain.vo.ProfileVo; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysOssService; +import org.dromara.system.service.ISysUserService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; + +/** + * 个人信息 业务处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController { + + private final ISysUserService userService; + private final ISysOssService ossService; + + /** + * 个人信息 + */ + @GetMapping + public R profile() { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + ProfileVo profileVo = new ProfileVo(); + profileVo.setUser(user); + profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserId())); + profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserId())); + LoginUser loginUser = LoginHelper.getLoginUser(); + profileVo.setWarehouseLoginUser(loginUser.getWarehouseLoginUser()); + return R.ok(profileVo); + } + + + /** + * 修改用户信息 + */ + @RepeatSubmit + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public R updateProfile(@Validated @RequestBody SysUserProfileBo profile) { + SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); + user.setUserId(LoginHelper.getUserId()); + String username = LoginHelper.getUsername(); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + username + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); + } + int rows = DataPermissionHelper.ignore(() -> userService.updateUserProfile(user)); + if (rows > 0) { + return R.ok(); + } + return R.fail("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + * + * @param bo 新旧密码 + */ + @RepeatSubmit + @ApiEncrypt + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public R updatePwd(@Validated @RequestBody SysUserPasswordBo bo) { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + String password = user.getPassword(); + if (!BCrypt.checkpw(bo.getOldPassword(), password)) { + return R.fail("修改密码失败,旧密码错误"); + } + if (BCrypt.checkpw(bo.getNewPassword(), password)) { + return R.fail("新密码不能与旧密码相同"); + } + int rows = DataPermissionHelper.ignore(() -> userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword()))); + if (rows > 0) { + return R.ok(); + } + return R.fail("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + * + * @param avatarfile 用户头像 + */ + @RepeatSubmit + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) { + if (!avatarfile.isEmpty()) { + String extension = FileUtil.extName(avatarfile.getOriginalFilename()); + if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { + return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); + } + SysOssVo oss = ossService.upload(avatarfile); + String avatar = oss.getUrl(); + boolean updateSuccess = DataPermissionHelper.ignore(() -> userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())); + if (updateSuccess) { + AvatarVo avatarVo = new AvatarVo(); + avatarVo.setImgUrl(avatar); + return R.ok(avatarVo); + } + } + return R.fail("上传图片异常,请联系管理员"); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java new file mode 100644 index 0000000..d4a9dc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -0,0 +1,229 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.DeptTreeSelectVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysRoleService; +import org.dromara.system.service.ISysUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 角色信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController { + + private final ISysRoleService roleService; + private final ISysUserService userService; + private final ISysDeptService deptService; + + /** + * 获取角色信息列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/list") + public TableDataInfo list(SysRoleBo role, PageQuery pageQuery) { + return roleService.selectPageRoleList(role, pageQuery); + } + + /** + * 导出角色信息列表 + */ + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:role:export") + @PostMapping("/export") + public void export(SysRoleBo role, HttpServletResponse response) { + List list = roleService.selectRoleList(role); + ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); + } + + /** + * 根据角色编号获取详细信息 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:query") + @GetMapping(value = "/{roleId}") + public R getInfo(@PathVariable Long roleId) { + roleService.checkRoleDataScope(roleId); + return R.ok(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @SaCheckPermission("system:role:add") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + + if (roleService.updateRole(role) > 0) { + roleService.cleanOnlineUserByRole(role.getRoleId()); + return R.ok(); + } + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public R dataScope(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); + } + + /** + * 删除角色 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:remove") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public R remove(@PathVariable Long[] roleIds) { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] roleIds) { + return R.ok(roleService.selectRoleByIds(roleIds == null ? null : List.of(roleIds))); + } + + /** + * 查询已分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectAllocatedList(user, pageQuery); + } + + /** + * 查询未分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectUnallocatedList(user, pageQuery); + } + + /** + * 取消授权用户 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public R cancelAuthUser(@RequestBody SysUserRole userRole) { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public R cancelAuthUserAll(Long roleId, Long[] userIds) { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public R selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:list") + @GetMapping(value = "/deptTree/{roleId}") + public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); + selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); + selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); + return R.ok(selectVo); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java new file mode 100644 index 0000000..d7e023b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -0,0 +1,218 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; +import com.baomidou.lock.annotation.Lock4j; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 租户管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/tenant") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") +public class SysTenantController extends BaseController { + + private final ISysTenantService tenantService; + + /** + * 查询租户列表 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) { + return tenantService.queryPageList(bo, pageQuery); + } + + /** + * 导出租户列表 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:export") + @Log(title = "租户管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantBo bo, HttpServletResponse response) { + List list = tenantService.queryList(bo); + ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); + } + + /** + * 获取租户详细信息 + * + * @param id 主键 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tenantService.queryById(id)); + } + + /** + * 新增租户 + */ + @ApiEncrypt + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:add") + @Log(title = "租户管理", businessType = BusinessType.INSERT) + @Lock4j + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); + } + return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); + } + + /** + * 修改租户 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); + } + return toAjax(tenantService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + return toAjax(tenantService.updateTenantStatus(bo)); + } + + /** + * 删除租户 + * + * @param ids 主键串 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:remove") + @Log(title = "租户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tenantService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 动态切换租户 + * + * @param tenantId 租户ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/{tenantId}") + public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) { + TenantHelper.setDynamic(tenantId, true); + return R.ok(); + } + + /** + * 清除动态租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/clear") + public R dynamicClear() { + TenantHelper.clearDynamic(); + return R.ok(); + } + + + /** + * 同步租户套餐 + * + * @param tenantId 租户id + * @param packageId 套餐id + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + "Settled" + }, mode = SaMode.OR) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户管理", businessType = BusinessType.UPDATE) + @GetMapping("/syncTenantPackage") + public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, + @NotNull(message = "套餐ID不能为空") Long packageId) { + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); + } + + /** + * 同步租户字典 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @Log(title = "租户管理", businessType = BusinessType.INSERT) + @GetMapping("/syncTenantDict") + public R syncTenantDict() { + if (!TenantHelper.isEnable()) { + return R.fail("当前未开启租户模式"); + } + tenantService.syncTenantDict(); + return R.ok("同步租户字典成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserBalanceController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserBalanceController.java new file mode 100644 index 0000000..1602cfb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserBalanceController.java @@ -0,0 +1,47 @@ +package org.dromara.system.controller.system; + + + +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; + +import lombok.RequiredArgsConstructor; +import org.dromara.system.service.IUserTransferService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + + +@Validated +@RestController +@RequestMapping("/system/user/balance") +@RequiredArgsConstructor +public class SysUserBalanceController { + + private final IUserTransferService sysUserService; + + /** + * 余额转冻结 + */ + @PostMapping("/transfer/balanceToFreeze") + @SaIgnore + public R balanceToFreeze(@NotNull(message = "转出用户ID不能为空") Long fromUserId, + @NotNull(message = "转入用户ID不能为空") Long toUserId, + @NotNull(message = "金额不能为空") Long amount) { + boolean result = sysUserService.transferBalanceToFreeze(fromUserId, toUserId, amount); + return result ? R.ok("转账成功") : R.fail("转账失败"); + } + + /** + * 冻结转余额 + */ + @PostMapping("/transfer/freezeToBalance") + @SaIgnore + public R freezeToBalance(@NotNull(message = "转出用户ID不能为空") Long fromUserId, + @NotNull(message = "转入用户ID不能为空") Long toUserId, + @NotNull(message = "金额不能为空") Long amount) { + boolean result = sysUserService.transferFreezeToBalance(fromUserId, toUserId, amount); + return result ? R.ok("转账成功") : R.fail("转账失败"); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java new file mode 100644 index 0000000..f9d39ad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -0,0 +1,339 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.*; +import org.dromara.system.listener.SysUserImportListener; +import org.dromara.system.service.*; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController { + + private final ISysUserService userService; + private final ISysRoleService roleService; + private final ISysPostService postService; + private final ISysDeptService deptService; + private final ISysTenantService tenantService; + + /** + * 获取用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list") + public TableDataInfo list(SysUserBo user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); + } + + @GetMapping("/getUserWarehouseNameList") + public Map getUserWarehouseNameList(){ + Long userId = LoginHelper.getUserId(); + Map map = new HashMap(); + map.put("u",userId); + map.put("warehouseNameList",userService.selectUserWarehouseNameList()); + return map; + } + + /** + * 获取当前登录用户的自营仓库名称 + * @return + */ + @GetMapping("/getUserWarehouseName") + public Map getUserWarehouseName(){ + SysUserVo vo = userService.selectUserById(LoginHelper.getUserId()); + Map map = new HashMap(); + map.put("code",200); + if(StringUtils.isNotEmpty(vo.getWarehouseName())){ + map.put("userWarehouseName",vo.getWarehouseName()); + }else{ + map.put("userWarehouseName",""); + map.put("markName","默认仓库名称"+ UUID.randomUUID()); + } + return map; + } + + @PutMapping("/editUserWarehouseName") + public Map editUserWarehouseName(String warehouseName){ + Map map = new HashMap(); + SysUserBo bo = new SysUserBo(); + bo.setUserId(LoginHelper.getUserId()); + bo.setWarehouseName(warehouseName); + userService.updateUser(bo); + map.put("code",200); + map.put("msg","设置成功,仓库名称:"+warehouseName); + return map; + } + + /** + * 导出用户列表 + */ + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:user:export") + @PostMapping("/export") + public void export(SysUserBo user, HttpServletResponse response) { + List list = userService.selectUserExportList(user); + ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response); + } + + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @SaCheckPermission("system:user:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("/getInfo") + public R getInfo() { + UserInfoVo userInfoVo = new UserInfoVo(); + LoginUser loginUser = LoginHelper.getLoginUser(); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 如果重新加载用户信息需清除动态租户 + TenantHelper.clearDynamic(); + } + SysUserVo user = userService.selectUserById(loginUser.getUserId()); + if (ObjectUtil.isNull(user)) { + return R.fail("没有权限访问用户数据!"); + } + userInfoVo.setUser(user); + userInfoVo.setPermissions(loginUser.getMenuPermission()); + userInfoVo.setRoles(loginUser.getRolePermission()); + return R.ok(userInfoVo); + } + + /** + * 根据用户编号获取详细信息 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}"}) + public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + if (ObjectUtil.isNotNull(userId)) { + userService.checkUserDataScope(userId); + SysUserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); + Long deptId = sysUser.getDeptId(); + if (ObjectUtil.isNotNull(deptId)) { + SysPostBo postBo = new SysPostBo(); + postBo.setDeptId(deptId); + userInfoVo.setPosts(postService.selectPostList(postBo)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); + } + } + SysRoleBo roleBo = new SysRoleBo(); + roleBo.setStatus(SystemConstants.NORMAL); + List roles = roleService.selectRoleList(roleBo); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:add") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysUserBo user) { + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + if (TenantHelper.isEnable()) { + if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) { + return R.fail("当前租户下用户名额不足,请联系管理员"); + } + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + * + * @param userIds 角色ID串 + */ + @SaCheckPermission("system:user:remove") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public R remove(@PathVariable Long[] userIds) { + if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { + return R.fail("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 根据用户ID串批量获取用户基础信息 + * + * @param userIds 用户ID串 + * @param deptId 部门ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] userIds, + @RequestParam(required = false) Long deptId) { + return R.ok(userService.selectUserByIds(ArrayUtil.isEmpty(userIds) ? null : List.of(userIds), deptId)); + } + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwd") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public R resetPwd(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + /** + * 根据用户编号获取授权角色 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/authRole/{userId}") + public R authRole(@PathVariable Long userId) { + userService.checkUserDataScope(userId); + SysUserVo user = userService.selectUserById(userId); + List roles = roleService.selectRolesAuthByUserId(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + userInfoVo.setUser(user); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 用户授权角色 + * + * @param userId 用户Id + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public R insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return R.ok(); + } + + /** + * 获取部门树列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/deptTree") + public R>> deptTree(SysDeptBo dept) { + return R.ok(deptService.selectDeptTreeList(dept)); + } + + /** + * 获取部门下的所有用户信息 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list/dept/{deptId}") + public R> listByDept(@PathVariable @NotNull Long deptId) { + return R.ok(userService.selectUserListByDept(deptId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java new file mode 100644 index 0000000..e398a20 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCache.java @@ -0,0 +1,47 @@ +package org.dromara.system.domain; + +import org.dromara.common.core.utils.StringUtils; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 缓存信息 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class SysCache { + + /** + * 缓存名称 + */ + private String cacheName = ""; + + /** + * 缓存键名 + */ + private String cacheKey = ""; + + /** + * 缓存内容 + */ + private String cacheValue = ""; + + /** + * 备注 + */ + private String remark = ""; + + public SysCache(String cacheName, String remark) { + this.cacheName = cacheName; + this.remark = remark; + } + + public SysCache(String cacheName, String cacheKey, String cacheValue) { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java new file mode 100644 index 0000000..ee2475d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java @@ -0,0 +1,77 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 授权管理对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_client") +public class SysClient extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java new file mode 100644 index 0000000..6fcb88f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 参数配置表 sys_config + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_config") +public class SysConfig extends TenantEntity { + + /** + * 参数主键 + */ + @TableId(value = "config_id") + private Long configId; + + /** + * 参数名称 + */ + private String configName; + + /** + * 参数键名 + */ + private String configKey; + + /** + * 参数键值 + */ + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java new file mode 100644 index 0000000..b94fd8a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -0,0 +1,83 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 部门表 sys_dept + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dept") +public class SysDept extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId(value = "dept_id") + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 部门类别编码 + */ + private String deptCategory; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 祖级列表 + */ + private String ancestors; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java new file mode 100644 index 0000000..2df5596 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -0,0 +1,191 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_menu + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_menu") +public class SysMenu extends BaseEntity { + + /** + * 菜单ID + */ + @TableId(value = "menu_id") + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + /** + * 父菜单名称 + */ + @TableField(exist = false) + private String parentName; + + /** + * 子菜单 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + + /** + * 获取路由名称 + */ + public String getRouteName() { + String routerName = StringUtils.capitalize(path); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame()) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + */ + public String getRouterPath() { + String routerPath = this.path; + // 内链打开外网方式 + if (getParentId() != 0L && isInnerLink()) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0L == getParentId() && SystemConstants.TYPE_DIR.equals(getMenuType()) + && SystemConstants.NO_FRAME.equals(getIsFrame())) { + routerPath = "/" + this.path; + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame()) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + */ + public String getComponentInfo() { + String component = SystemConstants.LAYOUT; + if (StringUtils.isNotEmpty(this.component) && !isMenuFrame()) { + component = this.component; + } else if (StringUtils.isEmpty(this.component) && getParentId() != 0L && isInnerLink()) { + component = SystemConstants.INNER_LINK; + } else if (StringUtils.isEmpty(this.component) && isParentView()) { + component = SystemConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + */ + public boolean isMenuFrame() { + return getParentId() == 0L && SystemConstants.TYPE_MENU.equals(menuType) && isFrame.equals(SystemConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + */ + public boolean isInnerLink() { + return isFrame.equals(SystemConstants.NO_FRAME) && StringUtils.ishttp(path); + } + + /** + * 是否为parent_view组件 + */ + public boolean isParentView() { + return getParentId() != 0L && SystemConstants.TYPE_DIR.equals(menuType); + } + + /** + * 内链域名特殊字符替换 + */ + public static String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"}, + new String[]{"", "", "", "/", "/"}); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java new file mode 100644 index 0000000..41a8c59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@TableName("sys_oper_log") +public class SysOperLog implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @TableId(value = "oper_id") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java new file mode 100644 index 0000000..2c985da --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java @@ -0,0 +1,61 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 sys_post + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_post") +public class SysPost extends TenantEntity { + + /** + * 岗位序号 + */ + @TableId(value = "post_id") + private Long postId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 岗位编码 + */ + private String postCode; + + /** + * 岗位名称 + */ + private String postName; + + /** + * 岗位类别编码 + */ + private String postCategory; + + /** + * 岗位排序 + */ + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java new file mode 100644 index 0000000..a7c0ad5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 角色表 sys_role + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +public class SysRole extends TenantEntity { + + /** + * 角色ID + */ + @TableId(value = "role_id") + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private Integer roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; + + public SysRole(Long roleId) { + this.roleId = roleId; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java new file mode 100644 index 0000000..ba77694 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和部门关联 sys_role_dept + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_dept") +public class SysRoleDept { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..ba28f17 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_menu") +public class SysRoleMenu { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java new file mode 100644 index 0000000..10f2936 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java @@ -0,0 +1,136 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 社会化关系对象 sys_social + * + * @author thiszhc + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_social") +public class SysSocial extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java new file mode 100644 index 0000000..9800c30 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -0,0 +1,103 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 租户对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant") +public class SysTenant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java new file mode 100644 index 0000000..5f58e3e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -0,0 +1,60 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serial; + +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 租户套餐对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant_package") +public class SysTenantPackage extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @TableId(value = "package_id") + private Long packageId; + + /** + * 套餐名称 + */ + private String packageName; + + /** + * 关联菜单id + */ + private String menuIds; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java new file mode 100644 index 0000000..e8289e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -0,0 +1,140 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.tenant.core.TenantEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user") +public class SysUser extends TenantEntity { + + /** + * 用户ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别 + */ + private String sex; + + /** + * 用户头像 + */ + private Long avatar; + + /** + * 密码 + */ + @TableField( + insertStrategy = FieldStrategy.NOT_EMPTY, + updateStrategy = FieldStrategy.NOT_EMPTY, + whereStrategy = FieldStrategy.NOT_EMPTY + ) + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * openID + * @param userId + */ + private String openId; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 冻结资金 + */ + private BigDecimal freeze; + + /** + * 自营书品仓库名称 + */ + private String warehouseName; + + @TableField(exist = false) + private String shopName; + + + public SysUser(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java new file mode 100644 index 0000000..ba30eb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java @@ -0,0 +1,63 @@ +package org.dromara.system.domain; + +import lombok.Data; + +/** + * 当前在线会话 + * + * @author Lion Li + */ +@Data +public class SysUserOnline { + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java new file mode 100644 index 0000000..119c117 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和岗位关联 sys_user_post + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_post") +public class SysUserPost { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 岗位ID + */ + private Long postId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java new file mode 100644 index 0000000..0a50e80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和角色关联 sys_user_role + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_role") +public class SysUserRole { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java new file mode 100644 index 0000000..257935d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysConfig; + +/** + * 参数配置业务对象 sys_config + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false) +public class SysConfigBo extends BaseEntity { + + /** + * 参数主键 + */ + private Long configId; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") + private String configName; + + /** + * 参数键名 + */ + @NotBlank(message = "参数键名不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") + private String configKey; + + /** + * 参数键值 + */ + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过{max}个字符") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java new file mode 100644 index 0000000..042946c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictData; + +/** + * 字典数据业务对象 sys_dict_data + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictData.class, reverseConvertGenerate = false) +public class SysDictDataBo extends BaseEntity { + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过{max}个字符") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过{max}个字符") + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java new file mode 100644 index 0000000..4646162 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java @@ -0,0 +1,87 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysLogininfor; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录业务对象 sys_logininfor + * + * @author Michelle.Chung + */ + +@Data +@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false) +public class SysLogininforBo { + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java new file mode 100644 index 0000000..fbaafaa --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -0,0 +1,110 @@ +package org.dromara.system.domain.bo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysMenu; + +/** + * 菜单权限业务对象 sys_menu + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysMenu.class, reverseConvertGenerate = false) +public class SysMenuBo extends BaseEntity { + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 路由地址 + */ + @Size(min = 0, max = 200, message = "路由地址不能超过{max}个字符") + private String path; + + /** + * 组件路径 + */ + @Size(min = 0, max = 200, message = "组件路径不能超过{max}个字符") + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + @NotBlank(message = "菜单类型不能为空") + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @Size(min = 0, max = 100, message = "权限标识长度不能超过{max}个字符") + @Pattern(regexp = RegexConstants.PERMISSION_STRING, message = "权限标识必须符合 tool:build:list 格式") + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java new file mode 100644 index 0000000..f16400a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java @@ -0,0 +1,127 @@ +package org.dromara.system.domain.bo; + +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.system.domain.SysOperLog; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMappers; +import lombok.Data; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录业务对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ + +@Data +@AutoMappers({ + @AutoMapper(target = SysOperLog.class, reverseConvertGenerate = false), + @AutoMapper(target = OperLogEvent.class) +}) +public class SysOperLogBo { + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java new file mode 100644 index 0000000..3dc4328 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssConfigBo.java @@ -0,0 +1,109 @@ +package org.dromara.system.domain.bo; + +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysOssConfig; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 对象存储配置业务对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOssConfig.class, reverseConvertGenerate = false) +public class SysOssConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long ossConfigId; + + /** + * 配置key + */ + @NotBlank(message = "配置key不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "configKey长度必须介于{min}和{max} 之间") + private String configKey; + + /** + * accessKey + */ + @NotBlank(message = "accessKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "accessKey长度必须介于{min}和{max} 之间") + private String accessKey; + + /** + * 秘钥 + */ + @NotBlank(message = "secretKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "secretKey长度必须介于{min}和{max} 之间") + private String secretKey; + + /** + * 桶名称 + */ + @NotBlank(message = "桶名称不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "bucketName长度必须介于{min}和{max}之间") + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + @NotBlank(message = "访问站点不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "endpoint长度必须介于{min}和{max}之间") + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 域 + */ + private String region; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String accessPolicy; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java new file mode 100644 index 0000000..3207bad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -0,0 +1,94 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysRole; + +/** + * 角色信息业务对象 sys_role + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysRole.class, reverseConvertGenerate = false) +public class SysRoleBo extends BaseEntity { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") + private String roleName; + + /** + * 角色权限字符串 + */ + @NotBlank(message = "角色权限字符串不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") + private String roleKey; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + public SysRoleBo(Long roleId) { + this.roleId = roleId; + } + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java new file mode 100644 index 0000000..e3ac642 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java @@ -0,0 +1,114 @@ +package org.dromara.system.domain.bo; + +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.system.domain.SysTenant; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 租户业务对象 sys_tenant + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false) +public class SysTenantBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactUserName; + + /** + * 联系电话 + */ + @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactPhone; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String companyName; + + /** + * 用户名(创建系统用户) + */ + @NotBlank(message = "用户名不能为空", groups = { AddGroup.class }) + private String username; + + /** + * 密码(创建系统用户) + */ + @NotBlank(message = "密码不能为空", groups = { AddGroup.class }) + private String password; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class }) + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java new file mode 100644 index 0000000..51ca09a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -0,0 +1,142 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysUser; + +import java.math.BigDecimal; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUser.class, reverseConvertGenerate = false) +public class SysUserBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @NotBlank(message = "用户昵称不能为空") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 角色组 + */ + @Size(min = 1, message = "用户角色不能为空") + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + /** + * 排除不查询的用户(工作流用) + */ + private String excludeUserIds; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 冻结资金 + */ + private BigDecimal freeze; + + /** + * 自营书品仓库名称 + */ + private String warehouseName; + + /** + * 角色权限 + */ + private String roleKey; + + + public SysUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java new file mode 100644 index 0000000..84203ce --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java @@ -0,0 +1,57 @@ +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +/** + * 个人信息业务处理 + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileBo extends BaseEntity { + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + @Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确") + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 自营书品仓库名称 + */ + private String warehouseName; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java new file mode 100644 index 0000000..6f7db28 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java @@ -0,0 +1,26 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色部门列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class DeptTreeSelectVo { + + /** + * 选中部门列表 + */ + private List checkedKeys; + + /** + * 下拉树结构列表 + */ + private List> depts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java new file mode 100644 index 0000000..0724538 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java @@ -0,0 +1,26 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色菜单列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class MenuTreeSelectVo { + + /** + * 选中菜单列表 + */ + private List checkedKeys; + + /** + * 菜单下拉树结构列表 + */ + private List> menus; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..f720cd7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -0,0 +1,61 @@ +package org.dromara.system.domain.vo; + +import org.dromara.common.core.utils.StringUtils; +import lombok.Data; + +/** + * 路由显示信息 + * + * @author ruoyi + */ + +@Data +public class MetaVo { + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) { + this.link = link; + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java new file mode 100644 index 0000000..a6849b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java @@ -0,0 +1,36 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.Map; + +/** + * 用户个人信息 + * + * @author Michelle.Chung + */ +@Data +public class ProfileVo { + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 用户所属角色组 + */ + private String roleGroup; + + /** + * 用户所属岗位组 + */ + private String postGroup; + + /** + * 新仓库系统登录信息 + */ + private Map warehouseLoginUser; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..0d576ef --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -0,0 +1,62 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +/** + * 路由配置信息 + * + * @author Lion Li + */ +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo { + + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java new file mode 100644 index 0000000..34f24eb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java @@ -0,0 +1,90 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysClient; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysClient.class) +public class SysClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 客户端id + */ + @ExcelProperty(value = "客户端id") + private String clientId; + + /** + * 客户端key + */ + @ExcelProperty(value = "客户端key") + private String clientKey; + + /** + * 客户端秘钥 + */ + @ExcelProperty(value = "客户端秘钥") + private String clientSecret; + + /** + * 授权类型 + */ + @ExcelProperty(value = "授权类型") + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + @ExcelProperty(value = "token活跃超时时间") + private Long activeTimeout; + + /** + * token固定超时时间 + */ + @ExcelProperty(value = "token固定超时时间") + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java new file mode 100644 index 0000000..f896000 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysConfig; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 参数配置视图对象 sys_config + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysConfig.class) +public class SysConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 参数主键 + */ + @ExcelProperty(value = "参数主键") + private Long configId; + + /** + * 参数名称 + */ + @ExcelProperty(value = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @ExcelProperty(value = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @ExcelProperty(value = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String configType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java new file mode 100644 index 0000000..c56fb09 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -0,0 +1,102 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDept; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 部门视图对象 sys_dept + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDept.class) +public class SysDeptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 父部门id + */ + private Long parentId; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 部门类别编码 + */ + @ExcelProperty(value = "部门类别编码") + private String deptCategory; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人ID + */ + private Long leader; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String leaderName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String phone; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java new file mode 100644 index 0000000..83ea619 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -0,0 +1,88 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDictData; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictData.class) +public class SysDictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + @ExcelProperty(value = "字典编码") + private Long dictCode; + + /** + * 字典排序 + */ + @ExcelProperty(value = "字典排序") + private Integer dictSort; + + /** + * 字典标签 + */ + @ExcelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典键值 + */ + @ExcelProperty(value = "字典键值") + private String dictValue; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String isDefault; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java new file mode 100644 index 0000000..e6a184f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDictType; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典类型视图对象 sys_dict_type + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictType.class) +public class SysDictTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + @ExcelProperty(value = "字典主键") + private Long dictId; + + /** + * 字典名称 + */ + @ExcelProperty(value = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java new file mode 100644 index 0000000..de19aea --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -0,0 +1,106 @@ +package org.dromara.system.domain.vo; + +import java.util.Date; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysLogininfor; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 系统访问记录视图对象 sys_logininfor + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysLogininfor.class) +public class SysLogininforVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + @ExcelProperty(value = "序号") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "用户账号") + private String userName; + + /** + * 客户端 + */ + @ExcelProperty(value = "客户端") + private String clientKey; + + /** + * 设备类型 + */ + @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_device_type") + private String deviceType; + + /** + * 登录状态(0成功 1失败) + */ + @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private String status; + + /** + * 登录IP地址 + */ + @ExcelProperty(value = "登录地址") + private String ipaddr; + + /** + * 登录地点 + */ + @ExcelProperty(value = "登录地点") + private String loginLocation; + + /** + * 浏览器类型 + */ + @ExcelProperty(value = "浏览器") + private String browser; + + /** + * 操作系统 + */ + @ExcelProperty(value = "操作系统") + private String os; + + + /** + * 提示消息 + */ + @ExcelProperty(value = "提示消息") + private String msg; + + /** + * 访问时间 + */ + @ExcelProperty(value = "访问时间") + private Date loginTime; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java new file mode 100644 index 0000000..5214a33 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -0,0 +1,116 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysMenu; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 菜单权限视图对象 sys_menu + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysMenu.class) +public class SysMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 子菜单 + */ + private List children = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java new file mode 100644 index 0000000..e7cfde4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java @@ -0,0 +1,97 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import org.dromara.system.domain.SysOssConfig; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 对象存储配置视图对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysOssConfig.class) +public class SysOssConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java new file mode 100644 index 0000000..11e0ff8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssUploadVo.java @@ -0,0 +1,28 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +/** + * 上传对象信息 + * + * @author Michelle.Chung + */ +@Data +public class SysOssUploadVo { + + /** + * URL地址 + */ + private String url; + + /** + * 文件名 + */ + private String fileName; + + /** + * 对象存储主键 + */ + private String ossId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java new file mode 100644 index 0000000..8d5c429 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.vo; + +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysOss; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * OSS对象存储视图对象 sys_oss + * + * @author Lion Li + */ +@Data +@AutoMapper(target = SysOss.class) +public class SysOssVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 上传人 + */ + private Long createBy; + + /** + * 上传人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 服务商 + */ + private String service; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java new file mode 100644 index 0000000..69be547 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -0,0 +1,91 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysPost; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 岗位信息视图对象 sys_post + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysPost.class) +public class SysPostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @ExcelProperty(value = "岗位序号") + private Long postId; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 岗位编码 + */ + @ExcelProperty(value = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @ExcelProperty(value = "岗位名称") + private String postName; + + /** + * 岗位类别编码 + */ + @ExcelProperty(value = "类别编码") + private String postCategory; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "岗位排序") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 部门名 + */ + @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") + private String deptName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java new file mode 100644 index 0000000..6a45315 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain.vo; + +import java.util.Date; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenant; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户视图对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenant.class) +public class SysTenantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 租户编号 + */ + @ExcelProperty(value = "租户编号") + private String tenantId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUserName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactPhone; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String companyName; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String licenseNumber; + + /** + * 地址 + */ + @ExcelProperty(value = "地址") + private String address; + + /** + * 域名 + */ + @ExcelProperty(value = "域名") + private String domain; + + /** + * 企业简介 + */ + @ExcelProperty(value = "企业简介") + private String intro; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 租户套餐编号 + */ + @ExcelProperty(value = "租户套餐编号") + private Long packageId; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + @ExcelProperty(value = "用户数量") + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java new file mode 100644 index 0000000..37ec6b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -0,0 +1,96 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.ReverseAutoMapping; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户对象导出VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class SysUserExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 最后登录IP + */ + @ExcelProperty(value = "最后登录IP") + private String loginIp; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date loginDate; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 负责人 + */ + @ExcelProperty(value = "部门负责人") + private String leaderName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java new file mode 100644 index 0000000..c34a23c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -0,0 +1,76 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户对象导入VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 +public class SysUserImportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门编号") + private Long deptId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java new file mode 100644 index 0000000..48f141f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -0,0 +1,164 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysUser; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysUser.class) +public class SysUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + @Translation(type = TransConstant.OSS_ID_TO_URL) + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 部门名 + */ + @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") + private String deptName; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + @JsonIgnore + @JsonProperty + private String openId; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 冻结资金 + */ + private BigDecimal freeze; + + /** + * 自营书品仓库名称 + */ + private String warehouseName; + + /** + * 仓库商品数量 + */ + private String allNum; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java new file mode 100644 index 0000000..25b62a9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -0,0 +1,127 @@ +package org.dromara.system.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; +import cn.hutool.http.HtmlUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { + + private final ISysUserService userService; + + private final String password; + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public SysUserImportListener(Boolean isUpdateSupport) { + String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); + this.userService = SpringUtils.getBean(ISysUserService.class); + this.password = BCrypt.hashpw(initPassword); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(SysUserImportVo userVo, AnalysisContext context) { + SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName()); + try { + // 验证是否存在这个用户 + if (ObjectUtil.isNull(sysUser)) { + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + ValidatorUtils.validate(user); + user.setPassword(password); + user.setCreateBy(operUserId); + userService.insertUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); + } else if (isUpdateSupport) { + Long userId = sysUser.getUserId(); + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + user.setUserId(userId); + ValidatorUtils.validate(user); + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(operUserId); + userService.updateUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + HtmlUtil.cleanHtmlTag(userVo.getUserName()) + " 导入失败:"; + String message = e.getMessage(); + if (e instanceof ConstraintViolationException cvException) { + message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", "); + } + failureMsg.append(msg).append(message); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult<>() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java new file mode 100644 index 0000000..15bcfb4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 授权管理Mapper接口 + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +public interface SysClientMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..7298db3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java @@ -0,0 +1,29 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictDataMapper extends BaseMapperPlus { + + /** + * 根据字典类型查询字典数据列表 + * + * @param dictType 字典类型 + * @return 符合条件的字典数据列表 + */ + default List selectDictDataByType(String dictType) { + return selectVoList( + new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType) + .orderByAsc(SysDictData::getDictSort)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..9a9bdd5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysDictType; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.vo.SysDictTypeVo; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictTypeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..205413b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -0,0 +1,76 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.vo.SysMenuVo; + +import java.util.List; + +/** + * 菜单表 数据层 + * + * @author Lion Li + */ +public interface SysMenuMapper extends BaseMapperPlus { + + /** + * 根据用户查询系统菜单列表 + * + * @param queryWrapper 查询条件 + * @return 菜单列表 + */ + List selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + List selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + default List selectMenuTreeAll() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .in(SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU) + .eq(SysMenu::getStatus, SystemConstants.NORMAL) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum); + return this.selectList(lqw); + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..1e27b77 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.vo.SysNoticeVo; + +/** + * 通知公告表 数据层 + * + * @author Lion Li + */ +public interface SysNoticeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..5d20404 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.vo.SysOperLogVo; + +/** + * 操作日志 数据层 + * + * @author Lion Li + */ +public interface SysOperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java new file mode 100644 index 0000000..f93d34d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssConfigMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOssConfig; +import org.dromara.system.domain.vo.SysOssConfigVo; + +/** + * 对象存储配置Mapper接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface SysOssConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java new file mode 100644 index 0000000..3da621d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOss; +import org.dromara.system.domain.vo.SysOssVo; + +/** + * 文件上传 数据层 + * + * @author Lion Li + */ +public interface SysOssMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..60da074 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -0,0 +1,43 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 数据层 + * + * @author Lion Li + */ +public interface SysPostMapper extends BaseMapperPlus { + + /** + * 分页查询岗位列表 + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 包含岗位信息的分页结果 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "create_by") + }) + Page selectPagePostList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + List selectPostsByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..3de0bb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleDeptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..0a657b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java new file mode 100644 index 0000000..7e1167a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 租户Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java new file mode 100644 index 0000000..10ca170 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.vo.SysTenantPackageVo; + +/** + * 租户套餐Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantPackageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..8340348 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,23 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserRole; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserRoleMapper extends BaseMapperPlus { + + /** + * 根据角色ID查询关联的用户ID列表 + * + * @param roleId 角色ID + * @return 关联到指定角色的用户ID列表 + */ + List selectUserIdsByRoleId(Long roleId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java new file mode 100644 index 0000000..546c3f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java @@ -0,0 +1,60 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service接口 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +public interface ISysClientService { + + /** + * 查询客户端管理 + */ + SysClientVo queryById(Long id); + + /** + * 查询客户端信息基于客户端id + */ + SysClientVo queryByClientId(String clientId); + + /** + * 查询客户端管理列表 + */ + TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery); + + /** + * 查询客户端管理列表 + */ + List queryList(SysClientBo bo); + + /** + * 新增客户端管理 + */ + Boolean insertByBo(SysClientBo bo); + + /** + * 修改客户端管理 + */ + Boolean updateByBo(SysClientBo bo); + + /** + * 修改状态 + */ + int updateClientStatus(String clientId, String status); + + /** + * 校验并批量删除客户端管理信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java new file mode 100644 index 0000000..f7efda7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -0,0 +1,87 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; + +import java.util.List; + +/** + * 参数配置 服务层 + * + * @author Lion Li + */ +public interface ISysConfigService { + + + TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery); + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + SysConfigVo selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + String selectConfigByKey(String configKey); + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + List selectConfigList(SysConfigBo config); + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String insertConfig(SysConfigBo bo); + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String updateConfig(SysConfigBo bo); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + void deleteConfigByIds(Long[] configIds); + + /** + * 重置参数缓存数据 + */ + void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + boolean checkConfigKeyUnique(SysConfigBo config); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java new file mode 100644 index 0000000..3f252f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java @@ -0,0 +1,26 @@ +package org.dromara.system.service; + +/** + * 通用 数据权限 服务 + * + * @author Lion Li + */ +public interface ISysDataScopeService { + + /** + * 获取角色自定义权限 + * + * @param roleId 角色id + * @return 部门id组 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门及以下权限 + * + * @param deptId 部门id + * @return 部门id组 + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java new file mode 100644 index 0000000..bf16642 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -0,0 +1,125 @@ +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author Lion Li + */ +public interface ISysDeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(SysDeptBo dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + List> selectDeptTreeList(SysDeptBo dept); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + List> buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + SysDeptVo selectDeptById(Long deptId); + + /** + * 通过部门ID串查询部门 + * + * @param deptIds 部门id串 + * @return 部门列表信息 + */ + List selectDeptByIds(List deptIds); + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + long selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + boolean checkDeptNameUnique(SysDeptBo dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int insertDept(SysDeptBo bo); + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int updateDept(SysDeptBo bo); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..3b32d6c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -0,0 +1,95 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictTypeService { + + + TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery); + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + List selectDictTypeList(SysDictTypeBo dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + void deleteDictTypeByIds(Long[] dictIds); + + /** + * 重置字典缓存数据 + */ + void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List insertDictType(SysDictTypeBo bo); + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List updateDictType(SysDictTypeBo bo); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + boolean checkDictTypeUnique(SysDictTypeBo dictType); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java new file mode 100644 index 0000000..6b3b7a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java @@ -0,0 +1,47 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层 + * + * @author Lion Li + */ +public interface ISysLogininforService { + + + TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery); + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + void insertLogininfor(SysLogininforBo bo); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + List selectLogininforList(SysLogininforBo logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + void cleanLogininfor(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java new file mode 100644 index 0000000..72d705e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -0,0 +1,147 @@ +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; + +import java.util.List; +import java.util.Set; + +/** + * 菜单 业务层 + * + * @author Lion Li + */ +public interface ISysMenuService { + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(SysMenuBo menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(Long roleId); + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + List selectMenuListByPackageId(Long packageId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + List buildMenus(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + SysMenuVo selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int insertMenu(SysMenuBo bo); + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int updateMenu(SysMenuBo bo); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + boolean checkMenuNameUnique(SysMenuBo menu); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java new file mode 100644 index 0000000..8ec999d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java @@ -0,0 +1,67 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; + +import java.util.List; + +/** + * 公告 服务层 + * + * @author Lion Li + */ +public interface ISysNoticeService { + + + TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery); + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + SysNoticeVo selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + List selectNoticeList(SysNoticeBo notice); + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int insertNotice(SysNoticeBo bo); + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int updateNotice(SysNoticeBo bo); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java new file mode 100644 index 0000000..9573510 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java @@ -0,0 +1,54 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author Lion Li + */ +public interface ISysOperLogService { + + TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery); + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + void insertOperlog(SysOperLogBo bo); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + List selectOperLogList(SysOperLogBo operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + SysOperLogVo selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + void cleanOperLog(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java new file mode 100644 index 0000000..2f6dfc9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssConfigService.java @@ -0,0 +1,64 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOssConfigBo; +import org.dromara.system.domain.vo.SysOssConfigVo; + +import java.util.Collection; + +/** + * 对象存储配置Service接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface ISysOssConfigService { + + /** + * 初始化OSS配置 + */ + void init(); + + /** + * 查询单个 + */ + SysOssConfigVo queryById(Long ossConfigId); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery); + + /** + * 根据新增业务对象插入对象存储配置 + * + * @param bo 对象存储配置新增业务对象 + * @return 结果 + */ + Boolean insertByBo(SysOssConfigBo bo); + + /** + * 根据编辑业务对象修改对象存储配置 + * + * @param bo 对象存储配置编辑业务对象 + * @return 结果 + */ + Boolean updateByBo(SysOssConfigBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return 结果 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 启用停用状态 + */ + int updateOssConfigStatus(SysOssConfigBo bo); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java new file mode 100644 index 0000000..0116df5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -0,0 +1,28 @@ +package org.dromara.system.service; + +import java.util.Set; + +/** + * 用户权限处理 + * + * @author Lion Li + */ +public interface ISysPermissionService { + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + Set getRolePermission(Long userId); + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + Set getMenuPermission(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java new file mode 100644 index 0000000..a760d49 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -0,0 +1,130 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 服务层 + * + * @author Lion Li + */ +public interface ISysPostService { + + + TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + List selectPostList(SysPostBo post); + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 岗位ID + */ + List selectPostsByUserId(Long userId); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + SysPostVo selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + List selectPostByIds(List postIds); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostNameUnique(SysPostBo post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostCodeUnique(SysPostBo post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + long countUserPostById(Long postId); + + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + long countPostByDeptId(Long deptId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int insertPost(SysPostBo bo); + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int updatePost(SysPostBo bo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java new file mode 100644 index 0000000..a5e6e4c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -0,0 +1,202 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + * + * @author Lion Li + */ +public interface ISysRoleService { + + + TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery); + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + List selectRoleList(SysRoleBo role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色列表(包含被授权状态) + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesAuthByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + SysRoleVo selectRoleById(Long roleId); + + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + List selectRoleByIds(List roleIds); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleNameUnique(SysRoleBo role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleKeyUnique(SysRoleBo role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + void checkRoleAllowed(SysRoleBo role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + long countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int insertRole(SysRoleBo bo); + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int updateRole(SysRoleBo bo); + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + int updateRoleStatus(Long roleId, String status); + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int authDataScope(SysRoleBo bo); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + int insertAuthUsers(Long roleId, Long[] userIds); + + void cleanOnlineUserByRole(Long roleId); + + void cleanOnlineUser(List userIds); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java new file mode 100644 index 0000000..cc7016e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java @@ -0,0 +1,53 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; + +import java.util.List; + +/** + * 社会化关系Service接口 + * + * @author thiszhc + */ +public interface ISysSocialService { + + + /** + * 查询社会化关系 + */ + SysSocialVo queryById(String id); + + /** + * 查询社会化关系列表 + */ + List queryList(SysSocialBo bo); + + /** + * 查询社会化关系列表 + */ + List queryListByUserId(Long userId); + + /** + * 新增授权关系 + */ + Boolean insertByBo(SysSocialBo bo); + + /** + * 更新社会化关系 + */ + Boolean updateByBo(SysSocialBo bo); + + /** + * 删除社会化关系信息 + */ + Boolean deleteWithValidById(Long id); + + + /** + * 根据 authId 查询 + */ + List selectByAuthId(String authId); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java new file mode 100644 index 0000000..f697829 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -0,0 +1,87 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantService { + + /** + * 查询租户 + */ + SysTenantVo queryById(Long id); + + /** + * 基于租户ID查询租户 + */ + SysTenantVo queryByTenantId(String tenantId); + + /** + * 查询租户列表 + */ + TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery); + + /** + * 查询租户列表 + */ + List queryList(SysTenantBo bo); + + /** + * 新增租户 + */ + Boolean insertByBo(SysTenantBo bo); + + /** + * 修改租户 + */ + Boolean updateByBo(SysTenantBo bo); + + /** + * 修改租户状态 + */ + int updateTenantStatus(SysTenantBo bo); + + /** + * 校验租户是否允许操作 + */ + void checkTenantAllowed(String tenantId); + + /** + * 校验并批量删除租户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 校验企业名称是否唯一 + */ + boolean checkCompanyNameUnique(SysTenantBo bo); + + /** + * 校验账号余额 + */ + boolean checkAccountBalance(String tenantId); + + /** + * 校验有效期 + */ + boolean checkExpireTime(String tenantId); + + /** + * 同步租户套餐 + */ + Boolean syncTenantPackage(String tenantId, Long packageId); + + /** + * 同步租户字典 + */ + void syncTenantDict(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java new file mode 100644 index 0000000..024b142 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -0,0 +1,238 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserExportVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.domain.vo.UserInfoVo; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author Lion Li + */ +public interface ISysUserService { + + + TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); + + + List selectUserWarehouseNameList(); + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + List selectUserExportList(SysUserBo user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phoneNumber 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByPhonenumber(String phoneNumber); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + SysUserVo selectUserById(Long userId); + + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + List selectUserByIds(List userIds, Long deptId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userId 用户ID + * @return 结果 + */ + String selectUserRoleGroup(Long userId); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + String selectUserPostGroup(Long userId); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkUserNameUnique(SysUserBo user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkPhoneUnique(SysUserBo user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkEmailUnique(SysUserBo user); + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + void checkUserAllowed(Long userId); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int insertUser(SysUserBo user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + boolean registerUser(SysUserBo user, String tenantId); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUser(SysUserBo user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + int updateUserStatus(Long userId, String status); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserProfile(SysUserBo user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + boolean updateUserAvatar(Long userId, Long avatar); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + int resetUserPwd(Long userId, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + int deleteUserByIds(Long[] userIds); + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId 部门id + * @return 结果 + */ + List selectUserListByDept(Long deptId); + + + boolean updateOpenIdByPhoneNumber(String phoneNumber, String openid); + + SysUserVo selectUserByOpenid(String openid, String phoneNumber); + + void insertUserOpenId(String openid, String phonenumber); + + + List selectUserName(); + + SysUserVo selectUserByUserId(Long userId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IUserTransferService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IUserTransferService.java new file mode 100644 index 0000000..29f330b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IUserTransferService.java @@ -0,0 +1,40 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.UserTransferDTO; + + +import java.math.BigDecimal; + +/** + * 用户资金转移服务 + */ +public interface IUserTransferService { + + /** + * 从余额转到冻结资金 + * @param fromUserId 转出用户ID + * @param toUserId 转入用户ID + * @param amount 金额(分) + * @return 是否成功 + */ + boolean transferBalanceToFreeze(Long fromUserId, Long toUserId, Long amount); + + /** + * 从冻结资金转到余额 + * @param fromUserId 转出用户ID + * @param toUserId 转入用户ID + * @param amount 金额(分) + * @return 是否成功 + */ + boolean transferFreezeToBalance(Long fromUserId, Long toUserId, Long amount); + + /** + * 修改用户余额 + * + * @param userId 用户ID + * @param balance 金额 + * @return 影响行数 + */ + int updateBalance(Long userId, Long balance); + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java new file mode 100644 index 0000000..4f6e676 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -0,0 +1,151 @@ +package org.dromara.system.service.impl; + +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.mapper.SysClientMapper; +import org.dromara.system.service.ISysClientService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service业务层处理 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysClientServiceImpl implements ISysClientService { + + private final SysClientMapper baseMapper; + + /** + * 查询客户端管理 + */ + @Override + public SysClientVo queryById(Long id) { + SysClientVo vo = baseMapper.selectVoById(id); + vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + return vo; + } + + + /** + * 查询客户端管理 + */ + @Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") + @Override + public SysClientVo queryByClientId(String clientId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysClient::getClientId, clientId)); + } + + /** + * 查询客户端管理列表 + */ + @Override + public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + return TableDataInfo.build(result); + } + + /** + * 查询客户端管理列表 + */ + @Override + public List queryList(SysClientBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysClientBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getClientId()), SysClient::getClientId, bo.getClientId()); + lqw.eq(StringUtils.isNotBlank(bo.getClientKey()), SysClient::getClientKey, bo.getClientKey()); + lqw.eq(StringUtils.isNotBlank(bo.getClientSecret()), SysClient::getClientSecret, bo.getClientSecret()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysClient::getStatus, bo.getStatus()); + lqw.orderByAsc(SysClient::getId); + return lqw; + } + + /** + * 新增客户端管理 + */ + @Override + public Boolean insertByBo(SysClientBo bo) { + SysClient add = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(add); + add.setGrantType(String.join(",", bo.getGrantTypeList())); + // 生成clientid + String clientKey = bo.getClientKey(); + String clientSecret = bo.getClientSecret(); + add.setClientId(SecureUtil.md5(clientKey + clientSecret)); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户端管理 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#bo.clientId") + @Override + public Boolean updateByBo(SysClientBo bo) { + SysClient update = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(update); + update.setGrantType(String.join(",", bo.getGrantTypeList())); + return baseMapper.updateById(update) > 0; + } + + /** + * 修改状态 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") + @Override + public int updateClientStatus(String clientId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysClient::getStatus, status) + .eq(SysClient::getClientId, clientId)); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysClient entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除客户端管理 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..966a8f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,216 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.ConfigService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.mapper.SysConfigMapper; +import org.dromara.system.service.ISysConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 参数配置 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysConfigServiceImpl implements ISysConfigService, ConfigService { + + private final SysConfigMapper baseMapper; + + @Override + public TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DS("master") + public SysConfigVo selectConfigById(Long configId) { + return baseMapper.selectVoById(configId); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + // @Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey") + @Override + public String selectConfigByKey(String configKey) { + SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, configKey)); + return ObjectUtils.notNullGetter(retConfig, SysConfig::getConfigValue, StringUtils.EMPTY); + } + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, "sys.account.registerUser")); + }); + if (ObjectUtil.isNull(retConfig)) { + return false; + } + return Convert.toBool(retConfig.getConfigValue()); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfigBo config) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getConfigName()), SysConfig::getConfigName, bo.getConfigName()); + lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), SysConfig::getConfigType, bo.getConfigType()); + lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), SysConfig::getConfigKey, bo.getConfigKey()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysConfig::getConfigId); + return lqw; + } + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String insertConfig(SysConfigBo bo) { + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + int row = baseMapper.insert(config); + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String updateConfig(SysConfigBo bo) { + int row = 0; + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + if (config.getConfigId() != null) { + SysConfig temp = baseMapper.selectById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { + CacheUtils.evict(CacheNames.SYS_CONFIG, temp.getConfigKey()); + } + row = baseMapper.updateById(config); + } else { + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + row = baseMapper.update(config, new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, config.getConfigKey())); + } + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) { + for (Long configId : configIds) { + SysConfig config = baseMapper.selectById(configId); + if (StringUtils.equals(SystemConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + } + baseMapper.deleteByIds(Arrays.asList(configIds)); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() { + CacheUtils.clear(CacheNames.SYS_CONFIG); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfigBo config) { + long configId = ObjectUtils.notNull(config.getConfigId(), -1L); + SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { + return false; + } + return true; + } + + /** + * 根据参数 key 获取参数值 + * + * @param configKey 参数 key + * @return 参数值 + */ + @Override + public String getConfigValue(String configKey) { + return SpringUtils.getAopProxy(this).selectConfigByKey(configKey); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java new file mode 100644 index 0000000..12a5072 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java @@ -0,0 +1,78 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.service.ISysDataScopeService; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 数据权限 实现 + *

+ * 注意: 此Service内不允许调用标注`数据权限`注解的方法 + * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service("sdss") +public class SysDataScopeServiceImpl implements ISysDataScopeService { + + private final SysRoleDeptMapper roleDeptMapper; + private final SysDeptMapper deptMapper; + + /** + * 获取角色自定义权限 + * + * @param roleId 角色Id + * @return 部门Id组 + */ + @Cacheable(cacheNames = CacheNames.SYS_ROLE_CUSTOM, key = "#roleId", condition = "#roleId != null") + @Override + public String getRoleCustom(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return "-1"; + } + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); + } + return "-1"; + } + + /** + * 获取部门及以下权限 + * + * @param deptId 部门Id + * @return 部门Id组 + */ + @Cacheable(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, key = "#deptId", condition = "#deptId != null") + @Override + public String getDeptAndChild(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return "-1"; + } + List deptList = deptMapper.selectListByParentId(deptId); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(deptId); + if (CollUtil.isNotEmpty(ids)) { + return StreamUtils.join(ids, Convert::toStr); + } + return "-1"; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..e44fdbc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,157 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.domain.SysDictData; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.service.ISysDictDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CachePut; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictDataServiceImpl implements ISysDictDataService { + + private final SysDictDataMapper baseMapper; + + @Override + public TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictDataBo dictData) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictDataBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDictSort() != null, SysDictData::getDictSort, bo.getDictSort()); + lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), SysDictData::getDictLabel, bo.getDictLabel()); + lqw.eq(StringUtils.isNotBlank(bo.getDictType()), SysDictData::getDictType, bo.getDictType()); + lqw.orderByAsc(SysDictData::getDictSort); + return lqw; + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysDictData::getDictLabel) + .eq(SysDictData::getDictType, dictType) + .eq(SysDictData::getDictValue, dictValue)) + .getDictLabel(); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictDataVo selectDictDataById(Long dictCode) { + return baseMapper.selectVoById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + SysDictData data = baseMapper.selectById(dictCode); + baseMapper.deleteById(dictCode); + CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); + } + } + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.insert(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List updateDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.updateById(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典键值是否唯一 + * + * @param dict 字典数据 + * @return 结果 + */ + @Override + public boolean checkDictDataUnique(SysDictDataBo dict) { + Long dictCode = ObjectUtils.notNull(dict.getDictCode(), -1L); + SysDictData entity = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dict.getDictType()).eq(SysDictData::getDictValue, dict.getDictValue())); + if (ObjectUtil.isNotNull(entity) && !dictCode.equals(entity.getDictCode())) { + return false; + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..1be0b7f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,258 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.mapper.SysDictTypeMapper; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService { + + private final SysDictTypeMapper baseMapper; + private final SysDictDataMapper dictDataMapper; + + @Override + public TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictTypeBo dictType) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictTypeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDictName()), SysDictType::getDictName, bo.getDictName()); + lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysDictType::getDictId); + return lqw; + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + return baseMapper.selectVoList(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (CollUtil.isNotEmpty(dictDatas)) { + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeById(Long dictId) { + return baseMapper.selectVoById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeByType(String dictType) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + SysDictType dictType = baseMapper.selectById(dictId); + if (dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType.getDictType()))) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); + } + baseMapper.deleteByIds(Arrays.asList(dictIds)); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + CacheUtils.clear(CacheNames.SYS_DICT); + } + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + int row = baseMapper.insert(dict); + if (row > 0) { + // 新增 type 下无 data 数据 返回空防止缓存穿透 + return new ArrayList<>(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + SysDictType oldDict = baseMapper.selectById(dict.getDictId()); + dictDataMapper.update(null, new LambdaUpdateWrapper() + .set(SysDictData::getDictType, dict.getDictType()) + .eq(SysDictData::getDictType, oldDict.getDictType())); + int row = baseMapper.updateById(dict); + if (row > 0) { + CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); + return dictDataMapper.selectDictDataByType(dict.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictTypeBo dictType) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDictType::getDictType, dictType.getDictType()) + .ne(ObjectUtil.isNotNull(dictType.getDictId()), SysDictType::getDictId, dictType.getDictId())); + return !exist; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + @Override + public String getDictLabel(String dictType, String dictValue, String separator) { + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + if (StringUtils.containsAny(dictValue, separator)) { + return Arrays.stream(dictValue.split(separator)) + .map(v -> map.getOrDefault(v, StringUtils.EMPTY)) + .collect(Collectors.joining(separator)); + } else { + return map.getOrDefault(dictValue, StringUtils.EMPTY); + } + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + @Override + public String getDictValue(String dictType, String dictLabel, String separator) { + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); + if (StringUtils.containsAny(dictLabel, separator)) { + return Arrays.stream(dictLabel.split(separator)) + .map(l -> map.getOrDefault(l, StringUtils.EMPTY)) + .collect(Collectors.joining(separator)); + } else { + return map.getOrDefault(dictLabel, StringUtils.EMPTY); + } + } + + @Override + public Map getAllDictByDictType(String dictType) { + List list = selectDictDataByType(dictType); + return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..72b497e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.mapper.SysLogininforMapper; +import org.dromara.system.service.ISysClientService; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysLogininforServiceImpl implements ISysLogininforService { + + private final SysLogininforMapper baseMapper; + + private final ISysClientService clientService; + + /** + * 记录登录信息 + * + * @param logininforEvent 登录事件 + */ + @Async + @EventListener + public void recordLogininfor(LogininforEvent logininforEvent) { + HttpServletRequest request = logininforEvent.getRequest(); + final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); + final String ip = ServletUtils.getClientIP(request); + // 客户端信息 + String clientId = request.getHeader(LoginHelper.CLIENT_KEY); + SysClientVo client = null; + if (StringUtils.isNotBlank(clientId)) { + client = clientService.queryByClientId(clientId); + } + + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(getBlock(ip)); + s.append(address); + s.append(getBlock(logininforEvent.getUsername())); + s.append(getBlock(logininforEvent.getStatus())); + s.append(getBlock(logininforEvent.getMessage())); + // 打印信息到日志 + log.info(s.toString(), logininforEvent.getArgs()); + // 获取客户端操作系统 + String os = userAgent.getOs().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininforBo logininfor = new SysLogininforBo(); + logininfor.setTenantId(logininforEvent.getTenantId()); + logininfor.setUserName(logininforEvent.getUsername()); + if (ObjectUtil.isNotNull(client)) { + logininfor.setClientKey(client.getClientKey()); + logininfor.setDeviceType(client.getDeviceType()); + } + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(logininforEvent.getMessage()); + // 日志状态 + if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + insertLogininfor(logininfor); + } + + private String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } + + @Override + public TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) { + Map params = logininfor.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + lqw.orderByDesc(SysLogininfor::getInfoId); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininforBo bo) { + SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class); + logininfor.setLoginTime(new Date()); + baseMapper.insert(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininforBo logininfor) { + Map params = logininfor.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(SysLogininfor::getInfoId)); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + return baseMapper.deleteByIds(Arrays.asList(infoIds)); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..40643e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,372 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MetaVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.mapper.SysMenuMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysMenuService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 菜单 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysMenuServiceImpl implements ISysMenuService { + + private final SysMenuMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysTenantPackageMapper tenantPackageMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) { + return selectMenuList(new SysMenuBo(), userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenuBo menu, Long userId) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.inSql("r.role_id", "select role_id from sys_user_role where user_id = " + userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = baseMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = baseMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) { + List menus; + if (LoginHelper.isSuperAdmin(userId)) { + menus = baseMapper.selectMenuTreeAll(); + } else { + menus = baseMapper.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); + } + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByPackageId(Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + if (CollUtil.isEmpty(menuIds)) { + return List.of(); + } + List parentIds = null; + if (tenantPackage.getMenuCheckStrictly()) { + parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() + .select(SysMenu::getParentId) + .in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); + } + return baseMapper.selectObjs(new LambdaQueryWrapper() + .in(SysMenu::getMenuId, menuIds) + .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); + } + + /** + * 构建前端路由所需要的菜单 + * 路由name命名规则 path首字母转大写 + id + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList<>(); + for (SysMenu menu : menus) { + String name = menu.getRouteName() + menu.getMenuId(); + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(name); + router.setPath(menu.getRouterPath()); + router.setComponent(menu.getComponentInfo()); + router.setQuery(menu.getQueryParam()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (CollUtil.isNotEmpty(cMenus) && SystemConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (menu.isMenuFrame()) { + String frameName = StringUtils.capitalize(menu.getPath()) + menu.getMenuId(); + router.setMeta(null); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(frameName); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQueryParam()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); + String innerLinkName = StringUtils.capitalize(routerPath) + menu.getMenuId(); + children.setPath(routerPath); + children.setComponent(SystemConstants.INNER_LINK); + children.setName(innerLinkName); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildMenuTreeSelect(List menus) { + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(menus, (menu, tree) -> { + Tree menuTree = tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum()); + menuTree.put("menuType", menu.getMenuType()); + menuTree.put("icon", menu.getIcon()); + }); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenuVo selectMenuById(Long menuId) { + return baseMapper.selectVoById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + return baseMapper.exists(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + return roleMenuMapper.exists(new LambdaQueryWrapper().eq(SysRoleMenu::getMenuId, menuId)); + } + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.insert(menu); + } + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.updateById(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return baseMapper.deleteById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenuBo menu) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysMenu::getMenuName, menu.getMenuName()) + .eq(SysMenu::getParentId, menu.getParentId()) + .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())); + return !exist; + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + private List getChildPerms(List list, int parentId) { + List returnList = new ArrayList<>(); + for (SysMenu t : list) { + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); + t.setChildren(childList); + for (SysMenu tChild : childList) { + // 判断是否有子节点 + if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { + recursionFn(list, tChild); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java new file mode 100644 index 0000000..a67b04e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java @@ -0,0 +1,177 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.constant.OssConstant; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.system.domain.SysOssConfig; +import org.dromara.system.domain.bo.SysOssConfigBo; +import org.dromara.system.domain.vo.SysOssConfigVo; +import org.dromara.system.mapper.SysOssConfigMapper; +import org.dromara.system.service.ISysOssConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 对象存储配置Service业务层处理 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysOssConfigServiceImpl implements ISysOssConfigService { + + private final SysOssConfigMapper baseMapper; + + /** + * 项目启动时,初始化参数到缓存,加载配置类 + */ + @Override + public void init() { + List list = baseMapper.selectList(); + // 加载OSS初始化配置 + for (SysOssConfig config : list) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + } + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + } + + @Override + public SysOssConfigVo queryById(Long ossConfigId) { + return baseMapper.selectVoById(ossConfigId); + } + + @Override + public TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + private LambdaQueryWrapper buildQueryWrapper(SysOssConfigBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey()); + lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus()); + lqw.orderByAsc(SysOssConfig::getOssConfigId); + return lqw; + } + + @Override + public Boolean insertByBo(SysOssConfigBo bo) { + SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class); + validEntityBeforeSave(config); + boolean flag = baseMapper.insert(config) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + @Override + public Boolean updateByBo(SysOssConfigBo bo) { + SysOssConfig config = MapstructUtils.convert(bo, SysOssConfig.class); + validEntityBeforeSave(config); + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, ""); + luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, ""); + luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, ""); + luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, ""); + luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId()); + boolean flag = baseMapper.update(config, luw) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOssConfig entity) { + if (StringUtils.isNotEmpty(entity.getConfigKey()) + && !checkConfigKeyUnique(entity)) { + throw new ServiceException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) { + throw new ServiceException("系统内置, 不可删除!"); + } + } + List list = CollUtil.newArrayList(); + for (Long configId : ids) { + SysOssConfig config = baseMapper.selectById(configId); + list.add(config); + } + boolean flag = baseMapper.deleteByIds(ids) > 0; + if (flag) { + list.forEach(sysOssConfig -> + CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey())); + } + return flag; + } + + /** + * 判断configKey是否唯一 + */ + private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) { + long ossConfigId = ObjectUtils.notNull(sysOssConfig.getOssConfigId(), -1L); + SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) + .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { + return false; + } + return true; + } + + /** + * 启用禁用状态 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateOssConfigStatus(SysOssConfigBo bo) { + SysOssConfig sysOssConfig = MapstructUtils.convert(bo, SysOssConfig.class); + int row = baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysOssConfig::getStatus, "1")); + row += baseMapper.updateById(sysOssConfig); + if (row > 0) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey()); + } + return row; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java new file mode 100644 index 0000000..c2eb08c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java @@ -0,0 +1,269 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.domain.dto.OssDTO; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.OssService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.enumd.AccessPolicyType; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.system.domain.SysOss; +import org.dromara.system.domain.bo.SysOssBo; +import org.dromara.system.domain.vo.SysOssVo; +import org.dromara.system.mapper.SysOssMapper; +import org.dromara.system.service.ISysOssService; +import org.jetbrains.annotations.NotNull; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 文件上传 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOssServiceImpl implements ISysOssService, OssService { + + private final SysOssMapper baseMapper; + + /** + * 查询OSS对象存储列表 + * + * @param bo OSS对象存储分页查询对象 + * @param pageQuery 分页查询实体类 + * @return 结果 + */ + @Override + public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List filterResult = StreamUtils.toList(result.getRecords(), this::matchingUrl); + result.setRecords(filterResult); + return TableDataInfo.build(result); + } + + /** + * 根据一组 ossIds 获取对应的 SysOssVo 列表 + * + * @param ossIds 一组文件在数据库中的唯一标识集合 + * @return 包含 SysOssVo 对象的列表 + */ + @Override + public List listByIds(Collection ossIds) { + List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); + for (Long id : ossIds) { + SysOssVo vo = ossService.getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo); + } + } + } + return list; + } + + /** + * 根据一组 ossIds 获取对应文件的 URL 列表 + * + * @param ossIds 以逗号分隔的 ossId 字符串 + * @return 以逗号分隔的文件 URL 字符串 + */ + @Override + public String selectUrlByIds(String ossIds) { + List list = new ArrayList<>(); + SysOssServiceImpl ossService = SpringUtils.getAopProxy(this); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + SysOssVo vo = ossService.getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo).getUrl()); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo.getUrl()); + } + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + @Override + public List selectByIds(String ossIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + vo.setUrl(this.matchingUrl(vo).getUrl()); + list.add(BeanUtil.toBean(vo, OssDTO.class)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(BeanUtil.toBean(vo, OssDTO.class)); + } + } + } + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); + lqw.orderByAsc(SysOss::getOssId); + return lqw; + } + + /** + * 根据 ossId 从缓存或数据库中获取 SysOssVo 对象 + * + * @param ossId 文件在数据库中的唯一标识 + * @return SysOssVo 对象,包含文件信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId") + @Override + public SysOssVo getById(Long ossId) { + return baseMapper.selectVoById(ossId); + } + + + /** + * 文件下载方法,支持一次性下载完整文件 + * + * @param ossId OSS对象ID + * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 + */ + @Override + public void download(Long ossId, HttpServletResponse response) throws IOException { + SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + storage.download(sysOss.getFileName(), response.getOutputStream(), response::setContentLengthLong); + } + + /** + * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的 MultipartFile 对象 + * @return 上传成功后的 SysOssVo 对象,包含文件信息 + * @throws ServiceException 如果上传过程中发生异常,则抛出 ServiceException 异常 + */ + @Override + public SysOssVo upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + /** + * 上传文件到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的文件对象 + * @return 上传成功后的 SysOssVo 对象,包含文件信息 + */ + @Override + public SysOssVo upload(File file) { + String originalfileName = file.getName(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix); + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + @NotNull + private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) { + SysOss oss = new SysOss(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalfileName); + oss.setService(configKey); + baseMapper.insert(oss); + SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class); + return this.matchingUrl(sysOssVo); + } + + /** + * 删除OSS对象存储 + * + * @param ids OSS对象ID串 + * @param isValid 判断是否需要校验 + * @return 结果 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + } + List list = baseMapper.selectByIds(ids); + for (SysOss sysOss : list) { + OssClient storage = OssFactory.instance(sysOss.getService()); + storage.delete(sysOss.getUrl()); + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 桶类型为 private 的URL 修改为临时URL时长为120s + * + * @param oss OSS对象 + * @return oss 匹配Url的OSS对象 + */ + private SysOssVo matchingUrl(SysOssVo oss) { + OssClient storage = OssFactory.instance(oss.getService()); + // 仅修改桶类型为 private 的URL,临时URL时长为120s + if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) { + oss.setUrl(storage.getPrivateUrl(oss.getFileName(), Duration.ofSeconds(120))); + } + return oss; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..5888985 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,249 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.PostService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysUserPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.mapper.SysUserPostMapper; +import org.dromara.system.service.ISysPostService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 岗位信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysPostServiceImpl implements ISysPostService, PostService { + + private final SysPostMapper baseMapper; + private final SysDeptMapper deptMapper; + private final SysUserPostMapper userPostMapper; + + @Override + public TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery) { + Page page = baseMapper.selectPagePostList(pageQuery.build(), buildQueryWrapper(post)); + return TableDataInfo.build(page); + } + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPostBo post) { + return baseMapper.selectVoList(buildQueryWrapper(post)); + } + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 岗位ID + */ + @Override + public List selectPostsByUserId(Long userId) { + return baseMapper.selectPostsByUserId(userId); + } + + /** + * 根据查询条件构建查询包装器 + * + * @param bo 查询条件对象 + * @return 构建好的查询包装器 + */ + private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()) + .like(StringUtils.isNotBlank(bo.getPostCategory()), SysPost::getPostCategory, bo.getPostCategory()) + .like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()) + .orderByAsc(SysPost::getPostSort); + if (ObjectUtil.isNotNull(bo.getDeptId())) { + //优先单部门搜索 + wrapper.eq(SysPost::getDeptId, bo.getDeptId()); + } else if (ObjectUtil.isNotNull(bo.getBelongDeptId())) { + //部门树搜索 + wrapper.and(x -> { + List deptList = deptMapper.selectListByParentId(bo.getBelongDeptId()); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(bo.getBelongDeptId()); + x.in(SysPost::getDeptId, deptIds); + }); + } + return wrapper; + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + return baseMapper.selectVoList(new QueryWrapper<>()); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPostVo selectPostById(Long postId) { + return baseMapper.selectVoById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + List list = baseMapper.selectPostsByUserId(userId); + return StreamUtils.toList(list, SysPostVo::getPostId); + } + + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + @Override + public List selectPostByIds(List postIds) { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .select(SysPost::getPostId, SysPost::getPostName, SysPost::getPostCode) + .eq(SysPost::getStatus, SystemConstants.NORMAL) + .in(CollUtil.isNotEmpty(postIds), SysPost::getPostId, postIds)); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostName, post.getPostName()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostCode, post.getPostCode()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public long countUserPostById(Long postId) { + return userPostMapper.selectCount(new LambdaQueryWrapper().eq(SysUserPost::getPostId, postId)); + } + + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + @Override + public long countPostByDeptId(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper().eq(SysPost::getDeptId, deptId)); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + return baseMapper.deleteById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) { + for (Long postId : postIds) { + SysPost post = baseMapper.selectById(postId); + if (countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); + } + } + return baseMapper.deleteByIds(Arrays.asList(postIds)); + } + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.insert(post); + } + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.updateById(post); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..8a0d45e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ArrayUtil; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String[] roleKey, String[] perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = ArrayUtil.isNotEmpty(roleKey); + boolean permsExist = ArrayUtil.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRoleOr(roleKey) && StpUtil.hasPermissionOr(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRoleOr(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermissionOr(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java new file mode 100644 index 0000000..23dd052 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -0,0 +1,168 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.dto.TaskAssigneeDTO; +import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.service.TaskAssigneeService; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 工作流设计器获取任务执行人 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { + + private final SysPostMapper postMapper; + private final SysDeptMapper deptMapper; + private final SysUserMapper userMapper; + private final SysRoleMapper roleMapper; + + /** + * 查询角色并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("r.del_flag", SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "r.role_name", taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "r.role_key", taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + "r.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime()) + .orderByAsc("r.role_sort").orderByAsc("r.create_time"); + Page page = roleMapper.selectPageRoleList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + /** + * 查询岗位并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + Long belongDeptId = Long.valueOf(taskQuery.getGroupId()); + wrapper.and(x -> { + List deptList = deptMapper.selectListByParentId(belongDeptId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(belongDeptId); + x.in(SysPost::getDeptId, deptIds); + }); + } + Page page = postMapper.selectPagePostList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + /** + * 查询部门并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(SysDept::getDelFlag, SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName()) + .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()), + SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime()) + .orderByAsc(SysDept::getAncestors) + .orderByAsc(SysDept::getParentId) + .orderByAsc(SysDept::getOrderNum) + .orderByAsc(SysDept::getDeptId); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + //部门树搜索 + wrapper.and(x -> { + Long parentId = Long.valueOf(taskQuery.getGroupId()); + List deptList = deptMapper.selectListByParentId(parentId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(parentId); + x.in(SysDept::getDeptId, deptIds); + }); + } + Page page = deptMapper.selectPageDeptList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + + + /** + * 查询用户并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + @Override + public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) { + PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", SystemConstants.NORMAL) + .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "u.user_name", taskQuery.getHandlerCode()) + .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "u.nick_name", taskQuery.getHandlerName()) + .between(taskQuery.getBeginTime() != null && taskQuery.getEndTime() != null, + "u.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime()) + .orderByAsc("u.user_id"); + if (StringUtils.isNotBlank(taskQuery.getGroupId())) { + //部门树搜索 + wrapper.and(x -> { + Long parentId = Long.valueOf(taskQuery.getGroupId()); + List deptList = deptMapper.selectListByParentId(parentId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(parentId); + x.in("u.dept_id", deptIds); + }); + } + Page page = userMapper.selectPageUserList(pageQuery.build(), wrapper); + // 使用封装的字段映射方法进行转换 + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime); + return new TaskAssigneeDTO(page.getTotal(), handlers); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java new file mode 100644 index 0000000..8d69e96 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -0,0 +1,157 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.mapper.SysTenantMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantPackageServiceImpl implements ISysTenantPackageService { + + private final SysTenantPackageMapper baseMapper; + private final SysTenantMapper tenantMapper; + + /** + * 查询租户套餐 + */ + @Override + public SysTenantPackageVo queryById(Long packageId){ + return baseMapper.selectVoById(packageId); + } + + /** + * 查询租户套餐列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List selectList() { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(SysTenantPackage::getStatus, SystemConstants.NORMAL)); + } + + /** + * 查询租户套餐列表 + */ + @Override + public List queryList(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenantPackage::getPackageId); + return lqw; + } + + /** + * 新增租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantPackageBo bo) { + SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + add.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + add.setMenuIds(""); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPackageId(add.getPackageId()); + } + return flag; + } + + /** + * 修改租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysTenantPackageBo bo) { + SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + update.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + update.setMenuIds(""); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 校验套餐名称是否唯一 + */ + @Override + public boolean checkPackageNameUnique(SysTenantPackageBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenantPackage::getPackageName, bo.getPackageName()) + .ne(ObjectUtil.isNotNull(bo.getPackageId()), SysTenantPackage::getPackageId, bo.getPackageId())); + return !exist; + } + + /** + * 修改套餐状态 + * + * @param bo 套餐信息 + * @return 结果 + */ + @Override + public int updatePackageStatus(SysTenantPackageBo bo) { + SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class); + return baseMapper.updateById(tenantPackage); + } + + /** + * 批量删除租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids)); + if (exists) { + throw new ServiceException("租户套餐已被使用"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java new file mode 100644 index 0000000..f31bd30 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,477 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.WorkflowService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysTenantService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 租户Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantServiceImpl implements ISysTenantService { + + private final SysTenantMapper baseMapper; + private final SysTenantPackageMapper tenantPackageMapper; + private final SysUserMapper userMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysRoleDeptMapper roleDeptMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysDictTypeMapper dictTypeMapper; + private final SysDictDataMapper dictDataMapper; + private final SysConfigMapper configMapper; + + /** + * 查询租户 + */ + @Override + public SysTenantVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 基于租户ID查询租户 + */ + @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") + @Override + public SysTenantVo queryByTenantId(String tenantId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId)); + } + + /** + * 查询租户列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询租户列表 + */ + @Override + public List queryList(SysTenantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()); + lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName()); + lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); + lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); + lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); + lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); + lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenant::getId); + return lqw; + } + + /** + * 新增租户 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantBo bo) { + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> { + return Convert.toStr(x); + }); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); + + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); + + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); + + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); + + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); + //新增系统用户后,默认当前用户为部门的负责人 + SysDept sd = new SysDept(); + sd.setLeader(user.getUserId()); + sd.setDeptId(deptId); + deptMapper.updateById(sd); + + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); + + // 未开启工作流不执行下方操作 + if (SpringUtils.getProperty("warm-flow.enabled", Boolean.class, false)) { + WorkflowService workflowService = SpringUtils.getBean(WorkflowService.class); + // 新增租户流程定义 + workflowService.syncDef(tenantId); + } + return true; + } + + /** + * 生成租户id + * + * @param tenantIds 已有租户id列表 + * @return 租户id + */ + private String generateTenantId(List tenantIds) { + // 随机生成6位 + String numbers = RandomUtil.randomNumbers(6); + // 判断是否存在,如果存在则重新生成 + if (tenantIds.contains(numbers)) { + return generateTenantId(tenantIds); + } + return numbers; + } + + /** + * 根据租户菜单创建租户角色 + * + * @param tenantId 租户编号 + * @param packageId 租户套餐id + * @return 角色id + */ + private Long createTenantRole(String tenantId, Long packageId) { + // 获取租户套餐 + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + if (ObjectUtil.isNull(tenantPackage)) { + throw new ServiceException("套餐不存在"); + } + // 获取套餐菜单id + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + + // 创建角色 + SysRole role = new SysRole(); + role.setTenantId(tenantId); + role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); + role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); + role.setRoleSort(1); + role.setStatus(SystemConstants.NORMAL); + roleMapper.insert(role); + Long roleId = role.getRoleId(); + + // 创建角色菜单 + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.insertBatch(roleMenus); + + return roleId; + } + + /** + * 修改租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public Boolean updateByBo(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + tenant.setTenantId(null); + tenant.setPackageId(null); + return baseMapper.updateById(tenant) > 0; + } + + /** + * 修改租户状态 + * + * @param bo 租户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public int updateTenantStatus(SysTenantBo bo) { + SysTenant tenant = new SysTenant(); + tenant.setId(bo.getId()); + tenant.setStatus(bo.getStatus()); + return baseMapper.updateById(tenant); + } + + /** + * 校验租户是否允许操作 + * + * @param tenantId 租户ID + */ + @Override + public void checkTenantAllowed(String tenantId) { + if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + throw new ServiceException("不允许操作管理租户"); + } + } + + /** + * 批量删除租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) { + throw new ServiceException("超管租户不能删除"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 校验企业名称是否唯一 + */ + @Override + public boolean checkCompanyNameUnique(SysTenantBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenant::getCompanyName, bo.getCompanyName()) + .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); + return !exist; + } + + /** + * 校验账号余额 + */ + @Override + public boolean checkAccountBalance(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果余额为-1代表不限制 + if (tenant.getAccountCount() == -1) { + return true; + } + Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>()); + // 如果余额大于0代表还有可用名额 + return tenant.getAccountCount() - userNumber > 0; + } + + /** + * 校验有效期 + */ + @Override + public boolean checkExpireTime(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果未设置过期时间代表不限制 + if (ObjectUtil.isNull(tenant.getExpireTime())) { + return true; + } + // 如果当前时间在过期时间之前则通过 + return new Date().before(tenant.getExpireTime()); + } + + /** + * 同步租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean syncTenantPackage(String tenantId, Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + } + return true; + } + + /** + * 同步租户字典 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void syncTenantDict() { + // 查询超管 所有字典数据 + List dictTypeList = new ArrayList<>(); + List dictDataList = new ArrayList<>(); + TenantHelper.ignore(() -> { + dictTypeList.addAll(dictTypeMapper.selectList()); + dictDataList.addAll(dictDataMapper.selectList()); + }); + Map> typeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); + Map>> typeDataMap = StreamUtils.groupBy2Key( + dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); + // 管理租户字典数据 + List defaultTypeMap = typeMap.get(TenantConstants.DEFAULT_TENANT_ID); + Map> defaultTypeDataMap = typeDataMap.get(TenantConstants.DEFAULT_TENANT_ID); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId) + .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> { + return Convert.toStr(x); + }); + List saveTypeList = new ArrayList<>(); + List saveDataList = new ArrayList<>(); + Set set = new HashSet<>(); + for (String tenantId : tenantIds) { + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + continue; + } + for (SysDictType dictType : defaultTypeMap) { + List typeList = StreamUtils.toList(typeMap.get(tenantId), SysDictType::getDictType); + List dataList = defaultTypeDataMap.get(dictType.getDictType()); + if (typeList.contains(dictType.getDictType())) { + List dataListTenant = typeDataMap.get(tenantId).get(dictType.getDictType()); + Map map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue); + for (SysDictData dictData : dataList) { + if (!map.containsKey(dictData.getDictValue())) { + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 设置字典编码为 null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + set.add(tenantId); + saveDataList.add(data); + } + } + } else { + SysDictType type = BeanUtil.toBean(dictType, SysDictType.class); + type.setDictId(null); + type.setTenantId(tenantId); + type.setCreateTime(null); + type.setUpdateTime(null); + set.add(tenantId); + saveTypeList.add(type); + if (CollUtil.isNotEmpty(dataList)) { + // 筛选出 dictType 对应的 data + for (SysDictData dictData : dataList) { + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 设置字典编码为 null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + set.add(tenantId); + saveDataList.add(data); + } + } + } + } + } + TenantHelper.ignore(() -> { + if (CollUtil.isNotEmpty(saveTypeList)) { + dictTypeMapper.insertBatch(saveTypeList); + } + if (CollUtil.isNotEmpty(saveDataList)) { + dictDataMapper.insertBatch(saveDataList); + } + }); + for (String tenantId : set) { + TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT)); + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/UserTransferServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/UserTransferServiceImpl.java new file mode 100644 index 0000000..7c7cdbc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/UserTransferServiceImpl.java @@ -0,0 +1,127 @@ +package org.dromara.system.service.impl; + +import org.dromara.system.domain.UserTransferDTO; +import org.dromara.system.service.IUserTransferService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.redis.utils.RedisUtils; + +import org.dromara.system.domain.SysUser; + +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.IUserTransferService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserTransferServiceImpl implements IUserTransferService { + + private final SysUserMapper baseMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean transferBalanceToFreeze(Long fromUserId, Long toUserId, Long amount) { + // 参数校验 + validateTransferParams(fromUserId, toUserId, amount); + + // 检查用户是否存在且状态正常 + SysUser fromUser = baseMapper.selectById(fromUserId); + SysUser toUser = baseMapper.selectById(toUserId); + + validateUserStatus(fromUser, toUser); + + // 检查余额是否足够 + if (fromUser.getBalance().compareTo(BigDecimal.valueOf(amount)) < 0) { + throw new ServiceException("余额不足"); + } + + // 执行转账 + int affectedRows = baseMapper.transferBalanceToFreeze(fromUserId, toUserId, amount); + + return processTransferResult("余额转冻结", fromUserId, toUserId, amount, affectedRows); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean transferFreezeToBalance(Long fromUserId, Long toUserId, Long amount) { + // 参数校验 + validateTransferParams(fromUserId, toUserId, amount); + + // 检查用户是否存在且状态正常 + SysUser fromUser = baseMapper.selectById(fromUserId); + SysUser toUser = baseMapper.selectById(toUserId); + + validateUserStatus(fromUser, toUser); + + // 检查冻结资金是否足够 + if (fromUser.getFreeze().compareTo(BigDecimal.valueOf(amount)) < 0) { + throw new ServiceException("冻结资金不足"); + } + + // 执行转账 + int affectedRows = baseMapper.transferFreezeToBalance(fromUserId, toUserId, amount); + + return processTransferResult("冻结转余额", fromUserId, toUserId, amount, affectedRows); + } + + /** + * 更新用户余额 + * @param userId 用户ID + * @param balance 新余额(分) + * @return 影响行数 + */ + @Override + public int updateBalance(Long userId, Long balance){ + return baseMapper.updateBalance(userId, balance); + } + + /** + * 校验转账参数 + */ + private void validateTransferParams(Long fromUserId, Long toUserId, Long amount) { + if (fromUserId == null || toUserId == null || amount == null) { + throw new ServiceException("参数不能为空"); + } + if (amount <= 0) { + throw new ServiceException("转账金额必须大于0"); + } + // if (fromUserId.equals(toUserId)) { + // throw new ServiceException("转出用户和转入用户不能相同"); + // } + } + + /** + * 校验用户状态 + */ + private void validateUserStatus(SysUser fromUser, SysUser toUser) { + if (fromUser == null || !"0".equals(fromUser.getDelFlag()) || !"0".equals(fromUser.getStatus())) { + throw new ServiceException("转出用户不存在或状态异常"); + } + if (toUser == null || !"0".equals(toUser.getDelFlag()) || !"0".equals(toUser.getStatus())) { + throw new ServiceException("转入用户不存在或状态异常"); + } + } + + /** + * 处理转账结果 + */ + private boolean processTransferResult(String operation, Long fromUserId, Long toUserId, Long amount, int affectedRows) { + if (affectedRows == 1 || affectedRows == 2) { + log.info("{}成功: fromUserId={}, toUserId={}, amount={}分", + operation, fromUserId, toUserId, amount); + return true; + } else { + log.error("{}失败: fromUserId={}, toUserId={}, amount={}分, affectedRows={}", + operation, fromUserId, toUserId, amount, affectedRows); + throw new ServiceException("转账失败,请稍后重试"); + } + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml new file mode 100644 index 0000000..fd150ad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..9057a0e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..6bcce51 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..c64b551 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..5ef14ee --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml new file mode 100644 index 0000000..8c2c080 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml new file mode 100644 index 0000000..d9b25bd --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..322403f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..1705bb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..b51f6e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark + from sys_role r + left join sys_user_role sur on sur.role_id = r.role_id + left join sys_user u on u.user_id = sur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..f01dc5e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml new file mode 100644 index 0000000..baa4b59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..f2a36a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE sys_user + SET + balance = CASE + + WHEN #{fromUserId} = #{toUserId} AND user_id = #{fromUserId} + THEN balance - #{amount} + + + WHEN user_id = #{fromUserId} + THEN balance - #{amount} + ELSE balance + END, + + freeze = CASE + + WHEN #{fromUserId} = #{toUserId} AND user_id = #{fromUserId} + THEN freeze + #{amount} + + + WHEN user_id = #{toUserId} + THEN freeze + #{amount} + ELSE freeze + END + WHERE + + del_flag = '0' + AND status = '0' + AND ( + + ( + #{fromUserId} = #{toUserId} + AND user_id = #{fromUserId} + AND balance >= #{amount} + ) + OR + + ( + #{fromUserId} != #{toUserId} + AND user_id IN (#{fromUserId}, #{toUserId}) + AND ( + (user_id = #{fromUserId} AND balance >= #{amount}) + OR user_id = #{toUserId} + ) + ) + ) + + + + + + UPDATE sys_user + SET + balance = CASE + + WHEN #{fromUserId} = #{toUserId} AND user_id = #{fromUserId} + THEN balance + #{amount} + + + WHEN user_id = #{fromUserId} + THEN balance + WHEN user_id = #{toUserId} + THEN balance + #{amount} + ELSE balance + END, + + freeze = CASE + + WHEN #{fromUserId} = #{toUserId} AND user_id = #{fromUserId} + THEN freeze - #{amount} + + + WHEN user_id = #{fromUserId} + THEN freeze - #{amount} + WHEN user_id = #{toUserId} + THEN freeze + ELSE freeze + END + WHERE + + del_flag = '0' + AND status = '0' + AND ( + + ( + #{fromUserId} = #{toUserId} + AND user_id = #{fromUserId} + AND freeze >= #{amount} + ) + OR + + ( + #{fromUserId} != #{toUserId} + AND user_id IN (#{fromUserId}, #{toUserId}) + AND ( + (user_id = #{fromUserId} AND freeze >= #{amount}) + OR user_id = #{toUserId} + ) + ) + ) + + + + UPDATE sys_user + SET balance = #{balance} + where user_id = #{userId} + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..bc52d1a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/README.md b/ruoyi-modules/ruoyi-workflow/README.md new file mode 100644 index 0000000..59096b1 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/README.md @@ -0,0 +1,3 @@ +# 工作流说明 + +工作流目前在未成熟阶段 后续仍会经历重构 甚至重写(生产使用前请慎重考虑后续是否要更新维护) \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml new file mode 100644 index 0000000..d195faf --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -0,0 +1,84 @@ + + + + org.dromara + ruoyi-modules + ${revision} + ../pom.xml + + 4.0.0 + jar + ruoyi-workflow + + + 工作流模块 + + + + + + org.dromara + ruoyi-common-sse + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-mybatis + + + org.dromara + ruoyi-common-web + + + org.dromara + ruoyi-common-log + + + org.dromara + ruoyi-common-idempotent + + + org.dromara + ruoyi-common-excel + + + org.dromara + ruoyi-common-translation + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-security + + + org.dromara.warm + warm-flow-mybatis-plus-sb3-starter + + + org.dromara.warm + warm-flow-plugin-ui-sb-web + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java new file mode 100644 index 0000000..5d24b35 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/ConditionalOnEnable.java @@ -0,0 +1,14 @@ +package org.dromara.workflow.common; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) +@ConditionalOnProperty(value = "warm-flow.enabled", havingValue = "true") +public @interface ConditionalOnEnable { +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java new file mode 100644 index 0000000..0fe5cfe --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java @@ -0,0 +1,53 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 消息类型枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum MessageTypeEnum { + + /** + * 站内信 + */ + SYSTEM_MESSAGE("1", "站内信"), + + /** + * 邮箱 + */ + EMAIL_MESSAGE("2", "邮箱"), + + /** + * 短信 + */ + SMS_MESSAGE("3", "短信"); + + private final String code; + + private final String desc; + + private static final Map MESSAGE_TYPE_ENUM_MAP = Arrays.stream(values()) + .collect(Collectors.toConcurrentMap(MessageTypeEnum::getCode, Function.identity())); + + /** + * 根据消息类型 code 获取 MessageTypeEnum + * + * @param code 消息类型code + * @return MessageTypeEnum + */ + public static MessageTypeEnum getByCode(String code) { + return MESSAGE_TYPE_ENUM_MAP.getOrDefault(code, null); + } + +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java new file mode 100644 index 0000000..eed1b91 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeType.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 人员类型 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum TaskAssigneeType { + + /** + * 待办任务的审批人权限 + *

该权限表示用户是待办任务的审批人,负责审核任务的执行情况。

+ */ + APPROVER("1", "待办任务的审批人权限"), + + /** + * 待办任务的转办人权限 + *

该权限表示用户是待办任务的转办人,负责将任务分配给其他人员。

+ */ + TRANSFER("2", "待办任务的转办人权限"), + + /** + * 待办任务的委托人权限 + *

该权限表示用户是待办任务的委托人,能够委托其他人代为处理任务。

+ */ + DELEGATE("3", "待办任务的委托人权限"), + + /** + * 待办任务的抄送人权限 + *

该权限表示用户是待办任务的抄送人,仅接收任务信息的通知,不参与任务的审批或处理。

+ */ + COPY("4", "待办任务的抄送人权限"); + + /** + * 类型 + */ + private final String code; + + /** + * 描述 + */ + private final String description; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java new file mode 100644 index 0000000..d18ebb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java @@ -0,0 +1,104 @@ +package org.dromara.workflow.common.enums; + +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 任务状态枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum TaskStatusEnum { + + /** + * 撤销 + */ + CANCEL("cancel", "撤销"), + + /** + * 通过 + */ + PASS("pass", "通过"), + + /** + * 待审核 + */ + WAITING("waiting", "待审核"), + + /** + * 作废 + */ + INVALID("invalid", "作废"), + + /** + * 退回 + */ + BACK("back", "退回"), + + /** + * 终止 + */ + TERMINATION("termination", "终止"), + + /** + * 转办 + */ + TRANSFER("transfer", "转办"), + + /** + * 委托 + */ + DEPUTE("depute", "委托"), + + /** + * 抄送 + */ + COPY("copy", "抄送"), + + /** + * 加签 + */ + SIGN("sign", "加签"), + + /** + * 减签 + */ + SIGN_OFF("sign_off", "减签"), + + /** + * 超时 + */ + TIMEOUT("timeout", "超时"); + + /** + * 状态 + */ + private final String status; + + /** + * 描述 + */ + private final String desc; + + private static final Map STATUS_DESC_MAP = Arrays.stream(values()) + .collect(Collectors.toConcurrentMap(TaskStatusEnum::getStatus, TaskStatusEnum::getDesc)); + + /** + * 任务业务状态 + * + * @param status 状态 + */ + public static String findByStatus(String status) { + // 从缓存中直接获取描述 + return STATUS_DESC_MAP.getOrDefault(status, StrUtil.EMPTY); + } + +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java new file mode 100644 index 0000000..08f1808 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/config/WarmFlowConfig.java @@ -0,0 +1,16 @@ +package org.dromara.workflow.config; + +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.context.annotation.Configuration; + +/** + * warmFlow配置 + * + * @author may + */ +@ConditionalOnEnable +@Configuration +public class WarmFlowConfig { + +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java new file mode 100644 index 0000000..37d414f --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -0,0 +1,132 @@ +package org.dromara.workflow.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.lang.tree.Tree; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.bo.FlowCategoryBo; +import org.dromara.workflow.domain.vo.FlowCategoryVo; +import org.dromara.workflow.service.IFlwCategoryService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 流程分类 + * + * @author may + */ +@ConditionalOnEnable +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/category") +public class FlwCategoryController extends BaseController { + + private final IFlwCategoryService flwCategoryService; + + /** + * 查询流程分类列表 + */ + @SaCheckPermission("workflow:category:list") + @GetMapping("/list") + public R> list(FlowCategoryBo bo) { + List list = flwCategoryService.queryList(bo); + return R.ok(list); + } + + /** + * 导出流程分类列表 + */ + @SaCheckPermission("workflow:category:export") + @Log(title = "流程分类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(FlowCategoryBo bo, HttpServletResponse response) { + List list = flwCategoryService.queryList(bo); + ExcelUtil.exportExcel(list, "流程分类", FlowCategoryVo.class, response); + } + + /** + * 获取流程分类详细信息 + * + * @param categoryId 主键 + */ + @SaCheckPermission("workflow:category:query") + @GetMapping("/{categoryId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long categoryId) { + flwCategoryService.checkCategoryDataScope(categoryId); + return R.ok(flwCategoryService.queryById(categoryId)); + } + + /** + * 新增流程分类 + */ + @SaCheckPermission("workflow:category:add") + @Log(title = "流程分类", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo category) { + if (!flwCategoryService.checkCategoryNameUnique(category)) { + return R.fail("新增流程分类'" + category.getCategoryName() + "'失败,流程分类名称已存在"); + } + return toAjax(flwCategoryService.insertByBo(category)); + } + + /** + * 修改流程分类 + */ + @SaCheckPermission("workflow:category:edit") + @Log(title = "流程分类", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo category) { + Long categoryId = category.getCategoryId(); + flwCategoryService.checkCategoryDataScope(categoryId); + if (!flwCategoryService.checkCategoryNameUnique(category)) { + return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,流程分类名称已存在"); + } else if (category.getParentId().equals(categoryId)) { + return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,上级流程分类不能是自己"); + } + return toAjax(flwCategoryService.updateByBo(category)); + } + + /** + * 删除流程分类 + * + * @param categoryId 主键 + */ + @SaCheckPermission("workflow:category:remove") + @Log(title = "流程分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{categoryId}") + public R remove(@PathVariable Long categoryId) { + if (flwCategoryService.hasChildByCategoryId(categoryId)) { + return R.warn("存在下级流程分类,不允许删除"); + } + if (flwCategoryService.checkCategoryExistDefinition(categoryId)) { + return R.warn("流程分类存在流程定义,不允许删除"); + } + return toAjax(flwCategoryService.deleteWithValidById(categoryId)); + } + + /** + * 获取流程分类树列表 + * + * @param categoryBo 流程分类 + */ + @GetMapping("/categoryTree") + public R>> categoryTree(FlowCategoryBo categoryBo) { + return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java new file mode 100644 index 0000000..10d9de8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -0,0 +1,194 @@ +package org.dromara.workflow.controller; + +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.service.IFlwDefinitionService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + +/** + * 流程定义管理 控制层 + * + * @author may + */ +@ConditionalOnEnable +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/definition") +public class FlwDefinitionController extends BaseController { + + private final DefService defService; + private final IFlwDefinitionService flwDefinitionService; + + /** + * 查询流程定义列表 + * + * @param flowDefinition 参数 + * @param pageQuery 分页 + */ + @GetMapping("/list") + public TableDataInfo list(FlowDefinition flowDefinition, PageQuery pageQuery) { + return flwDefinitionService.queryList(flowDefinition, pageQuery); + } + + /** + * 查询未发布的流程定义列表 + * + * @param flowDefinition 参数 + * @param pageQuery 分页 + */ + @GetMapping("/unPublishList") + public TableDataInfo unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery) { + return flwDefinitionService.unPublishList(flowDefinition, pageQuery); + } + + /** + * 获取流程定义详细信息 + * + * @param id 流程定义id + */ + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable Long id) { + return R.ok(defService.getById(id)); + } + + /** + * 新增流程定义 + * + * @param flowDefinition 参数 + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @PostMapping + @RepeatSubmit() + @Transactional(rollbackFor = Exception.class) + public R add(@RequestBody FlowDefinition flowDefinition) { + return R.ok(defService.checkAndSave(flowDefinition)); + } + + /** + * 修改流程定义 + * + * @param flowDefinition 参数 + */ + @Log(title = "流程定义", businessType = BusinessType.UPDATE) + @PutMapping + @RepeatSubmit() + @Transactional(rollbackFor = Exception.class) + public R edit(@RequestBody FlowDefinition flowDefinition) { + return R.ok(defService.updateById(flowDefinition)); + } + + /** + * 发布流程定义 + * + * @param id 流程定义id + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @PutMapping("/publish/{id}") + @RepeatSubmit() + public R publish(@PathVariable Long id) { + return R.ok(flwDefinitionService.publish(id)); + } + + /** + * 取消发布流程定义 + * + * @param id 流程定义id + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @PutMapping("/unPublish/{id}") + @RepeatSubmit() + @Transactional(rollbackFor = Exception.class) + public R unPublish(@PathVariable Long id) { + return R.ok(defService.unPublish(id)); + } + + /** + * 删除流程定义 + */ + @Log(title = "流程定义", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable List ids) { + return toAjax(flwDefinitionService.removeDef(ids)); + } + + /** + * 复制流程定义 + * + * @param id 流程定义id + */ + @Log(title = "流程定义", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + @RepeatSubmit() + @Transactional(rollbackFor = Exception.class) + public R copy(@PathVariable Long id) { + return R.ok(defService.copyDef(id)); + } + + /** + * 导入流程定义 + * + * @param file 文件 + * @param category 分类 + */ + @Log(title = "流程定义", businessType = BusinessType.IMPORT) + @PostMapping("/importDef") + public R importDef(MultipartFile file, String category) { + return R.ok(flwDefinitionService.importJson(file, category)); + } + + /** + * 导出流程定义 + * + * @param id 流程定义id + * @param response 响应 + * @throws IOException 异常 + */ + @Log(title = "流程定义", businessType = BusinessType.EXPORT) + @PostMapping("/exportDef/{id}") + public void exportDef(@PathVariable Long id, HttpServletResponse response) throws IOException { + flwDefinitionService.exportDef(id, response); + } + + /** + * 获取流程定义JSON字符串 + * + * @param id 流程定义id + */ + @GetMapping("/xmlString/{id}") + public R xmlString(@PathVariable Long id) { + return R.ok("操作成功", defService.exportJson(id)); + } + + /** + * 激活/挂起流程定义 + * + * @param id 流程定义id + * @param active 激活/挂起 + */ + @RepeatSubmit() + @PutMapping("/active/{id}") + @Transactional(rollbackFor = Exception.class) + public R active(@PathVariable Long id, @RequestParam boolean active) { + return R.ok(active ? defService.active(id) : defService.unActive(id)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java new file mode 100644 index 0000000..ae99c16 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -0,0 +1,157 @@ +package org.dromara.workflow.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.service.InsService; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.bo.FlowCancelBo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.FlowInvalidBo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; +import org.dromara.workflow.service.IFlwInstanceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 流程实例管理 控制层 + * + * @author may + */ +@ConditionalOnEnable +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/instance") +public class FlwInstanceController extends BaseController { + + private final InsService insService; + private final IFlwInstanceService flwInstanceService; + + /** + * 查询正在运行的流程实例列表 + * + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 + */ + @GetMapping("/pageByRunning") + public TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.selectRunningInstanceList(flowInstanceBo, pageQuery); + } + + /** + * 查询已结束的流程实例列表 + * + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 + */ + @GetMapping("/pageByFinish") + public TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.selectFinishInstanceList(flowInstanceBo, pageQuery); + } + + /** + * 根据业务id查询流程实例详细信息 + * + * @param businessId 业务id + */ + @GetMapping("/getInfo/{businessId}") + public R getInfo(@PathVariable Long businessId) { + return R.ok(flwInstanceService.queryByBusinessId(businessId)); + } + + /** + * 按照业务id删除流程实例 + * + * @param businessIds 业务id + */ + @DeleteMapping("/deleteByBusinessIds/{businessIds}") + public R deleteByBusinessIds(@PathVariable List businessIds) { + return toAjax(flwInstanceService.deleteByBusinessIds(businessIds)); + } + + /** + * 按照实例id删除流程实例 + * + * @param instanceIds 实例id + */ + @DeleteMapping("/deleteByInstanceIds/{instanceIds}") + public R deleteByInstanceIds(@PathVariable List instanceIds) { + return toAjax(flwInstanceService.deleteByInstanceIds(instanceIds)); + } + + /** + * 撤销流程 + * + * @param bo 参数 + */ + @RepeatSubmit() + @PutMapping("/cancelProcessApply") + public R cancelProcessApply(@RequestBody FlowCancelBo bo) { + return toAjax(flwInstanceService.cancelProcessApply(bo)); + } + + /** + * 激活/挂起流程实例 + * + * @param id 流程实例id + * @param active 激活/挂起 + */ + @RepeatSubmit() + @PutMapping("/active/{id}") + public R active(@PathVariable Long id, @RequestParam boolean active) { + return R.ok(active ? insService.active(id) : insService.unActive(id)); + } + + /** + * 获取当前登陆人发起的流程实例 + * + * @param flowInstanceBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/pageByCurrent") + public TableDataInfo selectCurrentInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + return flwInstanceService.selectCurrentInstanceList(flowInstanceBo, pageQuery); + } + + /** + * 获取流程图,流程记录 + * + * @param businessId 业务id + */ + @GetMapping("/flowImage/{businessId}") + public R> flowImage(@PathVariable String businessId) { + return R.ok(flwInstanceService.flowImage(businessId)); + } + + /** + * 获取流程变量 + * + * @param instanceId 流程实例id + */ + @GetMapping("/instanceVariable/{instanceId}") + public R> instanceVariable(@PathVariable Long instanceId) { + return R.ok(flwInstanceService.instanceVariable(instanceId)); + } + + /** + * 作废流程 + * + * @param bo 参数 + */ + @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/invalid") + public R invalid(@Validated @RequestBody FlowInvalidBo bo) { + return R.ok(flwInstanceService.processInvalid(bo)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java new file mode 100644 index 0000000..463916b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -0,0 +1,201 @@ +package org.dromara.workflow.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.dto.StartProcessReturnDTO; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.warm.flow.core.entity.Node; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.dromara.workflow.service.IFlwTaskService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 任务管理 控制层 + * + * @author may + */ +@ConditionalOnEnable +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/task") +public class FlwTaskController extends BaseController { + + private final IFlwTaskService flwTaskService; + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/startWorkFlow") + public R startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) { + StartProcessReturnDTO startProcessReturn = flwTaskService.startWorkFlow(startProcessBo); + return R.ok("提交成功", startProcessReturn); + } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/completeTask") + public R completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) { + return toAjax(flwTaskService.completeTask(completeTaskBo)); + } + + /** + * 查询当前用户的待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/pageByTaskWait") + public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByTaskWait(flowTaskBo, pageQuery); + } + + /** + * 查询当前用户的已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + + @GetMapping("/pageByTaskFinish") + public TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByTaskFinish(flowTaskBo, pageQuery); + } + + /** + * 查询待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/pageByAllTaskWait") + public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery); + } + + /** + * 查询已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/pageByAllTaskFinish") + public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery); + } + + /** + * 查询当前用户的抄送 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @GetMapping("/pageByTaskCopy") + public TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + return flwTaskService.pageByTaskCopy(flowTaskBo, pageQuery); + } + + /** + * 根据taskId查询代表任务 + * + * @param taskId 任务id + */ + @GetMapping("/getTask/{taskId}") + public R getTask(@PathVariable Long taskId) { + return R.ok(flwTaskService.selectById(taskId)); + } + + /** + * 终止任务 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/terminationTask") + public R terminationTask(@RequestBody FlowTerminationBo bo) { + return R.ok(flwTaskService.terminationTask(bo)); + } + + /** + * 任务操作 + * + * @param bo 参数 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ + @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PostMapping("/taskOperation/{taskOperation}") + public R taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) { + return toAjax(flwTaskService.taskOperation(bo, taskOperation)); + } + + /** + * 修改任务办理人 + * + * @param taskIdList 任务id + * @param userId 办理人id + */ + @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/updateAssignee/{userId}") + public R updateAssignee(@RequestBody List taskIdList, @PathVariable String userId) { + return toAjax(flwTaskService.updateAssignee(taskIdList, userId)); + } + + /** + * 驳回审批 + * + * @param bo 参数 + */ + @Log(title = "任务管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/backProcess") + public R backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo bo) { + return toAjax(flwTaskService.backProcess(bo)); + } + + /** + * 获取可驳回的前置节点 + * + * @param definitionId 流程定义id + * @param nowNodeCode 当前节点 + */ + @GetMapping("/getBackTaskNode/{definitionId}/{nowNodeCode}") + public R> getBackTaskNode(@PathVariable Long definitionId, @PathVariable String nowNodeCode) { + return R.ok(flwTaskService.getBackTaskNode(definitionId, nowNodeCode)); + } + + /** + * 获取当前任务的所有办理人 + * + * @param taskId 任务id + */ + @GetMapping("/currentTaskAllUser/{taskId}") + public R> currentTaskAllUser(@PathVariable Long taskId) { + return R.ok(flwTaskService.currentTaskAllUser(taskId)); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java new file mode 100644 index 0000000..98825d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java @@ -0,0 +1,108 @@ +package org.dromara.workflow.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; +import org.dromara.workflow.service.ITestLeaveService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 请假 + * + * @author may + * @date 2023-07-21 + */ +@ConditionalOnEnable +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/leave") +public class TestLeaveController extends BaseController { + + private final ITestLeaveService testLeaveService; + + /** + * 查询请假列表 + */ + @SaCheckPermission("workflow:leave:list") + @GetMapping("/list") + public TableDataInfo list(TestLeaveBo bo, PageQuery pageQuery) { + return testLeaveService.queryPageList(bo, pageQuery); + } + + /** + * 导出请假列表 + */ + @SaCheckPermission("workflow:leave:export") + @Log(title = "请假", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TestLeaveBo bo, HttpServletResponse response) { + List list = testLeaveService.queryList(bo); + ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response); + } + + /** + * 获取请假详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("workflow:leave:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(testLeaveService.queryById(id)); + } + + /** + * 新增请假 + */ + @SaCheckPermission("workflow:leave:add") + @Log(title = "请假", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TestLeaveBo bo) { + return R.ok(testLeaveService.insertByBo(bo)); + } + + /** + * 修改请假 + */ + @SaCheckPermission("workflow:leave:edit") + @Log(title = "请假", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestLeaveBo bo) { + return R.ok(testLeaveService.updateByBo(bo)); + } + + /** + * 删除请假 + * + * @param ids 主键串 + */ + @SaCheckPermission("workflow:leave:remove") + @Log(title = "请假", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids))); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java new file mode 100644 index 0000000..7d42a9b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java @@ -0,0 +1,63 @@ +package org.dromara.workflow.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 请假对象 test_leave + * + * @author may + * @date 2023-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_leave") +public class TestLeave extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 请假类型 + */ + private String leaveType; + + /** + * 开始时间 + */ + private Date startDate; + + /** + * 结束时间 + */ + private Date endDate; + + /** + * 请假天数 + */ + private Integer leaveDays; + + /** + * 请假原因 + */ + private String remark; + + /** + * 状态 + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java new file mode 100644 index 0000000..3117a33 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -0,0 +1,71 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + + +/** + * 驳回参数请求 + * + * @author may + */ +@Data +public class BackProcessBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务ID + */ + @NotNull(message = "任务ID不能为空", groups = AddGroup.class) + private Long taskId; + + /** + * 附件id + */ + private String fileId; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 驳回的节点id(目前未使用,直接驳回到申请人) + */ + @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class) + private String nodeCode; + + /** + * 办理意见 + */ + private String message; + + /** + * 通知 + */ + private String notice; + + /** + * 流程变量 + */ + private Map variables; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java new file mode 100644 index 0000000..9fdf484 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -0,0 +1,75 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 办理任务请求对象 + * + * @author may + */ +@Data +public class CompleteTaskBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + @NotNull(message = "任务id不能为空", groups = {AddGroup.class}) + private Long taskId; + + /** + * 附件id + */ + private String fileId; + + /** + * 抄送人员 + */ + private List flowCopyList; + + /** + * 消息类型 + */ + private List messageType; + + /** + * 办理意见 + */ + private String message; + + /** + * 消息通知 + */ + private String notice; + + /** + * 流程变量 + */ + private Map variables; + + /** + * 扩展变量(此处为逗号分隔的ossId) + * @return + */ + private String ext; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java new file mode 100644 index 0000000..fd626eb --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowCategoryBo.java @@ -0,0 +1,47 @@ +package org.dromara.workflow.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.FlowCategory; + +/** + * 流程分类业务对象 wf_category + * + * @author may + * @date 2023-06-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = FlowCategory.class, reverseConvertGenerate = false) +public class FlowCategoryBo extends BaseEntity { + + /** + * 流程分类ID + */ + @NotNull(message = "流程分类ID不能为空", groups = { EditGroup.class }) + private Long categoryId; + + /** + * 父流程分类id + */ + @NotNull(message = "父流程分类id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long parentId; + + /** + * 流程分类名称 + */ + @NotBlank(message = "流程分类名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String categoryName; + + /** + * 显示顺序 + */ + private Long orderNum; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java new file mode 100644 index 0000000..fb1fe61 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -0,0 +1,55 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 流程实例请求对象 + * + * @author may + */ +@Data +public class FlowInstanceBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 任务发起人 + */ + private String startUserId; + + /** + * 业务id + */ + private String businessId; + + /** + * 流程分类id + */ + private String category; + + /** + * 任务名称 + */ + private String nodeName; + + /** + * 申请人Ids + */ + private List createByIds; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java new file mode 100644 index 0000000..297bd00 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInvalidBo.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 作废请求对象 + * + * @author may + */ +@Data +public class FlowInvalidBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程实例id + */ + @NotNull(message = "流程实例id为空", groups = AddGroup.class) + private Long id; + + /** + * 审批意见 + */ + private String comment; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java new file mode 100644 index 0000000..64dd082 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -0,0 +1,55 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 任务请求对象 + * + * @author may + */ +@Data +public class FlowTaskBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务名称 + */ + private String nodeName; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程分类id + */ + private String category; + + /** + * 流程实例id + */ + private Long instanceId; + + /** + * 权限列表 + */ + private List permissionList; + + /** + * 申请人Ids + */ + private List createByIds; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java new file mode 100644 index 0000000..897fc21 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTerminationBo.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 终止任务请求对象 + * + * @author may + */ +@Data +public class FlowTerminationBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务id + */ + @NotNull(message = "任务id为空", groups = AddGroup.class) + private Long taskId; + + /** + * 审批意见 + */ + private String comment; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java new file mode 100644 index 0000000..4348e31 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java @@ -0,0 +1,48 @@ +package org.dromara.workflow.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 任务操作业务对象,用于描述任务委派、转办、加签等操作的必要参数 + * 包含了用户ID、任务ID、任务相关的消息、以及加签/减签的用户ID + * + * @author AprilWind + */ +@Data +public class TaskOperationBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 委派/转办人的用户ID(必填,准对委派/转办人操作) + */ + @NotNull(message = "委派/转办人id不能为空", groups = {AddGroup.class}) + private String userId; + + /** + * 加签/减签人的用户ID列表(必填,针对加签/减签操作) + */ + @NotNull(message = "加签/减签id不能为空", groups = {EditGroup.class}) + private List userIds; + + /** + * 任务ID(必填) + */ + @NotNull(message = "任务id不能为空") + private Long taskId; + + /** + * 意见或备注信息(可选) + */ + private String message; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java new file mode 100644 index 0000000..a1a4b59 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/TestLeaveBo.java @@ -0,0 +1,79 @@ +package org.dromara.workflow.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.workflow.domain.TestLeave; + +import java.util.Date; + +/** + * 请假业务对象 test_leave + * + * @author may + * @date 2023-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestLeave.class, reverseConvertGenerate = false) +public class TestLeaveBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 请假类型 + */ + @NotBlank(message = "请假类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String leaveType; + + /** + * 开始时间 + */ + @NotNull(message = "开始时间不能为空", groups = {AddGroup.class, EditGroup.class}) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + /** + * 结束时间 + */ + @NotNull(message = "结束时间不能为空", groups = {AddGroup.class, EditGroup.class}) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + /** + * 请假天数 + */ + private Integer leaveDays; + + /** + * 开始时间 + */ + private Integer startLeaveDays; + + /** + * 结束时间 + */ + private Integer endLeaveDays; + + /** + * 请假原因 + */ + private String remark; + + /** + * 状态 + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java new file mode 100644 index 0000000..c5d2785 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -0,0 +1,67 @@ +package org.dromara.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.workflow.domain.FlowCategory; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 流程分类视图对象 wf_category + * + * @author may + * @date 2023-06-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = FlowCategory.class) +public class FlowCategoryVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 流程分类ID + */ + @ExcelProperty(value = "流程分类ID") + private Long categoryId; + + /** + * 父级id + */ + private Long parentId; + + /** + * 父类别名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 流程分类名称 + */ + @ExcelProperty(value = "流程分类名称") + private String categoryName; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "显示顺序") + private Long orderNum; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java new file mode 100644 index 0000000..aef7573 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowDefinitionVo.java @@ -0,0 +1,104 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.workflow.common.constant.FlowConstant; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流程定义视图 + * + * @author may + */ +@Data +public class FlowDefinitionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程分类id + */ + private String category; + + /** + * 流程分类名称 + */ + @Translation(type = FlowConstant.CATEGORY_ID_TO_NAME, mapper = "category") + private String categoryName; + + /** + * 流程版本 + */ + private String version; + + /** + * 是否发布(0未发布 1已发布 9失效) + */ + private Integer isPublish; + + /** + * 审批表单是否自定义(Y是 N否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 监听器类型 + */ + private String listenerType; + + /** + * 监听器路径 + */ + private String listenerPath; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java new file mode 100644 index 0000000..8776a76 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -0,0 +1,244 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.warm.flow.core.enums.CooperateType; +import org.dromara.workflow.common.constant.FlowConstant; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 历史任务视图 + * + * @author may + */ +@Data +public class FlowHisTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 任务表id + */ + private Long taskId; + + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + private Integer cooperateType; + + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + private String cooperateTypeName; + + /** + * 业务id + */ + private String businessId; + + /** + * 开始节点编码 + */ + private String nodeCode; + + /** + * 开始节点名称 + */ + private String nodeName; + + /** + * 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 目标节点编码 + */ + private String targetNodeCode; + + /** + * 结束节点名称 + */ + private String targetNodeName; + + /** + * 审批者 + */ + private String approver; + + /** + * 审批者 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver") + private String approveName; + + /** + * 协作人(只有转办、会签、票签、委派) + */ + private String collaborator; + + /** + * 权限标识 permissionFlag的list形式 + */ + private List permissionList; + + /** + * 跳转类型(PASS通过 REJECT退回 NONE无动作) + */ + private String skipType; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 任务状态 + */ + private String flowTaskStatus; + + /** + * 流程状态 + */ + private String flowStatusName; + + /** + * 审批意见 + */ + private String message; + + /** + * 业务详情 存业务类的json + */ + private String ext; + + /** + * 创建者 + */ + private String createBy; + + /** + * 申请人 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; + + /** + * 流程分类id + */ + private String category; + + /** + * 流程分类名称 + */ + @Translation(type = FlowConstant.CATEGORY_ID_TO_NAME, mapper = "category") + private String categoryName; + + /** + * 审批表单是否自定义(Y是 N否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程版本号 + */ + private String version; + + /** + * 运行时长 + */ + private String runDuration; + + /** + * 设置创建时间并计算任务运行时长 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + updateRunDuration(); + } + + /** + * 设置更新时间并计算任务运行时长 + * + * @param updateTime 更新时间 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + updateRunDuration(); + } + + /** + * 更新运行时长 + */ + private void updateRunDuration() { + // 如果创建时间和更新时间均不为空,计算它们之间的时长 + if (this.updateTime != null && this.createTime != null) { + this.runDuration = DateUtils.getTimeDifference(this.updateTime, this.createTime); + } + } + + /** + * 设置协作方式,并通过协作方式获取名称 + */ + public void setCooperateType(Integer cooperateType) { + this.cooperateType = cooperateType; + this.cooperateTypeName = CooperateType.getValueByKey(cooperateType); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java new file mode 100644 index 0000000..75543f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -0,0 +1,137 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.workflow.common.constant.FlowConstant; + +import java.util.Date; + +/** + * 流程实例视图 + * + * @author may + */ +@Data +public class FlowInstanceVo { + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程节点编码 每个流程的nodeCode是唯一的,即definitionId+nodeCode唯一,在数据库层面做了控制 + */ + private String nodeCode; + + /** + * 流程节点名称 + */ + private String nodeName; + + /** + * 流程变量 + */ + private String variable; + + /** + * 流程状态(0待提交 1审批中 2 审批通过 3自动通过 8已完成 9已退回 10失效) + */ + private String flowStatus; + + /** + * 流程状态 + */ + private String flowStatusName; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 审批表单是否自定义(Y是 N否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; + + /** + * 流程定义版本 + */ + private String version; + + /** + * 创建者 + */ + private String createBy; + + /** + * 申请人 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; + + /** + * 流程分类id + */ + private String category; + + /** + * 流程分类名称 + */ + @Translation(type = FlowConstant.CATEGORY_ID_TO_NAME, mapper = "category") + private String categoryName; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java new file mode 100644 index 0000000..3fb08d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -0,0 +1,176 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.warm.flow.core.entity.User; +import org.dromara.workflow.common.constant.FlowConstant; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 任务视图 + * + * @author may + */ +@Data +public class FlowTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点编码 + */ + private String nodeCode; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 权限标识 permissionFlag的list形式 + */ + private List permissionList; + + /** + * 流程用户列表 + */ + private List userList; + + /** + * 审批表单是否自定义(Y是 N否) + */ + private String formCustom; + + /** + * 审批表单 + */ + private String formPath; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程版本号 + */ + private String version; + + /** + * 流程状态 + */ + private String flowStatus; + + /** + * 流程分类id + */ + private String category; + + /** + * 流程分类名称 + */ + @Translation(type = FlowConstant.CATEGORY_ID_TO_NAME, mapper = "category") + private String categoryName; + + /** + * 流程状态 + */ + @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "flowStatus", other = "wf_business_status") + private String flowStatusName; + + /** + * 办理人类型 + */ + private String type; + + /** + * 办理人ids + */ + private String assigneeIds; + + /** + * 办理人名称 + */ + private String assigneeNames; + + /** + * 抄送人id + */ + private String processedBy; + + /** + * 抄送人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "processedBy") + private String processedByName; + + /** + * 流程签署比例值 大于0为票签,会签 + */ + private BigDecimal nodeRatio; + + /** + * 申请人id + */ + private String createBy; + + /** + * 申请人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") + private String createByName; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java new file mode 100644 index 0000000..47886d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -0,0 +1,70 @@ +package org.dromara.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.workflow.domain.TestLeave; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 请假视图对象 test_leave + * + * @author may + * @date 2023-07-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestLeave.class) +public class TestLeaveVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 请假类型 + */ + @ExcelProperty(value = "请假类型") + private String leaveType; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date startDate; + + /** + * 结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endDate; + + /** + * 请假天数 + */ + @ExcelProperty(value = "请假天数") + private Integer leaveDays; + + /** + * 备注 + */ + @ExcelProperty(value = "请假原因") + private String remark; + + /** + * 状态 + */ + @ExcelProperty(value = "状态") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java new file mode 100644 index 0000000..4b215ef --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -0,0 +1,82 @@ +package org.dromara.workflow.handler; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessDeleteEvent; +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.domain.event.ProcessTaskEvent; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 流程监听服务 + * + * @author may + * @date 2024-06-02 + */ +@ConditionalOnEnable +@Slf4j +@Component +public class FlowProcessEventHandler { + + /** + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) + * + * @param flowCode 流程定义编码 + * @param businessId 业务id + * @param status 状态 + * @param submit 当为true时为申请人节点办理 + */ + public void processHandler(String flowCode, String businessId, String status, Map params, boolean submit) { + String tenantId = TenantHelper.getTenantId(); + log.info("发布流程事件,租户ID: {}, 流程状态: {}, 流程编码: {}, 业务ID: {}, 是否申请人节点办理: {}", tenantId, status, flowCode, businessId, submit); + ProcessEvent processEvent = new ProcessEvent(); + processEvent.setTenantId(tenantId); + processEvent.setFlowCode(flowCode); + processEvent.setBusinessId(businessId); + processEvent.setStatus(status); + processEvent.setParams(params); + processEvent.setSubmit(submit); + SpringUtils.context().publishEvent(processEvent); + } + + /** + * 执行办理任务监听 + * + * @param flowCode 流程定义编码 + * @param nodeCode 审批节点编码 + * @param taskId 任务id + * @param businessId 业务id + */ + public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) { + String tenantId = TenantHelper.getTenantId(); + log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点编码: {}, 任务ID: {}, 业务ID: {}", tenantId, flowCode, nodeCode, taskId, businessId); + ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); + processTaskEvent.setTenantId(tenantId); + processTaskEvent.setFlowCode(flowCode); + processTaskEvent.setNodeCode(nodeCode); + processTaskEvent.setTaskId(taskId); + processTaskEvent.setBusinessId(businessId); + SpringUtils.context().publishEvent(processTaskEvent); + } + + /** + * 删除流程监听 + * + * @param flowCode 流程定义编码 + * @param businessId 业务ID + */ + public void processDeleteHandler(String flowCode, String businessId) { + String tenantId = TenantHelper.getTenantId(); + log.info("发布删除流程事件, 租户ID: {}, 流程编码: {}, 业务ID: {}", tenantId, flowCode, businessId); + ProcessDeleteEvent processDeleteEvent = new ProcessDeleteEvent(); + processDeleteEvent.setTenantId(tenantId); + processDeleteEvent.setFlowCode(flowCode); + processDeleteEvent.setBusinessId(businessId); + SpringUtils.context().publishEvent(processDeleteEvent); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java new file mode 100644 index 0000000..c18e4ed --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -0,0 +1,73 @@ +package org.dromara.workflow.handler; + +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.enums.TaskAssigneeEnum; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.handler.PermissionHandler; +import org.dromara.warm.flow.core.service.impl.TaskServiceImpl; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 办理人权限处理器 + * + * @author AprilWind + */ +@ConditionalOnEnable +@RequiredArgsConstructor +@Component +@Slf4j +public class WorkflowPermissionHandler implements PermissionHandler { + + /** + * 审批前获取当前办理人,办理时会校验的该权限集合 + * 后续在{@link TaskServiceImpl#checkAuth(Task, FlowParams)} 中调用 + * 返回当前用户权限集合 + */ + @Override + public List permissions() { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return new ArrayList<>(); + } + // 使用一个流来构建权限列表 + return Stream.of( + // 角色权限前缀 + loginUser.getRoles().stream() + .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), + + // 岗位权限前缀 + Stream.ofNullable(loginUser.getPosts()) + .flatMap(Collection::stream) + .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), + + // 用户和部门权限 + Stream.of(String.valueOf(loginUser.getUserId()), + TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId() + ) + ) + .flatMap(stream -> stream) + .collect(Collectors.toList()); + } + + /** + * 获取当前办理人 + * + * @return 当前办理人 + */ + @Override + public String getHandler() { + return LoginHelper.getUserIdStr(); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java new file mode 100644 index 0000000..d2c0b3a --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -0,0 +1,60 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.workflow.domain.FlowCategory; +import org.dromara.workflow.domain.vo.FlowCategoryVo; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 流程分类Mapper接口 + * + * @author may + * @date 2023-06-27 + */ +public interface FlwCategoryMapper extends BaseMapperPlus { + + /** + * 统计指定流程分类ID的分类数量 + * + * @param categoryId 流程分类ID + * @return 该流程分类ID的分类数量 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "createDept") + }) + long countCategoryById(Long categoryId); + + /** + * 根据父流程分类ID查询其所有子流程分类的列表 + * + * @param parentId 父流程分类ID + * @return 包含子流程分类的列表 + */ + default List selectListByParentId(Long parentId) { + return this.selectList(new LambdaQueryWrapper() + .select(FlowCategory::getCategoryId) + .apply(DataBaseHelper.findInSet(parentId, "ancestors"))); + } + + /** + * 根据父流程分类ID查询包括父ID及其所有子流程分类ID的列表 + * + * @param parentId 父流程分类ID + * @return 包含父ID和子流程分类ID的列表 + */ + default List selectCategoryIdsByParentId(Long parentId) { + return Stream.concat( + this.selectListByParentId(parentId).stream() + .map(FlowCategory::getCategoryId), + Stream.of(parentId) + ).collect(Collectors.toList()); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java new file mode 100644 index 0000000..cd1edba --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/TestLeaveMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.TestLeave; +import org.dromara.workflow.domain.vo.TestLeaveVo; + +/** + * 请假Mapper接口 + * + * @author may + * @date 2023-07-21 + */ +public interface TestLeaveMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java new file mode 100644 index 0000000..91f173d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java @@ -0,0 +1,102 @@ +package org.dromara.workflow.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.workflow.domain.bo.FlowCategoryBo; +import org.dromara.workflow.domain.vo.FlowCategoryVo; + +import java.util.List; + +/** + * 流程分类Service接口 + * + * @author may + */ +public interface IFlwCategoryService { + + /** + * 查询流程分类 + * + * @param categoryId 主键 + * @return 流程分类 + */ + FlowCategoryVo queryById(Long categoryId); + + /** + * 根据流程分类ID查询流程分类名称 + * + * @param categoryId 流程分类ID + * @return 流程分类名称 + */ + String selectCategoryNameById(Long categoryId); + + /** + * 查询符合条件的流程分类列表 + * + * @param bo 查询条件 + * @return 流程分类列表 + */ + List queryList(FlowCategoryBo bo); + + /** + * 查询流程分类树结构信息 + * + * @param category 流程分类信息 + * @return 流程分类树信息集合 + */ + List> selectCategoryTreeList(FlowCategoryBo category); + + /** + * 校验流程分类是否有数据权限 + * + * @param categoryId 流程分类ID + */ + void checkCategoryDataScope(Long categoryId); + + /** + * 校验流程分类名称是否唯一 + * + * @param category 流程分类信息 + * @return 结果 + */ + boolean checkCategoryNameUnique(FlowCategoryBo category); + + /** + * 查询流程分类是否存在流程定义 + * + * @param categoryId 流程分类ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkCategoryExistDefinition(Long categoryId); + + /** + * 是否存在流程分类子节点 + * + * @param categoryId 流程分类ID + * @return 结果 + */ + boolean hasChildByCategoryId(Long categoryId); + + /** + * 新增流程分类 + * + * @param bo 流程分类 + * @return 是否新增成功 + */ + int insertByBo(FlowCategoryBo bo); + + /** + * 修改流程分类 + * + * @param bo 流程分类 + * @return 是否修改成功 + */ + int updateByBo(FlowCategoryBo bo); + + /** + * 删除流程分类信息 + * + * @param categoryId 主键 + * @return 是否删除成功 + */ + int deleteWithValidById(Long categoryId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java new file mode 100644 index 0000000..99729c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -0,0 +1,159 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.workflow.domain.bo.FlowCancelBo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.FlowInvalidBo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; + +import java.util.List; +import java.util.Map; + +/** + * 流程实例 服务层 + * + * @author may + */ +public interface IFlwInstanceService { + + /** + * 分页查询正在运行的流程实例 + * + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); + + /** + * 分页查询已结束的流程实例 + * + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery); + + /** + * 根据业务id查询流程实例详细信息 + * + * @param businessId 业务id + * @return 结果 + */ + FlowInstanceVo queryByBusinessId(Long businessId); + + /** + * 按照业务id查询流程实例 + * + * @param businessId 业务id + * @return 结果 + */ + FlowInstance selectInstByBusinessId(String businessId); + + /** + * 按照实例id查询流程实例 + * + * @param instanceId 实例id + * @return 结果 + */ + FlowInstance selectInstById(Long instanceId); + + /** + * 按照实例id查询流程实例 + * + * @param instanceIds 实例id + * @return 结果 + */ + List selectInstListByIdList(List instanceIds); + + /** + * 按照业务id删除流程实例 + * + * @param businessIds 业务id + * @return 结果 + */ + boolean deleteByBusinessIds(List businessIds); + + /** + * 按照实例id删除流程实例 + * + * @param instanceIds 实例id + * @return 结果 + */ + boolean deleteByInstanceIds(List instanceIds); + + /** + * 撤销流程 + * + * @param bo 参数 + * @return 结果 + */ + boolean cancelProcessApply(FlowCancelBo bo); + + /** + * 获取当前登陆人发起的流程实例 + * + * @param instanceBo 流程实例 + * @param pageQuery 分页 + * @return 结果 + */ + TableDataInfo selectCurrentInstanceList(FlowInstanceBo instanceBo, PageQuery pageQuery); + + /** + * 获取流程图,流程记录 + * + * @param businessId 业务id + * @return 结果 + */ + Map flowImage(String businessId); + + /** + * 按照实例id更新状态 + * + * @param instanceId 实例id + * @param status 状态 + */ + void updateStatus(Long instanceId, String status); + + /** + * 获取流程变量 + * + * @param instanceId 实例id + * @return 结果 + */ + Map instanceVariable(Long instanceId); + + /** + * 设置流程变量 + * + * @param instanceId 实例id + * @param variable 流程变量 + */ + void setVariable(Long instanceId, Map variable); + + /** + * 按任务id查询实例 + * + * @param taskId 任务id + * @return 结果 + */ + FlowInstance selectByTaskId(Long taskId); + + /** + * 按任务id查询实例 + * + * @param taskIdList 任务id + * @return 结果 + */ + List selectByTaskIdList(List taskIdList); + + /** + * 作废流程 + * + * @param bo 流程实例 + * @return 结果 + */ + boolean processInvalid(FlowInvalidBo bo); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java new file mode 100644 index 0000000..116cb74 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -0,0 +1,22 @@ +package org.dromara.workflow.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 流程设计器-获取办理人 + * + * @author AprilWind + */ +public interface IFlwTaskAssigneeService { + + /** + * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * + * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") + * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + */ + List fetchUsersByStorageId(String storageId); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java new file mode 100644 index 0000000..67b50ba --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/ITestLeaveService.java @@ -0,0 +1,47 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.TestLeaveBo; +import org.dromara.workflow.domain.vo.TestLeaveVo; + +import java.util.List; + +/** + * 请假Service接口 + * + * @author may + * @date 2023-07-21 + */ +public interface ITestLeaveService { + + /** + * 查询请假 + */ + TestLeaveVo queryById(Long id); + + /** + * 查询请假列表 + */ + TableDataInfo queryPageList(TestLeaveBo bo, PageQuery pageQuery); + + /** + * 查询请假列表 + */ + List queryList(TestLeaveBo bo); + + /** + * 新增请假 + */ + TestLeaveVo insertByBo(TestLeaveBo bo); + + /** + * 修改请假 + */ + TestLeaveVo updateByBo(TestLeaveBo bo); + + /** + * 校验并批量删除请假信息 + */ + Boolean deleteWithValidByIds(List ids); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java new file mode 100644 index 0000000..8c73b59 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java @@ -0,0 +1,37 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.convert.Convert; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.core.TranslationInterface; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.service.IFlwCategoryService; +import org.springframework.stereotype.Service; + +/** + * 流程分类名称翻译实现 + * + * @author AprilWind + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +@TranslationType(type = FlowConstant.CATEGORY_ID_TO_NAME) +public class CategoryNameTranslationImpl implements TranslationInterface { + + private final IFlwCategoryService flwCategoryService; + + @Override + public String translation(Object key, String other) { + Long id = null; + if (key instanceof String categoryId) { + id = Convert.toLong(categoryId); + } else if (key instanceof Long categoryId) { + id = categoryId; + } + return flwCategoryService.selectCategoryNameById(id); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java new file mode 100644 index 0000000..591339b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -0,0 +1,266 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.warm.flow.core.dto.DefJson; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.PublishStatus; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.orm.entity.FlowSkip; +import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.orm.mapper.FlowSkipMapper; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.domain.FlowCategory; +import org.dromara.workflow.domain.vo.FlowDefinitionVo; +import org.dromara.workflow.mapper.FlwCategoryMapper; +import org.dromara.workflow.service.IFlwDefinitionService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.dromara.common.core.constant.TenantConstants.DEFAULT_TENANT_ID; + +/** + * 流程定义 服务层实现 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwDefinitionServiceImpl implements IFlwDefinitionService { + + private final DefService defService; + private final FlowDefinitionMapper flowDefinitionMapper; + private final FlowHisTaskMapper flowHisTaskMapper; + private final FlowNodeMapper flowNodeMapper; + private final FlowSkipMapper flowSkipMapper; + private final FlwCategoryMapper flwCategoryMapper; + + /** + * 查询流程定义列表 + * + * @param flowDefinition 流程定义信息 + * @param pageQuery 分页 + * @return 返回分页列表 + */ + @Override + public TableDataInfo queryList(FlowDefinition flowDefinition, PageQuery pageQuery) { + LambdaQueryWrapper wrapper = buildQueryWrapper(flowDefinition); + wrapper.eq(FlowDefinition::getIsPublish, PublishStatus.PUBLISHED.getKey()); + Page page = flowDefinitionMapper.selectPage(pageQuery.build(), wrapper); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); + build.setTotal(page.getTotal()); + return build; + } + + /** + * 查询未发布的流程定义列表 + * + * @param flowDefinition 流程定义信息 + * @param pageQuery 分页 + * @return 返回分页列表 + */ + @Override + public TableDataInfo unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery) { + LambdaQueryWrapper wrapper = buildQueryWrapper(flowDefinition); + wrapper.in(FlowDefinition::getIsPublish, Arrays.asList(PublishStatus.UNPUBLISHED.getKey(), PublishStatus.EXPIRED.getKey())); + Page page = flowDefinitionMapper.selectPage(pageQuery.build(), wrapper); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); + build.setTotal(page.getTotal()); + return build; + } + + private LambdaQueryWrapper buildQueryWrapper(FlowDefinition flowDefinition) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowCode()), FlowDefinition::getFlowCode, flowDefinition.getFlowCode()); + wrapper.like(StringUtils.isNotBlank(flowDefinition.getFlowName()), FlowDefinition::getFlowName, flowDefinition.getFlowName()); + if (StringUtils.isNotBlank(flowDefinition.getCategory())) { + List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowDefinition.getCategory())); + wrapper.in(FlowDefinition::getCategory, StreamUtils.toList(categoryIds, Convert::toStr)); + } + wrapper.orderByDesc(FlowDefinition::getCreateTime); + return wrapper; + } + + /** + * 发布流程定义 + * + * @param id 流程定义id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean publish(Long id) { + List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, id)); + List errorMsg = new ArrayList<>(); + if (CollUtil.isNotEmpty(flowNodes)) { + for (FlowNode flowNode : flowNodes) { + String applyNodeCode = WorkflowUtils.applyNodeCode(id); + if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) { + errorMsg.add(flowNode.getNodeName()); + } + } + if (CollUtil.isNotEmpty(errorMsg)) { + throw new ServiceException("节点【" + StringUtils.join(errorMsg, ",") + "】未配置办理人!"); + } + } + return defService.publish(id); + } + + /** + * 导入流程定义 + * + * @param file 文件 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean importJson(MultipartFile file, String category) { + try { + DefJson defJson = JsonUtils.parseObject(file.getBytes(), DefJson.class); + defJson.setCategory(category); + defService.importDef(defJson); + } catch (IOException e) { + log.error("读取文件流错误: {}", e.getMessage(), e); + throw new IllegalStateException("文件读取失败,请检查文件内容", e); + } + return true; + } + + /** + * 导出流程定义 + * + * @param id 流程定义id + * @param response 响应 + * @throws IOException 异常 + */ + @Override + public void exportDef(Long id, HttpServletResponse response) throws IOException { + byte[] data = defService.exportJson(id).getBytes(StandardCharsets.UTF_8); + // 设置响应头和内容类型 + response.reset(); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + response.setContentType("application/text"); + response.setHeader("Content-Disposition", "attachment;"); + response.addHeader("Content-Length", "" + data.length); + IoUtil.write(response.getOutputStream(), false, data); + } + + /** + * 删除流程定义 + * + * @param ids 流程定义id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeDef(List ids) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.in(FlowHisTask::getDefinitionId, ids); + List flowHisTasks = flowHisTaskMapper.selectList(wrapper); + if (CollUtil.isNotEmpty(flowHisTasks)) { + List flowDefinitions = flowDefinitionMapper.selectByIds(StreamUtils.toList(flowHisTasks, FlowHisTask::getDefinitionId)); + if (CollUtil.isNotEmpty(flowDefinitions)) { + String join = StreamUtils.join(flowDefinitions, FlowDefinition::getFlowCode); + log.error("流程定义【{}】已被使用不可被删除!", join); + throw new ServiceException("流程定义【" + join + "】已被使用不可被删除!"); + } + } + try { + defService.removeDef(ids); + } catch (Exception e) { + log.error("Error removing flow definitions: {}", e.getMessage(), e); + throw new RuntimeException("Failed to remove flow definitions", e); + } + return true; + } + + /** + * 新增租户流程定义 + * + * @param tenantId 租户id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void syncDef(String tenantId) { + List flowDefinitions = flowDefinitionMapper.selectList(new LambdaQueryWrapper().eq(FlowDefinition::getTenantId, DEFAULT_TENANT_ID)); + if (CollUtil.isEmpty(flowDefinitions)) { + return; + } + FlowCategory flowCategory = flwCategoryMapper.selectOne(new LambdaQueryWrapper() + .eq(FlowCategory::getTenantId, DEFAULT_TENANT_ID).eq(FlowCategory::getCategoryId, FlowConstant.FLOW_CATEGORY_ID)); + flowCategory.setCategoryId(null); + flowCategory.setTenantId(tenantId); + flwCategoryMapper.insert(flowCategory); + List defIds = StreamUtils.toList(flowDefinitions, FlowDefinition::getId); + List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().in(FlowNode::getDefinitionId, defIds)); + List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper().in(FlowSkip::getDefinitionId, defIds)); + for (FlowDefinition definition : flowDefinitions) { + FlowDefinition flowDefinition = BeanUtil.toBean(definition, FlowDefinition.class); + flowDefinition.setId(null); + flowDefinition.setTenantId(tenantId); + flowDefinition.setIsPublish(0); + flowDefinition.setCategory(String.valueOf(flowCategory.getCategoryId())); + int insert = flowDefinitionMapper.insert(flowDefinition); + if (insert <= 0) { + log.info("同步流程定义【{}】失败!", definition.getFlowCode()); + continue; + } + log.info("同步流程定义【{}】成功!", definition.getFlowCode()); + Long definitionId = flowDefinition.getId(); + if (CollUtil.isNotEmpty(flowNodes)) { + List nodes = StreamUtils.filter(flowNodes, node -> node.getDefinitionId().equals(definition.getId())); + if (CollUtil.isNotEmpty(nodes)) { + List flowNodeList = BeanUtil.copyToList(nodes, FlowNode.class); + flowNodeList.forEach(e -> { + e.setId(null); + e.setDefinitionId(definitionId); + e.setTenantId(tenantId); + e.setPermissionFlag(null); + }); + flowNodeMapper.insertOrUpdate(flowNodeList); + } + } + if (CollUtil.isNotEmpty(flowSkips)) { + List skips = StreamUtils.filter(flowSkips, skip -> skip.getDefinitionId().equals(definition.getId())); + if (CollUtil.isNotEmpty(skips)) { + List flowSkipList = BeanUtil.copyToList(skips, FlowSkip.class); + flowSkipList.forEach(e -> { + e.setId(null); + e.setDefinitionId(definitionId); + e.setTenantId(tenantId); + }); + flowSkipMapper.insertOrUpdate(flowSkipList); + } + } + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java new file mode 100644 index 0000000..db8ab71 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -0,0 +1,451 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.FlowEngine; +import org.dromara.warm.flow.core.constant.ExceptionCons; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.service.ChartService; +import org.dromara.warm.flow.core.service.DefService; +import org.dromara.warm.flow.core.service.InsService; +import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.bo.FlowCancelBo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.bo.FlowInvalidBo; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; +import org.dromara.workflow.domain.vo.FlowVariableVo; +import org.dromara.workflow.handler.FlowProcessEventHandler; +import org.dromara.workflow.mapper.FlwCategoryMapper; +import org.dromara.workflow.mapper.FlwInstanceMapper; +import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 流程实例 服务层实现 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwInstanceServiceImpl implements IFlwInstanceService { + + private final InsService insService; + private final DefService defService; + private final ChartService chartService; + private final TaskService taskService; + private final FlowHisTaskMapper flowHisTaskMapper; + private final FlowInstanceMapper flowInstanceMapper; + private final FlowProcessEventHandler flowProcessEventHandler; + private final IFlwTaskService flwTaskService; + private final FlwInstanceMapper flwInstanceMapper; + private final FlwCategoryMapper flwCategoryMapper; + + /** + * 分页查询正在运行的流程实例 + * + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); + queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus()); + Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 分页查询已结束的流程实例 + * + * @param flowInstanceBo 流程实例 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowInstanceBo); + queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus()); + Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 根据业务id查询流程实例详细信息 + * + * @param businessId 业务id + * @return 结果 + */ + @Override + public FlowInstanceVo queryByBusinessId(Long businessId) { + FlowInstance instance = this.selectInstByBusinessId(String.valueOf(businessId)); + FlowInstanceVo instanceVo = BeanUtil.toBean(instance, FlowInstanceVo.class); + Definition definition = defService.getById(instanceVo.getDefinitionId()); + instanceVo.setFlowName(definition.getFlowName()); + instanceVo.setFlowCode(definition.getFlowCode()); + instanceVo.setVersion(definition.getVersion()); + instanceVo.setFormCustom(definition.getFormCustom()); + instanceVo.setFormPath(definition.getFormPath()); + instanceVo.setCategory(definition.getCategory()); + return instanceVo; + } + + /** + * 通用查询条件 + * + * @param flowInstanceBo 查询条件 + * @return 查询条件构造方法 + */ + private QueryWrapper buildQueryWrapper(FlowInstanceBo flowInstanceBo) { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getNodeName()), "fi.node_name", flowInstanceBo.getNodeName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowName()), "fd.flow_name", flowInstanceBo.getFlowName()); + queryWrapper.like(StringUtils.isNotBlank(flowInstanceBo.getFlowCode()), "fd.flow_code", flowInstanceBo.getFlowCode()); + if (StringUtils.isNotBlank(flowInstanceBo.getCategory())) { + List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowInstanceBo.getCategory())); + queryWrapper.in("fd.category", StreamUtils.toList(categoryIds, Convert::toStr)); + } + queryWrapper.eq(StringUtils.isNotBlank(flowInstanceBo.getBusinessId()), "fi.business_id", flowInstanceBo.getBusinessId()); + queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by", flowInstanceBo.getCreateByIds()); + queryWrapper.eq("fi.del_flag", "0"); + queryWrapper.orderByDesc("fi.create_time"); + return queryWrapper; + } + + /** + * 根据业务id查询流程实例 + * + * @param businessId 业务id + */ + @Override + public FlowInstance selectInstByBusinessId(String businessId) { + return flowInstanceMapper.selectOne(new LambdaQueryWrapper().eq(FlowInstance::getBusinessId, businessId)); + } + + /** + * 按照实例id查询流程实例 + * + * @param instanceId 实例id + */ + @Override + public FlowInstance selectInstById(Long instanceId) { + return flowInstanceMapper.selectById(instanceId); + } + + /** + * 按照实例id查询流程实例 + * + * @param instanceIds 实例id + */ + @Override + public List selectInstListByIdList(List instanceIds) { + return flowInstanceMapper.selectByIds(instanceIds); + } + + /** + * 按照业务id删除流程实例 + * + * @param businessIds 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByBusinessIds(List businessIds) { + List flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper().in(FlowInstance::getBusinessId, businessIds)); + if (CollUtil.isEmpty(flowInstances)) { + log.warn("未找到对应的流程实例信息,无法执行删除操作。"); + return false; + } + return insService.remove(StreamUtils.toList(flowInstances, FlowInstance::getId)); + } + + /** + * 按照实例id删除流程实例 + * + * @param instanceIds 实例id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByInstanceIds(List instanceIds) { + // 获取实例信息 + List instances = insService.getByIds(instanceIds); + if (CollUtil.isEmpty(instances)) { + log.warn("未找到对应的流程实例信息,无法执行删除操作。"); + return false; + } + // 获取定义信息 + Map definitionMap = defService.getByIds( + StreamUtils.toList(instances, Instance::getDefinitionId) + ).stream().collect(Collectors.toMap(Definition::getId, definition -> definition)); + + // 逐一触发删除事件 + instances.forEach(instance -> { + Definition definition = definitionMap.get(instance.getDefinitionId()); + if (ObjectUtil.isNull(definition)) { + log.warn("实例 ID: {} 对应的流程定义信息未找到,跳过删除事件触发。", instance.getId()); + return; + } + flowProcessEventHandler.processDeleteHandler(definition.getFlowCode(), instance.getBusinessId()); + }); + + // 删除实例 + return insService.remove(instanceIds); + } + + /** + * 撤销流程 + * + * @param bo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean cancelProcessApply(FlowCancelBo bo) { + try { + Instance instance = selectInstByBusinessId(bo.getBusinessId()); + if (instance == null) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); + } + Definition definition = defService.getById(instance.getDefinitionId()); + if (definition == null) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); + } + String message = bo.getMessage(); + BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); + String applyNodeCode = WorkflowUtils.applyNodeCode(definition.getId()); + //撤销 + WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus()); + //判断或签节点是否有多个,只保留一个 + List currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId())); + if (CollUtil.isNotEmpty(currentTaskList)) { + if (currentTaskList.size() > 1) { + currentTaskList.remove(0); + WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId)); + } + } + + } catch (Exception e) { + log.error("撤销失败: {}", e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return true; + } + + /** + * 获取当前登陆人发起的流程实例 + * + * @param instanceBo 流程实例 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo selectCurrentInstanceList(FlowInstanceBo instanceBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(instanceBo); + queryWrapper.eq("fi.create_by", LoginHelper.getUserIdStr()); + Page page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 获取流程图,流程记录 + * + * @param businessId 业务id + */ + @Override + public Map flowImage(String businessId) { + FlowInstance flowInstance = this.selectInstByBusinessId(businessId); + if (ObjectUtil.isNull(flowInstance)) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); + } + Long instanceId = flowInstance.getId(); + //运行中的任务 + List list = new ArrayList<>(); + List flowTaskList = flwTaskService.selectByInstId(instanceId); + if (CollUtil.isNotEmpty(flowTaskList)) { + List flowHisTaskVos = BeanUtil.copyToList(flowTaskList, FlowHisTaskVo.class); + for (FlowHisTaskVo flowHisTaskVo : flowHisTaskVos) { + flowHisTaskVo.setFlowStatus(TaskStatusEnum.WAITING.getStatus()); + flowHisTaskVo.setUpdateTime(null); + flowHisTaskVo.setRunDuration(null); + List allUser = flwTaskService.currentTaskAllUser(flowHisTaskVo.getId()); + if (CollUtil.isNotEmpty(allUser)) { + String join = StreamUtils.join(allUser, e -> String.valueOf(e.getUserId())); + flowHisTaskVo.setApprover(join); + } + if (BusinessStatusEnum.isDraftOrCancelOrBack(flowInstance.getFlowStatus())) { + flowHisTaskVo.setApprover(LoginHelper.getUserIdStr()); + flowHisTaskVo.setApproveName(LoginHelper.getLoginUser().getNickname()); + } + } + list.addAll(flowHisTaskVos); + } + //历史任务 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(FlowHisTask::getInstanceId, instanceId); + wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); + wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); + List flowHisTasks = flowHisTaskMapper.selectList(wrapper); + if (CollUtil.isNotEmpty(flowHisTasks)) { + list.addAll(BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class)); + } + String flowChart = chartService.chartIns(instanceId); + return Map.of("list", list, "image", flowChart); + } + + /** + * 按照实例id更新状态 + * + * @param instanceId 实例id + * @param status 状态 + */ + @Override + public void updateStatus(Long instanceId, String status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.set(FlowInstance::getFlowStatus, status); + wrapper.eq(FlowInstance::getId, instanceId); + flowInstanceMapper.update(wrapper); + } + + /** + * 获取流程变量 + * + * @param instanceId 实例id + */ + @Override + public Map instanceVariable(Long instanceId) { + Map map = new HashMap<>(); + FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId); + Map variableMap = flowInstance.getVariableMap(); + List list = new ArrayList<>(); + if (CollUtil.isNotEmpty(variableMap)) { + for (Map.Entry entry : variableMap.entrySet()) { + FlowVariableVo flowVariableVo = new FlowVariableVo(); + flowVariableVo.setKey(entry.getKey()); + flowVariableVo.setValue(entry.getValue().toString()); + list.add(flowVariableVo); + } + } + map.put("variableList", list); + map.put("variable", flowInstance.getVariable()); + return map; + } + + /** + * 设置流程变量 + * + * @param instanceId 实例id + * @param variable 流程变量 + */ + @Override + public void setVariable(Long instanceId, Map variable) { + Instance instance = insService.getById(instanceId); + if (instance != null) { + taskService.mergeVariable(instance, variable); + } + } + + /** + * 按任务id查询实例 + * + * @param taskId 任务id + */ + @Override + public FlowInstance selectByTaskId(Long taskId) { + Task task = taskService.getById(taskId); + if (task == null) { + FlowHisTask flowHisTask = flwTaskService.selectHisTaskById(taskId); + if (flowHisTask != null) { + return this.selectInstById(flowHisTask.getInstanceId()); + } + } else { + return this.selectInstById(task.getInstanceId()); + } + return null; + } + + /** + * 按任务id查询实例 + * + * @param taskIdList 任务id + */ + @Override + public List selectByTaskIdList(List taskIdList) { + if (CollUtil.isEmpty(taskIdList)) { + return Collections.emptyList(); + } + Set instanceIds = new HashSet<>(); + List flowTaskList = flwTaskService.selectByIdList(taskIdList); + for (FlowTask flowTask : flowTaskList) { + instanceIds.add(flowTask.getInstanceId()); + } + List flowHisTaskList = flwTaskService.selectHisTaskByIdList(taskIdList); + for (FlowHisTask flowHisTask : flowHisTaskList) { + instanceIds.add(flowHisTask.getInstanceId()); + } + if (!instanceIds.isEmpty()) { + return this.selectInstListByIdList(new ArrayList<>(instanceIds)); + } + return Collections.emptyList(); + } + + /** + * 作废流程 + * + * @param bo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean processInvalid(FlowInvalidBo bo) { + try { + Instance instance = insService.getById(bo.getId()); + if (instance != null) { + BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); + } + List flowTaskList = flwTaskService.selectByInstId(bo.getId()); + for (FlowTask flowTask : flowTaskList) { + FlowParams flowParams = new FlowParams(); + flowParams.message(bo.getComment()); + flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus()) + .hisStatus(TaskStatusEnum.INVALID.getStatus()); + flowParams.ignore(true); + taskService.termination(flowTask.getId(), flowParams); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java new file mode 100644 index 0000000..21a54d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -0,0 +1,687 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.StartProcessReturnDTO; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.UserService; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.*; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.SkipType; +import org.dromara.warm.flow.core.service.*; +import org.dromara.warm.flow.orm.entity.*; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.enums.TaskAssigneeType; +import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.bo.*; +import org.dromara.workflow.domain.vo.FlowHisTaskVo; +import org.dromara.workflow.domain.vo.FlowTaskVo; +import org.dromara.workflow.handler.FlowProcessEventHandler; +import org.dromara.workflow.handler.WorkflowPermissionHandler; +import org.dromara.workflow.mapper.FlwCategoryMapper; +import org.dromara.workflow.mapper.FlwTaskMapper; +import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +import static org.dromara.workflow.common.constant.FlowConstant.*; + +/** + * 任务 服务层实现 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwTaskServiceImpl implements IFlwTaskService { + + private final TaskService taskService; + private final InsService insService; + private final DefService defService; + private final HisTaskService hisTaskService; + private final NodeService nodeService; + private final FlowInstanceMapper flowInstanceMapper; + private final FlowTaskMapper flowTaskMapper; + private final FlowHisTaskMapper flowHisTaskMapper; + private final IdentifierGenerator identifierGenerator; + private final FlowProcessEventHandler flowProcessEventHandler; + private final UserService userService; + private final FlwTaskMapper flwTaskMapper; + private final FlwCategoryMapper flwCategoryMapper; + + /** + * 启动任务 + * + * @param startProcessBo 启动流程参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public StartProcessReturnDTO startWorkFlow(StartProcessBo startProcessBo) { + String businessId = startProcessBo.getBusinessId(); + if (StringUtils.isBlank(businessId)) { + throw new ServiceException("启动工作流时必须包含业务ID"); + } + // 启动流程实例(提交申请) + Map variables = startProcessBo.getVariables(); + // 流程发起人 + variables.put(INITIATOR, LoginHelper.getUserIdStr()); + // 业务id + variables.put(BUSINESS_ID, businessId); + FlowInstance flowInstance = flowInstanceMapper.selectOne(new LambdaQueryWrapper<>(FlowInstance.class) + .eq(FlowInstance::getBusinessId, businessId)); + if (ObjectUtil.isNotNull(flowInstance)) { + BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); + List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); + StartProcessReturnDTO dto = new StartProcessReturnDTO(); + dto.setProcessInstanceId(taskList.get(0).getInstanceId()); + dto.setTaskId(taskList.get(0).getId()); + return dto; + } + FlowParams flowParams = new FlowParams(); + flowParams.flowCode(startProcessBo.getFlowCode()); + flowParams.variable(startProcessBo.getVariables()); + flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); + Instance instance; + try { + instance = insService.start(businessId, flowParams); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + // 申请人执行流程 + List taskList = taskService.list(new FlowTask().setInstanceId(instance.getId())); + if (taskList.size() > 1) { + throw new ServiceException("请检查流程第一个环节是否为申请人!"); + } + StartProcessReturnDTO dto = new StartProcessReturnDTO(); + dto.setProcessInstanceId(instance.getId()); + dto.setTaskId(taskList.get(0).getId()); + return dto; + } + + /** + * 办理任务 + * + * @param completeTaskBo 办理任务参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean completeTask(CompleteTaskBo completeTaskBo) { + try { + // 获取任务ID并查询对应的流程任务和实例信息 + Long taskId = completeTaskBo.getTaskId(); + List messageType = completeTaskBo.getMessageType(); + String notice = completeTaskBo.getNotice(); + // 获取抄送人 + List flowCopyList = completeTaskBo.getFlowCopyList(); + FlowTask flowTask = flowTaskMapper.selectById(taskId); + if (ObjectUtil.isNull(flowTask)) { + throw new ServiceException("流程任务不存在或任务已审批!"); + } + Instance ins = insService.getById(flowTask.getInstanceId()); + // 获取流程定义信息 + Definition definition = defService.getById(flowTask.getDefinitionId()); + // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 + if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { + flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), null, true); + } + // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 + FlowParams flowParams = new FlowParams(); + flowParams.variable(completeTaskBo.getVariables()); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.message(completeTaskBo.getMessage()); + flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); + + flowParams.hisTaskExt(completeTaskBo.getFileId()); + // 执行任务跳转,并根据返回的处理人设置下一步处理人 + Instance instance = taskService.skip(taskId, flowParams); + this.setHandler(instance, flowTask, flowCopyList); + // 消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 设置办理人 + * + * @param instance 实例 + * @param task (当前任务)未办理的任务 + * @param flowCopyList 抄送人 + */ + private void setHandler(Instance instance, FlowTask task, List flowCopyList) { + if (ObjectUtil.isNull(instance)) { + return; + } + // 添加抄送人 + this.setCopy(task, flowCopyList); + // 根据流程实例ID查询所有关联的任务 + List flowTasks = this.selectByInstId(instance.getId()); + if (CollUtil.isEmpty(flowTasks)) { + return; + } + List taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId); + // 获取与当前任务关联的用户列表 + List associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList); + if (CollUtil.isEmpty(associatedUsers)) { + return; + } + List userList = new ArrayList<>(); + // 遍历任务列表,处理每个任务的办理人 + for (FlowTask flowTask : flowTasks) { + List users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId())); + if (CollUtil.isNotEmpty(users)) { + userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId())); + } + } + // 批量删除现有任务的办理人记录 + WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList); + // 确保要保存的 userList 不为空 + if (CollUtil.isEmpty(userList)) { + return; + } + WorkflowUtils.getFlowUserService().saveBatch(userList); + } + + /** + * 添加抄送人 + * + * @param task 任务信息 + * @param flowCopyList 抄送人 + */ + public void setCopy(FlowTask task, List flowCopyList) { + if (CollUtil.isEmpty(flowCopyList)) { + return; + } + // 添加抄送人记录 + FlowHisTask flowHisTask = flowHisTaskMapper.selectList(new LambdaQueryWrapper<>(FlowHisTask.class).eq(FlowHisTask::getTaskId, task.getId())).get(0); + FlowNode flowNode = new FlowNode(); + flowNode.setNodeCode(flowHisTask.getTargetNodeCode()); + flowNode.setNodeName(flowHisTask.getTargetNodeName()); + //生成新的任务id + long taskId = identifierGenerator.nextId(null).longValue(); + task.setId(taskId); + task.setNodeName("【抄送】" + task.getNodeName()); + Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() - 1000); + FlowParams flowParams = FlowParams.build(); + flowParams.skipType(SkipType.NONE.getKey()); + flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); + flowParams.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getUserName)); + HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); + hisTask.setCreateTime(updateTime); + hisTask.setUpdateTime(updateTime); + hisTaskService.save(hisTask); + List userList = flowCopyList.stream() + .map(flowCopy -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(TaskAssigneeType.COPY.getCode()); + flowUser.setProcessedBy(String.valueOf(flowCopy.getUserId())); + flowUser.setAssociated(taskId); + return flowUser; + }).collect(Collectors.toList()); + // 批量保存抄送人员 + WorkflowUtils.getFlowUserService().saveBatch(userList); + } + + /** + * 查询当前用户的待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); + queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); + queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); + Page page = this.getFlowTaskVoPage(pageQuery, queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 查询当前用户的已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); + queryWrapper.in("t.approver", LoginHelper.getUserIdStr()); + queryWrapper.orderByDesc("t.create_time").orderByDesc("t.update_time"); + Page page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 查询待办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); + Page page = getFlowTaskVoPage(pageQuery, queryWrapper); + return TableDataInfo.build(page); + } + + private Page getFlowTaskVoPage(PageQuery pageQuery, QueryWrapper queryWrapper) { + Page page = flwTaskMapper.getListRunTask(pageQuery.build(), queryWrapper); + List records = page.getRecords(); + if (CollUtil.isNotEmpty(records)) { + List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); + Map> listMap = currentTaskAllUser(taskIds); + records.forEach(t -> { + List userList = listMap.getOrDefault(t.getId(), Collections.emptyList()); + if (CollUtil.isNotEmpty(userList)) { + t.setAssigneeIds(StreamUtils.join(userList, e -> String.valueOf(e.getUserId()))); + t.setAssigneeNames(StreamUtils.join(userList, UserDTO::getNickName)); + } + }); + } + return page; + } + + /** + * 查询已办任务 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + Page page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + /** + * 查询当前用户的抄送 + * + * @param flowTaskBo 参数 + * @param pageQuery 分页 + */ + @Override + public TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { + QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); + queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr()); + Page page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(page); + } + + private QueryWrapper buildQueryWrapper(FlowTaskBo flowTaskBo) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); + wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); + wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); + if (StringUtils.isNotBlank(flowTaskBo.getCategory())) { + List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory())); + wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr)); + } + wrapper.orderByDesc("t.create_time"); + return wrapper; + } + + /** + * 驳回任务 + * + * @param bo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean backProcess(BackProcessBo bo) { + try { + Long taskId = bo.getTaskId(); + String notice = bo.getNotice(); + List messageType = bo.getMessageType(); + String message = bo.getMessage(); + FlowTask task = flowTaskMapper.selectById(taskId); + if (ObjectUtil.isNull(task)) { + throw new ServiceException("任务不存在!"); + } + Instance inst = insService.getById(task.getInstanceId()); + BusinessStatusEnum.checkBackStatus(inst.getFlowStatus()); + Long definitionId = task.getDefinitionId(); + Definition definition = defService.getById(definitionId); + String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId); + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(bo.getNodeCode()); + flowParams.message(message); + flowParams.skipType(SkipType.REJECT.getKey()); + flowParams.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus()) + .hisStatus(TaskStatusEnum.BACK.getStatus()); + flowParams.hisTaskExt(bo.getFileId()); + taskService.skip(task.getId(), flowParams); + + Instance instance = insService.getById(inst.getId()); + this.setHandler(instance, task, null); + // 消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 获取可驳回的前置节点 + * + * @param definitionId 流程定义id + * @param nowNodeCode 当前节点 + */ + @Override + public List getBackTaskNode(Long definitionId, String nowNodeCode) { + List nodeCodes = nodeService.getByNodeCodes(Collections.singletonList(nowNodeCode), definitionId); + if (!CollUtil.isNotEmpty(nodeCodes)) { + return nodeCodes; + } + //判断是否配置了固定驳回节点 + Node node = nodeCodes.get(0); + if (StringUtils.isNotBlank(node.getAnyNodeSkip())) { + return nodeService.getByNodeCodes(Collections.singletonList(node.getAnyNodeSkip()), definitionId); + } + //获取可驳回的前置节点 + List nodes = nodeService.previousNodeList(definitionId, nowNodeCode); + if (CollUtil.isNotEmpty(nodes)) { + return StreamUtils.filter(nodes, e -> NodeType.BETWEEN.getKey().equals(e.getNodeType())); + } + return nodes; + } + + /** + * 终止任务 + * + * @param bo 参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean terminationTask(FlowTerminationBo bo) { + try { + Long taskId = bo.getTaskId(); + Task task = taskService.getById(taskId); + if (task == null) { + throw new ServiceException("任务不存在!"); + } + Instance instance = insService.getById(task.getInstanceId()); + if (ObjectUtil.isNotNull(instance)) { + BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); + } + FlowParams flowParams = new FlowParams(); + flowParams.message(bo.getComment()); + flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) + .hisStatus(TaskStatusEnum.TERMINATION.getStatus()); + taskService.termination(taskId, flowParams); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 按照任务id查询任务 + * + * @param taskIdList 任务id + */ + @Override + public List selectByIdList(List taskIdList) { + return flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .in(FlowTask::getId, taskIdList)); + } + + /** + * 按照任务id查询任务 + * + * @param taskId 任务id + */ + @Override + public FlowTaskVo selectById(Long taskId) { + Task task = taskService.getById(taskId); + if (ObjectUtil.isNull(task)) { + return null; + } + FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); + Instance instance = insService.getById(task.getInstanceId()); + Definition definition = defService.getById(task.getDefinitionId()); + flowTaskVo.setFlowStatus(instance.getFlowStatus()); + flowTaskVo.setVersion(definition.getVersion()); + flowTaskVo.setFlowCode(definition.getFlowCode()); + flowTaskVo.setFlowName(definition.getFlowName()); + flowTaskVo.setBusinessId(instance.getBusinessId()); + List nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId()); + if (CollUtil.isNotEmpty(nodeList)) { + Node node = nodeList.get(0); + flowTaskVo.setNodeRatio(node.getNodeRatio()); + } + return flowTaskVo; + } + + /** + * 按照任务id查询任务 + * + * @param taskIdList 任务id + * @return 结果 + */ + @Override + public List selectHisTaskByIdList(List taskIdList) { + return flowHisTaskMapper.selectList(new LambdaQueryWrapper<>(FlowHisTask.class) + .in(FlowHisTask::getId, taskIdList)); + } + + /** + * 按照任务id查询任务 + * + * @param taskId 任务id + * @return 结果 + */ + @Override + public FlowHisTask selectHisTaskById(Long taskId) { + return flowHisTaskMapper.selectOne(new LambdaQueryWrapper<>(FlowHisTask.class) + .eq(FlowHisTask::getId, taskId)); + } + + /** + * 按照实例id查询任务 + * + * @param instanceIdList 流程实例id + */ + @Override + public List selectByInstIdList(List instanceIdList) { + return flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .in(FlowTask::getInstanceId, instanceIdList)); + } + + /** + * 按照实例id查询任务 + * + * @param instanceId 流程实例id + */ + @Override + public List selectByInstId(Long instanceId) { + return flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class) + .eq(FlowTask::getInstanceId, instanceId)); + } + + /** + * 任务操作 + * + * @param bo 参数 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean taskOperation(TaskOperationBo bo, String taskOperation) { + FlowParams flowParams = new FlowParams(); + flowParams.message(bo.getMessage()); + if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { + flowParams.ignore(true); + } + + // 根据操作类型构建 FlowParams + switch (taskOperation) { + case DELEGATE_TASK, TRANSFER_TASK -> { + ValidatorUtils.validate(bo, AddGroup.class); + flowParams.addHandlers(Collections.singletonList(bo.getUserId())); + } + case ADD_SIGNATURE -> { + ValidatorUtils.validate(bo, EditGroup.class); + flowParams.addHandlers(bo.getUserIds()); + } + case REDUCTION_SIGNATURE -> { + ValidatorUtils.validate(bo, EditGroup.class); + flowParams.reductionHandlers(bo.getUserIds()); + } + default -> { + log.error("Invalid operation type:{} ", taskOperation); + throw new ServiceException("Invalid operation type " + taskOperation); + } + } + + Long taskId = bo.getTaskId(); + FlowTaskVo flowTaskVo = selectById(taskId); + if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) { + if (flowTaskVo.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) { + throw new ServiceException(flowTaskVo.getNodeName() + "不是会签节点!"); + } + } + // 设置任务状态并执行对应的任务操作 + switch (taskOperation) { + //委派任务 + case DELEGATE_TASK -> { + flowParams.hisStatus(TaskStatusEnum.DEPUTE.getStatus()); + return taskService.depute(taskId, flowParams); + } + //转办任务 + case TRANSFER_TASK -> { + flowParams.hisStatus(TaskStatusEnum.TRANSFER.getStatus()); + return taskService.transfer(taskId, flowParams); + } + //加签,增加办理人 + case ADD_SIGNATURE -> { + flowParams.hisStatus(TaskStatusEnum.SIGN.getStatus()); + return taskService.addSignature(taskId, flowParams); + } + //减签,减少办理人 + case REDUCTION_SIGNATURE -> { + flowParams.hisStatus(TaskStatusEnum.SIGN_OFF.getStatus()); + return taskService.reductionSignature(taskId, flowParams); + } + default -> { + log.error("Invalid operation type:{} ", taskOperation); + throw new ServiceException("Invalid operation type " + taskOperation); + } + } + } + + /** + * 修改任务办理人(此方法将会批量修改所有任务的办理人) + * + * @param taskIdList 任务id + * @param userId 用户id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateAssignee(List taskIdList, String userId) { + if (CollUtil.isEmpty(taskIdList)) { + return false; + } + try { + List flowTasks = this.selectByIdList(taskIdList); + // 批量删除现有任务的办理人记录 + if (CollUtil.isNotEmpty(flowTasks)) { + WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + List userList = flowTasks.stream() + .map(flowTask -> { + FlowUser flowUser = new FlowUser(); + flowUser.setType(TaskAssigneeType.APPROVER.getCode()); + flowUser.setProcessedBy(userId); + flowUser.setAssociated(flowTask.getId()); + return flowUser; + }) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(userList)) { + WorkflowUtils.getFlowUserService().saveBatch(userList); + } + } + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + return true; + } + + /** + * 获取任务所有办理人 + * + * @param taskIdList 任务id + */ + @Override + public Map> currentTaskAllUser(List taskIdList) { + Map> map = new HashMap<>(); + // 获取与当前任务关联的用户列表 + List associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList); + Map> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); + for (Map.Entry> entry : listMap.entrySet()) { + List value = entry.getValue(); + if (CollUtil.isNotEmpty(value)) { + List userDTOS = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); + map.put(entry.getKey(), userDTOS); + } + } + return map; + } + + /** + * 获取当前任务的所有办理人 + * + * @param taskId 任务id + */ + @Override + public List currentTaskAllUser(Long taskId) { + // 获取与当前任务关联的用户列表 + List userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId)); + if (CollUtil.isEmpty(userList)) { + return Collections.emptyList(); + } + return userService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java new file mode 100644 index 0000000..f8a20b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -0,0 +1,132 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.dto.CompleteTaskDTO; +import org.dromara.common.core.domain.dto.StartProcessDTO; +import org.dromara.common.core.domain.dto.StartProcessReturnDTO; +import org.dromara.common.core.service.WorkflowService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.warm.flow.orm.entity.FlowInstance; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.bo.CompleteTaskBo; +import org.dromara.workflow.domain.bo.StartProcessBo; +import org.dromara.workflow.service.IFlwDefinitionService; +import org.dromara.workflow.service.IFlwInstanceService; +import org.dromara.workflow.service.IFlwTaskService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 通用 工作流服务实现 + * + * @author may + */ +@ConditionalOnEnable +@RequiredArgsConstructor +@Service +public class WorkflowServiceImpl implements WorkflowService { + + private final IFlwInstanceService flwInstanceService; + private final IFlwDefinitionService flwDefinitionService; + private final IFlwTaskService flwTaskService; + + /** + * 删除流程实例 + * + * @param businessIds 业务id + * @return 结果 + */ + @Override + public boolean deleteInstance(List businessIds) { + return flwInstanceService.deleteByBusinessIds(businessIds); + } + + /** + * 获取当前流程状态 + * + * @param taskId 任务id + */ + @Override + public String getBusinessStatusByTaskId(Long taskId) { + FlowInstance flowInstance = flwInstanceService.selectByTaskId(taskId); + return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getFlowStatus() : StringUtils.EMPTY; + } + + /** + * 获取当前流程状态 + * + * @param businessId 业务id + */ + @Override + public String getBusinessStatus(String businessId) { + FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessId); + return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getFlowStatus() : StringUtils.EMPTY; + } + + /** + * 设置流程变量 + * + * @param instanceId 流程实例id + * @param variables 流程变量 + */ + @Override + public void setVariable(Long instanceId, Map variables) { + flwInstanceService.setVariable(instanceId, variables); + } + + /** + * 获取流程变量 + * + * @param instanceId 流程实例id + */ + @Override + public Map instanceVariable(Long instanceId) { + return flwInstanceService.instanceVariable(instanceId); + } + + /** + * 按照业务id查询流程实例id + * + * @param businessId 业务id + * @return 结果 + */ + @Override + public Long getInstanceIdByBusinessId(String businessId) { + FlowInstance flowInstance = flwInstanceService.selectInstByBusinessId(businessId); + return ObjectUtil.isNotNull(flowInstance) ? flowInstance.getId() : null; + } + + /** + * 新增租户流程定义 + * + * @param tenantId 租户id + */ + @Override + public void syncDef(String tenantId) { + flwDefinitionService.syncDef(tenantId); + } + + /** + * 启动流程 + * + * @param startProcess 参数 + */ + @Override + public StartProcessReturnDTO startWorkFlow(StartProcessDTO startProcess) { + return flwTaskService.startWorkFlow(BeanUtil.toBean(startProcess, StartProcessBo.class)); + } + + /** + * 办理任务 + * + * @param completeTask 参数 + */ + @Override + public boolean completeTask(CompleteTaskDTO completeTask) { + return flwTaskService.completeTask(BeanUtil.toBean(completeTask, CompleteTaskBo.class)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java new file mode 100644 index 0000000..e48ffc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -0,0 +1,206 @@ +package org.dromara.workflow.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.warm.flow.core.constant.ExceptionCons; +import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.SkipType; +import org.dromara.warm.flow.core.service.NodeService; +import org.dromara.warm.flow.core.service.TaskService; +import org.dromara.warm.flow.core.service.UserService; +import org.dromara.warm.flow.core.utils.AssertUtil; +import org.dromara.warm.flow.orm.entity.FlowNode; +import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.warm.flow.orm.entity.FlowUser; +import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.service.IFlwTaskAssigneeService; +import org.dromara.workflow.service.IFlwTaskService; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + + +/** + * 工作流工具 + * + * @author may + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class WorkflowUtils { + + private static final IFlwTaskAssigneeService TASK_ASSIGNEE_SERVICE = SpringUtils.getBean(IFlwTaskAssigneeService.class); + private static final IFlwTaskService FLW_TASK_SERVICE = SpringUtils.getBean(IFlwTaskService.class); + private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class); + private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class); + private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class); + private static final TaskService TASK_SERVICE = SpringUtils.getBean(TaskService.class); + private static final NodeService NODE_SERVICE = SpringUtils.getBean(NodeService.class); + + /** + * 获取工作流用户service + */ + public static UserService getFlowUserService() { + return USER_SERVICE; + } + + /** + * 构建工作流用户 + * + * @param userList 办理用户 + * @param taskId 任务ID + * @return 用户 + */ + public static Set buildUser(List userList, Long taskId) { + if (CollUtil.isEmpty(userList)) { + return Set.of(); + } + Set list = new HashSet<>(); + Set processedBySet = new HashSet<>(); + for (User user : userList) { + // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 + List users = TASK_ASSIGNEE_SERVICE.fetchUsersByStorageId(user.getProcessedBy()); + // 转换为 FlowUser 并添加到结果集合 + if (CollUtil.isNotEmpty(users)) { + users.forEach(dto -> { + String processedBy = String.valueOf(dto.getUserId()); + if (!processedBySet.contains(processedBy)) { + FlowUser flowUser = new FlowUser(); + flowUser.setType(user.getType()); + flowUser.setProcessedBy(processedBy); + flowUser.setAssociated(taskId); + list.add(flowUser); + processedBySet.add(processedBy); + } + }); + } + } + return list; + } + + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public static void sendMessage(String flowName, Long instId, List messageType, String message) { + List userList = new ArrayList<>(); + List list = FLW_TASK_SERVICE.selectByInstId(instId); + if (StringUtils.isBlank(message)) { + message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; + } + for (Task task : list) { + List users = FLW_TASK_SERVICE.currentTaskAllUser(task.getId()); + if (CollUtil.isNotEmpty(users)) { + userList.addAll(users); + } + } + if (CollUtil.isNotEmpty(userList)) { + for (String code : messageType) { + MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); + if (ObjectUtil.isNotEmpty(messageTypeEnum)) { + switch (messageTypeEnum) { + case SYSTEM_MESSAGE: + SseMessageDto dto = new SseMessageDto(); + dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); + dto.setMessage(message); + SseMessageUtils.publishMessage(dto); + break; + case EMAIL_MESSAGE: + MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); + break; + case SMS_MESSAGE: + //todo 短信发送 + break; + default: + throw new IllegalStateException("Unexpected value: " + messageTypeEnum); + } + } + } + } + } + + /** + * 驳回 + * + * @param message 审批意见 + * @param instanceId 流程实例id + * @param targetNodeCode 目标节点 + * @param flowStatus 流程状态 + * @param flowHisStatus 节点操作状态 + */ + public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) { + List list = FLW_TASK_SERVICE.selectByInstId(instanceId); + if (CollUtil.isNotEmpty(list)) { + List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode)); + if (list.size() == tasks.size()) { + return; + } + } + for (FlowTask task : list) { + List userList = FLW_TASK_SERVICE.currentTaskAllUser(task.getId()); + FlowParams flowParams = FlowParams.build(); + flowParams.nodeCode(targetNodeCode); + flowParams.message(message); + flowParams.skipType(SkipType.PASS.getKey()); + flowParams.flowStatus(flowStatus).hisStatus(flowHisStatus); + flowParams.ignore(true); + //解决会签没权限问题 + if (CollUtil.isNotEmpty(userList)) { + flowParams.handler(userList.get(0).getUserId().toString()); + } + TASK_SERVICE.skip(task.getId(), flowParams); + } + //解决会签多人审批问题 + backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus); + } + + /** + * 申请人节点编码 + * + * @param definitionId 流程定义id + * @return 申请人节点编码 + */ + public static String applyNodeCode(Long definitionId) { + //获取已发布的流程节点 + List flowNodes = FLOW_NODE_MAPPER.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definitionId)); + AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); + Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); + AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); + Node nextNode = NODE_SERVICE.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey()); + return nextNode.getNodeCode(); + } + + /** + * 删除运行中的任务 + * + * @param taskIds 任务id + */ + public static void deleteRunTask(List taskIds) { + if (CollUtil.isEmpty(taskIds)) { + return; + } + USER_SERVICE.deleteByTaskIds(taskIds); + FLOW_TASK_MAPPER.deleteByIds(taskIds); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml new file mode 100644 index 0000000..e9918f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml new file mode 100644 index 0000000..30e2267 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml new file mode 100644 index 0000000..73e4ec7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-zhishu/pom.xml b/ruoyi-modules/ruoyi-zhishu/pom.xml new file mode 100644 index 0000000..3ed2745 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/pom.xml @@ -0,0 +1,407 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-zhishu + + + 业务模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-redis + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-mybatis + + + + + org.dromara + ruoyi-common-excel + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-websocket + + + commons-logging + commons-logging + 1.2 + + + + com.google.code.gson + gson + 2.8.5 + + + + + + + + + + + com.pdd + com.pdd + 1.92.52 + + + com.aizuda + snail-job-common-log + 1.3.0 + compile + + + com.aizuda + snail-job-common-log + 1.3.0 + compile + + + + org.dromara + ruoyi-common-sse + + + org.jsoup + jsoup + 1.17.2 + + + + + org.apache.httpcomponents + httpclient + 4.5.14 + + + com.squareup.okhttp3 + okhttp + 4.9.3 + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.projectlombok + lombok + true + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + commons-codec + commons-codec + 1.15 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + cn.com.kingbase + kingbase8 + 8.6.0 + compile + + + org.anyline + anyline-data + 8.7.2-20250101 + compile + + + org.springframework.data + spring-data-jpa + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.apache.poi + poi-ooxml + 5.2.3 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + org.apache.xmlbeans + xmlbeans + 5.1.1 + + + org.apache.commons + commons-collections4 + 4.4 + + + com.alibaba + fastjson + + + cn.com.kingbase + kingbase8 + 8.6.0 + compile + + + org.anyline + anyline-data + 8.7.2-20250101 + compile + + + org.springframework.data + spring-data-jpa + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.dromara + ruoyi-common-oss + + + org.scala-lang + scala-library + 2.13.9 + compile + + + org.dromara + ruoyi-common-core + + + org.dromara + ruoyi-common-log + + + org.dromara + ruoyi-system + + + org.checkerframework + checker-qual + 3.48.3 + compile + + + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.17 + + + + com.google.zxing + core + 3.4.1 + + + com.google.zxing + javase + 3.4.1 + + + + + + + + com.dtflys.forest + forest-spring-boot3-starter + 1.6.4 + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + com.tencentcloudapi + tencentcloud-sdk-java-ocr + 3.1.1252 + + + + com.hankcs + hanlp + portable-1.8.6 + + + + org.apache.pdfbox + pdfbox + 2.0.27 + + + + com.aliyun.oss + aliyun-sdk-oss + 3.17.4 + + + javax.xml.bind + jaxb-api + 2.3.1 + + + javax.activation + activation + 1.1.1 + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.3 + + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.4.7 + + + + + org.bouncycastle + bcprov-jdk15to18 + 1.71 + + + + + org.apache.poi + poi-scratchpad + 5.2.3 + + + + com.opencsv + opencsv + 5.7.1 + + + + + net.java.dev.jna + jna + 5.13.0 + + + net.java.dev.jna + jna-platform + 5.13.0 + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/CenterAspect.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/CenterAspect.java new file mode 100644 index 0000000..8fa4419 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/CenterAspect.java @@ -0,0 +1,90 @@ +package org.dromara.zhishu.aspect; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.vo.ProductForm; +import org.dromara.zhishu.service.IRunningLogFileService; +import org.dromara.zhishu.util.MapUtils; +import org.dromara.zhishu.util.RunningLogUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 中心书库发布任务日志 + */ +@Aspect +@Component +public class CenterAspect { + + // 定义 ThreadLocal 用于存储日志上下文 ID 或操作标识 + private static final ThreadLocal LOG_CONTEXT = new InheritableThreadLocal<>(); + + @Autowired + private IRunningLogFileService runningLogFileService; + + //定义文件类型 xcx 小程序 + private final String fileType = "centerBooksAdd"; + + + /** + * 中心书库发布数据接口 + * @param jsonStr + */ + @Pointcut(value = "execution(* org.dromara.zhishu.controller.TaskController.centerBooks(String)) && args(jsonStr)", argNames = "jsonStr") + public void centerBooks(String jsonStr){} + + /** + * 子方法: 自动发布商品切点 + * @param map + */ + @Pointcut(value = "execution(* org.dromara.zhishu.service.impl.TaskServiceImpl.addGoods(java.util.Map,org.dromara.zhishu.domain.bo.TaskBo,Long)) && args(map,taskBo,userId)", argNames = "map,taskBo,userId") + public void addGoods(Map map, TaskBo taskBo, Long userId){} + + + @Around(value = "centerBooks(jsonStr)", argNames = "joinPoint,jsonStr") + public Object repeatBook(ProceedingJoinPoint joinPoint, String jsonStr) { + RunningLogUtils.init(runningLogFileService); + //接受数据 + Map dataMap = JsonUtil.transferToObj(jsonStr, HashMap.class); + //任务名称 + String fileName = dataMap.get("taskId").toString(); + /** + * 从任务名称中解析出用户id + */ + //删除文本 ”中心书库发布“ + fileName = fileName.replace("中心书库发布",""); + //根据分号分割 + String[] split = fileName.split(";"); + //遍历split在根据分割后的字符串根据下划线进行分割获取userId + for (String s : split) { + String[] split1 = s.split("_"); + if(split1[0].equals("userId")){ + //将userId的值放入dataMap里 + dataMap.put("userId", split1[1]); + break; + } + } + //写日志 + return RunningLogUtils.runningLog(joinPoint, dataMap,"中心书库发布商品",fileType); + } + + + @Around(value = "addGoods(map,taskBo,userId)", argNames = "joinPoint,map,taskBo,userId") + public Object addGoods(ProceedingJoinPoint joinPoint,Map map, TaskBo taskBo, Long userId){ + RunningLogUtils.init(runningLogFileService); + Map dataMap = new HashMap(); + dataMap.put("map", map); + dataMap.put("taskBo", taskBo); + dataMap.put("userId", userId); + //写日志 + return RunningLogUtils.runningLog(joinPoint, dataMap,"中心书库发布商品发布方法addGoods",fileType); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/GoodsAddAspect.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/GoodsAddAspect.java new file mode 100644 index 0000000..66ae5d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/GoodsAddAspect.java @@ -0,0 +1,50 @@ +package org.dromara.zhishu.aspect; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.dromara.zhishu.domain.vo.ProductForm; +import org.dromara.zhishu.service.IRunningLogFileService; +import org.dromara.zhishu.util.MapUtils; +import org.dromara.zhishu.util.RunningLogUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + +/** + * 勾选/Excel表发布商品 + */ +@Aspect +@Component +public class GoodsAddAspect { + + // 定义 ThreadLocal 用于存储日志上下文 ID 或操作标识 + private static final ThreadLocal LOG_CONTEXT = new InheritableThreadLocal<>(); + + @Autowired + private IRunningLogFileService runningLogFileService; + + //定义文件类型 goodsAdd + private final String fileType = "goodsAdd"; + + + @Pointcut(value = "execution(* org.dromara.zhishu.service.impl.ZhishuShopGoodsServiceImpl.goodsAdd(java.util.Map)) && args(map)", argNames = "map") + public void goodsAdd(Map map){} + + + @Around(value = "goodsAdd(form)", argNames = "joinPoint,form") + public void goodsAddLog(ProceedingJoinPoint joinPoint, ProductForm form) { + String contextId = UUID.randomUUID().toString(); + LOG_CONTEXT.set(contextId); + RunningLogUtils.init(runningLogFileService); + //写日志 + RunningLogUtils.runningLog(joinPoint, MapUtils.convertToMap(form),"勾选/Excel表发布商品",fileType); + } + + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/LogRecordAspect.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/LogRecordAspect.java new file mode 100644 index 0000000..e5d0bbb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/LogRecordAspect.java @@ -0,0 +1,112 @@ +package org.dromara.zhishu.aspect; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.dromara.zhishu.annotation.LogRecord; +import org.dromara.zhishu.domain.vo.SaveGoodsVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.util.EasyExcelUtil; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@Aspect +@Component +public class LogRecordAspect { + + /** + * 环绕增强方法 + * + * @param joinPoint 连接点 + * @param logRecord 注解对象 + * @return 方法执行结果 + * @throws Throwable 异常 + */ + @Around("@annotation(logRecord)") + public Object doLogRecord(ProceedingJoinPoint joinPoint, LogRecord logRecord) throws Throwable { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + Object[] args = joinPoint.getArgs(); + String[] paramNames = signature.getParameterNames(); + + // 提取关键参数 + Map paramMap = getMethodParams(paramNames, args); + + SaveGoodsVo saveGoodsVo = extractParam(paramMap, "saveGoodsVo", SaveGoodsVo.class); + AtomicInteger successMarkI = extractParam(paramMap, "successMarkI", AtomicInteger.class); + AtomicInteger failMarkI = extractParam(paramMap, "failMarkI", AtomicInteger.class); + ShopVo shopVo = extractParam(paramMap, "shopVo", ShopVo.class); + Integer totalNum = extractParam(paramMap, "totalNum", Integer.class); + Long time = extractParam(paramMap, "time", Long.class); + AtomicBoolean status = extractParam(paramMap, "status", AtomicBoolean.class); + + // 执行原方法 + Object result; + result = joinPoint.proceed(); + + // 记录方法调用后的信息 + if (status.get()) { + logAfter(successMarkI, saveGoodsVo, shopVo, totalNum, time); + } + + if (!status.get()) { + // 记录异常信息 + logException(failMarkI, saveGoodsVo, shopVo, totalNum); + } + + return result; + } + + /** + * 获取需要记录的方法参数 + */ + private Map getMethodParams(String[] parameterNames, Object[] args) { + Map params = new HashMap<>(); + + for (int i = 0; i < parameterNames.length; i++) { + params.put(parameterNames[i], args[i]); + } + + return params; + } + + /** + * 安全提取参数并做类型检查 + */ + @SuppressWarnings("unchecked") + private T extractParam(Map paramMap, String key, Class type) { + Object value = paramMap.get(key); + if (value != null && type.isAssignableFrom(value.getClass())) { + return (T) value; + } + throw new IllegalArgumentException("参数缺失或类型错误: " + key + ", 类型应为: " + type.getName()); + } + + /** + * 方法执行后的日志记录 + */ + private void logAfter(AtomicInteger successMarkI, SaveGoodsVo saveGoodsVo, ShopVo shopVo, Integer totalNum, long newTime) { + // 更新计数器条数 + Integer successExecutedNum = successMarkI.incrementAndGet(); + EasyExcelUtil.writeTxtMsgLog(saveGoodsVo.getTaskId(), totalNum, successExecutedNum); + EasyExcelUtil.writeTxtLog(saveGoodsVo.getTaskId(), shopVo.getId(), shopVo.getShopName(), totalNum, successExecutedNum); + EasyExcelUtil.writeDetailTxtLog(saveGoodsVo.getTaskId(), shopVo.getId(), shopVo.getShopName(), totalNum, successExecutedNum, "同步成功", "New_" + shopVo.getId() + "_" + newTime + "_0"); + } + + /** + * 异常时的日志记录 + */ + private void logException(AtomicInteger failMarkI, SaveGoodsVo saveGoodsVo, ShopVo shopVo, Integer totalNum) { + // 更新计数器条数 + Integer failExecutedNum = failMarkI.incrementAndGet(); + EasyExcelUtil.writeDetailTxtLog(saveGoodsVo.getTaskId(), shopVo.getId(), shopVo.getShopName(), totalNum, failExecutedNum, "修改货号失败", "New_" + shopVo.getId() + "_0"); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/XcxAspect.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/XcxAspect.java new file mode 100644 index 0000000..e43ddae --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/aspect/XcxAspect.java @@ -0,0 +1,103 @@ +package org.dromara.zhishu.aspect; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.vo.ProductForm; +import org.dromara.zhishu.service.IRunningLogFileService; +import org.dromara.zhishu.util.MapUtils; +import org.dromara.zhishu.util.RunningLogUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + + +/** + * 记录从小程序端入库和发布日志 + */ +@Aspect +@Component +public class XcxAspect { + + // 定义 ThreadLocal 用于存储日志上下文 ID 或操作标识 + private static final ThreadLocal LOG_CONTEXT = new InheritableThreadLocal<>(); + + @Autowired + private IRunningLogFileService runningLogFileService; + + //定义文件类型 xcx 小程序 + private final String fileType = "xcx"; + + +// /** +// * 小程序扫码提交切点 +// * @param form +// */ +// // 定义切入点:匹配AdminController中的register方法 +// @Pointcut(value = "execution(* org.dromara.zhishu.service.impl.ZhishuShopGoodsServiceImpl.submitProduct(org.dromara.zhishu.domain.vo.ProductForm)) && args(form)", argNames = "form") +// public void registerMethod(ProductForm form) {} +// /** +// * 小程序版权页提交切点 +// * @param form +// */ +// @Pointcut(value = "execution(* org.dromara.zhishu.service.impl.ZhishuShopGoodsServiceImpl.submitFromCopyrightPage(org.dromara.zhishu.domain.vo.ProductForm)) && args(form)", argNames = "form") +// public void submitFromCopyrightPage(ProductForm form) {} + /** + * 子方法: 自动发布商品切点 + * @param map + */ +// @Pointcut(value = "execution(* org.dromara.zhishu.service.impl.ZhishuShopGoodsServiceImpl.goodsAutoAdd(java.util.Map)) && args(map)", argNames = "map") +// public void registerDetailMethod(Map map){} + + +// @Around(value = "registerMethod(form)", argNames = "joinPoint,form") +// public Object validateAndLog(ProceedingJoinPoint joinPoint, ProductForm form) { +// String contextId = UUID.randomUUID().toString(); +// LOG_CONTEXT.set(contextId); +// +// RunningLogUtils.init(runningLogFileService); +// //写日志 +// RunningLogUtils.runningLog(joinPoint, MapUtils.convertToMap(form),"这里小程序扫码提交",fileType); +// +// // 继续执行原方法并返回结果 +//// try { +//// return joinPoint.proceed(); +//// } catch (Throwable throwable) { +//// throw new RuntimeException(throwable); +//// } +// } + +// @Around(value = "submitFromCopyrightPage(form)", argNames = "joinPoint,form") +// public Object submitFromCopyrightPage(ProceedingJoinPoint joinPoint, ProductForm form) { +// String contextId = UUID.randomUUID().toString(); +// LOG_CONTEXT.set(contextId); +// RunningLogUtils.init(runningLogFileService); +// //写日志 +// RunningLogUtils.runningLog(joinPoint,MapUtils.convertToMap(form),"这里小程序版权页提交",fileType); +// +// // 继续执行原方法并返回结果 +//// try { +//// return joinPoint.proceed(); +//// } catch (Throwable throwable) { +//// throw new RuntimeException(throwable); +//// } +// } + +// @Around(value = "registerDetailMethod(map)", argNames = "joinPoint,map") +// public void detailLog(ProceedingJoinPoint joinPoint,Map map){ +// String contextId = LOG_CONTEXT.get(); +// if (contextId == null) { +// contextId = "NO_PARENT"; // 表示没有外部触发源 +// } +// //写日志 +// RunningLogUtils.runningLog(joinPoint,map,"这里是商品发布main方法日志",fileType); +// } + + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/RestTemplateConfig.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/RestTemplateConfig.java new file mode 100644 index 0000000..c0306a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/RestTemplateConfig.java @@ -0,0 +1,17 @@ +package org.dromara.zhishu.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate配置类 + */ +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/SecondRedissonConfig.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/SecondRedissonConfig.java new file mode 100644 index 0000000..8290c54 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/config/SecondRedissonConfig.java @@ -0,0 +1,126 @@ +package org.dromara.zhishu.config; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.client.codec.StringCodec; +import org.redisson.codec.JsonJacksonCodec; +import org.redisson.config.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +@Configuration +public class SecondRedissonConfig { + + @Bean + @Primary + public RedissonClient redissonClient() { + Config config = new Config(); + + // ✅ 优化:4核6G配置,提高线程数充分利用CPU + config.setThreads(8); // 从4改为8,充分利用4核CPU + config.setNettyThreads(16); // 从8改为16,提高网络IO处理能力 + + config.setCodec(new JsonJacksonCodec()); + + config.useSingleServer() + .setAddress("redis://146.56.227.42:6379") + .setDatabase(0) + .setPassword("Qq123123") + .setClientName("ruoyi_primary") + + // ✅ 优化:增大连接池,提高并发处理能力 + .setConnectionMinimumIdleSize(4) // 从2改为4 + .setConnectionPoolSize(16) // 从8改为16,支持更高并发 + .setIdleConnectionTimeout(30000) // 从10秒改为30秒,减少连接重建开销 + + // 保持合理的超时时间 + .setConnectTimeout(5000) // 连接超时5秒 + .setTimeout(3000) // 操作超时3秒 + .setRetryAttempts(3) // 从2改为3次重试,提高容错 + + // ✅ 优化:增大订阅连接池 + .setSubscriptionConnectionPoolSize(8) // 从5改为8 + + // ✅ 优化:保活设置 + .setPingConnectionInterval(60000) // 从30秒改为60秒,减少网络开销 + .setKeepAlive(true) // 启用keep-alive + + .setRetryInterval(1500) + .setDnsMonitoringInterval(10000); // 从5秒改为10秒 + + return Redisson.create(config); + } + + @Bean(name = "secondRedissonClient") + public RedissonClient secondRedissonClient() { + Config config = new Config(); + + // ✅ 优化:提高次要Redis的线程配置 + config.setThreads(4); // 从2改为4 + config.setNettyThreads(8); // 从4改为8 + + config.setCodec(new StringCodec()); + + config.useSingleServer() + .setAddress("redis://36.212.16.27:6379") + .setDatabase(0) + .setPassword("long6166") + .setClientName("ruoyi_second") + + // ✅ 优化:增大连接池 + .setConnectionMinimumIdleSize(2) // 从1改为2 + .setConnectionPoolSize(8) // 从4改为8 + .setIdleConnectionTimeout(30000) // 从10秒改为30秒 + + .setConnectTimeout(5000) + .setTimeout(3000) + .setRetryAttempts(2) // 从1改为2 + + .setSubscriptionConnectionPoolSize(4) // 从2改为4 + + .setPingConnectionInterval(60000) // 从30秒改为60秒 + .setKeepAlive(true) + + .setRetryInterval(1500) + .setDnsMonitoringInterval(10000); + + return Redisson.create(config); + } + + @Bean(name = "thirdRedissonClient") + public RedissonClient thirdRedissonClient() { + Config config = new Config(); + + // ✅ 优化:第三个Redis实例的线程配置 + config.setThreads(8); // 保持8 + config.setNettyThreads(16); // 保持16 + + config.setCodec(new StringCodec()); + + config.useSingleServer() + .setAddress("redis://36.212.20.113:7963") + .setDatabase(7) + .setPassword("j8nZ4jra2E") + .setClientName("ruoyi_third") + + // ✅ 优化:调整连接池大小,避免过度占用内存 + .setConnectionMinimumIdleSize(8) // 从16改为8 + .setConnectionPoolSize(24) // 从32改为24,避免内存浪费 + .setIdleConnectionTimeout(30000) // 从10秒改为30秒 + .setConnectTimeout(10000) + .setTimeout(3000) + + // ✅ 优化:订阅连接池 + .setSubscriptionConnectionPoolSize(16) // 从25改为16 + + // ✅ 新增:添加保活设置 + .setPingConnectionInterval(60000) // 60秒ping一次 + .setKeepAlive(true) // 启用keep-alive + .setRetryAttempts(3) // 3次重试 + .setRetryInterval(1500) // 重试间隔 + .setDnsMonitoringInterval(10000); // DNS监控间隔 + + return Redisson.create(config); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/AccountController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/AccountController.java new file mode 100644 index 0000000..4665f60 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/AccountController.java @@ -0,0 +1,39 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.Account; +import org.dromara.zhishu.domain.ProfitSharingLog; +import org.dromara.zhishu.service.IAccountService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 分润日志表 + * + * @author yxy + * @date 2026-03-05 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/account") +public class AccountController { + + private final IAccountService accountService; + + /** + * 分页查询分润日志表 + */ +// @SaCheckPermission("zhishu:profitSharingLog:list") + @GetMapping("/list") + @SaIgnore + public TableDataInfo list(Account bo, PageQuery pageQuery) { + return accountService.queryPageList(bo, pageQuery); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ArtNoMoveController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ArtNoMoveController.java new file mode 100644 index 0000000..66c657a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ArtNoMoveController.java @@ -0,0 +1,13 @@ +package org.dromara.zhishu.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/ArtNoMove") +public class ArtNoMoveController { +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/BookBaseInfoController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/BookBaseInfoController.java new file mode 100644 index 0000000..470671f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/BookBaseInfoController.java @@ -0,0 +1,920 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pdd.pop.sdk.common.util.JsonUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.Task; +import org.dromara.zhishu.domain.bo.*; +import org.dromara.zhishu.domain.dto.BookBaseInfoDto; +import org.dromara.zhishu.domain.excel.BaseInfoExcel; +import org.dromara.zhishu.domain.vo.BaseInfoPricingVo; +import org.dromara.zhishu.domain.vo.BookBaseInfoVo; +import org.dromara.zhishu.domain.vo.ProductForm; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.mapper.BookBaseInfoMapper; +import org.dromara.zhishu.service.IBookBaseInfoService; +import org.dromara.zhishu.service.IRunningTaskByShopService; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlMultipartFile; +import org.dromara.zhishu.util.WxPayUtil; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import static cn.dev33.satoken.SaManager.log; +import static org.dromara.zhishu.util.InterfaceUtils.getInterface; + +/** + * 基础信息 + * + * @author Lion Li + * @date 2025-03-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/baseInfo") +public class BookBaseInfoController extends BaseController { + + private final BookBaseInfoMapper baseMapper; + + + private final IBookBaseInfoService bookBaseInfoService; + private final ISysConfigService configService; + private final IShopService shopService; + private final IRunningTaskByShopService runningTaskByShopService; + + private final Set failedIsbns = Collections.synchronizedSet(new HashSet<>()); + + /** + * 查询基础信息列表 + */ + @SaCheckPermission("zhishu:baseInfo:list") + @GetMapping("/list") + @SaIgnore + public TableDataInfo list(BookBaseInfoDto bo, BookNumberRageBo number, PageQuery pageQuery) { + return bookBaseInfoService.queryPageList(bo, number, pageQuery); + } + + /** + * 导出基础信息列表 + */ + @SaCheckPermission("zhishu:baseInfo:export") + @Log(title = "基础信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BookBaseInfoBo bo, HttpServletResponse response) { + List list = bookBaseInfoService.queryList(bo); + ExcelUtil.exportExcel(list, "基础信息", BookBaseInfoVo.class, response); + } + + /** + * 获取基础信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:baseInfo:query") + @SaIgnore + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable String id) { + return R.ok(bookBaseInfoService.queryById(id)); + } + + + /** + * 获取基础信息详细信息 + * + * @param isbn isbn + */ + @SaCheckPermission("zhishu:baseInfo:query") + @GetMapping("/getBookByIsbn/{isbn}") + @SaIgnore + public R getIsbnList(@NotNull(message = "主键不能为空") + @PathVariable String isbn) { + return R.ok(bookBaseInfoService.getBookByIsbn(isbn)); + } + + /** + * 调取爬虫接口获取书籍数据 + */ + @SaCheckPermission("zhishu:baseInfo:getBookData") + @PostMapping("/getBookData/{isbn}") + public R getBookData(@NotNull(message = "主键不能为空") + @PathVariable String isbn) { + return R.ok(bookBaseInfoService.getBookData(isbn)); + } + + /** + * 新增基础信息 + */ + @SaCheckPermission("zhishu:baseInfo:add") + @Log(title = "基础信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BookBaseInfoBo bo) { + return toAjax(bookBaseInfoService.insertByBo(bo)); + } + + /** + * 修改基础信息 + */ + @SaCheckPermission("zhishu:baseInfo:edit") + @Log(title = "基础信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody EditBookInfoBo bo) { + return toAjax(bookBaseInfoService.updateByBo(bo)); + } + + /** + * 删除基础信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:baseInfo:remove") + @Log(title = "基础信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable String[] ids) { + + + return toAjax(bookBaseInfoService.deleteWithValidByIds(List.of(ids), true)); + } + /** + * 根据isbn查询书籍详情数据 + */ + @SaIgnore + @GetMapping("/getBookDataByIsbn/{isbn}") + public R> getBookDataByIsbn(@PathVariable String isbn){ + return R.ok(bookBaseInfoService.getBookDataByIsbn(isbn)); + } + + /** + * 更新选品中心单条数据 + */ + @SaIgnore + @PostMapping("/updateBookData") + public R updateBookData(@RequestBody BookUpdateInfoBo bo) { +// System.out.println("更新选品中心单条数据"+bo); + return R.ok(bookBaseInfoService.updateCentBookByIsbn(bo)); + } + + /** + * 文件信息 + * 导入 模板(预留字段) + */ +// @Log(title = "商品信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/importExcel") + public R importExcel(@RequestParam("file") MultipartFile file, @RequestParam("type") Integer type) { + + InputStream inputStream = null; + try { + inputStream = file.getInputStream(); + } catch (IOException e) { + + + } +// throw new RuntimeException("系统错误"); + + List list = ExcelUtil.importExcel(inputStream, BaseInfoExcel.class); + bookBaseInfoService.importExcel(list); + return R.ok(); + } + + + /** + * 获取图书列表 + */ +// @Log(title = "商品信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/getList") + public R getList() { + return R.ok(bookBaseInfoService.getList()); + } + + + + /** + * 书名获取列表 + */ + @RepeatSubmit + @PostMapping("/getBookByName") + @SaIgnore + public R> getBookName(@RequestBody Map request) { + String bookName = request.get("bookName"); + List list = bookBaseInfoService.getBookListByBookName(bookName); + return R.ok(list); + } + + @SaIgnore + @PostMapping("/addBookCatId") + public void addBookCatId(@RequestBody Map request) { + BookBaseInfoBo bo = new BookBaseInfoBo(); + bo.setIsbn(request.get("isbn")); + bo.setCatId(Long.parseLong(request.get("catId"))); + bookBaseInfoService.updateByIsbn(bo); + } + + /** + * 重新生成图书数据 + */ + @SaIgnore + @PostMapping("/regenerateBookData") + public R regenerateBookData() { + try { + System.out.println("=== 开始重新生成图书数据 ==="); + log.info("=== 开始重新生成图书数据 ==="); + long startTime = System.currentTimeMillis(); + + // 读取txt文件 + String fileName = "112233.txt"; + // 创建失败记录文件 + String failFileName = "failed_isbn_" + System.currentTimeMillis() + ".txt"; + + int totalProcessed = 0; + int totalSuccess = 0; + int totalFail = 0; + Set failedIsbns = new HashSet<>(); + + // 读取文件内容 + try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) { + String line; + while ((line = reader.readLine()) != null) { + String isbn = extractIsbn(line); + if (isbn != null) { + totalProcessed++; + try { + // 调用PHP爬虫接口 + String kongfzIp = configService.selectConfigByKey("kongfz.ip"); + String bookinfoStr = getInterface(kongfzIp, "/api/kfz/getBookInfoF/" + isbn); + + if (bookinfoStr != null && !bookinfoStr.isEmpty()) { + Map bookinfoMap = JsonUtil.transferToObj(bookinfoStr, Map.class); + if (bookinfoMap.get("code").toString().equals("200")) { + Map data = (Map) bookinfoMap.get("data"); + String bookInfoListStr = JsonUtil.transferToJson(data.get("product")); + List bookInfoList = JsonUtil.transferToObj(bookInfoListStr, List.class); + + if (!bookInfoList.isEmpty()) { + String bookInfo = JsonUtil.transferToJson(bookInfoList.get(0)); + BookBaseInfoVo newData = JsonUtil.transferToObj(bookInfo, BookBaseInfoVo.class); + if (newData != null) { + totalSuccess++; + System.out.println("成功处理ISBN: " + isbn); + log.info("成功处理ISBN: {}", isbn); + } else { + throw new Exception("数据转换失败"); + } + } else { + throw new Exception("商品列表为空"); + } + } else { + throw new Exception("接口返回错误码: " + bookinfoMap.get("code")); + } + } else { + throw new Exception("接口返回数据为空"); + } + } catch (Exception e) { + totalFail++; + failedIsbns.add(isbn); + System.out.println("处理失败ISBN: " + isbn + ", 错误: " + e.getMessage()); + log.error("处理失败ISBN: {}, 错误: {}", isbn, e.getMessage()); + } + + // 每处理一个ISBN后等待5秒 +// Thread.sleep(5000); + } + } + } + + // 将失败的ISBN写入文件 + if (!failedIsbns.isEmpty()) { + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(failFileName), + StandardCharsets.UTF_8, StandardOpenOption.CREATE)) { + for (String isbn : failedIsbns) { + writer.write("isbn:" + isbn); + writer.newLine(); + } + } + } + + long endTime = System.currentTimeMillis(); + double duration = (endTime - startTime) / 1000.0; + + String message = String.format("处理完成 - 总数: %d, 成功: %d, 失败: %d, 耗时: %.2f秒, 失败记录已保存到: %s", + totalProcessed, totalSuccess, totalFail, duration, failFileName); + + System.out.println("=== 重新生成图书数据完成 ==="); + System.out.println(message); + log.info("=== 重新生成图书数据完成 ==="); + log.info(message); + + return R.ok(message); + + } catch (Exception e) { + String errorMsg = "重新生成图书数据时发生错误: " + e.getMessage(); + System.out.println(errorMsg); + log.error(errorMsg, e); + return R.fail(errorMsg); + } + } + + /** + * 从文本行中提取ISBN的辅助方法 + */ + private String extractIsbn(String line) { + try { + java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("ISBN: (\\d+)"); + java.util.regex.Matcher matcher = pattern.matcher(line); + if (matcher.find()) { + return matcher.group(1); + } + } catch (Exception e) { + log.error("提取ISBN时发生错误: {}", e.getMessage()); + } + return null; + } + + /** + * 批量设置违规信息 + * + * @param bo + * @return + */ + @Log(title = "基础信息", businessType = BusinessType.DELETE) + @PutMapping("batchUpdateIll") + public R batchUpdateIll(@RequestBody IllBaseInfoBo bo) { + System.out.println(bo); + return toAjax(bookBaseInfoService.updateByIllge(bo)); +// return toAjax(bookBaseInfoService.deleteWithValidByIds(List.of(ids), true)); +// return null; + } + + + /** + * 查询基础信息列表 + */ + @GetMapping("/pricing/list") + @SaIgnore + public TableDataInfo listPricing(BookBaseInfoDto bo, BookNumberRageBo number, PageQuery pageQuery) { + return bookBaseInfoService.queryPagePricingList(bo, number, pageQuery); + } + + + /** + * 核价链接加密 + */ + @GetMapping("/pricingLink") + @SaIgnore + public String pricingLink(BookBaseInfoBo bo, BookNumberRageBo number, PageQuery pageQuery) { + String link = bookBaseInfoService.pricingLink(bo, pageQuery); + return link; + } + + + /** + * 核价链接解密 + */ + @GetMapping("/pricingLinkDec") + @SaIgnore + public Map pricingLinkDecrypt(String link) { + Map pricingLink = bookBaseInfoService.pricingLinkDec(link); + return pricingLink; + } + + /** + * 获取用户是否是会员 + * + * @return + */ + @GetMapping("/user/vipInfo/{type}") + @SaIgnore + public Boolean getUserIsVip(@PathVariable Integer type) { + Boolean isVip = bookBaseInfoService.getUserVip(type); + return isVip; + } + + /** + * 根据ISBN获取官图 + * @param isbn ISBN号 + * @return 官图信息 + */ + @GetMapping("/getBookPicByISBN") + @SaIgnore + public R> getBookPicByISBN(@RequestParam String isbn) { + try { + if (StringUtils.isEmpty(isbn)) { + return R.fail("ISBN不能为空"); + } + Map result = new HashMap<>(); + result.put("isbn", isbn); + log.info("开始获取官图,ISBN: {}", isbn); + String goUrl = configService.selectConfigByKey("centerBook.url"); +// String goUrl = "http://localhost:9009/api"; + + String apiUrl = "/es/searchByISBN?isbn=" + isbn; + String responseStr = getInterface(goUrl, apiUrl); + + JSONObject responseJson = JSONObject.parseObject(responseStr); + + if (StringUtils.isNotEmpty(responseJson.getString("data")) ){ + JSONObject dataJson = responseJson.getJSONObject("data"); + System.out.println(dataJson.getJSONObject("book_pic_s")); + ObjectMapper objectMapper = new ObjectMapper(); + Map picData = objectMapper.readValue(dataJson.getString("book_pic_s"), Map.class); + String localPathpdd = picData.get("localPath"); + String pddResponse = picData.get("pddResponse"); + System.out.println("localPath: " + localPathpdd); + System.out.println("pddResponse: " + pddResponse); + + if (pddResponse != null){ + result.put("localPath", pddResponse); + }else if(localPathpdd != null) { + result.put("localPath", localPathpdd); + }else { + result.put("localPath", ""); + log.warn("接口返回数据格式异常,ISBN: {}", isbn); + } + + + }else { + result.put("localPath", ""); + log.warn("接口返回数据为空,ISBN: {}", isbn); + } + + return R.ok(result); + + } catch (Exception e) { + log.error("获取官图失败,ISBN: {}, 错误: {}", isbn, e.getMessage(), e); + Map result = new HashMap<>(); + result.put("localPath", ""); + result.put("isbn", isbn); + return R.ok(result); + } + } + + + + /** + * 创建任务 + * + * @param bo + * @return + */ + @PostMapping("/task") + @SaIgnore + public Map getTask(@RequestBody TaskBo bo) { + return bookBaseInfoService.insertTask(bo); + } + + + @PostMapping("/addNewTask") + @SaIgnore + public Map addNewTask(String taskType,String shopId,String fileName){ + Map result = new HashMap(); + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + if (shopVo == null){ + result.put("code",500); + result.put("msg","店铺不存在"); + return result; + } + // 根据shopId查询数据表是否存在 + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopId); + if (checkMark == 0) { + // 不存在则创建表 + runningTaskByShopService.createTable("t_running_task_" + shopId); + } + Task task = new Task(); + task.setTaskType(taskType); + task.setShopIds(shopId); + task.setShopNames(shopVo.getShopName()); + task.setFileName(fileName); + task.setDataNum(0L); + task.setTaskStatus("0"); + task.setStatus("0"); + task.setCreateBy(shopVo.getCreateBy()); + int mark = bookBaseInfoService.addNewTask(task); + if (mark > 0){ + result.put("code",200); + result.put("msg","任务创建成功"); + result.put("taskId",task.getId()); + }else{ + result.put("code",500); + result.put("msg","任务创建失败"); + } + return result; + } + + //扣除余额 + @GetMapping("/setBalance") + @SaIgnore + public Map setBalance(){ + return bookBaseInfoService.setBalance(); + } + + //页面支付 + @PostMapping("/userRecharge") + @SaIgnore + public R userRecharge(@RequestBody UserRechargeBo bo){ + //支付方式 1 微信 + String type = bo.getRechargType(); + //获取登录用户id + String userId = LoginHelper.getUserId().toString(); + if (userId.equals("1")){ + bo.setRechargPrice(BigDecimal.valueOf(1)); + } + if(type.equals("1")){ + //换算手续费为 分 + bo.setUserId(Long.parseLong(userId)); + bo.setStatus("0"); + // 插入erp订单 +// userRechargeService.insertByBo(bo); + String title = "页面展示会员"; + Integer payType=1; + // 插入新后台会员记录 +// bookBaseInfoService.insertUserInfo(bo,title,payType,198000); + // 新增新后台服务表插入 + Map params = new HashMap<>(); + params.put("service_name", title); + params.put("price", String.valueOf(bo.getRechargPrice())); + params.put("unit", "年"); + params.put("length", String.valueOf(1)); + params.put("type", "centerBookPage"); + params.put("sort", "1"); + String service = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/createService", params); + System.out.println("service:"+service); + if (service != null) { + JSONObject jsonObject = JSONObject.parseObject(service); + if (jsonObject != null && jsonObject.containsKey("data")) { + String serviceId = jsonObject.getString("data"); + params.put("serviceId", serviceId); + } + } + // 新增新后台订单表插入 + Map params1 = new HashMap<>(); + params1.put("orderType", "centerBookPage"); + params1.put("userId", userId); + params1.put("goodsId", params.get("serviceId")); + params1.put("count", "1"); + String orderId = null; + String order = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/orders/createOrder", params1); + System.out.println("order:"+order); + if (order != null) { + JSONObject jsonObject = JSONObject.parseObject(order); + if (jsonObject != null && jsonObject.containsKey("data")) { + JSONObject dataObject = jsonObject.getJSONObject("data"); + // 再从data对象中获取orderId + orderId = dataObject.getString("orderId"); + System.out.println("orderId:"+orderId); + params1.put("orderId", orderId); + } + } + String data = WxPayUtil.wxPay(bo.getId(), bo.getRechargPrice().setScale(0, RoundingMode.HALF_UP).intValue(), bo.getRechargPrice().toString(),orderId,userId); + String base64Str = WxPayUtil.generateQRCode(data); + Map map = new HashMap(); + map.put("img",base64Str); + map.put("id", bo.getId()); + return R.ok(map); + } + return R.fail("充值订单生成失败,请联系管理员"); + } + + + //高级按钮支付 + @PostMapping("/buttonUserRecharge") + @SaIgnore + public R buttonUserRecharge(@RequestBody UserRechargeBo bo){ + //支付方式 1 微信 + String type = bo.getRechargType(); + String userId = LoginHelper.getUserId().toString(); + if (userId.equals("1")){ + bo.setRechargPrice(BigDecimal.valueOf(1)); + } + //获取登录用户id + Integer intValue = bo.getRechargPrice().setScale(0, RoundingMode.HALF_UP).intValue(); // 124 + if(type.equals("1")){ + //换算手续费为 分 + bo.setUserId(Long.parseLong(userId)); + bo.setStatus("0"); + // 插入 erp 订单表 +// userRechargeService.insertByBo(bo); + String title = "高级搜索会员"; + Integer payType=0; + // 插入 newAErp 订单表 +// bookBaseInfoService.insertUserInfo(bo,title,payType,9800); + // 新增新后台服务表插入 + Map params = new HashMap<>(); + params.put("service_name", title); + params.put("price", String.valueOf(bo.getRechargPrice())); + params.put("unit", "月"); + params.put("length", String.valueOf(1)); + params.put("type", "centerBookSearch"); + params.put("sort", "1"); + String orderUrl = configService.selectConfigByKey("order.url"); + String service = InterfaceUtils.postForm(orderUrl, "/api/createService", params); +// String service = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/createService", params); + if (service != null) { + JSONObject jsonObject = JSONObject.parseObject(service); + if (jsonObject != null && jsonObject.containsKey("data")) { + String serviceId = jsonObject.getString("data"); + params.put("serviceId", serviceId); + } + } + // 新增新后台订单表插入 + Map params1 = new HashMap<>(); + params1.put("orderType", "centerBookSearch"); + params1.put("userId", userId); + params1.put("goodsId", params.get("serviceId")); + params1.put("count", "1"); + String orderId = null; + String order = InterfaceUtils.postForm(orderUrl, "/api/orders/createOrder", params1); +// String order = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/orders/createOrder", params1); + if (order != null) { + JSONObject jsonObject = JSONObject.parseObject(order); + if (jsonObject != null && jsonObject.containsKey("data")) { + JSONObject dataObject = jsonObject.getJSONObject("data"); + // 再从data对象中获取orderId + orderId = dataObject.getString("orderId"); + params1.put("orderId", orderId); + } + } + String data = WxPayUtil.wxPay(bo.getId(),intValue,bo.getRechargPrice().toString(),orderId,userId); + String base64Str = WxPayUtil.generateQRCode(data); + Map map = new HashMap(); + map.put("img",base64Str); + map.put("id", bo.getId()); + return R.ok(map); + } + return R.fail("充值订单生成失败,请联系管理员"); + } + + + /** + * 获取图片详情 从选品中心获取图片 + * @param isbn + * @return + */ + @GetMapping("/getImageDeit/{isbn}") + @SaIgnore + public R> getImageDeit(@PathVariable String isbn){ + try { + if (StringUtils.isEmpty(isbn)) { + return R.fail("ISBN不能为空"); + } + log.info("开始获取官图,ISBN: {}", isbn); + String goUrl = configService.selectConfigByKey("centerBook.url"); +// String goUrl = "http://localhost:9009"; + String apiUrl = "/es/searchByISBN?isbn=" + isbn; + String responseStr = getInterface(goUrl, apiUrl); + + Map result = new HashMap<>(); + result.put("isbn", isbn); + + if (StringUtils.isNotEmpty(responseStr)) { + try { + // 解析返回的JSON数据 + Map responseMap = JsonUtil.transferToObj(responseStr, Map.class); + if (responseMap != null && responseMap.containsKey("data")) { + String localPath=null ; + Object dataObj = responseMap.get("data"); + if (dataObj instanceof Map) { + Map dataMap = (Map) dataObj; + Object bookPicObj = dataMap.get("book_pic"); + if (bookPicObj instanceof String) { + localPath = (String) bookPicObj; + } else if (bookPicObj instanceof Map) { + + Map bookPicMap = (Map) bookPicObj; + localPath = (String) bookPicMap.get("pddPath"); + } else { + // 其他情况,比如为null或者不是我们预期的类型,可以设置一个默认值或者抛出异常 + localPath = null; // 或者默认值 + } + } + + result.put("localPath", localPath != null ? localPath : ""); + log.info("成功获取官图,ISBN: {}, book_pic_new: {}", isbn, localPath); + } else { + result.put("localPath", ""); + log.warn("接口返回数据格式异常,ISBN: {}", isbn); + } + } catch (Exception parseException) { + result.put("localPath", ""); + log.error("解析接口返回数据失败,ISBN: {}, 错误: {}", isbn, parseException.getMessage()); + } + } else { + result.put("localPath", ""); + log.warn("接口返回数据为空,ISBN: {}", isbn); + } + + return R.ok(result); + + } catch (Exception e) { + log.error("获取官图失败,ISBN: {}, 错误: {}", isbn, e.getMessage(), e); + Map result = new HashMap<>(); + result.put("localPath", ""); + result.put("isbn", isbn); + return R.ok(result); + } + + + + // Map map = bookBaseInfoService.getImageDite(isbn); + // return map; + } + + /** + * 检查订单状态 + * @return + */ + @GetMapping("/checkStatus") + @SaIgnore + public R checkStatus(String type) throws JsonProcessingException { + String userId = String.valueOf(LoginHelper.getUserId()); + Map map = new HashMap(); + map.put("type",type); + map.put("userId",userId); + String orderUrl = configService.selectConfigByKey("order.url"); + String status = InterfaceUtils.postForm(orderUrl, "/api/orders/checkStatus", map); +// String status = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/orders/checkStatus", map); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(status); + + // 构建返回结果 + Map resultMap = new HashMap<>(); + resultMap.put("code", rootNode.get("code")); + resultMap.put("isVip", rootNode.get("data").get("isVip")); + resultMap.put("expirationDate", rootNode.get("data").get("expirationDate")); + resultMap.put("msg", rootNode.get("message")); + + // 返回成功响应 + return R.ok(resultMap); + } + + /** + * xcx查询选品中心数据并同步 + */ + @PostMapping("/getXcxData") + @SaIgnore + public R getXcxData(@RequestBody ProductForm form) { + /** + * 添加选品中心查询 + */ + String centerBookUrl = configService.selectConfigByKey("centerBook.url"); +// String centerBookUrl = "http://192.168.101.213:9009/api"; + String path = "/es/addBookToES"; + Map params = new HashMap<>(); + params.put("isbn", form.getBarcode()); + + params.put("book_name",form.getName()); +// params.put("fix_price", form.getPrice()); + params.put("author", form.getAuthor()); + params.put("publication_time", form.getPublishTime()); + params.put("publisher", form.getPublisher()); + params.put("sell_counts", form.getSellCount()); + params.put("buy_counts", form.getBuyCount()); + + Map book_pic = new HashMap<>(); + Map book_pic_s = new HashMap<>(); + + String pddResponse = ""; + if (form.getFiles() != null && !form.getFiles().isEmpty() && form.getFiles().get(0).getUrl() != null && form.getFiles().get(0).getUrl().startsWith("http")) { + pddResponse = form.getFiles().get(0).getUrl(); + } + book_pic_s.put("localPath", ""); + book_pic_s.put("pddResponse", pddResponse); + + // 处理 kfzBookPic 图片上传获取 pddUrl + String pddUrl = ""; + if (form.getKfzBookPic() != null && !form.getKfzBookPic().isEmpty()) { + // 调用 processImage 处理图片URL + try { + log.info("开始处理图片URL: {}", form.getKfzBookPic()); + + // 从URL下载图片并转换为MultipartFile + String fileName = form.getBarcode() != null ? form.getBarcode() + ".jpg" : "image.jpg"; + UrlMultipartFile urlFile = new UrlMultipartFile(form.getKfzBookPic(), fileName); + + // 构建请求参数 - 使用文件而不是URL + Map imageRequest = new HashMap<>(); + imageRequest.put("goodsName", form.getName()); + imageRequest.put("isbn", form.getBarcode()); + imageRequest.put("isKW", "true"); // 标记为孔网图片 + imageRequest.put("autoUpload", "true"); // 自动上传到PDD + + // 将文件转换为base64 + byte[] bytes = urlFile.getBytes(); + String base64File = java.util.Base64.getEncoder().encodeToString(bytes); + imageRequest.put("imageData", base64File); + imageRequest.put("fileName", fileName); + + // 调用 processImageAndExtractPddUrl 方法获取 pddUrl + pddUrl = InterfaceUtils.processImageAndExtractPddUrl(imageRequest); + + log.info("图片处理成功,获取到 pddUrl: {}", pddUrl); + + } catch (Exception e) { + log.error("图片处理失败: {}, 错误: {}", form.getKfzBookPic(), e.getMessage(), e); + // 处理失败时 pddUrl 为空 + pddUrl = ""; + } + } + + // 将获取到的 pddUrl 放入 bookPic.pddPath + book_pic.put("pddPath", pddUrl); + + params.put("book_pic", book_pic); + params.put("book_pic_s", book_pic_s); + System.out.println("传递的参数"+params); + String interfacePost = InterfaceUtils.getInterfacePost(centerBookUrl, path, params); + return R.ok(interfacePost); + } + + @PostMapping("/processImage") + @SaIgnore + @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "图片处理中,请稍后再试") + public R processImage(@RequestParam(value = "filepath", required = false) MultipartFile file, + @RequestParam(value = "goodsName", required = false) String goodsName, + @RequestParam(value = "isbn", required = false) String isbn, + @RequestParam(value = "isKW", required = false, defaultValue = "false") String isKW, + @RequestParam(value = "autoUpload", required = false, defaultValue = "false") String autoUpload) { + try { + // 构建请求数据 + Map requestData = new HashMap<>(); + requestData.put("goodsName", goodsName); + requestData.put("isbn", isbn); + requestData.put("isKW", isKW); + requestData.put("autoUpload", autoUpload); + + // 如果有文件,优先使用文件 + if (file != null && !file.isEmpty()) { + // 将文件转换为base64用于传递给工具类 + byte[] bytes = file.getBytes(); + String base64File = java.util.Base64.getEncoder().encodeToString(bytes); + requestData.put("imageData", base64File); + requestData.put("fileName", file.getOriginalFilename()); + } else { + return R.fail("请提供图片文件或图片URL"); + } + + // 调用InterfaceUtils中的processImageAndExtractPddUrl方法获取PDD URL + // 现在直接传递Map对象,而不是JSON字符串 + String pddUrl = InterfaceUtils.processImageAndExtractPddUrl(requestData); + + // 返回提取的URL + return R.ok(pddUrl); + + } catch (Exception e) { + return R.fail("图片处理失败: " + e.getMessage()); + } + } + + @PostMapping("/detectById/{id}") + @SaIgnore + public R detectById(@PathVariable("id") Integer id) { + String centerBookUrl = configService.selectConfigByKey("centerBook.url"); +// String centerBookUrl = "http://localhost:9009/api"; + String path = "/es/DeleteBookByID?id=" + id; + String result = InterfaceUtils.getInterface(centerBookUrl, path); + System.out.println("删除结果:" + result); + return R.ok(result); + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CountController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CountController.java new file mode 100644 index 0000000..ee81962 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CountController.java @@ -0,0 +1,48 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.Statistic; + +import org.dromara.zhishu.service.CountService; +import org.dromara.zhishu.util.CnumberUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 统计 + * + * @author ruoyi + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/zhishu/statistic") +public class CountController extends BaseController { + + @Autowired + private CountService countService; + + + /** + * 获取库房总数,货架总数 + */ + @SaIgnore +// @SaCheckPermission("zhishu:statistic:statistic") + @GetMapping("/statistic") + public Statistic list() { + //获取当前用户id + Statistic message = countService.selectStatistic(); +// System.out.println(message); + return message; + } + + @GetMapping("/isbn") + @SaIgnore + public String getIsbn() { + return CnumberUtils.generateRandomIsbn(); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CourierLogController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CourierLogController.java new file mode 100644 index 0000000..1e87236 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/CourierLogController.java @@ -0,0 +1,81 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.zhishu.domain.CourierLog; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.CourierLogVo; +import org.dromara.zhishu.domain.bo.CourierLogBo; +import org.dromara.zhishu.service.ICourierLogService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 快递日志 + * + * @author yxy + * @date 2026-03-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/courierLog") +public class CourierLogController extends BaseController { + + private final ICourierLogService courierLogService; + + /** + * 查询快递日志列表 + */ + @SaCheckPermission("zhishu:courierLog:list") + @GetMapping("/list") + public TableDataInfo list(CourierLogBo bo, PageQuery pageQuery) { + return courierLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出快递日志列表 + */ + @SaCheckPermission("zhishu:courierLog:export") + @Log(title = "快递日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(CourierLogBo bo, HttpServletResponse response) { + List list = courierLogService.queryList(bo); + ExcelUtil.exportExcel(list, "快递日志", CourierLogVo.class, response); + } + + /** + * 获取快递日志详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:courierLog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(courierLogService.queryById(id)); + } + + /** + * 删除快递日志 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:courierLog:remove") + @Log(title = "快递日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(courierLogService.deleteWithValidByIds(List.of(ids), true)); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/DepotOrderController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/DepotOrderController.java new file mode 100644 index 0000000..ed8b80c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/DepotOrderController.java @@ -0,0 +1,642 @@ +package org.dromara.zhishu.controller; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.bo.TShopOrderBo; +import org.dromara.zhishu.domain.dto.OrderGoodsDto; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.util.InterfaceUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.bo.DepotOrderBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 仓库订单信息 + * + * @author yxy + * @date 2025-06-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/depotOrder") +public class DepotOrderController extends BaseController { + + private final IDepotOrderService depotOrderService; + private final ITDepotService depotService; + private final ITLogisticsService logisticsService; + private final ITShopOrderService shopOrderService; + private final IFastMailService fastMailService; + private final ISysConfigService configService;; + + /** + * 查询仓库订单信息列表 + */ + @SaCheckPermission("zhishu:depotOrder:list") + @GetMapping("/list") + public TableDataInfo list(DepotOrderBo bo, PageQuery pageQuery) { + return depotOrderService.queryPageList(bo, pageQuery); + } + + /** + * 导出仓库订单信息列表 + */ + @SaCheckPermission("zhishu:depotOrder:export") + @Log(title = "仓库订单信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DepotOrderBo bo, HttpServletResponse response) { + List list = depotOrderService.queryList(bo); + ExcelUtil.exportExcel(list, "仓库订单信息", DepotOrderVo.class, response); + } + + /** + * 获取仓库订单信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:depotOrder:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(depotOrderService.queryById(id)); + } + + /** + * 新增仓库订单信息 + */ + @SaCheckPermission("zhishu:depotOrder:add") + @Log(title = "仓库订单信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DepotOrderBo bo) { + return toAjax(depotOrderService.insertByBo(bo)); + } + + /** + * 修改仓库订单信息 + */ + @SaCheckPermission("zhishu:depotOrder:edit") + @Log(title = "仓库订单信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DepotOrderBo bo) { + return toAjax(depotOrderService.updateByBo(bo)); + } + + /** + * 删除仓库订单信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:depotOrder:remove") + @Log(title = "仓库订单信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(depotOrderService.deleteWithValidByIds(List.of(ids), true)); + } + + + /** + * 电子面单下单 + * 获取运单号 + */ + @SaIgnore + @GetMapping("/getMailNo") + public R getMailNo(String id) throws Exception { + DepotOrderVo depotOrderVo = depotOrderService.selectDepotOrderById(id); + + if (depotOrderVo != null){ + TShopOrderVo shopOrderVo = shopOrderService.queryById(Long.parseLong(depotOrderVo.getShopOrderId())); + + + //查询韵达联调账号密码 + FastMailVo fastMailVo = fastMailService.selectByUserIdAndType(LoginHelper.getUserId().toString(),"1"); + if(fastMailVo == null){ + return R.fail("未配置韵达快递账号,请前往快递打单账号管理"); + } + //获取服务id + String fastMailIp = configService.selectConfigByKey("fastMail.ip"); + // String fastMailIp = "http://localhost:8100"; + + Map map=sendMailToYunda(depotOrderVo,fastMailVo); + + + String mailNo = InterfaceUtils.getInterfacePost(fastMailIp,"/api/yunda/createBmOrder", map); + + Map mailNoMap = JsonUtils.parseMap(mailNo); + + List list = (List) mailNoMap.get("data"); + + Map dataMap = (Map) list.get(0); + + mailNo = dataMap.get("mail_no").toString(); + //存储到订单中 + TShopOrderBo shopOrderBo = new TShopOrderBo(); + shopOrderBo.setId(Long.parseLong(depotOrderVo.getShopOrderId())); + shopOrderBo.setTrackingNumber(mailNo); + shopOrderBo.setOrderStatus(2); + shopOrderService.updateByBo(shopOrderBo); + + + //调用电子面单打印接口 + Map dayinMap = new HashMap(); + dayinMap.put("mailNo",mailNo); + dayinMap.put("partner_id",fastMailVo.getPartnerId()); + dayinMap.put("secret",fastMailVo.getSecret()); + + String pdfDataStr = InterfaceUtils.getInterfacePost(fastMailIp,"/api/yunda/createBmOrderDaYin", dayinMap); + Map pdfDataMap = JsonUtils.parseMap(pdfDataStr); + + List pdfDataList = (List) pdfDataMap.get("data"); + Map pdfData = (Map) pdfDataList.get(0); + String pdfInfo = pdfData.get("pdfInfo").toString(); + + + return R.ok(pdfInfo); + }else { + return R.fail("未找到该订单"); + } + + } + + + @GetMapping("/getPdf") + public R getPdf(String mailNo){ + + //查询韵达联调账号密码 + FastMailVo fastMailVo = fastMailService.selectByUserIdAndType(LoginHelper.getUserId().toString(),"1"); + if(fastMailVo == null){ + return R.fail("未配置韵达快递账号,请前往快递打单账号管理"); + } + //获取服务id + String fastMailIp = configService.selectConfigByKey("fastMail.ip"); + // String fastMailIp = "http://localhost:8100"; + //调用电子面单打印接口 + Map dayinMap = new HashMap(); + dayinMap.put("mailNo",mailNo); + dayinMap.put("partner_id",fastMailVo.getPartnerId()); + dayinMap.put("secret",fastMailVo.getSecret()); + + String pdfDataStr = InterfaceUtils.getInterfacePost(fastMailIp,"/api/yunda/createBmOrderDaYin", dayinMap); + Map pdfDataMap = JsonUtils.parseMap(pdfDataStr); + + List pdfDataList = (List) pdfDataMap.get("data"); + Map pdfData = (Map) pdfDataList.get(0); + String pdfInfo = pdfData.get("pdfInfo").toString(); + + return R.ok(pdfInfo); + } + + /** + * 圆通获取订单号接口 + */ + @SaIgnore + @GetMapping("/getMailNoByYuanTong") + public R getMailNoByYuanTong(String id){ + //获取服务id +// String fastMailIp = configService.selectConfigByKey("fastMail.ip"); + String fastMailIp = "http://localhost:8100"; + + DepotOrderVo depotOrderVo = depotOrderService.selectDepotOrderById(id); + //获取货号 + Map itemList = JsonUtils.parseMap(depotOrderVo.getItemList()); + String artNo = itemList.get("itemSn").toString(); + String itemName = itemList.get("itemName").toString(); + //货号前两位,仓库编码 +// String code = artNo.substring(0,2); + TDepotVo depotVo = depotService.selectDepotByCode(artNo); + //获取仓库绑定的运费模板 + TLogisticsVo tLogisticsVo = logisticsService.queryById(depotVo.getId()); + + Map map = new HashMap(); + map.put("logisticsNo",depotOrderVo.getOrderSn()); + map.put("senderName",tLogisticsVo.getContact()); + map.put("senderProvinceName",tLogisticsVo.getDeliveryProvince()); + map.put("senderCityName",tLogisticsVo.getDeliveryCity()); + map.put("senderCountyName",tLogisticsVo.getDeliveryArea()); + map.put("senderAddress",depotOrderVo.getReceiverName()); + map.put("receiverAddress",tLogisticsVo.getFullAddress()); + map.put("senderMobile",tLogisticsVo.getPhoneNumber()); + map.put("recipientName",depotOrderVo.getReceiverName()); + map.put("recipientProvinceName",depotOrderVo.getProvince()); + map.put("recipientCityName",depotOrderVo.getCity()); + map.put("recipientCountyName",depotOrderVo.getTown()); + map.put("recipientMobile",depotOrderVo.getReceiverPhoneMask()); + map.put("recipientAddress",depotOrderVo.getReceiverAddressMask()); + map.put("itemName",itemName); + //备注(货号) + map.put("remark",artNo); + + // 获取商品信息 + String isbn = itemList.containsKey("isbn") ? itemList.get("isbn").toString() : ""; + String itemId = itemList.containsKey("itemId") ? itemList.get("itemId").toString() : ""; + String quality = itemList.containsKey("quality") ? itemList.get("quality").toString() : ""; + String number = itemList.containsKey("number") ? itemList.get("number").toString() : "1"; + + // 创建OrderGoodsDto对象并设置相关属性 + OrderGoodsDto goodsDto = new OrderGoodsDto() + .setName(itemName) + .setItemSn(isbn) + .setGoodsId(itemId) + .setQuality(quality) + .setQuantity(Integer.parseInt(number)); + + // 创建物品列表集合 + Set goodsSet = new HashSet<>(); + goodsSet.add(goodsDto); + + // 添加物品列表到参数中 + map.put("goods", goodsSet); + + String mailNoResponse = InterfaceUtils.getInterfacePost(fastMailIp,"/api/yuanTong/createOrder", map); + + Map mailNoMap = JsonUtils.parseMap(mailNoResponse); + + // 直接从返回数据中获取mailNo,而不是从list中获取 + String mailNo = ""; + if (mailNoMap.containsKey("mailNo")) { + mailNo = mailNoMap.get("mailNo").toString(); + } else if (mailNoMap.containsKey("data") && mailNoMap.get("data") instanceof Map) { + Map dataMap = (Map) mailNoMap.get("data"); + if (dataMap.containsKey("mailNo")) { + mailNo = dataMap.get("mailNo").toString(); + } + } + + // 如果没有获取到mailNo,尝试解析完整的响应数据 + if (mailNo.isEmpty() && mailNoMap.containsKey("data")) { + Object dataObj = mailNoMap.get("data"); + if (dataObj instanceof String) { + // 尝试解析data字段中的JSON字符串 + Map dataMap = JsonUtils.parseMap(dataObj.toString()); + if (dataMap.containsKey("mailNo")) { + mailNo = dataMap.get("mailNo").toString(); + } + } + } + + // 如果仍然没有获取到mailNo,记录错误并返回 + if (mailNo.isEmpty()) { + return R.fail("获取运单号失败,接口返回数据:" + mailNoResponse); + } + + //存储到订单中 + TShopOrderBo shopOrderBo = new TShopOrderBo(); + shopOrderBo.setId(Long.parseLong(depotOrderVo.getShopOrderId())); + shopOrderBo.setTrackingNumber(mailNo); + shopOrderBo.setOrderStatus(2); + shopOrderService.updateByBo(shopOrderBo); + + //调用电子面单打印接口 + Map dayinMap = new HashMap(); + dayinMap.put("waybillNo", mailNo); + + String pdfDataStr = InterfaceUtils.getInterfacePost(fastMailIp,"/api/yuanTong/printWaybill", dayinMap); + Map pdfDataMap = JsonUtils.parseMap(pdfDataStr); + + // 直接从返回数据中获取PDF信息 + String pdfInfo = ""; + if (pdfDataMap.containsKey("data")) { + Object dataObj = pdfDataMap.get("data"); + if (dataObj instanceof Map) { + Map dataMap = (Map) dataObj; + if (dataMap.containsKey("pdfBase64")) { + pdfInfo = dataMap.get("pdfBase64").toString(); + } + } else if (dataObj instanceof String) { + try { + // 尝试解析data字段中的JSON字符串 + Map dataMap = JsonUtils.parseMap(dataObj.toString()); + if (dataMap != null && dataMap.containsKey("pdfBase64")) { + pdfInfo = dataMap.get("pdfBase64").toString(); + } else { + pdfInfo = dataObj.toString(); + } + } catch (Exception e) { + // 如果解析失败,直接使用字符串 + pdfInfo = dataObj.toString(); + } + } + } + + if (pdfInfo.isEmpty()) { + return R.fail("获取电子面单失败,接口返回数据:" + pdfDataStr); + } + + return R.ok(pdfInfo); + } + + @GetMapping("/getPdfByYuanTong") + public R getPdfByYuanTong(String waybillNo){ + //获取服务id +// String fastMailIp = configService.selectConfigByKey("fastMail.ip"); + + String fastMailIp = "http://localhost:8100"; + //调用电子面单打印接口 + Map dayinMap = new HashMap(); + dayinMap.put("waybillNo", waybillNo); + + String pdfDataStr = InterfaceUtils.getInterfacePost(fastMailIp,"/api/yuanTong/printWaybill", dayinMap); + Map pdfDataMap = JsonUtils.parseMap(pdfDataStr); + + // 直接从返回数据中获取PDF信息 + String pdfInfo = ""; + if (pdfDataMap.containsKey("data")) { + Object dataObj = pdfDataMap.get("data"); + if (dataObj instanceof Map) { + Map dataMap = (Map) dataObj; + if (dataMap.containsKey("pdfBase64")) { + pdfInfo = dataMap.get("pdfBase64").toString(); + } + } else if (dataObj instanceof String) { + try { + // 尝试解析data字段中的JSON字符串 + Map dataMap = JsonUtils.parseMap(dataObj.toString()); + if (dataMap != null && dataMap.containsKey("pdfBase64")) { + pdfInfo = dataMap.get("pdfBase64").toString(); + } else { + pdfInfo = dataObj.toString(); + } + } catch (Exception e) { + // 如果解析失败,直接使用字符串 + pdfInfo = dataObj.toString(); + } + } + } + + if (pdfInfo.isEmpty()) { + return R.fail("获取电子面单失败,接口返回数据:" + pdfDataStr); + } + + return R.ok(pdfInfo); + } + + /** + * 中通获取订单号接口 + */ + @SaIgnore + @GetMapping("/getMailNoByZhongTong") + public R getMailNoByZhongTong(String id){ + //获取服务id +// String fastMailIp = configService.selectConfigByKey("fastMail.ip"); + String fastMailIp = "http://localhost:8100"; + + DepotOrderVo depotOrderVo = depotOrderService.selectDepotOrderById(id); + + //获取货号 + Map itemList = JsonUtils.parseMap(depotOrderVo.getItemList()); + String artNo = itemList.get("itemSn").toString(); + String itemName = itemList.get("itemName").toString(); + //货号前两位,仓库编码 +// String code = artNo.substring(0,2); + TDepotVo depotVo = depotService.selectDepotByCode(artNo); + //获取仓库绑定的运费模板 + TLogisticsVo tLogisticsVo = logisticsService.queryById(depotVo.getId()); + + Map map = new HashMap(); + map.put("partnerType","2"); + map.put("orderType","1"); + map.put("partnerOrderCode",depotOrderVo.getOrderSn()); + Map accountInfo = new HashMap<>(); + accountInfo.put("accountId", "test"); + accountInfo.put("accountPassword", "ZTO123"); + accountInfo.put("type", "1"); + map.put("accountInfo", accountInfo); + + // 发件人信息 + Map senderInfo = new HashMap<>(); + senderInfo.put("senderName", tLogisticsVo.getContact()); + senderInfo.put("senderMobile", tLogisticsVo.getPhoneNumber()); + senderInfo.put("senderProvince", tLogisticsVo.getDeliveryProvince()); + senderInfo.put("senderCity", tLogisticsVo.getDeliveryCity()); + senderInfo.put("senderDistrict", tLogisticsVo.getDeliveryArea()); + senderInfo.put("senderAddress", tLogisticsVo.getFullAddress()); + map.put("senderInfo", senderInfo); + + // 收件人信息 + Map receiveInfo = new HashMap<>(); + receiveInfo.put("receiverName", depotOrderVo.getReceiverName()); + receiveInfo.put("receiverMobile", depotOrderVo.getReceiverPhoneMask()); + receiveInfo.put("receiverProvince", depotOrderVo.getProvince()); + receiveInfo.put("receiverCity", depotOrderVo.getCity()); + receiveInfo.put("receiverDistrict", depotOrderVo.getTown()); + receiveInfo.put("receiverAddress", depotOrderVo.getReceiverAddressMask()); + map.put("receiveInfo", receiveInfo); + // 获取商品信息 + String isbn = itemList.containsKey("isbn") ? itemList.get("isbn").toString() : ""; + String itemId = itemList.containsKey("itemId") ? itemList.get("itemId").toString() : ""; + String quality = itemList.containsKey("quality") ? itemList.get("quality").toString() : ""; + String number = itemList.containsKey("number") ? itemList.get("number").toString() : "1"; + + // 创建OrderGoodsDto对象并设置相关属性 + OrderGoodsDto goodsDto = new OrderGoodsDto() + .setName(itemName) + .setItemSn(isbn) + .setGoodsId(itemId) + .setQuality(quality) + .setQuantity(Integer.parseInt(number)); + + // 创建物品列表集合 + Set goodsSet = new HashSet<>(); + goodsSet.add(goodsDto); + Map orderItems = new HashMap<>(); + orderItems.put("name", goodsSet); + map.put("orderItems", orderItems); + + String mailNoResponse = InterfaceUtils.getInterfacePost(fastMailIp,"/api/zto/createOrder", map); + + Map mailNoMap = JsonUtils.parseMap(mailNoResponse); + + // 直接从返回数据中获取mailNo,而不是从list中获取 + String mailNo = ""; + if (mailNoMap.containsKey("mailNo")) { + mailNo = mailNoMap.get("mailNo").toString(); + } else if (mailNoMap.containsKey("data") && mailNoMap.get("data") instanceof Map) { + Map dataMap = (Map) mailNoMap.get("data"); + if (dataMap.containsKey("mailNo")) { + mailNo = dataMap.get("mailNo").toString(); + } + } + + // 如果没有获取到mailNo,尝试解析完整的响应数据 + if (mailNo.isEmpty() && mailNoMap.containsKey("data")) { + Object dataObj = mailNoMap.get("data"); + if (dataObj instanceof String) { + // 尝试解析data字段中的JSON字符串 + Map dataMap = JsonUtils.parseMap(dataObj.toString()); + if (dataMap.containsKey("mailNo")) { + mailNo = dataMap.get("mailNo").toString(); + } + } + } + + // 如果仍然没有获取到mailNo,记录错误并返回 + if (mailNo.isEmpty()) { + return R.fail("获取运单号失败,接口返回数据:" + mailNoResponse); + } + + //存储到订单中 + TShopOrderBo shopOrderBo = new TShopOrderBo(); + shopOrderBo.setId(Long.parseLong(depotOrderVo.getShopOrderId())); + shopOrderBo.setTrackingNumber(mailNo); + shopOrderBo.setOrderStatus(2); + shopOrderService.updateByBo(shopOrderBo); + + //调用电子面单打印接口 + Map dayinMap = new HashMap(); + dayinMap.put("waybillNo", mailNo); + + String pdfDataStr = InterfaceUtils.getInterfacePost(fastMailIp,"/api/zto/printWaybill", dayinMap); + Map pdfDataMap = JsonUtils.parseMap(pdfDataStr); + + // 直接从返回数据中获取PDF信息 + String pdfInfo = ""; + if (pdfDataMap.containsKey("data")) { + Object dataObj = pdfDataMap.get("data"); + if (dataObj instanceof Map) { + Map dataMap = (Map) dataObj; + if (dataMap.containsKey("pdfBase64")) { + pdfInfo = dataMap.get("pdfBase64").toString(); + } + } else if (dataObj instanceof String) { + try { + // 尝试解析data字段中的JSON字符串 + Map dataMap = JsonUtils.parseMap(dataObj.toString()); + if (dataMap != null && dataMap.containsKey("pdfBase64")) { + pdfInfo = dataMap.get("pdfBase64").toString(); + } else { + pdfInfo = dataObj.toString(); + } + } catch (Exception e) { + // 如果解析失败,直接使用字符串 + pdfInfo = dataObj.toString(); + } + } + } + + if (pdfInfo.isEmpty()) { + return R.fail("获取电子面单失败,接口返回数据:" + pdfDataStr); + } + + return R.ok(pdfInfo); + } + + + public Map sendMailToYunda(DepotOrderVo depotOrderVo,FastMailVo fastMailVo) { + + + Map map = new HashMap(); + // 判断订单来源 1 拼多多 2 孔网 + if(depotOrderVo.getOrderSourceType()==1){ + //获取货号 + Map itemList = JsonUtils.parseMap(depotOrderVo.getItemList()); + + String artNo = itemList.get("outerId").toString(); + String itemName = itemList.get("goodsName").toString(); + //货号前两位,仓库编码 + // String code = artNo.substring(0,2); + TDepotVo depotVo = depotService.selectDepotByCode(artNo); + //获取仓库绑定的运费模板 + TLogisticsVo tLogisticsVo = logisticsService.queryById(depotVo.getId()); + + + map.put("order_serial_no",depotOrderVo.getOrderSn()); + map.put("khddh",depotOrderVo.getOrderSn()); + map.put("senderName",tLogisticsVo.getContact()); + map.put("senderAddress",tLogisticsVo.getFullAddress()); + map.put("senderMobile",tLogisticsVo.getPhoneNumber()); + map.put("receiverName",depotOrderVo.getReceiverName()); + map.put("receiverAddress",depotOrderVo.getReceiverAddress()); + map.put("receiverMobile",depotOrderVo.getReceiverPhoneMask()); + map.put("partner_id",fastMailVo.getPartnerId()); + map.put("secret",fastMailVo.getSecret()); + map.put("itemName",itemName); + //备注(货号) + map.put("remark",artNo); + // 构建自定义区域的商品信息数据 + String isbn = itemList.containsKey("outerGoodsId") ? itemList.get("outerGoodsId").toString() : ""; + String itemId = itemList.containsKey("skuId") ? itemList.get("skuId").toString() : ""; + String quality = itemList.containsKey("quality") ? itemList.get("quality").toString() : ""; + String number = itemList.containsKey("goodsCount") ? itemList.get("goodsCount").toString() : ""; + + // 按照要求格式组装数据: isbn|itemId|itemName|quality*number + String customItemInfo = isbn + "|" + itemId + "|" + itemName + "|[" + quality + "]*" + number; + + // 添加自定义数据到打印参数 + map.put("customData", customItemInfo); + + + } + if(depotOrderVo.getOrderSourceType()==2){ + + Map itemList = JSONObject.parseObject(depotOrderVo.getItemList()); + String artNo = itemList.get("itemSn").toString(); + String itemName = itemList.get("itemName").toString(); + //货号前两位,仓库编码 +// String code = artNo.substring(0,2); + TDepotVo depotVo = depotService.selectDepotByCode(artNo); + + //获取仓库绑定的运费模板 + TLogisticsVo tLogisticsVo = logisticsService.queryById(depotVo.getId()); + //获取仓库绑定的运费模板 + // Logistics logistics = logisticsService.getInfo(depot.getId()); + + + map.put("order_serial_no",depotOrderVo.getOrderSn()); + map.put("khddh",depotOrderVo.getOrderSn()); + map.put("senderName",tLogisticsVo.getContact()); + map.put("senderAddress",tLogisticsVo.getFullAddress()); + map.put("senderMobile",tLogisticsVo.getPhoneNumber()); + map.put("receiverName",depotOrderVo.getReceiverName()); + map.put("receiverAddress",depotOrderVo.getReceiverAddress()); + map.put("receiverMobile",depotOrderVo.getReceiverPhoneMask()); + map.put("partner_id",fastMailVo.getPartnerId()); + map.put("secret",fastMailVo.getSecret()); + map.put("itemName",itemName); + //备注(货号) + map.put("remark",artNo); + // 构建自定义区域的商品信息数据 + String isbn = itemList.containsKey("isbn") ? itemList.get("isbn").toString() : ""; + String itemId = itemList.containsKey("itemId") ? itemList.get("itemId").toString() : ""; + String quality = itemList.containsKey("quality") ? itemList.get("quality").toString() : ""; + String number = itemList.containsKey("number") ? itemList.get("number").toString() : ""; + + // 按照要求格式组装数据: isbn|itemId|itemName|quality*number + String customItemInfo = isbn + "|" + itemId + "|" + itemName + "|[" + quality + "]*" + number; + + // 添加自定义数据到打印参数 + map.put("customData", customItemInfo); + + } + + + return map; + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ExcelTaskController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ExcelTaskController.java new file mode 100644 index 0000000..7536e1b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ExcelTaskController.java @@ -0,0 +1,294 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.bo.ExcelTaskBo; +import org.dromara.zhishu.domain.vo.BookVo; +import org.dromara.zhishu.domain.vo.ExcelTaskVo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.service.IExcelTaskService; +import org.dromara.zhishu.service.ITDepotService; +import org.dromara.zhishu.threads.ExcelTaskRunnable; +import org.dromara.zhishu.util.EasyExcelUtil; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +/** + * execel任务列表 + * + * @author yxy + * @date 2025-03-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/excelTask") +public class ExcelTaskController extends BaseController { + + private final IExcelTaskService taskService; +// +// private final IShopDetailService shopDetailService; + +// private final PddServiceImpl pddService; + + private final ITDepotService tdepotService; + + + /** + * 查询任务列表列表 + */ + @SaCheckPermission("zhishu:excelTask:list") + @GetMapping("/list") + public TableDataInfo list(ExcelTaskBo bo, PageQuery pageQuery) { + return taskService.queryPageList(bo, pageQuery); + } + + + @GetMapping("/logsList") + public List> logsList(String id){ + String fileName = id+".txt"; + List> logsMapList = EasyExcelUtil.readFileContent(UrlUtil.getUrl() +fileName); + return logsMapList; + } + + @GetMapping("/logsMsg") + public String logsMsg(String id){ + String msg = EasyExcelUtil.readFileContentString(UrlUtil.getUrl()+id+"-msg.txt"); + return msg; + } + + @GetMapping("/logsDetailList/{taskId}/{shopId}") + public List> logsDetailList(@PathVariable("taskId") String taskId, + @PathVariable("shopId") String shopId){ + String fileName = taskId+shopId+".txt"; + List> logsDetailList = EasyExcelUtil.readFileContent(UrlUtil.getUrl()+fileName); + return logsDetailList; + } + + @SaIgnore + @GetMapping("/downloadLogs/{fileName}") + public ResponseEntity downloadLogs(HttpServletResponse response,@PathVariable String fileName) { + String filePath = UrlUtil.getUrl() + fileName; + File file = new File(filePath); + if (!file.exists()) { + return ResponseEntity.notFound().build(); + } + Resource resource = new FileSystemResource(file); + try { + // 编码文件名以处理 Unicode 字符 + String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(resource); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return ResponseEntity.badRequest().build(); + } + } + + /** + * 导出任务列表列表 + */ + @SaCheckPermission("zhishu:excelTask:export") + @Log(title = "任务列表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ExcelTaskBo bo, HttpServletResponse response) { +// List list = taskService.queryList(bo); +// ExcelUtil.exportExcel(list, "任务列表", ExcelTaskVo.class, response); + } + + /** + * 获取任务列表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:excelTask:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(taskService.queryById(id)); +// return null; + } + + /** + * 新增任务列表 + */ +// @SaCheckPermission("zhishu:excelTask:add") + @Log(title = "任务列表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody Map map) { + + //任务类型 + String taskType = map.get("taskType").toString(); +// + //仓库ids + String[] depotIdsArr = map.get("depotIds").toString().split(","); + //仓库名称 + String depotNames = ""; + for(String depotIds:depotIdsArr){ + String depotId=""; + if(depotIds.contains(String.valueOf("["))){ + depotId= depotIds.replace("[","").trim(); + }else if(depotIds.contains(String.valueOf("]"))){ + depotId= depotIds.replace("]","").trim(); + } + TDepotVo TDepotVo = tdepotService.queryById(Long.parseLong(depotId)); + + if(depotNames.equals("")){ + depotNames= TDepotVo.getName(); + }else{ + depotNames = depotNames + "," + TDepotVo.getName(); + } + } + + //图书列表 +// List list = RedisUtils.getCacheList("bookVoList"); +// RedisUtils.deleteObject("bookVoList"); + //文件名称 + String taskExcelName = RedisUtils.getCacheObject("taskExcelName"); + RedisUtils.deleteObject("taskExcelName"); + + //存储任务信息 + ExcelTaskBo taskBo = new ExcelTaskBo(); + taskBo.setTaskType(taskType); + taskBo.setFileName(taskExcelName); + taskBo.setDepotIds(depotNames); +// taskBo.setDataNum(Long.parseLong(list.size()+"")); + taskBo.setTaskStatus("1"); + taskService.insertByBo(taskBo); +// + // 创建并启动线程 + ExcelTaskRunnable taskRunnable = new ExcelTaskRunnable(map,taskBo); + Thread thread = new Thread(taskRunnable); + thread.start(); +// +// +// taskBo.setThreadId(thread.getId()); +// taskService.updateByBo(taskBo); + return toAjax(1); + } + + /** + * 暂停线程 + * @param threadId + */ + @GetMapping("/pauseThread/{threadId}/{taskId}") + public void pauseThread(@PathVariable("threadId") Long threadId,@PathVariable("taskId") Long taskId){ +// pddService.zanTing(String.valueOf(threadId)); +// ExcelTaskBo taskBo = new ExcelTaskBo(); +// taskBo.setId(taskId); +// taskBo.setTaskStatus("2"); +// taskService.updateByBo(taskBo); + } + + /** + * 继续执行线程 + * @param threadId + */ + @GetMapping("/continueThread/{threadId}/{taskId}") + public void continueThread(@PathVariable("threadId") Long threadId,@PathVariable("taskId") Long taskId){ +// pddService.huanXing(String.valueOf(threadId)); +// ExcelTaskBo taskBo = new ExcelTaskBo(); +// taskBo.setId(taskId); +// taskBo.setTaskStatus("1"); +// taskService.updateByBo(taskBo); + } + + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "发布任务数据", BookVo.class, response); + } + + + /** + * 修改任务列表 + */ + @SaCheckPermission("zhishu:task:edit") + @Log(title = "任务列表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ExcelTaskBo bo) { + return toAjax(taskService.updateByBo(bo)); +// return null; + } + + + /** + * 删除任务列表 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:excelTask:remove") + @Log(title = "任务列表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(taskService.deleteWithValidByIds(List.of(ids), true)); +// return null; + } + + @PostMapping(value = "/upload") + public R upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + /** + * 存储书号到radis + */ + RedisUtils.deleteObject("bookVoList"); + RedisUtils.deleteObject("taskExcelName"); + try { + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), BookVo.class, true); + List list = MapstructUtils.convert(excelResult.getList(), BookVo.class); + RedisUtils.setCacheList("bookVoList", list); + RedisUtils.setCacheObject("taskExcelName",file.getOriginalFilename()); + } catch (IOException e) { + throw new RuntimeException(e); + } +// UploadResult uploadResult = shopDetailService.upload(file); +// return R.ok(uploadResult); + return null; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/FilterSetController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/FilterSetController.java new file mode 100644 index 0000000..63e100d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/FilterSetController.java @@ -0,0 +1,189 @@ +package org.dromara.zhishu.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.vo.BookVo; +import org.dromara.zhishu.domain.vo.FilterSetTxtVo; +import org.dromara.zhishu.util.EasyExcelUtil; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.FilterSetVo; +import org.dromara.zhishu.domain.bo.FilterSetBo; +import org.dromara.zhishu.service.IFilterSetService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 过滤设置 + * + * @author yxy + * @date 2025-04-14 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/filterSet") +public class FilterSetController extends BaseController { + + private final IFilterSetService filterSetService; + + /** + * 查询过滤设置列表 + */ + @SaCheckPermission("zhishu:filterSet:list") + @GetMapping("/list") + public TableDataInfo list(FilterSetBo bo, PageQuery pageQuery) { + return filterSetService.queryPageList(bo, pageQuery); + } + + /** + * 导出过滤设置列表 + */ + @SaCheckPermission("zhishu:filterSet:export") + @Log(title = "过滤设置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(FilterSetBo bo, HttpServletResponse response) { + List list = filterSetService.queryList(bo); + ExcelUtil.exportExcel(list, "过滤设置", FilterSetVo.class, response); + } + + /** + * 获取过滤设置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:filterSet:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(filterSetService.queryById(id)); + } + + /** + * 新增过滤设置 + */ + @SaCheckPermission("zhishu:filterSet:add") + @Log(title = "过滤设置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + @SaIgnore + public R add(@Validated(AddGroup.class) @RequestBody FilterSetBo bo) { + String sort = bo.getSort(); + String[] addTxts = bo.getAddTxt().split("\n"); + Boolean bool = false; + for(String addTxt : addTxts){ + if (StringUtils.isEmpty(addTxt)){ + continue; + } + + bo.setId(null); + bo.setSort(sort); + //去掉前后空格 + addTxt = addTxt.trim(); + bo.setAddTxt(addTxt); + //查询是否有相同的违规词,如果有,则合并 + List list = filterSetService.selectVoListByBo(bo); + if(list.isEmpty()){ + //没有则直接新增 + bo.setAddTxt(addTxt); + bool = filterSetService.insertByBo(bo); + }else{ + //如果存在则合并平台字段,并将多余的数据删除 + //两个数组合并 + Set sortSet = new HashSet(); + FilterSetVo vo = list.get(0); + String[] newSortArr = bo.getSort().split( ","); + for (int j=0;j edit(@Validated(EditGroup.class) @RequestBody FilterSetBo bo) { + return toAjax(filterSetService.updateByBo(bo)); + } + + /** + * 删除过滤设置 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:filterSet:remove") + @Log(title = "过滤设置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(filterSetService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "过滤设置数据", FilterSetTxtVo.class, response); + } + + @PostMapping(value = "/upload") + public R> upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + try { + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), FilterSetTxtVo.class, true); + List list = MapstructUtils.convert(excelResult.getList(), FilterSetTxtVo.class); + return R.ok(list); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/GoofishController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/GoofishController.java new file mode 100644 index 0000000..ebf18f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/GoofishController.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/huidiao/goofish") +public class GoofishController { + /** + * 导出店铺主表列表 + */ + + @PostMapping("/goofishGoods") + @SaIgnore + public void goofishgoods( ) { + return; + } + + @PostMapping("/goofishgOrder") + @SaIgnore + public void goofishgOrder( ) { + return; + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/KongfzController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/KongfzController.java new file mode 100644 index 0000000..40c5a96 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/KongfzController.java @@ -0,0 +1,209 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.lang.TypeReference; +import cn.hutool.json.ObjectMapper; +import com.alibaba.fastjson.JSONObject; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopAccessTokenClient; +import com.pdd.pop.sdk.http.api.pop.response.PddMallInfoGetResponse; +import com.pdd.pop.sdk.http.token.AccessTokenResponse; +import io.swagger.v3.core.util.Json; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.TUserPlatform; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.bo.ShopBo; +import org.dromara.zhishu.domain.bo.ShopGoodsPublishedBo; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.JsonObjUtil; +import org.dromara.zhishu.util.MapUtils; +import org.dromara.zhishu.util.UploadUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.AbstractView; +import org.springframework.web.servlet.view.RedirectView; + +import java.io.IOException; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import static cn.dev33.satoken.SaManager.log; +import static org.dromara.zhishu.util.InterfaceUtils.getInterface; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/kongfz") +public class KongfzController { + + private final RuoYiConfig ruoYiConfig; + + private final IShopService shopService; + + private final IShopDetailService shopDetailService; + + private final ISysConfigService configService; + + private final IKongFzService kongFzService; + + private final IZhishuShopGoodsService zhishuShopGoodsService; + + private final IShopGoodsPublishedService shopGoodsPublishedService; + + + @GetMapping("/toKongfzGetCode") + @SaIgnore + public String toKongfzGetCode(@RequestParam String id) { + + String phpUrl = configService.selectConfigByKey("php.url"); + + String appId= "576"; + String state = id; + String redirectUri = phpUrl + "/auth/callback"; + + String authorizationUrl ="https://open.kongfz.com/v1/oauth2/authorize?" + + "appId="+appId + + "&responseType=code" + + "&state="+state + + "&redirectUri="+redirectUri; + + return authorizationUrl; + } + + @SaIgnore + @GetMapping("/phpCallBack") + public ModelAndView phpCallBack() { + return new ModelAndView(new RedirectView("http://" + ruoYiConfig.getIpurl() + "/shop/shop")); + } + +// /** +// * 孔夫子授权 +// */ +// @SaIgnore +// @GetMapping("/toKongfzGetCode") +// public R getAuthUrl(@RequestParam String id) { +// ShopVo shopVo = shopService.queryById(Long.parseLong(id)); +// +// String account = shopVo.getAccount(); +// String password = shopVo.getPassword(); +// //获取php服务地址 +// String phpUrl = configService.selectConfigByKey("php.url"); +// +// try { +// InterfaceUtils.getInterface(phpUrl, "/auth/getKongfuziAuthUrl/"+id+"/"+account+"/"+password); +// Thread.sleep(2000); // 停止2秒 +// } catch (InterruptedException e) { +// System.out.println("授权停止2秒异常"); +// } catch (Exception e) { +// System.out.println("授权接口返回500异常"); +// } +// +// return R.ok(); +// } + + + + /** + * 获取运费模板 + */ + @GetMapping("/getTemplateSimpleList/{shopId}") + public List getTemplateSimpleList(@PathVariable("shopId") String shopId){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + String kongfzIp = configService.selectConfigByKey("kongfz.ip"); + String templateSimpleListStr = getInterface(kongfzIp, "/api/kfz/getTemplateSimpleList/" + shopVo.getToken()); + List templateSimpleList = JsonUtil.transferToObj(templateSimpleListStr, ArrayList.class); + return templateSimpleList; + } + + @GetMapping("/getCategory") + @SaIgnore + public String getCategory(String token){ + String content = RedisUtils.getCacheObject("categoryListStr"); + if (content == null || StringUtils.isEmpty(content)) { + String kongfzIp = configService.selectConfigByKey("kongfz.ip"); + content = getInterface(kongfzIp, "/api/kfz/getCategory/" + token); + RedisUtils.setCacheObject("categoryListStr", content); + } + return content; + } +// +// /** +// * 商品发布 +// * @param shopId +// * @param goodId +// * @return +// */ +// @SaIgnore +// @GetMapping("/goodAdd/{shopId}/{goodId}") +// public String goodAdd(@PathVariable("shopId") String shopId,@PathVariable("goodId") String goodId){ +// +// ShopDetailVo shopDetailVo = shopDetailService.queryByShopId(Long.parseLong(shopId)); +// +// ZhishuShopGoodsVo zhishuShopGoodsVo = zhishuShopGoodsService.queryById(goodId); +// +// ZhishuShopGoods zhishuShopGoods = new ZhishuShopGoods(); +// zhishuShopGoods.setId(zhishuShopGoodsVo.getId()); +// zhishuShopGoods.setIsbn(zhishuShopGoodsVo.getIsbn()); +// zhishuShopGoods.setGoodsName(zhishuShopGoodsVo.getGoodsName()); +// zhishuShopGoods.setPrice(zhishuShopGoodsVo.getPrice()); +// zhishuShopGoods.setInventory(Long.parseLong(zhishuShopGoodsVo.getInventory())); +// zhishuShopGoods.setArtNo(zhishuShopGoodsVo.getArtNo()); +// zhishuShopGoods.setConditionCode("L"); +// zhishuShopGoods.setUserId(1L); +// +// +// kongFzService.goodAdd(shopId,zhishuShopGoods,shopDetailVo); +// +// return "添加成功"; +// } + + /** + * 增加接口 + * @param map + * @return + */ + @SaIgnore + @PostMapping("/goodAddCallBack") + public void goodAddCallBack(@RequestBody Map map){ +// System.out.println("erp调用新增已发布商品数据:"+ JsonUtil.transferToJson(map)); + ShopGoodsPublishedBo bo = new ShopGoodsPublishedBo(); + bo.setShopGoodsId(map.get("goodId").toString()); + bo.setShopId(map.get("shopId").toString()); + bo.setPlatformId(map.get("itemId").toString()); + bo.setCreateBy(Long.parseLong(map.get("userId").toString())); + bo.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + bo.setUpdateTime(DateUtils.parseDate(DateUtils.getTime())); +// System.out.println("封装数据:"+bo); + shopGoodsPublishedService.insertByBo(bo); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/LogisticsController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/LogisticsController.java new file mode 100644 index 0000000..62f8fea --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/LogisticsController.java @@ -0,0 +1,64 @@ +package org.dromara.zhishu.controller; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.zhishu.domain.Logistics; +import org.dromara.zhishu.domain.bo.LogisticsBo; +import org.dromara.zhishu.domain.bo.TLogisticsBo; +import org.dromara.zhishu.service.LogisticsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/logistics") +public class LogisticsController { + + @Autowired + private LogisticsService logisticsService; + +// @SaCheckPermission("zhishu:shop:export") + @Log(title = "", businessType = BusinessType.EXPORT) + @PostMapping("/logistics") + @SaIgnore + public void export(@RequestBody LogisticsBo bo) { + Integer num= logisticsService.insert(bo); + if(num>0){ + System.out.println("插入成功"); + } + } + @GetMapping("/select") + @SaIgnore + public List getLogistics(@RequestParam String warehouseId) { + List logistics = logisticsService.selectLogistics(warehouseId); + return logistics; + } + @GetMapping("/logistics/{id}") + @SaIgnore + public Logistics getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id){ + return logisticsService.queryById(id); + } + /** + * 修改物流管理 + */ +// @SaCheckPermission("logistics:logistics:edit") + @Log(title = "修改物流模版", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/logistics") + public R edit(@Validated(EditGroup.class) @RequestBody LogisticsBo bo) { + Boolean num= logisticsService.setTemplate(bo); +// return toAjax(.updateByBo(bo)); + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NewUserController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NewUserController.java new file mode 100644 index 0000000..44206f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NewUserController.java @@ -0,0 +1,125 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.CardResult; +import org.dromara.zhishu.domain.LicenseResult; +import org.dromara.zhishu.domain.bo.NewUserBo; +import org.dromara.zhishu.service.ITDepotService; +import org.dromara.zhishu.service.NewUserService; +import org.dromara.zhishu.util.OcrUtil; +import org.dromara.zhishu.util.UploadUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +import com.tencentcloudapi.common.AbstractModel; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.ocr.v20181119.OcrClient; +import com.tencentcloudapi.ocr.v20181119.models.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Base64; + + +@Validated +@RequiredArgsConstructor +@RestController + @RequestMapping("/system/newUser") +public class NewUserController extends BaseController { + + @Autowired + private final NewUserService newUserService; + + @Autowired + private OcrUtil ocrUtil; + + + + + @SaIgnore +//@SaCheckPermission("system:user:newuser") +@Log(title = "申请入驻", businessType = BusinessType.INSERT) +@RepeatSubmit() +@PostMapping +public R add(@Validated(AddGroup.class) @RequestBody NewUserBo newUserBo) { + return toAjax(newUserService.insertByBo(newUserBo)); +} + + +//身份证验证 +@PostMapping("/cardRedirect") +public R cardRedirect(@RequestParam("file") MultipartFile file) { + CardResult cardResult = new CardResult(); + try { + OcrClient client = ocrUtil.upload(file); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IDCardOCRRequest req = new IDCardOCRRequest(); + // base64图片字节数组 + req.setEnableDateVerify(true); + req.setImageBase64(Base64.getEncoder().encodeToString(file.getBytes())); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IDCardOCRResponse resp = client.IDCardOCR(req); + cardResult.setName(resp.getName()); + cardResult.setSex(resp.getSex()); + cardResult.setNation(resp.getNation()); + cardResult.setAddress(resp.getAddress()); + cardResult.setBirth(resp.getBirth()); + cardResult.setIdNum(resp.getIdNum()); + cardResult.setAuthority(resp.getAuthority()); + cardResult.setValidDate(resp.getValidDate()); + cardResult.setUrl(UploadUtil.upload(file,"user")); + } catch (TencentCloudSDKException e) { + cardResult.setMessage(e.getMessage()); + } catch (IOException e) { + throw new RuntimeException(e); + } + return R.ok(cardResult); +} + +//营业执照验证 +@PostMapping("/licenseRedirect") +public R licenseRedirect(@RequestParam("file") MultipartFile file) { + LicenseResult licenseResult = new LicenseResult(); + try { + OcrClient client = ocrUtil.upload(file); + // 实例化一个请求对象,每个接口都会对应一个request对象 + BizLicenseOCRRequest req = new BizLicenseOCRRequest(); + req.setImageBase64(Base64.getEncoder().encodeToString(file.getBytes())); + // 返回的resp是一个BizLicenseOCRResponse的实例,与请求对象对应 + BizLicenseOCRResponse resp = client.BizLicenseOCR(req); + licenseResult.setAddress(resp.getAddress()); + licenseResult.setBusiness(resp.getBusiness()); + licenseResult.setCapital(resp.getCapital()); + licenseResult.setName(resp.getName()); + String[] period = resp.getPeriod().split("至"); + if(period[1].contains("长期")||period[1].contains("永久")){ + period[1]=null; + } + licenseResult.setPeriod(period[1]); + licenseResult.setRegistrationAuthority(resp.getRegistrationAuthority()); + licenseResult.setRegNum(resp.getRegNum()); + licenseResult.setPerson(resp.getPerson()); + licenseResult.setUrl(UploadUtil.upload(file,"user")); + } catch (TencentCloudSDKException e) { + licenseResult.setMessage(e.getMessage()); + } catch (IOException e) { + throw new RuntimeException(e); + } + return R.ok(licenseResult); +} +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NoticeController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NoticeController.java new file mode 100644 index 0000000..6ab6474 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/NoticeController.java @@ -0,0 +1,129 @@ +package org.dromara.zhishu.controller; + +import java.util.List; +import java.util.Map; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.NoticeVo; +import org.dromara.zhishu.domain.bo.NoticeBo; +import org.dromara.zhishu.service.INoticeService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 消息通知 + * + * @author yxy + * @date 2025-05-17 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/notice") +public class NoticeController extends BaseController { + + private final INoticeService noticeService; + + /** + * 查询消息通知列表 + */ + @SaCheckPermission("zhishu:notice:list") + @GetMapping("/list") + public TableDataInfo list(NoticeBo bo, PageQuery pageQuery) { + bo.setRecipient(LoginHelper.getUserId().toString()); + return noticeService.queryPageList(bo, pageQuery); + } + + /** + * 导出消息通知列表 + */ + @SaCheckPermission("zhishu:notice:export") + @Log(title = "消息通知", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(NoticeBo bo, HttpServletResponse response) { + List list = noticeService.queryList(bo); + ExcelUtil.exportExcel(list, "消息通知", NoticeVo.class, response); + } + + /** + * 获取消息通知详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:notice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(noticeService.queryById(id)); + } + + /** + * 新增消息通知 + */ + @SaCheckPermission("zhishu:notice:add") + @Log(title = "消息通知", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody NoticeBo bo) { + return toAjax(noticeService.insertByBo(bo)); + } + + /** + * 修改消息通知 + */ + @SaCheckPermission("zhishu:notice:edit") + @Log(title = "消息通知", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody NoticeBo bo) { + return toAjax(noticeService.updateByBo(bo)); + } + + /** + * 删除消息通知 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:notice:remove") + @Log(title = "消息通知", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(noticeService.deleteWithValidByIds(List.of(ids), true)); + } + + + @SaIgnore + @PostMapping("/addNotice") + public void addNotice(@RequestBody Map map){ +// System.out.println("新增通知:"+map); + String msg = (String) map.get("msg"); + String userId = (String) map.get("userId"); + String isbn = (String) map.get("isbn"); + String bookName = (String) map.get("bookName"); + String sender = map.get("sender") == null ? "系统" : (String) map.get("sender"); + NoticeBo notice = new NoticeBo(); + notice.setSender(sender); + notice.setRecipient(userId); + notice.setContent("自动发布商品失败原因:"+msg+" ISBN:"+isbn+" 商品名称:"+bookName); + notice.setStatus("0"); + notice.setCreateBy(Long.parseLong(userId)); + notice.setTenantId("000000"); + noticeService.insertByBo(notice); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/OrderExternalGoodsController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/OrderExternalGoodsController.java new file mode 100644 index 0000000..634e12b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/OrderExternalGoodsController.java @@ -0,0 +1,433 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsBo; +import org.dromara.zhishu.domain.dto.OrderExternalGoodsDto; +import org.dromara.zhishu.domain.vo.FastMailVo; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsVo; +import org.dromara.zhishu.service.IFastMailService; +import org.dromara.zhishu.service.IOrderExternalGoodsService; +import org.dromara.zhishu.service.IZhishuShopGoodsService; +import org.dromara.zhishu.util.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 仓库订单 + * + * @author yxy + * @date 2025-12-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/orderExternalGoods") +public class OrderExternalGoodsController { + + private final IOrderExternalGoodsService orderExternalGoodsService; + private final ISysDictDataService dictDataService; + private final IZhishuShopGoodsService zhishuShopGoodsService; + private final IFastMailService fastMailService; + + + @GetMapping("/getU") + public Long getUserId(){ + return LoginHelper.getUserId(); + } + + /** + * 查询仓库订单列表 + */ + @SaCheckPermission("zhishu:orderExternalGoods:list") + @GetMapping("/list") + public TableDataInfo list(OrderExternalGoodsDto dto, PageQuery pageQuery) { + Map params = new HashMap<>(); + params.put("pageNum",pageQuery.getPageNum()); + params.put("pageSize",pageQuery.getPageSize()); + params.put("deptUseId", LoginHelper.getUserId()); + params.put("erpAfterSalesStatus",dto.getErpAfterSalesStatus()); + if(dto.getErpAfterSalesStatus() != 0){ + Long userId = LoginHelper.getUserId(); + if (userId != 1) { + params.put("createBy",userId); + } + } + + if (dto.getOrderStatus() != null){ + params.put("orderStatus",dto.getOrderStatus()); + } + + if (dto.getConfirmStatus() != null){ + params.put("confirmStatus",dto.getConfirmStatus()); + } + + if (dto.getAfterSalesStatus() != null){ + params.put("afterSalesStatus",dto.getAfterSalesStatus()); + } + + if (dto.getTrackingNumber() != null){ + params.put("trackingNumber",dto.getTrackingNumber()); + } + + if (StringUtils.isNotEmpty(dto.getOrderSn())){ + params.put("orderSn",dto.getOrderSn()); + } + if (dto.getShopType() != null){ + params.put("shopType",dto.getShopType()); + } + if (dto.getShopErpId() != null){ + params.put("shopErpId",dto.getShopErpId()); + } + if (StringUtils.isNotEmpty(dto.getItemList())){ + params.put("itemList",dto.getItemList()); + } + + if(!dto.getParams().isEmpty()){ + params.put("startTime",dto.getParams().get("startTime")); + params.put("endTime",dto.getParams().get("endTime")); + } + + String OrderExternalGoodsVoListStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/orderExternalGoods/getList",params); + Map dataMap = JsonUtil.transferToObj(OrderExternalGoodsVoListStr,Map.class); + List OrderExternalGoodsVoList = (List) dataMap.get("data"); + + for (Object object : OrderExternalGoodsVoList){ + Map orderExternalGoodsVo = (Map) object; + String goodsId = orderExternalGoodsVo.get("goodsId") == null ? "" : orderExternalGoodsVo.get("goodsId").toString(); + if (StringUtils.isNotEmpty(goodsId)){ + // 获取货号 + ZhishuShopGoodsVo zhishuShopGoodsVo = zhishuShopGoodsService.queryById(goodsId); + if (zhishuShopGoodsVo != null){ + orderExternalGoodsVo.put("shopGoodsVo",zhishuShopGoodsVo); + }else{ + orderExternalGoodsVo.put("shopGoodsVo",null); + } + } + + } + + int total = (int) dataMap.get("total"); + Page result = new Page<>(pageQuery.getPageNum(),pageQuery.getPageSize(),total); + result.setRecords(OrderExternalGoodsVoList); + return TableDataInfo.build(result); + } + + /** + * 查询仓库订单列表 + */ + @GetMapping("/appList") + @SaIgnore + public TableDataInfo appList(OrderExternalGoodsDto dto, PageQuery pageQuery) { + Map params = new HashMap<>(); + params.put("pageNum",pageQuery.getPageNum()); + params.put("pageSize",pageQuery.getPageSize()); + params.put("deptUseId", dto.getCreateBy()); + params.put("erpAfterSalesStatus",dto.getErpAfterSalesStatus()); + + if (StringUtils.isNotEmpty(dto.getOrderSn())){ + params.put("orderSn",dto.getOrderSn()); + } + if (dto.getShopType() != null){ + params.put("shopType",dto.getShopType()); + } + if (dto.getOrderStatus() != null){ + params.put("orderStatus",dto.getOrderStatus()); + } + if(dto.getStartTime() != null){ + params.put("startTime",dto.getStartTime()); + } + if(dto.getEndTime() != null){ + params.put("endTime",dto.getEndTime()); + } + if(dto.getWhetherOutbound() != null){ + params.put("whetherOutbound",dto.getWhetherOutbound()); + } + if (StringUtils.isNotEmpty(dto.getArtNo()) || StringUtils.isNotEmpty(dto.getOriginalArtNo()) || StringUtils.isNotEmpty(dto.getIsbn())){ + ZhishuShopGoodsBo bo = new ZhishuShopGoodsBo(); + bo.setUserId(Long.parseLong(params.get("deptUseId").toString())); + bo.setIsQueryAllGoods(dto.getIsQueryAllGoods()); + if(StringUtils.isNotEmpty(dto.getArtNo())){ + bo.setArtNo(dto.getArtNo()); + } + if (StringUtils.isNotEmpty(dto.getOriginalArtNo())){ + bo.setOriginalArtNo(dto.getOriginalArtNo()); + } + if (StringUtils.isNotEmpty(dto.getIsbn())){ + bo.setIsbn(dto.getIsbn()); + } + List zhishuShopGoodsVoList = zhishuShopGoodsService.queryList(bo); + if (zhishuShopGoodsVoList.isEmpty()){ + // 如果根据货号未查询到数据,则直接返回空 + Page result = new Page<>(pageQuery.getPageNum(),pageQuery.getPageSize(),0); + return TableDataInfo.build(result); + }else{ + params.put("goodsId",zhishuShopGoodsVoList.get(0).getId()); + } + } + + String OrderExternalGoodsVoListStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/orderExternalGoods/getList",params); + Map dataMap = JsonUtil.transferToObj(OrderExternalGoodsVoListStr,Map.class); + List OrderExternalGoodsVoList = (List) dataMap.get("data"); + + for (int i =0 ;i result = new Page<>(pageQuery.getPageNum(),pageQuery.getPageSize(),total); + result.setRecords(OrderExternalGoodsVoList); + return TableDataInfo.build(result); + } + + + @PostMapping("/editWhetherOutbound") + @SaIgnore + public Map editWhetherOutbound(String ids){ + Map map = new HashMap(); + map.put("ids",ids); + String result = InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/orderExternalGoods/editWhetherOutbound",map); + return JsonUtil.transferToObj(result,Map.class); + } + + /** + * 快递单号匹配快递公司 + * @param trackingNumber + * @return + */ + @GetMapping("/getCompanyInfo") + public String getCompanyInfo(String trackingNumber){ + ExpressCompanyDetector.ExpressInfo expressInfo = ExpressCompanyDetector.detect(trackingNumber); + return expressInfo.getCode(); + } + + /** + * 发货按钮 + * @param map + * @return + */ + @PostMapping("/submitCompanyOrder") + @SaIgnore + public R submitCompanyOrder(@RequestBody Map map){ + // 快递公司名称 +// String dictLabel = dictDataService.selectDictLabel("t_fast_mail_type",map.get("code").toString()); +// map.put("companyName",dictLabel); + + SysDictDataBo bo = new SysDictDataBo(); + bo.setDictType("t_fast_mail_type"); + List sysDictDataVoList = dictDataService.selectDictDataList(bo); + map.put("sysDictDataVoListStr",JsonUtil.transferToJson(sysDictDataVoList)); +// String json = JsonUtil.transferToJson( map); +// String result = DllInitializer.executeInterfaceForward("POST",UrlUtil.getOrderServiceUrl() + "/api/erpGoodsOrder/orderCompanyOrder",json); + String result = InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/erpGoodsOrder/orderCompanyOrder",map); + System.out.println(result); + return R.ok(); + } + + + @PostMapping("/process") + public Map process(@RequestBody Map map){ + System.out.println(map); + Map requestMap = new HashMap(); + requestMap.put("id",map.get("erpOrderId").toString()); + if(null != map.get("erpAssReason") && StringUtils.isNotEmpty(map.get("erpAssReason").toString())){ + requestMap.put("erpAfterSalesStatus","6"); + requestMap.put("erpAssReason",map.get("erpAssReason").toString()); + }else if(null != map.get("rollbackType") && map.get("rollbackType").toString().equals("5")){ + // 延迟处理 + requestMap.put("erpAfterSalesStatus",map.get("rollbackType")); + } else{ + // 1 同意 2 失败 + String handlingMethod = map.get("handlingMethod").toString(); + if(handlingMethod.equals("1")){ + // 同意售后 + // 回退类型 3 仅退款 2 退货退款 + String rollbackType = map.get("rollbackType").toString(); + requestMap.put("erpAfterSalesStatus",rollbackType); + if(rollbackType.equals("3")){ + // 同意仅退款:售后完成 + }else if(rollbackType.equals("2")){ + // 同意退货退款:待仓库确认收货 + requestMap.put("erpAssAddress",map.get("returnAddress")); + }else{ + // 其他 + R.fail("未知异常"); + } + }else if(handlingMethod.equals("2")){ + // 拒绝售后 + requestMap.put("erpAfterSalesStatus","4"); + requestMap.put("erpAssRemark",map.get("reasonForRejection")); + }else{ + // 其他 + R.fail("未知异常"); + } + } + + String result = InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/orderExternalGoods/editAfterSales",requestMap); + Map resultMap = JsonUtil.transferToObj(result,Map.class); + return resultMap; + } + + + @GetMapping("/getErpAfterSalesOrderLog") + @SaIgnore + public List getErpAfterSalesOrderLog(String orderNo){ + String erpOrderLogListStr = InterfaceUtils.getInterface(UrlUtil.getOrderServiceUrl(),"/api/erpGoodsOrder/getErpOrderLog?orderNo="+orderNo+"_erpAfterSalesOrder"); + List erpOrderLogList = JsonUtil.transferToObj(erpOrderLogListStr,List.class); + return erpOrderLogList; + } + + + /** + * + * @param erpOrderId 订单id + * @param fastMailId 快递账号id + * @param printTemplateData 打印模板数据 + * @param type 快递类型 + * @param deliveryMode 发货模式 1 全部发货 2 单独发货 + * @return + */ + @GetMapping("/orderCreate") + public R orderCreate(String erpOrderId,String fastMailId,String printTemplateData,String type,String erpGoodsId,String deliveryMode,String orderSn){ + FastMailVo fastMailVo = fastMailService.queryById(Long.parseLong(fastMailId)); + if (fastMailVo.getFastMailType().equals("1")){ + if (type.equals("YUNDA")){ + return orderExternalGoodsService.getYundaPdf(fastMailVo,erpOrderId,printTemplateData,type,deliveryMode,orderSn); + }else if (type.equals("ZTO")){ + return orderExternalGoodsService.getZtoPdf(fastMailVo,erpOrderId,printTemplateData,type,deliveryMode,orderSn); + }else if (type.equals("YZXB") || type.equals("JTSD")){ + return orderExternalGoodsService.orderCreate(fastMailVo,erpOrderId,printTemplateData,type,deliveryMode,orderSn); + }else { + return R.fail("无快递:"+type); + } + }else{ + Map res = new HashMap(); + res.put("fastMailVo",JsonUtil.transferToJson(fastMailVo)); + res.put("erpOrderId",erpOrderId); + res.put("deliveryMode",deliveryMode); + res.put("orderSn",orderSn); + String result = InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/print/pddCreateOrder",res); + Map resultMap = JsonUtil.transferToObj(result,Map.class); + resultMap.put("fastMailType","2"); + resultMap.put("code",fastMailVo.getType()); + // 获取商品数据 + List> dataMapList = new ArrayList<>(); + List erpGoodsOrderList = (List) resultMap.get("erpGoodsOrderList"); + for (Object erpOrderObject : erpGoodsOrderList){ + Map erpOrderMap = (Map) erpOrderObject; + Map itemMap = JsonUtil.transferToObj(erpOrderMap.get("itemList").toString(),Map.class); + ZhishuShopGoodsVo zhishuShopGoodsVo = zhishuShopGoodsService.queryById(erpOrderMap.get("erpGoodsId").toString()); + Map dataMap = new HashMap(); + dataMap.put("isbn",zhishuShopGoodsVo.getIsbn()); + dataMap.put("goodsName",itemMap.get("goodsName")); + dataMap.put("artNo",zhishuShopGoodsVo.getArtNo()); + dataMap.put("originalArtNo",zhishuShopGoodsVo.getOriginalArtNo()); + dataMap.put("goodsCount",itemMap.get("goodsCount")); + dataMapList.add(dataMap); + } + resultMap.put("dataList",dataMapList); + return R.ok(resultMap); + } + } + + /** + * 获取韵达预览pdf + * @param erpOrderId + * @param orderSn + * @param deliveryMode + * @param printTemplateData + * @return + */ + @GetMapping("/getYunDaPreviewPdf") + public R getYunDaPreviewPdf(String erpOrderId,String orderSn,String deliveryMode,String printTemplateData){ + Map res = new HashMap(); + + Map erpGoodsOrderMap = new HashMap(); + erpGoodsOrderMap.put("orderId",erpOrderId); + erpGoodsOrderMap.put("orderSn",orderSn); + erpGoodsOrderMap.put("deliveryMode",deliveryMode); + + String data = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/getOrderData",erpGoodsOrderMap); + Map dataMap = JsonUtil.transferToObj(data,Map.class); + List> dataMapList = new ArrayList<>(); + List erpGoodsOrderList = (List) dataMap.get("erpGoodsOrderList"); + for (Object erpOrderObject : erpGoodsOrderList){ + Map erpOrderMap = (Map) erpOrderObject; + Map itemMap = JsonUtil.transferToObj(erpOrderMap.get("itemList").toString(),Map.class); + ZhishuShopGoodsVo zhishuShopGoodsVo = zhishuShopGoodsService.queryById(erpOrderMap.get("erpGoodsId").toString()); + Map goodsMap = new HashMap(); + goodsMap.put("isbn",zhishuShopGoodsVo.getIsbn()); + goodsMap.put("goodsName",itemMap.get("goodsName")); + goodsMap.put("artNo",zhishuShopGoodsVo.getArtNo()); + goodsMap.put("originalArtNo",zhishuShopGoodsVo.getOriginalArtNo()); + goodsMap.put("goodsCount",itemMap.get("goodsCount")); + dataMapList.add(goodsMap); + } + // 收件人信息 + Map receiver = (Map) dataMap.get("receiver"); + // 发件人信息 + Map sender = (Map) dataMap.get("sender"); + String yundaPdf = DaDanUtil.getYunDaPreview(); + res.put("code","200"); + res.put("msg","快递单获取成功"); + res.put("pdfInfo",yundaPdf); + res.put("receiver",receiver); + res.put("sender",sender); + res.put("dataList",dataMapList); + res.put("printTemplateData",printTemplateData); + return R.ok(res); + } + + + /** + * 运单取消 + */ + @GetMapping("/cancelBmOrder") + public R cancelBmOrder(String erpOrderId){ + String res = InterfaceUtils.getInterface(UrlUtil.getOrderServiceUrl(),"/api/print/cancelBmOrder?erpOrderId="+erpOrderId); + Map resMap = JsonUtil.transferToObj(res,Map.class); + if (resMap.get("code").equals("200")){ + return R.ok(resMap.get("msg").toString()); + }else{ + return R.fail(resMap.get("msg").toString()); + } + } + + @GetMapping("/printView") + public R printView(String erpOrderId){ + String res = InterfaceUtils.getInterface(UrlUtil.getOrderServiceUrl(),"/api/print/printView?erpOrderId="+erpOrderId); + Map resMap = JsonUtil.transferToObj(res,Map.class); + if (resMap.get("code").equals("200")){ + return R.ok(resMap); + }else{ + return R.fail(resMap.get("msg").toString()); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddController.java new file mode 100644 index 0000000..b6e1783 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddController.java @@ -0,0 +1,1478 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import com.opencsv.CSVReader; +import com.opencsv.CSVReaderBuilder; +import com.opencsv.CSVWriter; +import com.opencsv.exceptions.CsvValidationException; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddGoodsListGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddPopAuthTokenRefreshRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsListGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsSpecGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddMallInfoGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddPopAuthTokenRefreshResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.PddUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.PddShopInfo; + +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.domain.TUserPlatform; +import org.dromara.zhishu.domain.bo.ShopBo; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.dto.ErpGoodsDto; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.dto.SuccessDataKfz; +import org.dromara.zhishu.domain.dto.request.RenovateOnSaleRequest; +import org.dromara.zhishu.domain.dto.request.UpdateShopGoodsDataPriceCSVRequest; +import org.dromara.zhishu.domain.dto.response.PddTokenResponse; +import org.dromara.zhishu.domain.vo.AccessTokenVo; +import org.dromara.zhishu.domain.vo.MessageSubscribeVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.TaskVo; +import org.dromara.zhishu.mapper.TUserPlatformMapper; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.service.client.FileClient; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.service.client.PddClient; +import org.dromara.zhishu.service.impl.RunningTaskByShopServiceImpl; +import org.dromara.zhishu.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.AbstractView; +import org.springframework.web.servlet.view.RedirectView; + +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static cn.dev33.satoken.SaManager.log; +import static org.dromara.zhishu.util.InterfaceUtils.getInterface; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/huidiao/pdd") +public class PddController { + + private final IPddService pddService; + private final IShopService shopService; + private final RuoYiConfig ruoYiConfig; + private final ISysConfigService configService; + private final TShopMessageSubscribeService tShopMessageSubscribeService; + private final HttpServletRequest httpServletRequest; + private final ITUserPlatformService userPlatformService; + private final ITaskService taskService; + private final IZhishuShopGoodsService zhishuShopGoodsService; + private final IRunningTaskService runningTaskService; + private final IRunningTaskByShopService runningTaskByShopService; + private final PddClient pddClient; + @Autowired + private TUserPlatformMapper userPlatformMapper; + @Autowired + private KfzClient kfzClient; + + + private final FileClient fileClient; + + + // 授权页面url + String url = "https://fuwu.pinduoduo.com/service-market/auth"; + String clientId = PddUtil.getClientId(); + String clientSecret = PddUtil.getClientSecret(); + // 回调url + String redirectUri = "https://test.api.buzhiyushu.cn/huidiao/pdd"; + @Autowired + private RunningTaskByShopServiceImpl runningTaskByShopServiceImpl; + + + /** + * 拼多多回调调用方法,获取code + * + * @param code + * @param state 自定义参数,返回的是店铺id + */ + @SaIgnore + @GetMapping + public ModelAndView getCode(String code, String state, HttpServletResponse response) { + try { + if (state == null) { + state = "000000-2-null"; + } + System.out.println("\n\n==================== 拼多多授权回调开始 ===================="); + System.out.println("拼多多授权回调开始处理 - code: " + code + ", state: " + state); + + // 记录请求头信息 + System.out.println("请求头信息:"); + Enumeration headerNames = httpServletRequest.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + String headerValue = httpServletRequest.getHeader(headerName); + System.out.println(" " + headerName + ": " + headerValue); + } + + // 记录请求参数 + System.out.println("请求参数:"); + Enumeration parameterNames = httpServletRequest.getParameterNames(); + while (parameterNames.hasMoreElements()) { + String paramName = parameterNames.nextElement(); + String paramValue = httpServletRequest.getParameter(paramName); + System.out.println(" " + paramName + ": " + paramValue); + } + + String[] stateArr = state.split("-"); + state = stateArr[0]; + String type = stateArr[1]; + String userId = stateArr[2]; + System.out.println("解析state参数 - state: " + state + ", type: " + type); + + if (code == null || StringUtils.isEmpty(code)) { + System.out.println("授权参数无效 - code: " + code + ", state: " + state); + // 根据type参数决定跳转页面 + if ("2".equals(type)) { + return new ModelAndView(new RedirectView("https://erp.buzhiyushu.cn/login")); + } else { + return new ModelAndView(new RedirectView("https://" + ruoYiConfig.getIpurl() + "/shop/shop")); + } + } + + if ("2".equals(type)) { + System.out.println("开始处理用户注册流程"); + try { + String encodedCode = URLEncoder.encode(code, "UTF-8"); + String redirectUrl = "https://erp.newadmin.buzhiyushu.cn/redirectUrl?code=" + encodedCode; + return new ModelAndView(new RedirectView(redirectUrl)); + + } catch (Exception e) { + log.error("URL编码失败", e); + System.out.println("URL编码失败: " + e.getMessage()); + // 如果编码失败,使用默认店铺名称 + String encodedCode = URLEncoder.encode(code, "UTF-8"); + String redirectUrl = "https://erp.newadmin.buzhiyushu.cn/redirectUrl?code=" + encodedCode; + System.out.println("使用默认店铺名称跳转: " + redirectUrl); + + // 同样使用JavaScript跳转 + String htmlContent = "" + + "" + + "" + + "" + + "正在跳转..." + + "" + + "" + + "
正在跳转到注册页面...
" + + "
" + + "" + + ""; + + ModelAndView mav = new ModelAndView(); + mav.setView(new AbstractView() { + @Override + protected void renderMergedOutputModel(Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception { + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write(htmlContent); + response.getWriter().flush(); + } + }); + return mav; + } + + } + + String pddIp = configService.selectConfigByKey("pdd.ip"); + System.out.println("获取拼多多IP配置: " + pddIp); + + String accessTokenVoString = getInterface(pddIp, "/api/pdd/auth/getAccessToken/" + code); + AccessTokenVo accessTokenVo = JSONObject.parseObject(accessTokenVoString, AccessTokenVo.class); + String accessToken = accessTokenVo.getAccessToken(); + System.out.println("获取accessToken成功: " + accessToken); + + // 获取店铺信息 + Long id = 0L; + if (StringUtils.isNotEmpty(state)) { + id = Long.parseLong(state); + } + String pddMallInfoGetResponseStr = getInterface(pddIp, "/api/pdd/auth/getMallInfo/" + accessToken); + + PddMallInfoGetResponse pddMallInfoGetResponse = JsonUtils.parseObject(pddMallInfoGetResponseStr, PddMallInfoGetResponse.class); + // 获取拼多多店铺ID和名称 + String pddMallId = String.valueOf(pddMallInfoGetResponse.getMallInfoGetResponse().getMallId()); + String pddMallName = pddMallInfoGetResponse.getMallInfoGetResponse().getMallName(); + System.out.println("获取店铺信息成功 - 店铺ID: " + pddMallId + ", 店铺名称: " + pddMallName); + // 根据三方店铺id查询修改 + ShopVo shopVo = shopService.selectByMallId(pddMallId); + if (shopVo != null) { + ShopBo bo = new ShopBo(); + bo.setId(shopVo.getId()); + bo.setToken(accessToken); + shopService.updateByBo(bo); + } + // 到期时间 + Date expirationTime; + // 服务版本 + String skuSpec; + // 获取店铺订阅服务 + String vasData = getInterface(pddIp, "/api/pdd/auth/getVasOrder?mallId=" + pddMallId); + Map vasMap = JsonUtil.transferToObj(vasData, Map.class); + if (vasMap.get("code").equals("200")) { + // 成功 调用新后台 + Map vas = (Map) vasMap.get("data"); + System.out.println("获取订阅服务数据:" + JsonUtil.transferToJson(vas)); + vas = MapUtils.convertKeys(vas); + System.out.println("转变格式:" + JsonUtil.transferToJson(vas)); + // 计算到期时间 + long payTime = Long.parseLong(vas.get("payTime").toString()); + long timeLength = Long.parseLong(vas.get("timeLength").toString()); + long newTimestamp = payTime + (timeLength * 1000); + expirationTime = new Date(newTimestamp); + + skuSpec = vas.get("skuSpec").toString(); + try { + InterfaceUtils.getInterfacePost("https://newadmin.buzhiyushu.cn/", "/vas/addVas", vas); + } catch (Exception e) { + System.out.println("调用新后台存储订阅服务信息失败"); + } + + + } else if (vasMap.get("code").equals("401")) { + // 未订阅服务的情况,直接跳转购买页 + return new ModelAndView(new RedirectView("https://fuwu.pinduoduo.com/service-market/service-detail?detailId=90559")); + } else { + String alertMessage = vasMap.get("msg").toString(); + String htmlContent = "提示" + + "" + + ""; + + ModelAndView mav = new ModelAndView(); + mav.setView(new AbstractView() { + @Override + protected void renderMergedOutputModel(Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception { + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write(htmlContent); + response.getWriter().flush(); + } + }); + return mav; + } + + if ("3".equals(type)) { + // 添加拼多多店铺 + if (shopVo != null && !shopVo.getId().equals(id)) { + // 存在店铺 + // 动态生成空白页并显示alert消息 + String alertMessage = "您的拼多多店铺已绑定!!!"; + String htmlContent = "提示" + + "" + + ""; + + ModelAndView mav = new ModelAndView(); + mav.setView(new AbstractView() { + @Override + protected void renderMergedOutputModel(Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception { + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write(htmlContent); + response.getWriter().flush(); + } + }); + return mav; + } else { + ShopBo shopBo = new ShopBo(); + shopBo.setShopName(pddMallName); + shopBo.setToken(accessToken); + shopBo.setMallId(Long.valueOf(pddMallId)); + shopBo.setShopAliasName(pddMallName); + shopBo.setShopAuthorize("1"); + shopBo.setExpirationTime(expirationTime); + shopBo.setSkuSpec(skuSpec); + shopBo.setShopGroup("默认分组"); + shopBo.setShopType("1"); + shopBo.setAddTime(DateUtils.parseDate(DateUtils.getTime())); + shopBo.setCreateBy(Long.parseLong(userId)); + shopBo.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + shopBo.setTenant_id("000000"); + shopService.insertByBo(shopBo); + // 赋值id + id = shopBo.getId(); + // 生成用户与店铺绑定关系 + TUserPlatform userPlatform = new TUserPlatform(); + userPlatform.setType("1"); // 拼多多 + userPlatform.setUserId(Long.parseLong(userId)); + userPlatform.setPlatformId(pddMallId); + userPlatform.setPlatformName(pddMallName); + userPlatform.setStatus("0"); + userPlatform.setDelFlag("0"); + userPlatform.setTenantId("000000"); + userPlatform.setCreateBy(Long.parseLong(userId)); + userPlatform.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + userPlatformService.insertTUserPlatform(userPlatform); + } + } else if ("4".equals(type)) { + try { + System.out.println("调用新后台type" + type); + Map params = new HashMap<>(); + params.put("accessToken", accessToken); + params.put("pddMallId", pddMallId); + params.put("pddMallName", pddMallName); + InterfaceUtils.postForm("https://newadmin.buzhiyushu.cn/", "/shop/token", params); + ShopVo shopVo1 = shopService.selectByMallId(pddMallId); + if (shopVo1 != null) { + shopService.updateTokenByPddMallId(pddMallId, accessToken); + } else { + ShopBo shopBo = new ShopBo(); + shopBo.setId(id); + shopBo.setMallId(Long.valueOf(pddMallId)); + shopBo.setToken(accessToken); + shopBo.setShopAliasName(pddMallName); + shopBo.setShopAuthorize("1"); + shopBo.setExpirationTime(expirationTime); + shopBo.setSkuSpec(skuSpec); + shopService.selectShopAssociationMall(shopBo); + } + return new ModelAndView(new RedirectView("https://erp.newadmin.buzhiyushu.cn/shop/list")); + } catch (Exception e) { + System.out.println("调用新后台存储订阅服务信息失败"); + } + } else if ("5".equals(type)) { + + } else { + // 根据pddMallId查询是否存在相同数据 + if (shopVo != null && !shopVo.getId().equals(id)) { + // 动态生成空白页并显示alert消息 + String alertMessage = "扫码的拼多多店铺与erp绑定的店铺信息不匹配!!!"; + String htmlContent = "提示" + + "" + + ""; + + ModelAndView mav = new ModelAndView(); + mav.setView(new AbstractView() { + @Override + protected void renderMergedOutputModel(Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception { + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write(htmlContent); + response.getWriter().flush(); + } + }); + return mav; + } else { + ShopBo shopBo = new ShopBo(); + shopBo.setId(id); + shopBo.setMallId(Long.valueOf(pddMallId)); + shopBo.setToken(accessToken); + shopBo.setShopAliasName(pddMallName); + shopBo.setShopAuthorize("1"); + shopBo.setExpirationTime(expirationTime); + shopBo.setSkuSpec(skuSpec); + shopService.selectShopAssociationMall(shopBo); + } + } + + // 处理订阅消息 + System.out.println("开始处理订阅消息"); + MessageSubscribeVo messageSubscribeVo = accessTokenVo.getMessageSubscribeVo(); + tShopMessageSubscribeService.insertOrUpdate(List.of(messageSubscribeVo), id); + System.out.println("订阅消息处理完成"); + + return new ModelAndView(new RedirectView("https://" + ruoYiConfig.getIpurl() + "/shop/shop")); + + } catch (Exception e) { + log.error("拼多多授权回调处理失败", e); + System.out.println("拼多多授权回调处理异常: " + e.getMessage()); + e.printStackTrace(); + throw new RuntimeException(e); + } finally { + System.out.println("==================== 拼多多授权回调结束 ====================\n\n"); + } + } + + + + /** + * 根据token授权店铺 + * + * @param code 授权码 有效期10分钟 + */ + @SaIgnore + @GetMapping("/tokenSq") + public R tokenSq(String code, HttpServletResponse response) { + try { + System.out.println("\n\n==================== 拼多多授权token码授权开始 ===================="); + Long userId = LoginHelper.getUserId(); + String pddIp = configService.selectConfigByKey("pdd.ip"); + System.out.println("获取拼多多IP配置: " + pddIp); + // 获取店铺信息 + String accessTokenVoString = getInterface(pddIp, "/api/pdd/auth/getAccessToken/" + code); + AccessTokenVo accessTokenVo = JSONObject.parseObject(accessTokenVoString, AccessTokenVo.class); + String accessToken = accessTokenVo.getAccessToken(); + String pddMallInfoGetResponseStr = getInterface(pddIp, "/api/pdd/auth/getMallInfo/" + accessToken); + PddMallInfoGetResponse pddMallInfoGetResponse = JsonUtils.parseObject(pddMallInfoGetResponseStr, PddMallInfoGetResponse.class); + if(pddMallInfoGetResponse.getErrorResponse() != null){ + String subMsg = pddMallInfoGetResponse.getErrorResponse().getSubMsg(); + if(subMsg.equals("access_token已过期")){ + return R.fail("授权码已过期"); + }else{ + return R.fail(subMsg); + } + } + // 获取拼多多店铺ID和名称 + String pddMallId = String.valueOf(pddMallInfoGetResponse.getMallInfoGetResponse().getMallId()); + String pddMallName = pddMallInfoGetResponse.getMallInfoGetResponse().getMallName(); + System.out.println("获取店铺信息成功 - 店铺ID: " + pddMallId + ", 店铺名称: " + pddMallName); + // 到期时间 + Date expirationTime; + // 服务版本 + String skuSpec; + // 获取店铺订阅服务 + String vasData = getInterface(pddIp, "/api/pdd/auth/getVasOrder?mallId=" + pddMallId); + Map vasMap = JsonUtil.transferToObj(vasData, Map.class); + if (vasMap.get("code").equals("200")) { + // 成功 调用新后台 + Map vas = (Map) vasMap.get("data"); + System.out.println("获取订阅服务数据:" + JsonUtil.transferToJson(vas)); + vas = MapUtils.convertKeys(vas); + System.out.println("转变格式:" + JsonUtil.transferToJson(vas)); + // 计算到期时间 + long payTime = Long.parseLong(vas.get("payTime").toString()); + long timeLength = Long.parseLong(vas.get("timeLength").toString()); + long newTimestamp = payTime + (timeLength * 1000); + expirationTime = new Date(newTimestamp); + skuSpec = vas.get("skuSpec").toString(); + try { + InterfaceUtils.getInterfacePost("https://newadmin.buzhiyushu.cn/", "/vas/addVas", vas); + } catch (Exception e) { + System.out.println("调用新后台存储订阅服务信息失败"); + } + }else { + return R.fail(vasMap.get("msg").toString()); + } + // 根据三方店铺id查询修改 + ShopVo shopVo = shopService.selectByMallId(pddMallId); + if (shopVo != null) { + //判断是否绑定在自己账号下 + if(shopVo.getCreateBy().equals(userId)){ + ShopBo bo = new ShopBo(); + bo.setId(shopVo.getId()); + bo.setToken(accessToken); + bo.setExpirationTime(expirationTime); + bo.setSkuSpec(skuSpec); + bo.setShopAuthorize("1"); + bo.setUpdateTime(DateUtils.parseDate(DateUtils.getTime())); + shopService.updateByBo(bo); + }else{ + ShopBo bo = new ShopBo(); + bo.setId(shopVo.getId()); + bo.setToken(accessToken); + shopService.updateByBo(bo); + return R.fail("店铺已被其他账户绑定"); + } + }else{ + // 添加拼多多店铺 + ShopBo shopBo = new ShopBo(); + shopBo.setShopName(pddMallName); + shopBo.setToken(accessToken); + shopBo.setMallId(Long.valueOf(pddMallId)); + shopBo.setShopAliasName(pddMallName); + shopBo.setShopAuthorize("1"); + shopBo.setExpirationTime(expirationTime); + shopBo.setSkuSpec(skuSpec); + shopBo.setShopGroup("默认分组"); + shopBo.setShopType("1"); + shopBo.setAddTime(DateUtils.parseDate(DateUtils.getTime())); + shopBo.setCreateBy(userId); + shopBo.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + shopBo.setTenant_id("000000"); + shopService.insertByBo(shopBo); + // 赋值id + Long id = shopBo.getId(); + // 生成用户与店铺绑定关系 + TUserPlatform userPlatform = new TUserPlatform(); + userPlatform.setType("1"); // 拼多多 + userPlatform.setUserId(userId); + userPlatform.setPlatformId(pddMallId); + userPlatform.setPlatformName(pddMallName); + userPlatform.setStatus("0"); + userPlatform.setDelFlag("0"); + userPlatform.setTenantId("000000"); + userPlatform.setCreateBy(userId); + userPlatform.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + userPlatformService.insertTUserPlatform(userPlatform); + // 处理订阅消息 + System.out.println("开始处理订阅消息"); + tShopMessageSubscribeService.insertOrUpdate(List.of(accessTokenVo.getMessageSubscribeVo()), id); + System.out.println("订阅消息处理完成"); + } + return R.ok("授权成功"); + } catch (Exception e) { + return R.fail("授权码无效"); + } finally { + System.out.println("==================== 拼多多授权token码授权开始 ====================\n\n"); + } + } + + @SaIgnore + @GetMapping("/getPddToken") + public R getPddToken(@NotBlank(message = "code不能为空") String code) { + String pddIp = configService.selectConfigByKey("pdd.ip"); + System.out.println("获取拼多多IP配置: " + pddIp); + + String accessTokenVoString = getInterface(pddIp, "/api/pdd/auth/getAccessToken/" + code); + AccessTokenVo accessTokenVo = JSONObject.parseObject(accessTokenVoString, AccessTokenVo.class); + String accessToken = accessTokenVo.getAccessToken(); + System.out.println("获取accessToken成功: " + accessToken); + + String pddMallInfoGetResponseStr = getInterface(pddIp, "/api/pdd/auth/getMallInfo/" + accessToken); + + PddMallInfoGetResponse pddMallInfoGetResponse = JsonUtils.parseObject(pddMallInfoGetResponseStr, PddMallInfoGetResponse.class); + // 获取拼多多店铺ID和名称 + String pddMallId = String.valueOf(pddMallInfoGetResponse.getMallInfoGetResponse().getMallId()); + String pddMallName = pddMallInfoGetResponse.getMallInfoGetResponse().getMallName(); + System.out.println("获取店铺信息成功 - 店铺ID: " + pddMallId + ", 店铺名称: " + pddMallName); + // 根据三方店铺id查询修改 + ShopVo shopVo = shopService.selectByMallId(pddMallId); + if (shopVo != null) { + ShopBo bo = new ShopBo(); + bo.setId(shopVo.getId()); + bo.setToken(accessToken); + shopService.updateByBo(bo); + return R.fail("店铺已存在"); + } + + // 到期时间 + Date expirationTime; + // 服务版本 + String skuSpec = ""; + // 获取店铺订阅服务 + String vasData = getInterface(pddIp, "/api/pdd/auth/getVasOrder?mallId=" + pddMallId); + Map vasMap = JsonUtil.transferToObj(vasData, Map.class); + if (vasMap.get("code").equals("200")) { + // 成功 调用新后台 + Map vas = (Map) vasMap.get("data"); + System.out.println("获取订阅服务数据:" + JsonUtil.transferToJson(vas)); + vas = MapUtils.convertKeys(vas); + System.out.println("转变格式:" + JsonUtil.transferToJson(vas)); + // 计算到期时间 + long payTime = Long.parseLong(vas.get("payTime").toString()); + long timeLength = Long.parseLong(vas.get("timeLength").toString()); + long newTimestamp = payTime + (timeLength * 1000); + expirationTime = new Date(newTimestamp); + + skuSpec = vas.get("skuSpec").toString(); + try { + InterfaceUtils.getInterfacePost("https://newadmin.buzhiyushu.cn/", "/vas/addVas", vas); + } catch (Exception e) { + System.out.println("调用新后台存储订阅服务信息失败"); + } + } + PddTokenResponse pddTokenResponse = new PddTokenResponse(); + pddTokenResponse.setAccessToken(accessToken); + pddTokenResponse.setPddMallId(pddMallId); + pddTokenResponse.setPddMallName(pddMallName); + pddTokenResponse.setSkuSpec(skuSpec); + return R.ok(pddTokenResponse); + } + + + /** + * 前往拼多多授权登录页面 + * + * @return + */ +// @SaCheckPermission("zhishu:authorize:getCode") + @GetMapping("/toPddGetCode") + @SaIgnore + public String toPddGetCode(String id, String type) { + + Long userId = LoginHelper.getUserId(); + + if (StringUtils.isEmpty(id)) { + type = "3"; + } + + String redirectUri = configService.selectConfigByKey("pdd.redirect.url"); + + String authorizationUrl = url + + "?response_type=code" + + "&client_id=" + clientId + + "&redirect_uri=" + redirectUri + + "&state=" + id + "-" + type + "-" + userId; + + return authorizationUrl; + } + + + /** + * 获取商品运费模版接口 + */ + @GetMapping("/getLogisticsTemplate/{shopId}") + public List getLogisticsTemplate(@PathVariable Long shopId, HttpServletRequest request) { + try { + Map headers = PddResultUtil.getPddHeaderMap(request); + + ShopVo shopVo = shopService.queryById(shopId); + String pddIp = configService.selectConfigByKey("pdd.ip"); + String logisticsTemplateListStr = getInterface(pddIp, "/api/pdd/auth/getLogisticsTemplate/" + shopVo.getToken(), headers); + List list = JsonUtils.parseObject(logisticsTemplateListStr, List.class); + return list; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @GetMapping("/getPageCode/{mallId}") + public String getPageCode(@PathVariable("mallId") String mallId) { + try { + String pddIp = configService.selectConfigByKey("pdd.ip"); + return getInterface(pddIp, "/api/pdd/auth/getPageCode/" + mallId); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 商品标准类目接口 + */ + @GetMapping("/getCats") + public ArrayList> getCats(HttpServletRequest request) { + Map headers = PddResultUtil.getPddHeaderMap(request); + // 从文件中获取数据字符串 + Map map; + ArrayList> mapList = new ArrayList<>(); + String content = RedisUtils.getCacheObject("catsMapStr"); + if (content == null || StringUtils.isEmpty(content)) { + String pddIp = configService.selectConfigByKey("pdd.ip"); + String catsMapStr = getInterface(pddIp, "/api/pdd/auth/getCats", headers); + RedisUtils.setCacheObject("catsMapStr", catsMapStr); + } + map = JsonUtils.parseObject(content, Map.class); + mapList.add(map); + return mapList; + } + + /** + * 商品属性类目接口 + */ + @GetMapping("/getSpec/{shopId}") + public List getSpec(@PathVariable String shopId, HttpServletRequest request) throws Exception { + Map headers = PddResultUtil.getPddHeaderMap(request); + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + String pddIp = configService.selectConfigByKey("pdd.ip"); + String goodsSpecListStr = getInterface(pddIp, "/api/pdd/auth/getSpec/" + shopVo.getToken(), headers); + return JsonUtils.parseObject(goodsSpecListStr, List.class); + } + + + /** + * 从拼多多商铺获取商品信息 + */ + @PostMapping("/selPddShop") + public PddGoodsListGetResponse selPddShop(@RequestBody PddShopInfo search) throws Exception { + return this.pddGetGoods(search); + } + + + public PddGoodsListGetResponse pddGetGoods(PddShopInfo search) throws Exception { + + PopClient client = new PopHttpClient(clientId, clientSecret); + PddGoodsListGetRequest request = new PddGoodsListGetRequest(); +// request.setCostTemplateId(1L); // 模版Id +// request.setCreatedAtEnd(1654099200L); // 商品创建时间结束时间的时间戳 +// request.setCreatedAtFrom(1654012800L); // 商品创建时间开始时间的时间戳 + request.setGoodsName("中国"); // 商品名称模糊查询 + request.setIsOnsale(0); // 上下架状态,0-下架,1-上架 +// request.setOuterGoodsId("1"); //商家外部商品编码,支持多个,用逗号隔开,最多10个 +// request.setOuterId("str"); // 商品外部编码 + request.setPage(1); // 返回页码 默认 1 + request.setPageSize(10); // 返回数量,默认 100,最大100 + PddGoodsListGetResponse response = client.syncInvoke(request, PddUtil.getToken()); + System.out.println(JsonUtil.transferToJson(response)); + return response; + } + + + // 超时 + public void tokenCs() { + // 获取所有已授权店铺的token + List shopIds = shopService.getShopId(LoginHelper.getUserId()); + for (String shopId : shopIds) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + if (shopVo == null) { + continue; + } + // 获取店铺的token + String token = shopVo.getToken(); + // 获取店铺的授权过期时间 + Date expirationTime = shopVo.getExpirationTime(); + // 校验店铺过期时间是否超过当前时间 + if (expirationTime.getTime() < System.currentTimeMillis()) { + // 店铺已过期,进行注销操作 + System.out.println("店铺授权已过期,进行超时操作"); + // 2代表授权已过期 + ShopBo shopBo = new ShopBo(); + shopBo.setId(shopVo.getId()); + shopBo.setStatus("2"); + shopService.updateByBo(shopBo); + } + } + } + + // 更新 + public void updateShop(Long shopId) throws Exception { + // 获取店铺信息 + ShopVo shopVo = shopService.queryById(shopId); + // 获取刷新token + String refreshToken = shopVo.getRefreshToken(); + String clientId = PddUtil.getClientId(); + String clientSecret = PddUtil.getClientSecret(); + + PopClient client = new PopHttpClient(clientId, clientSecret); + PddPopAuthTokenRefreshRequest request = new PddPopAuthTokenRefreshRequest(); + request.setRefreshToken(refreshToken); + PddPopAuthTokenRefreshResponse response = client.syncInvoke(request); + System.out.println(JsonUtil.transferToJson(response)); + + // 获取刷新后的token,重新赋值给店铺 + String token = response.getPopAuthTokenRefreshResponse().getAccessToken(); + + ShopBo shopBo = new ShopBo(); + shopBo.setId(shopVo.getId()); + shopBo.setToken(token); + shopService.updateByBo(shopBo); + } + + + // 删除店铺处理 + public void deleteShop(Long shopId) { + // 将店铺注销,并清空token + ShopVo shopVo = shopService.queryById(shopId); + ShopBo shopBo = new ShopBo(); + shopBo.setId(shopVo.getId()); + // 店铺注销,进行注销操作 + shopBo.setStatus("3"); + // 清空token 操作 + shopBo.setToken("0"); + shopService.updateByBo(shopBo); + } + + @GetMapping("/getShopGoodsTotalNum") + @SaIgnore + public R getShopGoodsTotalNum(String shopId, Integer isOnsale) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + String pddIp = configService.selectConfigByKey("pdd.ip"); + String url = "/api/pdd/auth/getShopGoodsList?" + + "accessToken=" + shopVo.getToken(); + if (isOnsale != null) { + url += "&isOnsale=" + isOnsale; + } + String dataStr = getInterface(pddIp, url + "&page=1&pageSize=100"); + Map dataMap = JsonUtil.transferToObj(dataStr, Map.class); + Integer totalCount = dataMap.get("total_count") == null ? 0 : Integer.parseInt(dataMap.get("total_count").toString()); + return R.ok(totalCount); + } + + @GetMapping("/createShopGoodsList") + @SaIgnore + public R createShopGoodsList(String shopId, Long createdAtFrom, Long createdAtEnd, Integer isOnsale, Integer sycFlag,String account, String password) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + // 判断是2-孔网店铺还是1-拼多多店铺 + String shopType = shopVo.getShopType(); + TaskBo taskBo = new TaskBo(); + // 存储任务信息 + if (Objects.equals(shopType, "1") || Objects.equals(shopType, "5")) { + if (shopType.equals("5")){ + List shopVoList = shopService.selectListByMallId(shopVo.getMallId()); + for (ShopVo shop : shopVoList){ + // 根据shopId查询数据表是否存在 + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shop.getId()); + if (checkMark == 0) { + // 不存在则创建表 + runningTaskByShopService.createTable("t_running_task_" + shop.getId()); + } + runningTaskByShopService.deleteAll("t_running_task_"+shop.getId()); + } + } + taskBo.setTaskType("GET_SHOP_GOODS"); + taskBo.setFileName("拉取商品任务"); + Map createMap = new HashMap(); + createMap.put("shop_id",shopVo.getId().toString()); + createMap.put("shop_type",shopVo.getShopType()); + createMap.put("task_count","1"); + // 任务类型 + createMap.put("task_type","3"); + // img_type 必须传1 + createMap.put("img_type","1"); + String createResStr = InterfaceUtils.postFormWithSign(UrlUtil.getNewTaskUrl(),"/task/create",createMap); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + if (!createResMap.get("code").equals("200")){ + return R.fail(createResMap.get("msg").toString()); + } + return R.ok("创建同步任务成功,请前往任务列表查看任务进度"); + } + return R.fail("店铺类型错误"); + } + + /** + * 继续执行拉取任务 + * @param shopId + * @return + */ + @GetMapping("/continueGetGoodsTask") + @SaIgnore + public R continueGetGoodsTask(String taskId,String shopId){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + String shopType = shopVo.getShopType(); + if (Objects.equals(shopType, "1")) { + TaskVo taskVo = taskService.queryById(Long.parseLong(taskId)); + String tableName = "t_running_task_" + shopId; + String lastFinishTimeStr = runningTaskByShopService.selectLastFinishTime(tableName); + + + for (int i = 0; i < 10; i++){ + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + System.out.println("休息异常"); + } + String lastFinishTimeStrMark = runningTaskByShopService.selectLastFinishTime(tableName); + if (StringUtils.isEmpty(lastFinishTimeStr) || StringUtils.isEmpty(lastFinishTimeStrMark)){ + return R.fail("任务已经执行完毕"); + } + if(!lastFinishTimeStr.equals(lastFinishTimeStrMark)){ + return R.fail("任务正在运行中"); + } + } + + // 时间格式转换 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + // 将字符串时间转换为Date对象 + Date lastFinishTime = sdf.parse(lastFinishTimeStr); + // 获取秒级时间戳 + long lastFinishTimestamp = lastFinishTime.getTime() / 1000; + + // 计算一个月后的时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(lastFinishTime); + calendar.add(Calendar.DATE, 29); // 增加29天 + Date oneMonthLater = calendar.getTime(); + // 获取一个月后的秒级时间戳 + long oneMonthLaterTimestamp = oneMonthLater.getTime() / 1000; + // 获取当前时间的秒级时间戳 + long currentTimestamp = System.currentTimeMillis() / 1000; + + // 如果一个月后的时间大于当前时间,则使用当前时间作为结束时间 + long endTimestamp = oneMonthLaterTimestamp; + if (oneMonthLaterTimestamp > currentTimestamp) { + endTimestamp = currentTimestamp; + } + + String startTime = String.valueOf(lastFinishTimestamp); + String endTime = String.valueOf(endTimestamp); + + Map mapData = new HashMap(); + mapData.put("taskId", taskId); + mapData.put("shopId", shopId); + mapData.put("shopType", shopVo.getShopType()); + mapData.put("token", shopVo.getToken()); +// mapData.put("isOnsale", isOnsale == null ? "" : isOnsale.toString()); + if(taskVo.getFileName().contains("详细")){ + mapData.put("taskType", "2"); + }else{ + mapData.put("taskType", "1"); + } + mapData.put("startTime", startTime); + mapData.put("endTime", endTime); + mapData.put("serviceName","GET_SHOP_GOODS"); + // 调用接口 + InterfaceUtils.postForm(UrlUtil.getShopGoodsTaskUrl(), "/task/verifyPricePublishGoods", mapData); +// InterfaceUtils.postForm("http://localhost:18099", "/task/verifyPricePublishGoods", mapData); + } catch (ParseException e) { + // 时间解析异常处理 + e.printStackTrace(); + return R.fail("时间格式解析错误"); + } + return R.ok("任务继续"); + }else{ + return R.ok("目前只支持拼多多店铺"); + } + } + + @GetMapping("/createTask") + @SaIgnore + public R createTask (String shopId){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + // 判断是2-孔网店铺还是1-拼多多店铺 + String shopType = shopVo.getShopType(); + TaskBo taskBo = new TaskBo(); + taskBo.setTaskType("GET_KW_SHOP_GOODS"); + taskBo.setFileName("拉取孔网商品任务"); + taskBo.setShopIds(shopId); + taskBo.setShopNames(shopVo.getShopName()); + taskBo.setDataNum(0L); + taskBo.setTaskStatus("0"); + taskBo.setCreateBy(shopVo.getCreateBy()); + taskService.insertByBo(taskBo); + return R.ok("true", taskBo.getId().toString()); + } + + + @SaCheckPermission("zhishu:pddGoods:tongbu") + @GetMapping("/createShopGoodsDetailList") + @SaIgnore + public R createShopGoodsDetailList(String shopId, Long createdAtFrom, Long createdAtEnd, Integer isOnsale) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + Map createMap = new HashMap(); + createMap.put("shop_id",shopVo.getId().toString()); + createMap.put("shop_type",shopVo.getShopType()); + createMap.put("task_count","1"); + // 任务类型 + createMap.put("task_type","4"); + // img_type 必须传1 + createMap.put("img_type","1"); + String createResStr = InterfaceUtils.postFormWithSign(UrlUtil.getNewTaskUrl(),"/task/create",createMap); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + if (!createResMap.get("code").equals("200")){ + return R.fail(createResMap.get("msg").toString()); + } + return R.ok("创建同步任务成功,请前往任务列表查看任务进度"); + } + + + @GetMapping("/createShopGoodsmovie") + @SaIgnore + public R createShopGoodsmovie(String shopId, Long createdAtFrom, Long createdAtEnd, Integer isOnsale,String targetShopIds) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + TaskBo taskBo = new TaskBo(); + // 存储任务信息 + taskBo.setTaskType("GET_MOVE_GOODS"); + taskBo.setFileName("拼多多店铺搬家"); + taskBo.setShopIds(shopId); + taskBo.setShopNames(shopVo.getShopName()); + taskBo.setDataNum(0L); + taskBo.setTaskStatus("0"); + taskService.insertByBo(taskBo); + + // 异步执行任务 + ThreadPoolUtils.execute(() -> { + pddService.sendPddGoodsToTargetShop(shopId, targetShopIds,taskBo,shopVo); + }); + + + return R.ok("创建同步任务成功,请前往任务列表查看任务进度"); + } + + + + + @GetMapping("/getShopGoodsList") + @SaIgnore + public TableDataInfo> getShopGoodsList(String shopId, String isOnsale,String isbn, + String priceDown,String priceUp,String startDate, + String endDate, Integer page, Integer pageSize, + String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { + return pddService.getShopGoodsList(shopId, isOnsale,isbn,priceDown,priceUp,startDate,endDate, page, pageSize,goodsName,stockDown,stockUp, trilateralId, goodsCode, skuCode); + } + + @GetMapping("/delShopGoods") + public R delShopGoods(String shopId, String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate){ + String shopName = ""; + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + shopName = shopVo.getShopName(); + + //任务列表中添加删除操作记录 + + TaskBo taskBo = new TaskBo(); + //存储任务信息 + taskBo.setTaskType("DEL"); + taskBo.setFileName("删除店铺商品列表"); + taskBo.setShopIds(shopId); + taskBo.setShopNames(shopName); + taskBo.setDataNum(runningTaskByShopServiceImpl.countAll("t_running_task_" + shopId).longValue()); + taskBo.setTaskStatus("3"); + taskService.insertByBo(taskBo); + + pddService.clearRedisBuffer(shopId); + + runningTaskByShopServiceImpl.delShopGoods("t_running_task_" + shopId, isOnsale,isbn,priceDown,priceUp,startDate,endDate); + return R.ok(); + } + + + /** + * 导出商品列表 + * + * @param + * @param + * @param response + */ + @PostMapping("/emportShopGoods") + @SaIgnore + public void emportShopGoods(ErpGoodsDto erpGoodsDto, HttpServletResponse response) { + erpGoodsDto.setTableName("t_running_task_" + erpGoodsDto.getShopId()); + List list = runningTaskByShopServiceImpl.selectShopGoodsList(erpGoodsDto); + ExcelUtil.exportExcel(list, "sheet", SuccessDataItemDto.class, response); + } + + /** + * 孔夫子专用导出商品列表 + * @param erpGoodsDto + * @param response + */ + @PostMapping("/emportKfzShopGoods") + @SaIgnore + public void emportKfzShopGoods(ErpGoodsDto erpGoodsDto, HttpServletResponse response) { + erpGoodsDto.setTableName("t_running_task_" + erpGoodsDto.getShopId()); + List list = runningTaskByShopServiceImpl.selectKfzShopGoodsList(erpGoodsDto); + ExcelUtil.exportExcel(list, "sheet", SuccessDataKfz.class, response); + } + + + @GetMapping("/checkFile") + public Boolean checkFile(String shopId) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + + int numMark = 0; + + String filePath = "ShopGoodsDataCSV/" + shopVo.getMallId() + "/" + numMark + ".csv"; + // 通过FileClient获取文件内容(Base64格式) + R dataResult = fileClient.get(UrlUtil.getFileServiceUrl(), filePath, "base64"); + + return R.isSuccess(dataResult); + } + + /** + * 一键上下架功能 + */ + @PostMapping("/editShopGoodsAllByIsOnSale") + public R editShopGoodsAllByIsOnSale(String shopId, String isOnSale, String isbn, String priceDown, String priceUp, String startDate, String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { + String[] shopIds = shopId.split(","); + List errorMessages = new ArrayList<>(); + List successMessages = new ArrayList<>(); + for (String shopIdStr : shopIds) { + try { + // 获取店铺信息 + ShopVo shopVo = shopService.queryById(Long.parseLong(shopIdStr)); + if (shopVo == null) { + errorMessages.add("店铺" + shopIdStr + "不存在"); + continue; + } + + int num = runningTaskByShopService.checkTableExists("t_running_task_" + shopIdStr); + String isOnsaleStr = isOnSale.equals("0") ? "下架" : "上架"; + // 检查表是否存在 + if (num == 0) { + errorMessages.add("店铺" + shopIdStr + "请先同步店铺商品"); + continue; + } + + if (!shopVo.equals("1")){ + // 检查是否存在正在进行的任务 + Long markNum = runningTaskService.selectTaskStatusByTaskTypeAndIsbn(Long.parseLong(shopIdStr), "EDIT_ISONSALE_GOODS", isbn); + if (markNum > 0) { + errorMessages.add("店铺" + shopIdStr + "正在执行商品上下架操作,请稍后再试"); + continue; + } + } + + // 检查符合条件的商品数量 + int count = runningTaskByShopService.selectGetShopGoodsListCount("t_running_task_" + shopIdStr, isOnSale.equals("0") ? "1" : "0", isbn, priceDown, priceUp, startDate, endDate,goodsName,stockDown,stockUp,trilateralId,goodsCode,skuCode); + if (count == 0) { + errorMessages.add("店铺" + shopIdStr + "没有符合条件的商品"); + continue; + } + // 创建任务 + TaskBo taskBo = new TaskBo(); + // 拼多多执行新任务 + Map createMap = new HashMap(); + createMap.put("shop_id",shopVo.getId().toString()); + createMap.put("shop_type",shopVo.getShopType()); + createMap.put("task_count",count+""); + createMap.put("task_type","5"); + createMap.put("img_type","1"); + String createResStr = InterfaceUtils.postFormWithSign(UrlUtil.getNewTaskUrl(),"/task/create",createMap); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + if (createResMap.get("code").equals("500")){ + errorMessages.add("店铺" + shopIdStr + "创建任务异常:"+createResMap.get("msg").toString()); + continue; + }else{ + taskBo.setId(Long.parseLong(createResMap.get("data").toString())); + } + + // 异步执行任务 + new Thread(() -> { + pddService.editShopGoodsAllByIsOnSale(shopVo, taskBo, isOnSale, isbn, priceDown, priceUp, startDate, endDate, goodsName, stockDown, stockUp, trilateralId, goodsCode, skuCode); + }).start(); + successMessages.add("店铺" + shopIdStr + "(" + shopVo.getShopName() + ")创建" + isOnsaleStr + "任务成功"); + } catch (Exception e) { + errorMessages.add("店铺" + shopIdStr + "处理异常: " + e.getMessage()); + log.error("处理店铺{}时发生异常", shopIdStr, e); + } + } + // if (!skipMessages.isEmpty()) { + // if (resultMessage.length() > 0) resultMessage.append("\n"); + // resultMessage.append("跳过处理:").append(String.join(";", skipMessages)).append("。"); + // } + // if (!errorMessages.isEmpty()) { + // if (resultMessage.length() > 0) resultMessage.append("\n"); + // resultMessage.append("处理失败:").append(String.join(";", errorMessages)).append("。"); + // } + + // if (successMessages.isEmpty() && skipMessages.isEmpty()) { + // return R.fail(resultMessage.toString()); + // } + + if(!errorMessages.isEmpty()){ + errorMessages.addAll(successMessages); + return R.fail(errorMessages.toString()); + } + + return R.ok(successMessages.toString()); + } + + /** + * 获取商品核价文件下载链接 + */ + @SaIgnore + @GetMapping("/getVerifyPriceUrl") + public R getVerifyPriceUrl(String shopId) { + StringBuilder allContent = new StringBuilder(); + + String[] shopIds = shopId.split(","); + for (String shopIdStr : shopIds){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopIdStr)); + + if (shopVo == null) { + return R.fail("店铺不存在"); + } + + String filePath = "task_log/goods-list-csv/" + shopIdStr + "/online_goods.csv"; + // 通过FileClient获取文件内容(url格式) + R dataResult= dataResult= fileClient.get(UrlUtil.getFileServiceUrl(), filePath, "url"); + if (dataResult.isSuccess(dataResult) && dataResult.getData() != null) { + allContent.append(dataResult.getData()).append("\n"); + } + } + + return R.ok(allContent.toString()); + + // 通过FileClient获取文件内容(url格式) + + // + // if (R.isSuccess(dataResult)) { + // return R.ok("true", dataResult.getData()); + // } else { + // return R.fail("未查询到店铺商品,请重新同步后再试"); + // } + } + + /** + * 修改店铺商品CSV表格价格 + * + * @param request 修改商品价格请求参数 + * @return 修改成功状态 + */ + @SaIgnore + @PostMapping("/updateShopGoodsDataPriceCSV") + public R updateShopGoodsDataPriceCSV(@Validated @RequestBody UpdateShopGoodsDataPriceCSVRequest request) { + // 1. 构建文件路径 + String filePath = "ShopGoodsDataCSV/" + request.getMallId() + ".csv"; + + // 2. 获取CSV文件内容 + R dataResult = fileClient.get(UrlUtil.getFileServiceUrl(), filePath, "base64"); + if (!R.isSuccess(dataResult)) { + throw new ServiceException("获取文件失败"); + } + + // 3. 解码Base64并读取CSV内容 + byte[] decodedBytes = Base64.getDecoder().decode(dataResult.getData()); + String csvContent = new String(decodedBytes, StandardCharsets.UTF_8); + + // 4. 将请求中的商品列表转换为Map以便快速查找(key: platformId, value: SkuItem) + Map skuItemMap = request.getSkuItemList().stream() + .collect(Collectors.toMap( + UpdateShopGoodsDataPriceCSVRequest.SkuItem::getPlatformId, + Function.identity() + )); + + try (StringReader stringReader = new StringReader(csvContent); + CSVReader reader = new CSVReader(stringReader); + StringWriter writer = new StringWriter(); + CSVWriter csvWriter = new CSVWriter(writer)) { + + // 5. 读取CSV表头 + String[] header = reader.readNext(); + if (header == null) { + throw new ServiceException("CSV文件格式错误,缺少表头"); + } + + // 6. 查找关键列索引 + int goodsIdIndex = -1; + int isOnsaleIndex = -1; + int priceIndex = -1; + for (int i = 0; i < header.length; i++) { + switch (header[i]) { + case "goods_id": + goodsIdIndex = i; + break; + case "is_onsale": + isOnsaleIndex = i; + break; + case "price": + priceIndex = i; + break; + } + } + + if (goodsIdIndex == -1) { + throw new ServiceException("CSV文件缺少goods_id列"); + } + + // 7. 写入表头 + csvWriter.writeNext(header); + + // 8. 处理每一行数据 + String[] row; + while ((row = reader.readNext()) != null) { + try { + Long goodsId = Long.parseLong(row[goodsIdIndex]); + + // 检查当前商品是否需要修改 + if (skuItemMap.containsKey(goodsId)) { + UpdateShopGoodsDataPriceCSVRequest.SkuItem skuItem = skuItemMap.get(goodsId); + + // 修改is_onsale字段 + if (request.getIsOnSale() != null && isOnsaleIndex != -1) { + row[isOnsaleIndex] = request.getIsOnSale().toString(); + } + + // 修改price字段 + if (skuItem.getGroupPrice() != null && priceIndex != -1) { + row[priceIndex] = skuItem.getGroupPrice().toString(); + } + } + + // 写入处理后的行 + csvWriter.writeNext(row); + } catch (NumberFormatException e) { + log.error("解析goods_id失败,行内容: {}", Arrays.toString(row), e); + csvWriter.writeNext(row); // 解析失败时保留原行 + } + } + + // 9. 生成新的CSV内容并编码为Base64 + String newCsvContent = writer.toString(); + String newBase64Content = Base64.getEncoder().encodeToString(newCsvContent.getBytes(StandardCharsets.UTF_8)); + + // 10. 上传修改后的文件 + R uploadResult = fileClient.upload(UrlUtil.getFileServiceUrl(), newBase64Content, "ShopGoodsDataCSV", request.getMallId() + ".csv"); + if (!R.isSuccess(uploadResult)) { + throw new ServiceException("更新文件失败"); + } + + return R.ok(true); + } catch (Exception e) { + log.error("处理CSV文件失败", e); + throw new ServiceException("处理CSV文件失败:" + e.getMessage()); + } + } + + /** + * 批量设置商品下架 + * + * @return 批量设置成功状态 + */ + @SaIgnore + @PostMapping("/batchSetSoldOut/{shopId}") + public R batchSetSoldOut(@PathVariable("shopId") Long shopId) { + pddService.batchSetSoldOut(shopId); + return R.ok(true); + } + + // 批次大小 + private static final int BATCH_SIZE = 1000; + // 每个批次最大线程数 + private static final int MAX_THREADS_PER_BATCH = 10; + + /** + * 通过csv批量翻新商品上架拼多多 + * + * @param file 文件 + * @param shopId 店铺ID + * @return 响应 + */ + @SaIgnore + @PostMapping("/batchRenovateOnSaleByCsv") + public R batchRenovateOnSaleByCsv(@RequestParam("file") MultipartFile file, @NotBlank(message = "店铺Id不能为空") String shopId) { + // 判断是否上传了file文件 + if (file == null || file.isEmpty()) { + return R.fail("请上传文件"); + } + // 判断是否是csv文件 + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null || !originalFilename.toLowerCase().endsWith(".csv")) { + return R.fail("请上传CSV格式的文件"); + } + // 根据店铺查询店铺名称及token + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + if (shopVo == null) { + return R.fail("店铺不存在"); + } + + // 获取总条数 + Long totalCount = getCsvFileTotalCount(file); + + // 创建任务 + TaskBo taskBo = new TaskBo(); + // 存储任务信息 + taskBo.setTaskType("1"); + taskBo.setFileName("excel表格上传:批量翻新商品上架"); + taskBo.setShopIds(shopId); + taskBo.setShopNames(shopVo.getShopName()); + taskBo.setDataNum(totalCount); + taskBo.setTaskStatus("0"); + taskService.insertByBo(taskBo); + + // 调用方法异步处理文件数据 + pddService.batchRenovateOnSaleByCsv(file, taskBo, shopVo); + + return R.ok("已受理", true); + } + + // 使用 OpenCsv 获取文件总条数 + private Long getCsvFileTotalCount(MultipartFile file) { + long totalCount = 0; + try (Reader reader = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8)) { + // OpenCSV 方式读取 CSV + CSVReader csvReader = new CSVReaderBuilder(reader) + .withSkipLines(0) // 不跳过任何行(默认) + .build(); + + // 遍历所有行并计数(不加载到内存) + while (csvReader.readNext() != null) { + totalCount++; + } + + // 如果文件有 header,需要减 1 + if (totalCount > 0) { + totalCount--; // 去掉 header 行 + } + } catch (IOException e) { + throw new ServiceException("读取CSV文件失败:" + e.getMessage()); + } catch (CsvValidationException e) { + throw new ServiceException("CSV格式验证失败:" + e.getMessage()); + } + return totalCount; + } + + /** + * 翻新单个商品上架拼多多 + * + * @return 响应 + */ + @SaIgnore + @PostMapping("/renovateOnSale") + public R renovateOnSale(@RequestBody RenovateOnSaleRequest request) { + pddService.renovateOnSale(request.getData(), request.getShopId(), request.getTaskId()); + return R.ok(Boolean.TRUE); + } + + + /** + * 检查店铺价格模板 + * @param shopId 店铺ID + * @return 价格模板信息 + */ + @GetMapping("/checkPriceTemplate") + public ResponseEntity> checkPriceTemplate(@RequestParam List shopId) { + Map result = new HashMap<>(); + + for (Long shopIdstr : shopId) { + String saleTemplateId = pddService.getSaleTemplateIdByShopId(shopIdstr); + result.put(shopIdstr, saleTemplateId); + } + + return ResponseEntity.ok(result); + } + + /** + * 获取商品核价文件下载链接 + */ + @SaIgnore + @GetMapping("/getPddChildrenBooksToken") + public JSONObject getPddChildrenBooksToken() { + JSONObject jsonObject = new JSONObject(); + String mailId = configService.selectConfigByKey("pdd_children_books_shopId"); + String pddIp = configService.selectConfigByKey("pdd.ip"); + ShopVo shopVo = shopService.queryByMailIdbyUseing(Long.parseLong(mailId),1); + if (shopVo==null){ + jsonObject.put("code", 500); + jsonObject.put("msg", "token已过期"); + return jsonObject; + } + //验证token是否过期 + String pddMallInfoGetResponseStr = getInterface(pddIp, "/api/pdd/auth/getMallInfo/" + shopVo.getToken()); + PddMallInfoGetResponse pddMallInfoGetResponse = JsonUtils.parseObject(pddMallInfoGetResponseStr, PddMallInfoGetResponse.class); + // 先检查主对象是否为null + if (pddMallInfoGetResponse == null) { + jsonObject.put("code", 500); + jsonObject.put("msg", "解析响应数据失败"); + return jsonObject; + } + if(pddMallInfoGetResponse.getErrorResponse()!=null){ + jsonObject.put("code", 500); + jsonObject.put("msg", pddMallInfoGetResponse.getErrorResponse().getErrorMsg()); + return jsonObject; + } + jsonObject.put("code", 200); + jsonObject.put("data", shopVo.getToken()); + jsonObject.put("msg", "获取成功"); + // 获取拼多多店铺ID和名称 + return jsonObject; + } + + + + @GetMapping("/getToken") + @SaIgnore + public String getToken(){ + return configService.selectConfigByKey("image.token"); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddOrderContorller.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddOrderContorller.java new file mode 100644 index 0000000..c6c42a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PddOrderContorller.java @@ -0,0 +1,64 @@ +package org.dromara.zhishu.controller; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddOrderListGetRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddOrderListGetResponse; + +import java.util.Date; + +public class PddOrderContorller { + + + +// //授权页面url +// String clientId = "203c5a7ba8bd4b8488d5e26f93052642"; +// String clientSecret = "892ffaa86e12b7a3d8d2942b669d9aa520ad8179"; + + + public static void main(String[] args) throws Exception { + + + //授权页面url + String clientId = "203c5a7ba8bd4b8488d5e26f93052642"; + String clientSecret = "892ffaa86e12b7a3d8d2942b669d9aa520ad8179"; +// String clientId = clientId; +// String clientSecret = "your clientSecret"; + String accessToken = "83b0b0e8aca14fba89e03ab42476dc7f403ffb39"; + +// String clientId = "your clientId"; +// String clientSecret = "your clientSecret"; +// String accessToken = "your accessToken"; + PopClient client = new PopHttpClient(clientId, clientSecret); + + PddOrderListGetRequest request = new PddOrderListGetRequest(); + request.setEndConfirmAt(1L); + request.setOrderStatus(5); + request.setPage(1); + request.setPageSize(100); + request.setRefundStatus(5); + request.setStartConfirmAt(1L); + request.setTradeType(1); + request.setUseHasNext(true); + PddOrderListGetResponse response = client.syncInvoke(request, accessToken); + System.out.println(JsonUtil.transferToJson(response)); + + + + + + Date date = new Date(); + + System.out.println(date.getTime()); + System.out.println("1742019835298".length()); + + + + + + + + + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrintTemplateController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrintTemplateController.java new file mode 100644 index 0000000..efa5478 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrintTemplateController.java @@ -0,0 +1,116 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.PrintTemplateVo; +import org.dromara.zhishu.domain.bo.PrintTemplateBo; +import org.dromara.zhishu.service.IPrintTemplateService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 打印模板 + * + * @author yxy + * @date 2026-03-07 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/printTemplate") +public class PrintTemplateController extends BaseController { + + private final IPrintTemplateService printTemplateService; + + /** + * 查询打印模板列表 + */ + @SaCheckPermission("zhishu:printTemplate:list") + @GetMapping("/list") + public TableDataInfo list(PrintTemplateBo bo, PageQuery pageQuery) { + return printTemplateService.queryPageList(bo, pageQuery); + } + + /** + * 查询打印模板列表 + * @param bo + * @return + */ + @SaCheckPermission("zhishu:printTemplate:list") + @GetMapping("/listNoPage") + public List listNoPage(PrintTemplateBo bo){ + return printTemplateService.queryList(bo); + } + + /** + * 导出打印模板列表 + */ + @SaCheckPermission("zhishu:printTemplate:export") + @Log(title = "打印模板", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PrintTemplateBo bo, HttpServletResponse response) { + List list = printTemplateService.queryList(bo); + ExcelUtil.exportExcel(list, "打印模板", PrintTemplateVo.class, response); + } + + /** + * 获取打印模板详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:printTemplate:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(printTemplateService.queryById(id)); + } + + /** + * 新增打印模板 + */ + @SaCheckPermission("zhishu:printTemplate:add") + @Log(title = "打印模板", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody PrintTemplateBo bo) { + return toAjax(printTemplateService.insertByBo(bo)); + } + + /** + * 修改打印模板 + */ + @SaCheckPermission("zhishu:printTemplate:edit") + @Log(title = "打印模板", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody PrintTemplateBo bo) { + return toAjax(printTemplateService.updateByBo(bo)); + } + + /** + * 删除打印模板 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:printTemplate:remove") + @Log(title = "打印模板", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(printTemplateService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrinterController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrinterController.java new file mode 100644 index 0000000..2c5dbcd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/PrinterController.java @@ -0,0 +1,171 @@ +package org.dromara.zhishu.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.zhishu.domain.bo.PrintTemplateBo; +import org.dromara.zhishu.domain.vo.PrintTemplateVo; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.PrinterVo; +import org.dromara.zhishu.domain.bo.PrinterBo; +import org.dromara.zhishu.service.IPrinterService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 打印机设置 + * + * @author yxy + * @date 2026-03-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/printer") +public class PrinterController extends BaseController { + + private final IPrinterService printerService; + + /** + * 查询打印机设置列表 + */ + @SaCheckPermission("zhishu:printer:list") + @GetMapping("/list") + public TableDataInfo list(PrinterBo bo, PageQuery pageQuery) { + return printerService.queryPageList(bo, pageQuery); + } + + /** + * 查询全部打印机设置 + * @param bo + * @return + */ + @SaCheckPermission("zhishu:printer:list") + @GetMapping("/listNoPage") + public List listNoPage(PrinterBo bo){ + return printerService.queryList(bo); + } + + + /** + * 导出打印机设置列表 + */ + @SaCheckPermission("zhishu:printer:export") + @Log(title = "打印机设置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PrinterBo bo, HttpServletResponse response) { + List list = printerService.queryList(bo); + ExcelUtil.exportExcel(list, "打印机设置", PrinterVo.class, response); + } + + /** + * 获取打印机设置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:printer:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(printerService.queryById(id)); + } + + /** + * 新增打印机设置 + */ + @SaCheckPermission("zhishu:printer:add") + @Log(title = "打印机设置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody PrinterBo bo) { + if (bo.getPrintType().equals("2")){ + // 拼多多云打印机 + Map map = new HashMap(); + map.put("printerId",bo.getPrinter()); + map.put("verifyCode",bo.getCaptcha()); + map.put("accessToken",bo.getAccessToken()); + String res = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/pddCloudPrint/pddCloudPrinterBind",map); + try{ + Map resMap = JsonUtil.transferToObj(res,Map.class); + Map cloudPrinterBindresponse = (Map) resMap.get("cloud_printer_bind_response"); + Boolean success = (Boolean) cloudPrinterBindresponse.get("success"); + if (success){ + Map result = (Map) cloudPrinterBindresponse.get("result"); + bo.setShareCode(result.get("shareCode").toString()); + }else{ + return R.fail(cloudPrinterBindresponse.get("errorMsg").toString()); + } + }catch (Exception e){ + return R.fail(res); + } + } + + return toAjax(printerService.insertByBo(bo)); + } + + /** + * 修改打印机设置 + */ + @SaCheckPermission("zhishu:printer:edit") + @Log(title = "打印机设置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody PrinterBo bo) { + return toAjax(printerService.updateByBo(bo)); + } + + /** + * 删除打印机设置 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:printer:remove") + @Log(title = "打印机设置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(printerService.deleteWithValidByIds(List.of(ids), true)); + } + + + /** + * 新增打印机设置 + */ + @GetMapping("/getCaptcha") + public R getCaptcha(PrinterBo bo) { + + + List voList = printerService.queryList(bo); + if (voList.size() > 0){ + return R.fail("该 "+bo.getPrinter()+" 打印机已被绑定"); + } + + Map map = new HashMap(); + map.put("printerId",bo.getPrinter()); + map.put("accessToken",bo.getAccessToken()); + String res = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/pddCloudPrint/pddCloudPrintVerifyCode",map); + try{ + Map resMap = JsonUtil.transferToObj(res,Map.class); + return R.ok(resMap); + }catch (Exception e){ + return R.fail(res); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProductController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProductController.java new file mode 100644 index 0000000..c30a25c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProductController.java @@ -0,0 +1,72 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.SinglePrint; +import org.dromara.zhishu.domain.bo.SinglePrintBo; +import org.dromara.zhishu.service.IProductService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/product") +public class ProductController extends BaseController { + + private final IProductService productService; + + + @GetMapping("/getMappingList") + @SaIgnore + public Map getMappingList(){ + return productService.getMappingList(); + } + + /** + * 查询单票打印列表 + */ + @GetMapping("/list") + @SaIgnore + public TableDataInfo list(@RequestParam Map bo) { + return productService.queryPageList(bo); + } + + @PostMapping("/releaseGoods") + public R releaseGoods(@RequestBody Map map){ + // 异步执行 + CompletableFuture.runAsync(() -> { + productService.releaseGoods(map); + }); + return R.ok(); + } + + @PostMapping("/releaseGoodsAuto") + @SaIgnore + public R releaseGoodsAuto(@RequestParam Map map){ + try{ + // 用户id + String userId = map.get("userId").toString(); + // 仓库id + String warehouseId = map.get("warehouseId").toString(); + String productId = map.get("productId").toString(); + System.out.println("用户id:"+userId+";仓库id:"+warehouseId+";商品id:"+productId); + // 异步执行 + CompletableFuture.runAsync(() -> { + productService.releaseGoodsAuto(map); + }); + return R.ok(); + }catch (Exception e){ + return R.fail(e.getMessage()); + } + + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProfitSharingLogController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProfitSharingLogController.java new file mode 100644 index 0000000..f8a23da --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ProfitSharingLogController.java @@ -0,0 +1,40 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.ProfitSharingLog; +import org.dromara.zhishu.domain.bo.PriceTemplateBo; +import org.dromara.zhishu.domain.vo.PriceTemplateVo; +import org.dromara.zhishu.service.IProfitSharingLogService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 分润日志表 + * + * @author yxy + * @date 2026-02-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/profitSharingLog") +public class ProfitSharingLogController { + + private final IProfitSharingLogService profitSharingLogService; + + /** + * 分页查询分润日志表 + */ +// @SaCheckPermission("zhishu:profitSharingLog:list") + @GetMapping("/list") + @SaIgnore + public TableDataInfo list(ProfitSharingLog bo, PageQuery pageQuery) { + return profitSharingLogService.queryPageList(bo, pageQuery); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/RunningLogFileController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/RunningLogFileController.java new file mode 100644 index 0000000..1483ad2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/RunningLogFileController.java @@ -0,0 +1,122 @@ +package org.dromara.zhishu.controller; + +import java.util.List; +import java.util.Map; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.zhishu.domain.bo.ViolationBo; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.RunningLogFileVo; +import org.dromara.zhishu.domain.bo.RunningLogFileBo; +import org.dromara.zhishu.service.IRunningLogFileService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 程序运行日志表 + * + * @author yxy + * @date 2025-06-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/runningLogFile") +public class RunningLogFileController extends BaseController { + + private final IRunningLogFileService runningLogFileService; + + /** + * 查询程序运行日志表列表 + */ + @SaCheckPermission("zhishu:runningLogFile:list") + @GetMapping("/list") + public TableDataInfo list(RunningLogFileBo bo, PageQuery pageQuery) { + return runningLogFileService.queryPageList(bo, pageQuery); + } + + @SaIgnore + @PostMapping("/newList") + public String newList(@RequestBody Map map){ + Integer pageSize = Integer.parseInt(map.get("pageSize").toString()); + Integer pageNum = Integer.parseInt(map.get("pageNum").toString()); + + PageQuery pageQuery = new PageQuery(pageSize,pageNum); + + RunningLogFileBo bo = new RunningLogFileBo(); + + return JsonUtil.transferToJson(runningLogFileService.queryPageList(bo, pageQuery)); + } + + /** + * 导出程序运行日志表列表 + */ + @SaCheckPermission("zhishu:runningLogFile:export") + @Log(title = "程序运行日志表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(RunningLogFileBo bo, HttpServletResponse response) { + List list = runningLogFileService.queryList(bo); + ExcelUtil.exportExcel(list, "程序运行日志表", RunningLogFileVo.class, response); + } + + /** + * 获取程序运行日志表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:runningLogFile:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(runningLogFileService.queryById(id)); + } + + /** + * 新增程序运行日志表 + */ + @SaCheckPermission("zhishu:runningLogFile:add") + @Log(title = "程序运行日志表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody RunningLogFileBo bo) { + return toAjax(runningLogFileService.insertByBo(bo)); + } + + /** + * 修改程序运行日志表 + */ + @SaCheckPermission("zhishu:runningLogFile:edit") + @Log(title = "程序运行日志表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody RunningLogFileBo bo) { + return toAjax(runningLogFileService.updateByBo(bo)); + } + + /** + * 删除程序运行日志表 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:runningLogFile:remove") + @Log(title = "程序运行日志表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(runningLogFileService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopController.java new file mode 100644 index 0000000..fd101f8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopController.java @@ -0,0 +1,691 @@ +package org.dromara.zhishu.controller; + +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.zhishu.domain.bo.EncryptionDataBo; +import org.dromara.zhishu.domain.bo.UserRechargeBo; +import org.dromara.zhishu.domain.dto.request.UpdateTokenRequest; +import org.dromara.zhishu.domain.dto.response.GetWlnShopListResponse; +import org.dromara.zhishu.domain.vo.DecryptDataVo; +import org.dromara.zhishu.domain.vo.XyCategoryVo; +import org.dromara.zhishu.manager.TaskExecutorManager; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.service.impl.RunningTaskByShopServiceImpl; +import org.dromara.zhishu.service.impl.RunningTaskServiceImpl; +import org.dromara.zhishu.util.DateUtilsUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.bo.ShopBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +import org.dromara.zhishu.mapper.ShopDepotMapper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.util.InterfaceUtils; + +/** + * 店铺主表 + * + * @author yxy + * @date 2025-03-10 + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shop") +public class ShopController extends BaseController { + + private final IShopService shopService; + private final ISysConfigService configService; + private final IXyCategoryService xyCategoryService; + private final RunningTaskServiceImpl runningTaskServiceImpl; + private final TaskExecutorManager taskExecutorManager; + private final SysUserMapper sysUserMapper; + private final RunningTaskByShopServiceImpl runningTaskByShopServiceImpl; + private final ShopMapper shopMapper; + private final IUserRechargeService userRechargeService; + + + private static final String TODAY_GOODS_CACHE_KEY = "todayGoods:"; + private static final long CACHE_EXPIRE_MINUTES = 5; // 缓存5分钟 + + /** + * 查询店铺主表列表 + */ + @GetMapping("/list") + @SaIgnore + public TableDataInfo list(ShopBo bo, PageQuery pageQuery) { + return shopService.queryPageList(bo, pageQuery); + } + + @SaCheckPermission("zhishu:shop:list") + @GetMapping("/inviteList") + public TableDataInfo inviteList(ShopBo bo, PageQuery pageQuery) { + return shopService.queryPageListInvite(bo, pageQuery); + } + + @GetMapping("/getList") + public List getList() { + return shopService.queryList(new ShopBo()); + } + + @GetMapping("/getRunningShopList") + @SaIgnore + public List getRunningShopList(String taskType){ + List mapList = runningTaskServiceImpl.selectTaskGroupShop(taskType); + Iterator iterator = mapList.iterator(); + while (iterator.hasNext()) { + Map map = iterator.next(); + ShopVo shopVo = shopService.queryById(Long.parseLong(map.get("shop_id").toString())); + + if (shopVo == null) { + iterator.remove(); // 安全删除 + } else { + map.put("shopName", shopVo.getShopName()); + } + } + + return mapList; + } + + @GetMapping("/getJavaTaskPoolStatus") + @SaIgnore + public Map getJavaTaskPoolStatus() { + String bIp = "119.45.237.193"; + String es1Ip = "36.212.12.247"; + String url = "/task/metrics"; + + List> futures = Arrays.asList( + CompletableFuture.supplyAsync( + () -> runningTaskServiceImpl.getJavaTaskPool(bIp, "10046", url), + taskExecutorManager.getExecutor() + ).orTimeout(500, TimeUnit.SECONDS), // 设置5秒超时 + + CompletableFuture.supplyAsync( + () -> runningTaskServiceImpl.getJavaTaskPool(bIp, "10045", url), + taskExecutorManager.getExecutor() + ).orTimeout(500, TimeUnit.SECONDS), + + //新增节点 + CompletableFuture.supplyAsync( + () -> runningTaskServiceImpl.getJavaTaskPool(es1Ip, "10047", url), + taskExecutorManager.getExecutor() + ).orTimeout(500, TimeUnit.SECONDS), // 设置5秒超时 + + CompletableFuture.supplyAsync( + () -> runningTaskServiceImpl.getJavaTaskPool(es1Ip, "10048", url), + taskExecutorManager.getExecutor() + ).orTimeout(500, TimeUnit.SECONDS), // 设置5秒超时 + + CompletableFuture.supplyAsync( + () -> runningTaskServiceImpl.getJavaTaskPool(es1Ip, "10049", url), + taskExecutorManager.getExecutor() + ).orTimeout(500, TimeUnit.SECONDS), // 设置5秒超时 + + CompletableFuture.supplyAsync( + () -> runningTaskServiceImpl.getJavaTaskPool(es1Ip, "10050", url), + taskExecutorManager.getExecutor() + ).orTimeout(500, TimeUnit.SECONDS) + + ); + + // 处理结果,添加超时和异常处理 + List javaTaskPoolStatusList = new ArrayList<>(); + + for (CompletableFuture future : futures) { + try { + Map result = future.get(6, TimeUnit.SECONDS); // 总体超时6秒 + javaTaskPoolStatusList.add(result); + } catch (TimeoutException e) { + // 记录超时日志 + javaTaskPoolStatusList.add(createTimeoutResponse()); + } catch (Exception e) { + // 记录异常日志 + javaTaskPoolStatusList.add(createErrorResponse()); + } + } + + // 获取任务池各通道数据 + List shopMd5MapList = runningTaskServiceImpl.selectTaskByGroupShopMd5(); + + Map dataMap = new HashMap(); + dataMap.put("javaTaskPoolStatusList", javaTaskPoolStatusList); + dataMap.put("shopMd5MapList", shopMd5MapList); + return dataMap; + } + + private Map createTimeoutResponse() { + Map timeoutResponse = new HashMap<>(); + timeoutResponse.put("error", "请求超时"); + timeoutResponse.put("active", -2); + timeoutResponse.put("submitted", -2); + timeoutResponse.put("completed", -2); + timeoutResponse.put("shopMd5", "请求超时"); + return timeoutResponse; + } + + private Map createErrorResponse() { + Map errorResponse = new HashMap<>(); + errorResponse.put("error", "请求异常"); + errorResponse.put("active", -3); + errorResponse.put("submitted", -3); + errorResponse.put("completed", -3); + errorResponse.put("shopMd5", "请求异常"); + return errorResponse; + } + + + + /** + * 导出店铺主表列表 + */ + @SaCheckPermission("zhishu:shop:export") + @Log(title = "店铺主表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ShopBo bo, HttpServletResponse response) { + List list = shopService.queryList(bo); + ExcelUtil.exportExcel(list, "店铺主表", ShopVo.class, response); + } + + /** + * 获取闲鱼类目列表 + */ + @GetMapping("/getXyCategoryList") + public TableDataInfo getXyCategoryList() { + List list = xyCategoryService.selectXyCategoryList(); + return TableDataInfo.build(list); + } + + + /** + * 获取店铺主表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shop:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(shopService.queryById(id)); + } + + @SaCheckPermission("zhishu:shop:query") + @GetMapping("/type/{type}") + public List getShopList (@PathVariable String type) { + Long userId = LoginHelper.getUserId(); + return shopService.queryByType(type, userId); + } + + /** + * 新增店铺主表 + */ + @SaCheckPermission("zhishu:shop:add") + @Log(title = "店铺主表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ShopBo bo) { + Boolean mark = false; + +// bo.setShopExpirationTime(DateUtilsUtils.getNextMonths(Integer.parseInt(bo.getPayMonth()))); +// +// bo.setIsExpiration("1"); + + mark = shopService.insertByBo(bo); + + return toAjax(mark); + } + + /** + * 修改店铺主表 + */ + @SaCheckPermission("zhishu:shop:edit") + @Log(title = "店铺主表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ShopBo bo) { + return toAjax(shopService.updateByBo(bo)); + } + + /** + * 删除店铺主表 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:shop:remove") + @Log(title = "店铺主表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(shopService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取店铺主表详细信息 + * + * @param id 主键 + */ + @SaIgnore + @GetMapping("/getShopInfo") + public ShopVo getShopInfo(@NotNull(message = "主键不能为空") Long id) { + return shopService.queryById(id); + } + + /** + * 根据三方店铺Id获取店铺主表详细信息 + * + * @param mailId 主键 + */ + @SaIgnore + @GetMapping("/getShopInfoByMailId") + public ShopVo getShopInfoByMailId(@NotNull(message = "主键不能为空") Long mailId, Integer shopType) { + Integer finalShopType = shopType == null ? 1 : shopType; + return shopService.queryByMailId(mailId, finalShopType); + + } + + /** + * 修改店铺订单更新时间 + * + * @param shopId + * @param startUpdatedAt + * @return + */ + @SaIgnore + @PutMapping("/updateTime") + public Boolean updateTime(@NotNull(message = "主键不能为空") Long shopId, @NotNull(message = "更新时间不能为空") Long startUpdatedAt) { + return shopService.updateTime(shopId, startUpdatedAt); + } + + /** + * 修改店铺是否开启订单状态 + * + * @param shopId + * @param status + * @return + */ + @SaIgnore + @PutMapping("/updateShopIsSynOrder") + public R updateShopIsSynOrder(@NotNull(message = "主键不能为空") Long shopId, @NotNull(message = "店铺订单同步状态不能为空") int status) { + return R.ok(shopService.updateShopIsSynOrder(shopId, status)); + } + + @SaIgnore + @PutMapping("/updateToken") + public Boolean updateToken(@RequestBody UpdateTokenRequest request) { + return shopService.updateToken(request); + } + + /** + * 获取万里牛店铺列表 + * + * @param shopId + * @return + */ + @SaIgnore + @GetMapping("/getWlnShopList") + public R> getWlnShopList(@NotNull(message = "页码不能为空") @RequestParam("page") Integer page, @NotNull(message = "条数不能为空") @RequestParam("limit") Integer limit, @NotNull(message = "店铺Id不能为空") @RequestParam("shopId") Long shopId, String shopNick) { + return R.ok(shopService.getWlnShopList(page, limit, shopId, shopNick)); + } + + /** + * 万里牛店铺授权 + * + * @param shopId + * @param shopName + * @param shopNick + * @return + */ + @SaIgnore + @GetMapping("/authorizationWln") + public R authorizationWln(@NotNull(message = "店铺Id不能为空") Long shopId, @NotNull(message = "万里牛店铺名称不能为空") String shopName, @NotNull(message = "万里牛系统ID不能为空") String shopNick) { + return R.ok(shopService.authorizationWln(shopId, shopName, shopNick)); + } + + /** + * 加密数据 + * + * @param jsonString + * @return + */ + @PostMapping("/encryption") + @SaIgnore + public Map encryption(@RequestBody String jsonString) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + EncryptionDataBo bo = mapper.readValue(jsonString, EncryptionDataBo.class); + // 手动处理shopId字段 + Map result = shopService.encryptionData(bo); + return result; + } + + /** + * 解密数据 + * + * @param data + * @return + */ + @GetMapping("/decryption") + @SaIgnore + public DecryptDataVo decryption(String data) { +// System.out.println("data:" + data); + DecryptDataVo decryptDataVo = shopService.decryptionData(data); + return decryptDataVo; + } + + /** + * 获取解密后的URL列表 + * @param data 加密后的URL + * @return 原始URL列表 + */ + @GetMapping("/getDecryptedUrlList") + @SaIgnore + public Object getDecryptedUrlList(String data) { + try { + Object decryptDataVoList = shopService.decryptDataVoList(data); + return decryptDataVoList; + } catch (Exception e) { + throw new RuntimeException("解密URL列表失败", e); + } + } + + /** + * 获取解密后的URL列表 带前缀SHXY + * @param data 加密后的URL + * @return 原始URL列表 + */ + @GetMapping("/getDecryptedUrlListPrefix") + @SaIgnore + public Object getDecryptedUrlListPrefix(String data) { + try { + // 判断前四位是否为SHXY + if (data == null || data.length() < 4) { + throw new RuntimeException("数据格式错误:数据长度不足4位"); + } + String prefix = data.substring(0, 4); + if (!"SHXY".equals(prefix)) { + throw new RuntimeException("失败:数据前缀不是SHXY"); + } + // 截取掉前四位 + String actualData = data.substring(4); + Object decryptDataVoList = shopService.decryptDataVoList(actualData); + return decryptDataVoList; + } catch (Exception e) { + throw new RuntimeException("解密URL列表失败", e); + } + } + + @GetMapping("/updateShopSkuSpec") + public R updateShopSkuSpec(String shopId,String type){ + // 当前用户id + Long userId = LoginHelper.getUserId(); + if(userId == 1){ + shopService.updateShopSkuSpec(shopId,"服务版本:"+type+",周期:1个月"); + } + return R.ok(); + } + + /** + * 获取店铺绑定的仓库 + */ +// @SaCheckPermission("zhishu:shop:bind") + @GetMapping("/getShopDepot/{shopId}") + public R getShopDepot(@NotNull(message = "店铺ID不能为空") @PathVariable Long shopId) { + // 这里调用service层方法获取店铺绑定的仓库信息 + return R.ok(shopService.getShopDepotByShopId(shopId)); + } + + /** + * 绑定仓库到店铺 + */ +// @SaCheckPermission("zhishu:shop:bind") + @Log(title = "店铺绑定仓库", businessType = BusinessType.UPDATE) + @PostMapping("/bindDepot") + public R bindDepotToShop(@RequestBody Map request) { + // 检查必要的参数是否存在 + if (request.get("shopId") == null) { + return R.fail("shopId参数不能为空"); + } + if (request.get("depotIds") == null) { // 改为 depotIds + return R.fail("depotIds参数不能为空"); + } + + try { + Long shopId = Long.valueOf(request.get("shopId").toString()); + + // 处理depotIds为数组的情况 + Object depotIdsObj = request.get("depotIds"); // 改为 depotIds + List depotIds = new ArrayList<>(); + + if (depotIdsObj instanceof Object[]) { + // 处理Object数组 + Object[] depotIdArray = (Object[]) depotIdsObj; + for (Object item : depotIdArray) { + if (item != null) { + depotIds.add(Long.valueOf(item.toString())); + } + } + } else if (depotIdsObj instanceof List) { + // 处理List + List depotIdList = (List) depotIdsObj; + for (Object item : depotIdList) { + if (item != null) { + depotIds.add(Long.valueOf(item.toString())); + } + } + } else { + return R.fail("depotIds参数格式错误,应为数组"); // 错误信息也更新 + } + + if (depotIds.isEmpty()) { + return R.fail("请至少选择一个仓库进行绑定"); + } + + boolean result = shopService.bindDepotToShop(shopId, depotIds); + return toAjax(result); + } catch (NumberFormatException e) { + return R.fail("参数格式错误,请提供有效的数字ID"); + } catch (Exception e) { + log.error("绑定仓库失败", e); + return R.fail("系统错误,绑定失败"); + } + } + + /** + * 手动开通选品中心按钮操作 + */ + + @PostMapping("/dredgeCenterBook") + @SaCheckPermission("zhishu:shop:centerBook") + @Log(title = "选品中心开通", businessType = BusinessType.UPDATE) + @SaIgnore + public R dredgeCenterBook( + @NotNull(message = "用户ID不能为空") @RequestParam Long userId, + @NotNull(message = "类型不能为空") @RequestParam Integer type) { + try { + String title = type == 1 ? "页面展示会员" : "高级搜索会员"; + String unit = type == 1 ? "年" : "月"; + String price = type == 1 ? "198000" : "9800"; + String orederType = type == 1 ? "centerBookPage" : "centerBookSearch"; + Map orderParams = new HashMap<>(); + orderParams.put("service_name", title); + orderParams.put("price", price); + orderParams.put("unit", unit); + orderParams.put("length", String.valueOf(1)); + orderParams.put("type", orederType); + orderParams.put("sort", "1"); + String orderUrl = configService.selectConfigByKey("order.url"); + String service = InterfaceUtils.postForm(orderUrl, "/api/createService", orderParams); +// String service = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/createService", params); + if (service != null) { + JSONObject jsonObject = JSONObject.parseObject(service); + if (jsonObject != null && jsonObject.containsKey("data")) { + String serviceId = jsonObject.getString("data"); + orderParams.put("serviceId", serviceId); + } + } + // 新增新后台订单表插入 + Map params1 = new HashMap<>(); + params1.put("orderType", "centerBookPage"); + params1.put("userId", String.valueOf(userId)); + params1.put("goodsId", orderParams.get("serviceId")); + params1.put("count", "1"); + String orderId = null; + String order = InterfaceUtils.postForm("https://go.order.service.buzhiyushu.cn/", "/api/orders/createOrder", params1); + System.out.println("order:"+order); + if (order != null) { + JSONObject jsonObject = JSONObject.parseObject(order); + if (jsonObject != null && jsonObject.containsKey("data")) { + JSONObject dataObject = jsonObject.getJSONObject("data"); + // 再从data对象中获取orderId + orderId = dataObject.getString("orderId"); + System.out.println("orderId:"+orderId); + params1.put("orderId", orderId); + } + } + // 获取外部接口地址 + String goUrl = configService.selectConfigByKey("go.url"); + String path = "/user/updateMemberRecord"; + + // 构建请求参数 + Map params = new HashMap<>(); + params.put("userId", userId); + params.put("type", type); + + // 调用外部接口 + String result = InterfaceUtils.getInterfacePost(goUrl, path, params); + System.out.println("result:" + result); + if (result != null && !result.isEmpty()) { + log.info("选品中心开通成功,用户ID: {}, 类型: {}, 返回结果: {}", userId, type, result); + // 解析返回的JSON + JSONObject json = JSON.parseObject(result); + int code = json.getIntValue("code"); + String msg = json.getString("msg"); + if (Objects.equals(msg, "会员记录更新成功")) { + // 修改新后台新订单表 + if (orderId != null){ + Map map1 = new HashMap(); + map1.put("orderId",orderId); + map1.put("orderInfo", "{\"remark\":\"管理员手动新增会员\"}"); + map1.put("userId",String.valueOf(userId)); + String interfaceGet = InterfaceUtils.postForm(orderUrl, "/api/orders/orderForPay", map1); + System.out.println("充值结果: "+interfaceGet); + Map orderSuccess = JsonUtils.parseObject(interfaceGet,Map.class); + Integer orderCode = (Integer) orderSuccess.get("code"); + if (orderCode == null || code != 200) { + // 这里可以打印日志或抛异常 + System.err.println("更新服务失败,返回结果:" + orderSuccess); + return R.fail("更新服务失败"+orderSuccess); + } + + } + } + Object data = json.get("data"); + if (data instanceof JSONObject dataJson) { + // 获取 data 中的字段 + String userId1 = dataJson.getString("user_id"); + SysUser user = sysUserMapper.selectUserById(Long.valueOf(userId1)); + if (user != null && user.getPhonenumber() != null){ + dataJson.put("phone", user.getPhonenumber()); + } else { + dataJson.put("phone", ""); + } + data = dataJson; + } + + // 根据 Go 返回的 code 自适应响应 + if (code == 200 || code == 201) { + return R.ok(msg, data); + } else { + return R.fail(msg, data); + } + } else { + log.error("选品中心开通失败,用户ID: {}, 类型: {}", userId, type); + return R.fail("开通失败,请稍后重试"); + } + } catch (Exception e) { + log.error("选品中心开通异常,用户ID: {}, 类型: {}", userId, type, e); + return R.fail("系统异常,开通失败"); + } + } + + @GetMapping("/todayGoods") + public Map selectTodayGoods() { + + List shopId = shopMapper.getShopIdByCreateBy(LoginHelper.getUserId()); + return runningTaskByShopServiceImpl.selectTodayGoods(shopId); + } + + @GetMapping("/todaySales") + public Map selectTodaySales() { + List shopId = shopMapper.getShopIdByCreateBy(LoginHelper.getUserId()); + return runningTaskByShopServiceImpl.selectTodaySales(shopId); + } + + @GetMapping("/limitedTimeFree") + public R limitedTimeFree(String id,String priceStr){ + System.out.println(id); + Long userId = LoginHelper.getUserId(); + ShopVo shopVo = shopService.queryById(Long.parseLong(id)); + SysUser user = sysUserMapper.queryUserByUserId(userId); + BigDecimal price = new BigDecimal(priceStr).multiply(new BigDecimal(100)); + BigDecimal balanceOld = user.getBalance(); + if (balanceOld.compareTo(price) < 0){ + return R.fail("余额不足,请前往钱包进行用户充值"); + } + BigDecimal balanceNew = balanceOld.subtract(price); + user.setBalance(balanceNew); + sysUserMapper.updateBalance(userId,user.getBalance().longValue()); + + UserRechargeBo userRechargeBo = new UserRechargeBo(); + userRechargeBo.setCommission(BigDecimal.ZERO); + userRechargeBo.setRechargPrice(price); + userRechargeBo.setRechargType("6"); + userRechargeBo.setStatus("6"); + userRechargeBo.setUserId(userId); + userRechargeBo.setCreateBy(userId); + userRechargeBo.setUpdateBy(userId); + userRechargeBo.setLogTxt("拼多多店铺:"+shopVo.getShopName()+"试用版解除上架限制"); + userRechargeBo.setOriginalPrice(balanceOld); + userRechargeBo.setUpdatePrice(balanceNew); + userRechargeService.insertByBo(userRechargeBo); + + ShopBo shopBo = new ShopBo(); + shopBo.setId(Long.parseLong(id)); + shopBo.setDeregulation("2"); + shopService.updateByBo(shopBo); + + return R.ok("订购成功"); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopDetailController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopDetailController.java new file mode 100644 index 0000000..411ae00 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopDetailController.java @@ -0,0 +1,114 @@ +package org.dromara.zhishu.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.zhishu.util.UploadUtil; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.zhishu.domain.bo.ShopDetailBo; +import org.dromara.zhishu.service.IShopDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 商品详情 + * + * @author yxy + * @date 2025-03-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopDetail") +public class ShopDetailController extends BaseController { + + private final IShopDetailService shopDetailService; + + /** + * 查询商品详情列表 + */ + @SaCheckPermission("zhishu:shopDetail:list") + @GetMapping("/list") + public TableDataInfo list(ShopDetailBo bo, PageQuery pageQuery) { + return shopDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出商品详情列表 + */ + @SaCheckPermission("zhishu:shopDetail:export") + @Log(title = "商品详情", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ShopDetailBo bo, HttpServletResponse response) { + List list = shopDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "商品详情", ShopDetailVo.class, response); + } + + /** + * 获取商品详情详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shop:setUp") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(shopDetailService.queryByShopId(id)); + } + + /** + * 新增商品详情 + */ + @SaCheckPermission("zhishu:shopDetail:add") + @Log(title = "商品详情", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ShopDetailBo bo) { + return toAjax(shopDetailService.insertByBo(bo)); + } + + /** + * 修改商品详情 + */ + @SaCheckPermission("zhishu:shopDetail:edit") + @Log(title = "商品详情", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ShopDetailBo bo) { + return toAjax(shopDetailService.updateByBo(bo)); + } + + /** + * 删除商品详情 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:shopDetail:remove") + @Log(title = "商品详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(shopDetailService.deleteWithValidByIds(List.of(ids), true)); + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedController.java new file mode 100644 index 0000000..063efc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedController.java @@ -0,0 +1,224 @@ +package org.dromara.zhishu.controller; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSON; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.ShopGoodsRejection; +import org.dromara.zhishu.domain.vo.PlatformIdUpdateVO; +import org.dromara.zhishu.service.IRunningTaskByShopService; +import org.dromara.zhishu.service.ShopGoodsRejectionService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.ShopGoodsPublishedVo; +import org.dromara.zhishu.domain.bo.ShopGoodsPublishedBo; +import org.dromara.zhishu.service.IShopGoodsPublishedService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 记录已发布书籍 + * + * @author yxy + * @date 2025-04-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopGoodsPublished") +public class ShopGoodsPublishedController extends BaseController { + + private final IShopGoodsPublishedService shopGoodsPublishedService; + + private final IRunningTaskByShopService runningTaskByShopService; + + + /** + * 查询记录已发布书籍列表 + */ + @SaCheckPermission("zhishu:shopGoodsPublished:list") + @GetMapping("/list") + public TableDataInfo list(ShopGoodsPublishedBo bo, PageQuery pageQuery) { + // 获取当前登录用户的ID + Long userId = LoginHelper.getUserId(); + bo.setCreateBy(userId); + return shopGoodsPublishedService.selectDataList(bo, pageQuery); + } + + @SaIgnore + @GetMapping("/pddAdd/{platformId}/{goodsId}/{shopId}/{userId}") + public void pddAdd(@PathVariable("platformId") String platformId, + @PathVariable("goodsId") String goodsId, + @PathVariable("shopId") String shopId, + @PathVariable("userId") String userId) { + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + shopGoodsPublishedBo.setPlatformId(platformId); + shopGoodsPublishedBo.setShopGoodsId(goodsId); + shopGoodsPublishedBo.setShopId(shopId); + shopGoodsPublishedBo.setCreateBy(Long.parseLong(userId)); + shopGoodsPublishedBo.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + shopGoodsPublishedBo.setUpdateTime(DateUtils.parseDate(DateUtils.getTime())); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + } + + /** + * 导出记录已发布书籍列表 + */ + @SaCheckPermission("zhishu:shopGoodsPublished:export") + @Log(title = "记录已发布书籍", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ShopGoodsPublishedBo bo, HttpServletResponse response) { + List list = shopGoodsPublishedService.queryList(bo); + ExcelUtil.exportExcel(list, "记录已发布书籍", ShopGoodsPublishedVo.class, response); + } + + /** + * 获取记录已发布书籍详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shopGoodsPublished:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(shopGoodsPublishedService.queryById(id)); + } + + /** + * 新增记录已发布书籍 + */ + @SaCheckPermission("zhishu:shopGoodsPublished:add") + @Log(title = "记录已发布书籍", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ShopGoodsPublishedBo bo) { + return toAjax(shopGoodsPublishedService.insertByBo(bo)); + } + + /** + * 修改记录已发布书籍 + */ + @SaCheckPermission("zhishu:shopGoodsPublished:edit") + @Log(title = "记录已发布书籍", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ShopGoodsPublishedBo bo) { + return toAjax(shopGoodsPublishedService.updateByBo(bo)); + } + + /** + * 删除记录已发布书籍 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:shopGoodsPublished:remove") + @Log(title = "记录已发布书籍", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(shopGoodsPublishedService.deleteWithValidByIds(List.of(ids), true)); + } + + @SaCheckPermission("zhishu:shopGoodsPublished:remove") + @Log(title = "记录已发布书籍删除全部", businessType = BusinessType.DELETE) + @DeleteMapping("/removeAll") + public Map removeAll(Long shopId){ + Map map = new HashMap(); + String msg = shopGoodsPublishedService.deleteAll(shopId); + if(msg.contains("成功")){ + map.put("code",200); + }else{ + map.put("code",500); + } + map.put("msg",msg); + return map; + } + + /** + * 根据店铺Id查询商品列表 + */ + @PostMapping("/getListByShopId") + @SaIgnore + public List getListByShopId(Long shopId, @RequestBody List platformIds) { + return shopGoodsPublishedService.selectGoodsListByShopId(shopId, platformIds); + } + + /** + * 根据店铺Id查询商品列表 + */ + @GetMapping("/getListByShopId") + @SaIgnore + public List getListByShopId(Long shopId) { + return shopGoodsPublishedService.selectGoodsListByShopId(shopId); + } + + /** + * 商品发布驳回-类目修改cat_id + */ + @GetMapping("/uodateCatId") + @SaIgnore + public Boolean uodateCatId(String shopType, Long mallId, String platformId) { + return shopGoodsPublishedService.uodateCatId(shopType, mallId, platformId); + } + + /** + * 根据店铺Id和商品Id删除失败的商品 + */ + @GetMapping("/delShopGoodsPublished") + @SaIgnore + public Boolean delShopGoodsPublished(String shopType, Long mallId, String platformId, String rejectComment) { + return shopGoodsPublishedService.delShopGoodsPublished(shopType, mallId, platformId, rejectComment); + } + + /** + * 更新孔网商品id + */ + @PostMapping("/batchUpdateKfzPlatformId") + @SaIgnore + public R batchUpdateKfzPlatformId(@RequestBody List platformIdUpdateVOList) { + shopGoodsPublishedService.batchUpdateKfzPlatformId(platformIdUpdateVOList); +// System.out.println("platformIdUpdateVOList:" + JSON.toJSONString(platformIdUpdateVOList)); + return R.ok(); + } + + /** + * 根据店铺Id和商品Id删除失败的商品 + */ + @GetMapping("/insertShopGoodsPublishedlog") + @SaIgnore + public void insertShopGoodsPublishedlog(String shopType, Long mallId, String platformId, String offshelftime) { + shopGoodsPublishedService.insertLog(shopType, mallId, platformId, offshelftime); + } + + + /** + * 已发布商品记录校验店铺商品 + */ + @PostMapping("/verifyShopGoodsPublished") + public R verifyShopGoodsPublished(String shopId){ + // 异步执行耗时任务 + CompletableFuture.runAsync(() -> { + shopGoodsPublishedService.verifyShopGoodsPublished(shopId); + }); + return R.ok("任务已提交,请前往任务列表查询结果"); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedLogController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedLogController.java new file mode 100644 index 0000000..e95b1df --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsPublishedLogController.java @@ -0,0 +1,44 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; +import org.dromara.zhishu.domain.StockChangeLog; +import org.dromara.zhishu.service.ShopGoodsPublishedLogService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 记录已发布书籍 + * + * @author yxy + * @date 2025-04-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopGoodsPublishedLog") +public class ShopGoodsPublishedLogController { + + private final ShopGoodsPublishedLogService shopGoodsPublishedLogService; + + /** + * 通过平台商品id和相关Id查询商品发布记录 + */ + @GetMapping("/queryPublishedLogByOrderSn") + @SaIgnore + public R queryPublishedLogByOrderSn(@NotNull(message = "平台订单编码不能为空") String platformId, + @NotNull(message = "日志类型不能为空") String aboutId, + @NotNull(message = "平台类型不能为空") Integer platformType, + @NotNull(message = "日志类型不能为空") Integer logType, + @NotNull(message = "操作类型不能为空") Integer operationType + ) { + ShopGoodsPublishedLog log = shopGoodsPublishedLogService.queryPublishedLogByOrderSn(platformId, aboutId, platformType, logType, operationType); + return R.ok(log); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsRejectionController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsRejectionController.java new file mode 100644 index 0000000..de3fc4e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ShopGoodsRejectionController.java @@ -0,0 +1,206 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; +import org.dromara.zhishu.domain.ShopGoodsRejection; +import org.dromara.zhishu.domain.vo.ShopGoodsPublishedVo; +import org.dromara.zhishu.service.ShopGoodsPublishedLogService; +import org.dromara.zhishu.service.ShopGoodsRejectionService; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +/** + * 记录已发布书籍 + * + * @author yxy + * @date 2025-04-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopgoodsrejection") +public class ShopGoodsRejectionController { + + private final ShopGoodsRejectionService shopGoodsRejectionService; + + /** + * 分页查询列表 + */ + @GetMapping("/list") + public TableDataInfo list(ShopGoodsRejection bo, PageQuery pageQuery) { + TableDataInfo list = shopGoodsRejectionService.searchWithPage(bo,pageQuery); + + return list; + } + + /** + * 根据ID查询详情 + */ + @GetMapping("/{id}") + public ResponseEntity> getById(@PathVariable Long id) { + Map result = new HashMap<>(); + try { + ShopGoodsRejection rejection = shopGoodsRejectionService.findById(id); + if (rejection != null) { + result.put("success", true); + result.put("data", rejection); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "记录不存在"); + return ResponseEntity.notFound().build(); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + + /** + * 新增记录 + */ + @PostMapping("/add") + public ResponseEntity> create(@RequestBody ShopGoodsRejection shopGoodsRejection) { + Map result = new HashMap<>(); + try { + boolean success = shopGoodsRejectionService.save(shopGoodsRejection); + if (success) { + result.put("success", true); + result.put("message", "新增成功"); + result.put("data", shopGoodsRejection); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "新增失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "新增失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + + /** + * 更新记录 + */ + @PutMapping("/{id}") + public ResponseEntity> update(@PathVariable Long id, @RequestBody ShopGoodsRejection shopGoodsRejection) { + Map result = new HashMap<>(); + try { + // 设置ID + shopGoodsRejection.setId(id); + boolean success = shopGoodsRejectionService.update(shopGoodsRejection); + if (success) { + result.put("success", true); + result.put("message", "更新成功"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "更新失败,记录可能不存在"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "更新失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + + /** + * 删除记录 + */ + @DeleteMapping("/{id}") + public ResponseEntity> delete(@PathVariable Long id) { + Map result = new HashMap<>(); + try { + boolean success = shopGoodsRejectionService.delete(id); + if (success) { + result.put("success", true); + result.put("message", "删除成功"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "删除失败,记录可能不存在"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "删除失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + + /** + * 批量删除 + */ + @DeleteMapping("/batch") + public ResponseEntity> batchDelete(@RequestBody List ids) { + Map result = new HashMap<>(); + try { + int successCount = 0; + for (Long id : ids) { + if (shopGoodsRejectionService.delete(id)) { + successCount++; + } + } + result.put("success", true); + result.put("message", "成功删除 " + successCount + " 条记录"); + result.put("successCount", successCount); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "批量删除失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + + /** + * 根据店铺ID查询 + */ + @GetMapping("/shop/{shopId}") + public ResponseEntity> getByShopId(@PathVariable String shopId) { + Map result = new HashMap<>(); + try { + List list = shopGoodsRejectionService.findByShopId(shopId); + result.put("success", true); + result.put("data", list); + result.put("total", list.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + + /** + * 根据平台商品ID查询 + */ + @GetMapping("/platform/{platformId}") + public ResponseEntity> getByPlatformId(@PathVariable String platformId) { + Map result = new HashMap<>(); + try { + List list = shopGoodsRejectionService.findByPlatformId(platformId); + result.put("success", true); + result.put("data", list); + result.put("total", list.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询失败: " + e.getMessage()); + return ResponseEntity.badRequest().body(result); + } + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SinglePrintController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SinglePrintController.java new file mode 100644 index 0000000..6d9c4b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SinglePrintController.java @@ -0,0 +1,181 @@ +package org.dromara.zhishu.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.zhishu.domain.SinglePrint; +import org.dromara.zhishu.domain.bo.PrinterBo; +import org.dromara.zhishu.domain.vo.FastMailVo; +import org.dromara.zhishu.domain.vo.PrinterVo; +import org.dromara.zhishu.domain.vo.TLogisticsVo; +import org.dromara.zhishu.service.IFastMailService; +import org.dromara.zhishu.service.IPrinterService; +import org.dromara.zhishu.service.ITLogisticsService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.bo.SinglePrintBo; +import org.dromara.zhishu.service.ISinglePrintService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 单票打印 + * + * @author yxy + * @date 2026-03-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/singlePrint") +public class SinglePrintController extends BaseController { + + private final ISinglePrintService singlePrintService; + private final IFastMailService fastMailService; + private final ITLogisticsService logisticsService; + private final IPrinterService printerService; + + /** + * 查询单票打印列表 + */ + @SaCheckPermission("zhishu:singlePrint:list") + @GetMapping("/list") + public TableDataInfo list(SinglePrintBo bo, PageQuery pageQuery) { + return singlePrintService.queryPageList(bo, pageQuery); + } + + /** + * 导出单票打印列表 + */ + @SaCheckPermission("zhishu:singlePrint:export") + @Log(title = "单票打印", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SinglePrintBo bo, HttpServletResponse response) { + List list = singlePrintService.queryList(bo); + ExcelUtil.exportExcel(list, "单票打印", SinglePrint.class, response); + } + + /** + * 获取单票打印详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:singlePrint:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(singlePrintService.queryById(id)); + } + + /** + * 根据快递单号获取单票打印信息 + * + * @param mailNo 快递单号 + */ + @SaCheckPermission("zhishu:singlePrint:query") + @GetMapping("/getByMailNo/{mailNo}") + public R getInfoByMailNo(@NotNull(message = "快递单号不能为空") + @PathVariable String mailNo) { + return R.ok(singlePrintService.queryByMailNo(mailNo)); + } + + + @PostMapping("/add") + public R add(@RequestBody Map dataMap){ + // 运费模板 + String logisticsId = dataMap.get("logisticsData").toString(); + TLogisticsVo logisticsVo = logisticsService.queryById(Long.parseLong(logisticsId)); + dataMap.put("logisticsVo", JsonUtils.toJsonString(logisticsVo)); + // 快递账号 + String fastMailId = dataMap.get("fastMailId").toString(); + FastMailVo fastMailVo = fastMailService.queryById(Long.parseLong(fastMailId)); + dataMap.put("fastMailVo",JsonUtils.toJsonString(fastMailVo)); + // 根据当前时间戳+5位随机数生成 orderSn + // 获取当前时间戳(毫秒) + long timestamp = System.currentTimeMillis(); + // 生成5位随机数(10000-99999) + int randomNum = new Random().nextInt(90000) + 10000; + String orderSn = timestamp + String.valueOf(randomNum); + dataMap.put("orderSn",orderSn); + String data = InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/singlePrint/addSinglePrint",dataMap); + Map mapData = JsonUtil.transferToObj(data,Map.class); + return R.ok(mapData); + } + + @GetMapping("/printOne") + public R printOne(String id){ + String res = InterfaceUtils.getInterface(UrlUtil.getOrderServiceUrl(),"/api/singlePrint/printOne?id="+id); + Map resMap = JsonUtil.transferToObj(res,Map.class); + return R.ok(resMap); + } + + @PostMapping("/pddCloudPrint") + public R pddCloudPrint(@RequestBody Map dataMap){ + if(dataMap.get("fastMailId") != null){ + // 不为空则需要手动查询一下快递账号的token + FastMailVo fastMailVo = fastMailService.queryById(Long.parseLong(dataMap.get("fastMailId").toString())); + Map remarkMap = JsonUtil.transferToObj(fastMailVo.getRemark(),Map.class); + dataMap.put("accessToken",remarkMap.get("token").toString()); + } + String printerId = dataMap.get("printerId").toString(); + PrinterVo printerVo = printerService.queryById(Long.parseLong(printerId)); + dataMap.put("printer",printerVo); + Map data = new HashMap(); + data.put("data",JsonUtil.transferToJson(dataMap)); + String str = InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/pddCloudPrint/pddCloudPrint",data); + return R.ok(); + } + + @GetMapping("/cancelBmOrder") + public R cancelBmOrder(String id){ + String res = InterfaceUtils.getInterface(UrlUtil.getOrderServiceUrl(),"/api/singlePrint/cancelBmOrder?id="+id); + Map resMap = JsonUtil.transferToObj(res,Map.class); + if (resMap.get("code").equals("200")){ + return R.ok(resMap.get("msg").toString()); + }else{ + return R.fail(resMap.get("msg").toString()); + } + } + + + /** + * 删除单票打印 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:singlePrint:remove") + @Log(title = "单票打印", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(singlePrintService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 根据快递单号删除 + * + * @param mailNo 快递单号 + */ + @SaCheckPermission("zhishu:singlePrint:remove") + @Log(title = "单票打印", businessType = BusinessType.DELETE) + @DeleteMapping("/deleteByMailNo/{mailNo}") + public R removeByMailNo(@NotNull(message = "快递单号不能为空") + @PathVariable String mailNo) { + return toAjax(singlePrintService.deleteByMailNo(mailNo)); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SynchronizationShopLogController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SynchronizationShopLogController.java new file mode 100644 index 0000000..9a3058c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/SynchronizationShopLogController.java @@ -0,0 +1,74 @@ +package org.dromara.zhishu.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.zhishu.domain.SynchronizationShopLog; +import org.dromara.zhishu.domain.bo.SynchronizationShopLogBo; +import org.dromara.zhishu.domain.vo.SynchronizationShopLogVo; +import org.dromara.zhishu.service.ISynchronizationShopLogService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 同步店铺商品库存日志 + * + * @author yxy + * @date 2026-04-14 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/synchronizationShopLog") +public class SynchronizationShopLogController extends BaseController { + + private final ISynchronizationShopLogService synchronizationShopLogService; + + /** + * 查询同步店铺商品库存日志列表 + */ + @SaCheckPermission("zhishu:synchronizationShopLog:list") + @GetMapping("/list") + public TableDataInfo> list(SynchronizationShopLogBo bo, PageQuery pageQuery) { + return synchronizationShopLogService.queryPageList(bo, pageQuery); + } + + @GetMapping("/getLogList") + public List getLogList(SynchronizationShopLogBo bo){ + return synchronizationShopLogService.queryList(bo); + } + + /** + * 导出同步店铺商品库存日志列表 + */ + @SaCheckPermission("zhishu:synchronizationShopLog:export") + @Log(title = "同步店铺商品库存日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SynchronizationShopLogBo bo, HttpServletResponse response) { + List list = synchronizationShopLogService.queryList(bo); + ExcelUtil.exportExcel(list, "同步店铺商品库存日志", SynchronizationShopLogVo.class, response); + } + + /** + * 获取同步店铺商品库存日志详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:synchronizationShopLog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(synchronizationShopLogService.queryById(id)); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TAuditController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TAuditController.java new file mode 100644 index 0000000..f3f1b1a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TAuditController.java @@ -0,0 +1,139 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import io.github.linpeilie.BaseMapper; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.TAuditVo; +import org.dromara.zhishu.domain.bo.TAuditBo; +import org.dromara.zhishu.service.ITAuditService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 审核 + * + * @author Lion Li + * @date 2025-04-01 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/audit") +public class TAuditController extends BaseController { + + @Autowired + private final ITAuditService tAuditService; + + + /** + * 查询审核列表 + */ + @SaCheckPermission("zhishu:audit:list") + @GetMapping("/list") + public TableDataInfo list(TAuditBo bo, PageQuery pageQuery) { + return tAuditService.queryPageList(bo, pageQuery); + } + + /** + * 导出审核列表 + */ + @SaCheckPermission("zhishu:audit:export") + @Log(title = "审核", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TAuditBo bo, HttpServletResponse response) { + List list = tAuditService.queryList(bo); + ExcelUtil.exportExcel(list, "审核", TAuditVo.class, response); + } + + /** + * 获取审核详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:audit:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tAuditService.queryById(id)); + } + + /** + * 新增审核 + */ + @SaCheckPermission("zhishu:audit:add") + @Log(title = "审核", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TAuditBo bo) { + return toAjax(tAuditService.insertByBo(bo)); + } + + /** + * 修改审核 + */ +// @SaCheckPermission("zhishu:audit:edit") + @Log(title = "审核", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TAuditBo bo) { + return toAjax(tAuditService.updateByBo(bo)); + } + + /** + * 删除审核 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:audit:remove") + @Log(title = "审核", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tAuditService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 修改审核通过状态 + * + */ +// @SaCheckPermission("zhishu:audit:updateStatus") + @Log(title = "审核状态", businessType = BusinessType.UPDATE) + @PutMapping("/updateStatus") + public R updateStatus(@RequestBody TAuditBo bo) { + return toAjax(tAuditService.updateByStatus(bo)); + } + + + /** + * 修改审核未通过状态 + * + */ +// @SaCheckPermission("zhishu:audit:updateStatus") +// @Log(title = "审核状态", businessType = BusinessType.INSERT) + @PostMapping("/failSend") + public R failSend(@RequestBody TAuditBo bo) { + //修改审核状态,为未通过(1) + tAuditService.updateByStatus(bo); + //将修改内容写入t_audit_log的日志表里 + Integer message = tAuditService.InsertLog(bo); + return toAjax(message); + } + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TBookAuditController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TBookAuditController.java new file mode 100644 index 0000000..224eb8f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TBookAuditController.java @@ -0,0 +1,115 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.TBookAuditVo; +import org.dromara.zhishu.domain.bo.TBookAuditBo; +import org.dromara.zhishu.service.ITBookAuditService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 图书审核管理 + * + * @author Lion Li + * @date 2025-04-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/bookAudit") +public class TBookAuditController extends BaseController { + + private final ITBookAuditService tBookAuditService; + + /** + * 查询图书审核管理列表 + */ + @SaCheckPermission("zhishu:bookAudit:list") + @GetMapping("/list") + public TableDataInfo list(TBookAuditBo bo, PageQuery pageQuery) { + return tBookAuditService.queryPageList(bo, pageQuery); + } + + /** + * 导出图书审核管理列表 + */ + @SaCheckPermission("zhishu:bookAudit:export") + @Log(title = "图书审核管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TBookAuditBo bo, HttpServletResponse response) { + List list = tBookAuditService.queryList(bo); + ExcelUtil.exportExcel(list, "图书审核管理", TBookAuditVo.class, response); + } + + /** + * 获取图书审核管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:bookAudit:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tBookAuditService.queryById(id)); + } + + /** + * 新增图书审核管理 + */ + @SaCheckPermission("zhishu:bookAudit:add") + @Log(title = "图书审核管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TBookAuditBo bo) { + return toAjax(tBookAuditService.insertByBo(bo)); + } + + /** + * 修改图书审核管理 + */ + @SaCheckPermission("zhishu:bookAudit:edit") + @Log(title = "图书审核管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TBookAuditBo bo) { + return toAjax(tBookAuditService.updateByBo(bo)); + } + + /** + * 删除图书审核管理 + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:bookAudit:remove") + @Log(title = "图书审核管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tBookAuditService.deleteWithValidByIds(List.of(ids), true)); + } + + + /** + * 修改图书审核状态 + */ + @Log(title = "图书审核管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/updateStatus") + public R updateStatus(@Validated(EditGroup.class) @RequestBody TBookAuditBo bo) { + return toAjax(tBookAuditService.updateStatus(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDepotController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDepotController.java new file mode 100644 index 0000000..afb13ca --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDepotController.java @@ -0,0 +1,174 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.bo.TDepotBo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; +import org.dromara.zhishu.service.ITDepotService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 仓库信息设置 + * + * @author Lion Li + * @date 2025-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/depot/depot") +public class TDepotController extends BaseController { + + private final ITDepotService tDepotService; + + + /** + * 查询仓库信息设置列表 + */ + @SaCheckPermission("depot:depot:list") + @GetMapping("/list") + public TableDataInfo list(TDepotBo bo, PageQuery pageQuery) { + return tDepotService.queryPageList(bo, pageQuery); + } + + + /** + * 导出仓库信息设置列表 + */ + @SaCheckPermission("depot:depot:export") + @Log(title = "仓库信息设置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TDepotBo bo, HttpServletResponse response) { + List list = tDepotService.queryList(bo); + ExcelUtil.exportExcel(list, "仓库信息设置", TDepotVo.class, response); + } + + /** + * 获取仓库信息设置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("depot:depot:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tDepotService.queryById(id)); + } + + /** + * 新增仓库信息设置 + */ + @SaCheckPermission("depot:depot:add") + @Log(title = "仓库信息设置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + @SaIgnore + public R add(@Validated(AddGroup.class) @RequestBody TDepotBo bo) { + try{ + tDepotService.insertByBo(bo); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } +// return toAjax(tDepotService.insertByBo(bo)); + return R.ok(bo); + } + + /** + * 修改仓库信息设置 + */ + @SaCheckPermission("depot:depot:edit") + @Log(title = "仓库信息设置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + @SaIgnore + public R edit(@Validated(EditGroup.class) @RequestBody TDepotBo bo) { + try{ + tDepotService.updateByBo(bo); + }catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + return R.ok(bo); + } + + /** + * 删除仓库信息设置 + * + * @param ids 主键串 + */ + @SaCheckPermission("depot:depot:remove") + @Log(title = "仓库信息设置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @SaIgnore + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids, + @RequestParam(required = false) Long LocalUserId) { + return toAjax(tDepotService.deleteWithValidByIds(List.of(ids), true,LocalUserId)); + } + + @GetMapping("/getIds") + public Map getIds(@RequestParam String depotName, + @RequestParam String freightName, + @RequestParam String shelvesName) { + return tDepotService.getIds(depotName, freightName, shelvesName); + } + + /** + * 获取二级货区信息 + * @param id + * @return + */ + @GetMapping("/shelves/{id}") + public R> getSheInfo(@PathVariable Long id) { + List list =tDepotService.queryShelvesList(id); + System.out.println(list); + return R.ok(list); + } + + /** + * 获取三级货区信息 + * @param id + * @return + */ + @GetMapping("/freight/{id}") + public R> getFreInfo(@PathVariable Long id) { + List list =tDepotService.queryTFreightList(id); + System.out.println(list); + return R.ok(list); + } + + @GetMapping("/getDepotAll") + public TableDataInfo getDepotAll(){ + List list = tDepotService.queryListAll(); + return TableDataInfo.build(list); + } + + @GetMapping("/getDepotId") + @SaIgnore + public TableDataInfo getDepotId(Long userId,String code){ + List list = tDepotService.selectDepotIdByUserIdAndCode(userId,code); + return TableDataInfo.build(list); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDistrictController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDistrictController.java new file mode 100644 index 0000000..af347ba --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TDistrictController.java @@ -0,0 +1,209 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.bo.TDistrictBo; +import org.dromara.zhishu.domain.vo.DistrictsVo; +import org.dromara.zhishu.domain.vo.TDistrictVo; +import org.dromara.zhishu.service.ITDistrictService; +import org.dromara.zhishu.util.JsonExporterUtils; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/district") +public class TDistrictController extends BaseController { + + private final ITDistrictService tDistrictService; + + /** + * 查询【请填写功能名称】列表 + */ + @SaCheckPermission("system:district:list") + @GetMapping("/list") + public TableDataInfo list(TDistrictBo bo, PageQuery pageQuery) { + return tDistrictService.queryPageList(bo, pageQuery); + } + + /** + * 导出【请填写功能名称】列表 + */ + @SaCheckPermission("system:district:export") + @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TDistrictBo bo, HttpServletResponse response) { + List list = tDistrictService.queryList(bo); + ExcelUtil.exportExcel(list, "【请填写功能名称】", TDistrictVo.class, response); + } + + /** + * 获取【请填写功能名称】详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:district:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(tDistrictService.queryById(id)); + } + + /** + * 新增【请填写功能名称】 + */ + @SaCheckPermission("system:district:add") + @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TDistrictBo bo) { + return toAjax(tDistrictService.insertByBo(bo)); + } + + /** + * 修改【请填写功能名称】 + */ + @SaCheckPermission("system:district:edit") + @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TDistrictBo bo) { + return toAjax(tDistrictService.updateByBo(bo)); + } + + /** + * 删除【请填写功能名称】 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:district:remove") + @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(tDistrictService.deleteWithValidByIds(List.of(ids), true)); + } + + @GetMapping("/getDistrictTree") + public List> getDistrictTree(){ + List> mapList = new ArrayList<>(); + List list = tDistrictService.selectDistrictByPid("0"); + for(TDistrictVo districtVo : list){ + Map map = new HashMap<>(); + map.put("value", districtVo.getId()); + map.put("label", districtVo.getName()); + //获取市 + List> childrenMapList = new ArrayList<>(); + List childrenList = tDistrictService.selectDistrictByPid(String.valueOf(districtVo.getId())); + for(TDistrictVo children : childrenList){ + Map childrenMap = new HashMap<>(); + childrenMap.put("value", children.getId()); + childrenMap.put("label", children.getName()); + + List> childrenMapTwoList = new ArrayList<>(); + List childrenTwoList = tDistrictService.selectDistrictByPid(String.valueOf(children.getId())); + for (TDistrictVo childrenTwo : childrenTwoList){ + Map childrenTwoMap = new HashMap<>(); + childrenTwoMap.put("value", childrenTwo.getId()); + childrenTwoMap.put("label", childrenTwo.getName()); + childrenMapTwoList.add(childrenTwoMap); + } + childrenMap.put("children", childrenMapTwoList); + + childrenMapList.add(childrenMap); + } + map.put("children", childrenMapList); + mapList.add(map); + } + return mapList; + } + + /** + * 获取所有省级数据 + */ + @SaIgnore + @GetMapping("/provinces") + public R> getProvinces() { + TDistrictBo bo = new TDistrictBo(); + bo.setLevel(0L); // 省级数据level=0 + bo.setStatus(0L); // 状态正常 + return R.ok(tDistrictService.selectList()); + } + + /** + * 根据省ID获取市级数据 + * + * @param provinceId 省ID + */ + @SaIgnore + @GetMapping("/cities/{provinceId}") + public R> getCitiesByProvinceId(@PathVariable Long provinceId) { + TDistrictVo vo = new TDistrictVo(); + vo.setPid(provinceId); // 父ID为省ID + vo.setLevel(1L); // 市级数据level=1 + vo.setStatus(0L); // 状态正常 + return R.ok(tDistrictService.selectCityList(vo)); + } + + /** + * 根据市ID获取区县级数据 + * + * @param cityId 市ID + */ + @SaIgnore + @GetMapping("/districts/{cityId}") + public R> getDistrictsByCityId(@PathVariable Long cityId) { + TDistrictVo vo = new TDistrictVo(); + vo.setPid(cityId); // 父ID为市ID + vo.setLevel(2L); // 区县级数据level=2 + vo.setStatus(0L); // 状态正常 + return R.ok(tDistrictService.selectAreaList(vo)); + } + + /** + * 导出地址数据JSON文件 + */ + @SaIgnore + @GetMapping(value = "/districts", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getDistricts() throws IOException { + // 获取地区数据 + TDistrictVo vo = new TDistrictVo(); + vo.setStatus(0L); // 状态正常 + // 查询区划信息数据 + List districtsList = tDistrictService.selectDistricts(vo); + // 使用json导出工具类,传入导出数据对象并指定文件名称 + return JsonExporterUtils.exportJsonAsFile(districtsList, "districts.json"); + } + + /** + * 根据区划名称查询区划列表 + */ + @SaIgnore + @PostMapping("/queryListByName") + public List queryListByName(@RequestBody List districtNames) { + return tDistrictService.queryListByName(districtNames); + } + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TFreightController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TFreightController.java new file mode 100644 index 0000000..455efef --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TFreightController.java @@ -0,0 +1,148 @@ +package org.dromara.zhishu.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.bo.TFreightBo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; +import org.dromara.zhishu.service.ITFreightService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 三级货区管理 + * + * @author Lion Li + * @date 2025-04-19 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/freight") +public class TFreightController extends BaseController { + + private final ITFreightService tFreightService; + + + @GetMapping("/getDepotTree") + public Map getDepotTree(){ + Map map = new HashMap(); + map.put("code",200); + map.put("msg","查询成功"); + map.put("data",tFreightService.selectDepotTree()); + return map; + } + + /** + * 查询三级货区管理列表 + */ + @SaCheckPermission("zhishu:freight:list") + @GetMapping("/list") + public TableDataInfo list(TFreightBo bo, PageQuery pageQuery) { + return tFreightService.queryPageList(bo, pageQuery); + } + + /** + * 导出三级货区管理列表 + */ + @SaCheckPermission("zhishu:freight:export") + @Log(title = "三级货区管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TFreightBo bo, HttpServletResponse response) { + List list = tFreightService.queryList(bo); + ExcelUtil.exportExcel(list, "三级货区管理", TFreightVo.class, response); + } + + /** + * 获取三级货区管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:freight:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tFreightService.queryById(id)); + } + + /** + * 新增三级货区管理 + */ + @SaCheckPermission("zhishu:freight:add") + @Log(title = "三级货区管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @SaIgnore + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TFreightBo bo) { + try{ + tFreightService.insertByBo(bo); + return R.ok(bo); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + + /** + * 修改三级货区管理 + */ + @SaCheckPermission("zhishu:freight:edit") + @Log(title = "三级货区管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + @SaIgnore + public R edit(@Validated(EditGroup.class) @RequestBody TFreightBo bo) { + try{ + tFreightService.updateByBo(bo); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + return R.ok(bo); + } + + /** + * 删除三级货区管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:freight:remove") + @Log(title = "三级货区管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @SaIgnore + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids, + @RequestParam(required = false) Long LocalUserId) { + return toAjax(tFreightService.deleteWithValidByIds(List.of(ids), true,LocalUserId)); + } + + /** + * 查询货架id,code列表 + */ +// @SaIgnore + @SaCheckPermission("shelves:shelves:sheList") + @GetMapping("/sheList") + @SaIgnore + public TableDataInfo listShe() { + List list= tFreightService.querySheNameList(); + return TableDataInfo.build(list); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteCodeController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteCodeController.java new file mode 100644 index 0000000..00b7203 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteCodeController.java @@ -0,0 +1,120 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.TInviteCode; +import org.dromara.zhishu.domain.bo.InviteCodeBo; +import org.dromara.zhishu.domain.vo.InviteCodeVo; +import org.dromara.zhishu.service.ITInviteCodeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 邀请码管理 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/invite") +public class TInviteCodeController extends BaseController { + + private final ITInviteCodeService inviteCodeService; + + /** + * 查询我的邀请码列表 + */ + @GetMapping("/list") + @SaIgnore + public R> list() { + Long userId = LoginHelper.getUserId(); + List list = inviteCodeService.queryListByUserId(userId); + // 不需要显示邀请码是否已使用 + if (list != null) { + for (InviteCodeVo vo : list) { + vo.setUsed(null); + } + } + return R.ok(list); + } + + /** + * 查询邀请码分页列表 + */ + @SaCheckPermission("zhishu:invite:list") + @GetMapping("/page") + @SaIgnore + public TableDataInfo page(InviteCodeBo bo, PageQuery pageQuery) { + // 设置当前登录用户ID作为查询条件 + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + + TableDataInfo tableDataInfo = inviteCodeService.queryPageList(bo, pageQuery); + // 不需要显示邀请码是否已使用 + if (tableDataInfo != null && tableDataInfo.getRows() != null) { + for (InviteCodeVo vo : tableDataInfo.getRows()) { + vo.setUsed(null); + } + } + return tableDataInfo; + } + + /** + * 获取邀请码详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:invite:query") + @GetMapping("/{id}") + public R getInfo(@PathVariable("id") Long id) { + InviteCodeVo vo = inviteCodeService.queryById(id); + if (vo != null) { + vo.setUsed(null); + } + return R.ok(vo); + } + + /** + * 生成邀请码 + */ + @Log(title = "邀请码管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/generate") + public R generate(@RequestBody InviteCodeBo bo) { + // 设置当前登录用户为邀请人 + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + + return R.ok(inviteCodeService.generateInviteCode(bo)); + } + + /** + * 验证邀请码 + */ + @SaIgnore + @GetMapping("/validate") + public R validate(@RequestParam("code") String code) { + TInviteCode inviteCode = inviteCodeService.validateInviteCode(code); + return R.ok(inviteCode != null); + } + + /** + * 使用邀请码(注册时调用) + */ + @SaIgnore + @PostMapping("/use") + public R useInviteCode(@RequestParam("code") String code, @RequestParam("userId") Long userId) { + return R.ok(inviteCodeService.useInviteCode(code, userId)); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteRelationsController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteRelationsController.java new file mode 100644 index 0000000..dc602f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TInviteRelationsController.java @@ -0,0 +1,113 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserInfoVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysPostService; +import org.dromara.system.service.ISysRoleService; +import org.dromara.system.service.ISysUserService; +import org.dromara.zhishu.domain.TInviteRelations; +import org.dromara.zhishu.domain.bo.TInviteRelationsBo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.TInviteRelationsVo; +import org.dromara.zhishu.service.ITInviteRelationsService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; + +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/inviteRelations") +public class TInviteRelationsController { + + private final ITInviteRelationsService tInviteRelationsService; + private final ISysUserService userService; + private final ISysRoleService roleService; + private final ISysPostService postService; + + @SaIgnore + @GetMapping("/list") + public R> list() { + try { + List data = tInviteRelationsService.selectByInviterId(LoginHelper.getUserId()); + if (data == null) { + return R.fail(400, "no data"); + } + Map row = new HashMap<>(); + row.put("rows", data); + return R.ok(row); + } catch (Exception e) { + return R.fail(400, e.getMessage()); + } + } + + + @SaIgnore + @GetMapping("/userShopList") + public R> userShopList() { + try { + List data = tInviteRelationsService.selectUserShopList(LoginHelper.getUserId()); + if (data == null) { + return R.fail(400, "no data"); + } + Map row = new HashMap<>(); + row.put("rows", data); + return R.ok(row); + } catch (Exception e) { + return R.fail(400, e.getMessage()); + } + } + + /** + * 查询用户信息 + * @param userId + * @return + */ + @SaCheckPermission("inviteRelations:user:query") + @GetMapping("/{userId}") + public R getInfo(@PathVariable Long userId) { + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + + // 获取用户基本信息 + SysUserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + + // 获取用户角色ID列表 + userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); + + // 获取用户岗位信息(如果有部门) + if (ObjectUtil.isNotNull(sysUser.getDeptId())) { + SysPostBo postBo = new SysPostBo(); + postBo.setDeptId(sysUser.getDeptId()); + userInfoVo.setPosts(postService.selectPostList(postBo)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); + } + + // 获取所有角色列表(过滤掉超级管理员) + SysRoleBo roleBo = new SysRoleBo(); + roleBo.setStatus(SystemConstants.NORMAL); + List roles = roleService.selectRoleList(roleBo); + userInfoVo.setRoles(StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + + return R.ok(userInfoVo); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TLogisticsController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TLogisticsController.java new file mode 100644 index 0000000..daab6cb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TLogisticsController.java @@ -0,0 +1,143 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.zhishu.domain.bo.PrinterBo; +import org.dromara.zhishu.domain.bo.TLogisticsBo; +import org.dromara.zhishu.domain.vo.PrinterVo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TLogisticsVo; +import org.dromara.zhishu.service.ITLogisticsService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 物流管理 + * + * @author Lion Li + * @date 2025-04-22 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/logistics") +public class TLogisticsController extends BaseController { + + private final ITLogisticsService tLogisticsService; + + /** + * 查询物流管理列表 + */ + @GetMapping("/list") + public TableDataInfo list(TLogisticsBo bo, PageQuery pageQuery) { + return tLogisticsService.queryPageList(bo, pageQuery); + } + + /** + * 查询全部打印机设置 + * @param bo + * @return + */ + @GetMapping("/listNoPage") + public List listNoPage(TLogisticsBo bo){ + return tLogisticsService.queryList(bo); + } + + /** + * 导出物流管理列表 + */ + @SaCheckPermission("zhishu:logistics:export") + @Log(title = "物流管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TLogisticsBo bo, HttpServletResponse response) { + List list = tLogisticsService.queryList(bo); + ExcelUtil.exportExcel(list, "物流管理", TLogisticsVo.class, response); + } + + /** + * 获取物流管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:logistics:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tLogisticsService.queryById(id)); + } + + /** + * 新增物流管理 + */ + @Log(title = "物流管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + @SaIgnore + public R add(@Validated(AddGroup.class) @RequestBody TLogisticsBo bo) { + return toAjax(tLogisticsService.insertByBo(bo)); + } + + /** + * 修改物流管理 + */ + @Log(title = "物流管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + @SaIgnore + public R edit(@Validated(EditGroup.class) @RequestBody TLogisticsBo bo) { + return toAjax(tLogisticsService.updateByBo(bo)); + } + + /** + * 删除物流管理 + * + * @param ids 主键串 + */ + @Log(title = "物流管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @SaIgnore + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tLogisticsService.deleteWithValidByIds(List.of(ids), true)); + } + +// @SaCheckPermission("zhishu:logistics:namelist") + @GetMapping("/namelist") + @SaIgnore + public TableDataInfo list1() { + List list= tLogisticsService.queryNameList(); + return TableDataInfo.build(list); + } + + @GetMapping("/getList") + @SaIgnore + public TableDataInfo getList(Long userId) { + List list= tLogisticsService.getList(userId); + return TableDataInfo.build(list); + } + + /** + * 小程序获取运费模板 + */ + @GetMapping("/xcx/list") + @SaIgnore + public TableDataInfo xcxList(@RequestParam Long userId) { + List list= tLogisticsService.queryNameListByXcx(userId); + return TableDataInfo.build(list); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShelvesController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShelvesController.java new file mode 100644 index 0000000..fbfa17e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShelvesController.java @@ -0,0 +1,188 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.zhishu.domain.bo.TShelvesBo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; +import org.dromara.zhishu.service.ITDepotService; +import org.dromara.zhishu.service.ITShelvesService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 货架信息 + * + * @author Lion Li + * @date 2025-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/shelves/shelves") +public class TShelvesController extends BaseController { + + private final ITShelvesService tShelvesService; + private final ITDepotService tDepotService; + + /** + * 查询货架信息列表 + */ + @SaCheckPermission("shelves:shelves:list") + @GetMapping("/list") + public TableDataInfo list(TShelvesBo bo, PageQuery pageQuery) { + return tShelvesService.queryPageList(bo, pageQuery); + } + + /** + * 导出货架信息列表 + */ + @SaCheckPermission("shelves:shelves:export") + @Log(title = "货架信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TShelvesBo bo, HttpServletResponse response) { + List list = tShelvesService.queryList1(); + ExcelUtil.exportExcel(list, "货架信息", TShelvesVo.class, response); + } + + /** + * 获取货架信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("shelves:shelves:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tShelvesService.queryById(id)); + } + + /** + * 前台本地回显用查询函数 + */ + @SaCheckPermission("shelves:shelves:query") + @GetMapping("/forLocal/{depotId}/{code}") + public R getInfo(@PathVariable("depotId") Long depotId, @PathVariable("code") String code) { + return R.ok(tShelvesService.queryFoundId(depotId, code)); + } + + /** + * 新增货架信息 + */ + @SaCheckPermission("shelves:shelves:add") + @Log(title = "货架信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + @SaIgnore + public R add(@Validated(AddGroup.class) @RequestBody TShelvesBo bo) { + try{ + tShelvesService.insertByBo(bo); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + return R.ok(bo); + } + + /** + * 修改货架信息 + */ + @SaCheckPermission("shelves:shelves:edit") + @Log(title = "货架信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + @SaIgnore + public R edit(@Validated(EditGroup.class) @RequestBody TShelvesBo bo) { + try{ + tShelvesService.updateByBo(bo); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + return R.ok(bo); + } + + /** + * 删除货架信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("shelves:shelves:remove") + @Log(title = "货架信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @SaIgnore + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids, + @RequestParam(required = false) Long LocalUserId) { + return toAjax(tShelvesService.deleteWithValidByIds(List.of(ids), true,LocalUserId)); + } + + /** + * 查询仓库信息列表 + */ +// @SaIgnore + @SaCheckPermission("shelves:shelves:namelist") + @GetMapping("/namelist") + @SaIgnore + public TableDataInfo list1(String phoneNumber) { + List list= tDepotService.queryNameList(phoneNumber); + return TableDataInfo.build(list); + } + + /** + * 查询货架id,code列表 + */ + @GetMapping("/sheNamelist") + @SaIgnore + public TableDataInfo listShe(String depotId) { + List list= tDepotService.querySheNameList(depotId); + return TableDataInfo.build(list); + } + /** + * 查询货位id,code列表 + */ + + @GetMapping("/freNamelist") + @SaIgnore + public TableDataInfo listFre(String sheId) { + List list= tDepotService.queryFreNameList(sheId); + return TableDataInfo.build(list); + } + + @GetMapping("/sheNamelist/{depotId}") + @SaIgnore + public TableDataInfo listShe1(@PathVariable String depotId) { + List list= tDepotService.querySheNameList(depotId); + return TableDataInfo.build(list); + } + @GetMapping("/freNamelist/{sheId}") + @SaIgnore + public TableDataInfo listFre1(@PathVariable String sheId) { + List list= tDepotService.queryFreNameList(sheId); + return TableDataInfo.build(list); + } + + @GetMapping("/getShelvesId") + @SaIgnore + public TableDataInfo getShelvesId(String depotId,String code) { + List list= tShelvesService.selectShelvesIdByDepotIdAndCode(depotId,code); + return TableDataInfo.build(list); + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopDepotAotuController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopDepotAotuController.java new file mode 100644 index 0000000..81e3f8f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopDepotAotuController.java @@ -0,0 +1,52 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import jakarta.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.zhishu.domain.vo.TShopDepotAotuVo; +import org.dromara.zhishu.domain.bo.TShopDepotAotuBo; +import org.dromara.zhishu.service.ITShopDepotAotuService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 店铺自动发布仓库关联 + * + * @author Lion Li + * @date 2025-09-05 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopDepotAotu") +public class TShopDepotAotuController extends BaseController { + + private final ITShopDepotAotuService tShopDepotAotuService; + + /** + * 查询店铺自动发布仓库关联列表 + */ + @SaCheckPermission("zhishu:shopDepotAotu:list") + @GetMapping("/list") + public TableDataInfo list(@ModelAttribute TShopDepotAotuBo bo, PageQuery pageQuery) { + return tShopDepotAotuService.queryPageList(bo, pageQuery); + } + + /** + * 获取店铺自动发布仓库关联详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shopDepotAotu:list") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tShopDepotAotuService.queryById(id)); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopOrderDetailController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopOrderDetailController.java new file mode 100644 index 0000000..02e7c24 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TShopOrderDetailController.java @@ -0,0 +1,105 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.TShopOrderDetailVo; +import org.dromara.zhishu.domain.bo.TShopOrderDetailBo; +import org.dromara.zhishu.service.ITShopOrderDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 订单详情 + * + * @author Lion Li + * @date 2025-03-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopOrderDetail") +public class TShopOrderDetailController extends BaseController { + + private final ITShopOrderDetailService tShopOrderDetailService; + + /** + * 查询订单详情列表 + */ + @SaCheckPermission("zhishu:shopOrderDetail:list") + @GetMapping("/list") + public TableDataInfo list(TShopOrderDetailBo bo, PageQuery pageQuery) { + return tShopOrderDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出订单详情列表 + */ + @SaCheckPermission("zhishu:shopOrderDetail:export") + @Log(title = "订单详情", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TShopOrderDetailBo bo, HttpServletResponse response) { + List list = tShopOrderDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "订单详情", TShopOrderDetailVo.class, response); + } + + /** + * 获取订单详情详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shopOrderDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tShopOrderDetailService.queryById(id)); + } + + /** + * 新增订单详情 + */ + @SaCheckPermission("zhishu:shopOrderDetail:add") + @Log(title = "订单详情", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TShopOrderDetailBo bo) { + return toAjax(tShopOrderDetailService.insertByBo(bo)); + } + + /** + * 修改订单详情 + */ + @SaCheckPermission("zhishu:shopOrderDetail:edit") + @Log(title = "订单详情", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TShopOrderDetailBo bo) { + return toAjax(tShopOrderDetailService.updateByBo(bo)); + } + + /** + * 删除订单详情 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:shopOrderDetail:remove") + @Log(title = "订单详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tShopOrderDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TestController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TestController.java new file mode 100644 index 0000000..7349e78 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/TestController.java @@ -0,0 +1,93 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.annotation.Resource; +import org.redisson.Redisson; +import org.redisson.api.RLock; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.TimeUnit; + +@RestController +@RequestMapping("/test") +public class TestController { + + + @Resource + Redisson redisson; + + @Resource + StringRedisTemplate stringRedisTemplate; + + @RequestMapping("/sub_stock") + @SaIgnore + public String deductStock5() { + String lockKey = "lock_good_stock"; + RLock lock = redisson.getLock(lockKey); + lock.lock(60, TimeUnit.SECONDS); + try { + int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("good_stock")); + if (stock > 0) { + int realStock = stock - 1; + stringRedisTemplate.opsForValue().set("good_stock", realStock + ""); + System.out.println("扣减成功,剩余库存:" + realStock); + } else { + System.out.println("扣减失败,库存不足"); + } + } finally { + lock.unlock(); + } + return "ok"; + } + + @SaIgnore + @RequestMapping("/add_stock") + + public String addStock() { + stringRedisTemplate.opsForValue().set("good_stock", "60"); + return "ok"; + } + + @SaIgnore + @RequestMapping("/get_stock") + + public String get_stock() { + return stringRedisTemplate.opsForValue().get("good_stock"); + } + + + @SaIgnore + @RequestMapping("/sub_stock1") + + public String sub_stock1() { + String lockKey = "lock_good_stock"; + RLock lock = redisson.getLock(lockKey); + lock.lock(30, TimeUnit.SECONDS); + try { + int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("good_stock")); + if(stock>0){ + stringRedisTemplate.opsForValue().set("good_stock", stock-1 + ""); + System.out.println("库存不足"); + }else{ + System.out.println("库存不足"); + } + + }catch (Exception e){ + + }finally { + lock.unlock(); + } + + + + + + return stringRedisTemplate.opsForValue().get("good_stock"); + } + + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserAccountController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserAccountController.java new file mode 100644 index 0000000..638b4ec --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserAccountController.java @@ -0,0 +1,116 @@ +package org.dromara.zhishu.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.UserAccountVo; +import org.dromara.zhishu.domain.bo.UserAccountBo; +import org.dromara.zhishu.service.IUserAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 账号管理 + * + * @author yxy + * @date 2026-02-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/userAccount") +public class UserAccountController extends BaseController { + + private final IUserAccountService userAccountService; + + /** + * 查询账号管理列表 + */ + @SaCheckPermission("zhishu:userAccount:list") + @GetMapping("/list") + public TableDataInfo list(UserAccountBo bo, PageQuery pageQuery) { + return userAccountService.queryPageList(bo, pageQuery); + } + + @SaCheckPermission("zhishu:userAccount:list") + @GetMapping("/listNoPage") + public Map> listNoPage(UserAccountBo bo) { + Map> map = new HashMap<>(); + map.put("adminList",userAccountService.queryListAdmin(bo)); + map.put("userList",userAccountService.queryList(bo)); + return map; + } + + /** + * 导出账号管理列表 + */ + @SaCheckPermission("zhishu:userAccount:export") + @Log(title = "账号管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserAccountBo bo, HttpServletResponse response) { + List list = userAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "账号管理", UserAccountVo.class, response); + } + + /** + * 获取账号管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:userAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userAccountService.queryById(id)); + } + + /** + * 新增账号管理 + */ + @SaCheckPermission("zhishu:userAccount:add") + @Log(title = "账号管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserAccountBo bo) { + return toAjax(userAccountService.insertByBo(bo)); + } + + /** + * 修改账号管理 + */ + @SaCheckPermission("zhishu:userAccount:edit") + @Log(title = "账号管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserAccountBo bo) { + return toAjax(userAccountService.updateByBo(bo)); + } + + /** + * 删除账号管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:userAccount:remove") + @Log(title = "账号管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserInfoController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserInfoController.java new file mode 100644 index 0000000..8de46ab --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserInfoController.java @@ -0,0 +1,25 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/userInfo") +public class UserInfoController { + + @SaIgnore + @GetMapping(value = "/getUserId") + public Long getUserId(@RequestParam("token") String token){ + LoginUser user = LoginHelper.getLoginUser(token); + return user.getUserId(); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserRechargeController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserRechargeController.java new file mode 100644 index 0000000..f89f678 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/UserRechargeController.java @@ -0,0 +1,356 @@ +package org.dromara.zhishu.controller; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUserService; +import org.dromara.system.service.IUserTransferService; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.UserAccountVo; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.service.IUserAccountService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.WxPayUtil; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.UserRechargeVo; +import org.dromara.zhishu.domain.bo.UserRechargeBo; +import org.dromara.zhishu.service.IUserRechargeService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 用户充值 + * + * @author yxy + * @date 2025-04-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/userRecharge") +public class UserRechargeController extends BaseController { + + private final IUserRechargeService userRechargeService; + private final ISysConfigService configService; + private final IUserAccountService userAccountService; + private final ISysUserService userService; + private final IShopService shopService; + + + /** + * 查询用户充值列表 + */ + @SaCheckPermission("zhishu:userRecharge:list") + @GetMapping("/list") + public TableDataInfo list(UserRechargeBo bo, PageQuery pageQuery) { + return userRechargeService.queryPageList(bo, pageQuery); + } + + /** + * 导出用户充值列表 + */ + @SaCheckPermission("zhishu:userRecharge:export") + @Log(title = "用户充值", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserRechargeBo bo, HttpServletResponse response) { + List list = userRechargeService.queryList(bo); + ExcelUtil.exportExcel(list, "用户充值", UserRechargeVo.class, response); + } + + /** + * 获取用户充值详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:userRecharge:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userRechargeService.queryById(id)); + } + + @GetMapping(value = "/configKey/{configKey}") + public R getConfigKey(@PathVariable String configKey) { + return R.ok(configService.selectConfigByKey(configKey)); + } + + /** + * 新增用户充值 + */ + @SaCheckPermission("zhishu:userRecharge:add") + @Log(title = "用户充值", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserRechargeBo bo) { + return toAjax(userRechargeService.insertByBo(bo)); + } + + @PostMapping("/userRechargeNoCommission") + public R userRechargeNoCommission(@RequestBody UserRechargeBo bo){ + //支付方式 1 微信 + String type = bo.getRechargType(); + //充值金额 单位 元 + BigDecimal price = bo.getRechargPrice(); + //计算后金额 单位 分 + BigDecimal priceResult = price.multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_UP); + + bo.setCommission(BigDecimal.ZERO); + + //获取登录用户id + String userId = LoginHelper.getUserId().toString(); + if(type.equals("1")){ + //换算手续费为 分 + bo.setRechargPrice(bo.getRechargPrice().multiply(new BigDecimal(100))); + //创建任务 + bo.setUserId(Long.parseLong(userId)); + //状态 0 待支付 1 支付完成 2 支付过期 + bo.setStatus("0"); + userRechargeService.insertByBo(bo); + String data = WxPayUtil.wxPay(bo.getId(),Integer.parseInt(priceResult.toString()),price.toString()); + + String base64Str = WxPayUtil.generateQRCode(data); + + Map map = new HashMap(); + map.put("img",base64Str); + map.put("id", bo.getId()); + return R.ok(map); + } + return R.fail("充值订单生成失败,请联系管理员"); + } + + @PostMapping("/userRecharge") + public R userRecharge(@RequestBody UserRechargeBo bo){ + //支付方式 1 微信 2 线下支付 3 卡密支付 + String type = bo.getRechargType(); + //充值金额 单位 元 + BigDecimal price = bo.getRechargPrice(); + + //获取登录用户id + String userId = LoginHelper.getUserId().toString(); + + if(type.equals("1")){ + //手续费 单位 元 + String commissionStr = new BigDecimal(configService.selectConfigByKey("becharge.commission")).divide(new BigDecimal(10000)).toString(); + BigDecimal commission = price.multiply(new BigDecimal(commissionStr)); + //计算后金额 单位 分 + BigDecimal priceResult = price.add(commission).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_UP); + //手续费换算单位为分 + commission = commission.multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_UP); + + if(commission.compareTo(new BigDecimal(0)) == 0){ + commission = new BigDecimal(1); + } + bo.setCommission(commission); + + + + //换算手续费为 分 + bo.setRechargPrice(bo.getRechargPrice().multiply(new BigDecimal(100))); + //创建任务 + bo.setUserId(Long.parseLong(userId)); + //状态 0 待支付 1 支付完成 2 支付过期 3 审核中 4 审核通过 5 拒绝 + bo.setStatus("0"); + userRechargeService.insertByBo(bo); + String data = WxPayUtil.wxPay(bo.getId(),Integer.parseInt(priceResult.toString()),price.toString()); + + String base64Str = WxPayUtil.generateQRCode(data); + + Map map = new HashMap(); + map.put("img",base64Str); + map.put("id", bo.getId()); + return R.ok(map); + }else if (type.equals("2")){ + // 出账用户 + UserAccountVo billingAccountVo = userAccountService.queryById(Long.parseLong(bo.getBillingAccount())); + // 入账用户 + UserAccountVo depositAccountVo = userAccountService.queryById(Long.parseLong(bo.getDepositAccount())); + // 充值金额 + price = price.multiply(new BigDecimal(100)); + // 线下充值 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("rechargPrice",price); + jsonObject.put("billingAccount",bo.getBillingAccount()); + jsonObject.put("billingTxt","【"+billingAccountVo.getAccountType()+"】"+"【"+billingAccountVo.getAccountName()+"】"+"【"+billingAccountVo.getAccount()+"】"); + jsonObject.put("depositAccount",bo.getDepositAccount()); + jsonObject.put("depositTxt","【"+depositAccountVo.getAccountType()+"】"+"【"+depositAccountVo.getAccountName()+"】"+"【"+depositAccountVo.getAccount()+"】"); + jsonObject.put("transactionId",bo.getTransactionId()); + jsonObject.put("remark",bo.getRemark()); + jsonObject.put("voucherImg",bo.getVoucherImg()); + + String json = jsonObject.toString(); + bo.setAllDataStr(json); + bo.setRechargPrice(price); + bo.setLogTxt("入账账户:"+jsonObject.get("depositTxt")); + //状态 0 待支付 1 支付完成 2 支付过期 3 审核中 4 审核通过 5 拒绝 + bo.setStatus("3"); + userRechargeService.insertByBo(bo); + return R.ok("提交充值订单成功"); + }else if (type.equals("3")){ + // 卡密支付 + String cardKey = bo.getCardKey(); + String result = InterfaceUtils.getInterface("https://wallet.api.buzhiyushu.cn","/api/card/activate/"+cardKey+"/ERP-"+userId); + Map resultMap = JsonUtil.transferToObj(result,Map.class); + String msg = resultMap.get("message").toString(); + String code = resultMap.get("code").toString(); + if (code.equals("200")){ + // 成功 + Map dataMap = (Map) resultMap.get("data"); + BigDecimal points = new BigDecimal(dataMap.get("points").toString()).multiply(new BigDecimal(100)).setScale(0, RoundingMode.DOWN); // 直接舍弃小数部分; + SysUserVo userVo = userService.selectUserById(Long.parseLong(userId)); + BigDecimal newPrice = userVo.getBalance().add(points); + bo.setRechargPrice(points); + bo.setStatus("1"); + bo.setLogTxt("卡密:"+cardKey); + bo.setOriginalPrice(userVo.getBalance()); + bo.setUpdatePrice(newPrice); + bo.setSuccessTime(DateUtils.getNowDate()); + userRechargeService.insertByBo(bo); + SysUserBo userBo = new SysUserBo(); + userBo.setUserId(userVo.getUserId()); + userBo.setBalance(newPrice); + userService.updateUser(userBo); + return R.ok(msg); + }else{ + return R.fail(500,"支付失败:"+msg); + } + } + + return R.fail("充值订单生成失败,请联系管理员"); + } + + + @PostMapping("/balancePayment") + public R balancePayment(@RequestBody Map map){ + Long userId = map.get("userId") == null ? LoginHelper.getUserId() : Long.parseLong(map.get("userId").toString()); + Long shopId = map.get("shopId") == null ? null : Long.parseLong(map.get("shopId").toString()); + int logType = map.get("logType") == null ? 0 : Integer.parseInt(map.get("logType").toString()); + BigDecimal rechargPrice = map.get("rechargPrice") == null ? new BigDecimal(0) : new BigDecimal(map.get("rechargPrice").toString()); + rechargPrice = rechargPrice.multiply(new BigDecimal(100)).setScale(0, RoundingMode.DOWN); + return userRechargeService.balancePayment(userId,shopId,logType,rechargPrice); + } + + + @PostMapping("/apiBalancePayment") + @SaIgnore + public R apiBalancePayment(Long userId,Long shopId,int logType,Long rechargPrice){ + BigDecimal newRechargPrice = new BigDecimal(rechargPrice).multiply(new BigDecimal(100)).setScale(0, RoundingMode.DOWN); + return userRechargeService.balancePayment(userId,shopId,logType,newRechargPrice); + } + + @PostMapping("/review") + public R review(@RequestBody Map map){ + // type 0 拒绝 1 通过 + String type = map.get("type"); + String status = null; + if (type.equals("1")){ + status = "4"; + }else{ + status = "5"; + } + String idsStr = map.get("ids"); + String[] ids = idsStr.split(","); + for (String id : ids){ + // 如果是通过,则增加用户的金额 + UserRechargeVo vo = userRechargeService.queryById(Long.parseLong(id)); + if (!vo.getStatus().equals("3")){ + continue; + } + UserRechargeBo bo = new UserRechargeBo(); + if (type.equals("1")){ + // 申请人 + String createBy = vo.getCreateBy(); + // 申请金额 + Long rechargPrice = vo.getRechargPrice(); + SysUserVo userVo = userService.selectUserById(Long.parseLong(createBy)); + BigDecimal newPrice = userVo.getBalance().add(new BigDecimal(rechargPrice)); + SysUserBo userBo = new SysUserBo(); + userBo.setUserId(userVo.getUserId()); + userBo.setBalance(newPrice); + userService.updateUser(userBo); + // 记录新旧价格 + bo.setOriginalPrice(userVo.getBalance()); + bo.setUpdatePrice(newPrice); + bo.setSuccessTime(DateUtils.getNowDate()); + } + bo.setId(Long.parseLong(id)); + bo.setStatus(status); + userRechargeService.updateByBo(bo); + } + + return R.ok(); + } + + /** + * 充值金额到钱包里 + * @return + */ + @PostMapping("/addUserBalance") + public R addUserBalance(@RequestBody UserRechargeBo bo){ + return userRechargeService.addUserBalance(bo); + } + + + @GetMapping("/checkTask/{id}") + public String checkTask(@PathVariable("id") String id){ + UserRechargeVo userRechargeVo = userRechargeService.queryById(Long.parseLong(id)); + return userRechargeVo.getStatus(); + } + + @GetMapping("/editRechargeToError/{id}") + public void editRechargeToError(@PathVariable("id") String id){ + UserRechargeBo bo = new UserRechargeBo(); + bo.setId(Long.parseLong(id)); + bo.setStatus("2"); + userRechargeService.updateByBo(bo); + } + + /** + * 修改用户充值 + */ + @SaCheckPermission("zhishu:userRecharge:edit") + @Log(title = "用户充值", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserRechargeBo bo) { + return toAjax(userRechargeService.updateByBo(bo)); + } + + /** + * 删除用户充值 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:userRecharge:remove") + @Log(title = "用户充值", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userRechargeService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ViolationController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ViolationController.java new file mode 100644 index 0000000..a21ea15 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ViolationController.java @@ -0,0 +1,221 @@ +package org.dromara.zhishu.controller; + +import java.util.List; +import java.util.Map; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.Violation; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.ViolationVo; +import org.dromara.zhishu.domain.bo.ViolationBo; +import org.dromara.zhishu.service.IViolationService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 违规 + * + * @author yxy + * @date 2025-06-23 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/violation") +public class ViolationController extends BaseController { + + private final IViolationService violationService; + + /** + * 查询违规列表 + */ + @SaCheckPermission("zhishu:violation:list") + @GetMapping("/list") + public TableDataInfo list(ViolationBo bo, PageQuery pageQuery) { + return violationService.queryPageList(bo, pageQuery); + } + + + @SaIgnore + @PostMapping("/newList") + public TableDataInfo newList(@RequestBody Map map){ + // 安全地解析分页参数 + Integer pageSize = map.get("pageSize") != null ? + Integer.parseInt(map.get("pageSize").toString()) : 10; + Integer pageNum = map.get("pageNum") != null ? + Integer.parseInt(map.get("pageNum").toString()) : 1; + + PageQuery pageQuery = new PageQuery(pageSize, pageNum); + + // 安全地解析查询参数 + String type = map.get("type") != null ? map.get("type").toString() : ""; + String name = map.get("name") != null ? map.get("name").toString() : ""; + String review = map.get("review") != null ? map.get("review").toString() : ""; + String status = map.get("status") != null ? map.get("status").toString() : ""; + + ViolationBo bo = new ViolationBo(); + bo.setType(type); + bo.setName(name); + bo.setReview(review); + bo.setStatus(status); + + // 直接返回 TableDataInfo,包含完整的分页信息 + return violationService.queryPageList(bo, pageQuery); + } + + @SaIgnore + @PostMapping("/errorSubmit") + public void errorSubmit(@RequestBody Map map){ + String[] ids = map.get("ids").toString().split(","); + String remark = map.get("remark") == null ? "" : map.get("remark").toString(); + String review = map.get("review") == null ? "" : map.get("review").toString(); + + for (String id : ids){ + ViolationBo bo = new ViolationBo(); + bo.setId(Long.parseLong(id)); + bo.setRemark(remark); + bo.setReview(review); + violationService.updateByBo(bo); + } + } + + @SaIgnore + @PostMapping("/successSubmit") + public void successSubmit(@RequestBody Map map){ + String[] ids = map.get("ids").toString().split(","); + String review = map.get("review") == null ? "" : map.get("review").toString(); + for (String id : ids){ + ViolationBo bo = new ViolationBo(); + bo.setId(Long.parseLong(id)); + bo.setReview(review); + violationService.updateByBo(bo); + } + } + + @SaIgnore + @PostMapping("/removeSubmit") + public void removeSubmit(@RequestBody Map map){ + String[] ids = map.get("ids").toString().split(","); + + Long[] idsArr = new Long[ids.length]; + for(int i=0;i editType(@RequestBody Map map){ + + List ids = (List) map.get("ids"); + String type = map.get("type").toString(); + + for(String id : ids){ + ViolationBo bo = new ViolationBo(); + bo.setId(Long.parseLong(id)); + bo.setReview(type); + violationService.updateByBo(bo); + } + return R.ok(); + } + + /** + * 导出违规列表 + */ + @SaCheckPermission("zhishu:violation:export") + @Log(title = "违规", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ViolationBo bo, HttpServletResponse response) { + List list = violationService.queryList(bo); + ExcelUtil.exportExcel(list, "违规", ViolationVo.class, response); + } + + /** + * 获取违规详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:violation:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(violationService.queryById(id)); + } + + /** + * 新增违规 + */ + @SaCheckPermission("zhishu:violation:add") + @Log(title = "违规", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ViolationBo bo) { + //未审核状态 + bo.setReview("0"); + //发起人 + bo.setUserid(LoginHelper.getUserId()); + //创建人为管理员 + bo.setCreateBy(1L); + bo.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + return toAjax(violationService.insertByBo(bo)); + } + + /** + * 修改违规 + */ + @SaCheckPermission("zhishu:violation:edit") + @Log(title = "违规", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ViolationBo bo) { + return toAjax(violationService.updateByBo(bo)); + } + + /** + * 删除违规 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:violation:remove") + @Log(title = "违规", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(violationService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WarehouseSettingsController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WarehouseSettingsController.java new file mode 100644 index 0000000..df42b69 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WarehouseSettingsController.java @@ -0,0 +1,114 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.zhishu.domain.WarehouseSettings; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.WarehouseSettingsVo; +import org.dromara.zhishu.domain.bo.WarehouseSettingsBo; +import org.dromara.zhishu.service.IWarehouseSettingsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 设置 + * + * @author yxy + * @date 2025-12-19 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/warehouseSettings") +public class WarehouseSettingsController extends BaseController { + + private final IWarehouseSettingsService warehouseSettingsService; + + /** + * 查询设置列表 + */ + @SaCheckPermission("zhishu:warehouseSettings:list") + @GetMapping("/list") + public TableDataInfo list(WarehouseSettingsBo bo, PageQuery pageQuery) { + return warehouseSettingsService.queryPageList(bo, pageQuery); + } + + /** + * 导出设置列表 + */ + @SaCheckPermission("zhishu:warehouseSettings:export") + @Log(title = "设置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WarehouseSettingsBo bo, HttpServletResponse response) { + List list = warehouseSettingsService.queryList(bo); + ExcelUtil.exportExcel(list, "设置", WarehouseSettingsVo.class, response); + } + + /** + * 获取设置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:warehouseSettings:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(warehouseSettingsService.queryById(id)); + } + + /** + * 新增设置 + */ + @SaCheckPermission("zhishu:warehouseSettings:add") + @Log(title = "设置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WarehouseSettingsBo bo) { + return toAjax(warehouseSettingsService.insertByBo(bo)); + } + + /** + * 修改设置 + */ + @SaCheckPermission("zhishu:warehouseSettings:edit") + @Log(title = "设置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WarehouseSettingsBo bo) { + return toAjax(warehouseSettingsService.updateByBo(bo)); + } + + @SaCheckPermission("zhishu:warehouseSettings:edit") + @Log(title = "设置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/editStatus") + public R editStatus(@Validated(EditGroup.class) @RequestBody WarehouseSettingsBo bo) { + return toAjax(warehouseSettingsService.updateStatus(bo)); + } + + /** + * 删除设置 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:warehouseSettings:remove") + @Log(title = "设置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(warehouseSettingsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WaveDetailController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WaveDetailController.java new file mode 100644 index 0000000..b565c73 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WaveDetailController.java @@ -0,0 +1,79 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.dto.WaveDetailRequestDto; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.zhishu.service.IWaveDetailService; + +import java.util.HashMap; +import java.util.Map; + +/** + * 波次信息 + * + * @author Lion Li + * @date 2026-01-22 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/wave/detail") +public class WaveDetailController extends BaseController { + + private final IWaveDetailService waveDetailService; + + /** + * 新增波次信息 + */ + @Log(title = "波次信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @SaIgnore + @PostMapping("/insert") + public R insert(@RequestBody WaveDetailRequestDto requestDto) { + Boolean result = waveDetailService.insertWaveDetail(requestDto.getUserId(), requestDto); + return result ? R.ok() : R.fail(); + } + + + /** + * 获取波次ID + */ + @Log(title = "波次信息", businessType = BusinessType.OTHER) + @RepeatSubmit() + @SaIgnore + @GetMapping("/getWaveId") + public Map getWaveId(@RequestParam("employeeName") String employeeName, @RequestParam("userId") String userId) { + Map result = new HashMap<>(); + try { + String waveId = waveDetailService.getEmployeeId(employeeName, userId); + result.put("code", 200); + result.put("data", waveId); + result.put("message", "获取波次ID成功"); + } catch (Exception e) { + result.put("code", 500); + result.put("data", null); + result.put("message", "获取波次ID失败: " + e.getMessage()); + } + return result; + } + + + /** + * 统计波次工作数量 + */ + @Log(title = "波次信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @SaIgnore + @PostMapping("/count") + public R count(@RequestParam String waveId, @RequestParam String employeeId, @RequestParam Integer submitCount) { + Boolean result = waveDetailService.countVerWave(waveId, employeeId, submitCount); + return result ? R.ok() : R.fail(); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WhiteListController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WhiteListController.java new file mode 100644 index 0000000..810d09d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/WhiteListController.java @@ -0,0 +1,141 @@ +package org.dromara.zhishu.controller; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.WhiteListVo; +import org.dromara.zhishu.domain.bo.WhiteListBo; +import org.dromara.zhishu.service.IWhiteListService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 白名单 + * + * @author yxy + * @date 2025-06-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/whiteList") +public class WhiteListController extends BaseController { + + private final IWhiteListService whiteListService; + + /** + * 查询白名单列表 + */ + @SaCheckPermission("zhishu:whiteList:list") + @GetMapping("/list") + public TableDataInfo list(WhiteListBo bo, PageQuery pageQuery) { + return whiteListService.queryPageList(bo, pageQuery); + } + + @GetMapping("/selectAll") + public String selectAll() { + + List voList = whiteListService.selectAll(); + + String ips = ""; + for(WhiteListVo vo : voList){ + if(StringUtils.isEmpty(ips)){ + ips = vo.getIp(); + }else{ + ips = ips + "," + vo.getIp(); + } + } + return ips; + } + + /** + * 导出白名单列表 + */ + @SaCheckPermission("zhishu:whiteList:export") + @Log(title = "白名单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WhiteListBo bo, HttpServletResponse response) { + List list = whiteListService.queryList(bo); + ExcelUtil.exportExcel(list, "白名单", WhiteListVo.class, response); + } + + /** + * 获取白名单详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:whiteList:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(whiteListService.queryById(id)); + } + + @PostMapping("/setWhiteList") + public R setWhiteList(String ips) { + //清空白名单表 + whiteListService.deleteAll(); + + + //分割ips,创建WhiteListBo进行insert + String[] ipArray = ips.split(","); + for (String ip : ipArray){ + WhiteListBo bo = new WhiteListBo(); + bo.setIp(ip); + bo.setCreateBy(1L); + whiteListService.insertByBo(bo); + } + return R.ok(); + } + + /** + * 新增白名单 + */ + @SaCheckPermission("zhishu:whiteList:add") + @Log(title = "白名单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WhiteListBo bo) { + return toAjax(whiteListService.insertByBo(bo)); + } + + /** + * 修改白名单 + */ + @SaCheckPermission("zhishu:whiteList:edit") + @Log(title = "白名单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WhiteListBo bo) { + return toAjax(whiteListService.updateByBo(bo)); + } + + /** + * 删除白名单 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:whiteList:remove") + @Log(title = "白名单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(whiteListService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XcxController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XcxController.java new file mode 100644 index 0000000..c11a019 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XcxController.java @@ -0,0 +1,481 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.api.Http; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.core.domain.R; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.impl.SysUserServiceImpl; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.WxPayUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.Base64; + +@RestController +@RequestMapping("/xcx") +public class XcxController { + + @Autowired + private IShopService shopService; + + // 微信小程序支付相关配置 + private static final String APPID = "wx703b8fb6c3da692a"; + private static final String MERCHANT_ID = "1524946931"; + private static final String NOTIFY_URL = "https://api.buzhiyushu.cn/weChat/wxPayCallBack"; + private final ISysConfigService configService; + + public XcxController(ISysConfigService configService) { + this.configService = configService; + } + + @GetMapping("/getShopId/{userId}") + @SaIgnore + public R> getShopId(@PathVariable Long userId) { + return R.ok(shopService.getShopId(userId)); + } + + /** + * 小程序JSAPI支付统一下单 + */ + @SaIgnore + @PostMapping("/jsapiPay") + public R> jsapiPay(@RequestBody Map requestData) { + try { + // 获取请求参数 + String openid = (String) requestData.get("openid"); + Long taskId = Long.valueOf(requestData.get("taskId").toString()); + Integer total = Integer.valueOf(requestData.get("total").toString()); + String totalStr = (String) requestData.get("totalStr"); + String description = (String) requestData.get("description"); + + if (openid == null || openid.isEmpty()) { + return R.fail("openid不能为空"); + } + + System.out.println("JSAPI支付请求参数: openid=" + openid + ", appid=" + APPID); + + // 生成订单号 + String outTradeNo = UUID.randomUUID().toString().replace("-", ""); + System.out.println("生成的订单号: " + outTradeNo); + // 调用WxPayUtil的xcxPay方法,传入openid和订单号 + // 注意:需要修改WxPayUtil.xcxPay方法,添加outTradeNo参数 + String prepayId = WxPayUtil.xcxPay(taskId, total, totalStr, openid, APPID, outTradeNo); + System.out.println("获取到的prepayId: " + prepayId); + + // 生成小程序调起支付的参数 + Map payParams = generatePayParams(prepayId); + payParams.put("outTradeNo", outTradeNo); + System.out.println("生成的支付参数: " + JsonUtils.toJsonString(payParams)); + + // 直接返回支付参数,不要嵌套 + return R.ok(payParams); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("支付下单失败:" + e.getMessage()); + } + } + + /** + * 调用微信支付API + */ + private String callWxPayApi(String path, Map requestData) throws Exception { + String url = "https://api.mch.weixin.qq.com" + path; + String requestBody = requestData != null ? JsonUtils.toJsonString(requestData) : ""; + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + HttpPost request = new HttpPost(url); + request.setHeader("Content-Type", "application/json"); + request.setHeader("Accept", "application/json"); + + // 添加微信支付签名 + String signature = WxPayUtil.generateSignature(requestBody, path); + request.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048 " + signature); + + if (requestData != null) { + StringEntity entity = new StringEntity(requestBody, "UTF-8"); + request.setEntity(entity); + } + + try (CloseableHttpResponse response = httpClient.execute(request)) { + HttpEntity responseEntity = response.getEntity(); + if (responseEntity != null) { + return EntityUtils.toString(responseEntity); + } + } + } + return null; + } + + /** + * 生成小程序调起支付的参数 + */ + private Map generatePayParams(String prepayId) throws Exception { + // 构建请求参数 + String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); + // 生成随机字符串 + String nonceStr = UUID.randomUUID().toString().replace("-", ""); + // 构建package参数 + String packageStr = "prepay_id=" + prepayId; + // 构建签名字符串 + String signString = APPID + "\n" + timeStamp + "\n" + nonceStr + "\n" + packageStr + "\n"; + String paySign = WxPayUtil.generatePaySign(signString); + Map payParams = new HashMap<>(); + payParams.put("appId", APPID); + payParams.put("timeStamp", timeStamp); + payParams.put("nonceStr", nonceStr); + payParams.put("package", packageStr); + payParams.put("signType", "RSA"); + payParams.put("paySign", paySign); + return payParams; + } + + /** + * 查询订单状态 + */ + @SaIgnore + @PostMapping("/queryOrder") + public R> queryOrder(@RequestBody Map requestData) { + try { + String outTradeNo = (String) requestData.get("outTradeNo"); + if (outTradeNo == null || outTradeNo.isEmpty()) { + return R.fail("订单号不能为空"); + } + + // 使用专门的GET请求方法调用微信API + String path = "/v3/pay/transactions/out-trade-no/" + outTradeNo + "?mchid=" + MERCHANT_ID; + String result = callWxPayApiGet(path); + + if (result == null || result.isEmpty()) { + return R.fail("查询订单返回为空"); + } + + Map responseMap = JsonUtils.parseObject(result, Map.class); + System.out.println("查询订单结果: " + result); + return R.ok(responseMap); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("查询订单失败:" + e.getMessage()); + } + } + + /** + * 调用微信支付API (GET方法) + */ + private String callWxPayApiGet(String path) throws Exception { + String url = "https://api.mch.weixin.qq.com" + path; + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + org.apache.http.client.methods.HttpGet request = new org.apache.http.client.methods.HttpGet(url); + request.setHeader("Content-Type", "application/json"); + request.setHeader("Accept", "application/json"); + + // 生成时间戳和随机串 + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonceStr = UUID.randomUUID().toString().replace("-", ""); + + // 构建签名字符串 - GET请求的格式 + String signString = "GET\n" + path + "\n" + timestamp + "\n" + nonceStr + "\n\n"; + String signature = WxPayUtil.generatePaySign(signString); + + // 构建完整的认证头 + String token = "WECHATPAY2-SHA256-RSA2048 " + + "mchid=\"" + MERCHANT_ID + "\"," + + "nonce_str=\"" + nonceStr + "\"," + + "signature=\"" + signature + "\"," + + "timestamp=\"" + timestamp + "\"," + + "serial_no=\"1FD5B441796BE0250622018DF43EC4BAFB34FB78\""; + + request.setHeader("Authorization", token); + + System.out.println("查询订单URL: " + url); + System.out.println("查询订单认证头: " + token); + + try (CloseableHttpResponse response = httpClient.execute(request)) { + HttpEntity responseEntity = response.getEntity(); + if (responseEntity != null) { + return EntityUtils.toString(responseEntity); + } + } + } + return null; + } + + /** + * 关闭订单 + */ + @SaIgnore + @PostMapping("/closeOrder") + public R closeOrder(@RequestBody Map requestData) { + try { + String outTradeNo = (String) requestData.get("outTradeNo"); + + Map requestMap = new HashMap<>(); + requestMap.put("mchid", MERCHANT_ID); + + String path = "/v3/pay/transactions/out-trade-no/" + outTradeNo + "/close"; + String result = callWxPayApi(path, requestMap); + + return R.ok("订单关闭成功"); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("关闭订单失败:" + e.getMessage()); + } + } + + /** + * 申请退款 + */ + @SaIgnore + @PostMapping("/refund") + public R> refund(@RequestBody Map requestData) { + try { + String outTradeNo = (String) requestData.get("outTradeNo"); + Integer total = Integer.valueOf(requestData.get("total").toString()); + Integer refund = Integer.valueOf(requestData.get("refund").toString()); + + Map requestMap = new HashMap<>(); + requestMap.put("out_trade_no", outTradeNo); + requestMap.put("out_refund_no", "refund_" + UUID.randomUUID().toString().replace("-", "")); + + // 设置金额信息 + Map amount = new HashMap<>(); + amount.put("refund", refund); + amount.put("total", total); + amount.put("currency", "CNY"); + requestMap.put("amount", amount); + + String path = "/v3/refund/domestic/refunds"; + String result = callWxPayApi(path, requestMap); + Map responseMap = JsonUtils.parseObject(result, Map.class); + + return R.ok(responseMap); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("申请退款失败:" + e.getMessage()); + } + } + + /** + * 查询退款状态 + */ + @SaIgnore + @GetMapping("/queryRefund") + public R> queryRefund(@RequestParam String outRefundNo) { + try { + String path = "/v3/refund/domestic/refunds/" + outRefundNo; + String result = callWxPayApi(path, null); + Map responseMap = JsonUtils.parseObject(result, Map.class); + + return R.ok(responseMap); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("查询退款失败:" + e.getMessage()); + } + } + + /** + * 微信支付回调接口 + */ + @SaIgnore + @PostMapping("/wxPayCallBack") + public String wxPayCallBack(HttpServletRequest request, HttpServletResponse response) { + try { + // 获取请求头和请求体 + Map headers = WxPayUtil.getHeaders(request); + String requestBody = WxPayUtil.getRequestBody(request); + + // 记录回调信息 + System.out.println("接收到微信支付回调: " + requestBody); + + // 获取签名相关信息 + String timestamp = headers.get("wechatpay-timestamp"); + String nonce = headers.get("wechatpay-nonce"); + String signature = headers.get("wechatpay-signature"); + String serialNo = headers.get("wechatpay-serial"); + + // 验证签名 + // 这里需要根据证书序列号获取对应的公钥 + // PublicKey publicKey = ... 获取公钥的逻辑 + + // 解析请求体 + Map bodyMap = JsonUtils.parseObject(requestBody, Map.class); + Map resourceMap = (Map) bodyMap.get("resource"); + + // 获取加密数据 + String ciphertext = (String) resourceMap.get("ciphertext"); + String nonce64 = (String) resourceMap.get("nonce"); + String associatedData = (String) resourceMap.get("associated_data"); + + // 解密数据 + String decryptedData = WxPayUtil.decryptToString( + associatedData != null ? associatedData.getBytes() : new byte[0], + Base64.getDecoder().decode(nonce64), + ciphertext, + WxPayUtil.getApiV3Key().getBytes() + ); + + // 解析解密后的数据 + Map decryptedMap = JsonUtils.parseObject(decryptedData, Map.class); + + // 获取商户订单号和交易状态 + String outTradeNo = (String) decryptedMap.get("out_trade_no"); + String tradeState = (String) decryptedMap.get("trade_state"); + String transactionId = (String) decryptedMap.get("transaction_id"); + String attach = (String) decryptedMap.get("attach"); + + // 处理支付结果 + if ("SUCCESS".equals(tradeState)) { + // 支付成功,更新订单状态 + // 这里可以调用订单服务更新状态 + Long taskId = Long.valueOf(attach); + System.out.println("支付成功,taskId: " + taskId + ", 订单号: " + outTradeNo); + // TODO: 处理业务逻辑,例如更新订单状态 + } + + // 返回成功 + Map result = new HashMap<>(); + result.put("code", "SUCCESS"); + result.put("message", "成功"); + return JsonUtils.toJsonString(result); + } catch (Exception e) { + e.printStackTrace(); + // 返回失败 + Map result = new HashMap<>(); + result.put("code", "FAIL"); + result.put("message", e.getMessage()); + return JsonUtils.toJsonString(result); + } + } + + // 查询用户是否为小程序孔网翻新会员 + @SaIgnore + @GetMapping("/queryUserIsKwfwMember") + public R> queryUserIsKwfwMember(@RequestParam String userId) { + try { + long userIdLong = Long.parseLong(userId); + Map params = new HashMap<>(); + params.put("userId", userIdLong); // 保持小写 u + params.put("type", 3); // 小写 t + params.put("payStatus", 0); // 小写 p + + // 调用外部接口 + String path = "/user/checkPaymentRecord"; + String goUrl = configService.selectConfigByKey("go.url"); +// String goUrl = "http://localhost:9004/api"; + String responseStr = InterfaceUtils.getInterfacePost(goUrl, path, params); + + // 解析响应JSON + Map responseMap = JsonUtils.parseObject(responseStr, Map.class); + if (responseMap == null) { + Map errorResult = new HashMap<>(); + errorResult.put("isMember", false); + return R.fail("响应数据解析失败", errorResult); + } + + // 检查响应状态码 + Integer code = (Integer) responseMap.get("code"); + if (code == null || code != 200) { + String msg = (String) responseMap.get("msg"); + Map errorResult = new HashMap<>(); + errorResult.put("isMember", false); + return R.fail("接口调用失败: " + (msg != null ? msg : "未知错误"), errorResult); + } + + // 提取data字段的值 + Boolean isMember = (Boolean) responseMap.get("data"); + Map result = new HashMap<>(); + result.put("isMember", isMember != null ? isMember : false); + + return R.ok("查询成功", result); + + } catch (Exception e) { + // 异常处理 + Map errorResult = new HashMap<>(); + errorResult.put("isMember", false); + return R.fail("查询失败: " + e.getMessage(), errorResult); + } + } + + /** + * 扫码获取在售/已售商品 + * + * @param keyword 搜索关键词(ISBN) + * @param dataType 数据类型,0表示在售商品,1表示已售商品 + * @param cookie 请求Cookie信息 + * @return 商品信息结果 + */ + @SaIgnore + @GetMapping("/getOnSaleGoods") + public R> getOnSaleGoods(@RequestParam String keyword, + @RequestParam(defaultValue = "0") int dataType, + @RequestParam String cookie) { + try { + // 构建请求URL + String baseUrl = "https://search.kongfz.com/pc-gw/search-web/client/pc/product/keyword/list"; + + // 构建请求参数 + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl) + .queryParam("dataType", dataType) + .queryParam("keyword", keyword) +// .queryParam("page", 1) + .queryParam("userArea", "13003000000"); + + // 创建请求头 + HttpHeaders headers = new HttpHeaders(); + headers.set("Accept", "application/json, text/plain, */*"); + headers.set("Accept-Language", "zh-CN,zh;q=0.9"); + headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"); + headers.set("Referer", "https://search.kongfz.com/product/?dataType=" + dataType + "&keyword=" + keyword + "&page=1"); + headers.set("Cookie", "PHPSESSID="+cookie); + + // 创建RestTemplate实例 + RestTemplate restTemplate = new RestTemplate(); + + // 发送请求并获取响应 + ResponseEntity response = restTemplate.exchange( + builder.toUriString(), + HttpMethod.GET, + new org.springframework.http.HttpEntity<>(headers), + String.class + ); + + // 解析响应数据 + String responseBody = response.getBody(); + Map responseMap = JsonUtils.parseObject(responseBody, Map.class); + + // 构建返回结果 + Map result = new HashMap<>(); + result.put("data", responseMap); + result.put("status", response.getStatusCode().value()); + + return R.ok(result); + } catch (Exception e) { + e.printStackTrace(); + return R.fail("获取商品信息失败:" + e.getMessage()); + } + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XyBindController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XyBindController.java new file mode 100644 index 0000000..694c5ca --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/XyBindController.java @@ -0,0 +1,179 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.bo.ShopBo; +import org.dromara.zhishu.domain.bo.XyBindBo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.XyBindVo; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.service.IXyBindService; +import org.dromara.zhishu.service.impl.XianYvQueryShopImpl; +import org.redisson.api.RList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/xy/api") +public class XyBindController { + + private final IXyBindService xyBindService; + private final IShopService shopService; + private final XianYvQueryShopImpl xianYvQueryShop; + + @GetMapping("/list") + public TableDataInfo listByCreateBy(XyBindBo bo, PageQuery pageQuery) { + return xyBindService.queryPageList(bo, pageQuery); + } + + @SaIgnore + @GetMapping("/insertBlind/{appName}/{mallId}/{token}") + public R insertBlind(@PathVariable("appName") String appName,@PathVariable("mallId") Long mallId,@PathVariable("token") String token) { + Long userId = LoginHelper.getUserId(); + XyBindBo bo = new XyBindBo(); + if(xyBindService.queryById(token) != null){ + return R.fail("您已绑定该店铺"); + } else { + bo.setAppName(appName); + bo.setMallId(mallId); + bo.setToken(token); + bo.setCreateBy(userId); + + xyBindService.insertByBo(bo); + return R.ok("成功绑定店铺"); + } + } + + @SaIgnore + @GetMapping("/updateXyBind/{token}/{appName}") + public R updateXyBind(@PathVariable("token") String token, @PathVariable("appName") String appName) { + Long userId = LoginHelper.getUserId(); + + // 根据token查询绑定信息 + XyBindVo existingBind = xyBindService.queryById(token); + if(existingBind == null){ + return R.fail("未找到对应的绑定信息"); + } + + // 更新appName + XyBindBo bo = new XyBindBo(); + bo.setToken(token); + bo.setAppName(appName); + bo.setUpdateBy(userId); + + // 调用更新服务 + boolean success = xyBindService.updateByBo(bo); + if(success) { + return R.ok("成功更新闲管家名"); + } else { + return R.fail("更新失败"); + } + } + + @SaIgnore + @GetMapping("/deleteXyBind/{token}") + public R deleteXyBind(@PathVariable("token") String token) { + Long userId = LoginHelper.getUserId(); + + // 根据token查询绑定信息 + XyBindVo existingBind = xyBindService.queryById(token); + if(existingBind == null){ + return R.fail("未找到对应的绑定信息"); + } + + // 删除绑定信息 + boolean success = xyBindService.deleteByToken(token); + if(success) { + return R.ok("成功删除绑定信息"); + } else { + return R.fail("删除失败"); + } + } + + // 同步闲鱼店铺 + @SaIgnore + @GetMapping("/syncShop/{appName}/{mallId}/{token}") + public R syncShop(@PathVariable("appName") String appName,@PathVariable("mallId") Long mallId,@PathVariable("token") String token) { + Long userId = LoginHelper.getUserId(); + + R>> shopResult = xianYvQueryShop.XianYvQueryShop(mallId.toString(), token); + + if ((shopResult.getCode() == 200) && shopResult.getData() != null && !shopResult.getData().isEmpty()) { + List> xyUser = shopResult.getData(); + + // 循环创建店铺,每个店铺名称创建一个店铺记录 + for (Map userInfo : xyUser) { + + String userName = userInfo.get("user_name"); + String shopName = userInfo.get("shop_name"); + String expirationTime = userInfo.get("expiration_time"); + + ShopVo shopVo = shopService.selectByGoofishShopKey(userName); + ShopBo shopBo = new ShopBo(); + if (shopVo != null) { + shopBo.setId(shopVo.getId()); + shopBo.setShopName(shopVo.getShopName()); + shopBo.setMallId(Long.parseLong(mallId.toString())); + shopBo.setToken(token); + long timestamp = Long.parseLong(expirationTime) * 1000L; + shopBo.setExpirationTime(new Date(timestamp)); + shopBo.setShopAliasName(shopVo.getShopName()); + shopBo.setShopKey(shopVo.getShopKey()); + shopBo.setShopGroup(appName); + long currentTimestamp = System.currentTimeMillis(); + shopBo.setUpdateTime(new Date(currentTimestamp)); + if (currentTimestamp < timestamp) { + shopBo.setShopAuthorize("1"); + } + + shopService.updateByBo(shopBo); + } else { + // 创建咸鱼店铺 + shopBo.setShopName(shopName); // 使用接口返回的店铺名称 + shopBo.setMallId(Long.parseLong(mallId.toString())); + shopBo.setToken(token); + shopBo.setShopKey(userName); + shopBo.setShopAliasName(shopName); // 使用接口返回的店铺名称 + long timestamp = Long.parseLong(expirationTime) * 1000L; + shopBo.setExpirationTime(new Date(timestamp)); // 使用接口返回的店铺过期时间 + shopBo.setShopAuthorize("1"); + shopBo.setShopGroup(appName); + + shopBo.setShopType("5"); + shopBo.setAddTime(DateUtils.parseDate(DateUtils.getTime())); + shopBo.setCreateBy(userId); + shopBo.setCreateTime(DateUtils.parseDate(DateUtils.getTime())); + shopBo.setTenant_id("000000"); + shopBo.setShopAuthorize("1"); + long currentTimestamp = System.currentTimeMillis(); + shopBo.setUpdateTime(new Date(currentTimestamp)); + + shopService.insertByBo(shopBo); + + // 可以添加日志记录 + System.out.println("成功创建店铺: " + shopName); + } + } + + return R.ok("成功创建 " + xyUser.size() + " 个店铺"); + + } else { + return R.ok("账户店铺为空,无法添加"); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsController.java new file mode 100644 index 0000000..cacb31a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsController.java @@ -0,0 +1,861 @@ +package org.dromara.zhishu.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.pdd.pop.sdk.common.util.JsonUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysUser; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.StockChangeLog; +import org.dromara.zhishu.domain.Task; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.bo.BatchUpdateCargoBo; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsBo; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsDetailBo; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.dto.request.*; +import org.dromara.zhishu.domain.excel.GoodsExcel; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.domain.vo.ProductSubmitResultVo; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.service.factory.ShopGoodsFactory; +import org.dromara.zhishu.service.strategy.ShopGoodsStrategy; +import org.dromara.zhishu.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.Resource; +import org.springframework.http.*; + +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; +import java.util.concurrent.CompletableFuture; + +/** + * 商品信息 + * + * @author Lion Li + * @date 2025-03-07 + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@Lazy +@RequestMapping("/zhishu/shopGoods") +public class ZhishuShopGoodsController extends BaseController { + + private final IZhishuShopGoodsService zhishuShopGoodsService; + private final IShopService shopService; + private final IShopGoodsPublishedService shopGoodsPublishedService; + private final ITaskService taskService; + private final IZhishuShopGoodsDetailService zhishuShopGoodsDetailService; + private final ITFreightService freightService; + private final ITShelvesService shelvesService; + private final ITDepotService depotService;; + + @Autowired + private IRunningTaskByShopService iRunningTaskByShopService; + + @Autowired + private ISysConfigService configService; + + + @Autowired + private RestTemplate restTemplate; + /** + * 查询商品信息列表 + */ + @SaCheckPermission("zhishu:shopGoods:list") + @GetMapping("/list") + @SaIgnore + public TableDataInfo list(ZhishuShopGoodsBo bo, PageQuery pageQuery) { + return zhishuShopGoodsService.queryPageList(bo, pageQuery); + } + + /** + * 导出商品信息列表 + */ + @SaCheckPermission("zhishu:shopGoods:export") + @Log(title = "商品信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ZhishuShopGoodsBo bo, HttpServletResponse response) { + List list = zhishuShopGoodsService.queryList(bo); + ExcelUtil.exportExcel(list, "商品信息", ZhishuShopGoodsVo.class, response); + } + + /** + * 获取商品信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shopGoods:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable String id) { + return R.ok(zhishuShopGoodsService.queryById(id)); + } + + /** + * 根据商品条码查询商品信息 + * + * @param barcode 商品条码 + * @return 商品信息 + */ + @GetMapping("/info") + public R> getProductByBarcode(@RequestParam String barcode) { + return R.ok(zhishuShopGoodsService.getProductByBarcode(barcode)); + } + + /** + * 提交商品信息 + * + * @param form 商品信息表单 + * @return 无 + */ + @PostMapping("/submit") + @SaIgnore + @RepeatSubmit + public R submitProduct(@RequestBody ProductForm form) { + ProductSubmitResultVo result = zhishuShopGoodsService.submitProduct(form); + return R.ok(result); + } + + + /** + * 版权页上传 + * + * @param form + * @return + */ + @PostMapping("/submitFromCopyrightPage") + @SaIgnore + @RepeatSubmit + public R submitFromCopyrightPage(@RequestBody ProductForm form) { + return R.ok(zhishuShopGoodsService.submitFromCopyrightPage(form)); + } + + /** + * 重复书籍 + * + * @param form + * @return + */ + @PostMapping("/repeatBook") + @SaIgnore + @RepeatSubmit + public R repeatBook(@RequestBody ProductForm form) { + return R.ok(zhishuShopGoodsService.repeatBook(form)); + } + + /** + * isbn比价 + */ + @GetMapping("/kongfz/search") + @SaIgnore + @RepeatSubmit + public R> searchBooks(@RequestParam("keyword") String keyword, // 同时支持ISBN/书名 + @RequestParam(value = "searchType", defaultValue = "category") String searchType, + @RequestParam("sortType") String sortType, + @RequestParam("conditionValue") String conditionValue, + @RequestParam("cookies") String cookies, + @RequestParam(value = "publisher", required = false) String publisher, // 设置为非必需 + @RequestParam(value = "author", required = false) String author) { // 设置为非必需 + List products = zhishuShopGoodsService.getProductByKongfz(keyword, searchType, sortType, conditionValue, cookies, publisher, author); + return R.ok(products); + } + + /** + * 根据书名获取作者和出版社信息 + */ + @GetMapping("/getAuthorAndPublisher") + @SaIgnore + public R> getAuthorAndPublisher(@RequestParam("keyword") String keyword, @RequestParam("cookies") String cookies) { + List products = zhishuShopGoodsService.getAuthorAndPublisher(keyword, cookies); + return R.ok(products); + } + + /** + * python获取商品信息 + */ + @PostMapping("/python/{isbn}") + @SaIgnore + @RepeatSubmit + public R pythonGetProductByBarcode(@RequestParam String isbn) { + ProductVo productVo = zhishuShopGoodsService.queryBookByPython(isbn); + return R.ok(productVo); + } + + /** + * xcx上书记录 + * + * @param + * @return + */ + @GetMapping("/xcx/{phoneNumber}") + @Log(title = "商品信息", businessType = BusinessType.UPDATE) + @SaIgnore + public R> edit( + @PathVariable String phoneNumber, + @RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "10") int pageSize, + @RequestParam(required = false) String date) { + TableDataInfo page = zhishuShopGoodsService.selectShopGoodsByPhoneNumber(phoneNumber, pageNum, pageSize, date); + return R.ok(page); + } + + /** + * 查询获取对应商品数据 + */ + @GetMapping("/getGoodsData") + @SaIgnore + public R> getGoodsData(@RequestParam String code, + @RequestParam Long userId, + @RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "10") int pageSize, + @RequestParam(required = false) String date) { + TableDataInfo page = zhishuShopGoodsService.queryGoodListByArtNo(code, userId, pageNum, pageSize, date); + return R.ok(page); + } + + /** + * 修改xcx货号 + */ + @PostMapping("/batchMoveItems") + @SaIgnore + public R batchMoveItems(@RequestParam(value = "itemIds") List itemIds, + @RequestParam("warehouse") String warehouse, + @RequestParam("shelf") String shelf, + @RequestParam("freight") String freight, + @RequestParam(value = "userId") Long userId) { + try { + String result = zhishuShopGoodsService.batchMoveItems(itemIds, warehouse,shelf, freight, userId); + return R.ok(result); + } catch (Exception e) { + log.error("批量移动商品位置异常", e); + return R.fail("操作失败:" + e.getMessage()); + } + } + + /** + * 新增商品信息 + */ + @SaCheckPermission("zhishu:shopGoods:add") + @Log(title = "商品信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ZhishuShopGoodsBo bo) { + return toAjax(zhishuShopGoodsService.insertByBo(bo)); + } + + /** + * 修改商品信息 + */ + @SaCheckPermission("zhishu:shopGoods:edit") + @Log(title = "商品信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ZhishuShopGoodsBo bo) { +// 获取当前用户id + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + return toAjax(zhishuShopGoodsService.updateByBo(bo)); + } + + /** + * 删除商品信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:shopGoods:remove") + @Log(title = "商品信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable String[] ids, Boolean isProSynch) { + return toAjax(zhishuShopGoodsService.deleteWithValidByIds(List.of(ids), isProSynch)); + } + + /** + * 上传图片 + */ + @PostMapping("/uploadImages") + @SaIgnore + public Map uploadImg(@RequestParam("file") MultipartFile file) { + return zhishuShopGoodsService.uploadImg(file); + // 获取token + } + + /** + * 上传图片 + */ + @GetMapping("/SynShopImg") + @SaIgnore + public R synShopImg(@RequestParam("userId") Long userId) { + zhishuShopGoodsService.synShopImg(userId); + return R.ok(); + } + /** + * 同步pdd图片 + */ + @GetMapping("/synPddShopImg") + @SaIgnore + public R synPddShopImg(@RequestParam("userId") Long userId) { + zhishuShopGoodsService.synPddShopImg(userId); + return R.ok(); + } + + /** + * 导入商品信息 + */ + @PostMapping("/importExcel") + public R importExcel(@RequestParam("file") MultipartFile file, + @RequestParam("depotId") Long depotId, + @RequestParam("firstDepotId") Long firstDepotId, + @RequestParam("secondDepotId") Long secondDepotId, + @RequestParam("code") String code) { + ExcelResult list = null; + try (InputStream inputStream = file.getInputStream()) { + // 商品信息列表 + list = ExcelUtil.importExcel(inputStream, GoodsExcel.class, true); + + } catch (IOException e) { + throw new RuntimeException(e); + } + String Filename = file.getOriginalFilename(); + + TFreightVo tFreightVo = freightService.queryById(depotId); + String allowDistribution = "0"; + if (tFreightVo == null){ + return R.fail("三级货架不存在"); + }else{ + allowDistribution = tFreightVo.getAllowDistribution(); + } + + // 添加到数据库 + List shopGoodsBoList = new ArrayList<>(); + for (GoodsExcel goodsExcel : list.getList()) { + System.out.println(JsonUtil.transferToJson(goodsExcel)); + ZhishuShopGoodsBo zhishuShopGoodsBo = new ZhishuShopGoodsBo(); + // 赋值.. +// zhishuShopGoodsBo.setId(UUID.randomUUID().toString()); +// zhishuShopGoodsBo.setItemNumber(goodsExcel.getGoodsNo()); + zhishuShopGoodsBo.setUserId(LoginHelper.getUserId()); + zhishuShopGoodsBo.setGoodsName(goodsExcel.getGoodsName()); + zhishuShopGoodsBo.setArtNo(goodsExcel.getArtNo()); + zhishuShopGoodsBo.setIsbn(goodsExcel.getIsbn()); + zhishuShopGoodsBo.setConditionCode(String.valueOf(goodsExcel.getConditionCode())); + zhishuShopGoodsBo.setPrice(goodsExcel.getPrice()); + zhishuShopGoodsBo.setInventory(goodsExcel.getInventory()); +// zhishuShopGoodsBo.setFixPrice(goodsExcel.getFixPrice()); +// zhishuShopGoodsBo.setProductId(goodsExcel.getGoodsNo()); +// zhishuShopGoodsBo.setIsArtNoConversion(goodsExcel.getIsArtNoConversion()); + zhishuShopGoodsBo.setDepotId(firstDepotId); + zhishuShopGoodsBo.setIsJoinDistribution(Integer.parseInt(allowDistribution)); + shopGoodsBoList.add(zhishuShopGoodsBo); + } + // 批量导入数据库 + Boolean b = zhishuShopGoodsService.insertListGoodsInfo(shopGoodsBoList, firstDepotId, secondDepotId, depotId, Filename, code,null,"7"); + + return toAjax(b); + } + + @PostMapping("/importApi") + @SaIgnore + public R importApi(Long userId,String goodsName,String artNo,String isbn,String conditionCode,Long price,Long inventory, + Long depotId,String code){ + TFreightVo tFreightVo = freightService.queryById(depotId); + String allowDistribution = "0"; + if (tFreightVo == null){ + return R.fail("三级货架不存在"); + }else{ + allowDistribution = tFreightVo.getAllowDistribution(); + } + + TShelvesVo shelvesVo = shelvesService.queryById(tFreightVo.getShelvesId()); + TDepotVo depotVo = depotService.queryById(Long.parseLong(shelvesVo.getDepotId())); + Long firstDepotId = depotVo.getId(); + Long secondDepotId = shelvesVo.getId(); + + + List shopGoodsBoList = new ArrayList<>(); + ZhishuShopGoodsBo zhishuShopGoodsBo = new ZhishuShopGoodsBo(); + zhishuShopGoodsBo.setUserId(userId); + zhishuShopGoodsBo.setGoodsName(goodsName); + zhishuShopGoodsBo.setArtNo(artNo); + zhishuShopGoodsBo.setIsbn(isbn); + zhishuShopGoodsBo.setConditionCode(conditionCode); + zhishuShopGoodsBo.setPrice(price); + zhishuShopGoodsBo.setInventory(inventory); + zhishuShopGoodsBo.setDepotId(firstDepotId); + zhishuShopGoodsBo.setIsJoinDistribution(Integer.parseInt(allowDistribution)); + shopGoodsBoList.add(zhishuShopGoodsBo); + // 获取当前时间秒级时间戳 + Long timestamp = System.currentTimeMillis() / 1000; + // 批量导入数据库 + Boolean b = zhishuShopGoodsService.insertListGoodsInfo(shopGoodsBoList, firstDepotId, secondDepotId, depotId, "接口调用-"+timestamp, code,userId,"6"); + return toAjax(b); + } + + @SaCheckPermission("zhishu:shopGoods:goodsAdd") + @PostMapping("/goodsAdd") + public R goodsAdd(@RequestBody Map map, HttpServletRequest request) { + Map headers = PddResultUtil.getPddHeaderMap(request); + map.put("userId", LoginHelper.getUserId()); + // 调用本地服务 + map.putAll(headers); + zhishuShopGoodsService.goodsAdd(map); + return toAjax(1); + } + + /** + * 初始化库存 + */ + @GetMapping("/batchInitInventoryToRedis") + @SaIgnore + public Boolean batchInitInventoryToRedis() { + zhishuShopGoodsService.batchInitInventoryToRedis(); + return true; + } + + /** + * 查询库存 + */ + @GetMapping("/queryInventory") + @SaIgnore + public R queryInventory(@NotNull(message = "商品Id不能为空") Long shopGoodsId) { + Integer inventory = zhishuShopGoodsService.queryInventory(shopGoodsId); + return R.ok(inventory); + } + + + /** + * 操作库存 + */ + @PostMapping("/operatingInventory") + @SaIgnore + public Boolean operatingInventory(@RequestBody OperatingInventoryVo operatingInventoryVo) { + System.out.println("接收到操作库存请求:" + JSONObject.toJSONString(operatingInventoryVo)); + // 根据平台类型和平台店铺Id查询出店铺Id + ShopVo shopVo; + if(operatingInventoryVo.getShopType() == 5){ + //如果是闲鱼店铺,则mallId存的是店铺id + shopVo = shopService.queryById(operatingInventoryVo.getMallId()); + }else{ + shopVo = shopService.queryByMailId(operatingInventoryVo.getMallId(), operatingInventoryVo.getShopType()); + } + Assert.isTrue(ObjectUtil.isNotNull(shopVo), "店铺不存在"); + for (OperatingInventoryVo.GoodsItem goodsItem : operatingInventoryVo.getGoodsItems()) { + // 根据店铺Id和商品平台Id查询出商品Id + ShopGoodsPublishedVo shopGoodsPublishedVo = shopGoodsPublishedService.queryByPlatformId(shopVo.getId().toString(), goodsItem.getPlatformId()); + // 根据商品Id进行库存操作 + Assert.isTrue(ObjectUtil.isNotNull(shopGoodsPublishedVo), "商品不存在"); + Boolean result = zhishuShopGoodsService.operatingGoodsInventory(shopVo.getId(), operatingInventoryVo.getShopType(), operatingInventoryVo.getOperationType(), shopGoodsPublishedVo, goodsItem.getCount(), operatingInventoryVo.getOrderSn()); + if (!result) { + log.error("库存操作失败:操作类型-{},商品Id-{},数量-{}", operatingInventoryVo.getOperationType(), shopGoodsPublishedVo.getShopGoodsId(), goodsItem.getCount()); + } + } + return true; + } + + + /** + * 操作库存 + */ + @PostMapping("/goofishoperatingInventory") + @SaIgnore + public Boolean goofishoperatingInventory(@RequestBody OperatingInventoryVo operatingInventoryVo) { + System.out.println("接收到操作库存请求:" + JSONObject.toJSONString(operatingInventoryVo)); + // 根据平台类型和平台店铺Id查询出店铺Id + ShopVo shopVo = shopService.queryByMailId(operatingInventoryVo.getMallId(), operatingInventoryVo.getShopType()); + Assert.isTrue(ObjectUtil.isNotNull(shopVo), "店铺不存在"); + for (OperatingInventoryVo.GoodsItem goodsItem : operatingInventoryVo.getGoodsItems()) { + ZhishuShopGoodsVo zhishuShopGoodsVo = zhishuShopGoodsService.selectShopGoodsByArtNo(goodsItem.getPlatformId()); + // 根据店铺Id和商品平台Id查询出商品Id + + // 根据商品Id进行库存操作 + Assert.isTrue(ObjectUtil.isNotNull(zhishuShopGoodsVo), "商品不存在"); + Boolean result = zhishuShopGoodsService.goofishoperatingGoodsInventory(shopVo.getId(), operatingInventoryVo.getShopType(), operatingInventoryVo.getOperationType(), zhishuShopGoodsVo, goodsItem.getCount(), operatingInventoryVo.getOrderSn()); + if (!result) { + log.error("库存操作失败:操作类型-{},商品Id-{},数量-{}", operatingInventoryVo.getOperationType(), zhishuShopGoodsVo.getId(), goodsItem.getCount()); + } + } + return true; + } + + + + + /** + * 拉取孔夫子/万里牛商品 + * + * @param shopId + * @return + */ + @SaIgnore + @GetMapping("/synchronizationGoods") + public R synchronizationGoods(@NotNull(message = "店铺Id不能为空") @RequestParam("shopId") Long shopId, Integer shopType) { + if (ObjectUtil.isNull(shopType)) { + ShopVo shopVo = shopService.queryById(shopId); + shopType = Integer.valueOf(shopVo.getShopType()); + } + try { + Objects.requireNonNull(ShopGoodsFactory.getStrategy(shopType)).synchronizationGoods(shopId); + return R.ok("拉取成功"); + } catch (Exception e) { + return R.fail(e.getMessage()); + } + } + + /** + * 比对存入表格 + */ + @SaIgnore + @PostMapping("/goodsComparison") + public Boolean goodsComparison(@RequestBody GoodsComparisonRequest request) { + zhishuShopGoodsService.goodsComparison(request); + return true; + } + + /** + * 分批比对商品 + */ + @SaIgnore + @DeleteMapping("/deleteTaskDataByShopId") + public Boolean deleteTaskDataByShopId(@RequestParam("shopId") Long shopId) { + zhishuShopGoodsService.deleteTaskDataByShopId(shopId); + return true; + } + /** + * 拉取孔网数据到erp商品表 + */ + @SaIgnore + @PostMapping("/batchGoodsComparison") + public Boolean batchGoodsComparison(@RequestBody BatchGoodsRequest request) { + System.out.println("接收到批量比对请求:" + JSONObject.toJSONString(request)+"zhuxiaodong"); + zhishuShopGoodsService.createShopGoodsList(request); + // zhishuShopGoodsService.batchGoodsComparison(request); + return true; + } + + /** + * 根据用户选择货号规则将商品存入数据库 + */ + @SaIgnore + @PostMapping("/saveShopGoodsInDb") + public R saveShopGoodsInDb(@Validated @RequestBody SaveGoodsVo saveGoodsVo) { + try { + zhishuShopGoodsService.saveShopGoodsInDb(saveGoodsVo); + return R.ok("保存成功"); + } catch (Exception e) { + return R.fail(e.getMessage()); + } + } + + + /** + * 随机修改孔夫子货号(仅测试使用) + */ + @SaIgnore + @GetMapping("/randomUpdateArtNo") + public R randomUpdateArtNo(Long userId, Long shopId) { + try { + zhishuShopGoodsService.randomUpdateArtNo(userId, shopId); + return R.ok("修改"); + } catch (Exception e) { + return R.fail(e.getMessage()); + } + } + + // /** + // * 导入Excel恢复孔夫子货号(回滚备用) + // */ + // @SaIgnore + // @PostMapping("/rollbackUpdateArtNo") + // public R rollbackUpdateArtNo(Long userId,Long shopId) { + // try { + // zhishuShopGoodsService.randomUpdateArtNo(userId,shopId); + // return R.ok("修改"); + // } catch (Exception e) { + // return R.fail(e.getMessage()); + // } + // } + + /** + * 获取商品变更库存数据 + * + * @param id 主键 + */ + @GetMapping("/stockLog/{id}") + public R> getStockLog(@PathVariable String id) { + List list = zhishuShopGoodsService.selectShopStockLog(id); + return R.ok(list); + } + + // 通过传入的货号,查询出对应的仓库id,返回仓库id和货架id和货位id + @GetMapping("/getDepotIds") + @SaIgnore + public R getDepotIds(String artNo, String userId) { + Map map = zhishuShopGoodsService.selectDepotIds(userId, artNo); + return R.ok(map); + } + + @PostMapping("/editShopGoodsPrice") + @SaIgnore + public void editShopGoodsPrice(@RequestBody Map map) { + String artNo = map.get("artNo").toString(); + String price = map.get("price").toString(); + + ZhishuShopGoodsVo vo = zhishuShopGoodsService.selectShopGoodsByArtNo(artNo); + + ZhishuShopGoodsBo bo = new ZhishuShopGoodsBo(); + bo.setId(vo.getId()); + bo.setPrice(Long.parseLong(price)); + zhishuShopGoodsService.updateByBo(bo); + } + + @GetMapping("/getShopGoodsByArtNo") + @SaIgnore + public Map getShopGoodsByArtNo(String artNo){ + Map map = new HashMap(); + ZhishuShopGoodsVo vo = zhishuShopGoodsService.selectShopGoodsByArtNo(artNo); + if(vo != null){ + map.put("code",200); + map.put("msg","查询成功"); + map.put("data",vo); + }else{ + map.put("code",500); + map.put("msg","未查询到商品数据"); + } + return map; + } + + /** + * 通过平台订单Id查询库存操作日志 + */ + @GetMapping("/queryStockChangeLogByOrderSn") + @SaIgnore + public R queryStockChangeLogByOrderSn(@NotNull(message = "平台订单编码不能为空") String orderSn, @NotNull(message = "库存操作日志类型不能为空") Integer type) { + StockChangeLog stockChangeLogVo = zhishuShopGoodsService.queryStockChangeLogByOrderSn(orderSn, type); + return R.ok(stockChangeLogVo); + } + + /** + * 操作下架商品 + */ + @PostMapping("/operatingSoldOut") + @SaIgnore + public Boolean operatingSoldOut(@RequestBody OperatingSoldOutRequest request) { + System.out.println("接收到操作下架商品请求:" + JSONObject.toJSONString(request)); + // 根据平台类型和平台店铺Id查询出店铺Id + ShopVo shopVo = shopService.queryByMailId(request.getMallId(), request.getPlatformType()); + Assert.isTrue(ObjectUtil.isNotNull(shopVo), "店铺不存在"); + for (OperatingInventoryVo.GoodsItem goodsItem : request.getGoodsItems()) { + // 根据店铺Id和商品平台Id查询出商品Id + ShopGoodsPublishedVo shopGoodsPublishedVo = shopGoodsPublishedService.queryByPlatformId(shopVo.getId().toString(), goodsItem.getPlatformId()); + // 根据商品Id进行下架操作 + Assert.isTrue(ObjectUtil.isNotNull(shopGoodsPublishedVo), "商品不存在"); + Boolean result = zhishuShopGoodsService.operatingGoodsSoldOut(shopVo.getId(), request.getPlatformType(), request.getLogType(), request.getOperationType(), shopGoodsPublishedVo, request.getOrderSn()); + if (!result) { + log.error("下架操作失败:操作类型-{},商品Id-{},数量-{}", request.getOperationType(), shopGoodsPublishedVo.getShopGoodsId(), goodsItem.getCount()); + } + } + return true; + } + + /** + * 通过userId查询对应用户商品表数据条数 + */ + @GetMapping("/queryGoodsCountByUserId") + @SaIgnore + public R queryGoodsCountByUserId(@NotNull(message = "用户ID不能为空") Long userId) { + Long count = zhishuShopGoodsService.queryGoodsCountByUserId(userId); + return R.ok(count); + } + + /** + * 通过userId查询对应用户 + */ + @GetMapping("/queryUserIdByUserId") + @SaIgnore + public R queryUserIdByShopId(@NotNull(message = "店铺ID不能为空") Long userId) { + SysUser user = zhishuShopGoodsService.queryUserByUserId(userId); + return R.ok(user); + } + + /** + * 批量修改货区 + */ + @SaIgnore + @PutMapping("/batchUpdateAre") + public R editBatchAre(@RequestBody BatchUpdateCargoBo bo) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + return toAjax(zhishuShopGoodsService.batchUpdateCargo(bo)); + } + + /** + * 同步至自营书品 + */ + @SaIgnore + @GetMapping("/syncRunningTaskToShopGoods") + public R syncRunningTaskToShopGoods(@NotNull(message = "店铺ID不能为空") String shopId, + @RequestParam("freightId") String freightId, + @RequestParam("id") String id) { + Long userId = LoginHelper.getUserId(); + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + // 判断是2-孔网店铺还是1-拼多多店铺 + TaskBo taskBo = new TaskBo(); + // 存储任务信息 + taskBo.setTaskType("SYNC_MY_GOODS"); + taskBo.setRelationId(Long.valueOf(id)); + taskBo.setFileName("同步至自营书品"); + taskBo.setShopIds(shopId); + taskBo.setShopNames(shopVo.getShopName()); + taskBo.setDataNum(0L); + taskBo.setTaskStatus("0"); + taskService.insertByBo(taskBo); + // 获取当前用户id + CompletableFuture.runAsync(() -> { + try { + zhishuShopGoodsService.syncRunningTaskToShopGoods(Long.valueOf(shopId), Long.valueOf(freightId),userId,taskBo); + }catch (Exception e) { + log.error("同步至自营书品失败", e); + } + }); + return R.ok("创建同步任务成功,请前往任务列表查看任务进度"); + } + + @PostMapping("/synchronousTask") + @SaIgnore + public R synchronousTask(String shopId){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + // 拼多多同步任务 + if (shopVo.getShopType().equals("1")){ + TaskBo taskBo = new TaskBo(); + taskBo.setTaskType("SYNC_MY_GOODS"); + taskBo.setFileName("同步任务"); + taskBo.setShopIds(shopId); + taskBo.setShopNames(shopVo.getShopName()); + taskBo.setDataNum(0L); + taskBo.setTaskStatus("0"); + taskBo.setCreateBy(shopVo.getCreateBy()); + taskService.insertByBo(taskBo); + + // 获取当前用户id + CompletableFuture.runAsync(() -> { + try { + zhishuShopGoodsService.synchronousTask(shopVo,taskBo); + }catch (Exception e) { + log.error("同步至自营书品失败", e); + } + }); + } + + return R.ok("创建同步任务成功,请前往任务列表查看任务进度"); + } + + /** + * 批量修改店铺商品下架/改价 + * + * @return + */ + @SaIgnore + @PostMapping("/updateShopGoodsPrice") + public R updateShopGoodsPrice(@Validated @RequestBody UpdateShopGoodsPriceRequest request) { + // 查询店铺类型 + ShopVo shopVo = shopService.queryById(request.getShopId()); + Integer shopType = Integer.valueOf(shopVo.getShopType()); + Long mallId = shopVo.getMallId(); + String token = shopVo.getToken(); + + if (ObjectUtil.isNull(mallId) || ObjectUtil.isEmpty(token)) { + return R.fail("当前店铺未授权或授权过期"); + } + // 根据店铺类型选择不同策略 + ShopGoodsStrategy strategy = Objects.requireNonNull(ShopGoodsFactory.getStrategy(shopType)); + if (ObjectUtil.isNull(strategy)) { + return R.fail("获取策略失败错误", false); + } + Boolean result; + // 根据操作类型:0-下架 1.改价 做不同操作 + switch (request.getType()) { + case 0: + // 0-下架 + result = strategy.setShopGoodsOnSaleStatus(mallId, token, 0, request.getItems()); + break; + case 1: + // 1.改价 + result = strategy.updateShopGoodsPrice(mallId, token, request.getItems()); + break; + default: + return R.fail("操作类型错误", false); + } + return R.ok(result); + } + + @SaIgnore + @PostMapping("/updategoodszxd") + public void updategoodszxd(String shopId, String platformId) { + System.out.println("shopId:"+shopId); + System.out.println("platformId:"+platformId); + ShopVo shop= shopService.queryById(Long.parseLong(shopId)); + // 再去从库查询skuId 根据店铺Id和商品id + List successDataItemDtos = iRunningTaskByShopService.selectByGoodsId("t_running_task_" + shop.getId(), platformId); + Map allData = new HashMap(); + allData.put("shopId", shop.getId()); + allData.put("mallId", successDataItemDtos.get(0).getSkuId()); + allData.put("token", shop.getToken()); + allData.put("goodsId", platformId); + allData.put("quantity", 0); + + String pddIp = configService.selectConfigByKey("fuwubpdd.ip"); + InterfaceUtils.getInterfacePost(pddIp, "/api/pdd/inventory/inventorySync", allData); + } + + @SaIgnore + @PostMapping("/insertGoodsDetails") + public void insertGoodsDetails(@Validated @RequestBody ZhishuShopGoodsDetailBo bo) { + zhishuShopGoodsDetailService.insertByBo(bo); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsDetailController.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsDetailController.java new file mode 100644 index 0000000..7dfe02d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/controller/ZhishuShopGoodsDetailController.java @@ -0,0 +1,105 @@ +package org.dromara.zhishu.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsDetailVo; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsDetailBo; +import org.dromara.zhishu.service.IZhishuShopGoodsDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商品信息补全表 + * + * @author yxy + * @date 2025-06-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zhishu/shopGoodsDetail") +public class ZhishuShopGoodsDetailController extends BaseController { + + private final IZhishuShopGoodsDetailService zhishuShopGoodsDetailService; + + /** + * 查询商品信息补全表列表 + */ + @SaCheckPermission("zhishu:shopGoodsDetail:list") + @GetMapping("/list") + public TableDataInfo list(ZhishuShopGoodsDetailBo bo, PageQuery pageQuery) { + return zhishuShopGoodsDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出商品信息补全表列表 + */ + @SaCheckPermission("zhishu:shopGoodsDetail:export") + @Log(title = "商品信息补全表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ZhishuShopGoodsDetailBo bo, HttpServletResponse response) { + List list = zhishuShopGoodsDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "商品信息补全表", ZhishuShopGoodsDetailVo.class, response); + } + + /** + * 获取商品信息补全表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("zhishu:shopGoodsDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(zhishuShopGoodsDetailService.queryById(id)); + } + + /** + * 新增商品信息补全表 + */ + @SaCheckPermission("zhishu:shopGoodsDetail:add") + @Log(title = "商品信息补全表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ZhishuShopGoodsDetailBo bo) { + return toAjax(zhishuShopGoodsDetailService.insertByBo(bo)); + } + + /** + * 修改商品信息补全表 + */ + @SaCheckPermission("zhishu:shopGoodsDetail:edit") + @Log(title = "商品信息补全表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ZhishuShopGoodsDetailBo bo) { + return toAjax(zhishuShopGoodsDetailService.updateByBo(bo)); + } + + /** + * 删除商品信息补全表 + * + * @param ids 主键串 + */ + @SaCheckPermission("zhishu:shopGoodsDetail:remove") + @Log(title = "商品信息补全表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(zhishuShopGoodsDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/PriceDivideBy100Converter.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/PriceDivideBy100Converter.java new file mode 100644 index 0000000..0906d0c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/PriceDivideBy100Converter.java @@ -0,0 +1,96 @@ +package org.dromara.zhishu.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.converters.WriteConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class PriceDivideBy100Converter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return String.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + // 价格在Excel中是数字类型 + return CellDataTypeEnum.NUMBER; + } + + /** + * 读取Excel时:将Excel中的数字(元)转换为String(分) + * 兼容数值和字符串类型 + */ + @Override + public String convertToJavaData(ReadConverterContext context) { + if (context == null || context.getReadCellData() == null) { + return "0"; + } + try { + ReadCellData cellData = context.getReadCellData(); + BigDecimal priceInYuan = null; + + // 根据单元格类型获取数值 + switch (cellData.getType()) { + case NUMBER: + // 数值类型:直接获取 + priceInYuan = cellData.getNumberValue(); + break; + + case STRING: + // 字符串类型:转换为BigDecimal + String stringValue = cellData.getStringValue(); + if (stringValue == null || stringValue.trim().isEmpty()) { + return "0"; + } + try { + // 去除千分位逗号和空格 + stringValue = stringValue.trim().replaceAll(",", "").replaceAll(" ", ""); + priceInYuan = new BigDecimal(stringValue); + } catch (NumberFormatException e) { + return "0"; + } + break; + + default: + // 其他类型返回0 + return "0"; + } + + // 数值转换:元转分 + if (priceInYuan == null) { + return "0"; + } + + BigDecimal priceInCent = priceInYuan.multiply(BigDecimal.valueOf(100)); + return priceInCent.setScale(0, RoundingMode.HALF_UP).toString(); + + } catch (Exception e) { + return "0"; + } + } + + /** + * 写入Excel时:将String(分)转换为Excel中的数字(元) + */ + @Override + public WriteCellData convertToExcelData(WriteConverterContext context) { + String value = context.getValue(); + if (value == null || value.isEmpty()) { + return new WriteCellData<>(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)); + } + try { + BigDecimal priceInCent = new BigDecimal(value); + // 分转元:除以100,保留2位小数 + BigDecimal priceInYuan = priceInCent.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + return new WriteCellData<>(priceInYuan); + } catch (NumberFormatException e) { + return new WriteCellData<>(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/QualityConverter.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/QualityConverter.java new file mode 100644 index 0000000..d008532 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/converter/QualityConverter.java @@ -0,0 +1,70 @@ +package org.dromara.zhishu.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +public class QualityConverter implements Converter { // 改为 String + + @Override + public Class supportJavaTypeKey() { // 改为 String.class + return String.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public WriteCellData convertToExcelData(String codeStr, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws Exception { + if (codeStr == null || codeStr.trim().isEmpty()) { + return new WriteCellData<>(""); + } + + try { + // 将字符串转为整数进行判断 + int code = Integer.parseInt(codeStr); + String qualityDesc; + switch (code) { + case 100: + qualityDesc = "全新"; + break; + case 95: + qualityDesc = "九五品"; + break; + case 90: + qualityDesc = "九品"; + break; + case 85: + qualityDesc = "八五品"; + break; + case 80: + qualityDesc = "八品"; + break; + case 75: + qualityDesc = "七五品"; + break; + case 70: + qualityDesc = "七品"; + break; + case 65: + qualityDesc = "六五品"; + break; + case 60: + qualityDesc = "六品"; + break; + default: + qualityDesc = codeStr; + break; + } + return new WriteCellData<>(qualityDesc); + } catch (NumberFormatException e) { + // 如果不是数字,直接返回原值 + return new WriteCellData<>(codeStr); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Account.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Account.java new file mode 100644 index 0000000..5079a90 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Account.java @@ -0,0 +1,116 @@ +package org.dromara.zhishu.domain; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.IdType; +import org.dromara.common.mybatis.core.domain.BaseEntity; + + +/** + * 账务记录实体类 + * 对应表名:account + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("account") +public class Account extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 业务号(唯一) + */ + private String accountNo; + + /** + * 相关id + */ + private Long aboutId; + + /** + * 业务类型 0-预留 1225 闲鱼 1221 pdd 1222 孔夫子 + */ + private Integer type; + + /** + * 交易类型 1-收入 2-支出 + */ + private Integer tradeType; + + /** + * 支付渠道 wechat/alipay/... + */ + private String payType; + + /** + * 订单总金额(分) + */ + private Long totalAmount; + + /** + * 入账相关ID + */ + private Long getById; + + /** + * 出账相关ID + */ + private Long setById; + + /** + * 交易状态 0-预留 1-待处理 2-成功 3-失败 4-回滚 + */ + private Integer tradeStatus; + + /** + * 重试次数 + */ + private Integer retryCount; + + /** + * 备注 + */ + private String note; + + /** + * 扩展字段(JSON) + */ + private String extendJson; + + /** + * 创建人 + */ + private Long createdBy; + + /** + * 创建时间戳(毫秒) + */ + private Long createdTime; + + /** + * 更新人 + */ + private Long updatedBy; + + /** + * 更新时间戳(毫秒) + */ + private Long updatedTime; + + /** + * 删除标识 0-正常 1-删除 + */ + private Integer isDel; + + /** + * 当时余额 + */ + private Long balance; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ArtNoMove.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ArtNoMove.java new file mode 100644 index 0000000..8034069 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ArtNoMove.java @@ -0,0 +1,21 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_art_no_move") +public class ArtNoMove { + private Long id; + private String oldArtNo; + private String newArtNo; + private Long userId; + private Long oldDepotId; + private Long newDepotId; + private Long createBy; + private Long createTime; + private Long updateBy; + private Long updateTime; + private Long isDel; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/BookBaseInfoPhp.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/BookBaseInfoPhp.java new file mode 100644 index 0000000..0b1ba6b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/BookBaseInfoPhp.java @@ -0,0 +1,32 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.zhishu.domain.vo.BookBaseInfoVo; + +import java.util.List; + +@Data +public class BookBaseInfoPhp extends TenantEntity { + + /** + * 页数 + */ + private String currentPage; + /** + * 最后一页 + */ + private String lastPage; + /** + * 条数 + */ + private String perPage; + /** + * 查询数据 + */ + private List data; + /** + * 总条数 + */ + private String total; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/CourierLog.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/CourierLog.java new file mode 100644 index 0000000..9c2dc00 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/CourierLog.java @@ -0,0 +1,95 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 快递日志视图对象 + * + * @author yxy + * @date 2026-03-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("courier_log") +public class CourierLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * erp订单id + */ + private Long erpOrderId; + + /** + * 订单编号 + */ + private String orderSn; + + /** + * 账号 + */ + private String partnerId; + + /** + * 联调密码 + */ + private String secret; + + /** + * 发件人信息 + */ + private String sender; + + /** + * 收件人信息 + */ + private String receiver; + + /** + * 商品信息 + */ + private String items; + + /** + * 订单唯一序列号 + */ + private String orderSerialNo; + + /** + * 操作类型 + */ + private String type; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 创建时间 + */ + private Long createAt; + + /** + * 修改人 + */ + private Long updateBy; + + /** + * 修改时间 + */ + private Long updateAt; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/DepotOrder.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/DepotOrder.java new file mode 100644 index 0000000..afe3219 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/DepotOrder.java @@ -0,0 +1,57 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 仓库订单信息对象 t_depot_order + * + * @author yxy + * @date 2025-06-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_depot_order") +public class DepotOrder extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 店铺订单id + */ + private String shopOrderId; + + /** + * 处理人 + */ + private Long userId; + + /** + * 商品信息 + */ + private String itemList; + + /** + * 仓库订单状态 0 待发货 1 已发货 2 无库存 3 转发任务 + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Employee.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Employee.java new file mode 100644 index 0000000..cb05952 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Employee.java @@ -0,0 +1,47 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; + +@Data +@TableName("wave_employee") +public class Employee { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 表主键(员工ID) + */ + private String id; + + /** + * 员工姓名 + */ + private String name; + + /** + * 所属用户id + */ + private Long userId; + + /** + * 创建时间 + */ + @TableField("creat_time") + private Long creatTime; + + /** + * 更新时间 + */ + @TableField("update_time") + private Long updateTime; + + /** + * 删除标志 + */ + private Integer delFlag; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ErpGoodsOrder.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ErpGoodsOrder.java new file mode 100644 index 0000000..c50f7cc --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ErpGoodsOrder.java @@ -0,0 +1,286 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsVo; + +import java.io.Serial; +import java.util.List; + +/** + * 平台订单对象 erp_goods_order + * + * @author yxy + * @date 2025-12-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_goods_order") +public class ErpGoodsOrder extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 订单编号 + */ + private String orderSn; + + /** + * 平台店铺id + */ + private Long shopId; + + /** + * erp店铺id + */ + private Long shopErpId; + + /** + * erp店铺名称 + */ + private String shopErpName; + + /** + * 店铺类型 + */ + private Long shopType; + + /** + * 商品一级id + */ + private Long catId1; + + /** + * 商品二级id + */ + private Long catId2; + + /** + * 商品三级id + */ + private Long catId3; + + /** + * 商品四级id + */ + private Long catId4; + + /** + * 订单中商品sku列表 + */ + private String itemList; + + /** + * 订单金额 单位:分 + */ + private Long orderTotal; + + /** + * 商品金额(以分为单位)商品金额=商品销售价格*商品数量-订单改价折扣金额 + */ + private Long goodsAmount; + + /** + * 订单改价折扣金额(以分为单位) + */ + private Long orderChangeAmount; + + /** + * 支付金额 (以分为单位) 支付金额=商品金额-折扣金额+邮费+服务费 + */ + private Long payAmount; + + /** + * 创建人 + */ + private Long createdBy; + + + /** + * 创建时间 时间戳 + */ + private Long createdAt; + + /** + * 成交状态 + */ + private Long confirmStatus; + + /** + * 成交时间 时间戳 + */ + private Long confirmAt; + + /** + * 支付单号 + */ + private String payNo; + + /** + * 支付时间 时间戳 + */ + private Long payAt; + + /** + * 支付方式 + */ + private Long payType; + + /** + * 平台优惠金额 (以分为单位) + */ + private Long platformDiscount; + + /** + * 买家留言信息 + */ + private String buyerMemo; + + /** + * 发货状态 1:待发货,2:已发货待签收,3:已签收 + */ + private Long orderStatus; + + /** + * 物流id + */ + private Long shippingId; + + /** + * 发货时间 时间戳 + */ + private Long shippingAt; + + /** + * 收件地城市 + */ + private String city; + + /** + * 城市编码 + */ + private Long cityId; + + /** + * 收件地省份 + */ + private String province; + + /** + * 省份编码 + */ + private Long provinceId; + + /** + * 收件地国家或地区 + */ + private String country; + + /** + * 国家或地区编码 + */ + private Long countryId; + + /** + * 收件地区县 + */ + private String town; + + /** + * 区县编码 + */ + private Long townId; + + /** + * 快递单号 + */ + private String trackingNumber; + + /** + * 商家订单备注 + */ + private String remark; + + /** + * 订单备注标记,1-红色,2-黄色,3-绿色,4-蓝色,5-紫色 + */ + private Long remarkTag; + + /** + * 订单备注标记名称 + */ + private String remarkTagName; + + /** + * 确认收货时间 + */ + private Long receiveAt; + + /** + * 售后状态 + */ + private Long afterSalesStatus; + + + /** + * 订单最近一次更新时间 + */ + private Long updatedAt; + + /** + * 是否可视化 + */ + private Long isShow; + + /** + * shop_id的MD5首字母(大写)用于分区 + */ + @TableId(value = "shop_md5_prefix") + private String shopMd5Prefix; + + + /** + * 是否下发 + */ + private Long isIssue; + + /** + * erp的订单售后状态 0 无售后 1 仅退款 2 退货退款 3 处理完成 4 拒绝 5 延后处理 + */ + private int erpAfterSalesStatus; + + /** + * erp订单售后发起时间 + */ + private Long erpAssCreateAt; + + /** + * 售后原因 + */ + private String erpAssReason; + + /** + * 其他原因 + */ + private String erpAssReasonOther; + + /** + * 拒绝原因 + */ + private String erpAssRemark; + + + /** + * 商品列表对象 + */ + private List zhishuShopGoodsList; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ExcelTask.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ExcelTask.java new file mode 100644 index 0000000..b94140f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ExcelTask.java @@ -0,0 +1,77 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 任务列表对象 t_task_list + * + * @author yxy + * @date 2025-03-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_task_list") +public class ExcelTask extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 任务类型 1 发布商品 + */ + private String taskType; + + /** + * 仓库id 字符串 + */ + private String depotIds; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 执行数据条数 + */ + private Long dataNum; + + /** + * 任务状态 + */ + private String taskStatus; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 线程id + */ + private Long threadId; + /** + * 用户id + */ + private Long userId; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/FastMail.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/FastMail.java new file mode 100644 index 0000000..5b9caba --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/FastMail.java @@ -0,0 +1,67 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 快递打单账号管理对象 t_fast_mail + * + * @author yxy + * @date 2025-06-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_fast_mail") +public class FastMail extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 类型 1 韵达 + */ + private String type; + + /** + * 账号 + */ + private String partnerId; + + /** + * 联调密码 + */ + private String secret; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 面单类型 1 网点面单 2 拼多多面单 + */ + private String fastMailType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsAutoFail.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsAutoFail.java new file mode 100644 index 0000000..1f04c76 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsAutoFail.java @@ -0,0 +1,59 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 自动发布失败对象 t_goods_auto_fail + * + * @author yxy + * @date 2025-09-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_goods_auto_fail") +public class GoodsAutoFail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + private String shopName; + + /** + * 商品id + */ + private Long goodsId; + + private String goodsName; + + /** + * 商品isbn + */ + private String isbn; + + /** + * 货号 + */ + private String artNo; + + /** + * 日志 + */ + private String callBackData; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsDto.java new file mode 100644 index 0000000..0f96f66 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/GoodsDto.java @@ -0,0 +1,36 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; + +import java.util.List; + +@Data +public class GoodsDto { + + //商品编号 + private String goodsId; + + //商品数量 + private String goodsCount; + + //商品名称 + private String goodsName; + + //商品销售价格 + private String goodsPrice; + + //商品规格 + private String goodsSpec; + + //商品图片 + private List goodsImgs; + + //商家外部编码(商品) + private String outerGoodsId; + + //商家外部编码(SKU) /商品id + private String outerId; + + //商品规格编码 + private String skuId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LicenseResult.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LicenseResult.java new file mode 100644 index 0000000..9c3d4cf --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LicenseResult.java @@ -0,0 +1,31 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; + +/** + * 营业执照信息 + */ +@Data +public class LicenseResult { +// 图片路径 + private String url; + // 提示信息 + private String message; +// 地址 + private String address; + private String angle; +// 经营类型 + private String business; +// 时间 + private String period; +// 法人 + private String person; +// 注册金额 + private String capital; +// 注册名称 + private String name; +// 注册号 + private String regNum; +// 注册权机关 + private String RegistrationAuthority; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LocalMultipartFile.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LocalMultipartFile.java new file mode 100644 index 0000000..6fbd853 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/LocalMultipartFile.java @@ -0,0 +1,56 @@ +package org.dromara.zhishu.domain; + +import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class LocalMultipartFile implements MultipartFile { + + private final File file; + + public LocalMultipartFile(File file) { + this.file = file; + } + + @Override + public String getName() { + return file.getName(); + } + + @Override + public String getOriginalFilename() { + return file.getName(); + } + + @Override + public String getContentType() { + return "application/octet-stream"; // 可根据实际文件类型修改 + } + + @Override + public boolean isEmpty() { + return file.length() == 0; + } + + @Override + public long getSize() { + return file.length(); + } + + @Override + public byte[] getBytes() throws IOException { + return java.nio.file.Files.readAllBytes(file.toPath()); + } + + @Override + public InputStream getInputStream() throws IOException { + return new FileInputStream(file); + } + + @Override + public void transferTo(File dest) throws IOException, IllegalStateException { + java.nio.file.Files.copy(file.toPath(), dest.toPath()); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Logistics.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Logistics.java new file mode 100644 index 0000000..32c8100 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Logistics.java @@ -0,0 +1,127 @@ +package org.dromara.zhishu.domain; + + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 物流模板对象 t_logistics + * + * @author ruoyi + * @date 2023-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_logistics") +public class Logistics extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 物流模板名称 + */ + private String templateName; + + /** + * 发货地-省 + */ + private String deliveryProvince; + + /** + * 发货地-市 + */ + private String deliveryCity; + + /** + * 发货地-区 + */ + private String deliveryArea; + + /** + * 发货地-详细地址 + */ + private String deliveryAddress; + + /** + * 计价方式(0按重量 1按标准本数(图书专用) 2按件数 3单独设置运费) + */ + private String pricingMethod; + + /** + * 运送方式(0快递 1自提) + */ + private String shipping; + + /** + * 首重 首本 首件 + */ + private Double firWbv; + + /** + * 首费 单位:元 + */ + private BigDecimal firPrice; + + /** + * 续重 续本 续件 + */ + private Double continueWbv; + + /** + * 续费 单位:元 + */ + private BigDecimal continuePrice; + + /** + * 模板状态(0正常 1停用) + */ + private String status; + + /** + * 租户编码 + */ + private String tenantId; + + /** + * 运送范围 + */ + private String shippingRange; + + /** + * 仓库ID + */ + private Long warehouseId; + + /** + * 配送说明 + */ + private String remark; + + /** + * 联系人 + */ + private String contact; + + /** + * 联系电话 + */ + private String phoneNumber; + /** + * 详细地址 + */ + private String fullAddress; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/NewUserInfo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/NewUserInfo.java new file mode 100644 index 0000000..5388986 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/NewUserInfo.java @@ -0,0 +1,102 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * @author chen + * @date 2023/1/10 16:08 + * @description 新用户信息 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("t_audit_info") +public class NewUserInfo{ + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 审核id + */ + + private Long auditId; + /** + * 企业名称 + */ + private String companyName; + + /** + * 企业类型 + */ + private String companyType ; + + /** + * 联系人名 + */ + private String contactPerson; + + /** + * 联系方式 + */ + private String contactPhone;; + + /** + * 邮箱 + */ + private String email; + + /** + * 身份证图片 + */ + private String cardIdentity; + + + /** + * 营业执照名称 + */ + private String licenseName; + + /** + * 营业执照编号 + */ + private String licenseNumber; + + /** + * 营业执照 + */ + private String license; + + /** + * 备注 + */ + private String remark; + /** + * 地址 + */ + private String adress; + + /** + * 经营许可证 + */ + private String businessLicense; + + /** + * 营业执照过期时间 + */ + private String licenseTime; + + + /** + * 经营许可证过期时间 + */ + private String businessLicenseTime; +} + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Notice.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Notice.java new file mode 100644 index 0000000..2040621 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Notice.java @@ -0,0 +1,56 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 消息通知对象 t_notice + * + * @author yxy + * @date 2025-05-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_notice") +public class Notice extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 发件人 + */ + private String sender; + + /** + * 收件人 + */ + private String recipient; + + /** + * 消息 + */ + private String content; + + /** + * 状态 0 未读 1 已读 + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PddLoginVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PddLoginVo.java new file mode 100644 index 0000000..debe6bd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PddLoginVo.java @@ -0,0 +1,58 @@ +package org.dromara.zhishu.domain; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class PddLoginVo { + + /** + * 授权令牌 + */ + @JsonProperty("access_token") + private String accessToken; + + /** + * 刷新令牌 + */ + @JsonProperty("refresh_token") + private String refreshToken; + + /** + * 授权令牌 access_token 的有效期 + */ + @JsonProperty("expire_in") + private Long expireIn; + + /** + * 刷新令牌 refresh_token 的有效期 + */ + @JsonProperty("refresh_expire_in") + private Long refreshExpireIn; + + /** + * 应用id + */ + @JsonProperty("client_id") + private String clientId; + + /** + * 令牌权限 + */ + private String scope; + + /** + * 用户 openid + */ + private String openid; + + private String phoneNumber; + private String nickName; + private Long userId; + private String userName; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PriceTemplate.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PriceTemplate.java new file mode 100644 index 0000000..ac77ffd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PriceTemplate.java @@ -0,0 +1,76 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 价格模板对象 t_price_template + * + * @author yxy + * @date 2025-03-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_price_template") +public class PriceTemplate extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 价格模板名称 + */ + private String templateName; + + /** + * 价格类型 0 书价 1 总价(书价+运费) + */ + private String priceType; + + /** + * 增加比例 + */ + private BigDecimal proportion; + + /** + * 增加金额 + */ + private BigDecimal addAmount; + + /** + * 价格模板状态(0正常 1停用) + */ + private String status; + + /** + * 价格区间最大值 + */ + private Integer highPrice; + /** + * 价格区间最小值 + */ + private Integer lowPrice; + /** + * 价格参数 + */ + private String rangePrice; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PrintTemplate.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PrintTemplate.java new file mode 100644 index 0000000..e89de1a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/PrintTemplate.java @@ -0,0 +1,55 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 打印模板对象 t_print_template + * + * @author yxy + * @date 2026-03-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_print_template") +public class PrintTemplate extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 快递类型 + */ + private String expressType; + + /** + * 模板名称 + */ + private String printTemplateName; + + /** + * 0正常 1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 包裹信息json字符串 + */ + private String parcelInformation; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Printer.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Printer.java new file mode 100644 index 0000000..6151cfa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Printer.java @@ -0,0 +1,67 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 打印机设置对象 t_printer + * + * @author yxy + * @date 2026-03-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_printer") +public class Printer extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 打印机类型 1 本地打印机 2 拼多多云打印机 + */ + private String printType; + + /** + * 拼多多云打印机共享码 + */ + private String shareCode; + + /** + * 打印机/云打印机编号 + */ + private String printer; + + /** + * 打印机名称 + */ + private String printerName; + + /** + * 是否启用全程打印 + */ + private String isRemotePrinting; + + /** + * 0正常 1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ProfitSharingLog.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ProfitSharingLog.java new file mode 100644 index 0000000..9b10c39 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ProfitSharingLog.java @@ -0,0 +1,111 @@ +package org.dromara.zhishu.domain; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.IdType; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serializable; + +/** + * 分润记录实体类 + * 对应表名:profit_sharing_log + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("profit_sharing_log") +public class ProfitSharingLog extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 订单编号 + */ + private String orderSn; + + /** + * 分润规则ID + */ + private Long cfgId; + + /** + * 状态 0-待出款 1-已出款 + */ + private Integer status; + + /** + * 分润受益方ID(平台 商家 上级) + */ + private Long beneficiaryId; + + /** + * 分润受益方名字 + */ + private String beneficiaryName; + + /** + * 计算基准金额(单位:分) + */ + private Long calcBaseAmount; + + /** + * 分润比例 + */ + private Integer shareRate; + + /** + * 分润金额(单位:分) + */ + private Long shareAmount; + + /** + * 结算时间戳(毫秒) + */ + private Long settlementTime; + + /** + * 账期(例如202509,用于按月度对账) + */ + private Long accountingPeriod; + + /** + * 创建时间戳(毫秒) + */ + private Long createdTime; + + /** + * 创建人ID + */ + private Long createdBy; + + /** + * 更新时间戳(毫秒) + */ + private Long updatedTime; + + /** + * 更新人ID + */ + private Long updatedBy; + + /** + * 是否启用 0-启用 1-禁用 + */ + private Integer isDel; + + private Long startTime; + + private Long endTime; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/RunningTask.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/RunningTask.java new file mode 100644 index 0000000..59c65df --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/RunningTask.java @@ -0,0 +1,91 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 执行的任务对象 t_running_task + * + * @author yxy + * @date 2025-07-23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_running_task") +public class RunningTask extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 任务id + */ + private Long taskId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 优先级 + */ + private Long priority; + + /** + * 内容json字符串 + */ + private String data; + + /** + * 状态 0 未执行 1 执行中 2 执行完成 + */ + private String status; + + /** + * 需要被修改的状态 + */ + private String editStatus; + + /** + * 任务执行完返回的数据 + */ + private String callBackData; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品id + */ + private Long goodsId; + + /** + * 随机数 + */ + private Long randomNum; + + + /** + * 任务类型 + */ + private String taskType; + + /** + * 完成数据 + */ + private String successData; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopContext.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopContext.java new file mode 100644 index 0000000..4ae951c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopContext.java @@ -0,0 +1,52 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 店铺设置商品描述对象 t_shop_context + * + * @author yxy + * @date 2025-09-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_shop_context") +public class ShopContext extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品描述 + */ + private String context; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDepot.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDepot.java new file mode 100644 index 0000000..57856b3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDepot.java @@ -0,0 +1,33 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + + +// ShopDepot.java 实体类 +@Data +@TableName("t_shop_depot_aotu") +public class ShopDepot { + @TableId(type = IdType.AUTO) + private Long id; + + private Long shopId; + + private Long depotId; + + private Long createBy; + + private Date createTime; + + private Long updateBy; + + private Date updateTime; + + @TableField(exist = false) + private String depotName; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDetail.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDetail.java new file mode 100644 index 0000000..0bf5060 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopDetail.java @@ -0,0 +1,291 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 商品详情对象 t_shop_detail + * + * @author yxy + * @date 2025-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_shop_detail") +public class ShopDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 物流运费模板id + */ + private Long templateId; + + /** + * 高价 + */ + private Long highPrice; + + /** + * 低价 + */ + private Long lowPrice; + + /** + * 销售模板id + */ + private Long saleTemplateId; + + /** + * 是否开启7天无理由 0关闭 1开启 + */ + private String sevenDays; + + /** + * 是否开始二手 0关闭 1开启 + */ + private String isSecondHand; + + /** + * 轮播数量开启 0关闭 1开启 + */ + private String carouselNum; + + /** + * 是否开启详情图 0关闭 1开启 + */ + private String isDetailsImg; + + /** + * 是否开启目录详情 0关闭 1开启 + */ + private String isCatalogueDetails; + + /** + * 是否开启信息图片 0关闭 1开启 + */ + private String isInformationImg; + + /** + * 标题前缀 + */ + private String titlePrefix; + + /** + * 标题后缀 + */ + private String titleSuffix; + + /** + * 标题过滤 + */ + private String titleFilter; + + /** + * 货号前缀 + */ + private String itemNumberPrefix; + + /** + * 标题组成 + */ + private String titleConsistOf; + + /** + * 间隔字符 0无间隔 1空格 + */ + private String spaceCharacter; + + /** + * 是否开启自动截断 0关闭 1开启 + */ + private String autoTruncation; + + /** + * 我的设置 + */ + private String mySetUp; + + /** + * 系统设置 + */ + private String systemSetUp; + + /** + * 过滤套装 0否 1是 + */ + private String filterSuit; + + /** + * 删除保护 0关闭 1开启 + */ + private String isDelProtect; + + /** + * 下架保护 0关闭 1开启 + */ + private String isRemoveProtect; + + /** + * 图书定价 0关闭 1开启 + */ + private String bootPrice; + + /** + * 自有图片 0关闭 1开启 + */ + private String ownPictures; + + /** + * 默认库存 + */ + private Long stockDeff; + + /** + * 两件折扣 + */ + private Long twoDiscount; + + /** + * 是否预售 0非预售 1定时预售 2 时段预售 + */ + private String presale; + + /** + * 假一赔十 0 关闭 1开启 + */ + private String fake; + + /** + * 发货时间 0 24小时 1 48小时 + */ + private String deliveryTime; + + /** + * 白底图 0关闭 1开启 + */ + private String whitePicture; + + /** + * 水印位置 0全部 1第一张 + */ + private String watermarkPosition; + + /** + * 无图过滤 0关闭 1开启 + */ + private String filtering; + + /** + * 最低价定价 0关闭 1开启 + */ + private String lowerPrice; + + /** + * 最低定价折扣 + */ + private String lowerPriceDiscount; + + /** + * 拼单模板id + */ + private Long spellTemplateId; + + /** + * 发布地区类型 + */ + private String districtType; + + /** + * 常驻地区id + */ + private String districtId; + + + /** + * 默认品相 + */ + private Long conditionDef; + + /** + * 品相描述 + */ + private String conditionDes; + + /** + * 推荐语 + */ + private String recommend; + + /** + * 是否包邮 + */ + private String isParcel; + + /** + * 图书模板 + */ + private String bookTemplate; + + /** + * 图书重量 + */ + private BigDecimal bookWeight; + + /** + * 标准本数 + */ + private BigDecimal standardNumber; + + /** + * 开启 + */ + private String openRepeat; + + /** + * 是否自动上传 0 否 1 是 + */ + private String autoAdd; + + /** + * 是否开启咸鱼擦亮 + */ + private String openPolish; + + /** + * 擦亮方式 0擦亮原商品 1发布新商品 + */ + private String polishType; + + /** + * 闲鱼店铺发布品类 0 图书 1 其他 + */ + private String publishType; + + /** + * 闲鱼类目ID + */ + private String categoryId; + + /** + * 频率 + */ + private int frequency; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopGoodIsbn.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopGoodIsbn.java new file mode 100644 index 0000000..21f0dc9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ShopGoodIsbn.java @@ -0,0 +1,28 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 商品统一书号 + */ +@Data +@TableName("t_shop_good_isbn") +public class ShopGoodIsbn { + @TableId(value = "id") + private Long id; + /** + * 商品id + */ + private String shopGoodsId; + /** + * 商品isbn + */ + private String goodIsbn; + /** + * 商品统一书号 + */ + private String goodUnifyIsbn; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SinglePrint.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SinglePrint.java new file mode 100644 index 0000000..904972b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SinglePrint.java @@ -0,0 +1,98 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; + +/** + * 单票打印对象 t_single_print + * + * @author yxy + * @date 2026-03-27 + */ +@Data +public class SinglePrint { + + /** + * 主键ID + */ + private Long id; + + /** + * 快递单号 + */ + private String mailNo; + + /** + * 发件人名称 + */ + private String senderName; + + /** + * 发件人联系方式 + */ + private String senderPhone; + + /** + * 发货地详细地址 + */ + private String senderAddress; + + /** + * 收件人名称 + */ + private String receiverName; + + /** + * 收件人联系方式 + */ + private String receiverPhone; + + /** + * 收件人详细地址 + */ + private String receiverAddress; + + /** + * 物品名称 + */ + private String itemName; + + /** + * 物品数量 + */ + private Integer itemNum; + + /** + * 物品备注 + */ + private String itemRemark; + + /** + * 打单账号id + */ + private Long fastMailId; + + /** + * 打单账号信息 + */ + private String fastMailText; + + /** + * 创建人id + */ + private Long createBy; + + /** + * 创建时间时间戳 + */ + private Long createAt; + + /** + * 备注 + */ + private String remark; + + /** + * 状态 1正常 2回收 + */ + private String status; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Spec.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Spec.java new file mode 100644 index 0000000..b2221d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Spec.java @@ -0,0 +1,97 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 自定义规格设置对象 t_spec + * + * @author yxy + * @date 2025-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_spec") +public class Spec extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 规格类型id + */ + private String specTypeId; + + /** + * 规格类型名称 + */ + private String specTypeName; + + /** + * 规格组成 0 自定义 1 ISBN 2 书名 3货号 + */ + private String specCompose; + + /** + * 自定义规格名称 + */ + private String specName; + + /** + * 自定义规格前缀 + */ + private String specPrefix; + + /** + * 自定义规格后缀 + */ + private String specSuffix; + + /** + * 规格编码组成 0 自定义 1 ISBN 2 书名 3货号 + */ + private String specCodeCompose; + + /** + * 自定义规格编码前缀 + */ + private String specCodePrefix; + + /** + * 自定义规格编码后缀 + */ + private String specCodeSuffix; + + /** + * SKU水印图片路径 + */ + private String specSyUrl; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Statistic.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Statistic.java new file mode 100644 index 0000000..0ae58eb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Statistic.java @@ -0,0 +1,44 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 统计类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class Statistic extends TenantEntity { + + /** + * 库房数量 + */ + private Long warehousesNum; + + /** + * 货架数量 + */ + private Long shelvesNum; + + /** + * 仓库名称 + */ + private String warehousesName; + + /** + * 入库量 + */ + private Long inQuantity; + + /** + * 出库量 + */ + private Long outQuantity; + + /** + * 书籍种类 + */ + private String bookCategory; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SyncLog.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SyncLog.java new file mode 100644 index 0000000..c89aba4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SyncLog.java @@ -0,0 +1,49 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 迁移日志对象 sync_log + * + * @author yxy + * @date 2026-06-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sync_log") +public class SyncLog extends BaseEntity { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 迁移类型 1 货区 2 商品 + */ + private String type; + + /** + * 创建人(迁移时间) + */ + private Long createBy; + + /** + * 迁移结果 + */ + private String msg; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SynchronizationShopLog.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SynchronizationShopLog.java new file mode 100644 index 0000000..f209f56 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/SynchronizationShopLog.java @@ -0,0 +1,110 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 同步店铺商品库存日志实体对象 + * + * @author yxy + * @date 2026-04-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("synchronization_shop_log") +public class SynchronizationShopLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 商品id + */ + private Long goodsId; + + /** + * 商品的创建人 + */ + private Long goodsCreateBy; + + /** + * erp订单id + */ + private Long erpOrderId; + + /** + * 订单号 + */ + private String orderSn; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 店铺的创建人 + */ + private Long shopCreateBy; + + /** + * 更新后库存 + */ + private Integer inventory; + + /** + * 更新前库存 + */ + private Integer inventoryOld; + + /** + * 三方平台id + */ + private Long platformId; + + /** + * 状态码 200 成功 500 失败 + */ + private String code; + + /** + * 日志信息 + */ + private String msg; + + /** + * 创建时间 + */ + private Long createAt; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 修改人 + */ + private Long updateBy; + + /** + * 修改时间 + */ + private Long updateAt; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TAudit.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TAudit.java new file mode 100644 index 0000000..5fdf12a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TAudit.java @@ -0,0 +1,45 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 审核对象 t_audit + * + * @author Lion Li + * @date 2025-04-01 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_audit") +public class TAudit extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 管理员ID + */ + private Long adminId; + + /** + * 审核状态(0通过 1未通过) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TDistrict.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TDistrict.java new file mode 100644 index 0000000..afcabe0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TDistrict.java @@ -0,0 +1,71 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("t_district") +public class TDistrict implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区划信息id + */ + @TableId(value = "id") + private Long id; + + /** + * 父级挂接id + */ + private Long pid; + + /** + * 区划编码 + */ + private String code; + + /** + * 区划名称 + */ + private String name; + + /** + * 备注 + */ + private String remark; + + /** + * 状态 0 正常 -2 删除 -1 停用 + */ + private Long status; + + /** + * 级次id 0:省/自治区/直辖市 1:市级 2:县级 + */ + private Long level; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TFreight.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TFreight.java new file mode 100644 index 0000000..53ab765 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TFreight.java @@ -0,0 +1,72 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 三级货区管理对象 t_freight + * + * @author Lion Li + * @date 2025-04-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_freight") +public class TFreight extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 货位id + */ + @TableId(value = "id") + private Long id; + + /** + * 货架id + */ + private Long shelvesId; + + /** + * 货位编码 + */ + private String code; + + /** + * 货位名称 + */ + private String name; + + /** + * 货位单位 + */ + private String unit; + + /** + * 货位容量 + */ + private Long capMax; + + /** + * 货号 + */ + private String artNo; + + /** + * 仓库状态(0正常 1停用) + */ + private String status; + + private String tenantId; + + /** + * 是否开启分销 0否 1是 + */ + private String allowDistribution; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TShelves.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TShelves.java new file mode 100644 index 0000000..ecffbbb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TShelves.java @@ -0,0 +1,64 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 货架信息对象 t_shelves + * + * @author Lion Li + * @date 2025-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_shelves") +public class TShelves extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 货架id + */ + @TableId(value = "id") + private Long id; + + /** + * 货架名称 + */ + private String name; + + + /** + * 货架容量 + */ + private Long sheCapMax; + + /** + * 货架单位 + */ + private String unit; + + /** + * 仓库id + */ + private Long depotId; + + /** + * 货架状态(0正常 1停用) + */ + private String status; + + /** + * 货架编码 + */ + private String code; + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TUserPlatform.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TUserPlatform.java new file mode 100644 index 0000000..9d1a2c1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TUserPlatform.java @@ -0,0 +1,86 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; + +/** + * 用户平台关联对象 t_user_platform + * + * @author yxy + */ +@Data +@TableName("t_user_platform") +public class TUserPlatform extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private String id; + + /** + * 类型 1 拼多多 2 孔夫子 3 淘宝.... + */ + private String type; + + /** + * erp用户id + */ + private Long userId; + + /** + * 三方平台id + */ + private String platformId; + + /** + * 三方平台名称 + */ + private String platformName; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + private String delFlag; + + /** + * 租户编码 + */ + private String tenantId; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private Long updateBy; + + /** + * 更新时间 + */ + private Date updateTime; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Task.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Task.java new file mode 100644 index 0000000..4644774 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Task.java @@ -0,0 +1,78 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 任务列表对象 t_task + * + * @author yxy + * @date 2025-03-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_task") +public class Task extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 任务类型 1 发布商品 + */ + private String taskType; + + /** + * 店铺id 字符串 + */ + private String shopIds; + + private String shopNames; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 执行数据条数 + */ + private Long dataNum; + + /** + * 任务状态 + */ + private String taskStatus; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 线程id + */ + private String threadId; + + /** + * 关系id + */ + private Long relationId; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TaskPause.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TaskPause.java new file mode 100644 index 0000000..4c56543 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/TaskPause.java @@ -0,0 +1,23 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; + +import java.util.Date; + +/** + * 暂停任务 + */ +@Data +public class TaskPause { + + private Long id; + + private Long taskId; + + private Long shopId; + + private Long createBy; + + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserAccount.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserAccount.java new file mode 100644 index 0000000..e33eebc --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserAccount.java @@ -0,0 +1,67 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 账号管理对象 t_user_account + * + * @author yxy + * @date 2026-02-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_user_account") +public class UserAccount extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 出入帐账户类型 0 出账 1 入账 + */ + private String type; + + /** + * 账号类型 + */ + private String accountType; + + /** + * 账号名称 + */ + private String accountName; + + /** + * 账号 + */ + private String account; + + /** + * 是否默认账号 0 否 1 是 + */ + private String isDefault; + + /** + * 店铺状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserRecharge.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserRecharge.java new file mode 100644 index 0000000..6f1cb48 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/UserRecharge.java @@ -0,0 +1,95 @@ +package org.dromara.zhishu.domain; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 用户充值对象 t_user_recharge + * + * @author yxy + * @date 2025-04-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_user_recharge") +public class UserRecharge extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 充值类型 1 微信支付 2 支付宝支付 ... + */ + private String rechargType; + + /** + * 充值金额 单位分 + */ + private BigDecimal rechargPrice; + + /** + * 支付成功时间 + */ + private Date successTime; + + /** + * 支付成功后回调方法中数据字符串 + */ + private String allDataStr; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 手续费 + */ + private BigDecimal commission; + + /** + * 是否充值到余额中 + */ + private String isBalance; + + /** + * 日志备注 + */ + private String logTxt; + + /** + * 原始金额 + */ + private BigDecimal originalPrice; + + /** + * 更新金额 + */ + private BigDecimal updatePrice; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Violation.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Violation.java new file mode 100644 index 0000000..9fd0aa8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Violation.java @@ -0,0 +1,75 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 违规对象 t_violation + * + * @author yxy + * @date 2025-06-23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_violation") +public class Violation extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 类型 0 isbn 1 书名 2 作者 3 出版社 + */ + private String type; + + /** + * 审核原因 + */ + private String content; + + /** + * 发起人 + */ + private Long userid; + + /** + * 是否审核 0 未审核 1 已审核 + */ + private String review; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 审核意见 + */ + private String remark; + + /** + * 审核内容 + */ + private String name; + + /** + * 分类 + */ + private String sort; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettings.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettings.java new file mode 100644 index 0000000..32cace7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettings.java @@ -0,0 +1,87 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 设置对象 warehouse_settings + * + * @author yxy + * @date 2025-12-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("warehouse_settings") +public class WarehouseSettings extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 设置模板名称 + */ + private String settingName; + + /** + * 库存同步形式 0 下单减库存 1 支付减库存 + */ + private Long stockSynchronizeType; + + /** + * 是否自动下发 0 否 1 是 + */ + private Long autoIssue; + + /** + * 是否开启亏损保护 0 否 1 是 + */ + private Long lossProtection; + + /** + * 利润下限 + */ + private BigDecimal profitFloor; + + /** + * 是否启用 0 否 1 是 + */ + private Long status; + + /** + * 是否删除 0 否 1 是 + */ + @TableLogic + private Long delFlag; + + /** + * 退款后是否自动回退库存 0否 1是 + */ + private Long stockRollback; + + /** + * 创建时间时间戳 + */ + private Long createAt; + + /** + * 修改时间时间戳 + */ + private Long updateAt; + + /** + * 店铺id + */ + private String shopIds; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettingsAttribute.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettingsAttribute.java new file mode 100644 index 0000000..04824a4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WarehouseSettingsAttribute.java @@ -0,0 +1,25 @@ +package org.dromara.zhishu.domain; + +import lombok.Data; + +/** + * 匹配规则 warehouse_settings_attribute + * + * @author yxy + * @date 2025-12-19 + */ +@Data +public class WarehouseSettingsAttribute { + + private Long id; + + /** + * 规则名称 + */ + private String attributeName; + + /** + * 备注 + */ + private String remark; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Wave.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Wave.java new file mode 100644 index 0000000..8f05287 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/Wave.java @@ -0,0 +1,66 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 波次对象 wave + * + * @author Lion Li + * @date 2026-01-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wave") +public class Wave extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private String id; + + /** + * 人员ID + */ + private String staffId; + + /** + * 人员姓名 + */ + private String staffName; + + /** + * 数量 + */ + private Long count; + + /** + * 是否支付 + */ + private Long isPay; + + /** + * 创建时间 + */ + private Long createdTime; + + /** + * 更新时间 + */ + private Long updatedTime; + + /** + * 是否删除 + */ + private Long isDel; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WaveDetail.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WaveDetail.java new file mode 100644 index 0000000..296cf7b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WaveDetail.java @@ -0,0 +1,76 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 波次信息对象 wave_detail + * + * @author Lion Li + * @date 2026-01-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wave_detail") +public class WaveDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 波次ID + */ + private String waveId; + + /** + * ISBN + */ + private String isbn; + + /** + * 品相 + */ + private String quality; + + /** + * 仓储ID + */ + private Long stockId; + + /** + * 仓储编号 + */ + private String stockNum; + + /** + * 创建时间 + */ + private Long createdTime; + + /** + * 更新时间 + */ + private Long updatedTime; + + /** + * 是否已删除 + */ + private Long isDel; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WhiteList.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WhiteList.java new file mode 100644 index 0000000..452caf4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/WhiteList.java @@ -0,0 +1,47 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 白名单对象 t_white_list + * + * @author yxy + * @date 2025-06-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_white_list") +public class WhiteList extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * ip + */ + private String ip; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyBind.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyBind.java new file mode 100644 index 0000000..588e638 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyBind.java @@ -0,0 +1,50 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_xy_bind") +public class XyBind extends BaseEntity { + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 闲管家名称 + */ + private String appName; + + /** + * 闲管家应用id + */ + private Long mallId; + + /** + * 闲管家应用密钥 + */ + private String token; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyCategory.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyCategory.java new file mode 100644 index 0000000..b3ad0c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/XyCategory.java @@ -0,0 +1,27 @@ +package org.dromara.zhishu.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("xy_category_id") +public class XyCategory extends BaseEntity { + /** + * 行业 + */ + private String industry; + + /** + * 类目 + */ + private String category; + + /** + * id + */ + private String id; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ZhishuShopImages.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ZhishuShopImages.java new file mode 100644 index 0000000..0383b08 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/ZhishuShopImages.java @@ -0,0 +1,47 @@ +package org.dromara.zhishu.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商品图片对象 zhishu_shop_images + * + * @author Lion Li + * @date 2025-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("zhishu_shop_images") +public class ZhishuShopImages extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private String id; + + /** + * 商品ID + */ + private String goodsId; + + /** + * 存放路径 + */ + private String path; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BatchUpdateCargoBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BatchUpdateCargoBo.java new file mode 100644 index 0000000..6d812dc --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BatchUpdateCargoBo.java @@ -0,0 +1,21 @@ +package org.dromara.zhishu.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class BatchUpdateCargoBo { + //商品ids + private List ids; + //货区ids + private List areas; + //是否同步线上 0,1 + private Boolean isOnline; + //用户id + private Long userId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookBaseInfoBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookBaseInfoBo.java new file mode 100644 index 0000000..5cf4a93 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookBaseInfoBo.java @@ -0,0 +1,228 @@ +package org.dromara.zhishu.domain.bo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.BookBaseInfo; +import org.dromara.zhishu.domain.vo.BookPic; + +import java.util.Date; +import java.util.List; + +/** + * 基础信息业务对象 book_base_info + * + * @author + * @date 2025-03-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BookBaseInfo.class, reverseConvertGenerate = false) +public class BookBaseInfoBo extends BaseEntity { + + /** id */ + @NotBlank(message = "id不能为空", groups = { EditGroup.class }) + private String id; + + /** 书名 */ + private String bookName; + + /** 书图片 */ + private BookPic bookPic; + private String isBookPic; + private String isBookPicS; + + /** 小图(外部接口需要) */ + private BookPic bookPicS; // 新增 + private String bookPicB; // 新增 + private String bookPicW; // 新增 + + /** ISBN */ + private String isbn; + + /** 作者 */ + private String author; + + /** 编辑 */ + private String editor; + + /** 装帧 */ + private String bindingLayout; + + /** 出版社 */ + private String publisher; + + /** 版次 */ + private String edition; + + /** 开本 */ + private String format; + + /** 语种 */ + private String languages; + + /** 出版时间 */ + private String publicationTime; + + /** 印刷时间 */ + private String printTime; + + /** 纸张 */ + private String paper; + + /** 页数 */ + private String pages; + + /** 字数 */ + private String wordage; + + /** 定价 */ + private String fixPrice; + + /** 已售 */ + @JsonProperty("buy_count") + private String buyCount; + + /** 在售 */ + @JsonProperty("sell_count") + private String sellCount; + + /** 内容简介 */ + private String content; + + /** 备注 */ + private String remark; + + /** 叶子类目 id */ + private Long catId; + + /** 已售数量(外部接口字段 buy_counts) */ + private String buy_counts; // 改为String类型以支持范围值如"5,99999" + + /** 在售数量(外部接口字段 sell_counts) */ + private String sell_counts; // 改为String类型以支持范围值 + + /** 出版时间(另一格式) */ + private String publicationTimes; + + /** 违规书号 0正常 1违规 */ + private Integer vioBook; + + /** 套装书 0正常 1违规 */ + private Integer bookSet; + + /** 一号多书 0正常 1违规 */ + private Integer onenumMbooks; + + /** 违规出版社 */ + private Integer illPublisher; + + /** 违规作者 */ + private Integer illAuthor; + + /** 店铺 ids */ + private List shopIds; + + /** 数据总数 */ + private Integer total; + + /** 店铺名称 */ + private List shopNames; + + /** 是否核价 0/1 */ + private Boolean ispricing; + + /** 核价数量 */ + private Integer numbers; + + /** 销量选择 */ + private Integer saleSelect; + + /** 分类 */ + private String category; + + /** 图片类型 官图-1 实图-0 */ + private String picType; + + /** ISBN 分类 9787-1 非9787-0 */ + private String categoryType; + + /** 是否套装 1是 0否 */ + private Integer isSuit; // 改 Integer + + /** 销量范围 */ + private String totalSale_range; + + + /* ------------------------- + * 以下为外部接口新增字段 + * ------------------------- */ + + /** day_sale_7 */ + private Integer daySale7; + + /** day_sale_15 */ + private Integer daySale15; + + /** day_sale_30 */ + private Integer daySale30; + + /** day_sale_60 */ + private Integer daySale60; + + /** day_sale_90 */ + private Integer daySale90; + + /** day_sale_180 */ + private Integer daySale180; + + /** day_sale_365 */ + private Integer daySale365; + + /** this_year_sale */ + private Integer thisYearSale; + + /** last_year_sale */ + private Integer lastYearSale; + + /** total_sale */ + private Integer totalSale; + + /** 外部接口:book_pic_obj.small */ + private String picSmall; + + /** 外部接口:book_pic_obj.large */ + private String picLarge; + + /** 外部接口:book_pic_obj_s.small */ + private String picSmallS; + + /** 外部接口:book_pic_obj_s.large */ + private String picLargeS; + + /** 更新时间戳(外部接口使用) */ + @JsonProperty("updateTime") + private String updateTimeTimestamp; + + /** 店铺类型:0=拼多多, 1=孔夫子,2=淘宝, 3=闲鱼 */ + private Integer shopType; + + /** 是否驳回商品:0=不限, 1=驳回商品 */ + private Integer is_return; + + /** 是否违规商品:0=不限, 1=违规商品 */ + private Integer is_filter; + + private String page_count; + + private String word_count; + + private String kongfz_categories; + + private Integer kongfz_include; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookNumberRageBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookNumberRageBo.java new file mode 100644 index 0000000..90f70c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookNumberRageBo.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.domain.bo; + +import lombok.Data; + +@Data +public class BookNumberRageBo { + private String min1; + + private String max1; + + private String min2; + + private String max2; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookUpdateInfoBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookUpdateInfoBo.java new file mode 100644 index 0000000..da41824 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/BookUpdateInfoBo.java @@ -0,0 +1,71 @@ +package org.dromara.zhishu.domain.bo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.BookBaseInfo; +import org.dromara.zhishu.domain.vo.BookPic; + +import java.util.Date; +import java.util.List; + +/** + * 基础信息业务对象 book_base_info + * + * @author + * @date 2025-03-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BookBaseInfo.class, reverseConvertGenerate = false) +public class BookUpdateInfoBo extends BaseEntity { + + /** id */ + @NotBlank(message = "id不能为空", groups = { EditGroup.class }) + private String id; + + /** 书名 */ + private String bookName; + + /** ISBN */ + private String isbn; + + /** 作者 */ + private String author; + + /** 装帧 */ + private String bindingLayout; + + /** 出版社 */ + private String publisher; + + /** 出版时间 */ + private String publicationTime; + + /** 定价 */ + private String fixPbook_picrice; + + /** 分类 */ + private String category; + + /** 是否套装 1是 0否 */ + private Integer isSuit; // 改 Integer + + /** 书图片 */ + private BookPic bookPic; + private String isBookPic; + private String isBookPicS; + + /** 小图(外部接口需要) */ + private BookPic bookPicS; // 新增 + private String bookPicB; // 新增 + private String bookPicW; // 新增 + + /** 更新时间戳(外部接口使用) */ + @JsonProperty("updateTime") + private String updateTimeTimestamp; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/CourierLogBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/CourierLogBo.java new file mode 100644 index 0000000..05294cb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/CourierLogBo.java @@ -0,0 +1,80 @@ +package org.dromara.zhishu.domain.bo; + +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 快递日志业务对象 + * + * @author yxy + * @date 2026-03-18 + */ +@Data +public class CourierLogBo { + + /** + * 主键ID + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * erp订单id + */ + private Long erpOrderId; + + /** + * 订单编号 + */ + private String orderSn; + + /** + * 账号 + */ + private String partnerId; + + /** + * 联调密码 + */ + private String secret; + + /** + * 发件人信息 + */ + private String sender; + + /** + * 收件人信息 + */ + private String receiver; + + /** + * 商品信息 + */ + private String items; + + /** + * 订单唯一序列号 + */ + private String orderSerialNo; + + /** + * 操作类型 + */ + private String type; + + + /** + * 创建人 + */ + private Long createBy; + + /** + * 修改人 + */ + private Long updateBy; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EditBookInfoBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EditBookInfoBo.java new file mode 100644 index 0000000..ff5bfad --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EditBookInfoBo.java @@ -0,0 +1,167 @@ +package org.dromara.zhishu.domain.bo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.vo.BookPic; + +@EqualsAndHashCode(callSuper = true) +@Data +public class EditBookInfoBo extends BaseEntity { + + /** id */ + @NotBlank(message = "id不能为空", groups = { EditGroup.class }) + private String id; + + /** 书名 */ + private String bookName; + /** ISBN */ + private String isbn; + /** 作者 */ + private String author; + /** 装帧 */ + private String bindingLayout; + /** 出版社 */ + private String publisher; + /** 出版时间 */ + private String publicationTime; + /** 定价 */ + private String fixPrice; + /** 分类 */ + private String category; + /** 是否套装 1是 0否 */ + private Integer isSuit; // 改 Integer + /** 书图片 */ + private BookPic bookPic; + private String isBookPic; + private String isBookPicS; + /** 更新时间戳(外部接口使用) */ + @JsonProperty("updateTime") + private String updateTimeTimestamp; +// /** 小图(外部接口需要) */ +// private BookPic bookPicS; // 新增 +// private String bookPicB; // 新增 +// private String bookPicW; // 新增 +// /** 编辑 */ +// private String editor; +// /** 版次 */ +// private String edition; +// /** 开本 */ +// private String format; +// /** 语种 */ +// private String languages; +// /** 印刷时间 */ +// private String printTime; +// /** 纸张 */ +// private String paper; +// /** 页数 */ +// private String pages; +// /** 字数 */ +// private String wordage; +// /** 已售 */ +// @JsonProperty("buy_count") +// private String buyCount; +// /** 在售 */ +// @JsonProperty("sell_count") +// private String sellCount; +// /** 内容简介 */ +// private String content; +// /** 备注 */ +// private String remark; +// /** 叶子类目 id */ +// private Long catId; +// /** 已售数量(外部接口字段 buy_counts) */ +// private String buy_counts; // 改为String类型以支持范围值如"5,99999" +// /** 在售数量(外部接口字段 sell_counts) */ +// private String sell_counts; // 改为String类型以支持范围值 +// /** 出版时间(另一格式) */ +// private String publicationTimes; +// /** 违规书号 0正常 1违规 */ +// private Integer vioBook; +// /** 套装书 0正常 1违规 */ +// private Integer bookSet; +// /** 一号多书 0正常 1违规 */ +// private Integer onenumMbooks; +// /** 违规出版社 */ +// private Integer illPublisher; +// /** 违规作者 */ +// private Integer illAuthor; +// /** 店铺 ids */ +// private List shopIds; +// /** 数据总数 */ +// private Integer total; +// /** 店铺名称 */ +// private List shopNames; +// /** 是否核价 0/1 */ +// private Boolean ispricing; +// /** 核价数量 */ +// private Integer numbers; +// /** 销量选择 */ +// private Integer saleSelect; +// /** 图片类型 官图-1 实图-0 */ +// private String picType; +// /** ISBN 分类 9787-1 非9787-0 */ +// private String categoryType; +// /** 销量范围 */ +// private String totalSale_range; +// /* ------------------------- +// * 以下为外部接口新增字段 +// * ------------------------- */ +// +// /** day_sale_7 */ +// private Integer daySale7; +// +// /** day_sale_15 */ +// private Integer daySale15; +// +// /** day_sale_30 */ +// private Integer daySale30; +// +// /** day_sale_60 */ +// private Integer daySale60; +// +// /** day_sale_90 */ +// private Integer daySale90; +// +// /** day_sale_180 */ +// private Integer daySale180; +// +// /** day_sale_365 */ +// private Integer daySale365; +// +// /** this_year_sale */ +// private Integer thisYearSale; +// +// /** last_year_sale */ +// private Integer lastYearSale; +// +// /** total_sale */ +// private Integer totalSale; + +// /** 外部接口:book_pic_obj.small */ +// private String picSmall; +// +// /** 外部接口:book_pic_obj.large */ +// private String picLarge; +// +// /** 外部接口:book_pic_obj_s.small */ +// private String picSmallS; +// +// /** 外部接口:book_pic_obj_s.large */ +// private String picLargeS; + + + +// /** 店铺类型:0=拼多多, 1=孔夫子,2=淘宝, 3=闲鱼 */ +// private Integer shopType; + +// /** 是否驳回商品:0=不限, 1=驳回商品 */ +// private Integer is_return; +// +// /** 是否违规商品:0=不限, 1=违规商品 */ +// private Integer is_filter; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EncryptionDataSingelBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EncryptionDataSingelBo.java new file mode 100644 index 0000000..909b4a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/EncryptionDataSingelBo.java @@ -0,0 +1,31 @@ +package org.dromara.zhishu.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class EncryptionDataSingelBo { + private Long dataUrl; + private Integer shopPrice; + private Integer minPrice; + private Integer maxPrice; + private Long shopId; + private String shopType; + private Long totalCount; + private String shopToken; + /** + * 查询条件 + */ + private String isOnSale; + private String isbn; + private String priceDown; + private String priceUp; + private String startDate; + private String endDate; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/FastMailBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/FastMailBo.java new file mode 100644 index 0000000..392b0fa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/FastMailBo.java @@ -0,0 +1,60 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.FastMail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 快递打单账号管理业务对象 t_fast_mail + * + * @author yxy + * @date 2025-06-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = FastMail.class, reverseConvertGenerate = false) +public class FastMailBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 类型 1 韵达 + */ + private String type; + + /** + * 账号 + */ + private String partnerId; + + /** + * 联调密码 + */ + private String secret; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 面单类型 1 网点面单 2 拼多多面单 + */ + private String fastMailType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/GoodsAutoFailBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/GoodsAutoFailBo.java new file mode 100644 index 0000000..ebb2e96 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/GoodsAutoFailBo.java @@ -0,0 +1,64 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.GoodsAutoFail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 自动发布失败业务对象 t_goods_auto_fail + * + * @author yxy + * @date 2025-09-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = GoodsAutoFail.class, reverseConvertGenerate = false) +public class GoodsAutoFailBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + private String shopName; + + /** + * 商品id + */ + private Long goodsId; + + private String goodsName; + + /** + * 商品isbn + */ + private String isbn; + + /** + * 货号 + */ + private String artNo; + + /** + * 日志 + */ + private String callBackData; + + + private Integer pageNum; + + private Integer pageSize; + + private Long userId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/IllBaseInfoBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/IllBaseInfoBo.java new file mode 100644 index 0000000..c3afd1e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/IllBaseInfoBo.java @@ -0,0 +1,20 @@ +package org.dromara.zhishu.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IllBaseInfoBo implements Serializable { + private List ids; + private Integer vioBook; + private Integer bookSet; + private Integer onenumMbooks; + private Integer illPublisher; + private Integer illAuthor; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NewUserBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NewUserBo.java new file mode 100644 index 0000000..e5cb764 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NewUserBo.java @@ -0,0 +1,99 @@ +package org.dromara.zhishu.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.BookBaseInfo; +import org.dromara.zhishu.domain.NewUserInfo; + + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = NewUserInfo.class, reverseConvertGenerate = false) +public class NewUserBo extends BaseEntity { + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 企业类型 + */ + private String companyType ; + + /** + * 联系人名 + */ + private String contactPerson; + + /** + * 联系方式 + */ + private String contactPhone;; + + /** + * 邮箱 + */ + private String email; + /** + * 身份证图片 + */ + private String cardIdentity; + + + /** + * 营业执照名称 + */ + private String licenseName; + + /** + * 营业执照编号 + */ + private String licenseNumber; + + /** + * 营业执照 + */ + private String license; + + /** + * 备注 + */ + private String remark; + + /** + * 地址 + */ + private String adress; + + /** + * 经营许可证 + */ + private String businessLicense; + + /** + * 营业执照过期时间 + */ + private String licenseTime; + + + /** + * 经营许可证过期时间 + */ + + private String businessLicenseTime; + + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NoticeBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NoticeBo.java new file mode 100644 index 0000000..a138f8c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/NoticeBo.java @@ -0,0 +1,51 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.Notice; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 消息通知业务对象 t_notice + * + * @author yxy + * @date 2025-05-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Notice.class, reverseConvertGenerate = false) +public class NoticeBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 发件人 + */ + private String sender; + + /** + * 收件人 + */ + private String recipient; + + /** + * 消息 + */ + private String content; + + /** + * 状态 0 未读 1 已读 + */ + private String status; + + + private String tenantId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PriceTemplateBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PriceTemplateBo.java new file mode 100644 index 0000000..f5f2d0a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PriceTemplateBo.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.PriceTemplate; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 价格模板业务对象 t_price_template + * + * @author yxy + * @date 2025-03-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PriceTemplate.class, reverseConvertGenerate = false) +public class PriceTemplateBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 价格模板名称 + */ + private String templateName; + + /** + * 价格类型 0 书价 1 总价(书价+运费) + */ + private String priceType; + + /** + * 增加比例 + */ + private BigDecimal proportion; + + /** + * 增加金额 + */ + private BigDecimal addAmount; + + /** + * 价格模板状态(0正常 1停用) + */ + private String status; + + /** + * 价格区间最大值 + */ + private Integer highPrice; + /** + * 价格区间最小值 + */ + private Integer lowPrice; + + /** + * 价格参数 + */ + private String rangePrice; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrintTemplateBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrintTemplateBo.java new file mode 100644 index 0000000..ce22ad2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrintTemplateBo.java @@ -0,0 +1,48 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.PrintTemplate; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 打印模板业务对象 t_print_template + * + * @author yxy + * @date 2026-03-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PrintTemplate.class, reverseConvertGenerate = false) +public class PrintTemplateBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 快递类型 + */ + private String expressType; + + /** + * 模板名称 + */ + private String printTemplateName; + + /** + * 0正常 1停用 + */ + private String status; + + /** + * 包裹信息json字符串 + */ + private String parcelInformation; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrinterBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrinterBo.java new file mode 100644 index 0000000..4de7872 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/PrinterBo.java @@ -0,0 +1,71 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.Printer; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 打印机设置业务对象 t_printer + * + * @author yxy + * @date 2026-03-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Printer.class, reverseConvertGenerate = false) +public class PrinterBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + + /** + * 打印机类型 1 本地打印机 2 拼多多云打印机 + */ + private String printType; + + /** + * 拼多多云打印机共享码 + */ + private String shareCode; + + /** + * 打印机 + */ + private String printer; + + /** + * 打印机名称 + */ + private String printerName; + + /** + * 是否启用全程打印 + */ + private String isRemotePrinting; + + /** + * 0正常 1停用 + */ + private String status; + + /** + * 验证码 + */ + private String captcha; + + /** + * 拼多多打印机绑定店铺token + */ + private String accessToken; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningLogFileBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningLogFileBo.java new file mode 100644 index 0000000..392d0b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningLogFileBo.java @@ -0,0 +1,55 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.RunningLogFile; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 程序运行日志表业务对象 t_running_log_file + * + * @author yxy + * @date 2025-06-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = RunningLogFile.class, reverseConvertGenerate = false) +public class RunningLogFileBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件顺序 + */ + private String fileOrder; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 文件大小 + */ + private String fileSize; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningTaskBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningTaskBo.java new file mode 100644 index 0000000..273bf4a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/RunningTaskBo.java @@ -0,0 +1,60 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 执行的任务业务对象 t_running_task + * + * @author yxy + * @date 2025-07-23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = RunningTask.class, reverseConvertGenerate = false) +public class RunningTaskBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 任务id + */ + private Long taskId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 优先级 + */ + private Long priority; + + /** + * 内容json字符串 + */ + private String data; + + /** + * 状态 0 未执行 1 执行中 2 执行完成 + */ + private String status; + + /** + * 任务执行完返回的数据 + */ + private String callBackData; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopBo.java new file mode 100644 index 0000000..3bac82e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopBo.java @@ -0,0 +1,150 @@ +package org.dromara.zhishu.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.zhishu.domain.Shop; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; + +/** + * 店铺主表业务对象 t_shop + * + * @author yxy + * @date 2025-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Shop.class, reverseConvertGenerate = false) +public class ShopBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 三方店铺id + */ + private Long mallId; + + /** + * 店铺类型 1 拼多多 + */ + private String shopType; + + /** + * 分组 + */ + private String shopGroup; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 店铺名称(对应平台的店铺名称) + */ + private String shopAliasName; + + /** + * 是否授权 0未授权 1已授权 2已过期 + */ + private String shopAuthorize; + + /** + * 到期时间 + */ + private Date expirationTime; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 店铺key + */ + private String shopKey; + + /** + * token + */ + private String token; + + /** + * 刷新token 的token + */ + private String refreshToken; + + /** + * 店铺状态(0正常 1停用) + */ + private String status; + + + /** + * 租户编码 + */ + private String tenant_id; + + /** + * 第三方平台账号 + */ + private String account; + + /** + * 第三方平台密码 + */ + private String password; + + /** + * 用户id + */ + private Long userId; + + /** + * 是否开启同步订单:默认0-否 1-是 + */ + private Integer isSynOrder; + + /** + * 服务版本 + */ + private String skuSpec; + + /** + * erp到期时间 + */ + private Date shopExpirationTime; + + /** + * erp是否到期 + */ + private String isExpiration; + + /** + * 订购时间 (月份) + */ + private String payMonth; + + /** + * 拼多多试用版是否无上限 1 否 2 是 + */ + private String deregulation; + + /** + * 使用次数 + */ + private Long usageCount; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopContextBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopContextBo.java new file mode 100644 index 0000000..f67d64f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopContextBo.java @@ -0,0 +1,45 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.ShopContext; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 店铺设置商品描述业务对象 t_shop_context + * + * @author yxy + * @date 2025-09-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ShopContext.class, reverseConvertGenerate = false) +public class ShopContextBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品描述 + */ + private String context; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopGoodsPublishedBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopGoodsPublishedBo.java new file mode 100644 index 0000000..b7618d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopGoodsPublishedBo.java @@ -0,0 +1,91 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.ShopGoodsPublished; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 记录发布数据业务对象 t_shop_goods_published + * + * @author yxy + * @date 2025-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ShopGoodsPublished.class, reverseConvertGenerate = false) +public class ShopGoodsPublishedBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 图书主键 + */ + private String shopGoodsId; + + /** + * 发布的店铺ids + */ + private String shopId; + + /** + * 平台商品id + */ + private String platformId; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 品相 + */ + private String conditionCode; + + /** + * 货区id + */ + private Long depotId; + + /** + * isbn + */ + private String isbn; + + /** + * 用户id + */ + private Long userId;; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 商品编码 + */ + private String itemNumber; + + /** + * 货号 + */ + private String artNo; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopImgBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopImgBo.java new file mode 100644 index 0000000..39d5265 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopImgBo.java @@ -0,0 +1,60 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.ShopImg; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 店铺图片业务对象 t_shop_img + * + * @author yxy + * @date 2025-03-17 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ShopImg.class, reverseConvertGenerate = false) +public class ShopImgBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 父id + */ + private Long pid; + + /** + * 相对路径 + */ + private String relativePath; + + /** + * 绝对路径 + */ + private String absolutePath; + + /** + * 类型 1封面水印 2商详水印 3 商详头图 4 商详尾图 5 轮播尾图 + */ + private String type; + + /** + * 图片顺序 + */ + private Long imgOrder; + + /** + * 店铺状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopWarehouseBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopWarehouseBo.java new file mode 100644 index 0000000..f853b2e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ShopWarehouseBo.java @@ -0,0 +1,41 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.ShopWarehouse; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 店铺与仓库自动发布关联业务对象 t_shop_warehouse + * + * @author yxy + * @date 2025-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ShopWarehouse.class, reverseConvertGenerate = false) +public class ShopWarehouseBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户id(仓库id) + */ + @NotNull(message = "用户id(仓库id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/SinglePrintBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/SinglePrintBo.java new file mode 100644 index 0000000..e594774 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/SinglePrintBo.java @@ -0,0 +1,58 @@ +package org.dromara.zhishu.domain.bo; + +import lombok.Data; + +/** + * 单票打印查询条件对象 + * + * @author yxy + * @date 2026-03-27 + */ +@Data +public class SinglePrintBo { + + /** + * 主键ID + */ + private Long id; + + /** + * 快递单号 + */ + private String mailNo; + + /** + * 发件人名称 + */ + private String senderName; + + /** + * 发件人联系方式 + */ + private String senderPhone; + + /** + * 收件人名称 + */ + private String receiverName; + + /** + * 收件人联系方式 + */ + private String receiverPhone; + + /** + * 物品名称 + */ + private String itemName; + + /** + * 打单账号id + */ + private Long fastMailId; + + /** + * 创建人id + */ + private Long createBy; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TAuditBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TAuditBo.java new file mode 100644 index 0000000..7b8b487 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TAuditBo.java @@ -0,0 +1,77 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.TAudit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 审核业务对象 t_audit + * + * @author Lion Li + * @date 2025-04-01 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TAudit.class, reverseConvertGenerate = false) +public class TAuditBo extends BaseEntity { + /** + * id + */ + private Long id; + /** + * 用户ID + */ + private Long userId; + + /** + * 管理员ID + */ + private Long adminId; + + /** + * 审核状态(0通过 1未通过 2待审核) + */ + private String status; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 企业类型 + */ + private String companyType ; + + /** + * 联系人名 + */ + private String contactPerson; + + /** + * 联系方式 + */ + private String contactPhone;; + + /** + * 邮箱 + */ + private String email; + + /** + * 营业执照 + */ + private String license; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TDepotBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TDepotBo.java new file mode 100644 index 0000000..a12e7c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TDepotBo.java @@ -0,0 +1,76 @@ +package org.dromara.zhishu.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.TDepot; + +/** + * 仓库信息设置业务对象 t_depot + * + * @author Lion Li + * @date 2025-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TDepot.class, reverseConvertGenerate = false) +public class TDepotBo extends BaseEntity { + + /** + * 仓库id + */ + private Long id; + + /** + * 仓库编号 + */ + private String code; + + /** + * 仓库名称 + */ + private String name; + + + /** + *单位 + */ + private String unit; + + /** + * 仓库地址 + */ + private String address; + + /** + * 仓库管理员 + */ + private String manager; + + + /** + * 仓库状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 货架数 + */ + private Long sheQuantityMax; + + /** + * 用户id + */ + private Long userId; + + /** + * 模板id + */ + private String templateId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TFreightBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TFreightBo.java new file mode 100644 index 0000000..d75a574 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TFreightBo.java @@ -0,0 +1,74 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import org.dromara.zhishu.domain.TFreight; + +/** + * 三级货区管理业务对象 t_freight + * + * @author Lion Li + * @date 2025-04-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TFreight.class, reverseConvertGenerate = false) +public class TFreightBo extends BaseEntity { + + /** + * 货位id + */ +// @NotNull(message = "货位id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 货架id + */ +// @NotNull(message = "货架id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long shelvesId; + + /** + * 货位编码 + */ + private String code; + + /** + * 货位名称 + */ + private String name; + + /** + * 货位单位 + */ + private String unit; + + /** + * 货位容量 + */ + private Long capMax; + + /** + * 货号 + */ + private String artNo; + + /** + * 仓库状态(0正常 1停用) + */ + private String status; + + /** + * userId + */ + private Long userId; + + /** + * 是否开启分销 0否 1是 + */ + private String allowDistribution; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TInviteRelationsBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TInviteRelationsBo.java new file mode 100644 index 0000000..3266975 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TInviteRelationsBo.java @@ -0,0 +1,56 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.zhishu.domain.TInviteRelations; + +/** + * 【请填写功能名称】业务对象 t_invite_relations + * + * @author Lion Li + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TInviteRelations.class, reverseConvertGenerate = false) +public class TInviteRelationsBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 邀请人ID + */ + @NotNull(message = "邀请人ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long inviterId; + + /** + * 被邀请人ID + */ + @NotNull(message = "被邀请人ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long inviteeId; + + /** + * 使用的邀请码 + */ + @NotBlank(message = "使用的邀请码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String inviteCode; + + /** + * 邀请时间 + */ + @NotNull(message = "邀请时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date inviteTime; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShelvesBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShelvesBo.java new file mode 100644 index 0000000..7495f36 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShelvesBo.java @@ -0,0 +1,73 @@ +package org.dromara.zhishu.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.TShelves; + +/** + * 货架信息业务对象 t_shelves + * + * @author Lion Li + * @date 2025-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TShelves.class, reverseConvertGenerate = false) +public class TShelvesBo extends BaseEntity { + + /** + * 货架id + */ + @NotNull(message = "货架id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 货架名称 + */ + private String name; + + /** + * 货架容量 + */ + private Long sheCapMax; + + + /** + * 货架单位 + */ + private String unit; + + /** + * 仓库id + */ + private Long depotId; + + /** + * 货架状态(0正常 1停用) + */ + private String status; + + /** + * 货架编码 + */ + private String code; + + /** + * 仓库名称 + */ + private String depotName; + + /** + * userId + */ + @TableField(exist = false) + private Long userId; + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShopOrderDetailBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShopOrderDetailBo.java new file mode 100644 index 0000000..36e182a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/TShopOrderDetailBo.java @@ -0,0 +1,107 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.TShopOrderDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 订单详情业务对象 t_shop_order_detail + * + * @author Lion Li + * @date 2025-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TShopOrderDetail.class, reverseConvertGenerate = false) +public class TShopOrderDetailBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 店铺id + */ + @NotBlank(message = "店铺id不能为空", groups = { AddGroup.class, EditGroup.class }) + private String shopId; + + /** + * 店铺名称 + */ + @NotBlank(message = "店铺名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String shopName; + + /** + * 订单id + */ + @NotBlank(message = "订单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderId; + + /** + * 商品数量 + */ + @NotNull(message = "商品数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long goodsCount; + + /** + * 商品编码 + */ + @NotBlank(message = "商品编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String goodsId; + + /** + * 商品图片 + */ + @NotBlank(message = "商品图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String goodsImg; + + /** + * 商品名称 + */ + @NotBlank(message = "商品名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String goodsName; + + /** + * 商品单件 单价:元 + */ + @NotBlank(message = "商品单件 单价:元不能为空", groups = { AddGroup.class, EditGroup.class }) + private String goodsPrice; + + /** + * 商品规格 + */ + @NotBlank(message = "商品规格不能为空", groups = { AddGroup.class, EditGroup.class }) + private String goodsSpec; + + /** + * 商品维度外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息 + */ + @NotBlank(message = "商品维度外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outerGoodsId; + + /** + * sku维度商家外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息 + */ + @NotBlank(message = "sku维度商家外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outerId; + + /** + * 商品sku编码 + */ + @NotBlank(message = "商品sku编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String skuId; + + /** + * 店铺状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserAccountBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserAccountBo.java new file mode 100644 index 0000000..a4dd7a9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserAccountBo.java @@ -0,0 +1,60 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.UserAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 账号管理业务对象 t_user_account + * + * @author yxy + * @date 2026-02-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserAccount.class, reverseConvertGenerate = false) +public class UserAccountBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 出入帐账户类型 0 出账 1 入账 + */ + private String type; + + /** + * 账号类型 + */ + private String accountType; + + /** + * 账号名称 + */ + private String accountName; + + /** + * 账号 + */ + private String account; + + /** + * 是否默认账号 0 否 1 是 + */ + private String isDefault; + + /** + * 店铺状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserTAuditBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserTAuditBo.java new file mode 100644 index 0000000..2103d54 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/UserTAuditBo.java @@ -0,0 +1,115 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.UserTAudit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 列表业务对象 t_audit + * + * @author Lion Li + * @date 2025-04-02 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserTAudit.class, reverseConvertGenerate = false) +public class UserTAuditBo extends BaseEntity { + + /** + * id + */ + private Long id; + /** + * 用户ID + */ + private Long userId; + + /** + * 管理员ID + */ + private Long adminId; + + /** + * 审核状态(0通过 1未通过 2待审核) + */ + private String status; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 企业类型 + */ + private String companyType ; + + /** + * 联系人名 + */ + private String contactPerson; + + /** + * 联系方式 + */ + private String contactPhone;; + + /** + * 邮箱 + */ + private String email; + + /** + * 身份证图片 + */ + private String cardIdentity; + + + /** + * 营业执照名称 + */ + private String licenseName; + + /** + * 营业执照编号 + */ + private String licenseNumber; + + /** + * 营业执照 + */ + private String license; + + /** + * 备注 + */ + private String remark; + /** + * 地址 + */ + private String adress; + + /** + * 经营许可证 + */ + private String businessLicense; + + /** + * 营业执照过期时间 + */ + private String licenseTime; + + + /** + * 经营许可证过期时间 + */ + + private String businessLicenseTime; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ViolationBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ViolationBo.java new file mode 100644 index 0000000..a9a1982 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ViolationBo.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.Violation; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 违规业务对象 t_violation + * + * @author yxy + * @date 2025-06-23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Violation.class, reverseConvertGenerate = false) +public class ViolationBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 类型 0 isbn 1 书名 2 作者 3 出版社 + */ + private String type; + + /** + * 违规原因 + */ + private String content; + + /** + * 发起人 + */ + private Long userid; + + /** + * 是否审核 0 未审核 1 已审核 + */ + private String review; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 审核意见 + */ + private String remark; + + /** + * 违规内容 + */ + private String name; + + /** + * 分类 + */ + private String sort; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WarehouseSettingsBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WarehouseSettingsBo.java new file mode 100644 index 0000000..de10ad8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WarehouseSettingsBo.java @@ -0,0 +1,91 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.UserSettingsAttribute; +import org.dromara.zhishu.domain.WarehouseSettings; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 设置业务对象 warehouse_settings + * + * @author yxy + * @date 2025-12-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WarehouseSettings.class, reverseConvertGenerate = false) +public class WarehouseSettingsBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 设置模板名称 + */ + private String settingName; + + /** + * 库存同步形式 0 下单减库存 1 支付减库存 + */ + private Long stockSynchronizeType; + + /** + * 是否自动下发 0 否 1 是 + */ + private Long autoIssue; + + /** + * 是否开启亏损保护 0 否 1 是 + */ + private Long lossProtection; + + /** + * 利润下限 + */ + private BigDecimal profitFloor; + + /** + * 是否启用 0 否 1 是 + */ + private Long status; + + /** + * 是否删除 0 否 1 是 + */ + private Long delFlag; + + /** + * 退款后是否自动回退库存 0否 1是 + */ + private Long stockRollback; + + /** + * 创建时间时间戳 + */ + private Long createAt; + + /** + * 修改时间时间戳 + */ + private Long updateAt; + + /** + * 店铺id + */ + private String shopIds; + + /** + * 规则数据 + */ + private String userSettingsAttributeListStr; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WaveDetailBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WaveDetailBo.java new file mode 100644 index 0000000..147d5d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WaveDetailBo.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.WaveDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import org.dromara.zhishu.domain.dto.WaveDetailInsertDto; + +/** + * 波次信息业务对象 wave_detail + * + * @author Lion Li + * @date 2026-01-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WaveDetail.class, reverseConvertGenerate = false) +public class WaveDetailBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 波次ID + */ + private Long waveId; + + /** + * ISBN + */ + private String isbn; + + /** + * 仓储ID + */ + private Long stockId; + + /** + * 仓储编号 + */ + private String stockNum; + + /** + * 创建时间 + */ + private Long createdTime; + + /** + * 更新时间 + */ + private Long updatedTime; + + /** + * 是否已删除 + */ + private Long isDel; + + /** + * 前台传递对象 + */ + private WaveDetailInsertDto requestData; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WhiteListBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WhiteListBo.java new file mode 100644 index 0000000..6e1d3cf --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/WhiteListBo.java @@ -0,0 +1,40 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.WhiteList; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 白名单业务对象 t_white_list + * + * @author yxy + * @date 2025-06-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = WhiteList.class, reverseConvertGenerate = false) +public class WhiteListBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * ip + */ + private String ip; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyBindBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyBindBo.java new file mode 100644 index 0000000..776b221 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyBindBo.java @@ -0,0 +1,40 @@ +package org.dromara.zhishu.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; + + +@Data +@EqualsAndHashCode(callSuper = true) +public class XyBindBo extends BaseEntity { + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 闲管家名称 + */ + private String appName; + + /** + * 闲管家应用id + */ + private Long mallId; + + /** + * 闲管家应用密钥 + */ + private String token; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyCategoryBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyCategoryBo.java new file mode 100644 index 0000000..6dea11f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/XyCategoryBo.java @@ -0,0 +1,27 @@ +package org.dromara.zhishu.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.XyCategory; + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = XyCategory.class, reverseConvertGenerate = false) +public class XyCategoryBo extends BaseEntity { + /** + * 行业 + */ + private String industry; + + /** + * 类目 + */ + private String category; + + /** + * id + */ + private String id; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsBo.java new file mode 100644 index 0000000..2b4dd1d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsBo.java @@ -0,0 +1,290 @@ +package org.dromara.zhishu.domain.bo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zhishu.domain.ZhishuShopGoods; + +import java.util.List; + +/** + * 商品信息业务对象 zhishu_shop_goods + * + * @author Lion Li + * @date 2025-03-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ZhishuShopGoods.class, reverseConvertGenerate = false) +public class ZhishuShopGoodsBo extends BaseEntity { + + /** + * id + */ + @NotBlank(message = "id不能为空", groups = {EditGroup.class}) + private String id; + + /** + * 是否查寻全部商品:1-否 2-是 + */ + private Integer isQueryAllGoods; + + /** + * 是否加入分销:0-否 1-是 + */ + private Integer isJoinDistribution; + + /** + * 用户id + */ + private Long userId; + + /** + * 产品编码 + */ + private String productId; + + /** + * 仓库Id + */ + private Long depotId; + + /** + * 仓库名称 + */ + private String depotName; + + /** + * 地址 + */ + private String address; + + /** + * 物流模板Id + */ + private Long templateId; + + /** + * 物流模板名称 + */ + private String templateName; + + /** + * 商品名称 + */ + private String goodsName; + + /** + * isbn + */ + private String isbn; + + /** + * 货号 + */ + private String artNo; + + /** + * 原始货号 + */ + private String originalArtNo; + + /** + * 期初库存 + */ + private Long stock; + + /** + * 标准售价 + */ + private Long price; + + /** + * 运算符 + */ + private String minprice; + + /** + * 最高标准价格 + */ + private String maxprice; + + /** + * 品相 + */ + private String conditionCode; + + /** + * 备注 + */ + private String remark; + + /** + * 商品编号 + */ + private String itemNumber; + + /** + * 商品定价 + */ + private Long fixPrice; + + /** + * 库存 + */ + private Long inventory; + + /** + * 运算符 + */ + private String mininventory; + + /** + * 最高库存 + */ + private Long maxinventory; + + /** + * 是否已进行货号转换:0-否,1-是 + */ + private Integer isArtNoConversion; + + /** + * 图片是否为空:1-是,0-否 + */ + private Integer IsBookPicNull; + + /** + * 图片 + */ + private String bookPic; + + /** + * 单位 + */ + private String unit; + + /** + * 包册数 + */ + private Long booksNumber; + + /** + * 页数 + */ + private Long pages; + + /** + * 是否是套餐(0套餐 1非套餐) + */ + private Long isPackage; + + /** + * 出版社名称 + */ + private String publicationName; + + /** + * 出版时间 + */ + private String publicationTime; + + /** + * 作者 + */ + private String author; + + /** + * 出版社 + */ + private String publisher; + + /** + * 出版时间 + */ + private String publisherTime; + + /** + * 开本 + */ + private String format; + /** + * 开本 + */ + private String wordage; + /** + * 统一书号 + */ + private String unifiedIsbn; + + /** + * 地区 + */ + private String region; + + /** + * 译者 + */ + private String translator; + + /** + * 编者 + */ + private String editor; + + /** + * 书籍开本 + */ + private String booklets; + + /** + * 字数 + */ + private Long wordCount; + + /** + * 装帧类型 + */ + private String bindType; + + /** + * 包装方式(0礼盒装 1普通包装) + */ + private Long packing; + + /** + * 货区Id列表 + */ + private List cargoAreaIds; + + /** + * 是否存在isbn:0-否,1-是 + */ + private Integer isExistIsbn; + + /** + * 任务id + */ + private Long taskId; + + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + + /** + * 仓库的用户id + */ + private String warehouseUserId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsDetailBo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsDetailBo.java new file mode 100644 index 0000000..749f28b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/bo/ZhishuShopGoodsDetailBo.java @@ -0,0 +1,70 @@ +package org.dromara.zhishu.domain.bo; + +import org.dromara.zhishu.domain.ZhishuShopGoodsDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商品信息补全表业务对象 zhishu_shop_goods_detail + * + * @author yxy + * @date 2025-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ZhishuShopGoodsDetail.class, reverseConvertGenerate = false) +public class ZhishuShopGoodsDetailBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商品id + */ + private Long pid; + + /** + * 作者 + */ + private String author; + + /** + * 出版社 + */ + private String publisher; + + /** + * 出版时间 + */ + private String publishertime; + + /** + * 开本 + */ + private String format; + + /** + * 字数 + */ + private String wordage; + + /** + * 统一书号 + */ + private String unifiedisbn; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookBaseInfoDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookBaseInfoDto.java new file mode 100644 index 0000000..a34192f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookBaseInfoDto.java @@ -0,0 +1,31 @@ +package org.dromara.zhishu.domain.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.dromara.zhishu.domain.bo.BookBaseInfoBo; + +@Data +public class BookBaseInfoDto extends BookBaseInfoBo { + + + private String publicationStartTime; + + private String publicationEndTime; + + @JsonProperty("totalSale_range") + private String totalSale_range; + /** 已售数量(外部接口字段 buy_counts) */ + private String buy_counts; // 改为String类型以支持范围值如"5,99999" + + /** 在售数量(外部接口字段 sell_counts) */ + private String sell_counts; // 改为String类型以支持范围值 + + private String page_count; + + private String word_count; + + private String kongfz_categories; + + private Integer kongfz_include; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookPriceInfoDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookPriceInfoDto.java new file mode 100644 index 0000000..eb4cf42 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/BookPriceInfoDto.java @@ -0,0 +1,43 @@ +package org.dromara.zhishu.domain.dto; + +import com.opencsv.bean.CsvBindByName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BookPriceInfoDto { + + @CsvBindByName(column = "ISBN", required = true) + private String isbn; + + @CsvBindByName(column = "书名") + private String bookName; + + // 单位分 + @CsvBindByName(column = "原始价格") + private String originalPrice; + + // 单位分 + @CsvBindByName(column = "核价价格") + private String corePrice; + + // 单位分 + @CsvBindByName(column = "改价价格") + private String modifiedPrice; + + @CsvBindByName(column = "平台ID") + private String platformId; + + @CsvBindByName(column = "SkuID") + private String skuId; + + @CsvBindByName(column = "在售数量") + private String saleQuantity; + + @CsvBindByName(column = "原因") + private String reason; + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/ErpGoodsDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/ErpGoodsDto.java new file mode 100644 index 0000000..9c20c60 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/ErpGoodsDto.java @@ -0,0 +1,33 @@ +package org.dromara.zhishu.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * erp店铺商品dro + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ErpGoodsDto { + + private String tableName; + + private String shopId; + + private String trilateralId; + + private String isOnSale; + + private String isbn; + + private String priceDown; + + private String priceUp; + + private String startDate; + + private String endDate; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzRequestDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzRequestDto.java new file mode 100644 index 0000000..ecc1171 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzRequestDto.java @@ -0,0 +1,21 @@ +package org.dromara.zhishu.domain.dto; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +public class KongfzRequestDto { + //商品编号 + private Long itemId; + //商品审核状态,上架商品时,商品审核状态会修改为待审核,需要重新审核通过后才可以出售 + private String certifyStatus; + //上架时间戳 + private String beginSaleTime; + //更新时间 + private String updateTime; + //下架时间戳。系统默认的一个很大的时间戳 + private String endSaleTime; + //上下架状态。1:上架;0:下架 + private String isOnSale; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzShopDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzShopDto.java new file mode 100644 index 0000000..334e950 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/KongfzShopDto.java @@ -0,0 +1,28 @@ +package org.dromara.zhishu.domain.dto; + +import lombok.Data; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.springframework.beans.BeanUtils; + +@Data +public class KongfzShopDto { + //商品编号 + private Long itemId; + //商品审核状态,上架商品时,商品审核状态会修改为待审核,需要重新审核通过后才可以出售 + private String certifyStatus; + //上架时间戳 + private String beginSaleTime; + //更新时间 + private String updateTime; + //下架时间戳。系统默认的一个很大的时间戳 + private String endSaleTime; + //上下架状态。1:上架;0:下架 + private Integer isOnSale; + // 转换方法 + public static KongfzShopDto fromEntity(ZhishuShopGoods zs) { + KongfzShopDto dto = new KongfzShopDto(); + BeanUtils.copyProperties(zs, dto); + dto.setIsOnSale(1); // 默认上架状态 + return dto; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/OrderExternalGoodsDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/OrderExternalGoodsDto.java new file mode 100644 index 0000000..aecc256 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/OrderExternalGoodsDto.java @@ -0,0 +1,347 @@ +package org.dromara.zhishu.domain.dto; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +@Data +@EqualsAndHashCode(callSuper = true) +public class OrderExternalGoodsDto extends BaseEntity { + + /** + * + */ + private Long id; + + /** + * 订单类型 1 内部订单 2 外部订单 + */ + private Long type; + + /** + * 订单id + */ + private Long orderId; + + /** + * erp自营商品id + */ + private Long goodsId; + + /** + * 店家支付金额(不包含手续费) + */ + private Long payPrice; + + /** + * 手续费 + */ + private Long serviceCharge; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 创建时间时间戳 + */ + private Long createdAt; + + /** + * 是否完成分销 0否 1是 + */ + private String isDistribution; + + /** + * 仓库的创建人 + */ + private Long deptUseId; + + + /** + * 是否出库 0 未出库 1 出库 + */ + private Long whetherOutbound; + + /** + * erp订单id + */ + private Long erpOrderId; + + /** + * 订单编号 + */ + private String orderSn; + + /** + * 平台店铺id + */ + private String shopId; + + /** + * erp店铺id + */ + private Long shopErpId; + + /** + * 店铺名称 + */ + private String shopErpName; + + /** + * 店铺类型 + */ + private Long shopType; + + /** + * 商品一级id + */ + private Long catId1; + + /** + * 商品二级id + */ + private Long catId2; + + /** + * 商品三级id + */ + private Long catId3; + + /** + * 商品四级id + */ + private Long catId4; + + /** + * 订单中商品sku列表json字符富川 + */ + private String itemList; + + /** + * 订单金额 单位:分 + */ + private Long orderTotal; + + /** + * 商品金额(以分为单位)商品金额=商品销售价格*商品数量-订单改价折扣金额 + */ + private Long goodsAmount; + + /** + * 订单改价折扣金额(以分为单位) + */ + private Long orderChangeAmount; + + /** + * 支付金额 (以分为单位) 支付金额=商品金额-折扣金额+邮费+服务费 + */ + private Long payAmount; + + /** + * 创建时间 时间戳 + */ + private Long erpOrderCreatedAt; + + /** + * 成交状态 + */ + private Long confirmStatus; + + /** + * 成交时间 时间戳 + */ + private Long confirmAt; + + /** + * 支付单号 + */ + private String payNo; + + /** + * 支付时间 时间戳 + */ + private Long payAt; + + /** + * 支付方式 + */ + private Long payType; + + /** + * 平台优惠金额 (以分为单位) + */ + private Long platformDiscount; + + /** + * 买家留言信息 + */ + private String buyerMemo; + + /** + * 发货状态 1: 待付款 2:待发货,3:已发货待签收,4:交易成功 5: 已退款 6 :交易关闭 + */ + private Long orderStatus; + + /** + * 修改用,修改前的订单状态 + */ + private Long oldOrderStatus; + + /** + * 物流id + */ + private Long shippingId; + + /** + * 发货时间 时间戳 + */ + private Long shippingAt; + + /** + * 收件地城市 + */ + private String city; + + /** + * 城市编码 + */ + private Long cityId; + + /** + * 收件地省份 + */ + private String province; + + /** + * 省份编码 + */ + private Long provinceId; + + /** + * 收件地国家或地区 + */ + private String country; + + /** + * 国家或地区编码 + */ + private Long countryId; + + /** + * 收件地区县 + */ + private String town; + + /** + * 区县编码 + */ + private Long townId; + + /** + * 快递单号 + */ + private String trackingNumber; + + /** + * 商家订单备注 + */ + private String remark; + + /** + * 订单备注标记,1-红色,2-黄色,3-绿色,4-蓝色,5-紫色 + */ + private Long remarkTag; + + /** + * 订单备注标记名称 + */ + private String remarkTagName; + + /** + * 确认收货时间 + */ + private Long receiveAt; + + /** + * 售后状态 + */ + private Long afterSalesStatus; + + /** + * 订单最近一次更新时间 + */ + private Long updatedAt; + + /** + * 是否可视化 + */ + private Long isShow; + + /** + * shop_id的MD5首字母(大写)用于分区 + */ + private String shopMd5Prefix; + + /** + * 是否下发订单 0 否 1 是 + */ + private Long isIssue; + + /** + * erp的订单售后状态 0 无售后 1 待仓库处理 2 待仓库收货 3 售后完成 4 拒绝 5 延后处理 + */ + private Long erpAfterSalesStatus; + + /** + * erp订单售后发起时间 + */ + private Long erpAssCreateAt; + + /** + * 售后原因 + */ + private String erpAssReason; + + /** + * 拒绝原因 + */ + private String erpAssRemark; + + /** + * 退货地址 + */ + private String erpAssAddress; + + /** + * 分页查询属性 + */ + //第几页 + private Integer pageNum; + //一页多少条 + private Integer pageSize; + + private Long startTime; + private Long endTime; + // 货号 + private String artNo; + // 原始货号 + private String originalArtNo; + // 是否查寻全部商品:1-否 2-是 + private Integer isQueryAllGoods; + // isbn + private String isbn; + + /** + * 收件人名称 + */ + private String receiverName; + + /** + * 收件人电话 + */ + private String mobile; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/PddOrderQueryDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/PddOrderQueryDto.java new file mode 100644 index 0000000..b3fd690 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/PddOrderQueryDto.java @@ -0,0 +1,35 @@ +package org.dromara.zhishu.domain.dto; + +import lombok.Data; + +@Data +public class PddOrderQueryDto { + + + + private Integer order_status; // 1:待发货,2:已发货待签收,3:已签收 5:全部 + + private Integer page; + + private Integer page_size; + + private Integer refund_status; //售后状态 1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功 5:全部 + + private Long start_confirm_at; //时间戳 + + private Long end_confirm_at; //时间戳 + + + private String startTime; + + private String endTime; + + + private Integer trade_type; // 0-普通订单 ,1- 定金订单 + + private boolean use_has_next; + + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataItemDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataItemDto.java new file mode 100644 index 0000000..cd48792 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataItemDto.java @@ -0,0 +1,154 @@ +package org.dromara.zhishu.domain.dto; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.zhishu.annotation.EnableExcelComment; +import org.dromara.zhishu.converter.PriceDivideBy100Converter; +import org.springframework.util.StringUtils; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@AutoMapper(target = SuccessDataItemDto.class) // 添加注解 +@EnableExcelComment +@HeadRowHeight(30) // 设置表头行高为30磅 +public class SuccessDataItemDto { + + /** + * 拉取商品表主键 + */ + @ExcelIgnore + private String id; + + /** + * ISBN + */ + @ExcelProperty(value = "ISBN") + @ColumnWidth(15) + private String isbn; + + /** + * 三方平台商品Id + */ + @ExcelProperty(value = "商品id") + @ColumnWidth(15) + private String trilateralId; + + /** + * 商品编码 + */ + @ExcelProperty(value = "商品编码") + @ColumnWidth(15) + private String goodsCode; + /** + * 图片 + */ + @ExcelIgnore + private Object img; + + /** + * 书名 + */ + @ExcelProperty(value = "商品名称") + @ColumnWidth(15) + private String title; + + /** + * 库存 + */ + @ExcelProperty(value = "库存数量") + @ColumnWidth(15) + private String stock; + + /** + * 完成时间 + */ + @ExcelProperty(value = "创建时间") + @ColumnWidth(15) + private String finishTime; + + /** + * 价格 + */ + @ExcelProperty(value = "价格", converter = PriceDivideBy100Converter.class) + @ColumnWidth(15) + private String totalPrice; + + /** + * sku编码 + */ + @ExcelProperty(value = "规格编码/货号") + @ColumnWidth(15) + private String skuCode; + + /** + * skuId + */ + @ExcelIgnore + private String skuId; + + /** + * 是否在售 + */ + @ExcelProperty(value = "是否在架上", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=下架,1=上架") + @ColumnWidth(15) + private String isOnSale; + + /** + * 图片选择 + */ + @ExcelIgnore + private String imageSelect; + + /** + * 权重 + */ + @ExcelIgnore + private String priority; + + /** + * 图片 + */ + @ExcelProperty(value = "商品图片") + @ColumnWidth(15) + private String imageBigUrl; + + /** + * quality + */ + @ExcelIgnore + private String quality; + + /** + * 店铺类型 + */ + @ExcelIgnore + private String shopType; + + + /** + * 判断数据是否有效(至少有一个业务字段有值) + * + * @return true: 有效数据, false: 无效数据(提示行产生的空对象) + */ + public boolean isValidData() { + return StringUtils.hasText(isbn) + || StringUtils.hasText(trilateralId) + || StringUtils.hasText(goodsCode) + || StringUtils.hasText(title) + || StringUtils.hasText(stock) + || StringUtils.hasText(totalPrice) + || StringUtils.hasText(skuCode) + || StringUtils.hasText(isOnSale) + || StringUtils.hasText(imageBigUrl); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataKfz.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataKfz.java new file mode 100644 index 0000000..aeda531 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/SuccessDataKfz.java @@ -0,0 +1,136 @@ +package org.dromara.zhishu.domain.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.zhishu.annotation.EnableExcelComment; +import org.dromara.zhishu.converter.PriceDivideBy100Converter; +import org.dromara.zhishu.converter.QualityConverter; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@AutoMapper(target = SuccessDataKfz.class) // 添加注解 +@HeadRowHeight(30) // 设置表头行高为30磅 +public class SuccessDataKfz { + + /** + * 商品编码 + */ + @ExcelProperty(value = "商品编号") + @ColumnWidth(15) + private String goodsCode; + + + /** + * 书名 + */ + @ExcelProperty(value = "商品名称") + @ColumnWidth(15) + private String title; + + /** + * sku编码 + */ + @ExcelProperty(value = "货号") + @ColumnWidth(15) + private String artNo; + + + /** + * ISBN + */ + @ExcelProperty(value = "ISBN") + @ColumnWidth(15) + private String isbn; + + /** + * 作者 + */ + @ExcelProperty(value = "作者") + @ColumnWidth(15) + private String author; + + /** + * 出版社 + */ + @ExcelProperty(value = "出版社") + @ColumnWidth(15) + private String publisher; + + /** + * 定价 + */ + @ExcelProperty(value = "商品定价", converter = PriceDivideBy100Converter.class) + @ColumnWidth(15) + private String pricing; + + + /** + * 售价 + */ + @ExcelProperty(value = "商品售价", converter = PriceDivideBy100Converter.class) + @ColumnWidth(15) + private String totalPrice; + + + /** + * 商品分类 + */ + @ExcelProperty(value = "商品分类") + @ColumnWidth(15) + private String goodsClassification; + + /** + * 本店分类 + */ + @ExcelProperty(value = "本店分类") + @ColumnWidth(15) + private String shopClassification; + + /** + * 品相 + */ + @ExcelProperty(value = "品相", converter = QualityConverter.class) + @ColumnWidth(15) + private String quality; + + /** + * 库存 + */ + @ExcelProperty(value = "库存") + @ColumnWidth(15) + private String stock; + + /** + * 完成时间 + */ + @ExcelProperty(value = "上书时间") + @ColumnWidth(15) + private String finishTime; + + /** + * 三方平台商品Id + */ + @ExcelProperty(value = "商品ID") + @ColumnWidth(15) + private String trilateralId; + + /** + * 商品ID + */ + @ExcelProperty(value = "店铺ID") + @ColumnWidth(15) + private String shopId; + + /** + * 图片 + */ + @ExcelProperty(value = "商品图片") + @ColumnWidth(15) + private String img; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/TShopGoodsPublishedDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/TShopGoodsPublishedDto.java new file mode 100644 index 0000000..3216a1a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/TShopGoodsPublishedDto.java @@ -0,0 +1,62 @@ +package org.dromara.zhishu.domain.dto; + +import lombok.Data; + +/** + * 已发布商品信息DTO + */ +@Data +public class TShopGoodsPublishedDto { + + /** + * 主键ID + */ + private Long id; + + /** + * erp店铺id + */ + private Long erpShopId; + + /** + * 平台店铺名称 + */ + private String shopName; + + /** + * 店铺名称 + */ + private String erpShopName; + + /** + * 新商品id + */ + private Long productId; + + /** + * 新仓库id + */ + private Long warehouseId; + + /** + * 平台店铺id + */ + private Long shopId; + + /** + * 平台商品id + */ + private Long trilateralId; + + // ==================== 分页参数 ==================== + + /** + * 页码 + */ + private Integer pageNum; + + /** + * 每页大小 + */ + private Integer pageSize; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/WaveDetailInsertDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/WaveDetailInsertDto.java new file mode 100644 index 0000000..2472a87 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/WaveDetailInsertDto.java @@ -0,0 +1,39 @@ +package org.dromara.zhishu.domain.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "波次明细插入DTO") +public class WaveDetailInsertDto { + /** + * ISBN 号码 + * 示例: "9787111636628" + */ + @NotBlank(message = "ISBN不能为空") + @Schema(description = "ISBN号码", example = "9787111636628") + private String isbn; + + /** + * 扫描时间字符串 + * 格式: "yyyy/MM/dd HH:mm" + * 示例: "2024/01/15 14:30" + */ + @NotBlank(message = "扫描时间不能为空") + @Pattern(regexp = "\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}", + message = "时间格式应为 yyyy/MM/dd HH:mm") + @Schema(description = "扫描时间,格式为 yyyy/MM/dd HH:mm", + example = "2024/01/15 14:30") + private String time; + + /** + * 转换后的时间对象 + * (可选,根据业务需要) + */ + @Schema(description = "转换后的扫描时间对象") + private Date scanTime; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/parcelInformationDto.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/parcelInformationDto.java new file mode 100644 index 0000000..593d0db --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/parcelInformationDto.java @@ -0,0 +1,30 @@ +package org.dromara.zhishu.domain.dto; + +import lombok.Data; + +/** + * 包裹信息 + */ +@Data +public class parcelInformationDto { + + /** + * 类型 + */ + private String type; + + /** + * 信息名称 + */ + private String name; + + /** + * 是否启用 0 否 1 是 + */ + private String isBol; + + /** + * 排序 + */ + private String sort; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/CalculatePriceByTemplateRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/CalculatePriceByTemplateRequest.java new file mode 100644 index 0000000..84ec249 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/CalculatePriceByTemplateRequest.java @@ -0,0 +1,22 @@ +package org.dromara.zhishu.domain.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CalculatePriceByTemplateRequest { + + /** + * 平台商品Id + */ + private String platformId; + + /** + * 计算前价格 + */ + private Long price; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/DeleteSaleOutGoodsBatchRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/DeleteSaleOutGoodsBatchRequest.java new file mode 100644 index 0000000..ffd89d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/DeleteSaleOutGoodsBatchRequest.java @@ -0,0 +1,22 @@ +package org.dromara.zhishu.domain.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeleteSaleOutGoodsBatchRequest { + + @NotBlank(message = "token不能为空") + private String token; + + @NotEmpty(message = "goodsIds不能为空") + private List goodsIds; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpBaseShopPageGetRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpBaseShopPageGetRequest.java new file mode 100644 index 0000000..060dbd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpBaseShopPageGetRequest.java @@ -0,0 +1,45 @@ +package org.dromara.zhishu.domain.dto.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ErpBaseShopPageGetRequest { + + // 每页大小,最大50 + private Integer limit = 1; + + // 当前页码,从1开始 + private Integer page = 20; + + // 店铺昵称 + @JsonProperty("shop_nick") + private String shopNick; + + // 店铺类型 + @JsonProperty("shop_type") + private Integer shopType; + + // 扩展查询条件 + @JsonProperty("shop_ext") + private ShopExt shopExt; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ShopExt { + + // 修改时间 + @JsonProperty("modify_time") + private String modifyTime; + + // 店铺状态 0 禁用; 1 启用 + private Integer status; + + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpGoodsUpdateItemRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpGoodsUpdateItemRequest.java new file mode 100644 index 0000000..d98c78f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ErpGoodsUpdateItemRequest.java @@ -0,0 +1,38 @@ +package org.dromara.zhishu.domain.dto.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ErpGoodsUpdateItemRequest { + + // 商品编码(不能为空) + @JsonProperty("item_code") + private String itemCode; + + // 商品名称(不能为空) + @JsonProperty("item_name") + private String itemName; + + // expiration必须在1-10000之间(不能为空) + private String expiration; + + // 规格集 + private Sku skus; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Sku { + + // 规格编码(不能为空) + @JsonProperty("spec_code") + private String specCode; + + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/GoodsComparisonRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/GoodsComparisonRequest.java new file mode 100644 index 0000000..099261e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/GoodsComparisonRequest.java @@ -0,0 +1,22 @@ +package org.dromara.zhishu.domain.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GoodsComparisonRequest { + + private Long shopId; + + private Long userId; + + private String currentDateTime; + + private List zhishuShopGoodsRequestList; + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ImageProcessingRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ImageProcessingRequest.java new file mode 100644 index 0000000..ab860f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/ImageProcessingRequest.java @@ -0,0 +1,14 @@ +package org.dromara.zhishu.domain.dto.request; + +import lombok.Data; + +@Data +public class ImageProcessingRequest { + private String imageUrl; + private String goodsName; + private String isbn; + private String isKW; + private String autoUpload; + private String imageData; // Base64编码的图片数据 + private String fileName; // 文件名 +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OperatingSoldOutRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OperatingSoldOutRequest.java new file mode 100644 index 0000000..7e23e61 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OperatingSoldOutRequest.java @@ -0,0 +1,61 @@ +package org.dromara.zhishu.domain.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.zhishu.domain.vo.OperatingInventoryVo; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OperatingSoldOutRequest { + + /** + * 平台类型:1 拼多多 2-孔夫子 + */ + private Integer platformType; + + /** + * 日志类型:1-上架 2-下架 + */ + private Integer logType; + + /** + * 操作类型:1-发布任务 2-订单 + */ + private Integer operationType; + + /** + * 三方平台订单编号 + */ + private String orderSn; + + /** + * 平台店铺Id + */ + private Long mallId; + + /** + * 商品信息列表 + */ + private List goodsItems; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class GoodsItem { + + /** + * 平台商品Id + */ + private String platformId; + + /** + * 商品数量 + */ + private Integer count; + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderDeliveryKWRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderDeliveryKWRequest.java new file mode 100644 index 0000000..6a897b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderDeliveryKWRequest.java @@ -0,0 +1,33 @@ +package org.dromara.zhishu.domain.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrderDeliveryKWRequest { + + // 店铺ID + private Long shopId; + + // 订单ID + private Long orderId; + + // 配送方式ID + private String shippingId; + + // 配送公司 + private String shippingCom; + + // 运单号 + private String shipmentNum; + + // 自定义 + private String userDefined; + + // 多个运单号 + private String moreShipmentNum; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderListByShopIdRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderListByShopIdRequest.java new file mode 100644 index 0000000..ab07b26 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/OrderListByShopIdRequest.java @@ -0,0 +1,19 @@ +package org.dromara.zhishu.domain.dto.request; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrderListByShopIdRequest { + + private Long shopId; + + private List orderSnList; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/SoldOutRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/SoldOutRequest.java new file mode 100644 index 0000000..327db40 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/SoldOutRequest.java @@ -0,0 +1,16 @@ +package org.dromara.zhishu.domain.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SoldOutRequest { + + private String token; + + private String itemId; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateArtNoRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateArtNoRequest.java new file mode 100644 index 0000000..59809f0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateArtNoRequest.java @@ -0,0 +1,38 @@ +package org.dromara.zhishu.domain.dto.request; + + +public class UpdateArtNoRequest { + + // 店铺Id + private Long shopId; + + // 商品编号 + private Long productId; + + // 货号 + private String artNo; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public String getArtNo() { + return artNo; + } + + public void setArtNo(String artNo) { + this.artNo = artNo; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsDataPriceCSVRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsDataPriceCSVRequest.java new file mode 100644 index 0000000..66bf1e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsDataPriceCSVRequest.java @@ -0,0 +1,59 @@ +package org.dromara.zhishu.domain.dto.request; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +public class UpdateShopGoodsDataPriceCSVRequest { + + /** + * 平台店铺id + */ + @NotNull(message = "平台店铺id不能为空") + private Long mallId; + + /** + * 上架状态 + */ + private Integer isOnSale; + + /** + * 商品信息 + */ + @NotEmpty(message = "商品信息不能为空") + private List skuItemList; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class SkuItem{ + + /** + * 平台商品id + */ + @NotNull(message = "平台商品id不能为空") + private Long platformId; + + /** + * skuId + */ + private Long skuId; + + /** + * 单品价格 + */ + private Long singlePrice; + + /** + * 团购价格 + */ + private Long groupPrice; + + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsPriceRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsPriceRequest.java new file mode 100644 index 0000000..2a7e681 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateShopGoodsPriceRequest.java @@ -0,0 +1,52 @@ +package org.dromara.zhishu.domain.dto.request; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UpdateShopGoodsPriceRequest { + + /** + * 操作类型 0-下架 1.改价 + */ + private Integer type; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 商品信息 + */ + private List items; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Item { + + /** + * 平台商品id + */ + private Long platformId; + + /** + * 平台商品skuId + */ + private Long skuId; + + /** + * 价格(分) + */ + private String price; + + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateTokenRequest.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateTokenRequest.java new file mode 100644 index 0000000..09a15c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/request/UpdateTokenRequest.java @@ -0,0 +1,56 @@ +package org.dromara.zhishu.domain.dto.request; + +import java.util.Date; + +public class UpdateTokenRequest { + + private Long shopId; + + private String shopType; + + private String accessToken; + + private String refreshToken; + + private Date expirationTime; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopType() { + return shopType; + } + + public void setShopType(String shopType) { + this.shopType = shopType; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public Date getExpirationTime() { + return expirationTime; + } + + public void setExpirationTime(Date expirationTime) { + this.expirationTime = expirationTime; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/AddTaskLogResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/AddTaskLogResponse.java new file mode 100644 index 0000000..ca4c647 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/AddTaskLogResponse.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AddTaskLogResponse { + + private String elapsed; + + private String status; + + private String taskId; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/CalculatePriceByTemplateResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/CalculatePriceByTemplateResponse.java new file mode 100644 index 0000000..1c7d3e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/CalculatePriceByTemplateResponse.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CalculatePriceByTemplateResponse { + + /** + * 平台商品Id + */ + private String platformId; + + /** + * 计算前价格 + */ + private Long price; + + /** + * 计算后单品价格 + */ + private Long singlePrice; + + /** + * 计算后团购价格 + */ + private Long groupPrice; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpBaseShopPageGetResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpBaseShopPageGetResponse.java new file mode 100644 index 0000000..e830192 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpBaseShopPageGetResponse.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ErpBaseShopPageGetResponse { + + // 手机号 + private String cellphone; + + // 万里牛公司ID + private String comUid; + + // 联系人 + private String contacts; + + // 修改时间, 13位时间戳 + private String modifyTime; + + // 电话 + private String phone; + + // 万里牛店铺名称 + private String shopName; + + // 万里牛系统ID + private String shopNick; + + // 店铺类型 详情见接口(/base/shop/list/shopTypes) + private Integer shopType; + + // 万里牛系统UID + private String shopUid; + + // 店铺状态 0 停用 1 启用 + private Integer status; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpGoodsQueryOlnGoodsResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpGoodsQueryOlnGoodsResponse.java new file mode 100644 index 0000000..23a6d0e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/ErpGoodsQueryOlnGoodsResponse.java @@ -0,0 +1,81 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ErpGoodsQueryOlnGoodsResponse { + + // 总数 + private Integer total; + + // 是否存在下一页 + private Boolean next; + + // 分页号 + private Integer pageNo; + + // 分页大小 + private Integer pageSize; + + private List elements; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Element { + + // 线上商品ID + private String itemId; + + // 宝贝标题 + private String title; + + // 商家编码 + private String outerId; + + // 修改时间,13位时间戳 + private String modified; + + // 图片 + private String pic; + + // 链接地址 + private String url; + + // 宝贝状态 1:在售 0:已下架 + private Integer status; + + // 规格信息 + private List skus; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Sku { + + // 线上商品ID + private String itemId; + + // 规格名称 + private String name; + + // 商家规格编码 + private String outerId; + + // 图片 + private String pic; + + // 线上规格ID + private String skuId; + + } + + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetBookByISBNResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetBookByISBNResponse.java new file mode 100644 index 0000000..bbb8e67 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetBookByISBNResponse.java @@ -0,0 +1,106 @@ +package org.dromara.zhishu.domain.dto.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GetBookByISBNResponse { + + /** + * 错误信息 + */ + private String error; + + /** + * 数据 + */ + private BookItem data; + + /** + * 源 + */ + private String source; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class BookItem { + + /** + * 作者 + */ + private String author; + + /** + * 书名 + */ + @JsonProperty("book_name") + private String bookName; + + /** + * 官图 + */ + @JsonProperty("book_pic") + private String bookPic; + + /** + * 实拍图 + */ + @JsonProperty("book_pic_s") + private String bookPicS; + + /** + * bookSet + */ + @JsonProperty("book_set") + private Integer bookSet; + + /** + * buyCount + */ + @JsonProperty("buy_count") + private String buyCount; + + /** + * buyCounts + */ + @JsonProperty("buy_counts") + private Integer buyCounts; + + /** + * catId + */ + @JsonProperty("cat_id") + private Integer catId; + + /** + * 分类 + */ + @JsonProperty("category") + private String category; + + /** + * 内容 + */ + @JsonProperty("content") + private String content; + + /** + * 创建人 + */ + @JsonProperty("create_by") + private Long createBy; + + /** + * 创建时间(秒级) + */ + @JsonProperty("create_time") + private Long createTime; + + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetShopGoodsListResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetShopGoodsListResponse.java new file mode 100644 index 0000000..6bcf217 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetShopGoodsListResponse.java @@ -0,0 +1,437 @@ +package org.dromara.zhishu.domain.dto.response; + +import java.util.List; + +public class GetShopGoodsListResponse { + + private List list; + + // 每页最大条数 + private Integer pageSize; + + // 当前页码 + private Integer pageNum; + + // 总记录数 + private Integer total; + + // 总页数 + private Integer pages; + + // 当前页记录数 + private Integer size; + + public static class ShopGoods { + + // 商品添加时间戳 + private Long addTime; + + // 是否草稿。0:不是草稿;1:是草稿 + private Integer isDraft; + + // 折扣。取值10~100,50表示:5折,75表示:75折 + private Integer discount; + + // 年代对应编号 + private Long years; + + // 库存 + private Integer number; + + // 商品名称 + private String itemName; + + // 商品所在地对应编号 + private Long productArea; + + // 商品价格 + private Long price; + + // 店铺分类编号 + private Long myCatId; + + // 出版社 + private String press; + + // 出运费方。buyer:买家承担运费;seller:卖家包邮 + private String bearShipping; + + // 作者 + private String author; + + // 商品重量 + private Double weight; + + // 出版时间 + private String pubDate; + + // 品相。95表示:九五品 + private Integer quality; + + // 商品编号 + private Long itemId; + + // 分类编号 + private Long catId; + + // 店铺类型。1:书店;2:书摊 + private Integer bizType; + + // 审核状态。notCertified:待审核;certified:审核通过;frozen:冻结;failed:驳回;waitApproved:等待复审 + private String certifyStatus; + + // ISBN书号 + private String isbn; + + // 标准本数量 + private Integer weightPiece; + + // 运费模板编号 + private Long mouldId; + + // 关联图书库编号 + private Long booklibId; + + // 上下架状态 + private Integer isOnSale; + + // 删除状态 + private Integer isDelete; + + // 商品更新时间 + private String updateTime; + + // 商品下架时间戳 + private Long endSaleTime; + + // 卖家用户编号 + private Long userId; + + // 商品图片路径 + private String imgUrl; + + // 商品原价 + private Long oriPrice; + + // 商品货号 + private String itemSn; + + // 商品上架时间戳 + private Long beginSaleTime; + + // 是否全新图书 + private Integer isNewBook; + + public Long getAddTime() { + return addTime; + } + + public void setAddTime(Long addTime) { + this.addTime = addTime; + } + + public Integer getIsDraft() { + return isDraft; + } + + public void setIsDraft(Integer isDraft) { + this.isDraft = isDraft; + } + + public Integer getDiscount() { + return discount; + } + + public void setDiscount(Integer discount) { + this.discount = discount; + } + + public Long getYears() { + return years; + } + + public void setYears(Long years) { + this.years = years; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public Long getProductArea() { + return productArea; + } + + public void setProductArea(Long productArea) { + this.productArea = productArea; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getMyCatId() { + return myCatId; + } + + public void setMyCatId(Long myCatId) { + this.myCatId = myCatId; + } + + public String getPress() { + return press; + } + + public void setPress(String press) { + this.press = press; + } + + public String getBearShipping() { + return bearShipping; + } + + public void setBearShipping(String bearShipping) { + this.bearShipping = bearShipping; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public String getPubDate() { + return pubDate; + } + + public void setPubDate(String pubDate) { + this.pubDate = pubDate; + } + + public Integer getQuality() { + return quality; + } + + public void setQuality(Integer quality) { + this.quality = quality; + } + + public Long getItemId() { + return itemId; + } + + public void setItemId(Long itemId) { + this.itemId = itemId; + } + + public Long getCatId() { + return catId; + } + + public void setCatId(Long catId) { + this.catId = catId; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public String getCertifyStatus() { + return certifyStatus; + } + + public void setCertifyStatus(String certifyStatus) { + this.certifyStatus = certifyStatus; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public Integer getWeightPiece() { + return weightPiece; + } + + public void setWeightPiece(Integer weightPiece) { + this.weightPiece = weightPiece; + } + + public Long getMouldId() { + return mouldId; + } + + public void setMouldId(Long mouldId) { + this.mouldId = mouldId; + } + + public Long getBooklibId() { + return booklibId; + } + + public void setBooklibId(Long booklibId) { + this.booklibId = booklibId; + } + + public Integer getIsOnSale() { + return isOnSale; + } + + public void setIsOnSale(Integer isOnSale) { + this.isOnSale = isOnSale; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public Long getEndSaleTime() { + return endSaleTime; + } + + public void setEndSaleTime(Long endSaleTime) { + this.endSaleTime = endSaleTime; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getOriPrice() { + return oriPrice; + } + + public void setOriPrice(Long oriPrice) { + this.oriPrice = oriPrice; + } + + public String getItemSn() { + return itemSn; + } + + public void setItemSn(String itemSn) { + this.itemSn = itemSn; + } + + public Long getBeginSaleTime() { + return beginSaleTime; + } + + public void setBeginSaleTime(Long beginSaleTime) { + this.beginSaleTime = beginSaleTime; + } + + public Integer getIsNewBook() { + return isNewBook; + } + + public void setIsNewBook(Integer isNewBook) { + this.isNewBook = isNewBook; + } + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public Integer getPages() { + return pages; + } + + public void setPages(Integer pages) { + this.pages = pages; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetWlnShopListResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetWlnShopListResponse.java new file mode 100644 index 0000000..3bb7e5d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/GetWlnShopListResponse.java @@ -0,0 +1,19 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GetWlnShopListResponse { + + // 万里牛店铺名称 + public String shopName; + + + // 万里牛系统ID + public String shopNick; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/LogisticsMethodResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/LogisticsMethodResponse.java new file mode 100644 index 0000000..3f03053 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/LogisticsMethodResponse.java @@ -0,0 +1,23 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 物流方式 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LogisticsMethodResponse { + + // 物流方式Id + private String methodId; + + // 物流方式名称 + private String methodName; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/PddTokenResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/PddTokenResponse.java new file mode 100644 index 0000000..590ae92 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/PddTokenResponse.java @@ -0,0 +1,13 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.Data; + +@Data +public class PddTokenResponse { + private String accessToken; + private String pddMallId; + private String pddMallName; + private String skuSpec; + private String msg; + private String code; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/UpdateSkuPriceResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/UpdateSkuPriceResponse.java new file mode 100644 index 0000000..18e21dd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/UpdateSkuPriceResponse.java @@ -0,0 +1,22 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UpdateSkuPriceResponse { + + /** + * 平台商品Id + */ + private Long platformId; + + /** + * 信息 + */ + private String msg; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/WlnBaseResponse.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/WlnBaseResponse.java new file mode 100644 index 0000000..0331cb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/dto/response/WlnBaseResponse.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.domain.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WlnBaseResponse { + + private Integer code; + + private T data; + + private String message; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/AuthorPressVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/AuthorPressVo.java new file mode 100644 index 0000000..e5a3309 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/AuthorPressVo.java @@ -0,0 +1,9 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; + +@Data +public class AuthorPressVo { + private String author; // 作者 + private String press; // 出版社 +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BaseInfoPricingVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BaseInfoPricingVo.java new file mode 100644 index 0000000..1c96154 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BaseInfoPricingVo.java @@ -0,0 +1,37 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BaseInfoPricingVo implements Serializable { + /** + * 书名 + */ + private String bookName; + /** + * isbn + */ + private String isbn; + /** + * 价格 + */ + private String originalPrice; + /** + * 是否套装书 + */ + private Integer IsBookSet; + /** + * 出版社 + */ + private String publisher; + /** + * 作者 + */ + private String author; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditPriceVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditPriceVo.java new file mode 100644 index 0000000..62fdf90 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditPriceVo.java @@ -0,0 +1,36 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.persistence.ColumnResult; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BookEditPriceVo.class) +public class BookEditPriceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "商品ID(选填)") + @ColumnWidth(25) + private String trilateralId; + + @ExcelProperty(value = "商品编码(选填)") + @ColumnWidth(25) + private String goodsCode; + + @ExcelProperty(value = "ISBN(选填)") + @ColumnWidth(25) + private String isbn; + + @ExcelProperty(value = "价格(必填)") + @ColumnWidth(25) + private String price; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditStockVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditStockVo.java new file mode 100644 index 0000000..fa6b180 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookEditStockVo.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BookEditStockVo.class) +public class BookEditStockVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "商品ID(选填)") + @ColumnWidth(25) + private String trilateralId; + + @ExcelProperty(value = "商品编码(选填)") + @ColumnWidth(25) + private String goodsCode; + + @ExcelProperty(value = "ISBN(选填)") + @ColumnWidth(25) + private String isbn; + + @ExcelProperty(value = "库存(必填)") + private String stock; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookPic.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookPic.java new file mode 100644 index 0000000..0450b09 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookPic.java @@ -0,0 +1,29 @@ +package org.dromara.zhishu.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 书籍图片对象 + */ +@Data +public class BookPic { + + /** + * 本地路径 + */ + @JsonProperty("localPath") + private String localPath; + + /** + * 拼多多路径 + */ + @JsonProperty("pddPath") + private String pddPath; + + /** + * 拼多多响应路径 + */ + @JsonProperty("pddResponse") + private String pddResponse; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookVo.java new file mode 100644 index 0000000..f068076 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/BookVo.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.BookBaseInfo; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BookVo.class) +public class BookVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "书号(必填)") + private String bookNum; + + @ExcelProperty(value = "价格(必填)") + private String price; + + @ExcelProperty(value = "库存(必填)") + private String stock; + + @ExcelProperty(value = "商品编码") + private String code; + + @ExcelProperty(value = "书名") + private String bookName; + + @ExcelProperty(value = "规格编码") + private String artNo; + + @ExcelProperty(value = "商品图片") + private String bookImgUrl; + + private String logMsg; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DepotOrderVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DepotOrderVo.java new file mode 100644 index 0000000..dd78ba6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DepotOrderVo.java @@ -0,0 +1,448 @@ +package org.dromara.zhishu.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.dromara.zhishu.domain.DepotOrder; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 仓库订单信息视图对象 t_depot_order + * + * @author yxy + * @date 2025-06-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DepotOrder.class) +public class DepotOrderVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 店铺订单id + */ + @ExcelProperty(value = "店铺订单id") + private String shopOrderId; + + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private Long userId; + + private String userName; + + /** + * 商品信息 + */ + @ExcelProperty(value = "商品信息") + private String itemList; + + /** + * 仓库订单状态 0 待发货 1 已发货 2 无库存 3 转发任务 + */ + @ExcelProperty(value = "仓库订单状态 0 待发货 1 已发货 2 无库存 3 转发任务") + private String status; + + /** + * 创建者 + */ + @ExcelProperty(value = "创建者") + private Long createBy; + + private String createName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 查询总数 + */ + private String total; + + + /** + * 订单相关信息内容-------------------------- + */ + + /** + * 三方平台订单编号 + */ + private String orderSn; + + /** + * 订单来源类型 1-拼多多 2-孔夫子 + */ + private Integer orderSourceType; + + /** + * 订单异常类型集合(json字符串):inventoryException-库存异常 goodsSourceUnknownException-未知商品来源 + */ + private String orderExceptionType; + + /** + * 订单异常类型集合:inventoryException-库存异常 goodsSourceUnknownException-未知商品来源 + */ + private List orderExceptionTypeList; + + /** + * 店铺id + */ + private String shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 地址 + */ + private String address; + + /** + * 详细地址 + */ + private String addressMask; + + /** + * 售后状态 0:无售后 2:买家申请退款,待商家处理 3:退货退款,待商家处理 4:商家同意退款,退款中 5:平台同意退款,退款中 6:驳回退款,待买家处理 7:已同意退货退款,待用户发货 8:平台处理中 9:平台拒绝退款,退款关闭 10:退款成功 11:买家撤销 12:买家逾期未处理,退款失败 13:买家逾期,超过有效期 14:换货补寄待商家处理 15:换货补寄待用户处理 16:换货补寄成功 17:换货补寄失败 18:换货补寄待用户确认完成 21:待商家同意维修 22:待用户确认发货 24:维修关闭 25:维修成功 27:待用户确认收货 31:已同意拒收退款,待用户拒收 32:补寄待商家发货 33:同意召回后退款,待商家召回 + */ + private Integer afterSalesStatus; + + /** + * 买家留言信息 + */ + private String buyerMemo; + + /** + * 成交状态:0:未成交、1:已成交、2:已取消 + */ + private Integer confirmStatus; + + /** + * 成交时间 + */ + private String confirmTime; + + /** + * 订单创建时间 + */ + private String createdTime; + + /** + * 是否当日发货,1-是,0-否 + */ + private String deliveryOneDay; + + /** + * 折扣金额,单位:元,折扣金额=平台优惠+商家优惠+团长免单优惠金额 + */ + private BigDecimal discountAmount; + + /** + * 多多支付立减金额,单位:元 + */ + private BigDecimal duoDuoPayReduction; + + /** + * 是否多多批发 + */ + private Integer duoduoWholesale; + + /** + * 商品金额 + */ + private BigDecimal goodsAmount; + + /** + * 仓库编码 + */ + private String depotCode; + + /** + * 仓库编码 + */ + private String orderDepotInfo; + + /** + * 仓库id + */ + private String depotId; + + /** + * 支付申报订单号 + */ + private String depotName; + + /** + * 仓库类型,1:自有仓 2:订阅仓 两者都不是则传空 + */ + private Integer depotType; + + /** + * 货品id + */ + private Long wareId; + + /** + * 货品名称 + */ + private String wareName; + + /** + * 货品编码 + */ + private String wareSn; + + /** + * 货品类型(0:普通货品:1:组合货品) + */ + private Integer wareType; + + /** + * 订单状态 + */ + private Integer orderStatus; + + /** + * 支付金额 + */ + private BigDecimal payAmount; + + /** + * 支付单号 + */ + private String payNo; + + /** + * 支付时间 + */ + private String payTime; + + /** + * 支付方式 + */ + private String payType; + + /** + * 平台优惠金额 + */ + private BigDecimal platformDiscount; + + /** + * 邮费 + */ + private BigDecimal postage; + + /** + * 预售时间 + */ + private String preSaleTime; + + /** + * 承诺送达时间 + */ + private String promiseDeliveryTime; + + /** + * 确认收货时间 + */ + private String receiveTime; + + /** + * 省份 + */ + private String province; + + /** + * 省份编码 + */ + private String provinceId; + + /** + * 市 + */ + private String city; + + /** + * 市编码 + */ + private String cityId; + + /** + * 区,乡镇 + */ + private String town; + + /** + * 区县编码 + */ + private String townId; + + /** + * 收件人地址 + */ + private String receiverAddress; + + /** + * 收件人地址 + */ + private String receiverAddressMask; + + /** + * 收件人姓名 + */ + private String receiverName; + + /** + * 收件人姓名 + */ + private String receiverNameMask; + + /** + * 确认收货时间 + */ + private String receiverPhone; + + /** + * 收件人手机号(打码) + */ + private String receiverPhoneMask; + + /** + * 售后状态 + */ + private Integer refundStatus; + + /** + * 订单备注 + */ + private String remark; + + /** + * 1-红色,2-黄色,3-绿色,4-蓝色,5-紫色 + */ + private String remarkTag; + + /** + * 订单备注标记名称 + */ + private String remarkTagName; + + /** + * 退货包运费,1:是,0:否 + */ + private Integer returnFreightPayer; + + /** + * 订单审核状态(0-正常订单, 1-审核中订单) + */ + private Integer riskControlStatus; + + /** + * 是否门店自提 + */ + private Integer selfContained; + + /** + * 商家优惠金额 + */ + private BigDecimal sellerDiscount; + + /** + * 缺货处理状态 -1:无缺货处理 0: 缺货待处理 1缺货已处理 + */ + private Integer stockOutHandleStatus; + + /** + * 全国联保,1:是,0:否 + */ + private Integer supportNationwideWarranty; + + /** + * 快递单号 + */ + private String trackingNumber; + + /** + * 以旧换新国家补贴金额,单位:元 + */ + private BigDecimal tradeInNationalSubsidyAmount; + + /** + * 订单类型 0-普通订单 ,1- 定金订单 + */ + private Integer tradeType; + + /** + * 订单的更新时间 + */ + private String updatedAt; + + /** + * 催发货时间 + */ + private String urgeShippingTime; + + /** + * 预约配送日期 + */ + private String yypsDate; + + /** + * 预约配送时段 + */ + private String yypsTime; + + /** + * 合单ID2 + */ + private String openAddressId2; + + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 租户编码 + */ + @TableLogic + private String tenantId; + + + /** + * 商品列表 + */ + private List orderItemList; + + /** + * 额外附属信息 + */ + private String extraInfo; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DistrictsVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DistrictsVo.java new file mode 100644 index 0000000..3cbac29 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/DistrictsVo.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 地区响应体 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DistrictsVo { + + /** + * label:区划名称 + */ + private String label; + + /** + * value:区划名称 + */ + private String value; + + /** + * 区划ID + */ + private String id; + + /** + * 下级区划信息 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private List children; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeInfoVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeInfoVo.java new file mode 100644 index 0000000..aa5737b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeInfoVo.java @@ -0,0 +1,78 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 员工信息视图对象 employeeInfo + * + * @author Lion Li + * @date 2026-03-04 + */ +@Data +@ExcelIgnoreUnannotated +public class EmployeeInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 表主键 + */ + @ExcelProperty(value = "员工ID") + private Long id; + + /** + * 员工ID + */ + @ExcelProperty(value = "员工ID") + private String employeeId; + + /** + * 员工姓名 + */ + @ExcelProperty(value = "员工姓名") + private String name; + + /** + * 所属用户id + */ + @ExcelProperty(value = "所属用户id") + private Long userId; + + /** + * 工作波次 + */ + @ExcelProperty(value = "工作波次") + private String wave; + + /** + * 波次内工作数量 + */ + @ExcelProperty(value = "波次内工作数量") + private Integer count; + + /** + * 创建时间(秒级时间戳) + */ + @ExcelProperty(value = "创建时间") + private Long createdTime; + + /** + * 更新时间(秒级时间戳) + */ + @ExcelProperty(value = "更新时间") + private Long updatedTime; + + /** + * 删除标志 + */ + @ExcelProperty(value = "删除标志") + private Integer delFlag; + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeVo.java new file mode 100644 index 0000000..99a472b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/EmployeeVo.java @@ -0,0 +1,53 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.Employee; +import java.io.Serial; +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Employee.class) +public class EmployeeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 表主键(员工ID) + */ + private String id; + + /** + * 员工姓名 + */ + private String name; + + /** + * 所属用户id + */ + private Long userId; + + /** + * 创建时间 + */ + private Long creatTime; + + /** + * 更新时间 + */ + private Long updateTime; + + /** + * 删除标志 + */ + private Integer delFlag; + + /** + * 用户昵称 + */ + private String nickName; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ExcelTaskVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ExcelTaskVo.java new file mode 100644 index 0000000..4e2a056 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ExcelTaskVo.java @@ -0,0 +1,90 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.zhishu.domain.ExcelTask; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 任务列表视图对象 t_task_list + * + * @author yxy + * @date 2025-03-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ExcelTask.class) +public class ExcelTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 任务类型 1 发布商品 + */ + @ExcelProperty(value = "任务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_task_type") + private String taskType; + + /** + * 店铺id 字符串 + */ + @ExcelProperty(value = "仓库id") + private String depotIds; + + /** + * 文件名称 + */ + @ExcelProperty(value = "文件名称") + private String fileName; + + /** + * 执行数据条数 + */ + @ExcelProperty(value = "执行数据条数") + private Long dataNum; + + /** + * 任务状态 + */ + @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_task_status") + private String taskStatus; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 线程id + */ + private Long threadId; + + /** + * 用户id + */ + private Long userId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FastMailVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FastMailVo.java new file mode 100644 index 0000000..d48909f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FastMailVo.java @@ -0,0 +1,98 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.FastMail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 快递打单账号管理视图对象 t_fast_mail + * + * @author yxy + * @date 2025-06-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = FastMail.class) +public class FastMailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 类型 1 韵达 + */ + @ExcelProperty(value = "类型 1 韵达", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_device_type") + private String type; + + /** + * 账号 + */ + @ExcelProperty(value = "账号") + private String partnerId; + + /** + * 联调密码 + */ + @ExcelProperty(value = "联调密码") + private String secret; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updateTime; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 普通快递余额 + */ + private String commonRemainNum; + + /** + * 代付快递余额 + */ + private String codRemainNum; + + /** + * 面单类型 1 网点面单 2 拼多多面单 + */ + private String fastMailType; + + /** + * 备注 + */ + private String remark; + + private String createBy; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilesVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilesVo.java new file mode 100644 index 0000000..f012518 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilesVo.java @@ -0,0 +1,11 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; + +@Data +public class FilesVo { + private String bookName; + private String originalUrl; + private String url; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilterSetVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilterSetVo.java new file mode 100644 index 0000000..e6b5f3b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/FilterSetVo.java @@ -0,0 +1,84 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.FilterSet; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 过滤设置视图对象 t_filter_set + * + * @author yxy + * @date 2025-04-14 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = FilterSet.class) +public class FilterSetVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 过滤类型 + */ + @ExcelProperty(value = "过滤类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_filter_type") + private String filterType; + + /** + * 限制类型 + */ + @ExcelProperty(value = "限制类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_shop_set_up") + private String limitationType; + + /** + * 添加方式 + */ + @ExcelProperty(value = "添加方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_add_way") + private String addWay; + + /** + * 内容文件 + */ + @ExcelProperty(value = "内容文件") + private String addTxt; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + + /** + * 分类 + */ + private String sort; + + private Date createTime; + + /** + * 加入原因 + */ + private String reason; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsAutoFailVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsAutoFailVo.java new file mode 100644 index 0000000..856cef8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsAutoFailVo.java @@ -0,0 +1,90 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.GoodsAutoFail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自动发布失败视图对象 t_goods_auto_fail + * + * @author yxy + * @date 2025-09-29 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = GoodsAutoFail.class) +public class GoodsAutoFailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + private String shopName; + + /** + * 商品id + */ + private Long goodsId; + + private String goodsName; + + /** + * 商品isbn + */ + private String isbn; + + /** + * 货号 + */ + private String artNo; + + /** + * 日志 + */ + private String callBackData; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 价格 单位分 + */ + private Long price; + + /** + * 库存 + */ + private String inventory; + + /** + * 品相 + */ + private String conditionCode; + + /** + * 首费 单位元 + */ + private String firPrice; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsItemKfzVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsItemKfzVo.java new file mode 100644 index 0000000..884d31d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/GoodsItemKfzVo.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GoodsItemKfzVo { + + private Long itemId; // 商品编号 + + private String itemSn; // 商品货号 + + private Integer number; // 购买数量 + + private String itemName; // 商品名称 + + private String img; // 商品图片URL + + private Boolean isCancel; // 是否被取消 + + private Long orderId; // 所属订单编号 + + private String price; // 商品价格 + + private String favorableAmount; // 商品总优惠金额 + + private String setFavAmount; // 卖家设置优惠金额 + + private String couponFavAmount; // 优惠券优惠金额 + + private String realAmount; // 商品实付金额 + + private String cancelMan; // 取消者:unkown/seller/buyer + + private String quality; // 商品品相 + + private String isbn; // 图书ISBN + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/InviteCodeVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/InviteCodeVo.java new file mode 100644 index 0000000..3775daa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/InviteCodeVo.java @@ -0,0 +1,54 @@ +package org.dromara.zhishu.domain.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.util.Date; + +/** + * 邀请码视图对象 + */ +@Data +@NoArgsConstructor +@TableName("t_invite_codes") +public class InviteCodeVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 邀请人ID + */ + private Long userId; + + /** + * 邀请码 + */ + private String code; + + /** + * 邀请链接 + */ + private String inviteUrl; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 是否已使用 + */ + private Boolean used; + + /** + * 创建时间 + */ + private Date createdAt; + private String tenantId; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ItemListVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ItemListVo.java new file mode 100644 index 0000000..e43a69f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ItemListVo.java @@ -0,0 +1,29 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ItemListVo { + + private List orderItems; + + private List itemList; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ExceptionItem { + + private String orderExceptionType; + + private List orderItemIds; + + } + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/KongfzVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/KongfzVo.java new file mode 100644 index 0000000..a955c6a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/KongfzVo.java @@ -0,0 +1,29 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsBo; + +import java.math.BigDecimal; +@Data +public class KongfzVo extends ZhishuShopGoodsBo { + private static final long serialVersionUID = 1L; + private String id; + private String name; + private String barcode; + private Long price;//价格 + private String priceText; + private Long stock;//库存 + private String conditionCode;//品相 + private String warehouseCode; + private String imgUrl; + private String author; + private String press; + private String isbn; + private String shopName; + private String imgBigUrl; + private BigDecimal shippingFee; + //快递费 + private String shippingFeeText; + //品相 + private String qualityText; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/LogisticsVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/LogisticsVo.java new file mode 100644 index 0000000..80def45 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/LogisticsVo.java @@ -0,0 +1,111 @@ +package org.dromara.zhishu.domain.vo; + + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 物流模板对象 t_logistics + * + * @author ruoyi + * @date 2023-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_logistics") +public class LogisticsVo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *id + */ + @TableId(value = "id") + private Long id; + + /** + * 物流模板名称 + */ + private String templateName; + + /** + * 发货地-省 + */ + private String deliveryProvince; + + /** + * 发货地-市 + */ + private String deliveryCity; + + /** + * 发货地-区 + */ + private String deliveryArea; + + /** + * 发货地-详细地址 + */ + private String deliveryAddress; + + /** + * 计价方式(0按重量 1按标准本数(图书专用) 2按件数 3单独设置运费) + */ + private String pricingMethod; + + /** + * 运送方式(0快递 1自提) + */ + private String shipping; + + /** + * 首重 首本 首件 + */ + private Double firWbv; + + /** + * 首费 单位:元 + */ + private Double firPrice; + + /** + * 续重 续本 续件 + */ + private Double continueWbv; + + /** + * 续费 单位:元 + */ + private Double continuePrice; + + /** + * 模板状态(0正常 1停用) + */ + private String status; + + /** + * 租户编码 + */ + private String tenantId; + + /** + * 运送范围 + */ + private String shippingRange; + + /** + * 仓库ID + */ + private Long warehouseId; + /** + * 配送说明 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/NewUserVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/NewUserVo.java new file mode 100644 index 0000000..f0bb34f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/NewUserVo.java @@ -0,0 +1,66 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.NewUserInfo; + + +import java.io.Serial; +import java.io.Serializable; + + + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = NewUserInfo.class) +public class NewUserVo{ + /** + * + */ + private Long id; + + /** + * 企业名称 + */ + @ExcelProperty(value = "仓库id") + private String companyName; + + /** + * 企业类型 + */ + @ExcelProperty(value = "仓库id") + private String companyType ; + + /** + * 联系人名 + */ + @ExcelProperty(value = "仓库id") + private String contactPerson; + + /** + * 联系方式 + */ + @ExcelProperty(value = "仓库id") + private String contactPhone;; + + /** + * 邮箱 + */ + @ExcelProperty(value = "仓库id") + private String email; + + /** + * 营业执照 + */ + @ExcelProperty(value = "仓库id") + private String license; + + /** + * 备注 + */ + @ExcelProperty(value = "仓库id") + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OperatingInventoryVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OperatingInventoryVo.java new file mode 100644 index 0000000..d163cd9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OperatingInventoryVo.java @@ -0,0 +1,103 @@ +package org.dromara.zhishu.domain.vo; + +import java.util.List; + +/** + * 库存操作Vo + */ +public class OperatingInventoryVo { + + /** + * 操作类型 1:增加库存 2:减少库存 + */ + private Integer operationType; + + /** + * 店铺类型 1:拼多多 2:孔夫子 + */ + private Integer shopType; + + /** + * 三方平台订单编号 + */ + private String orderSn; + + /** + * 平台店铺Id + */ + private Long mallId; + + /** + * 商品信息列表 + */ + private List goodsItems; + + public static class GoodsItem { + + /** + * 平台商品Id + */ + private String platformId; + + /** + * 商品数量 + */ + private Integer count; + + public String getPlatformId() { + return platformId; + } + + public void setPlatformId(String platformId) { + this.platformId = platformId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + } + + public Integer getOperationType() { + return operationType; + } + + public void setOperationType(Integer operationType) { + this.operationType = operationType; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Long getMallId() { + return mallId; + } + + public void setMallId(Long mallId) { + this.mallId = mallId; + } + + public List getGoodsItems() { + return goodsItems; + } + + public void setGoodsItems(List goodsItems) { + this.goodsItems = goodsItems; + } + + public String getOrderSn() { + return orderSn; + } + + public void setOrderSn(String orderSn) { + this.orderSn = orderSn; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OrderItemVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OrderItemVo.java new file mode 100644 index 0000000..54f488a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/OrderItemVo.java @@ -0,0 +1,37 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrderItemVo { + + /** + * 商品名称 + */ + private String goodsName; + + /** + * 商品图片 + */ + private String goodsImg; + + /** + * 商品价格(元) + */ + private String goodsPrice; + + /** + * 商品数量 + */ + private String goodsCount; + + /** + * 货号 + */ + private String artNo; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PlatformIdUpdateVO.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PlatformIdUpdateVO.java new file mode 100644 index 0000000..28fe469 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PlatformIdUpdateVO.java @@ -0,0 +1,13 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PlatformIdUpdateVO { + private String oldPlatformId; + private String newPlatformId; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PriceTemplateVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PriceTemplateVo.java new file mode 100644 index 0000000..e450744 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PriceTemplateVo.java @@ -0,0 +1,84 @@ +package org.dromara.zhishu.domain.vo; + +import java.math.BigDecimal; +import org.dromara.zhishu.domain.PriceTemplate; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 价格模板视图对象 t_price_template + * + * @author yxy + * @date 2025-03-17 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PriceTemplate.class) +public class PriceTemplateVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 价格模板名称 + */ + @ExcelProperty(value = "价格模板名称") + private String templateName; + + /** + * 价格类型 0 书价 1 总价(书价+运费) + */ + private String priceType; + + /** + * 增加比例 + */ + @ExcelProperty(value = "增加比例") + private BigDecimal proportion; + + /** + * 增加金额 + */ + @ExcelProperty(value = "增加金额") + private BigDecimal addAmount; + + /** + * 价格模板状态(0正常 1停用) + */ + @ExcelProperty(value = "价格模板状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 价格区间最大值 + */ + private Integer highPrice; + /** + * 价格区间最小值 + */ + private Integer lowPrice; + + /** + * 价格参数 + */ + private String rangePrice; + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrintTemplateVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrintTemplateVo.java new file mode 100644 index 0000000..a590854 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrintTemplateVo.java @@ -0,0 +1,69 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.PrintTemplate; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 打印模板视图对象 t_print_template + * + * @author yxy + * @date 2026-03-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PrintTemplate.class) +public class PrintTemplateVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 快递类型 + */ + private String expressType; + + /** + * 模板名称 + */ + @ExcelProperty(value = "模板名称") + private String printTemplateName; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updateTime; + + /** + * 0正常 1停用 + */ + @ExcelProperty(value = "0正常 1停用") + private String status; + + /** + * 包裹信息json字符串 + */ + private String parcelInformation; + + /** + * 创建人 + */ + private String createBy; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrinterVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrinterVo.java new file mode 100644 index 0000000..3cdd64f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/PrinterVo.java @@ -0,0 +1,76 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.Printer; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 打印机设置视图对象 t_printer + * + * @author yxy + * @date 2026-03-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Printer.class) +public class PrinterVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 打印机类型 1 本地打印机 2 拼多多云打印机 + */ + private String printType; + + /** + * 拼多多云打印机共享码 + */ + private String shareCode; + + /** + * 打印机/云打印机编号 + */ + @ExcelProperty(value = "打印机") + private String printer; + + /** + * 打印机名称 + */ + @ExcelProperty(value = "打印机名称") + private String printerName; + + /** + * 是否启用全程打印 + */ + @ExcelProperty(value = "是否启用全程打印") + private String isRemotePrinting; + + /** + * 0正常 1停用 + */ + @ExcelProperty(value = "0正常 1停用") + private String status; + + /** + * 验证码 + */ + private String captcha; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductForm.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductForm.java new file mode 100644 index 0000000..d4309ea --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductForm.java @@ -0,0 +1,137 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; + +import java.io.File; +import java.io.Serial; +import java.io.Serializable; +import java.lang.reflect.Array; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.file.Files; +import java.util.List; + + +/** + * 商品信息视图对象 zhishu_shop_goods + * + * @author Lion Li + * @date 2025-03-07 + */ +@Data +public class ProductForm implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + //商品名称 + private String name; + // ISBN + private String barcode; + // 货号 + private String warehouseCode; + //商品定价 + private Long price; + //期初库存 + private Long stock; + //品相 + private String conditionCode; + //货号 + private String artNo; + //库存 + private Long inventory; + //仓库 + private String depotName; + //货架 + private String shelvesName; + //货位 + private String freightName; + //用户Id + private String userName; + //用户密码 + private String passWord; + // 出版时间 + private String publishTime; + /** + * 商品编号 + */ + private String itemNumber; + //租户ID + /** + * 图片 + */ + private List files; + /** + * 手机号 + */ + private String phoneNumber; + /** + * 固定价格 + */ + private Long fixPrice; + /** + * 备注 + */ + private String remark; + /** + * 货号最后一位 A B C D + */ + private String Series; + /** + * 图片 + */ + private String image; + /** + * 数量 + */ + private Long count; + /** + * 模板类型 + */ + private String templateType; + /** + * 作者 + */ + private String author; + /** + * 出版社 + */ + private String publisher; + /** + * 纸张 + */ + private String format; + /** + * 打印时间 + */ + private String printTime; + /** + * 字数 + */ + private String wordage; + /** + * 统一书号 + */ + private String goodUnifyIsbn; + + /** + * 操作人id + */ + private Long userId; + /** + * 分类ID + */ + private Long categoryId; + /** + * 在售数量 + */ + private Long sellCount; + /** + * 已售数量 + */ + private Long buyCount; + /** + * 孔网官图 + */ + private String kfzBookPic; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductSubmitResultVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductSubmitResultVo.java new file mode 100644 index 0000000..9cb5e19 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductSubmitResultVo.java @@ -0,0 +1,50 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 商品提交结果视图对象 + * + * @author system + * @date 2025-01-17 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProductSubmitResultVo { + + + /** + * 商品ID + */ + private String goodsId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 仓库ID + */ + private Long depotId; + + /** + * 货架ID + */ + private Long shelvesId; + + /** + * 运费模板ID + */ + private Long freightId; + + /** + * 货号 + */ + private String artNo; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductVo.java new file mode 100644 index 0000000..603487d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ProductVo.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsBo; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品信息视图对象 zhishu_shop_goods + * + * @author Lion Li + * @date 2025-03-07 + */ +@Data +public class ProductVo extends ZhishuShopGoodsBo { + + @Serial + private static final long serialVersionUID = 1L; + private String id; + private String name; + private String barcode; + private Long price;//价格 + private Long stock;//库存 + private String conditionCode;//品相 + private String warehouseCode; + private String imgUrl; + private String author; + private String press; + private String imgBigUrl; + //快递费 + private Long shippingFeeText; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningLogFileVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningLogFileVo.java new file mode 100644 index 0000000..0688d06 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningLogFileVo.java @@ -0,0 +1,69 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.RunningLogFile; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 程序运行日志表视图对象 t_running_log_file + * + * @author yxy + * @date 2025-06-12 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = RunningLogFile.class) +public class RunningLogFileVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 文件名称 + */ + @ExcelProperty(value = "文件名称") + private String fileName; + + /** + * 文件顺序 + */ + @ExcelProperty(value = "文件顺序") + private String fileOrder; + + /** + * 文件类型 + */ + @ExcelProperty(value = "文件类型") + private String fileType; + + /** + * 文件大小 + */ + @ExcelProperty(value = "文件大小") + private String fileSize; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningTaskNumVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningTaskNumVo.java new file mode 100644 index 0000000..eea477d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/RunningTaskNumVo.java @@ -0,0 +1,31 @@ +package org.dromara.zhishu.domain.vo; + + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +public class RunningTaskNumVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + private Long taskId; + + private Long shopId; + + private String shopName; + + private Integer allNum; + + private String status; + + private String msg; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopDetailVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopDetailVo.java new file mode 100644 index 0000000..0fe4d81 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopDetailVo.java @@ -0,0 +1,361 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.ShopDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 商品详情视图对象 t_shop_detail + * + * @author yxy + * @date 2025-03-13 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ShopDetail.class) +public class ShopDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 店铺id + */ + @ExcelProperty(value = "店铺id") + private Long shopId; + + /** + * 物流运费模板id + */ + @ExcelProperty(value = "物流运费模板id") + private Long templateId; + + /** + * 高价 + */ + @ExcelProperty(value = "高价") + private Long highPrice; + + /** + * 低价 + */ + @ExcelProperty(value = "低价") + private Long lowPrice; + + /** + * 销售模板id + */ + @ExcelProperty(value = "销售模板id") + private Long saleTemplateId; + + /** + * 是否开启7天无理由 0关闭 1开启 + */ + @ExcelProperty(value = "是否开启7天无理由 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String sevenDays; + + /** + * 是否开始二手 0关闭 1开启 + */ + @ExcelProperty(value = "是否开始二手 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String isSecondHand; + + /** + * 轮播数量开启 0关闭 1开启 + */ + @ExcelProperty(value = "轮播数量开启 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String carouselNum; + + /** + * 是否开启详情图 0关闭 1开启 + */ + @ExcelProperty(value = "是否开启详情图 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String isDetailsImg; + + /** + * 是否开启目录详情 0关闭 1开启 + */ + @ExcelProperty(value = "是否开启目录详情 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String isCatalogueDetails; + + /** + * 是否开启信息图片 0关闭 1开启 + */ + @ExcelProperty(value = "是否开启信息图片 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String isInformationImg; + + /** + * 标题前缀 + */ + @ExcelProperty(value = "标题前缀") + private String titlePrefix; + + /** + * 标题后缀 + */ + @ExcelProperty(value = "标题后缀") + private String titleSuffix; + + /** + * 标题过滤 + */ + @ExcelProperty(value = "标题过滤") + private String titleFilter; + + /** + * 货号前缀 + */ + @ExcelProperty(value = "货号前缀") + private String itemNumberPrefix; + + /** + * 标题组成 + */ + @ExcelProperty(value = "标题组成") + private String titleConsistOf; + + /** + * 间隔字符 0无间隔 1空格 + */ + @ExcelProperty(value = "间隔字符 0无间隔 1空格", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_space_character") + private String spaceCharacter; + + /** + * 是否开启自动截断 0关闭 1开启 + */ + @ExcelProperty(value = "是否开启自动截断 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String autoTruncation; + + /** + * 我的设置 + */ + @ExcelProperty(value = "我的设置") + private String mySetUp; + + /** + * 系统设置 + */ + @ExcelProperty(value = "系统设置") + private String systemSetUp; + + /** + * 过滤套装 0否 1是 + */ + @ExcelProperty(value = "过滤套装 0否 1是", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_yes_no") + private String filterSuit; + + /** + * 删除保护 0关闭 1开启 + */ + @ExcelProperty(value = "删除保护 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String isDelProtect; + + /** + * 下架保护 0关闭 1开启 + */ + @ExcelProperty(value = "下架保护 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String isRemoveProtect; + + /** + * 图书定价 0关闭 1开启 + */ + @ExcelProperty(value = "图书定价 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String bootPrice; + + /** + * 自有图片 0关闭 1开启 + */ + @ExcelProperty(value = "自有图片 0关闭 1开启", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_open_or_close") + private String ownPictures; + + /** + * 默认库存 + */ + @ExcelProperty(value = "默认库存") + private Long stockDeff; + + /** + * 两件折扣 + */ + @ExcelProperty(value = "两件折扣") + private Long twoDiscount; + + /** + * 是否预售 0非预售 1定时预售 2 时段预售 + */ + @ExcelProperty(value = "是否预售 0非预售 1定时预售 2 时段预售") + private String presale; + + /** + * 假一赔十 0 关闭 1开启 + */ + @ExcelProperty(value = "假一赔十 0 关闭 1开启") + private String fake; + + /** + * 发货时间 0 24小时 1 48小时 + */ + @ExcelProperty(value = "发货时间 0 24小时 1 48小时") + private String deliveryTime; + + /** + * 白底图 0关闭 1开启 + */ + @ExcelProperty(value = "白底图 0关闭 1开启") + private String whitePicture; + + /** + * 水印位置 0全部 1第一张 + */ + @ExcelProperty(value = "水印位置 0全部 1第一张") + private String watermarkPosition; + + /** + * 无图过滤 0关闭 1开启 + */ + @ExcelProperty(value = "无图过滤 0关闭 1开启") + private String filtering; + + /** + * 最低价定价 0关闭 1开启 + */ + @ExcelProperty(value = "最低价定价 0关闭 1开启") + private String lowerPrice; + + /** + * 最低定价折扣 + */ + @ExcelProperty(value = "最低定价折扣") + private String lowerPriceDiscount; + + /** + * 拼单模板id + */ + @ExcelProperty(value = "拼单模板id") + private Long spellTemplateId; + + /** + * 发布地区类型 + */ + private String districtType; + + /** + * 常驻地区id + */ + private String districtId; + + /** + * 默认品相 + */ + private Long conditionDef; + + /** + * 品相描述 + */ + private String conditionDes; + + /** + * 推荐语 + */ + private String recommend; + + /** + * 是否包邮 + */ + private String isParcel; + + /** + * 图书模板 + */ + private String bookTemplate; + + /** + * 图书重量 + */ + private BigDecimal bookWeight; + + /** + * 标准本数 + */ + private BigDecimal standardNumber; + + /** + * 开启 + */ + private String openRepeat; + + /** + * 是否自动上传 0 否 1 是 + */ + private String autoAdd; + + /** + * 是否开启咸鱼擦亮 + */ + private String openPolish; + + /** + * 商品详情 + */ + private String context; + + /** + * 擦亮方式 0擦亮原商品 1发布新商品 + */ + private String polishType; + + /** + * 闲鱼店铺发布品类 0 图书 1 其他 + */ + private String publishType; + + /** + * 闲鱼类目ID + */ + private String categoryId; + + /** + * 频率 + */ + private int frequency; + + /** + * 自动发布的仓库id列表 + */ + private List warehouseList; + + /** + * 进销存自动发布的仓库id列表 + */ + private List mappingList; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopGoodIsbnVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopGoodIsbnVo.java new file mode 100644 index 0000000..e8ea32f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopGoodIsbnVo.java @@ -0,0 +1,11 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; + +@Data +public class ShopGoodIsbnVo { + private Long id; + private String shopGoodsId; + private String goodIsbn; + private String goodUnifyIsbn; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopVo.java new file mode 100644 index 0000000..78854eb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopVo.java @@ -0,0 +1,200 @@ +package org.dromara.zhishu.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.zhishu.domain.Shop; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 店铺主表视图对象 t_shop + * + * @author yxy + * @date 2025-03-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Shop.class) +public class ShopVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 三方店铺id + */ + @ExcelProperty(value = "三方店铺id") + private Long mallId; + + /** + * 万里牛系统ID + */ + @ExcelProperty(value = "万里牛系统ID") + private String shopNike; + + /** + * 店铺类型 1 拼多多 + */ + @ExcelProperty(value = "店铺类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_shop_type") + private String shopType; + + /** + * 分组 + */ + @ExcelProperty(value = "分组") + private String shopGroup; + + /** + * 店铺名称 + */ + @ExcelProperty(value = "店铺名称") + private String shopName; + + /** + * 店铺名称(对应平台的店铺名称) + */ + @ExcelProperty(value = "三方名称") + private String shopAliasName; + + /** + * 是否授权 0未授权 1已授权 2已过期 + */ + @ExcelProperty(value = "是否授权", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_shop_authorize") + private String shopAuthorize; + + /** + * 到期时间 + */ + @ExcelProperty(value = "到期时间") + private Date expirationTime; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updateTime; + + /** + * 店铺key + */ + @ExcelProperty(value = "店铺key") + private String shopKey; + + /** + * token + */ + @ExcelProperty(value = "token") + private String token; + + /** + * 刷新token 的token + */ + @ExcelProperty(value = "refreshToken") + private String refreshToken; + + + /** + * 店铺状态(0正常 1停用) + */ + @ExcelProperty(value = "店铺状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 租户编码 + */ + @ExcelProperty(value = "租户编码") + private String tenant_id; + + /** + * 上次订单同步时间 + */ + @ExcelIgnore + private Long startUpdatedAt; + + /** + * 创建人 + */ + @ExcelIgnore + private Long createBy; + + /** + * 第三方平台账号 + */ + @ExcelProperty(value = "第三方平台账号") + private String account; + + /** + * 第三方平台密码 + */ + @ExcelProperty(value = "第三方平台密码") + private String password; + + /** + * 是否存在待同步商品文件 + */ + @ExcelIgnore + private Boolean hasSyncFile; + + private String autoAdd; + + /** + * 是否开启同步订单:默认0-否 1-是 + */ + private Integer isSynOrder; + + /** + * 服务版本 + */ + private String skuSpec; + + /** + * erp到期时间 + */ + private Date shopExpirationTime; + + /** + * erp是否到期 + */ + private String isExpiration; + + /** + * 咸鱼用的应用ID + */ + private String code; + + /** + * 拼多多试用版是否无上限 1 否 2 是 + */ + private String deregulation; + + /** + * 使用次数 + */ + private Long usageCount; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopWarehouseVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopWarehouseVo.java new file mode 100644 index 0000000..df76122 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ShopWarehouseVo.java @@ -0,0 +1,51 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.ShopWarehouse; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 店铺与仓库自动发布关联视图对象 t_shop_warehouse + * + * @author yxy + * @date 2025-12-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ShopWarehouse.class) +public class ShopWarehouseVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 店铺id + */ + @ExcelProperty(value = "店铺id") + private Long shopId; + + /** + * 用户id(仓库id) + */ + @ExcelProperty(value = "用户id", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "仓=库id") + private Long userId; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SpecVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SpecVo.java new file mode 100644 index 0000000..a5b9add --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SpecVo.java @@ -0,0 +1,111 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.Spec; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自定义规格设置视图对象 t_spec + * + * @author yxy + * @date 2025-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Spec.class) +public class SpecVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 店铺id + */ + @ExcelProperty(value = "店铺id") + private Long shopId; + + /** + * 规格类型id + */ + @ExcelProperty(value = "规格类型id") + private String specTypeId; + + /** + * 规格类型名称 + */ + @ExcelProperty(value = "规格类型名称") + private String specTypeName; + + /** + * 规格组成 0 自定义 1 ISBN 2 书名 3货号 + */ + @ExcelProperty(value = "规格组成 0 自定义 1 ISBN 2 书名 3货号") + private String specCompose; + + /** + * 自定义规格名称 + */ + @ExcelProperty(value = "自定义规格名称") + private String specName; + + /** + * 自定义规格前缀 + */ + @ExcelProperty(value = "自定义规格前缀") + private String specPrefix; + + /** + * 自定义规格后缀 + */ + @ExcelProperty(value = "自定义规格后缀") + private String specSuffix; + + /** + * 规格编码组成 0 自定义 1 ISBN 2 书名 3货号 + */ + @ExcelProperty(value = "规格编码组成 0 自定义 1 ISBN 2 书名 3货号") + private String specCodeCompose; + + /** + * 自定义规格编码前缀 + */ + @ExcelProperty(value = "自定义规格编码前缀") + private String specCodePrefix; + + /** + * 自定义规格编码后缀 + */ + @ExcelProperty(value = "自定义规格编码后缀") + private String specCodeSuffix; + + /** + * SKU水印图片路径 + */ + @ExcelProperty(value = "SKU水印图片路径") + private String specSyUrl; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StatisticVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StatisticVo.java new file mode 100644 index 0000000..dba5628 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StatisticVo.java @@ -0,0 +1,58 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.zhishu.domain.Spec; +import org.dromara.zhishu.domain.Statistic; + +import java.io.Serializable; + +/** + * 统计类 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Statistic.class) +public class StatisticVo implements Serializable { + + /** + * 库房数量 + */ + @ExcelProperty(value = "库房总数") + private Long warehousesNum; + + /** + * 货架数量 + */ + @ExcelProperty(value = "货架总数") + private Long shelvesNum; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "仓库名称") + private String warehousesName; + + /** + * 入库量 + */ + @ExcelProperty(value = "入库数量") + private Long inQuantity; + + /** + * 出库量 + */ + @ExcelProperty(value = "出库数量") + private Long outQuantity; + + /** + * 书籍种类 + */ + @ExcelProperty(value = "书籍分类") + private String bookCategory; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StockChangeLogVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StockChangeLogVo.java new file mode 100644 index 0000000..5e9f639 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/StockChangeLogVo.java @@ -0,0 +1,61 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 库存变更记录 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class StockChangeLogVo { + + /** + * 库存变更记录id + */ + private Long id; + + /** + * 商品id + */ + private Long shopGoodsId; + + /** + * 操作类型 类型 0-预留 1-手动修改 2-订单减扣 3-退单添加 4-小程序上书 + */ + private Integer type; + + /** + * 变更前库存 + */ + private Long beforeInv; + + /** + * 变更后库存 + */ + private Long afterInv; + + /** + * 相关id + */ + private String aboutId; + + /** + * 创建人 + */ + private Long createBy; + + + /** + * 用户名 + */ + private String userName; + + /** + * 创建时间 + */ + private String createTime; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SynchronizationShopLogVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SynchronizationShopLogVo.java new file mode 100644 index 0000000..253ce16 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/SynchronizationShopLogVo.java @@ -0,0 +1,98 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; + +/** + * 同步店铺商品库存日志视图对象 + * + * @author yxy + * @date 2026-04-14 + */ +@Data +public class SynchronizationShopLogVo { + + /** + * 主键ID + */ + private Long id; + + /** + * 商品id + */ + private Long goodsId; + + /** + * 商品的创建人 + */ + private Long goodsCreateBy; + + /** + * erp订单id + */ + private Long erpOrderId; + + /** + * 订单号 + */ + private String orderSn; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 店铺的创建人 + */ + private Long shopCreateBy; + + /** + * 更新后库存 + */ + private Integer inventory; + + /** + * 更新前库存 + */ + private Integer inventoryOld; + + /** + * 三方平台id + */ + private Long platformId; + + /** + * 状态码 200 成功 500 失败 + */ + private String code; + + /** + * 日志信息 + */ + private String msg; + + /** + * 创建时间 + */ + private Long createAt; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 修改人 + */ + private Long updateBy; + + /** + * 修改时间 + */ + private Long updateAt; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TAuditVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TAuditVo.java new file mode 100644 index 0000000..8552c64 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TAuditVo.java @@ -0,0 +1,145 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.TAudit; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 审核视图对象 t_audit + * + * @author Lion Li + * @date 2025-04-01 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TAudit.class) +public class TAuditVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户ID") + private Long userId; + + + /** + *用户昵称 + */ + @ExcelProperty(value = "用户昵称") + private String userName; + + /** + * 管理员ID + */ + @ExcelProperty(value = "管理员ID") + private Long adminId; + + /** + * 审核状态(0通过 1未通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "审核状态(0通过 1未通过)") + private String status; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String companyName; + + /** + * 企业类型 + */ + @ExcelProperty(value = "企业类型") + private String companyType ; + + /** + * 联系人名 + */ + @ExcelProperty(value = "联系人名") + private String contactPerson; + + /** + * 联系方式 + */ + @ExcelProperty(value = "联系方式") + private String contactPhone;; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + + /** + * 身份证图片 + */ + private String cardIdentity; + + + /** + * 营业执照名称 + */ + private String licenseName; + + /** + * 营业执照编号 + */ + private String licenseNumber; + + /** + * 营业执照 + */ + @ExcelProperty(value = "营业执照") + private String license; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 地址 + */ + private String adress; + + /** + * 经营许可证 + */ + private String businessLicense; + + /** + * 营业执照过期时间 + */ + private String licenseTime; + + + /** + * 经营许可证过期时间 + */ + private String businessLicenseTime; + + private Long auditId; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDepotVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDepotVo.java new file mode 100644 index 0000000..f259f1a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDepotVo.java @@ -0,0 +1,138 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.zhishu.domain.TDepot; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 仓库信息设置视图对象 t_depot + * + * @author Lion Li + * @date 2025-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TDepot.class) +public class TDepotVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 仓库id + */ + @ExcelProperty(value = "一级货区id") + private Long id; + + /** + * 仓库编号 + */ + @ExcelProperty(value = "货区编号") + private String code; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "一级货区名称") + private String name; + + /** + *单位 + */ +// @ExcelProperty(value = "货区单位") + private String unit; + + /** + * 仓库地址 + */ + @ExcelProperty(value = "货区地址") + private String address; + + /** + * 仓库管理员 + */ + @ExcelProperty(value = "货区管理员") + private String manager; + + + /** + * 仓库状态(0正常 1停用) + */ + @ExcelProperty(value = "货区状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 货架数量 + */ + @ExcelProperty(value = "二级货区数量") + private Long sheQuantityMax; + + + /** + * 已用数量 + */ + @ExcelProperty(value = "已用数量") + private Long sheNumber; + + /** + * 用户姓名 + */ + @ExcelProperty(value = "用户姓名") + private String userName; + + /** + * 用户id + */ +// @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 是否有下一级 + */ + private Boolean hasChildren; + + private Integer level; + + + /** + * 物流模版Id + */ + private Long templateId; + + /** + * 物流模版名称 + */ + private String templateName; + + /** + * 书品库存 + */ + private Long inventory; + + /** + * 书品类型数量 + */ + private Long categoryNumber; + /** + * userId + */ + private Long createBy; + + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDistrictVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDistrictVo.java new file mode 100644 index 0000000..dc4908b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TDistrictVo.java @@ -0,0 +1,63 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.TDistrict; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TDistrict.class) +public class TDistrictVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区划信息id + */ + @ExcelProperty(value = "区划信息id") + private Long id; + + /** + * 父级挂接id + */ + @ExcelProperty(value = "父级挂接id") + private Long pid; + + /** + * 区划编码 + */ + @ExcelProperty(value = "区划编码") + private String code; + + /** + * 区划名称 + */ + @ExcelProperty(value = "区划名称") + private String name; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 状态 0 正常 -2 删除 -1 停用 + */ + @ExcelProperty(value = "状态 0 正常 -2 删除 -1 停用") + private Long status; + + /** + * 级次id 0:省/自治区/直辖市 1:市级 2:县级 + */ + @ExcelProperty(value = "级次id 0:省/自治区/直辖市 1:市级 2:县级") + private Long level; + + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TInviteRelationsVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TInviteRelationsVo.java new file mode 100644 index 0000000..c8c2a10 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TInviteRelationsVo.java @@ -0,0 +1,64 @@ +package org.dromara.zhishu.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.TInviteRelations; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 【请填写功能名称】视图对象 t_invite_relations + * + * @author Lion Li + * @date 2025-12-16 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TInviteRelations.class) +public class TInviteRelationsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 邀请人ID + */ + @ExcelProperty(value = "邀请人ID") + private Long inviterId; + + /** + * 被邀请人ID + */ + @ExcelProperty(value = "被邀请人ID") + private Long inviteeId; + + /** + * 使用的邀请码 + */ + @ExcelProperty(value = "使用的邀请码") + private String inviteCode; + + /** + * 邀请时间 + */ + @ExcelProperty(value = "邀请时间") + private Date inviteTime; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TLogisticsVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TLogisticsVo.java new file mode 100644 index 0000000..2fed5b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TLogisticsVo.java @@ -0,0 +1,141 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.TLogistics; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 物流管理视图对象 t_logistics + * + * @author Lion Li + * @date 2025-04-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TLogistics.class) +public class TLogisticsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 物流模板名称 + */ + @ExcelProperty(value = "物流模板名称") + private String templateName; + + /** + * 发货地-省 + */ +// @ExcelProperty(value = "发货地-省") + private String deliveryProvince; + + /** + * 发货地-市 + */ +// @ExcelProperty(value = "发货地-市") + private String deliveryCity; + + /** + * 发货地-区 + */ +// @ExcelProperty(value = "发货地-区") + private String deliveryArea; + + /** + * 详细地址 + */ + @ExcelProperty(value = "详细地址") + private String deliveryAddress; + + /** + * 计价方式(0按重量 1按标准本数(图书专用) 2按件数 3单独设置运费) + */ + @ExcelProperty(value = "计价方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=按重量,1=按标准本数(图书专用),2=按件数,3=单独设置运费") + private String pricingMethod; + + /** + * 运送方式(0快递 物流) + */ + @ExcelProperty(value = "运送方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=快递,1=物流") + private String shipping; + + /** + * 首重 首本 首件 + */ +// @ExcelProperty(value = "首重 首本 首件") + private Long firWbv; + + /** + * 首费 单位:元 + */ +// @ExcelProperty(value = "首费 单位:元") + private Long firPrice; + + /** + * 续重 续本 续件 + */ +// @ExcelProperty(value = "续重 续本 续件") + private Long continueWbv; + + /** + * 续费 单位:元 + */ +// @ExcelProperty(value = "续费 单位:元") + private Long continuePrice; + + /** + * 模板状态(0正常 1停用) + */ + @ExcelProperty(value = "模板状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 运送范围 + */ +// @ExcelProperty(value = "运送范围") + private String shippingRange; + + /** + * 仓库ID + */ +// @ExcelProperty(value = "仓库ID") + private Long warehouseId; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "仓库名称") + private String warehouseName; + /** + * 联系人 + */ + private String contact; + + /** + * 联系电话 + */ + private String phoneNumber; + /** + * 详细地址 + */ + private String fullAddress; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShelvesVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShelvesVo.java new file mode 100644 index 0000000..1d1394b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShelvesVo.java @@ -0,0 +1,101 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.zhishu.domain.TShelves; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 货架信息视图对象 t_shelves + * + * @author Lion Li + * @date 2025-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TShelves.class) +public class TShelvesVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 货架id + */ + @ExcelProperty(value = "二级货区id") + private Long id; + + /** + * 货架名称 + */ + @ExcelProperty(value = "货区名称") + private String name; + + /** + * 货架单位 + */ +// @ExcelProperty(value = "货区单位") + private String unit; + + + /** + * 货架层数 + */ +// @ExcelProperty(value = "货架层数") + private Long sheCapMax; + + /** + * 货架状态(0正常 1停用) + */ + @ExcelProperty(value = "货区状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 货架编码 + */ + @ExcelProperty(value = "货区编码") + private String code; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "一级货区名称") + private String depotName; + + private String depotId; + + /** + * 已用数量 + */ + private Long sheNumber; + + /** + * 一级+二级货区编号 + */ + private String twosCode; + + /** + * 是否有下一级 + */ + private Boolean hasChildren; + + private Integer level; + + /** + * 书品库存总数 + */ + private Long inventory; + /** + * 书品分类数量 + */ + private Long categoryNumber; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopDepotAotuVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopDepotAotuVo.java new file mode 100644 index 0000000..c3438bd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopDepotAotuVo.java @@ -0,0 +1,41 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 店铺自动发布仓库关联视图对象 + */ +@Data +public class TShopDepotAotuVo { + + /** + * 主键 + */ + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 仓库id + */ + private Long depotId; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 仓库名称(名称 + 单位) + */ + private String depotName; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopMessageSubscribeVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopMessageSubscribeVo.java new file mode 100644 index 0000000..7bb9400 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopMessageSubscribeVo.java @@ -0,0 +1,55 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Data; + +import java.util.Date; + +@Data +public class TShopMessageSubscribeVo { + + /** + * 主键Id + */ + private Long id; + + /** + * 店铺Id + */ + private Long shopId; + + /** + * 订阅详情(json字符串) + */ + private String subscribeDetail; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 删除标志(0代表存在 1代表删除) + */ + private String delFlag; + + /** + * 租户编号 + */ + private String tenantId; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopOrderDetailVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopOrderDetailVo.java new file mode 100644 index 0000000..f598bf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TShopOrderDetailVo.java @@ -0,0 +1,117 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.TShopOrderDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 订单详情视图对象 t_shop_order_detail + * + * @author Lion Li + * @date 2025-03-13 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TShopOrderDetail.class) +public class TShopOrderDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 店铺id + */ + @ExcelProperty(value = "店铺id") + private String shopId; + + /** + * 店铺名称 + */ + @ExcelProperty(value = "店铺名称") + private String shopName; + + /** + * 订单id + */ + @ExcelProperty(value = "订单id") + private String orderId; + + /** + * 商品数量 + */ + @ExcelProperty(value = "商品数量") + private Long goodsCount; + + /** + * 商品编码 + */ + @ExcelProperty(value = "商品编码") + private String goodsId; + + /** + * 商品图片 + */ + @ExcelProperty(value = "商品图片") + private String goodsImg; + + /** + * 商品名称 + */ + @ExcelProperty(value = "商品名称") + private String goodsName; + + /** + * 商品单件 单价:元 + */ + @ExcelProperty(value = "商品单件 单价:元") + private String goodsPrice; + + /** + * 商品规格 + */ + @ExcelProperty(value = "商品规格") + private String goodsSpec; + + /** + * 商品维度外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息 + */ + @ExcelProperty(value = "商品维度外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息") + private String outerGoodsId; + + /** + * sku维度商家外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息 + */ + @ExcelProperty(value = "sku维度商家外部编码,注意:编辑商品后必须等待商品审核通过后方可生效,订单中商品信息为交易快照的商品信息") + private String outerId; + + /** + * 商品sku编码 + */ + @ExcelProperty(value = "商品sku编码") + private String skuId; + + /** + * 店铺状态(0正常 1停用) + */ + @ExcelProperty(value = "店铺状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskUrlVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskUrlVo.java new file mode 100644 index 0000000..35569af --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskUrlVo.java @@ -0,0 +1,37 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * 解密返回的数据 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskUrlVo { + /** + * 任务id + */ + private String taskid; + /** + * 解密后的链接 + */ + private String qureyApiUrl; + + /** + * 数据总数 + */ + private String total; + + + /** + * 店铺列表json字符串 + */ + private List shopListJson; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskVo.java new file mode 100644 index 0000000..5e5b0bf --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/TaskVo.java @@ -0,0 +1,114 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.zhishu.domain.Task; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 任务列表视图对象 t_task + * + * @author yxy + * @date 2025-03-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Task.class) +public class TaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 任务类型 1 发布商品;SYNC_GOODS_KFZ 同步商品-孔夫子;UPDATE_GOODS_PRICE改价商品任务; + * GET_SHOP_GOODS 拉取商品任务;EDIT_ISONSALE_GOODS 上下架商品任务; + * EDIT_STOCK_GOODS 更新库存任务;DELETE_SHOP_GOODS 定时删除商品任务; + */ + @ExcelProperty(value = "任务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_task_type") + private String taskType; + + /** + * 店铺id 字符串 + */ + @ExcelProperty(value = "店铺id") + private String shopIds; + + @ExcelProperty(value = "店铺名称") + private String shopNames; + + /** + * 文件名称 + */ + @ExcelProperty(value = "文件名称") + private String fileName; + + /** + * 执行数据条数 + */ + @ExcelProperty(value = "执行数据条数") + private Long dataNum; + + /** + * 任务状态 + */ + @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_task_status") + private String taskStatus; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 线程id + */ + private String threadId; + + /** + * 是否存在待同步商品文件 + */ + @ExcelIgnore + private Boolean hasSyncFile; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 消息 + */ + private String msg; + + private int successCount; + + private int waitCount; + + private int pauseCount; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/UserRechargeVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/UserRechargeVo.java new file mode 100644 index 0000000..b6ed057 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/UserRechargeVo.java @@ -0,0 +1,110 @@ +package org.dromara.zhishu.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.zhishu.domain.UserRecharge; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 用户充值视图对象 t_user_recharge + * + * @author yxy + * @date 2025-04-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserRecharge.class) +public class UserRechargeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 充值类型 1 微信支付 2 支付宝支付 ... + */ + @ExcelProperty(value = "充值类型 1 微信支付 2 支付宝支付 ...") + private String rechargType; + + /** + * 充值金额 单位分 + */ + @ExcelProperty(value = "充值金额 单位分") + private Long rechargPrice; + + /** + * 支付成功时间 + */ + @ExcelProperty(value = "支付成功时间") + private Date successTime; + + /** + * 支付成功后回调方法中数据字符串 + */ + @ExcelProperty(value = "支付成功后回调方法中数据字符串") + private String allDataStr; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + + /** + * 手续费 + */ + @ExcelProperty(value = "手续费") + private BigDecimal commission; + + /** + * 是否充值到余额中 + */ + private String isBalance; + + private Date createTime; + /** + * 创建人 + */ + private String createBy; + + /** + * 日志备注 + */ + private String logTxt; + + + /** + * 原始金额 + */ + private BigDecimal originalPrice; + + /** + * 更新金额 + */ + private BigDecimal updatePrice; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ViolationVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ViolationVo.java new file mode 100644 index 0000000..cf89c8e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ViolationVo.java @@ -0,0 +1,83 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.Violation; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 违规视图对象 t_violation + * + * @author yxy + * @date 2025-06-23 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Violation.class) +public class ViolationVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 类型 0 isbn 1 书名 2 作者 3 出版社 + */ + @ExcelProperty(value = "类型 0 isbn 1 书名 2 作者 3 出版社", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "t_violation_type") + private String type; + + /** + * 违规原因 + */ + @ExcelProperty(value = "违规原因") + private String content; + + /** + * 发起人 + */ + @ExcelProperty(value = "发起人") + private Long userid; + + /** + * 是否审核 0 未审核 1 已审核 + */ + @ExcelProperty(value = "是否审核 0 未审核 1 已审核") + private String review; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 审核意见 + */ + private String remark; + + /** + * 违规内容 + */ + private String name; + + /** + * 分类 + */ + private String sort; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveDetailVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveDetailVo.java new file mode 100644 index 0000000..3897d7a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveDetailVo.java @@ -0,0 +1,80 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.WaveDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 波次信息视图对象 wave_detail + * + * @author Lion Li + * @date 2026-01-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WaveDetail.class) +public class WaveDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 波次ID + */ + @ExcelProperty(value = "波次ID") + private Long waveId; + + /** + * ISBN + */ + @ExcelProperty(value = "ISBN") + private String isbn; + + /** + * 仓储ID + */ + @ExcelProperty(value = "仓储ID") + private Long stockId; + + /** + * 仓储编号 + */ + @ExcelProperty(value = "仓储编号") + private String stockNum; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Long createdTime; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Long updatedTime; + + /** + * 是否已删除 + */ + @ExcelProperty(value = "是否已删除") + private Long isDel; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveVo.java new file mode 100644 index 0000000..0da70bb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WaveVo.java @@ -0,0 +1,80 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.Wave; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 波次视图对象 wave + * + * @author Lion Li + * @date 2026-01-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Wave.class) +public class WaveVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private String id; + + /** + * 人员ID + */ + @ExcelProperty(value = "人员ID") + private String staffId; + + /** + * 人员姓名 + */ + @ExcelProperty(value = "人员姓名") + private String staffName; + + /** + * 数量 + */ + @ExcelProperty(value = "数量") + private Long count; + + /** + * 是否支付 + */ + @ExcelProperty(value = "是否支付") + private Long isPay; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Long createdTime; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Long updatedTime; + + /** + * 是否删除 + */ + @ExcelProperty(value = "是否删除") + private Long isDel; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WhiteListVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WhiteListVo.java new file mode 100644 index 0000000..2e390aa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/WhiteListVo.java @@ -0,0 +1,51 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.WhiteList; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 白名单视图对象 t_white_list + * + * @author yxy + * @date 2025-06-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = WhiteList.class) +public class WhiteListVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * ip + */ + @ExcelProperty(value = "ip") + private String ip; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/XyCategoryVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/XyCategoryVo.java new file mode 100644 index 0000000..0086f1d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/XyCategoryVo.java @@ -0,0 +1,32 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.zhishu.domain.XyCategory; + +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = XyCategory.class) +public class XyCategoryVo implements Serializable { + /** + * 行业 + */ + @ExcelProperty(value = "行业") + private String industry; + + /** + * 类目 + */ + @ExcelProperty(value = "类目") + private String category; + + /** + * id + */ + @ExcelProperty(value = "id") + private String id; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsDetailVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsDetailVo.java new file mode 100644 index 0000000..8d5ec43 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsDetailVo.java @@ -0,0 +1,87 @@ +package org.dromara.zhishu.domain.vo; + +import org.dromara.zhishu.domain.ZhishuShopGoodsDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商品信息补全表视图对象 zhishu_shop_goods_detail + * + * @author yxy + * @date 2025-06-13 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ZhishuShopGoodsDetail.class) +public class ZhishuShopGoodsDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商品id + */ + @ExcelProperty(value = "商品id") + private Long pid; + + /** + * 作者 + */ + @ExcelProperty(value = "作者") + private String author; + + /** + * 出版社 + */ + @ExcelProperty(value = "出版社") + private String publisher; + + /** + * 出版时间 + */ + @ExcelProperty(value = "出版时间") + private String publishertime; + + /** + * 开本 + */ + @ExcelProperty(value = "开本") + private String format; + + /** + * 字数 + */ + @ExcelProperty(value = "字数") + private String wordage; + + /** + * 统一书号 + */ + @ExcelProperty(value = "统一书号") + private String unifiedisbn; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsVo.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsVo.java new file mode 100644 index 0000000..3e8a4f6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/ZhishuShopGoodsVo.java @@ -0,0 +1,224 @@ +package org.dromara.zhishu.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.persistence.Column; +import lombok.Data; +import org.dromara.zhishu.domain.ZhishuShopGoods; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 商品信息视图对象 zhishu_shop_goods + * + * @author Lion Li + * @date 2025-03-07 + */ + +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ZhishuShopGoods.class) +public class ZhishuShopGoodsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private String id; + + /** + * 是否加入分销:1-否 2-是 + */ + @ExcelProperty(value = "isJoinDistribution") + private Integer isJoinDistribution; + + /** + * 用户Id + */ + @ExcelIgnore + private Long userId; + + /** + * 用户电话号码(打码) + */ + @ExcelIgnore + private String phoneNumberMark; + + /** + * 仓库编号 + */ + @ExcelIgnore + private Long depotId; + + /** + * 仓库名称 + */ + @ExcelIgnore + private String depotName; + + /** + * 物流模板Id + */ + @ExcelIgnore + private Long templateId; + + /** + * 物流模板名称 + */ + @ExcelIgnore + private String templateName; + + /** + * 物流模板详细地址 + */ + @ExcelIgnore + private String deliveryAddress; + + /** + * 寄件方式 + */ + @ExcelIgnore + private String pricingMethod; + + /** + * 模板最优惠价格 + */ + @ExcelIgnore + private BigDecimal templateMinPrice; + + /** + * 商品定价 + */ + @ExcelIgnore + private Long fixPrice; + + /** + * 商品名称 + */ + @ExcelProperty(value = "商品名称") + private String goodsName; + + /** + * 商品编码 + */ + @ExcelProperty(value = "产品编码") + private String productId; + /** + * 商品编码 + */ + @ExcelProperty(value = "商品编号") + private String itemNumber; + /** + * isbn + */ + @ExcelProperty(value = "isbn") + private String isbn; + + /** + * 货号 + */ + @ExcelProperty(value = "货号") + private String artNo; + + /** + * 原始货号 + */ + @ExcelProperty(value = "原始货号") + private String originalArtNo; + + /** + * 期初库存 + */ + @ExcelIgnore + private Long stock; + + /** + * 标准售价 + */ + @ExcelProperty(value = "标准售价") + private BigDecimal price; + + /** + * 品相 + */ + @ExcelProperty(value = "品相") + private String conditionCode; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 状态 + */ + + @ExcelProperty(value = "库存") + private String inventory; + + /** + * 扣减库存 + */ + private String updateInventory; + /** + * 是否已进行货号转换:0-否,1-是 + */ + @ExcelIgnore + private Integer isArtNoConversion; + + /** + * 图片 + */ + @ExcelIgnore + private String bookPic; + /** + * 图片路径 + */ + @ExcelIgnore + private String path; + + /** + * 入库时间 + */ + private Date createTime; + + /** + * 拼多多发布状态(0未发布,1已发布) + */ + private Long pddPublishedStatus; + + /** + * 孔夫子发布状态(0未发布,1已发布) + */ + private Long kfzPublishedStatus; + /** + * 闲鱼发布状态(0未发布,1已发布) + */ + private Long xyPublishedStatus; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + + /** + * 自营书品仓库名称 + */ + private String warehouseName; +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/updateOcrResult.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/updateOcrResult.java new file mode 100644 index 0000000..562f6e2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/domain/vo/updateOcrResult.java @@ -0,0 +1,26 @@ +package org.dromara.zhishu.domain.vo; + +import lombok.Builder; +import lombok.Data; + +/** + * 图片上传返回体 + * + * @author Lion Li + */ +@Data +public class updateOcrResult { + +// 文件路径 + private String url; +// 提示信息 + private String message; +// 营业执照名称 + private String name; +// 营业执照注册号 + private String regNum; +// 过期时间 + private String period; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/IsJoinDistributionEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/IsJoinDistributionEnum.java new file mode 100644 index 0000000..4fa3af8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/IsJoinDistributionEnum.java @@ -0,0 +1,45 @@ +package org.dromara.zhishu.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@AllArgsConstructor +public enum IsJoinDistributionEnum { + + YES(1, "是"), + + NO(0, "否"); + + /** + * code + */ + private final Integer code; + + /** + * message + */ + private final String msg; + + public static List getIsJoinDistributionEnumList() { + List isJoinDistributionEnumList = new ArrayList<>(); + for (IsJoinDistributionEnum item : values()) { + isJoinDistributionEnumList.add(item.getCode()); + } + return isJoinDistributionEnumList; + } + + public static IsJoinDistributionEnum valueOfCode(Integer code) { + for (IsJoinDistributionEnum type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + throw new ServiceException("未知操作库存类型code: " + code); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OperationInventoryTypeEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OperationInventoryTypeEnum.java new file mode 100644 index 0000000..1a8571b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OperationInventoryTypeEnum.java @@ -0,0 +1,48 @@ +package org.dromara.zhishu.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; + +import java.util.ArrayList; +import java.util.List; + +/** + * 操作库存类型枚举 + */ +@Getter +@AllArgsConstructor +public enum OperationInventoryTypeEnum { + + INCREASE_INVENTORY(1, "增加库存"), + + REDUCE_INVENTORY(2, "减少库存"); + + /** + * code + */ + private final Integer code; + + /** + * message + */ + private final String msg; + + public static List getOperationInventoryTypeEnumList() { + List operationInventoryTypeEnumList = new ArrayList<>(); + for (OperationInventoryTypeEnum item : values()) { + operationInventoryTypeEnumList.add(item.getCode()); + } + return operationInventoryTypeEnumList; + } + + public static OperationInventoryTypeEnum valueOfCode(int code) { + for (OperationInventoryTypeEnum type : values()) { + if (type.getCode() == code) { + return type; + } + } + throw new ServiceException("未知操作库存类型code: " + code); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OrderSourceTypeEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OrderSourceTypeEnum.java new file mode 100644 index 0000000..7dd126c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/OrderSourceTypeEnum.java @@ -0,0 +1,48 @@ +package org.dromara.zhishu.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; + +import java.util.ArrayList; +import java.util.List; + +/** + * 订单来源类型枚举 + */ +@Getter +@AllArgsConstructor +public enum OrderSourceTypeEnum { + + PDD(1, "拼多多"), + + KFZ(2, "孔夫子"); + + /** + * code + */ + private final Integer code; + + /** + * message + */ + private final String msg; + + public static List getOrderSourceTypeEnumList() { + List orderSourceTypeEnumList = new ArrayList<>(); + for (OrderSourceTypeEnum item : values()) { + orderSourceTypeEnumList.add(item.getCode()); + } + return orderSourceTypeEnumList; + } + + public static OrderSourceTypeEnum valueOfCode(Integer code) { + for (OrderSourceTypeEnum type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + throw new ServiceException("未知操作库存类型code: " + code); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderDetailEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderDetailEnum.java new file mode 100644 index 0000000..4e5b8c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderDetailEnum.java @@ -0,0 +1,26 @@ +package org.dromara.zhishu.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PddOrderDetailEnum { + + GOODS_COUNT("goods_count", "商品数量"), + GOODS_IMG("goods_img", "商品图片"), + GOODS_NAME("goods_name", "商品名称"), + GOODS_PRICE("goods_price", "价格"), + GOODS_SPEC("goods_spec", "商品规格"), + OUTER_GOODS_ID("outer_goods_id", "预约配送时段"), + OUTER_ID("outer_id", "商品维度外部编码"), + SKU_ID("sku_id", "sku维度商家外部编码"), + GOODS_ID("goods_id", "商品编码"); + + + + private final String code; + private final String name; + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderEnum.java new file mode 100644 index 0000000..a4f9447 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/PddOrderEnum.java @@ -0,0 +1,100 @@ +package org.dromara.zhishu.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/* + 拼多多订单装换枚举 + */ + +@Getter +@AllArgsConstructor + +public enum PddOrderEnum { + + ADDRESS("address", "详细地址"), + ADDRESS_MASK("address_mask", "详细地址"), + AFTER_SALES_STATUS("after_sales_status", "售后状态"), + BONDED_WAREHOUSE("bonded_warehouse", "保税仓名称"), + BUYER_MEMO("buyer_memo", "买家留言信息"), + CITY("city", "城市"), + CONFIRM_STATUS("confirm_status", "成交状态"), + CONFIRM_TIME("confirm_time", "成交时间"), + CONSOLIDATE_INFO("consolidate_info", "集运信息"), + COUNTRY("country", "国家"), + COUNTRY_ID("country_id", "国家或地区编码"), + CREATED_TIME("created_time", "订单创建时间"), + DELIVERY_HOME_VALUE("delivery_home_value", "详细地址"), + DELIVERY_INSTALL_VALUE("delivery_install_value", "送货入户并安装费用"), + DELIVERY_ONE_DAY("delivery_one_day", "是否当日发货"), + DISCOUNT_AMOUNT("discount_amount", "折扣金额"), + DUO_DUO_PAY_REDUCTION("duo_duo_pay_reduction", "多多支付立减金额"), + DUODUO_WHOLESALE("duoduo_wholesale", "是否多多批发"), + EXTRA_DELIVERY_LIST("extra_delivery_list", "快递信息"), + GOODS_AMOUNT("goods_amount", "商品金额"), + INNER_TRANSACTION_ID("inner_transaction_id", "支付申报订单号"), + ITEM_LIST("item_list", "订单商品列表"), + LAST_SHIP_TIME("last_ship_time", "订单承诺发货时间"), + LOGISTICS_ID("logistics_id", "快递公司在拼多多的代码"), + MKT_BIZ_TYPE("mkt_biz_type", "市场业务类型"), + ONLY_SUPPORT_REPLACE("only_support_replace", "只换不修"), + OPEN_ADDRESS_ID("open_address_id", "合单ID"), + ORDER_CHANGE_AMOUNT("order_change_amount", "订单改价折扣金额,单位元"), + ORDER_DEPOT_INFO("order_depot_info", "仓库信息"), + DEPOT_CODE("depot_code", "仓库编码"), + DEPOT_ID("depot_id", "仓库id"), + DEPOT_NAME("depot_name", "仓库名称"), + DEPOT_TYPE("depot_type", "仓库类型"), + WARE_ID("ware_id", "货品id"), + WARE_NAME("ware_name", "货品名称"), + WARE_SN("ware_sn", "货品编码"), + WARE_TYPE("ware_type", "货品类型(0:普通货品:1:组合货品)"), + ORDER_SN("order_sn", "订单编号"), + ORDER_STATUS("order_status", "订单状态"), + PAY_AMOUNT("pay_amount", "支付金额"), + PAY_NO("pay_no", "支付单号"), + PAY_TIME("pay_time", "支付时间"), + PAY_TYPE("pay_type", "支付方式"), + PLATFORM_DISCOUNT("platform_discount", "平台优惠金额"), + POSTAGE("postage", "邮费"), + PRE_SALE_TIME("pre_sale_time", "预售时间"), + PROMISE_DELIVERY_TIME("promise_delivery_time", "承诺送达时间"), + PROVINCE_ID("province_id", "省份编码"), + PROVINCE("province", "省份编码"), + RECEIVE_TIME("receive_time", "确认收货时间"), + RECEIVER_ADDRESS("receiver_address", "收件人地址"), + RECEIVER_ADDRESS_MASK("receiver_address_mask", "收件人地址"), + RECEIVER_NAME("receiver_name", "收件人姓名"), + RECEIVER_NAME_MASK("receiver_name_mask", "收件人姓名"), + RECEIVER_PHONE("receiver_phone", "收件人手机号"), + RECEIVER_PHONE_MASK("receiver_phone_mask", "收件人手机号(打码)"), + REFUND_STATUS("refund_status", "售后状态"), + REMARK("remark", "订单备注"), + REMARK_TAG("remark_tag", "订单备注标记"), + REMARK_TAG_NAME("remark_tag_name", "订单备注标记名称"), + RESEND_DELIVERY_LIST("resend_delivery_list", "补寄额外运单列表"), + RETURN_FREIGHT_PAYER("return_freight_payer", "退货包运费"), + RISK_CONTROL_STATUS("risk_control_status", "订单审核状态"), + SELF_CONTAINED("self_contained", "是否门店自提"), + SELLER_DISCOUNT("seller_discount", "商家优惠金额"), + SERVICE_FEE_DETAIL("service_fee_detail", "服务费明细列表"), + STOCK_OUT_HANDLE_STATUS("stock_out_handle_status", "缺货处理状态"), + SUPPORT_NATIONWIDE_WARRANTY("support_nationwide_warranty", "全国联保"), + TOWN("town", "区,乡镇"), + TOWN_ID("town_id", "区县编码"), + TRACKING_NUMBER("tracking_number", "快递单号"), + TRADE_IN_NATIONAL_SUBSIDY_AMOUNT("trade_in_national_subsidy_amount", "以旧换新国家补贴金额,单位:元"), + TRADE_TYPE("trade_type", "订单类型"), + UPDATED_AT("updated_at", "订单的更新时间"), + URGE_SHIPPING_TIME("urge_shipping_time", "催发货时间"), + YYPS_DATE("yyps_date", "预约配送日期"), + YYPS_TIME("yyps_time", "预约配送时段"), + OPEN_ADDRESS_ID_2("open_address_id_2", "合单ID2"); + + + private final String code; + private final String name; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskStatusTypeEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskStatusTypeEnum.java new file mode 100644 index 0000000..c91b1fb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskStatusTypeEnum.java @@ -0,0 +1,52 @@ +package org.dromara.zhishu.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; + +import java.util.ArrayList; +import java.util.List; + +/** + * 计划任务执行状态类型枚举 + */ +@Getter +@AllArgsConstructor +public enum TaskStatusTypeEnum { + + NOT_EXECUTE("0", "未执行"), + + EXECUTING("1", "执行中"), + + EXECUTE_PAUSE_STOP("2", "暂停/停止"), + + EXECUTED("3", "已完成"); + + /** + * code + */ + private final String code; + + /** + * message + */ + private final String msg; + + public static List getTaskStatusTypeEnumList() { + List taskStatusTypeEnumList = new ArrayList<>(); + for (TaskStatusTypeEnum item : values()) { + taskStatusTypeEnumList.add(item.getCode()); + } + return taskStatusTypeEnumList; + } + + public static TaskStatusTypeEnum valueOfCode(String code) { + for (TaskStatusTypeEnum type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + throw new ServiceException("未知操作库存类型code: " + code); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskTypeEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskTypeEnum.java new file mode 100644 index 0000000..5423c5e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/enums/TaskTypeEnum.java @@ -0,0 +1,47 @@ +package org.dromara.zhishu.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.common.core.exception.ServiceException; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@AllArgsConstructor +public enum TaskTypeEnum { + + PUBLISH_GOODS("1", "发布商品"), + + SYNC_GOODS_KFZ("SYNC_GOODS_KFZ", "孔夫子"), + + SYNC_GOODS_WLN("SYNC_GOODS_WLN", "万里牛"); + + /** + * code + */ + private final String code; + + /** + * message + */ + private final String msg; + + public static List getTaskTypeEnumList() { + List taskTypeEnumList = new ArrayList<>(); + for (TaskTypeEnum item : values()) { + taskTypeEnumList.add(item.getCode()); + } + return taskTypeEnumList; + } + + public static TaskTypeEnum valueOfCode(String code) { + for (TaskTypeEnum type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + throw new ServiceException("未知操作库存类型code: " + code); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/listener/StartupListener.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/listener/StartupListener.java new file mode 100644 index 0000000..d493acf --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/listener/StartupListener.java @@ -0,0 +1,65 @@ +package org.dromara.zhishu.listener; + +import com.alibaba.excel.EasyExcel; +import org.dromara.zhishu.domain.dto.request.ZhishuShopGoodsRequest; +import org.dromara.zhishu.domain.vo.SaveGoodsVo; +import org.dromara.zhishu.service.IZhishuShopGoodsService; +import org.dromara.zhishu.util.ExcelFileHandlerUtil; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.nio.file.Paths; +import java.util.*; + +@Component +public class StartupListener implements CommandLineRunner { + + @Autowired + private IZhishuShopGoodsService zhishuShopGoodsService; + + @Override + public void run(String... args) throws Exception { + String baseDir = UrlUtil.getUrl(); + Collection types = Arrays.asList("New", "Changed"); + + Map>> groupedData = + ExcelFileHandlerUtil.readExcelByTypeAndShopId(baseDir, types, ZhishuShopGoodsRequest.class); + + // 打印结果 + groupedData.forEach((type, shopMap) -> { +// System.out.println("Type: " + type); + shopMap.forEach((shopId, list) -> { +// System.out.println(" Shop ID: " + shopId + ", 记录数: " + list.size()); + // 指定读取需要的商品Excel文件路径 + String baseUrl = UrlUtil.getUrl(); + String goodsExcelPath = Paths.get(baseUrl, type + "_" + shopId + "_0.xlsx").toString(); + try { +// System.out.println("尝试读取数据:path-" + goodsExcelPath); + // 尝试读取新增的数据 + List dataList = EasyExcel.read(goodsExcelPath) + .head(ZhishuShopGoodsRequest.class) + .sheet("New_" + shopId + "_0") + .doReadSync(); + // 将list中所有productId取出 + List productIdList = list.stream().map(ZhishuShopGoodsRequest::getProductId).distinct().toList(); + // 将dataList中productId存在与list中的数据移除 + List exportDataList = dataList.stream().filter(zhishuShopGoodsRequest -> !productIdList.contains(zhishuShopGoodsRequest.getProductId())).toList(); + // 将剩余的dataList数据覆盖到原excel中 + ExcelFileHandlerUtil.handleExport(exportDataList, baseUrl, type, shopId.toString(), ZhishuShopGoodsRequest.class); + // 调用方法重新执行这些数据 + SaveGoodsVo saveGoodsVo = new SaveGoodsVo(null, 1, shopId, null); + zhishuShopGoodsService.saveShopGoodsInDb(saveGoodsVo); + // 数据处理完毕删除异常文件 + ExcelFileHandlerUtil.deleteFilesByPrefix(UrlUtil.getUrl(), "Error_" + type + "_" + shopId); + } catch (Exception e) { + // 读取不到说明没有对应需要处理的数据,不做处理,仅记录日志以防其他未知原因导致,不抛出异常 +// System.out.println("未能读取新增数据文件: " + goodsExcelPath + "原因:{}" + e.getMessage()); + } + }); + + + }); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/manager/TaskExecutorManager.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/manager/TaskExecutorManager.java new file mode 100644 index 0000000..c14720d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/manager/TaskExecutorManager.java @@ -0,0 +1,37 @@ +package org.dromara.zhishu.manager; + +import jakarta.annotation.PreDestroy; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Component +public class TaskExecutorManager { + + private final ExecutorService executor; + + public TaskExecutorManager() { + // 使用有界队列和合理的线程数 + this.executor = new ThreadPoolExecutor( + 4, // 核心线程数 + 8, // 最大线程数 + 60L, TimeUnit.SECONDS, // 空闲线程存活时间 + new ArrayBlockingQueue<>(20), // 有界队列,防止无限堆积 + new ThreadPoolExecutor.CallerRunsPolicy() // 重要:拒绝策略 + ); + } + + public ExecutorService getExecutor() { + return executor; + } + + @PreDestroy + public void shutdown() { + if (executor != null && !executor.isShutdown()) { + executor.shutdown(); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/BookBaseInfoMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/BookBaseInfoMapper.java new file mode 100644 index 0000000..309bbd5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/BookBaseInfoMapper.java @@ -0,0 +1,53 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.BookBaseInfo; +import org.dromara.zhishu.domain.bo.BookBaseInfoBo; +import org.dromara.zhishu.domain.bo.IllBaseInfoBo; +import org.dromara.zhishu.domain.vo.BookBaseInfoVo; + +import java.util.List; + +/** + * 基础信息Mapper接口 + * + * @author Lion Li + * @date 2025-03-08 + */ +@Mapper +public interface BookBaseInfoMapper extends BaseMapperPlus { + + + + @Select("select * from book_base_info") + List getList1(); + + + @Select("select * from book_base_info") + @InterceptorIgnore(tenantLine = "true", dataPermission = "false") + List getList2(); + + @Select("select * from book_base_info") + BookBaseInfoVo selectVoByIsdn(QueryWrapper queryWrapper); + + @Select("select * from book_base_info where isbn = #{isbn}") + BookBaseInfoVo selectIsbnList(String isbn); + + BookBaseInfoVo selectByIsbn(String isbn); + + int updateByIsbn(BookBaseInfoBo bo); + + @Select("select * from book_base_info where book_name LIKE CONCAT(#{bookName}, '%')") + List selectByBookName(String bookName); + + List selectBookPic(); + + int delectByIsbn(String isbn); + + int updateByIllge(IllBaseInfoBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/CountMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/CountMapper.java new file mode 100644 index 0000000..2a49c87 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/CountMapper.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.Statistic; +import org.dromara.zhishu.domain.vo.StatisticVo; + +import java.util.List; + +@Mapper +public interface CountMapper extends BaseMapperPlus { + + List selectDepotId(Long userId); + + Long selectW(Long userId); + + Long selectS(List depotId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/DepotOrderMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/DepotOrderMapper.java new file mode 100644 index 0000000..0634245 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/DepotOrderMapper.java @@ -0,0 +1,26 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.zhishu.domain.DepotOrder; +import org.dromara.zhishu.domain.bo.DepotOrderBo; +import org.dromara.zhishu.domain.vo.DepotOrderVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.springframework.data.repository.query.Param; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * 仓库订单信息Mapper接口 + * + * @author yxy + * @date 2025-06-03 + */ +public interface DepotOrderMapper extends BaseMapperPlus { + + + List selectListPage(DepotOrderBo depotOrderBo); + + DepotOrderVo selectDepotOrderById(String id); + + Long selectTotal(DepotOrderBo depotOrderBo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ExcelTaskMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ExcelTaskMapper.java new file mode 100644 index 0000000..abd23ff --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ExcelTaskMapper.java @@ -0,0 +1,26 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.ExcelTask; +import org.dromara.zhishu.domain.bo.ExcelTaskBo; +import org.dromara.zhishu.domain.vo.ExcelTaskVo; +import org.springframework.data.repository.query.Param; + +import java.util.Collection; + + +/** + * 任务列表Mapper接口 + * + * @author yxy + * @date 2025-03-21 + */ +@Mapper +public interface ExcelTaskMapper extends BaseMapperPlus { + + Page selectVo(@Param("build") Page build, @Param("bo") ExcelTaskBo bo); + + void deleteExcelTask(Collection ids); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FastMailMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FastMailMapper.java new file mode 100644 index 0000000..bf6eb32 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FastMailMapper.java @@ -0,0 +1,25 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.FastMail; +import org.dromara.zhishu.domain.vo.FastMailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 快递打单账号管理Mapper接口 + * + * @author yxy + * @date 2025-06-06 + */ +public interface FastMailMapper extends BaseMapperPlus { + + + FastMailVo selectByUserIdAndType(@Param("userId") String userId,@Param("type") String type); + + /** + * 根据面单类型删除数据 + * @param fastMailType + * @return + */ + int deleteByFastMailType(@Param("userId") Long userId,@Param("fastMailType") String fastMailType); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FilterSetMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FilterSetMapper.java new file mode 100644 index 0000000..c88dc00 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/FilterSetMapper.java @@ -0,0 +1,35 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.zhishu.domain.FilterSet; +import org.dromara.zhishu.domain.bo.FilterSetBo; +import org.dromara.zhishu.domain.vo.FilterSetVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 过滤设置Mapper接口 + * + * @author yxy + * @date 2025-04-14 + */ +@Mapper +public interface FilterSetMapper extends BaseMapperPlus { + + @Override + @DataPermission({ + @DataColumn(key = "userName", value = "create_by") + }) + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + List selectVoListByBo(FilterSetBo bo); + + int deleteTrueById(Long id); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/GoodsAutoFailMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/GoodsAutoFailMapper.java new file mode 100644 index 0000000..9e41707 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/GoodsAutoFailMapper.java @@ -0,0 +1,24 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.GoodsAutoFail; +import org.dromara.zhishu.domain.bo.GoodsAutoFailBo; +import org.dromara.zhishu.domain.vo.GoodsAutoFailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 自动发布失败Mapper接口 + * + * @author yxy + * @date 2025-09-29 + */ +public interface GoodsAutoFailMapper extends BaseMapperPlus { + + Long selectAllNum(GoodsAutoFailBo bo); + + @InterceptorIgnore(tenantLine = "true") + List selectList(GoodsAutoFailBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/LogisticsMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/LogisticsMapper.java new file mode 100644 index 0000000..76d30c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/LogisticsMapper.java @@ -0,0 +1,30 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.Logistics; +import org.dromara.zhishu.domain.bo.LogisticsBo; +import org.dromara.zhishu.domain.vo.LogisticsVo; + +import java.util.List; + +@Mapper +public interface LogisticsMapper extends BaseMapperPlus { + + + String selectByArea(Integer deliveryArea, Integer deliveryCity); + + String selectByProvince(Integer deliveryProvince); + + String selectByCity(Integer deliveryCity, Integer deliveryProvince); + + int insert(Logistics add); + + List selectLogistice(String warehouseId); + + Logistics selectByWareId(Long id); + + Long selectByid(String proName,String cityName,String areaName,Long proId, Long cityId); + + Integer updateByBo(Logistics bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NewUserBoMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NewUserBoMapper.java new file mode 100644 index 0000000..dc9c314 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NewUserBoMapper.java @@ -0,0 +1,24 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.NewUserInfo; +import org.dromara.zhishu.domain.vo.NewUserVo; + +@Mapper +public interface NewUserBoMapper extends BaseMapperPlus { + + + void insertAudit(@Param("userId") Long userId); + + Integer selectAudit(Long userId); + + Long selectId(Long userId); + + void updatePhone(String email, String contactPhone, Long userId); + + Integer insertAuditInfo(NewUserInfo add); + + Integer selectByPhone(String contactPhone); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NoticeMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NoticeMapper.java new file mode 100644 index 0000000..7ae8364 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/NoticeMapper.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.zhishu.domain.Notice; +import org.dromara.zhishu.domain.vo.NoticeVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 消息通知Mapper接口 + * + * @author yxy + * @date 2025-05-17 + */ +public interface NoticeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/PrintTemplateMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/PrintTemplateMapper.java new file mode 100644 index 0000000..c892ca9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/PrintTemplateMapper.java @@ -0,0 +1,30 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.PrintTemplate; +import org.dromara.zhishu.domain.bo.PrintTemplateBo; +import org.dromara.zhishu.domain.vo.PrintTemplateVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 打印模板Mapper接口 + * + * @author yxy + * @date 2026-03-07 + */ +public interface PrintTemplateMapper extends BaseMapperPlus { + + /** + * 分页查询打印模板列表(自定义) + */ + Page selectPrintTemplatePage(Page page, @Param("bo") PrintTemplateBo bo); + + /** + * 查询打印模板列表(自定义,无分页) + */ + List selectPrintTemplateList(@Param("bo") PrintTemplateBo bo); + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningLogFileMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningLogFileMapper.java new file mode 100644 index 0000000..2194d73 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningLogFileMapper.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.RunningLogFile; +import org.dromara.zhishu.domain.vo.RunningLogFileVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 程序运行日志表Mapper接口 + * + * @author yxy + * @date 2025-06-12 + */ +public interface RunningLogFileMapper extends BaseMapperPlus { + + + String selectMaxFileOrderByFileTypeAndCreateBy(@Param("fileType") String fileType,@Param("userId") String userId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskByShopMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskByShopMapper.java new file mode 100644 index 0000000..d4f3d2d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskByShopMapper.java @@ -0,0 +1,234 @@ +package org.dromara.zhishu.mapper; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.domain.dto.ErpGoodsDto; +import org.dromara.zhishu.domain.dto.RunningTaskShopGoodsDto; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.dto.SuccessDataKfz; +import org.dromara.zhishu.domain.vo.RunningTaskNumVo; + +import java.util.List; +import java.util.Map; + +/** + * 执行的任务Mapper接口 + * + * @author yxy + * @date 2025-08-05 + */ +public interface RunningTaskByShopMapper { + + /** + * 分页查询列表 + * @param tableName + * @param pageNum + * @param pageSize + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectGetShopGoodsList(@Param("tableName") String tableName,@Param("isOnsale") String isOnsale, + @Param("isbn") String isbn,@Param("priceDown") Long priceDown,@Param("priceUp") Long priceUp, + @Param("startDate") String startDate,@Param("endDate") String endDate, + @Param("pageNum") Long pageNum, @Param("pageSize") Long pageSize, + @Param("goodsName") String goodsName,@Param("stockDown") String stockDown, + @Param("stockUp") String stockUp,@Param("trilateralId") String trilateralId, + @Param("goodsCode") String goodsCode,@Param("skuCode") String skuCode); + + /** + * 查询列表总数 + * @param tableName + * @return + */ + @InterceptorIgnore(tenantLine = "true") + int selectGetShopGoodsListCount(@Param("tableName") String tableName,@Param("isOnsale") String isOnsale, + @Param("isbn") String isbn,@Param("priceDown") Long priceDown,@Param("priceUp") Long priceUp, + @Param("startDate") String startDate,@Param("endDate") String endDate, + @Param("goodsName") String goodsName,@Param("stockDown") String stockDown, + @Param("stockUp") String stockUp,@Param("trilateralId") String trilateralId, + @Param("goodsCode") String goodsCode,@Param("skuCode") String skuCode); + + /** + * 根据DTO查询列表 + * @param runningTaskShopGoodsDto + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectGetShopGoodsListByDto(RunningTaskShopGoodsDto runningTaskShopGoodsDto); + + @InterceptorIgnore(tenantLine = "true") + int selectNumByIsbn(@Param("tableName") String tableName,@Param("isbn") String isbn); + /** + * 查询数据表中数据的总数 + * @param tableName + * @return + */ + @InterceptorIgnore(tenantLine = "true") + int selectGetShopGoodsNum(@Param("tableName") String tableName,@Param("isOnSale") String isOnSale, + @Param("isbn") String isbn,@Param("priceDown") Long priceDown,@Param("priceUp") Long priceUp, + @Param("startDate") String startDate,@Param("endDate") String endDate, + @Param("goodsName") String goodsName,@Param("stockDown") String stockDown, + @Param("stockUp") String stockUp,@Param("trilateralId") String trilateralId, + @Param("goodsCode") String goodsCode,@Param("skuCode") String skuCode); + + /** + * 删除店铺商品 + */ + @InterceptorIgnore(tenantLine = "true") + int delShopGoods(@Param("tableName") String tableName,@Param("isOnSale") String isOnSale, + @Param("isbn") String isbn,@Param("priceDown") Long priceDown,@Param("priceUp") Long priceUp, + @Param("startDate") String startDate,@Param("endDate") String endDate); + + /** + * 根据三方平台id查询数据是否存在 + * @param tableName + * @param trilateralId + * @return + */ + @InterceptorIgnore(tenantLine = "true") + int selectByTrilateralId(@Param("tableName") String tableName,@Param("trilateralId") String trilateralId); + + @InterceptorIgnore(tenantLine = "true") + RunningTask selectVoByTrilateralId(@Param("tableName") String tableName,@Param("trilateralId") String trilateralId); + + /** + * 查询店铺最后一次 + * @param tableName + * @return + */ + @InterceptorIgnore(tenantLine = "true") + String selectLastFinishTime(String tableName); + + /** + * 根据isbn查询商品信息 + * @param tableName + * @param isbn + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectByIsbn(@Param("tableName") String tableName,@Param("isbn") String isbn); + + /** + * 查询电偶的日志 + * @param tableName + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectTaskShopNum(@Param("tableName") String tableName, @Param("taskId") Long taskId); + + /** + * 查询是否是最新任务拉取的数据 + * @param tableName + * @param taskId + * @return + */ + @InterceptorIgnore(tenantLine = "true") + int selectGetShopGoodsNumByTasKId(@Param("tableName") String tableName, @Param("taskId") String taskId); + + /** + * 查询任务是在执行中还是已完成 + * @param tableName + * @return + */ + @InterceptorIgnore(tenantLine = "true") + String selectStatus(String tableName); + + @InterceptorIgnore(tenantLine = "true") + List selectShopGoodsList(ErpGoodsDto erpGoodsDto); + + /** + * kfz专用导出店铺商品数据 + * @param erpGoodsDto + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectKfzShopGoodsList(ErpGoodsDto erpGoodsDto); + + + /** + * 根据isbn查询重复数据 + * @param tableName + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectRepeat(@Param("tableName") String tableName); + + // 检查表是否存在 + @InterceptorIgnore(tenantLine = "true") + int checkTableExists(@Param("tableName") String tableName); + + // 创建表 + @InterceptorIgnore(tenantLine = "true") + void createTable(@Param("tableName") String tableName); + + // 插入数据 + @InterceptorIgnore(tenantLine = "true") + void insert(@Param("tableName") String tableName, @Param("task") RunningTask task); + + //修改数据 + @InterceptorIgnore(tenantLine = "true") + void update(@Param("tableName") String tableName, @Param("task") RunningTask task); + + // 批量插入数据 + @InterceptorIgnore(tenantLine = "true") + void batchInsert(@Param("tableName") String tableName, @Param("list") List list); + + @InterceptorIgnore(tenantLine = "true") + void updateStatus(String tableName); + + @InterceptorIgnore(tenantLine = "true") + void deleteAll(String tableName); + + @InterceptorIgnore(tenantLine = "true") + void deleteByStatus(@Param("tableName") String tableName,@Param("status") String status); + + @InterceptorIgnore(tenantLine = "true") + void deleteByTaskId(@Param("tableName") String tableName,@Param("taskId") String taskId); + + + @InterceptorIgnore(tenantLine = "true") + List selectOnSaleGoodsId(String tableName); + + @InterceptorIgnore(tenantLine = "true") + List selectByGoodsId(String tableName, String trilateralId); + + @InterceptorIgnore(tenantLine = "true") + void updateSuccessDataById(@Param("tableName") String tableName,@Param("id") String id,@Param("successDataJsonStr") String successDataJsonStr); + + + @InterceptorIgnore(tenantLine = "true") + void deleteByGoodsId(@Param("tableName") String tableName,@Param("goodsId") String goodsId); + + @InterceptorIgnore(tenantLine = "true") + List getShopGoodsList(@Param("tableName") String tableName); + + @InterceptorIgnore(tenantLine = "true") + Integer getShopGoodsTotalNum(@Param("tableName")String tableName); + + @InterceptorIgnore(tenantLine = "true") + Integer getShopGoodsTotalNumByTaskId(@Param("tableName") String tableName,@Param("taskId") Long taskId); + + + @InterceptorIgnore(tenantLine = "true") + List> batchCheckExists(String tableName, List batch); + + @InterceptorIgnore(tenantLine = "true") + Map selectTodayGoods(@Param("tableName") String tableName, @Param("todayStart") String todayStart, @Param("todayEnd") String todayEnd); + + List selectGetShopGoodsListAll(String tableName, String isOnsale, Long pageNum, Long pageSize); + + @InterceptorIgnore(tenantLine = "true") + Integer countAll(@Param("tableName")String tableName); + + /** + * 批量查询goods_id是否存在,返回存在的goods_id列表 + * @param tableName + * @param goodsIds + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List batchSelectExistsByGoodsIds(@Param("tableName") String tableName, @Param("goodsIds") List goodsIds); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskMapper.java new file mode 100644 index 0000000..dd6b70e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/RunningTaskMapper.java @@ -0,0 +1,89 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.domain.vo.RunningTaskNumVo; +import org.dromara.zhishu.domain.vo.RunningTaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 执行的任务Mapper接口 + * + * @author yxy + * @date 2025-07-23 + */ +public interface RunningTaskMapper { + + RunningTask selectById(Long id); + + /** + * 查看任务日志 + * @param taskId + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List> selectLogByTaskId(Long taskId); + + + @InterceptorIgnore(tenantLine = "true") + List selectGetShopGoodsList(@Param("shopId")Long shopId,@Param("pageNum") Long pageNum,@Param("pageSize") Long pageSize); + + @InterceptorIgnore(tenantLine = "true") + Long selectGetShopGoodsNum(Long shopId); + + + @InterceptorIgnore(tenantLine = "true") + Map selectTaskStatus(); + + @InterceptorIgnore(tenantLine = "true") + List selectTaskAllNum(Long taskId); + + @InterceptorIgnore(tenantLine = "true") + Long selectTaskIsRunning(Long taskId); + + + @InterceptorIgnore(tenantLine = "true") + Long selectShopTaskByGetShopGoods(Long shopId); + + @InterceptorIgnore(tenantLine = "true") + Long selectTaskStatusByTaskType(@Param("shopId") Long shopId,@Param("taskType") String taskType); + + + @InterceptorIgnore(tenantLine = "true") + Long selectTaskStatusRunningCount(); + + @InterceptorIgnore(tenantLine = "true") + List selectTaskByGroupShopMd5(); + + @InterceptorIgnore(tenantLine = "true") + List selectTaskGroupShop(String taskType); + + + @InterceptorIgnore(tenantLine = "true") + List selectTaskShopNum(@Param("taskId") Long taskId,@Param("shopId") Long shopId); + + @InterceptorIgnore(tenantLine = "true") + int insert(RunningTask runningTask); + + /** + * 批量插入运行任务记录(如果需要也可以加上租户忽略) + * @param list 任务列表 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int batchInsert(List list); + + @InterceptorIgnore(tenantLine = "true") + int update(RunningTask runningTask); + + + @InterceptorIgnore(tenantLine = "true") + Boolean updataStatus(@Param("tableName") String tableName, @Param("taskId") Long shopId); + + @InterceptorIgnore(tenantLine = "true") + Long selectTaskStatusByTaskTypeAndIsbn(Long shopId, String taskType, String isbn); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDepotMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDepotMapper.java new file mode 100644 index 0000000..184496b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDepotMapper.java @@ -0,0 +1,26 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.ShopDepot; + +import java.util.List; + +@Mapper +public interface ShopDepotMapper { + + /** + * 根据店铺ID查询绑定关系 + */ + List selectByShopId(Long shopId); + + /** + * 根据店铺ID删除绑定关系 + */ + int deleteByShopId(Long shopId); + + /** + * 插入绑定关系 + */ + int insertBatch(@Param("list") List shopDepots); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDetailMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDetailMapper.java new file mode 100644 index 0000000..72e6734 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopDetailMapper.java @@ -0,0 +1,23 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.ShopDetail; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商品详情Mapper接口 + * + * @author yxy + * @date 2025-03-13 + */ +@Mapper +public interface ShopDetailMapper extends BaseMapperPlus { + + public ShopDetailVo selectVoByShopId(Long shopId); + + String getAutoAddByShopId(String shopId); + + String selectSaleTemplateIdByShopId(@Param("shopId") Long shopId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsMapper.java new file mode 100644 index 0000000..9fcbe1b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsMapper.java @@ -0,0 +1,235 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.dto.ShopGoodsDto; + +import java.util.List; +import java.util.Map; + +/** + * 商品信息Mapper接口 + */ +public interface ShopGoodsMapper { + + // ==================== 表管理 ==================== + + /** + * 检查表是否存在 + * @param tableName 表名 + * @return 存在数量 + */ + @InterceptorIgnore(tenantLine = "true") + int checkTableExists(@Param("tableName") String tableName); + + /** + * 创建表 + * @param tableName 表名 + */ + @InterceptorIgnore(tenantLine = "true") + void createTable(@Param("tableName") String tableName); + + // ==================== 插入操作 ==================== + + /** + * 插入单条数据 + * @param tableName 表名 + * @param shopGoods 商品信息 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int insert(@Param("tableName") String tableName, @Param("shopGoods") ShopGoodsDto shopGoods); + + /** + * 批量插入 + * @param tableName 表名 + * @param list 商品列表 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int batchInsert(@Param("tableName") String tableName, @Param("list") List list); + + // ==================== 删除操作 ==================== + + /** + * 根据ID删除 + * @param tableName 表名 + * @param id 主键ID + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteById(@Param("tableName") String tableName, @Param("id") Long id); + + /** + * 根据条件删除 + * @param tableName 表名 + * @param trilateralId 商品id + * @param isbn ISBN号 + * @param shopId 店铺id + * @param isOnSale 上下架状态 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteByCondition(@Param("tableName") String tableName, + @Param("trilateralId") String trilateralId, + @Param("isbn") String isbn, + @Param("shopId") String shopId, + @Param("isOnSale") String isOnSale); + + /** + * 批量删除 + * @param tableName 表名 + * @param ids ID列表 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int batchDeleteByIds(@Param("tableName") String tableName, @Param("ids") List ids); + + /** + * 删除所有数据 + * @param tableName 表名 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteAll(@Param("tableName") String tableName); + + // ==================== 更新操作 ==================== + + /** + * 根据ID更新 + * @param tableName 表名 + * @param shopGoods 商品信息 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int updateById(@Param("tableName") String tableName, @Param("shopGoods") ShopGoodsDto shopGoods); + + /** + * 更新上下架状态 + * @param tableName 表名 + * @param trilateralId 商品id + * @param isOnSale 上下架状态 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int updateOnSaleStatus(@Param("tableName") String tableName, + @Param("trilateralId") String trilateralId, + @Param("isOnSale") String isOnSale); + + /** + * 批量更新上下架状态 + * @param tableName 表名 + * @param trilateralIds 商品id列表 + * @param isOnSale 上下架状态 + * @return 影响行数 + */ + @InterceptorIgnore(tenantLine = "true") + int batchUpdateOnSaleStatus(@Param("tableName") String tableName, + @Param("trilateralIds") List trilateralIds, + @Param("isOnSale") String isOnSale); + + // ==================== 查询操作 ==================== + + /** + * 根据ID查询 + * @param tableName 表名 + * @param id 主键ID + * @return 商品信息 + */ + @InterceptorIgnore(tenantLine = "true") + ShopGoodsDto selectById(@Param("tableName") String tableName, @Param("id") Long id); + + /** + * 根据商品ID查询 + * @param tableName 表名 + * @param trilateralId 商品id + * @return 商品信息 + */ + @InterceptorIgnore(tenantLine = "true") + ShopGoodsDto selectByTrilateralId(@Param("tableName") String tableName, @Param("trilateralId") String trilateralId); + + /** + * 根据ISBN查询列表 + * @param tableName 表名 + * @param isbn ISBN号 + * @return 商品列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectByIsbn(@Param("tableName") String tableName, @Param("isbn") String isbn); + + /** + * 根据店铺ID查询列表 + * @param tableName 表名 + * @param shopId 店铺id + * @return 商品列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectByShopId(@Param("tableName") String tableName, @Param("shopId") String shopId); + + /** + * 分页条件查询 + * @param tableName 表名 + * @return 商品列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectByCondition(@Param("tableName") String tableName,@Param("shopGoodsDto") ShopGoodsDto shopGoodsDto); + + /** + * 条件查询总数 + * @param tableName 表名 + * @return 总数 + */ + @InterceptorIgnore(tenantLine = "true") + int selectCountByCondition(@Param("tableName") String tableName,@Param("shopGoodsDto") ShopGoodsDto shopGoodsDto); + + /** + * 查询所有商品 + * @param tableName 表名 + * @return 商品列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectAll(@Param("tableName") String tableName); + + /** + * 统计在售商品数量 + * @param tableName 表名 + * @return 在售商品数量 + */ + @InterceptorIgnore(tenantLine = "true") + int countOnSale(@Param("tableName") String tableName); + + /** + * 统计总记录数 + * @param tableName 表名 + * @return 总记录数 + */ + @InterceptorIgnore(tenantLine = "true") + int countAll(@Param("tableName") String tableName); + + /** + * 根据商品编码查询 + * @param tableName 表名 + * @param goodsCode 商品编码 + * @return 商品信息 + */ + @InterceptorIgnore(tenantLine = "true") + ShopGoodsDto selectByGoodsCode(@Param("tableName") String tableName, @Param("goodsCode") String goodsCode); + + /** + * 根据SKU编码查询 + * @param tableName 表名 + * @param skuCode sku编号 + * @return 商品信息 + */ + @InterceptorIgnore(tenantLine = "true") + ShopGoodsDto selectBySkuCode(@Param("tableName") String tableName, @Param("skuCode") String skuCode); + + /** + * 批量查询是否存在 + * @param tableName 表名 + * @param trilateralIds 商品id列表 + * @return 存在映射 + */ + @InterceptorIgnore(tenantLine = "true") + List> batchCheckExists(@Param("tableName") String tableName, @Param("trilateralIds") List trilateralIds); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedLogMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedLogMapper.java new file mode 100644 index 0000000..144114d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedLogMapper.java @@ -0,0 +1,13 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; + +import java.util.List; + +@Mapper +public interface ShopGoodsPublishedLogMapper extends BaseMapper { + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedMapper.java new file mode 100644 index 0000000..eaf34b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsPublishedMapper.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.zhishu.domain.ShopGoodsPublished; +import org.dromara.zhishu.domain.bo.ShopGoodsPublishedBo; +import org.dromara.zhishu.domain.vo.PlatformIdUpdateVO; +import org.dromara.zhishu.domain.vo.ShopGoodsPublishedVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 记录已发布书籍Mapper接口 + * + * @author yxy + * @date 2025-04-11 + */ +@Mapper +public interface ShopGoodsPublishedMapper extends BaseMapperPlus { + + + /** + * 根据shop_goods_id批量查询 + * @param shopGoodsIds 商品ID列表 + * @return 查询结果列表 + */ + List selectByShopGoodsIds(@Param("shopGoodsIds") List shopGoodsIds,@Param("shopId") Long shopId); + + + List selectListByShopsId(Long shopId); + + List selectShopGoodsPublishedByShopIdAndArtNo(@Param("shopId") Long shopId,@Param("artNo") String artNo); + + ShopGoodsPublishedVo selectDataById(Long id); + + + Page selectDataList(@Param("page") Page page,@Param("bo") ShopGoodsPublishedBo bo); + + Boolean delShopGoodsPublished(@Param("shopId") String shopId,@Param("platformId") String platformId); + + Boolean delByIds(Long id); + + Boolean delByShopId(Long shopId); + + /** + * 批量查询商品发布状态 + * + * @param goodsIds 商品ID列表 + * @param shopIds 店铺ID列表 + * @return 商品ID和发布状态的映射 + */ + List> selectPublishedStatus(@Param("goodsIds") List goodsIds, @Param("shopIds") List shopIds); + + List getPlatFormIdsByShopId( @Param("shopId") Long shopId); + + void batchUpdateKfzPlatformId(@Param("platformIdUpdateVOList") List platformIdUpdateVOList); + + ShopGoodsPublishedVo selectDataByPlatformId(@Param("platformId")Long platformId ,@Param("shopId")Long shopId); + + void batchDeleteByIds(List ids); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsRejectionMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsRejectionMapper.java new file mode 100644 index 0000000..6589328 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopGoodsRejectionMapper.java @@ -0,0 +1,60 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.*; +import org.dromara.zhishu.domain.ShopGoodsPublished; +import org.dromara.zhishu.domain.ShopGoodsRejection; +import org.dromara.zhishu.domain.bo.ShopGoodsPublishedBo; + +import java.util.List; + +@Mapper +public interface ShopGoodsRejectionMapper extends BaseMapper { + + + // 插入数据 + @Insert("INSERT INTO shop_goods_rejection (shop_goods_id, shop_id, platform_id, create_time, rejection_reason,tenant_id,isbn,platform_type,shop_goods_img,goods_type,offshelf_time,sync_flag) " + + "VALUES (#{shopGoodsId}, #{shopId}, #{platformId}, #{createTime}, #{rejectionReason},#{tenantId},#{isbn},#{platformType},#{shopGoodsImg},#{goodsType},#{offshelfTime},#{syncFlag} )") + @Options(useGeneratedKeys = true, keyProperty = "id") + int insert(ShopGoodsRejection shopGoodsRejection); + + // 根据ID删除 + @Delete("DELETE FROM shop_goods_rejection WHERE id = #{id}") + int deleteById(Long id); + + // 根据ID更新 + @Update("UPDATE shop_goods_rejection SET " + + "shop_goods_id = #{shopGoodsId}, " + + "shop_id = #{shopId}, " + + "platform_id = #{platformId}, " + + "rejection_reason = #{rejectionReason} " + + "WHERE id = #{id}") + int update(ShopGoodsRejection shopGoodsRejection); + + // 根据ID查询 + @Select("SELECT * FROM shop_goods_rejection WHERE id = #{id}") + ShopGoodsRejection selectById(Long id); + + // 查询所有 + @Select("SELECT * FROM shop_goods_rejection ORDER BY create_time DESC") + List selectAll(); + + // 根据店铺ID查询 + @Select("SELECT * FROM shop_goods_rejection WHERE shop_id = #{shopId} ORDER BY create_time DESC") + List selectByShopId(String shopId); + + // 根据平台商品ID查询 + @Select("SELECT * FROM shop_goods_rejection WHERE platform_id = #{platformId} ORDER BY create_time DESC") + List selectByPlatformId(String platformId); + + // 动态查询(使用XML配置) + List selectByCondition(ShopGoodsRejection condition); + + // 分页查询 + public Page selectByConditionWithPage(@Param("page") Page page, @Param("bo") ShopGoodsRejection bo); + + // 统计总数 + int countByCondition(ShopGoodsRejection condition); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopImgMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopImgMapper.java new file mode 100644 index 0000000..d9b9503 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopImgMapper.java @@ -0,0 +1,23 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.ShopImg; +import org.dromara.zhishu.domain.vo.ShopImgVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 店铺图片Mapper接口 + * + * @author yxy + * @date 2025-03-17 + */ +@Mapper +public interface ShopImgMapper extends BaseMapperPlus { + + List selectVoByShopId(String pid); + + int deleteByPidAndType(@Param("pid") String pid,@Param("type") String type); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseAutoMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseAutoMapper.java new file mode 100644 index 0000000..36e11c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseAutoMapper.java @@ -0,0 +1,58 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.ShopWarehouseAuto; + +import java.util.List; + +/** + * 店铺与仓库自动发布关联Mapper接口 + * + * @author yxy + * @date 2025-12-28 + */ +@Mapper +public interface ShopWarehouseAutoMapper { + + /** + * 根据店铺ID删除关联 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteByShopId(Long shopId); + + + @InterceptorIgnore(tenantLine = "true") + List selectList(ShopWarehouseAuto shopWarehouse); + + /** + * 根据店铺ID查询关联列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectByShopId(Long shopId); + + /** + * 新增店铺与仓库关联 + */ + @InterceptorIgnore(tenantLine = "true") + int insert(ShopWarehouseAuto shopWarehouse); + + + /** + * 根据ID查询关联 + */ + @InterceptorIgnore(tenantLine = "true") + ShopWarehouseAuto selectById(Long id); + + /** + * 根据ID删除关联 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteById(Long id); + + /** + * 更新关联信息 + */ + @InterceptorIgnore(tenantLine = "true") + int update(ShopWarehouseAuto shopWarehouse); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseMapper.java new file mode 100644 index 0000000..ffabf0f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ShopWarehouseMapper.java @@ -0,0 +1,55 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.zhishu.domain.ShopWarehouse; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 店铺与仓库自动发布关联Mapper接口 + * + * @author yxy + * @date 2025-12-28 + */ +@Mapper +public interface ShopWarehouseMapper { + + /** + * 根据店铺ID删除关联 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteByShopId(Long shopId); + + /** + * 根据店铺ID查询关联列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectByShopId(Long shopId); + + /** + * 新增店铺与仓库关联 + */ + @InterceptorIgnore(tenantLine = "true") + int insert(ShopWarehouse shopWarehouse); + + + /** + * 根据ID查询关联 + */ + @InterceptorIgnore(tenantLine = "true") + ShopWarehouse selectById(Long id); + + /** + * 根据ID删除关联 + */ + @InterceptorIgnore(tenantLine = "true") + int deleteById(Long id); + + /** + * 更新关联信息 + */ + @InterceptorIgnore(tenantLine = "true") + int update(ShopWarehouse shopWarehouse); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/SpecMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/SpecMapper.java new file mode 100644 index 0000000..04ffcc1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/SpecMapper.java @@ -0,0 +1,19 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.Spec; +import org.dromara.zhishu.domain.vo.SpecVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 自定义规格设置Mapper接口 + * + * @author yxy + * @date 2025-03-27 + */ +@Mapper +public interface SpecMapper extends BaseMapperPlus { + + public SpecVo selectVoByShopId(Long shopId); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TAuditMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TAuditMapper.java new file mode 100644 index 0000000..f2a0a61 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TAuditMapper.java @@ -0,0 +1,43 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.zhishu.domain.NewUserInfo; +import org.dromara.zhishu.domain.TAudit; +import org.dromara.zhishu.domain.bo.TAuditBo; +import org.dromara.zhishu.domain.vo.TAuditVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.Collection; + +/** + * 审核Mapper接口 + * + * @author Lion Li + * @date 2025-04-01 + */ +@Mapper +public interface TAuditMapper extends BaseMapperPlus { + + NewUserInfo selectUserList(Long id); + + void updateByUser(NewUserInfo newUserInfo); + + void deleteUser(Collection ids); + + String selectUserName(Long userId); + + int updateStatus(TAuditBo bo); + + Long selectUserId(Long id); + + Integer insertUserRole(Long userId, long l); + + Integer insertAuditLog(TAuditBo bo); + + Integer deleteUserRole(Long userId, long l); + + Page selectPageVo(Page build, TAuditBo bo); + + TAudit selectId(Long id); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TFreightMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TFreightMapper.java new file mode 100644 index 0000000..bbc2e7f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TFreightMapper.java @@ -0,0 +1,79 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.bo.TFreightBo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 三级货区管理Mapper接口 + * + * @author Lion Li + * @date 2025-04-19 + */ +@Mapper +public interface TFreightMapper extends BaseMapperPlus { + + @Select("select id from t_freight where code = #{freightName} AND shelves_id = #{shelvesId}") + Long getFreightIdByName(String freightName, Long shelvesId); + + /** + * 根据三级获取名称获取获取信息 + * @param freightName + * @param shelvesId + * @return + */ + TFreightVo selectByFreightName(@Param("freightName") String freightName,@Param("shelvesId") Long shelvesId); + + + List selectDepotId(Long userId); + + List selectByList(List depotIdList); + + String setShelvesName(Long id); + + List selectByShelvesId(Long shelvesId); + + Map selectByFreightId(Long freightId); +// List selectCode(Collection ids); + +// Integer selectByCount2(Long userId,String code); + +// Integer selectByCount1(Long userId,String code); + + + String selectByCode(Long shelvesId); + + Integer selectFreName(String name, Long shelvesId,String code); + + List selectV(Long userId); + + List selectShe(List depotids); + + Page selectVo(Page build, TFreightBo bo, List sheIds); + + int insertFre(TFreight add); + + List selectVoLists(List sheIds); + + int updateBydate(TFreight update); + + TFreight selectSheName(Long id); + + TShelvesVo setShelvesName1(Long id); + + String selectDepotCode(String depotId); + + List selectListVo(Collection ids,Long userId); + + Integer selectByExcludeCurrent(String name, Long shelvesId, Long freightId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteCodeMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteCodeMapper.java new file mode 100644 index 0000000..a39a4b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteCodeMapper.java @@ -0,0 +1,54 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.TInviteCode; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.vo.InviteCodeVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import java.util.List; + +/** + * 邀请码 Mapper 接口 + */ +@Mapper +public interface TInviteCodeMapper extends BaseMapper { + + /** + * 验证邀请码有效性 + * + * @param code 邀请码 + * @return 邀请码信息 + */ + TInviteCode validateInviteCode(@Param("code") String code); + + /** + * 根据用户ID查询邀请码列表 + * + * @param userId 用户ID + * @return 邀请码列表 + */ + List selectListByUserId(@Param("userId") Long userId); + + /** + * 生成邀请码 + * + * @param bo 邀请码业务对象 + * @return 插入成功的行数 + */ + int insertGenerateInviteCode(TInviteCode bo); + + /** + * 自定义分页查询邀请码列表 + * + * @param page 分页参数 + * @param userId 用户ID + * @param code 邀请码 + * @param used 是否已使用 + * @return 邀请码列表 + */ + Page selectPageList(Page page, @Param("userId") Long userId, + @Param("code") String code, @Param("used") Boolean used); + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationMapper.java new file mode 100644 index 0000000..1e18f21 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationMapper.java @@ -0,0 +1,10 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.zhishu.domain.TInviteRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 邀请关系 Mapper 接口 + */ +public interface TInviteRelationMapper extends BaseMapper { +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationsMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationsMapper.java new file mode 100644 index 0000000..d67d7d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TInviteRelationsMapper.java @@ -0,0 +1,19 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.TInviteRelations; +import java.util.List; + +@Mapper +public interface TInviteRelationsMapper { + + /** + * 根据邀请人ID查询邀请关系 + * + * @param inviterId 邀请人ID + * @return 邀请关系列表 + */ + @InterceptorIgnore(tenantLine = "true") + List selectByInviterId(Long inviterId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TLogisticsMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TLogisticsMapper.java new file mode 100644 index 0000000..5dbe789 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TLogisticsMapper.java @@ -0,0 +1,45 @@ +package org.dromara.zhishu.mapper; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.TLogistics; +import org.dromara.zhishu.domain.bo.TLogisticsBo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TLogisticsVo; +import org.springframework.data.repository.query.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 物流管理Mapper接口 + * + * @author Lion Li + * @date 2025-04-22 + */ +@Mapper +public interface TLogisticsMapper extends BaseMapperPlus { + + TDepotVo selectDepotName(Long depotId); + + Page selectPageVo(@Param("page") Page build, @Param("bo") TLogisticsBo bo); + + TLogisticsVo selectByLId(Long id); + + List nameList(List depotIds); + + String selectByArea(String deliveryArea, String deliveryCity); + + String selectByCity(String deliveryCity, String deliveryProvince); + + String selectByProvince(String deliveryProvince); + + int deleteIds(Collection ids); + + List selectDepotId(Long userId); + + + List selectUserId(Long userId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TShelvesMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TShelvesMapper.java new file mode 100644 index 0000000..8e9e73f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TShelvesMapper.java @@ -0,0 +1,97 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.TShelves; +import org.dromara.zhishu.domain.bo.TShelvesBo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; +import org.springframework.data.repository.query.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 货架信息Mapper接口 + * + * @author Lion Li + * @date 2025-03-26 + */ +@Mapper +public interface TShelvesMapper extends BaseMapperPlus { + +// @Select("select count(1) from t_shelves where code=#{code} and depot_id=#{depotId}") + Integer selectByCode(String code, Long depotId, String sheName); + + String selectByName(Long shelvesId,Long userId); + + +// @Update("update t_shelves set depot_id=#{depotId} where id=#{id};") + Integer updateByShe(Long id, Long depotId); + + Integer insertFre(@Param("id") Long id,@Param("numbers1") List numbers1); + +// @Update("update t_depot set she_quantity_max=she_quantity_max+#{sheCap} where id=#{depotId} and user_id=#{userId}") +// void updateSheFre(Long depotId, Long userId); + + String selectBySCode(Long depotId); + + String selectByFreCode(Long freId);//查询货位code + + String selectFreCode(String depotCode, Long userId); + + + void deleteByIdShe(Collection ids); + + Page selectVo(@Param("build") Page build,@Param("bo") TShelvesBo bo,@Param("depotids") List depotids); + + List selectV(Long userId); + + List selectM(Long userId); + + int insertBo(TShelves add); + + List selectList1(Long userId); + + + int updateShe(TShelves update); + + Integer selectNumber(Long depotId); + + Integer selectcount(Long depotId); + + + Long selectBo(Long depotId, String code); + +// List selectByCodes(Collection ids); + + Integer selectCounts(Long userId, String code); + + String selectSCode(Long sheId); + + Integer selectCounts1(Long userId, String code); + + List selectFList(Long userId); + + String selectDName(Long depotId,Long userId); + + String selectDepotName(String depotId); + + TDepotVo selectByName1(Long id, Long userId); + + TDepotVo selectDepot(String depotId); + + List selectListVo(Collection ids, Long userId); + + List selectShelvesIdByDepotIdAndCode(String depotId, String code); + + List selectShelvesByDepotId(String depotId); + + Long selectDepotIdByShelvesId(Long shelvesId); + + TShelvesVo selectForLocal(Long depotId, String code); + + Integer selectByExcludeCurrent(String name, Long depotId, Long shelvesId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TaskMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TaskMapper.java new file mode 100644 index 0000000..dcfd32b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/TaskMapper.java @@ -0,0 +1,55 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.zhishu.domain.Task; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.TaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 任务列表Mapper接口 + * + * @author yxy + * @date 2025-03-21 + */ +@Mapper +public interface TaskMapper extends BaseMapperPlus { + + @Override + @DataPermission({ + @DataColumn(key = "userName", value = "create_by") + }) + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + List selectByShopId(Long userId); + + TaskVo selectByFileName(String fileName); + + List selectRunningTask(@Param("pageSize") Integer pageSize,@Param("pageNum") Integer pageNum); + + int selectRunningTaskCount(); + + void editTaskDataNum(@Param("shopIds")String shopIds, @Param("dataNum")Long dataNum, @Param("taskType") String taskType); + + Task getTaskBoByRelationId(String id); + + /** + * 批量查询店铺基本信息 + */ + List selectShopsByIds(@Param("ids") List ids); + + /** + * 批量查询店铺详情信息 + */ + List selectShopDetailsByIds(@Param("ids") List ids); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserRechargeMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserRechargeMapper.java new file mode 100644 index 0000000..10edb9c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserRechargeMapper.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.zhishu.domain.Shop; +import org.dromara.zhishu.domain.UserRecharge; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.UserRechargeVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 用户充值Mapper接口 + * + * @author yxy + * @date 2025-04-26 + */ +@Mapper +public interface UserRechargeMapper extends BaseMapperPlus { + + + @Override + @DataPermission({ + @DataColumn(key = "userName", value = "create_by") + }) + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + @Override + @DataPermission({ + @DataColumn(key = "userName", value = "create_by") + }) + default List selectVoList(Wrapper wrapper) { + return selectVoList(wrapper, this.currentVoClass()); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserTAuditMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserTAuditMapper.java new file mode 100644 index 0000000..5b99d5e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/UserTAuditMapper.java @@ -0,0 +1,44 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.NewUserInfo; +import org.dromara.zhishu.domain.UserTAudit; +import org.dromara.zhishu.domain.bo.UserTAuditBo; +import org.dromara.zhishu.domain.vo.UserTAuditVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.springframework.data.repository.query.Param; + +import java.util.Collection; + +/** + * 列表Mapper接口 + * + * @author Lion Li + * @date 2025-04-02 + */ +@Mapper +public interface UserTAuditMapper extends BaseMapperPlus { + NewUserInfo selectUserList(Long id); + String selectUserName(Long userId); + + Long selectId(Long userId); + + Page customPageList(@Param("page") Page page, @Param("bo") UserTAuditBo bo); + + NewUserInfo selectU(Long id); + + UserTAuditVo selectM(Long auditId); + + String selectStatus(Long id); + + Boolean updateUserId(UserTAudit update); + + Long selectAudit(Collection ids); + + Integer deleteAudit(Long auditId); + + Long deleteByAudit(Collection ids); + + UserTAuditVo getAuditLog(Long message); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ViolationMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ViolationMapper.java new file mode 100644 index 0000000..491d949 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ViolationMapper.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.zhishu.domain.Violation; +import org.dromara.zhishu.domain.vo.ViolationVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 违规Mapper接口 + * + * @author yxy + * @date 2025-06-23 + */ +public interface ViolationMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WaveMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WaveMapper.java new file mode 100644 index 0000000..fd50667 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WaveMapper.java @@ -0,0 +1,19 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.zhishu.domain.vo.WaveVo; +import java.util.List; + +@Mapper +public interface WaveMapper { + + @InterceptorIgnore(tenantLine = "true") + String getStaffName(String staffId); + + @InterceptorIgnore(tenantLine = "true") + List getStaffId(); + + @InterceptorIgnore(tenantLine = "true") + List getStaffList(String userId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WhiteListMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WhiteListMapper.java new file mode 100644 index 0000000..f716f7d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/WhiteListMapper.java @@ -0,0 +1,22 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.zhishu.domain.WhiteList; +import org.dromara.zhishu.domain.vo.WhiteListVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 白名单Mapper接口 + * + * @author yxy + * @date 2025-06-25 + */ +public interface WhiteListMapper extends BaseMapperPlus { + + List selectAll(); + + List selectByIp(String ip); + + void deleteAll(); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/XyBindMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/XyBindMapper.java new file mode 100644 index 0000000..be123f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/XyBindMapper.java @@ -0,0 +1,12 @@ +package org.dromara.zhishu.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.XyBind; +import org.dromara.zhishu.domain.vo.XyBindVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +@Mapper +public interface XyBindMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsDetailMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsDetailMapper.java new file mode 100644 index 0000000..fbbe4ca --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsDetailMapper.java @@ -0,0 +1,16 @@ +package org.dromara.zhishu.mapper; + +import org.dromara.zhishu.domain.ZhishuShopGoodsDetail; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商品信息补全表Mapper接口 + * + * @author yxy + * @date 2025-06-13 + */ +public interface ZhishuShopGoodsDetailMapper extends BaseMapperPlus { + + ZhishuShopGoodsDetailVo selectByPid(Long pid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsMapper.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsMapper.java new file mode 100644 index 0000000..c1d7e1f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/mapper/ZhishuShopGoodsMapper.java @@ -0,0 +1,191 @@ +package org.dromara.zhishu.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.TShelves; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.ZhishuShopImages; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsBo; +import org.dromara.zhishu.domain.vo.*; +import org.springframework.data.repository.query.Param; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 商品信息Mapper接口 + * + * @author Lion Li + * @date 2025-03-07 + */ +@Mapper +public interface ZhishuShopGoodsMapper extends BaseMapperPlus { + + /** + * 批量查询商品根据id + * @param ids + * @return + */ + List selectByIds(List ids); + + List selectShopGoodsByIsbn(String isbn); + + ZhishuShopGoodsVo selectShopGoodsByItemNumbers(String itemNumber); + + ZhishuShopGoodsVo selectShopGoodsByArtNo(String artNo); + + + ZhishuShopGoodsVo selectShopGoodsByItemNumber1(ZhishuShopGoods zhishuShopGoods); + + + ZhishuShopGoods selectInventory(String barcode, String letterCode); + + void updateArtNo(String firstChar, String secondChar, String thirdChar, String artNo); + + Integer selectDepot(Long userId); + + List selectAll(Long userId); + + Integer updateByProduct(ZhishuShopGoods zhishuShopGoods); + + List selectSheCount(Long depotId); + + List selectFreCount(Long sheId); + + void insertTask(Long depotId, String filename, int count, Long userId); + + ZhishuShopGoods selectPriceByIsbnAndConditionCode(String barcode, String letterCode, Long price); + + ZhishuShopGoods selectartNoByIsbnAndConditionCodeAndArtNo(String barcode, String letterCode, String artNo, Long price, Long userId); + + long selectArtNo(String artNo, Long userId); + + long selectCodeByCodeAndIsbn(String barcode, String letterCode, Long userId); + + long selectUserId(Long userId); + + long selectIsbnCount(Long userId, String barcode); + + /** + * 查询是否存在 + * + * @param isbn ISBN + * @param artNo 货号 + * @param userId 用户id + * @param letterCode 品相 + * @param price 价格 + * @return + */ + long selectCountByIsbnAndArtNoAndUserIdAndBarcode(String isbn, String artNo, String userId, String letterCode, String price); + + void updateShop(ZhishuShopGoods existingGoods); + + void updateInventory(long newInventory, Long userId, String letterCode, String artNo, long price, String barcode); + + Long findBookMsgByISBN(ZhishuShopGoods zhishuShopGoods); + + Integer setExamineBook(ZhishuShopGoods zhishuShopGoods); + + Integer selectGoods(ZhishuShopGoods add); + + List selectFreCount1(@Param("sheCount") List sheCount); + +// void updateBook(ZhishuShopGoods add); + + String selectShopId(String userId, String barcode, String name); + + List selectBySId(Long id); + + List selectShopGoodsByUser(Long userId); + + List selectFreightGoodsNumber(@Param("userId") Long userId, @Param("freightIdList") List freightIdList); + + TDepotVo selectDepotName(Long userId, String depotCode); + + Integer deleteByIds1(Collection ids); + + ZhishuShopGoodsVo selectByIdVo(String id); + + Integer deleteIds(Collection ids); + + String selectArtNoCount(String artNo, Long price); + + String queryByShopId(String shopId); + +// Long selectArtNoCount1(String artNo,Long price); + + Map batchQueryPathByShopIds(List shopIds); + + String selectByBookPic(String id); + + Long selectArtNoCount1(String artNo, Long price, String letterCode); + + void delPubGood(String id); + + Integer selectPubCount(String id); + + Integer insertInventory(@Param("update") ZhishuShopGoods update,@Param("inventory") Long inventory); + + List selectStockLog(String id); + + Page selectShopGoodsByUserPage(Page page, Long userId); + + Page selectShopGoodsByUserPageWithDate( + @Param("page") Page page, + @Param("userId") Long userId, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate + ); + + Long selectDepotIds(String artNo); + + Long selectSheId(Long depotId, String letterCode); + + Long selectFreId(Long sheId, String thirdChar); + + Map selectArt(@Param("userId") String userId,@Param("dcode") String dcode,@Param("scode") String scode,@Param("fcode") String fcode); + + Boolean updateChunkInventory(ZhishuShopGoods update); + + List selectImages(); + + String getSelectArtNo(Long deId, Long shId, Long frId, Long userId); + + Integer batchUpdateartNo(@Param("deId") Long deId,@Param("beartNo") String beartNo,@Param("ids") List ids); + + Page selectShopGoodsByUserPageWithDateArtNo( + @Param("page") Page page, + @Param("userId") Long userId, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate, + @Param("code") String code + ); + + Page selectShopGoodsByUserPageArtNo(Page page, Long userId, String code); + + List selectAllArtNo(Long userId); + + List selectSheCounts(@Param("depotCount")List depotVos); + + Long getTaskDataNum(Long taskId); + + boolean updateByArtNo(ZhishuShopGoodsBo updateBo); + + int updateByArtNoPrefix(@Param("isJoinDistribution") String isJoinDistribution,@Param("artNoPrefix") String artNoPrefix,@Param("userId") Long userId,@Param("limitNum") Long limitNum); + +// @Select("select * from zhishu_shop_goods where isbn = #{barcode} AND condition_code = #{conditionCode}") +// ZhishuShopGoods selectInventory(String barcode, letterCode); + + int selectArtNobyartNo(String artNo, Long userId); + + ZhishuShopGoodsVo selectShopGoodsByShopIdAndPlatformId(@Param("shopId") String shopId,@Param("platformId") String platformId); + + ZhishuShopGoodsVo selectShopGoodsByArtNoAndUserId(@Param("artNo") String artNo,@Param("userId") Long userId); + + ZhishuShopGoodsVo selectShopGoodsByProductId(@Param("productId") String productId,@Param("userId") Long userId); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/CountService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/CountService.java new file mode 100644 index 0000000..6cb41f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/CountService.java @@ -0,0 +1,7 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.Statistic; + +public interface CountService { + Statistic selectStatistic(); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/EmployeeService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/EmployeeService.java new file mode 100644 index 0000000..3b77484 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/EmployeeService.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.EmployeeVo; +import java.util.List; + +public interface EmployeeService { + + List getEmployeeList(String userId); + + Boolean addEmployee(String employeeId, String employeeName, String userId); + + Boolean updateEmployee(String id, String employeeName, String userId); + + Boolean delEmployee(String id, String userId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IAccountService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IAccountService.java new file mode 100644 index 0000000..601bf02 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IAccountService.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.Account; + +public interface IAccountService { + + /** + * 分页查询分润日志表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return + */ + TableDataInfo queryPageList(Account bo, PageQuery pageQuery); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IArtNoMoveService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IArtNoMoveService.java new file mode 100644 index 0000000..45419fd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IArtNoMoveService.java @@ -0,0 +1,4 @@ +package org.dromara.zhishu.service; + +public interface IArtNoMoveService { +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IBookBaseInfoService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IBookBaseInfoService.java new file mode 100644 index 0000000..758c12c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IBookBaseInfoService.java @@ -0,0 +1,136 @@ +package org.dromara.zhishu.service; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.Task; +import org.dromara.zhishu.domain.bo.*; +import org.dromara.zhishu.domain.dto.BookBaseInfoDto; +import org.dromara.zhishu.domain.excel.BaseInfoExcel; +import org.dromara.zhishu.domain.vo.BaseInfoPricingVo; +import org.dromara.zhishu.domain.vo.BookBaseInfoVo; +import org.dromara.zhishu.domain.vo.TaskUrlVo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 基础信息Service接口 + * + * @author Lion Li + * @date 2025-03-08 + */ +public interface IBookBaseInfoService { + + /** + * 查询基础信息 + * + * @param id 主键 + * @return 基础信息 + */ + BookBaseInfoVo queryById(String id); + + + /** + * 分页查询基础信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 基础信息分页列表 + */ + TableDataInfo queryPageList(BookBaseInfoDto bo, BookNumberRageBo number, PageQuery pageQuery); + + /** + * 查询符合条件的基础信息列表 + * + * @param bo 查询条件 + * @return 基础信息列表 + */ + List queryList(BookBaseInfoBo bo); + + /** + * 新增基础信息 + * + * @param bo 基础信息 + * @return 是否新增成功 + */ + Boolean insertByBo(BookBaseInfoBo bo); + + /** + * 修改基础信息 + * + * @param bo 基础信息 + * @return 是否修改成功 + */ + Boolean updateByBo(EditBookInfoBo bo); + + Boolean updateByIsbn(BookBaseInfoBo bo); + + /** + * 校验并批量删除基础信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + /** + * 校验并批量删除基础信息信息 + * + + * @return 是否删除成功 + */ + void importExcel( List list); + + /** + * 校验并批量删除基础信息信息 + * + + * @return 是否删除成功 + */ + Map getList( ); + + BookBaseInfoVo getIsbnInfo(String isbn); + + BookBaseInfoVo getIsbnList(String isbn); + + List getBookListByBookName(String bookName); + + List selectBookPicList(); + + List queryBookPicList(BookBaseInfoBo bo); + + String getpamp(BookBaseInfoBo bo, BookNumberRageBo number, BookBaseInfoDto dto, String page, String per_page); + + int delectByIsbn(String isbn); + + int updateByIllge(IllBaseInfoBo bo); + + TableDataInfo queryPagePricingList(BookBaseInfoDto bo, BookNumberRageBo number, PageQuery pageQuery); + + String pricingLink(BookBaseInfoBo bo, PageQuery pageQuery); + + Map pricingLinkDec(String link); + + Boolean getUserVip(Integer type); + + Map insertTask(TaskBo bo); + + int addNewTask(Task task); + + Map setBalance(); + + void insertUserInfo(UserRechargeBo bo,String title,Integer payType,Integer price); + + Map getImageDite(Long isbn); + + BookBaseInfoVo getBookByIsbn(@NotNull(message = "主键不能为空") String isbn); + + BookBaseInfoVo getBookData(@NotNull(message = "主键不能为空") String isbn); + + TableDataInfo getBookDataByIsbn(String isbn); + + Boolean updateCentBookByIsbn(BookUpdateInfoBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ICourierLogService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ICourierLogService.java new file mode 100644 index 0000000..9e99f6e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ICourierLogService.java @@ -0,0 +1,54 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.CourierLog; +import org.dromara.zhishu.domain.vo.CourierLogVo; +import org.dromara.zhishu.domain.bo.CourierLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 快递日志Service接口 + * + * @author yxy + * @date 2026-03-18 + */ +public interface ICourierLogService { + + /** + * 查询快递日志 + * + * @param id 主键 + * @return 快递日志 + */ + CourierLogVo queryById(Long id); + + /** + * 分页查询快递日志列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 快递日志分页列表 + */ + TableDataInfo queryPageList(CourierLogBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的快递日志列表 + * + * @param bo 查询条件 + * @return 快递日志列表 + */ + List queryList(CourierLogBo bo); + + + /** + * 校验并批量删除快递日志信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IFilterSetService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IFilterSetService.java new file mode 100644 index 0000000..877904a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IFilterSetService.java @@ -0,0 +1,76 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.FilterSetVo; +import org.dromara.zhishu.domain.bo.FilterSetBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 过滤设置Service接口 + * + * @author yxy + * @date 2025-04-14 + */ +public interface IFilterSetService { + + /** + * 查询过滤设置 + * + * @param id 主键 + * @return 过滤设置 + */ + FilterSetVo queryById(Long id); + + /** + * 分页查询过滤设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 过滤设置分页列表 + */ + TableDataInfo queryPageList(FilterSetBo bo, PageQuery pageQuery); + + /** + * 查询过滤库 + * @return + */ + List selectVoListByBo(FilterSetBo bo); + + int deleteTrueById(Long id); + + /** + * 查询符合条件的过滤设置列表 + * + * @param bo 查询条件 + * @return 过滤设置列表 + */ + List queryList(FilterSetBo bo); + + /** + * 新增过滤设置 + * + * @param bo 过滤设置 + * @return 是否新增成功 + */ + Boolean insertByBo(FilterSetBo bo); + + /** + * 修改过滤设置 + * + * @param bo 过滤设置 + * @return 是否修改成功 + */ + Boolean updateByBo(FilterSetBo bo); + + /** + * 校验并批量删除过滤设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IGoofishService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IGoofishService.java new file mode 100644 index 0000000..870cfeb --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IGoofishService.java @@ -0,0 +1,25 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.Shop; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.zhishu.domain.vo.ShopVo; + +/** + * Pdd接口Service + * + * @author yxy + * @date 2025-05-8 + */ +public interface IGoofishService { + + + void goodAdd(ShopVo shop, ZhishuShopGoods zhishuShopGoods, ShopDetailVo vo); + + /** + * 修改商品库存接口 + * itemId 闲鱼 + * number 库存 + */ + void goodUpdateStock(ShopVo shop, String itemId, String number, Integer type); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IOrderExternalGoodsService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IOrderExternalGoodsService.java new file mode 100644 index 0000000..3f98c66 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IOrderExternalGoodsService.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.core.domain.R; +import org.dromara.zhishu.domain.vo.FastMailVo; + +import java.util.Map; + +public interface IOrderExternalGoodsService { + + + /** + * 获取韵达快递单的pdf + * @return + */ + R getYundaPdf(FastMailVo fastMailVo, String erpOrderId, String printTemplateData, String type, String deliveryMode, String orderSn); + + + /** + * 获取中通快递单PDF + * @param fastMailVo + * @param erpOrderId + * @param printTemplateData + * @param type + * @param deliveryMode + * @param orderSn + * @return + */ + R getZtoPdf(FastMailVo fastMailVo, String erpOrderId, String printTemplateData, String type, String deliveryMode, String orderSn); + + + /** + * 创建快递单并获取快递单信息 + * @param fastMailVo + * @param erpOrderId + * @param printTemplateData + * @param type + * @param deliveryMode + * @param orderS + * @return + */ + R orderCreate(FastMailVo fastMailVo, String erpOrderId, String printTemplateData, String type, String deliveryMode, String orderSn); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPddService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPddService.java new file mode 100644 index 0000000..94fde98 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPddService.java @@ -0,0 +1,99 @@ +package org.dromara.zhishu.service; + +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsCatRuleGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsSpecIdGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddMallInfoGetResponse; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.dto.BookPriceInfoDto; +import org.dromara.zhishu.domain.dto.request.BatchSetSoldOutRequest; +import org.dromara.zhishu.domain.vo.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * Pdd接口Service + * + * @author yxy + * @date 2025-03-10 + */ +public interface IPddService { + + /** + * 拉取商品,生成csv文件 + * + * @param shopId 店铺Id + * @param isOnsale 是否在售 + */ + void createShopGoodsList(ShopVo shopVo, TaskBo taskBo, Integer isOnsale); + + /** + * 拉取商品详情,生成csv文件 + * + * @param shopId 店铺Id + * @param isOnsale 是否在售 + */ + void createShopGoodsDetailList(ShopVo shopVo, TaskBo taskBo, Integer isOnsale); + + /** + * 获取拉取的数据 + * + * @param shopId 店铺Id + * @param page 页 + * @param pageSize 每页数量 + * @return 数据 + */ + TableDataInfo> getShopGoodsList(String shopId, String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate, Integer page, Integer pageSize,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode); + + + /** + * 导出 + * @param shopId + * @param isOnsale + * @return + */ + List emport(String shopId, String isOnsale); + /** + * 批量下架 + * + * @param shopId 店铺ID + */ + void batchSetSoldOut(Long shopId); + + /** + * 整店上下架 + */ + void editShopGoodsAllByIsOnSale(ShopVo shopVo,TaskBo taskBo,String isOnSale,String isbn,String priceDown,String priceUp,String startDate,String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode); + + /** + * 通过csv批量翻新商品上架拼多多 + * + * @param file csv文件 + * @param taskBo 任务信息 + * @param shopVo 店铺信息 + */ + void batchRenovateOnSaleByCsv(MultipartFile file, TaskBo taskBo, ShopVo shopVo); + + /** + * 翻新单个商品上架拼多多 + * + * @param data 翻新数据 + * @param shopId 店铺ID + * @param taskId 任务ID + */ + void renovateOnSale(BookPriceInfoDto data, String shopId, String taskId); + + String getSaleTemplateIdByShopId(Long shopId); + + + void sendPddGoodsToTargetShop(String shopId,String targetShopId,TaskBo taskBo,ShopVo shopVo); + + /** + * 根据shopId删除redis中的重复记录 + * @param shopId + * @return + */ + Boolean clearRedisBuffer(String shopId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPriceTemplateService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPriceTemplateService.java new file mode 100644 index 0000000..3c8d1f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPriceTemplateService.java @@ -0,0 +1,74 @@ +package org.dromara.zhishu.service; + +import jakarta.validation.constraints.NotEmpty; +import org.dromara.zhishu.domain.dto.request.CalculatePriceByTemplateRequest; +import org.dromara.zhishu.domain.dto.response.CalculatePriceByTemplateResponse; +import org.dromara.zhishu.domain.vo.PriceTemplateVo; +import org.dromara.zhishu.domain.bo.PriceTemplateBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 价格模板Service接口 + * + * @author yxy + * @date 2025-03-17 + */ +public interface IPriceTemplateService { + + /** + * 查询价格模板 + * + * @param id 主键 + * @return 价格模板 + */ + PriceTemplateVo queryById(Long id); + + /** + * 分页查询价格模板列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 价格模板分页列表 + */ + TableDataInfo queryPageList(PriceTemplateBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的价格模板列表 + * + * @param bo 查询条件 + * @return 价格模板列表 + */ + List queryList(PriceTemplateBo bo); + + /** + * 新增价格模板 + * + * @param bo 价格模板 + * @return 是否新增成功 + */ + Boolean insertByBo(PriceTemplateBo bo); + + /** + * 修改价格模板 + * + * @param bo 价格模板 + * @return 是否修改成功 + */ + Boolean updateByBo(PriceTemplateBo bo); + + /** + * 校验并批量删除价格模板信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + List getPriceByPlatformId(@NotEmpty(message = "价格计算请求不能为空") List requests); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrintTemplateService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrintTemplateService.java new file mode 100644 index 0000000..5772d7e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrintTemplateService.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.PrintTemplateVo; +import org.dromara.zhishu.domain.bo.PrintTemplateBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 打印模板Service接口 + * + * @author yxy + * @date 2026-03-07 + */ +public interface IPrintTemplateService { + + /** + * 查询打印模板 + * + * @param id 主键 + * @return 打印模板 + */ + PrintTemplateVo queryById(Long id); + + /** + * 分页查询打印模板列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 打印模板分页列表 + */ + TableDataInfo queryPageList(PrintTemplateBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的打印模板列表 + * + * @param bo 查询条件 + * @return 打印模板列表 + */ + List queryList(PrintTemplateBo bo); + + /** + * 新增打印模板 + * + * @param bo 打印模板 + * @return 是否新增成功 + */ + Boolean insertByBo(PrintTemplateBo bo); + + /** + * 修改打印模板 + * + * @param bo 打印模板 + * @return 是否修改成功 + */ + Boolean updateByBo(PrintTemplateBo bo); + + /** + * 校验并批量删除打印模板信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrinterService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrinterService.java new file mode 100644 index 0000000..05c6c48 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IPrinterService.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.PrinterVo; +import org.dromara.zhishu.domain.bo.PrinterBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 打印机设置Service接口 + * + * @author yxy + * @date 2026-03-06 + */ +public interface IPrinterService { + + /** + * 查询打印机设置 + * + * @param id 主键 + * @return 打印机设置 + */ + PrinterVo queryById(Long id); + + /** + * 分页查询打印机设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 打印机设置分页列表 + */ + TableDataInfo queryPageList(PrinterBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的打印机设置列表 + * + * @param bo 查询条件 + * @return 打印机设置列表 + */ + List queryList(PrinterBo bo); + + /** + * 新增打印机设置 + * + * @param bo 打印机设置 + * @return 是否新增成功 + */ + Boolean insertByBo(PrinterBo bo); + + /** + * 修改打印机设置 + * + * @param bo 打印机设置 + * @return 是否修改成功 + */ + Boolean updateByBo(PrinterBo bo); + + /** + * 校验并批量删除打印机设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IProfitSharingLogService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IProfitSharingLogService.java new file mode 100644 index 0000000..ce3e592 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IProfitSharingLogService.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.ProfitSharingLog; + +public interface IProfitSharingLogService { + + /** + * 分页查询分润日志表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return + */ + TableDataInfo queryPageList(ProfitSharingLog bo, PageQuery pageQuery); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningLogFileService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningLogFileService.java new file mode 100644 index 0000000..2aac20e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningLogFileService.java @@ -0,0 +1,75 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.RunningLogFileVo; +import org.dromara.zhishu.domain.bo.RunningLogFileBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 程序运行日志表Service接口 + * + * @author yxy + * @date 2025-06-12 + */ +public interface IRunningLogFileService { + + /** + * 查询程序运行日志表 + * + * @param id 主键 + * @return 程序运行日志表 + */ + RunningLogFileVo queryById(Long id); + + /** + * 根据文件类型获取最大顺序 + * @param fileType + * @return + */ + String selectMaxFileOrderByFileTypeAndCreateBy(String fileType,String userId); + + /** + * 分页查询程序运行日志表列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 程序运行日志表分页列表 + */ + TableDataInfo queryPageList(RunningLogFileBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的程序运行日志表列表 + * + * @param bo 查询条件 + * @return 程序运行日志表列表 + */ + List queryList(RunningLogFileBo bo); + + /** + * 新增程序运行日志表 + * + * @param bo 程序运行日志表 + * @return 是否新增成功 + */ + Boolean insertByBo(RunningLogFileBo bo); + + /** + * 修改程序运行日志表 + * + * @param bo 程序运行日志表 + * @return 是否修改成功 + */ + Boolean updateByBo(RunningLogFileBo bo); + + /** + * 校验并批量删除程序运行日志表信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningTaskByShopService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningTaskByShopService.java new file mode 100644 index 0000000..0b4c546 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IRunningTaskByShopService.java @@ -0,0 +1,137 @@ +package org.dromara.zhishu.service; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.domain.dto.ErpGoodsDto; +import org.dromara.zhishu.domain.dto.RunningTaskShopGoodsDto; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.dto.SuccessDataKfz; +import org.dromara.zhishu.domain.vo.RunningTaskNumVo; + +import java.util.List; +import java.util.Map; + +/** + * 执行的任务Service接口 + * + * @author yxy + * @date 2025-8-5 + */ +public interface IRunningTaskByShopService { + + + List selectGetShopGoodsList(String tableName,String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate, Long pageNum, Long pageSize,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode); + + int selectGetShopGoodsListCount(String tableName,String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode); + + List selectGetShopGoodsListByDto(RunningTaskShopGoodsDto runningTaskShopGoodsDto); + + + /** + * 查询重复数据根据 isbn和价格 + * @param tableName + * @param isbn + * @return + */ + int selectNumByIsbn(String tableName, String isbn); + + int selectGetShopGoodsNum(String tableName,String isOnSale,String isbn,String priceDown,String priceUp,String startDate,String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode); + + int delShopGoods(String tableName,String isOnSale,String isbn,String priceDown,String priceUp,String startDate,String endDate); + + int selectByTrilateralId(String tableName,String trilateralId); + + RunningTask selectVoByTrilateralId(String tableName,String trilateralId); + + String selectLastFinishTime(String tableName); + + List selectByIsbn(String tableName,String isbn); + + List selectTaskShopNum(String tableName,Long taskId); + + int selectGetShopGoodsNumByTasKId(String tableName, String taskId); + + String selectStatus(String tableName); + + + /** + * 不分页查询重复数据 + * @param tableName + * @return + */ + List selectRepeatNoPage(String tableName); + + + List selectShopGoodsList(ErpGoodsDto erpGoodsDto); + + /** + * kfz专用导出店铺商品数据 + * @param erpGoodsDto + * @return + */ + List selectKfzShopGoodsList(ErpGoodsDto erpGoodsDto); + + /** + * 分页查询重复数据 + * @param tableName + * @param pageNum + * @param pageSize + * @return + */ + Page selectRepeat(String tableName, Long pageNum, Long pageSize); + + // 检查表是否存在 + int checkTableExists(String tableName); + + // 创建表 + void createTable(String tableName); + + // 插入数据 + void insert(String tableName, RunningTask task); + + //修改语句 + void update(String tableName, RunningTask task); + + void batchInsert(String tableName, List list); + + + void updateStatus(String tableName); + + void deleteAll(String tableName); + + void deleteByStatus(String tableName,String status); + + void deleteByTaskId(String tableName,String taskId); + + void deleteByGoodsId(String tableName,String goodsId); + + List selectOnSaleGoodsId(String tableName); + + List selectByGoodsId(String tableName, String trilateralId); + + void updateSuccessDataById( String tableName, String id, String successDataJsonStr); + + List getShopGoodsList(String tableName); + + Integer getShopGoodsTotalNum(String tableName); + + Integer getShopGoodsTotalNumByTaskId(String tableName,Long taskId); + + // Mapper接口 + Map batchCheckGoodsIdExists(String tableName, List goodsIds); + + Map selectTodayGoods(List shopId); + + Map selectTodaySales(List shopId); + List selectGetShopGoodsListAll(String tableName,String isOnsale, Long pageNum, Long pageSize); + Integer countAll(String tableName); + + /** + * 批量查询goods_id是否存在,返回存在的goods_id列表 + * @param tableName + * @param goodsIds + * @return + */ + List batchSelectExistsByGoodsIds(String tableName,List goodsIds); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopContextService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopContextService.java new file mode 100644 index 0000000..1e07b28 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopContextService.java @@ -0,0 +1,70 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.ShopContextVo; +import org.dromara.zhishu.domain.bo.ShopContextBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 店铺设置商品描述Service接口 + * + * @author yxy + * @date 2025-09-30 + */ +public interface IShopContextService { + + /** + * 查询店铺设置商品描述 + * + * @param id 主键 + * @return 店铺设置商品描述 + */ + ShopContextVo queryById(Long id); + + ShopContextVo selectByShopId(Long shopId); + + /** + * 分页查询店铺设置商品描述列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 店铺设置商品描述分页列表 + */ + TableDataInfo queryPageList(ShopContextBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的店铺设置商品描述列表 + * + * @param bo 查询条件 + * @return 店铺设置商品描述列表 + */ + List queryList(ShopContextBo bo); + + /** + * 新增店铺设置商品描述 + * + * @param bo 店铺设置商品描述 + * @return 是否新增成功 + */ + Boolean insertByBo(ShopContextBo bo); + + /** + * 修改店铺设置商品描述 + * + * @param bo 店铺设置商品描述 + * @return 是否修改成功 + */ + Boolean updateByBo(ShopContextBo bo); + + /** + * 校验并批量删除店铺设置商品描述信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopDetailService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopDetailService.java new file mode 100644 index 0000000..dc89842 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopDetailService.java @@ -0,0 +1,86 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.zhishu.domain.bo.ShopDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; +import java.util.List; + +/** + * 商品详情Service接口 + * + * @author yxy + * @date 2025-03-13 + */ +public interface IShopDetailService { + + /** + * 查询商品详情 + * + * @param id 主键 + * @return 商品详情 + */ + ShopDetailVo queryById(Long id); + + /** + * 查询店铺设置信息 + * @param shopId 店铺id + * @return + */ + ShopDetailVo queryByShopId(Long shopId); + + /** + * 分页查询商品详情列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品详情分页列表 + */ + TableDataInfo queryPageList(ShopDetailBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的商品详情列表 + * + * @param bo 查询条件 + * @return 商品详情列表 + */ + List queryList(ShopDetailBo bo); + + /** + * 新增商品详情 + * + * @param bo 商品详情 + * @return 是否新增成功 + */ + Boolean insertByBo(ShopDetailBo bo); + + /** + * 修改商品详情 + * + * @param bo 商品详情 + * @return 是否修改成功 + */ + Boolean updateByBo(ShopDetailBo bo); + + /** + * 校验并批量删除商品详情信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + UploadResult upload(MultipartFile file); + + /** + * 根据店铺ID获取价格模板ID + * @param shopId 店铺ID + * @return 价格模板ID,如果不存在返回null + */ + String selectSaleTemplateIdByShopId(Long shopId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopImgService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopImgService.java new file mode 100644 index 0000000..ccb4f74 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopImgService.java @@ -0,0 +1,84 @@ +package org.dromara.zhishu.service; + +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.vo.ShopImgVo; +import org.dromara.zhishu.domain.bo.ShopImgBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 店铺图片Service接口 + * + * @author yxy + * @date 2025-03-17 + */ +public interface IShopImgService { + + /** + * 查询店铺图片 + * + * @param id 主键 + * @return 店铺图片 + */ + ShopImgVo queryById(Long id); + + /** + * 根据店铺id查询店铺图片 + * @param pid + * @return + */ + List selectVoByShopId(String pid); + + /** + * 分页查询店铺图片列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 店铺图片分页列表 + */ + TableDataInfo queryPageList(ShopImgBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的店铺图片列表 + * + * @param bo 查询条件 + * @return 店铺图片列表 + */ + List queryList(ShopImgBo bo); + + /** + * 新增店铺图片 + * + * @param bo 店铺图片 + * @return 是否新增成功 + */ + Boolean insertByBo(ShopImgBo bo); + + /** + * 修改店铺图片 + * + * @param bo 店铺图片 + * @return 是否修改成功 + */ + Boolean updateByBo(ShopImgBo bo); + + /** + * 校验并批量删除店铺图片信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * + * @param pid 父id + * @param type 类型 1封面水印 2商详水印 3 商详头图 4 商详尾图 5 轮播尾图 + * @return + */ + int deleteByPidAndType(@Param("pid") String pid, @Param("type") String type); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseAutoService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseAutoService.java new file mode 100644 index 0000000..c3878aa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseAutoService.java @@ -0,0 +1,64 @@ +package org.dromara.zhishu.service; + + +import org.dromara.zhishu.domain.ShopWarehouseAuto; + +import java.util.List; + +/** + * + * @author yxy + * @date 2026-06-05 + */ +public interface IShopWarehouseAutoService { + + /** + * 查询店铺与仓库自动发布关联 + * + * @param id 主键 + * @return 店铺与仓库自动发布关联 + */ + ShopWarehouseAuto queryById(Long id); + + + /** + * 查询列表 + * @param bo + * @return + */ + List queryList(ShopWarehouseAuto bo); + + /** + * 根据店铺ID查询关联列表 + * + * @param shopId 店铺ID + * @return 关联列表 + */ + List queryListByShopId(Long shopId); + + + + /** + * 新增店铺与仓库自动发布关联 + * + * @param bo 店铺与仓库自动发布关联 + * @return 是否新增成功 + */ + Boolean insertByBo(ShopWarehouseAuto bo); + + /** + * 修改店铺与仓库自动发布关联 + * + * @param bo 店铺与仓库自动发布关联 + * @return 是否修改成功 + */ + Boolean updateByBo(ShopWarehouseAuto bo); + + /** + * 根据店铺ID删除关联信息 + * + * @param shopId 店铺ID + * @return 是否删除成功 + */ + Boolean deleteByShopId(Long shopId); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseService.java new file mode 100644 index 0000000..c55b5ac --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IShopWarehouseService.java @@ -0,0 +1,59 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.ShopWarehouseVo; +import org.dromara.zhishu.domain.bo.ShopWarehouseBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.zhishu.domain.ShopWarehouse; + +import java.util.Collection; +import java.util.List; + +/** + * 店铺与仓库自动发布关联Service接口 + * + * @author yxy + * @date 2025-12-28 + */ +public interface IShopWarehouseService { + + /** + * 查询店铺与仓库自动发布关联 + * + * @param id 主键 + * @return 店铺与仓库自动发布关联 + */ + ShopWarehouseVo queryById(Long id); + + /** + * 根据店铺ID查询关联列表 + * + * @param shopId 店铺ID + * @return 关联列表 + */ + List queryListByShopId(Long shopId); + + /** + * 新增店铺与仓库自动发布关联 + * + * @param bo 店铺与仓库自动发布关联 + * @return 是否新增成功 + */ + Boolean insertByBo(ShopWarehouseBo bo); + + /** + * 修改店铺与仓库自动发布关联 + * + * @param bo 店铺与仓库自动发布关联 + * @return 是否修改成功 + */ + Boolean updateByBo(ShopWarehouseBo bo); + + /** + * 根据店铺ID删除关联信息 + * + * @param shopId 店铺ID + * @return 是否删除成功 + */ + Boolean deleteByShopId(Long shopId); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISpecService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISpecService.java new file mode 100644 index 0000000..b72c99b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISpecService.java @@ -0,0 +1,70 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.SpecVo; +import org.dromara.zhishu.domain.bo.SpecBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自定义规格设置Service接口 + * + * @author yxy + * @date 2025-03-27 + */ +public interface ISpecService { + + /** + * 查询自定义规格设置 + * + * @param id 主键 + * @return 自定义规格设置 + */ + SpecVo queryById(Long id); + + SpecVo selectVoByShopId(Long shopId); + + /** + * 分页查询自定义规格设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 自定义规格设置分页列表 + */ + TableDataInfo queryPageList(SpecBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的自定义规格设置列表 + * + * @param bo 查询条件 + * @return 自定义规格设置列表 + */ + List queryList(SpecBo bo); + + /** + * 新增自定义规格设置 + * + * @param bo 自定义规格设置 + * @return 是否新增成功 + */ + Boolean insertByBo(SpecBo bo); + + /** + * 修改自定义规格设置 + * + * @param bo 自定义规格设置 + * @return 是否修改成功 + */ + Boolean updateByBo(SpecBo bo); + + /** + * 校验并批量删除自定义规格设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISyncLogService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISyncLogService.java new file mode 100644 index 0000000..2ed3cee --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISyncLogService.java @@ -0,0 +1,54 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.SyncLog; + +import java.util.List; + +/** + * 迁移日志Service接口 + * + * @author yxy + * @date 2026-06-06 + */ +public interface ISyncLogService { + + /** + * 根据ID查询迁移日志 + * + * @param id 主键 + * @return 迁移日志 + */ + SyncLog queryById(Long id); + + /** + * 查询迁移日志列表 + * + * @param bo 查询条件 + * @return 迁移日志列表 + */ + List queryList(SyncLog bo); + + /** + * 新增迁移日志 + * + * @param bo 迁移日志 + * @return 是否新增成功 + */ + Boolean insertByBo(SyncLog bo); + + /** + * 修改迁移日志 + * + * @param bo 迁移日志 + * @return 是否修改成功 + */ + Boolean updateByBo(SyncLog bo); + + /** + * 根据ID删除迁移日志 + * + * @param id 主键 + * @return 是否删除成功 + */ + Boolean deleteById(Long id); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISynchronizationShopLogService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISynchronizationShopLogService.java new file mode 100644 index 0000000..297737f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ISynchronizationShopLogService.java @@ -0,0 +1,44 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.SynchronizationShopLogVo; +import org.dromara.zhishu.domain.bo.SynchronizationShopLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.List; +import java.util.Map; + +/** + * 同步店铺商品库存日志Service接口 + * + * @author yxy + * @date 2026-04-14 + */ +public interface ISynchronizationShopLogService { + + /** + * 查询同步店铺商品库存日志 + * + * @param id 主键 + * @return 同步店铺商品库存日志 + */ + SynchronizationShopLogVo queryById(Long id); + + /** + * 分页查询同步店铺商品库存日志列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 同步店铺商品库存日志分页列表 + */ + TableDataInfo> queryPageList(SynchronizationShopLogBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的同步店铺商品库存日志列表 + * + * @param bo 查询条件 + * @return 同步店铺商品库存日志列表 + */ + List queryList(SynchronizationShopLogBo bo); + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITAuditService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITAuditService.java new file mode 100644 index 0000000..7e809af --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITAuditService.java @@ -0,0 +1,72 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.TAuditVo; +import org.dromara.zhishu.domain.bo.TAuditBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 审核Service接口 + * + * @author Lion Li + * @date 2025-04-01 + */ +public interface ITAuditService { + + /** + * 查询审核 + * + * @param id 主键 + * @return 审核 + */ + TAuditVo queryById(Long id); + + /** + * 分页查询审核列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 审核分页列表 + */ + TableDataInfo queryPageList(TAuditBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的审核列表 + * + * @param bo 查询条件 + * @return 审核列表 + */ + List queryList(TAuditBo bo); + + /** + * 新增审核 + * + * @param bo 审核 + * @return 是否新增成功 + */ + Boolean insertByBo(TAuditBo bo); + + /** + * 修改审核 + * + * @param bo 审核 + * @return 是否修改成功 + */ + Boolean updateByBo(TAuditBo bo); + + /** + * 校验并批量删除审核信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + int updateByStatus(TAuditBo bo); + + Integer InsertLog(TAuditBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITBookAuditService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITBookAuditService.java new file mode 100644 index 0000000..c7cf5e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITBookAuditService.java @@ -0,0 +1,70 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.TBookAuditVo; +import org.dromara.zhishu.domain.bo.TBookAuditBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 图书审核管理Service接口 + * + * @author Lion Li + * @date 2025-04-18 + */ +public interface ITBookAuditService { + + /** + * 查询图书审核管理 + * + * @param id 主键 + * @return 图书审核管理 + */ + TBookAuditVo queryById(Long id); + + /** + * 分页查询图书审核管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 图书审核管理分页列表 + */ + TableDataInfo queryPageList(TBookAuditBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的图书审核管理列表 + * + * @param bo 查询条件 + * @return 图书审核管理列表 + */ + List queryList(TBookAuditBo bo); + + /** + * 新增图书审核管理 + * + * @param bo 图书审核管理 + * @return 是否新增成功 + */ + Boolean insertByBo(TBookAuditBo bo); + + /** + * 修改图书审核管理 + * + * @param bo 图书审核管理 + * @return 是否修改成功 + */ + Boolean updateByBo(TBookAuditBo bo); + + /** + * 校验并批量删除图书审核管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Boolean updateStatus(TBookAuditBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITDistrictService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITDistrictService.java new file mode 100644 index 0000000..59cad6a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITDistrictService.java @@ -0,0 +1,82 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.bo.TDistrictBo; +import org.dromara.zhishu.domain.vo.DistrictsVo; +import org.dromara.zhishu.domain.vo.TDistrictVo; + +import java.util.Collection; +import java.util.List; + +public interface ITDistrictService { + + /** + * 查询【请填写功能名称】 + * + * @param id 主键 + * @return 【请填写功能名称】 + */ + TDistrictVo queryById(Long id); + + /** + * 分页查询【请填写功能名称】列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 【请填写功能名称】分页列表 + */ + TableDataInfo queryPageList(TDistrictBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的【请填写功能名称】列表 + * + * @param bo 查询条件 + * @return 【请填写功能名称】列表 + */ + List queryList(TDistrictBo bo); + + /** + * 新增【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否新增成功 + */ + Boolean insertByBo(TDistrictBo bo); + + /** + * 修改【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否修改成功 + */ + Boolean updateByBo(TDistrictBo bo); + + /** + * 校验并批量删除【请填写功能名称】信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List selectList(); + + List selectDistrictByPid(String pid); + + + List selectCityList(TDistrictVo vo); + + List selectAreaList(TDistrictVo vo); + + /** + * 查询地址数据 + * + * @param vo + * @return + */ + List selectDistricts(TDistrictVo vo); + + List queryListByName(List districtNames); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITFreightService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITFreightService.java new file mode 100644 index 0000000..11ae68b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITFreightService.java @@ -0,0 +1,96 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.bo.TFreightBo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 三级货区管理Service接口 + * + * @author Lion Li + * @date 2025-04-19 + */ +public interface ITFreightService { + + List selectDepotTree(); + + /** + * 根据二级货区id获取三级货区 + * @param shelvesId + * @return + */ + List selectByShelvesId(Long shelvesId); + + /** + * 根据货区id获取 一级二级三级货区的编号和id + * @param freightId + * @return + */ + Map selectByFreightId(Long freightId); + /** + * 查询三级货区管理 + * + * @param id 主键 + * @return 三级货区管理 + */ + TFreightVo queryById(Long id); + + /** + * 分页查询三级货区管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 三级货区管理分页列表 + */ + TableDataInfo queryPageList(TFreightBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的三级货区管理列表 + * + * @param bo 查询条件 + * @return 三级货区管理列表 + */ + List queryList(TFreightBo bo); + + /** + * 新增三级货区管理 + * + * @param bo 三级货区管理 + * @return 是否新增成功 + */ + TFreightBo insertByBo(TFreightBo bo); + + /** + * 修改三级货区管理 + * + * @param bo 三级货区管理 + * @return 是否修改成功 + */ + Boolean updateByBo(TFreightBo bo); + + /** + * 校验并批量删除三级货区管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid,Long LocalUserId); + + List querySheNameList(); + + /** + * 根据三级获取名称获取获取信息 + * @param freightName + * @param shelvesId + * @return + */ + TFreightVo selectByFreightName(String freightName, Long shelvesId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteCodeService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteCodeService.java new file mode 100644 index 0000000..e63308a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteCodeService.java @@ -0,0 +1,65 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.TInviteCode; +import org.dromara.zhishu.domain.bo.InviteCodeBo; +import org.dromara.zhishu.domain.vo.InviteCodeVo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +import java.util.List; + +/** + * 邀请码 Service 接口 + */ +public interface ITInviteCodeService { + + /** + * 查询邀请码 + * + * @param id 邀请码主键 + * @return 邀请码 + */ + InviteCodeVo queryById(Long id); + + /** + * 查询邀请码列表 + * + * @param userId 用户ID + * @return 邀请码列表 + */ + List queryListByUserId(Long userId); + + /** + * 查询邀请码分页列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 邀请码分页列表 + */ + TableDataInfo queryPageList(InviteCodeBo bo, PageQuery pageQuery); + + /** + * 生成邀请码 + * + * @param bo 邀请码信息 + * @return 邀请码 + */ + int generateInviteCode(InviteCodeBo bo); + + /** + * 验证邀请码 + * + * @param code 邀请码 + * @return 邀请码信息,如果无效则返回null + */ + TInviteCode validateInviteCode(String code); + + /** + * 使用邀请码 + * + * @param code 邀请码 + * @param inviteeId 被邀请人ID + * @return 是否使用成功 + */ + boolean useInviteCode(String code, Long inviteeId); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteRelationsService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteRelationsService.java new file mode 100644 index 0000000..ada50fa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITInviteRelationsService.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.service; + + +import org.dromara.zhishu.domain.TInviteRelations; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.TInviteRelationsVo; + +import java.util.List; + +public interface ITInviteRelationsService { + + List selectByInviterId(Long inviterId); + + List selectUserShopList(Long userId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShelvesService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShelvesService.java new file mode 100644 index 0000000..7e330c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShelvesService.java @@ -0,0 +1,79 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.bo.TShelvesBo; +import org.dromara.zhishu.domain.vo.TShelvesVo; + +import java.util.Collection; +import java.util.List; + +/** + * 货架信息Service接口 + * + * @author Lion Li + * @date 2025-03-26 + */ +public interface ITShelvesService { + + /** + * 查询货架信息 + * + * @param id 主键 + * @return 货架信息 + */ + TShelvesVo queryById(Long id); + + /** + * + */ + TShelvesVo queryFoundId(Long depotId, String code); + + /** + * 分页查询货架信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 货架信息分页列表 + */ + TableDataInfo queryPageList(TShelvesBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的货架信息列表 + * + * @param bo 查询条件 + * @return 货架信息列表 + */ + List queryList(TShelvesBo bo); + + /** + * 新增货架信息 + * + * @param bo 货架信息 + * @return 是否新增成功 + */ + Boolean insertByBo(TShelvesBo bo); + + /** + * 修改货架信息 + * + * @param bo 货架信息 + * @return 是否修改成功 + */ + Boolean updateByBo(TShelvesBo bo); + + /** + * 校验并批量删除货架信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid,Long LocalUserId); + + List queryList1(); + + List selectShelvesIdByDepotIdAndCode(String depotId, String code); + + List selectShelvesByDepotId(String depotId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShopDepotAotuService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShopDepotAotuService.java new file mode 100644 index 0000000..0b6ff18 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITShopDepotAotuService.java @@ -0,0 +1,43 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.TShopDepotAotuVo; +import org.dromara.zhishu.domain.bo.TShopDepotAotuBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 店铺自动发布仓库关联Service接口 + * + * @author Lion Li + * @date 2025-09-05 + */ +public interface ITShopDepotAotuService { + + /** + * 查询店铺自动发布仓库关联 + * + * @param id 主键 + * @return 店铺自动发布仓库关联 + */ + TShopDepotAotuVo queryById(Long id); + + /** + * 分页查询店铺自动发布仓库关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 店铺自动发布仓库关联分页列表 + */ + TableDataInfo queryPageList(TShopDepotAotuBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的店铺自动发布仓库关联列表 + * + * @param bo 查询条件 + * @return 店铺自动发布仓库关联列表 + */ + List queryList(TShopDepotAotuBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITUserPlatformService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITUserPlatformService.java new file mode 100644 index 0000000..70a8452 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITUserPlatformService.java @@ -0,0 +1,8 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.TUserPlatform; + +public interface ITUserPlatformService { + + void insertTUserPlatform(TUserPlatform userPlatform); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITaskPauseService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITaskPauseService.java new file mode 100644 index 0000000..72de53b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ITaskPauseService.java @@ -0,0 +1,20 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.TaskPause; + + +public interface ITaskPauseService { + + /** + * 新增暂停任务 + * + */ + Boolean insert(TaskPause taskPause); + + /** + * 删除暂停任务 + * @param taskId + * @return + */ + Boolean deleteByTaskId(Long taskId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserAccountService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserAccountService.java new file mode 100644 index 0000000..096d579 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserAccountService.java @@ -0,0 +1,75 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.UserAccountVo; +import org.dromara.zhishu.domain.bo.UserAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 账号管理Service接口 + * + * @author yxy + * @date 2026-02-25 + */ +public interface IUserAccountService { + + /** + * 查询账号管理 + * + * @param id 主键 + * @return 账号管理 + */ + UserAccountVo queryById(Long id); + + /** + * 分页查询账号管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 账号管理分页列表 + */ + TableDataInfo queryPageList(UserAccountBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的账号管理列表 + * + * @param bo 查询条件 + * @return 账号管理列表 + */ + List queryList(UserAccountBo bo); + + /** + * 查询管理员下的账户 + * @param bo + * @return + */ + List queryListAdmin(UserAccountBo bo); + + /** + * 新增账号管理 + * + * @param bo 账号管理 + * @return 是否新增成功 + */ + Boolean insertByBo(UserAccountBo bo); + + /** + * 修改账号管理 + * + * @param bo 账号管理 + * @return 是否修改成功 + */ + Boolean updateByBo(UserAccountBo bo); + + /** + * 校验并批量删除账号管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserRechargeService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserRechargeService.java new file mode 100644 index 0000000..4b01563 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IUserRechargeService.java @@ -0,0 +1,88 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.core.domain.R; +import org.dromara.zhishu.domain.vo.UserRechargeVo; +import org.dromara.zhishu.domain.bo.UserRechargeBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.web.bind.annotation.RequestBody; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 用户充值Service接口 + * + * @author yxy + * @date 2025-04-26 + */ +public interface IUserRechargeService { + + /** + * 查询用户充值 + * + * @param id 主键 + * @return 用户充值 + */ + UserRechargeVo queryById(Long id); + + /** + * 分页查询用户充值列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 用户充值分页列表 + */ + TableDataInfo queryPageList(UserRechargeBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的用户充值列表 + * + * @param bo 查询条件 + * @return 用户充值列表 + */ + List queryList(UserRechargeBo bo); + + /** + * 新增用户充值 + * + * @param bo 用户充值 + * @return 是否新增成功 + */ + Boolean insertByBo(UserRechargeBo bo); + + /** + * 修改用户充值 + * + * @param bo 用户充值 + * @return 是否修改成功 + */ + Boolean updateByBo(UserRechargeBo bo); + + /** + * 校验并批量删除用户充值信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 充值金额到钱包里 + * @return + */ + R addUserBalance(UserRechargeBo bo); + + /** + * 余额支付 + * @param userId + * @param shopId + * @param logType + * @param rechargPrice + * @return + */ + R balancePayment(Long userId, Long shopId, int logType, BigDecimal rechargPrice); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IViolationService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IViolationService.java new file mode 100644 index 0000000..bf22e7e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IViolationService.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.ViolationVo; +import org.dromara.zhishu.domain.bo.ViolationBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 违规Service接口 + * + * @author yxy + * @date 2025-06-23 + */ +public interface IViolationService { + + /** + * 查询违规 + * + * @param id 主键 + * @return 违规 + */ + ViolationVo queryById(Long id); + + /** + * 分页查询违规列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 违规分页列表 + */ + TableDataInfo queryPageList(ViolationBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的违规列表 + * + * @param bo 查询条件 + * @return 违规列表 + */ + List queryList(ViolationBo bo); + + /** + * 新增违规 + * + * @param bo 违规 + * @return 是否新增成功 + */ + Boolean insertByBo(ViolationBo bo); + + /** + * 修改违规 + * + * @param bo 违规 + * @return 是否修改成功 + */ + Boolean updateByBo(ViolationBo bo); + + /** + * 校验并批量删除违规信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWarehouseSettingsService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWarehouseSettingsService.java new file mode 100644 index 0000000..e87b689 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWarehouseSettingsService.java @@ -0,0 +1,76 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.WarehouseSettings; +import org.dromara.zhishu.domain.vo.WarehouseSettingsVo; +import org.dromara.zhishu.domain.bo.WarehouseSettingsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 设置Service接口 + * + * @author yxy + * @date 2025-12-19 + */ +public interface IWarehouseSettingsService { + + /** + * 查询设置 + * + * @param id 主键 + * @return 设置 + */ + WarehouseSettingsVo queryById(Long id); + + /** + * 分页查询设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设置分页列表 + */ + TableDataInfo queryPageList(WarehouseSettingsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设置列表 + * + * @param bo 查询条件 + * @return 设置列表 + */ + List queryList(WarehouseSettingsBo bo); + + /** + * 新增设置 + * + * @param bo 设置 + * @return 是否新增成功 + */ + Boolean insertByBo(WarehouseSettingsBo bo); + + /** + * 修改设置 + * + * @param bo 设置 + * @return 是否修改成功 + */ + Boolean updateByBo(WarehouseSettingsBo bo); + + /** + * 修改启用状态 + * @param bo + * @return + */ + Boolean updateStatus(WarehouseSettingsBo bo); + + /** + * 校验并批量删除设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveDetailService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveDetailService.java new file mode 100644 index 0000000..91707d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveDetailService.java @@ -0,0 +1,30 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.dto.WaveDetailRequestDto; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * 波次信息Service接口 + * + * @author Lion Li + * @date 2026-01-22 + */ +public interface IWaveDetailService { + + /** + * 新增波次信息 + * + * @param requestDto 波次信息请求DTO + * @return 是否新增成功 + */ + Boolean insertWaveDetail(String userid, WaveDetailRequestDto requestDto); + + /** + * 获取波次ID + */ + Long getWaveID(); + + String getEmployeeId(String name, String userId); + + Boolean countVerWave(String waveId, String employeeId, Integer submitCount); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveService.java new file mode 100644 index 0000000..6459ebf --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWaveService.java @@ -0,0 +1,13 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.WaveVo; + +import java.util.List; + +public interface IWaveService { + String getStaffName(String staffId); + + List getStaffId(); + + List getStaffList(String userId); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWhiteListService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWhiteListService.java new file mode 100644 index 0000000..720b1a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IWhiteListService.java @@ -0,0 +1,77 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.WhiteListVo; +import org.dromara.zhishu.domain.bo.WhiteListBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 白名单Service接口 + * + * @author yxy + * @date 2025-06-25 + */ +public interface IWhiteListService { + + /** + * 查询白名单 + * + * @param id 主键 + * @return 白名单 + */ + WhiteListVo queryById(Long id); + + /** + * 分页查询白名单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 白名单分页列表 + */ + TableDataInfo queryPageList(WhiteListBo bo, PageQuery pageQuery); + + + List selectAll(); + + List selectByIp(String ip); + /** + * 查询符合条件的白名单列表 + * + * @param bo 查询条件 + * @return 白名单列表 + */ + List queryList(WhiteListBo bo); + + /** + * 新增白名单 + * + * @param bo 白名单 + * @return 是否新增成功 + */ + Boolean insertByBo(WhiteListBo bo); + + /** + * 修改白名单 + * + * @param bo 白名单 + * @return 是否修改成功 + */ + Boolean updateByBo(WhiteListBo bo); + + /** + * 校验并批量删除白名单信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 清空数据表 + */ + void deleteAll(); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyBindService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyBindService.java new file mode 100644 index 0000000..cd537a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyBindService.java @@ -0,0 +1,14 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.bo.XyBindBo; +import org.dromara.zhishu.domain.vo.XyBindVo; + +public interface IXyBindService { + XyBindVo queryById(String token); + TableDataInfo queryPageList(XyBindBo bo, PageQuery pageQuery); + Boolean insertByBo(XyBindBo bo); + Boolean updateByBo(XyBindBo bo); + Boolean deleteByToken(String token); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyCategoryService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyCategoryService.java new file mode 100644 index 0000000..1ef3d3e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IXyCategoryService.java @@ -0,0 +1,12 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.XyCategoryVo; + +import java.util.List; + +public interface IXyCategoryService { + /** + * 查询闲鱼类目列表 + */ + List selectXyCategoryList(); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsDetailService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsDetailService.java new file mode 100644 index 0000000..783dbc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsDetailService.java @@ -0,0 +1,77 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsDetailVo; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商品信息补全表Service接口 + * + * @author yxy + * @date 2025-06-13 + */ +public interface IZhishuShopGoodsDetailService { + + /** + * 查询商品信息补全表 + * + * @param id 主键 + * @return 商品信息补全表 + */ + ZhishuShopGoodsDetailVo queryById(Long id); + + /** + * 根据父id查询信息 + * @param pid + * @return + */ + ZhishuShopGoodsDetailVo selectByPid(Long pid); + + + + /** + * 分页查询商品信息补全表列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品信息补全表分页列表 + */ + TableDataInfo queryPageList(ZhishuShopGoodsDetailBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的商品信息补全表列表 + * + * @param bo 查询条件 + * @return 商品信息补全表列表 + */ + List queryList(ZhishuShopGoodsDetailBo bo); + + /** + * 新增商品信息补全表 + * + * @param bo 商品信息补全表 + * @return 是否新增成功 + */ + Boolean insertByBo(ZhishuShopGoodsDetailBo bo); + + /** + * 修改商品信息补全表 + * + * @param bo 商品信息补全表 + * @return 是否修改成功 + */ + Boolean updateByBo(ZhishuShopGoodsDetailBo bo); + + /** + * 校验并批量删除商品信息补全表信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsService.java new file mode 100644 index 0000000..14d1b77 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopGoodsService.java @@ -0,0 +1,292 @@ +package org.dromara.zhishu.service; + +import jakarta.validation.constraints.NotNull; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUser; +import org.dromara.zhishu.domain.StockChangeLog; +import org.dromara.zhishu.domain.Task; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.bo.BatchUpdateCargoBo; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsBo; +import org.dromara.zhishu.domain.dto.request.BatchGoodsRequest; +import org.dromara.zhishu.domain.dto.request.GoodsComparisonRequest; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.domain.vo.ProductSubmitResultVo; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 商品信息Service接口 + * + * @author Lion Li + * @date 2025-03-07 + */ +public interface IZhishuShopGoodsService { + + /** + * 批量查询商品根据id + * @param ids + * @return + */ + List selectByIds(List ids); + + /** + * 查询商品信息 + * + * @param id 主键 + * @return 商品信息 + */ + ZhishuShopGoodsVo queryById(String id); + + /** + * 根据isbn查询商品信息 + * + * @param isbn 主键 + * @return 商品信息 + */ + List getProductByBarcode(String isbn); + + /** + * 根据商品编码查询信息 + * + * @param itemNumber + * @return + */ + ZhishuShopGoodsVo selectShopGoodsByItemNumber(String itemNumber); + + + /** + * 根据货号查询商品 + * + * @param artNo + * @return + */ + ZhishuShopGoodsVo selectShopGoodsByArtNo(String artNo); + + /** + * 提交商品信息 + * + * @param form 商品信息表单 + */ + ProductSubmitResultVo submitProduct(ProductForm form); + + /** + * 上传商品照片 + * + * @param photos 照片文件列表 + */ + void uploadPhotos(MultipartFile[] photos); + + /** + * 分页查询商品信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品信息分页列表 + */ + TableDataInfo queryPageList(ZhishuShopGoodsBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的商品信息列表 + * + * @param bo 查询条件 + * @return 商品信息列表 + */ + List queryList(ZhishuShopGoodsBo bo); + + /** + * 新增商品信息 + * + * @param bo 商品信息 + * @return 是否新增成功 + */ + Boolean insertByBo(ZhishuShopGoodsBo bo); + + /** + * 批量新增商品信息 + * + * @param list 商品列表 + */ + Boolean insertList(List list, Long depotid, String Filename); + + /** + * 自营书品批量新增商品信息 + * + * @param list 商品列表 + */ + Boolean insertListGoodsInfo(List list, Long depotId, Long shelvesDepotId, Long freightDepotId, String Filename, String code ,Long userId,String type); + + /** + * 修改商品信息 + * + * @param bo 商品信息 + * @return 是否修改成功 + */ + Boolean updateByBo(ZhishuShopGoodsBo bo); + + /** + * 校验并批量删除商品信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 通过孔夫子网站API查询图书信息 + * + * @param isbn ISBN编号 + * @return 图书信息 + */ + + List getProductByKongfz(String isbn, String searchType, String sortType, String conditionValue, String cookies, String publisher, String author); + + /** + * 初始化库存到redis + */ + void batchInitInventoryToRedis(); + + void batchRedisInitInventory(List goodsList); + + /** + * 操作库存 + * + * @param shopGoodsId + * @param count + * @return + */ + Boolean operatingInventory(Integer operationType, String shopGoodsId, Integer count, Integer type, String aboutId, Long operationBy); + + ProductVo queryBookByPython(String isbn); + +// List selectShopGoodsByPhoneNumber(String phoneNumber,); + + /** + * 库存比对存入表格 + * + * @param request + */ + void goodsComparison(GoodsComparisonRequest request); + + /** + * 批量库存比对存入表格 + * + * @param request + */ + void batchGoodsComparison(BatchGoodsRequest request); + + /** + * 根据用户选择货号规则将商品存入数据库 + */ + void saveShopGoodsInDb(SaveGoodsVo saveGoodsVo); + + ProductForm repeatBook(ProductForm form); + + /** + * 根据库存操作类型操作库存并同步平台库存 + * + * @param operationType + * @param shopGoodsPublishedVo + * @param count + */ + Boolean operatingGoodsInventory(Long shopId, Integer shopType, Integer operationType, ShopGoodsPublishedVo shopGoodsPublishedVo, Integer count, String orderSn); + + + Boolean goofishoperatingGoodsInventory(Long shopId, Integer shopType, Integer operationType, ZhishuShopGoodsVo zhishuShopGoodsVo, Integer count, String orderSn); + + + + + void randomUpdateArtNo(Long userId, Long shopId); + + void goodsAdd(Map map); + + void goodsAutoAdd(Map map); + + + void goodsAdd(Map map, Long userId,ShopVo shopVo); + + int zanTing(String threadId); + + int huanXing(String threadId); + + String artNoProcessing(Integer saveArtNoRule, Long userId, String isbn, String oldArtNo, double conditionCode, FreightGoodsCountVo freightGoodsCountVo); + + List selectShopStockLog(String id); + + Integer queryInventory(@NotNull(message = "商品Id不能为空") Long shopGoodsId); + + ProductSubmitResultVo submitFromCopyrightPage(ProductForm form); + + List getAuthorAndPublisher(String keyword, String cookies); + + TableDataInfo selectShopGoodsByPhoneNumber(String phoneNumber, int pageNum, int pageSize, String date); + + Map selectDepotIds(String userId, String artNo); + + StockChangeLog queryStockChangeLogByOrderSn(@NotNull(message = "平台订单编码不能为空") String orderSn, @NotNull(message = "库存操作日志类型不能为空") Integer type); + + /** + * 根据用户ID查询商品数量 + * + * @param userId 用户ID + * @return 商品数量 + */ + Long queryGoodsCountByUserId(Long userId); + + SysUser queryUserByUserId(@NotNull(message = "店铺ID不能为空") Long userId); + + Boolean operatingGoodsSoldOut(Long shopId, Integer platformType, Integer logType, Integer operationType, ShopGoodsPublishedVo shopGoodsPublishedVo, String orderSn); + + TableDataInfo queryGoodListByArtNo(String code, Long userId, int pageNum, int pageSize, String date); + + /** + * 批量移动商品位置 + * + * @param itemIds 商品ID列表 + * @param warehouse 货区编码 + * @param shelf 货架编码 + * @param freight 货位编码 + * @param userId 用户ID + * @return 操作结果 + */ + String batchMoveItems(List itemIds, String warehouse ,String shelf, String freight, Long userId); + + + int batchUpdateCargo(BatchUpdateCargoBo bo); + + /** + * 根据货号前缀 分页 修改 分销状态 + * @param isJoinDistribution + * @param artNoPrefix + * @param userId + * @param limitNum + * @return + */ + int updateByArtNoPrefix(String isJoinDistribution,String artNoPrefix,Long userId, Long limitNum); + + void createShopGoodsList(BatchGoodsRequest request); + + void deleteTaskDataByShopId(Long shopId); + + void syncRunningTaskToShopGoods(@NotNull(message = "店铺ID不能为空") Long shopId, Long freightId, Long userId, TaskBo taskBo); + + void synchronousTask(ShopVo shopVo, TaskBo taskBo); + + Map uploadImg(MultipartFile file); + + void synShopImg(Long userId); + + void synPddShopImg(Long userId); + + Long getTaskDataNum(Long taskId); + +// void batchUpdateCargo(BatchUpdateCargoBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopImagesService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopImagesService.java new file mode 100644 index 0000000..8c1e1e7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/IZhishuShopImagesService.java @@ -0,0 +1,72 @@ +package org.dromara.zhishu.service; + +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.zhishu.domain.ZhishuShopImages; +import org.dromara.zhishu.domain.bo.ZhishuShopImagesBo; +import org.dromara.zhishu.domain.vo.ZhishuShopImagesVo; + +import java.util.Collection; +import java.util.List; + +/** + * 商品图片Service接口 + * + * @author Lion Li + * @date 2025-03-13 + */ +public interface IZhishuShopImagesService { + + /** + * 查询商品图片 + * + * @param id 主键 + * @return 商品图片 + */ + ZhishuShopImagesVo queryById(String id); + + List selectShopImagesByShopId(String goodsId); + + /** + * 分页查询商品图片列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品图片分页列表 + */ + TableDataInfo queryPageList(ZhishuShopImagesBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的商品图片列表 + * + * @param bo 查询条件 + * @return 商品图片列表 + */ + List queryList(ZhishuShopImagesBo bo); + + /** + * 新增商品图片 + * + * @param bo 商品图片 + * @return 是否新增成功 + */ + Boolean insertByBo(ZhishuShopImagesBo bo); + + /** + * 修改商品图片 + * + * @param bo 商品图片 + * @return 是否修改成功 + */ + Boolean updateByBo(ZhishuShopImagesBo bo); + + /** + * 校验并批量删除商品图片信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/LogisticsService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/LogisticsService.java new file mode 100644 index 0000000..eef91af --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/LogisticsService.java @@ -0,0 +1,18 @@ +package org.dromara.zhishu.service; + +import jakarta.validation.constraints.NotNull; +import org.dromara.zhishu.domain.Logistics; +import org.dromara.zhishu.domain.bo.LogisticsBo; + +import java.util.List; + +public interface LogisticsService { + + Integer insert(LogisticsBo bo); + + List selectLogistics(String warehouseId); + + Logistics queryById(@NotNull(message = "主键不能为空") Long id); + + Boolean setTemplate(LogisticsBo bo); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/PddRequestService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/PddRequestService.java new file mode 100644 index 0000000..7694173 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/PddRequestService.java @@ -0,0 +1,8 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.dto.PddOrderIncrementQuery; + +public interface PddRequestService { + + void getIncrementRequest(PddOrderIncrementQuery query); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ShopGoodsPublishedLogService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ShopGoodsPublishedLogService.java new file mode 100644 index 0000000..f4eb415 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ShopGoodsPublishedLogService.java @@ -0,0 +1,20 @@ +package org.dromara.zhishu.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.validation.constraints.NotNull; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; + +public interface ShopGoodsPublishedLogService extends IService { + + /** + * 通过相关Id查询商品发布记录日志 + * @param platformId + * @param aboutId + * @param platformType + * @param logType + * @param operationType + * @return + */ + ShopGoodsPublishedLog queryPublishedLogByOrderSn(@NotNull(message = "平台订单编码不能为空") String platformId, @NotNull(message = "日志类型不能为空") String aboutId, @NotNull(message = "平台类型不能为空") Integer platformType, @NotNull(message = "日志类型不能为空") Integer logType, @NotNull(message = "操作类型不能为空") Integer operationType); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/SignGeneratorService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/SignGeneratorService.java new file mode 100644 index 0000000..7e4260a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/SignGeneratorService.java @@ -0,0 +1,5 @@ +package org.dromara.zhishu.service; + +public interface SignGeneratorService { + String generateCallbackSign(String loginCode, long timestamp, String secret); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/TShopMessageSubscribeService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/TShopMessageSubscribeService.java new file mode 100644 index 0000000..78f1640 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/TShopMessageSubscribeService.java @@ -0,0 +1,10 @@ +package org.dromara.zhishu.service; + +import org.dromara.zhishu.domain.vo.MessageSubscribeVo; + +import java.util.List; + +public interface TShopMessageSubscribeService { + + void insertOrUpdate(List messageSubscribeVo, Long id); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ZhishuShopGoodsAopService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ZhishuShopGoodsAopService.java new file mode 100644 index 0000000..24e7833 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/ZhishuShopGoodsAopService.java @@ -0,0 +1,38 @@ +package org.dromara.zhishu.service; + +import org.apache.ibatis.annotations.Param; +import org.dromara.zhishu.domain.dto.request.ZhishuShopGoodsRequest; +import org.dromara.zhishu.domain.vo.FreightGoodsCountVo; +import org.dromara.zhishu.domain.vo.SaveGoodsVo; +import org.dromara.zhishu.domain.vo.ShopVo; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +public interface ZhishuShopGoodsAopService { + + void insertNewDataList( + @Param("data") ZhishuShopGoodsRequest data, @Param("userId") Long userId, + @Param("freightGoodsCountList") List freightGoodsCountList, + @Param("saveGoodsVo") SaveGoodsVo saveGoodsVo, + @Param("failedList") List failedList, + @Param("successList") List successList, + @Param("successMarkI") AtomicInteger successMarkI, @Param("failMarkI") AtomicInteger failMarkI, + @Param("shopVo") ShopVo shopVo, @Param("totalNum") Integer totalNum, @Param("time") long time, + @Param("status") AtomicBoolean status, + @Param("taskType") String taskType + ); + + void updateChangedDataList( + @Param("data") ZhishuShopGoodsRequest data, @Param("userId") Long userId, + @Param("freightGoodsCountList") List freightGoodsCountList, + @Param("saveGoodsVo") SaveGoodsVo saveGoodsVo, + @Param("failedList") List failedList, + @Param("successList") List successList, + @Param("successMarkI") AtomicInteger successMarkI, @Param("failMarkI") AtomicInteger failMarkI, + @Param("shopVo") ShopVo shopVo, @Param("totalNum") Integer totalNum, @Param("newTime") long time, + @Param("status") AtomicBoolean status + ); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/KfzClient.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/KfzClient.java new file mode 100644 index 0000000..4798cf1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/KfzClient.java @@ -0,0 +1,77 @@ +package org.dromara.zhishu.service.client; + +import com.dtflys.forest.annotation.*; +import org.dromara.common.core.domain.R; +import org.dromara.zhishu.domain.dto.response.LogisticsMethodResponse; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryKWRequest; +import org.dromara.zhishu.domain.dto.request.SoldOutRequest; +import org.dromara.zhishu.domain.dto.request.UpdateArtNoRequest; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface KfzClient { + + /** + * 拉取孔夫子商品 + * + * @param myURL + * @param shopId + * @return + */ + @Get(value = "{myURL}/api/kfz/synchronizationGoods", dataType = "json") + Boolean synchronizationGoods(@Var("myURL") String myURL, @Query("shopId") Long shopId, @Query("taskId") Long taskId, @Query("sycFlag") Integer sycFlag); + + /** + * 更新商品货号 + * + * @param myURL + * @param request + * @return + */ + @Post(value = "{myURL}/api/kfz/updateArtNo", dataType = "json", contentType = "application/json") + Boolean updateArtNo(@Var("myURL") String myURL, @Body UpdateArtNoRequest request); + + /** + * 同步近30天历史存量订单 + * + * @param myURL + * @param shopIdList + * @return + */ + @Post(value = "{myURL}/api/kfz/order/fullSynchronizationOrder", dataType = "json", contentType = "application/json") + String fullSynchronizationOrder(@Var("myURL") String myURL, @Query("days") Integer days, @Query("type") String type, @Body List shopIdList); + + + /** + * 获取物流配送方式 + * + * @param myURL + * @param shopId + * @return + */ + @Get(value = "{myURL}/api/kfz/order/delivery/methodList", dataType = "json") + List deliveryMethodList(@Var("myURL") String myURL, @Query("shopId") Long shopId); + + + /** + * 订单发货 + * + * @param myURL + * @param request + * @return + */ + @Post(value = "{myURL}/api/kfz/order/deliver", dataType = "json", contentType = "application/json") + R orderDelivery(@Var("myURL") String myURL, @Body OrderDeliveryKWRequest request); + + /** + * 下架商品 + * + * @param myURL + * @param request + * @return + */ + @Post(value = "{myURL}/api/kfz/soldOut", dataType = "json", contentType = "application/json") + R soldOut(@Var("myURL") String myURL, @Body SoldOutRequest request); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/PddClient.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/PddClient.java new file mode 100644 index 0000000..f3dceaa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/PddClient.java @@ -0,0 +1,66 @@ +package org.dromara.zhishu.service.client; + +import com.dtflys.forest.annotation.*; +import org.dromara.common.core.domain.R; +import org.dromara.zhishu.domain.dto.request.*; +import org.dromara.zhishu.domain.dto.response.GoodsSaleStatusSetResponse; +import org.dromara.zhishu.domain.dto.response.LogisticsMethodResponse; +import org.dromara.zhishu.domain.dto.response.UpdateSkuPriceResponse; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +@Service +public interface PddClient { + + /** + * 查询物流公司列表 + * + * @param myURL + * @return + */ + @Get(value = "{myURL}/api/pdd/order/delivery/methodList", dataType = "json") + List deliveryMethodList(@Var("myURL") String myURL); + + /** + * 订单发货 + * + * @param myURL + * @param request + * @return + */ + @Post(value = "{myURL}/api/pdd/order/deliver", dataType = "json", contentType = "application/json") + R orderDelivery(@Var("myURL") String myURL, @Body OrderDeliveryPddRequest request); + + + /** + * 同步90天存量订单 + */ + @Post(value = "{myURL}/api/pdd/order/fullSynchronizationOrder", dataType = "json", contentType = "application/json") + String fullSynchronizationOrder(@Var("myURL") String myURL, @Query("days") Integer days, @Query("type") String type, @Body List shopIdList); + + /** + * 设置商品上下架状态 + */ + @Post(value = "{myURL}/api/pdd/goods/goodsSaleStatusSet", dataType = "json", contentType = "application/json") + R goodsSaleStatusSet(@Var("myURL") String myURL, @Body GoodsSaleStatusSetBatchRequest request); + + /** + * 设置单个商品上下架状态 + */ + @Post(value = "{myURL}/api/pdd/goods/goodsSaleStatusSetSingle", dataType = "json", contentType = "application/json") + R goodsSaleStatusSetSingle(@Var("myURL") String myURL, @Body GoodsSaleStatusSetRequest request); + + /** + * 修改商品sku价格 + */ + @Post(value = "{myURL}/api/pdd/goods/updateSkuPrice", dataType = "json", contentType = "application/json") + R updateSkuPrice(@Var("myURL") String myURL, @Body UpdateSkuPriceRequest request); + + /** + * 修改商品sku价格 + */ + @Post(value = "{myURL}/api/pdd/goods/deleteSaleOutGoodsBatch", dataType = "json", contentType = "application/json") + R deleteSaleOutGoodsBatch(@Var("myURL") String myURL, @Body DeleteSaleOutGoodsBatchRequest request); +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/WlnClient.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/WlnClient.java new file mode 100644 index 0000000..164bacd --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/client/WlnClient.java @@ -0,0 +1,54 @@ +package org.dromara.zhishu.service.client; + +import com.dtflys.forest.annotation.Body; +import com.dtflys.forest.annotation.Header; +import com.dtflys.forest.annotation.Post; +import com.dtflys.forest.annotation.Var; +import com.dtflys.forest.converter.json.JacksonEncoder; +import org.dromara.zhishu.domain.dto.request.ErpBaseShopPageGetRequest; +import org.dromara.zhishu.domain.dto.request.ErpGoodsQueryOlnGoodsRequest; +import org.dromara.zhishu.domain.dto.request.ErpGoodsUpdateItemRequest; +import org.dromara.zhishu.domain.dto.response.ErpBaseShopPageGetResponse; +import org.dromara.zhishu.domain.dto.response.ErpGoodsQueryOlnGoodsResponse; +import org.dromara.zhishu.domain.dto.response.WlnBaseResponse; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface WlnClient { + + /** + * 查询店铺 + * + * @param myURL + * @param request + * @return + */ + @JacksonEncoder + @Post(value = "{myURL}/api/erpBaseShopPageGet", dataType = "json", contentType = "application/json") + WlnBaseResponse> erpBaseShopPageGet(@Var("myURL") String myURL, @Header("appKey") String appKey, @Header("appSecret") String appSecret, @Body ErpBaseShopPageGetRequest request); + + /** + * 查询线上商品 + * + * @param myURL + * @param request + * @return + */ + @JacksonEncoder + @Post(value = "{myURL}/api/erpGoodsQueryOlngoods", dataType = "json", contentType = "application/json") + WlnBaseResponse erpGoodsQueryOlnGoods(@Var("myURL") String myURL, @Header("appKey") String appKey, @Header("appSecret") String appSecret, @Body ErpGoodsQueryOlnGoodsRequest request); + + /** + * 修改商品 + * + * @param myURL + * @param request + * @return + */ + @JacksonEncoder + @Post(value = "{myURL}/api/erpGoodsUpdateItem", dataType = "json", contentType = "application/json") + WlnBaseResponse erpGoodsUpdateItem(@Var("myURL") String myURL, @Header("appKey") String appKey, @Header("appSecret") String appSecret, @Body ErpGoodsUpdateItemRequest request); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/InventorySynchronizedStrategyFactory.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/InventorySynchronizedStrategyFactory.java new file mode 100644 index 0000000..c97dad8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/InventorySynchronizedStrategyFactory.java @@ -0,0 +1,40 @@ +package org.dromara.zhishu.service.factory; + +import org.dromara.zhishu.service.strategy.InventorySynchronizedGFtrategy; +import org.dromara.zhishu.service.strategy.InventorySynchronizedKWStrategy; +import org.dromara.zhishu.service.strategy.InventorySynchronizedPddStrategy; +import org.dromara.zhishu.service.strategy.InventorySynchronizedStrategy; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class InventorySynchronizedStrategyFactory implements ApplicationContextAware { + + private static ApplicationContext context; + + private static final Map> strategyClasses = new HashMap<>(); + + static { + // 可以继续添加其他的消息类型对应的策略 + strategyClasses.put("1", InventorySynchronizedPddStrategy.class); + strategyClasses.put("2", InventorySynchronizedKWStrategy.class); + strategyClasses.put("5", InventorySynchronizedGFtrategy.class); + } + + public static InventorySynchronizedStrategy getStrategy(String type) { + Class strategyClass = strategyClasses.get(type); + if (strategyClass != null) { + return context.getBean(strategyClass); + } + return null; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + context = applicationContext; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/ShopGoodsFactory.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/ShopGoodsFactory.java new file mode 100644 index 0000000..60cc554 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/factory/ShopGoodsFactory.java @@ -0,0 +1,38 @@ +package org.dromara.zhishu.service.factory; + +import org.dromara.zhishu.service.strategy.*; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class ShopGoodsFactory implements ApplicationContextAware { + + private static ApplicationContext context; + + private static final Map> strategyClasses = new HashMap<>(); + + static { + // 可以继续添加其他的消息类型对应的策略 + strategyClasses.put(1, ShopGoodsPddStrategy.class); + strategyClasses.put(2, ShopGoodsKWStrategy.class); + strategyClasses.put(3, ShopGoodsWlnStrategy.class); + } + + public static ShopGoodsStrategy getStrategy(Integer type) { + Class strategyClass = strategyClasses.get(type); + if (strategyClass != null) { + return context.getBean(strategyClass); + } + return null; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ArtNoMoveServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ArtNoMoveServiceImpl.java new file mode 100644 index 0000000..2f55a5f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ArtNoMoveServiceImpl.java @@ -0,0 +1,8 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.zhishu.service.IArtNoMoveService; +import org.springframework.stereotype.Service; + +@Service +public class ArtNoMoveServiceImpl implements IArtNoMoveService { +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CountServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CountServiceImpl.java new file mode 100644 index 0000000..06ec8ab --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CountServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.Statistic; + +import org.dromara.zhishu.mapper.CountMapper; +import org.dromara.zhishu.service.CountService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@RequiredArgsConstructor +@Service +public class CountServiceImpl implements CountService { + + @Autowired + private CountMapper countMapper; + + @Override + public Statistic selectStatistic() { + Long userId = LoginHelper.getUserId(); + //查询当前用户下的库房 + List depotId = countMapper.selectDepotId(userId); + Long wNum = countMapper.selectW(userId); + Long sNum = countMapper.selectS(depotId); + Statistic statistic=new Statistic(); + statistic.setWarehousesNum(wNum); + statistic.setShelvesNum(sNum); + return statistic; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CourierLogServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CourierLogServiceImpl.java new file mode 100644 index 0000000..dd6ab6f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/CourierLogServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pdd.pop.sdk.common.util.JsonUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.CourierLog; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.CourierLogBo; +import org.dromara.zhishu.domain.vo.CourierLogVo; +import org.dromara.zhishu.service.ICourierLogService; + +import java.util.HashMap; +import java.util.List; +import java.util.Collection; +import java.util.Map; + +/** + * 快递日志Service业务层处理 + * + * @author yxy + * @date 2026-03-18 + */ +@RequiredArgsConstructor +@Service +public class CourierLogServiceImpl implements ICourierLogService { + + /** + * 查询快递日志 + * + * @param id 主键 + * @return 快递日志 + */ + @Override + public CourierLogVo queryById(Long id){ + String courierLogStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/courierLog/"+id,new HashMap<>()); + CourierLogVo courierLog = JsonUtil.transferToObj(courierLogStr, CourierLogVo.class); + return courierLog; + } + + /** + * 分页查询快递日志列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 快递日志分页列表 + */ + @Override + public TableDataInfo queryPageList(CourierLogBo bo, PageQuery pageQuery) { + + Map params = new HashMap<>(); + params.put("pageNum", pageQuery.getPageNum()); + params.put("pageSize", pageQuery.getPageSize()); + + // 添加查询条件 + if (bo.getErpOrderId() != null) { + params.put("erpOrderId", bo.getErpOrderId()); + } + if (bo.getOrderSn() != null && !bo.getOrderSn().isEmpty()) { + params.put("orderSn", bo.getOrderSn()); + } + if (bo.getPartnerId() != null && !bo.getPartnerId().isEmpty()) { + params.put("partnerId", bo.getPartnerId()); + } + if (bo.getOrderSerialNo() != null && !bo.getOrderSerialNo().isEmpty()) { + params.put("orderSerialNo", bo.getOrderSerialNo()); + } + + String courierLogListStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(), "/api/courierLog/getList", params); + Map dataMap = JsonUtil.transferToObj(courierLogListStr, Map.class); + List courierLogList = (List) dataMap.get("data"); + int total = (int) dataMap.get("total"); + + Page result = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize(), total); + result.setRecords(courierLogList); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的快递日志列表 + * + * @param bo 查询条件 + * @return 快递日志列表 + */ + @Override + public List queryList(CourierLogBo bo) { + // 导出功能可能需要,暂时返回null,如有需要可实现 + return null; + } + + + + /** + * 校验并批量删除快递日志信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + for (Long id : ids) { + InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(), "/api/courierLog/deleteById/" + id, new HashMap<>()); + } + return true; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/DepotOrderServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/DepotOrderServiceImpl.java new file mode 100644 index 0000000..4b5654d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/DepotOrderServiceImpl.java @@ -0,0 +1,157 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.DepotOrderBo; +import org.dromara.zhishu.domain.vo.DepotOrderVo; +import org.dromara.zhishu.domain.DepotOrder; +import org.dromara.zhishu.mapper.DepotOrderMapper; +import org.dromara.zhishu.service.IDepotOrderService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 仓库订单信息Service业务层处理 + * + * @author yxy + * @date 2025-06-03 + */ +@RequiredArgsConstructor +@Service +public class DepotOrderServiceImpl implements IDepotOrderService { + + private final DepotOrderMapper baseMapper; + + /** + * 查询仓库订单信息 + * + * @param id 主键 + * @return 仓库订单信息 + */ + @Override + public DepotOrderVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询仓库订单信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 仓库订单信息分页列表 + */ + @Override + public TableDataInfo queryPageList(DepotOrderBo bo, PageQuery pageQuery) { + + + + bo.setPageNum(pageQuery.getPageNum() - 1); + bo.setPageSize(pageQuery.getPageSize()); + bo.setDelFlag("0"); + //LoginHelper.getUserId().toString() + bo.setUserId(Long.valueOf(LoginHelper.getUserId().toString())); + List depotOrderVoList = baseMapper.selectListPage(bo); + + + Page result = new Page<>(); + result.setCurrent(pageQuery.getPageNum()); + result.setSize(pageQuery.getPageSize()); + result.setTotal(baseMapper.selectTotal(bo)); + result.setRecords(depotOrderVoList); + + + return TableDataInfo.build(result); + } + + @Override + public DepotOrderVo selectDepotOrderById(String id){ + return baseMapper.selectDepotOrderById(id); + } + + /** + * 查询符合条件的仓库订单信息列表 + * + * @param bo 查询条件 + * @return 仓库订单信息列表 + */ + @Override + public List queryList(DepotOrderBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(DepotOrderBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(DepotOrder::getId); + lqw.eq(StringUtils.isNotBlank(bo.getShopOrderId()), DepotOrder::getShopOrderId, bo.getShopOrderId()); + lqw.eq(bo.getUserId() != null, DepotOrder::getUserId, bo.getUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getItemList()), DepotOrder::getItemList, bo.getItemList()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), DepotOrder::getStatus, bo.getStatus()); + lqw.eq(bo.getCreateBy() != null, DepotOrder::getCreateBy, bo.getCreateBy()); + lqw.eq(bo.getCreateTime() != null, DepotOrder::getCreateTime, bo.getCreateTime()); + return lqw; + } + + /** + * 新增仓库订单信息 + * + * @param bo 仓库订单信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DepotOrderBo bo) { + DepotOrder add = MapstructUtils.convert(bo, DepotOrder.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改仓库订单信息 + * + * @param bo 仓库订单信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DepotOrderBo bo) { + DepotOrder update = MapstructUtils.convert(bo, DepotOrder.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DepotOrder entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除仓库订单信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/EmployeeServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/EmployeeServiceImpl.java new file mode 100644 index 0000000..ef33698 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/EmployeeServiceImpl.java @@ -0,0 +1,54 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.zhishu.domain.vo.EmployeeVo; +import org.dromara.zhishu.mapper.EmployeeMapper; +import org.dromara.zhishu.service.EmployeeService; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.util.List; + +@RequiredArgsConstructor +@Service +@Slf4j +public class EmployeeServiceImpl implements EmployeeService { + + private final EmployeeMapper employeeMapper; + + @Override + public List getEmployeeList(String userId) { + return employeeMapper.getEmployeeInfo(userId); + } + + @Override + public Boolean addEmployee(String employeeId, String employeeName, String userId) { + EmployeeVo employeeVo = new EmployeeVo(); + employeeVo.setId(employeeId); + employeeVo.setName(employeeName); + employeeVo.setUserId(Long.parseLong(userId)); + long timestamp = Instant.now().getEpochSecond(); + employeeVo.setCreatTime(timestamp); + employeeVo.setUpdateTime(timestamp); + employeeVo.setDelFlag(0); + return employeeMapper.addEmployee(employeeVo) > 0; + } + + @Override + public Boolean updateEmployee(String employeeId, String employeeName, String userId) { + long timestampSeconds = Instant.now().getEpochSecond(); + EmployeeVo employeeVo = new EmployeeVo(); + employeeVo.setId(employeeId); + employeeVo.setName(employeeName); + employeeVo.setUserId(Long.parseLong(userId)); + employeeVo.setUpdateTime(timestampSeconds); + return employeeMapper.updateEmployee(employeeVo) > 0; + } + + @Override + public Boolean delEmployee(String id, String userId) { + return employeeMapper.delEmployee(id, Long.parseLong(userId)) > 0; + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FastMailServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FastMailServiceImpl.java new file mode 100644 index 0000000..09f3146 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FastMailServiceImpl.java @@ -0,0 +1,341 @@ +package org.dromara.zhishu.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.pdd.pop.sdk.common.util.JsonUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.PrintTemplate; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.FastMailBo; +import org.dromara.zhishu.domain.vo.FastMailVo; +import org.dromara.zhishu.domain.FastMail; +import org.dromara.zhishu.mapper.FastMailMapper; +import org.dromara.zhishu.service.IFastMailService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 快递打单账号管理Service业务层处理 + * + * @author yxy + * @date 2025-06-06 + */ +@RequiredArgsConstructor +@Service +public class FastMailServiceImpl implements IFastMailService { + + private final FastMailMapper baseMapper; + + /** + * 查询快递打单账号管理 + * + * @param id 主键 + * @return 快递打单账号管理 + */ + @Override + public FastMailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 根据用户id和快递类型查询 + * @param userId + * @param type + * @return + */ + @Override + public FastMailVo selectByUserIdAndType(String userId,String type){ + return baseMapper.selectByUserIdAndType(userId,type); + } + + /** + * 分页查询快递打单账号管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 快递打单账号管理分页列表 + */ + @Override + public TableDataInfo queryPageList(FastMailBo bo, PageQuery pageQuery) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + // 获取白名单 + if (userId != 1) { + bo.setCreateBy(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List fastMailVoList = result.getRecords(); + for (FastMailVo vo : fastMailVoList){ + Map map = new HashMap(); + if (vo.getFastMailType().equals("1")){ + if(vo.getType().equals("YUNDA")){ + map.put("partnerId",vo.getPartnerId()); + map.put("secret",vo.getSecret()); + map.put("type","common"); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/searchCount",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (commonDataMap.get("code").equals("200") && !commonDataMap.get("data").toString().contains("ERROR")){ + // 韵达调用成功后,在调用获取 "代收货款" 的数量 + List commonDataList = (List) commonDataMap.get("data"); + Map commonData = (Map) commonDataList.get(0); + String commonRemainNum = commonData.get("remain_num").toString(); + map.put("type","cod"); + String codStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/searchCount",map); + Map codDataMap = JsonUtil.transferToObj(codStr,Map.class); + List codDataList = (List) codDataMap.get("data"); + Map codData = (Map) codDataList.get(0); + String codRemainNum = codData.get("remain_num").toString(); + vo.setCommonRemainNum(commonRemainNum); + vo.setCodRemainNum(codRemainNum); + }else{ + // 赋值0 + vo.setCommonRemainNum("异常"); + vo.setCodRemainNum("异常"); + } + }else if (vo.getType().equals("ZTO")){ + map.put("expressDeliveryType","ZTO"); + map.put("account",vo.getPartnerId()); + map.put("password",vo.getSecret()); + String codStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/faceSheetBalance",map); + Map codDataMap = JsonUtil.transferToObj(codStr,Map.class); + if (codDataMap.get("message").toString().equals("操作成功")){ + vo.setRemark(JsonUtil.transferToJson(codDataMap.get("result"))); + } + System.out.println(codDataMap); + }else if (vo.getType().equals("JTSD")){ + // 极兔快递获取余额 + map.put("customerCode",vo.getPartnerId()); + map.put("password",vo.getSecret()); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/jtPrint/jtEssBalance",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (commonDataMap.get("msg").equals("success")){ + Map data = (Map) commonDataMap.get("data"); + vo.setRemark(data.get("balance").toString()); + } + } + } + } + + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的快递打单账号管理列表 + * + * @param bo 查询条件 + * @return 快递打单账号管理列表 + */ + @Override + public List queryList(FastMailBo bo) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + // 获取白名单 + if (userId != 1) { + bo.setCreateBy(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public List queryListApi(Long userId){ + FastMailBo bo = new FastMailBo(); + bo.setCreateBy(userId); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List fastMailVoList = baseMapper.selectVoList(lqw); + for (FastMailVo vo : fastMailVoList){ + Map map = new HashMap(); + map.put("partnerId",vo.getPartnerId()); + map.put("secret",vo.getSecret()); + map.put("type","common"); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/searchCount",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (commonDataMap.get("code").equals("200") && !commonDataMap.get("data").toString().contains("ERROR")){ + List commonDataList = (List) commonDataMap.get("data"); + Map commonData = (Map) commonDataList.get(0); + String commonRemainNum = commonData.get("remain_num").toString(); + map.put("type","cod"); + String codStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/searchCount",map); + Map codDataMap = JsonUtil.transferToObj(codStr,Map.class); + List codDataList = (List) codDataMap.get("data"); + Map codData = (Map) codDataList.get(0); + String codRemainNum = codData.get("remain_num").toString(); + vo.setCommonRemainNum(commonRemainNum); + vo.setCodRemainNum(codRemainNum); + }else{ + // 赋值0 + vo.setCommonRemainNum("异常"); + vo.setCodRemainNum("异常"); + } + } + return fastMailVoList; + } + + private LambdaQueryWrapper buildQueryWrapper(FastMailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(FastMail::getId); + lqw.eq(bo.getCreateBy() != null, FastMail::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), FastMail::getType, bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getPartnerId()), FastMail::getPartnerId, bo.getPartnerId()); + lqw.eq(StringUtils.isNotBlank(bo.getSecret()), FastMail::getSecret, bo.getSecret()); + lqw.eq(StringUtils.isNotBlank(bo.getFastMailType()), FastMail::getFastMailType, bo.getFastMailType()); + lqw.eq(bo.getCreateTime() != null, FastMail::getCreateTime, bo.getCreateTime()); + lqw.eq(bo.getUpdateTime() != null, FastMail::getUpdateTime, bo.getUpdateTime()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), FastMail::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增快递打单账号管理 + * + * @param bo 快递打单账号管理 + * @return 是否新增成功 + */ + @Override + public R insertByBo(FastMailBo bo) { + // 网点面单的情况进行校验 + if (bo.getFastMailType().equals("1")){ + FastMailVo fastMailVo = selectByUserIdAndType(LoginHelper.getUserId().toString(),bo.getType()); + if(fastMailVo != null){ + return R.fail("该用户已存在该类型的快递打单账号"); + } + Map map = new HashMap(); + if(bo.getType().equals("YUNDA")){ + // 韵达 + map.put("partnerId",bo.getPartnerId()); + map.put("secret",bo.getSecret()); + map.put("type","common"); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/searchCount",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (commonDataMap.get("data").toString().contains("ERROR")){ + return R.fail("账号或联调密码不正确"); + } + }else if (bo.getType().equals("ZTO")){ + // 中通 + map.put("expressDeliveryType",bo.getType()); + map.put("account",bo.getPartnerId()); + map.put("password",bo.getSecret()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("siteCode",bo.getRemark()); + map.put("json",jsonObject.toString()); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/ztoPrint/bindingEaccount",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (!commonDataMap.get("message").toString().contains("已绑定") && !commonDataMap.get("message").toString().contains("已绑定成功")){ + return R.fail(commonDataMap.get("message").toString()); + }else{ + bo.setRemark(jsonObject.toString()); + } + }else if (bo.getType().equals("JTSD")){ + // 极兔速递 + map.put("customerCode",bo.getPartnerId()); + map.put("password",bo.getSecret()); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/jtPrint/jtVipCheckCusPwd",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (!commonDataMap.get("msg").equals("success")){ + return R.fail(commonDataMap.get("msg").toString()); + } + } + } + + FastMail add = MapstructUtils.convert(bo, FastMail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return R.ok("新增成功"); + } + + /** + * 修改快递打单账号管理 + * + * @param bo 快递打单账号管理 + * @return 是否修改成功 + */ + @Override + public R updateByBo(FastMailBo bo) { + + if (bo.getFastMailType().equals("1")){ + Map map = new HashMap(); + if(bo.getType().equals("YUNDA")){ + map.put("partnerId",bo.getPartnerId()); + map.put("secret",bo.getSecret()); + map.put("type","common"); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/print/searchCount",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (commonDataMap.get("data").toString().contains("ERROR")){ + return R.fail("账号或联调密码不正确"); + } + }else if (bo.getType().equals("ZTO")){ + // 中通 + map.put("expressDeliveryType",bo.getType()); + map.put("account",bo.getPartnerId()); + map.put("password",bo.getSecret()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("siteCode",bo.getRemark()); + map.put("json",jsonObject.toString()); + String commonStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/ztoPrint/bindingEaccount",map); + Map commonDataMap = JsonUtil.transferToObj(commonStr,Map.class); + if (!commonDataMap.get("message").toString().contains("已绑定") && !commonDataMap.get("message").toString().contains("已绑定成功")){ + return R.fail(commonDataMap.get("message").toString()); + }else{ + bo.setRemark(jsonObject.toString()); + } + } + } + FastMail update = MapstructUtils.convert(bo, FastMail.class); + validEntityBeforeSave(update); + if (baseMapper.updateById(update) > 0){ + return R.ok("修改成功"); + }else { + return R.fail("修改失败"); + } + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(FastMail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除快递打单账号管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据面单类型删除数据 + * @param fastMailType + * @return + */ + @Override + public int deleteByFastMailType(Long userId,String fastMailType){ + return baseMapper.deleteByFastMailType(userId,fastMailType); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FilterSetServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FilterSetServiceImpl.java new file mode 100644 index 0000000..dfc3ac2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/FilterSetServiceImpl.java @@ -0,0 +1,203 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.FilterSetBo; +import org.dromara.zhishu.domain.vo.FilterSetVo; +import org.dromara.zhishu.domain.FilterSet; +import org.dromara.zhishu.mapper.FilterSetMapper; +import org.dromara.zhishu.service.IFilterSetService; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.stream.Collectors; + +/** + * 过滤设置Service业务层处理 + * + * @author yxy + * @date 2025-04-14 + */ +@RequiredArgsConstructor +@Service +public class FilterSetServiceImpl implements IFilterSetService { + + private final FilterSetMapper baseMapper; + + /** + * 查询过滤设置 + * + * @param id 主键 + * @return 过滤设置 + */ + @DS("taskSlave") + @Override + public FilterSetVo queryById(Long id){ + FilterSetVo vo = baseMapper.selectVoById(id); + return vo; + } + + /** + * 分页查询过滤设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 过滤设置分页列表 + */ + @DS("taskSlave") + @Override + public TableDataInfo queryPageList(FilterSetBo bo, PageQuery pageQuery) { + + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + bo.setCreateBy(userId); +// if (userId != 1) { +// bo.setCreateBy(userId); +// } + + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @DS("taskSlave") + @Override + public List selectVoListByBo(FilterSetBo bo) { + // 获取当前用户id + Long userId = LoginHelper.getUserId() == null ? 1L : LoginHelper.getUserId(); + bo.setCreateBy(userId); + return baseMapper.selectVoListByBo(bo); + } + + @DS("taskSlave") + @Override + public int deleteTrueById(Long id){ + return baseMapper.deleteTrueById(id); + } + + /** + * 查询符合条件的过滤设置列表 + * + * @param bo 查询条件 + * @return 过滤设置列表 + */ + @DS("taskSlave") + @Override + public List queryList(FilterSetBo bo) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + if (userId != 1) { + bo.setCreateBy(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(FilterSetBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); +// lqw.orderByAsc(FilterSet::getId); + lqw.orderByDesc(FilterSet::getCreateTime); + lqw.eq(StringUtils.isNotBlank(bo.getFilterType()), FilterSet::getFilterType, bo.getFilterType()); + lqw.eq(StringUtils.isNotBlank(bo.getLimitationType()), FilterSet::getLimitationType, bo.getLimitationType()); + lqw.eq(StringUtils.isNotBlank(bo.getAddWay()), FilterSet::getAddWay, bo.getAddWay()); + lqw.like(StringUtils.isNotBlank(bo.getAddTxt()), FilterSet::getAddTxt, bo.getAddTxt()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), FilterSet::getStatus, bo.getStatus()); + // 处理 sort 条件 + if (StringUtils.isNotEmpty(bo.getSort())) { + String[] sortArray = bo.getSort().split(","); + List sortList = Arrays.stream(sortArray) + .filter(StringUtils::isNotEmpty) + .map(String::trim) + .collect(Collectors.toList()); + + // 使用 FIND_IN_SET,更稳定 + for (String sortValue : sortList) { + lqw.apply("FIND_IN_SET({0}, sort) > 0", sortValue); + } + } + + + + lqw.eq(bo.getCreateBy() != null, FilterSet::getCreateBy, bo.getCreateBy()); + return lqw; + } + + /** + * 新增过滤设置 + * + * @param bo 过滤设置 + * @return 是否新增成功 + */ + @DS("taskSlave") + @Override + public Boolean insertByBo(FilterSetBo bo) { + Long userId = LoginHelper.getUserId() == null ? 1L : LoginHelper.getUserId(); + + bo.setCreateBy(userId); + bo.setCreateTime(DateUtils.getNowDate()); + bo.setUpdateBy(userId); + bo.setUpdateTime(DateUtils.getNowDate()); + + FilterSet add = MapstructUtils.convert(bo, FilterSet.class); + add.setSort(bo.getSort()); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改过滤设置 + * + * @param bo 过滤设置 + * @return 是否修改成功 + */ + @DS("taskSlave") + @Override + public Boolean updateByBo(FilterSetBo bo) { + FilterSet update = MapstructUtils.convert(bo, FilterSet.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(FilterSet entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除过滤设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @DS("taskSlave") + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + for (Long id : ids){ + baseMapper.deleteTrueById(id); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/GoofishServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/GoofishServiceImpl.java new file mode 100644 index 0000000..ae921ab --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/GoofishServiceImpl.java @@ -0,0 +1,258 @@ +package org.dromara.zhishu.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import lombok.RequiredArgsConstructor; + + +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.Shop; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.service.*; +import org.springframework.stereotype.Service; +import java.nio.charset.StandardCharsets; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.Security; +import java.util.ArrayList; +import java.util.HexFormat; +import java.util.List; + + +/** + * 店铺主表Service业务层处理 + * + * @author yxy + * @date 2025-05-8 + */ +@RequiredArgsConstructor +@Service +public class GoofishServiceImpl implements IGoofishService { + + private final IShopService shopService; + private final ISysConfigService configService; + private final IPriceTemplateService priceTemplateService; + + + @Override + public void goodAdd(ShopVo shop, ZhishuShopGoods zhishuShopGoods, ShopDetailVo shopDetailVo) { + long timestamp = System.currentTimeMillis() / 1000L; + // 生成签名 + String domain = "https://open.goofish.pro"; // 域名 + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("product_id", Long.parseLong(zhishuShopGoods.getProductId())); + jsonObject.put("stock", zhishuShopGoods.getInventory()); + System.out.println("入参goofish"+jsonObject.toJSONString()); + + // 生成签名 + String sign = genSign(timestamp, jsonObject.toJSONString(), shop.getMallId().toString(), shop.getToken()); + //调用编辑库存的接口 + String apiUrl = domain + "/api/open/product/edit/stock?appid=" + shop.getMallId().toString() + "×tamp=" + timestamp + "&sign=" + + sign; + try { + // 创建URL对象 + URL url = new URL(apiUrl); + + // 打开连接 + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + // 设置请求方法为POST + connection.setRequestMethod("POST"); + + // 设置请求头部 + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + + // 启用输出流 + connection.setDoOutput(true); + + // 获取输出流并写入请求体 + OutputStream outputStream = connection.getOutputStream(); + outputStream.write(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8)); + outputStream.close(); + + // 获取响应状态码 + int responseCode = connection.getResponseCode(); + System.out.println("API Response Code: " + responseCode); + + // 读取响应内容 + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + StringBuilder response = new StringBuilder(); + while ((line = bufferedReader.readLine()) != null) { + response.append(line); + } + bufferedReader.close(); + + // 关闭连接 + connection.disconnect(); + + System.out.println("API Response: " + response.toString()); + + } catch (IOException e) { + // 在此处处理异常 + e.printStackTrace(); + } + } + + + + + /** + * 调用闲鱼服务接口修改商品库存 + * @param + */ + public void goodUpdateStock(ShopVo shop, String itemId, String number,Integer type){ + + long timestamp = System.currentTimeMillis() / 1000L; + // 生成签名 + String domain = "https://open.goofish.pro"; // 域名 + + // 请求体JSON字符串 + //String productId = itemId; + + JSONObject jsonObject = new JSONObject(); + + + // 生成签名 + + String apiUrl=null; + String sign=null; + + if (2==type){ + jsonObject.put("product_id", Long.parseLong(itemId)); + jsonObject.put("stock", Long.parseLong(number)); + System.out.println("入参goofish"+jsonObject.toJSONString()); + sign = genSign(timestamp, jsonObject.toJSONString(), shop.getMallId().toString(), shop.getToken()); + if ("0".equals(number)){ + + //调用下架商品 + // 拼接请求地址 + apiUrl = domain + "/api/open/product/downShelf?appid=" + shop.getMallId().toString() + "×tamp=" + timestamp + "&sign=" + + sign; + + }else{ + //调用编辑库存的接口 + apiUrl = domain + "/api/open/product/edit/stock?appid=" + shop.getMallId().toString() + "×tamp=" + timestamp + "&sign=" + + sign; + } + } else if (3==type) { + + //调用上架商品 + if ("1".equals(number)){ + List jsonArray=new ArrayList<>(); + jsonArray.add(shop.getShopKey()); + jsonObject.put("product_id", Long.parseLong(itemId)); + jsonObject.put("user_name", jsonArray); + System.out.println("入参goofish1 3"+jsonObject.toJSONString()); + sign = genSign(timestamp, jsonObject.toJSONString(), shop.getMallId().toString(), shop.getToken()); + + //调用下架商品 + // 拼接请求地址 + apiUrl = domain + "/api/open/product/publish?appid=" + shop.getMallId().toString() + "×tamp=" + timestamp + "&sign=" + + sign; + + }else{ + jsonObject.put("product_id", Long.parseLong(itemId)); + jsonObject.put("stock", Long.parseLong(number)); + System.out.println("入参goofish 3"+jsonObject.toJSONString()); + sign = genSign(timestamp, jsonObject.toJSONString(), shop.getMallId().toString(), shop.getToken()); + + //调用编辑库存的接口 + apiUrl = domain + "/api/open/product/edit/stock?appid=" + shop.getMallId().toString() + "×tamp=" + timestamp + "&sign=" + + sign; + } + + } + + + try { + // 创建URL对象 + URL url = new URL(apiUrl); + + // 打开连接 + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + // 设置请求方法为POST + connection.setRequestMethod("POST"); + + // 设置请求头部 + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + + // 启用输出流 + connection.setDoOutput(true); + + // 获取输出流并写入请求体 + OutputStream outputStream = connection.getOutputStream(); + outputStream.write(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8)); + outputStream.close(); + + // 获取响应状态码 + int responseCode = connection.getResponseCode(); + System.out.println("API Response Code: " + responseCode); + + // 读取响应内容 + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + StringBuilder response = new StringBuilder(); + while ((line = bufferedReader.readLine()) != null) { + response.append(line); + } + bufferedReader.close(); + + // 关闭连接 + connection.disconnect(); + + System.out.println("API Response: " + response.toString()); + + } catch (IOException e) { + // 在此处处理异常 + e.printStackTrace(); + } + + } + + + + + // 生成签名 + private static String genSign(long timestamp, String jsonStr, String apiKey, String apiKeySecret) { + // 拼接字符串 + String data = apiKey + "," + genMd5(jsonStr) + "," + timestamp + "," + apiKeySecret; + + // 商务对接模式 拼接字符串 + // String data = apiKey + "," + genMd5(jsonStr) + "," + timestamp + "," + seller_id + "," + apiKeySecret; + + // 生成签名 + return genMd5(data); + } + + // md5加密 + private static String genMd5(String str) { + StringBuilder result = new StringBuilder(); + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(str.getBytes(StandardCharsets.UTF_8)); + for (byte b : digest) { + result.append(String.format("%02x", b & 0xff)); + } + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + return result.toString(); + } + +} + + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzItemService.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzItemService.java new file mode 100644 index 0000000..318cde7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzItemService.java @@ -0,0 +1,128 @@ +// service/KongfzItemService.java +package org.dromara.zhishu.service.impl; + + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import kotlin.Result; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hpsf.Decimal; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.dto.KongfzRequestDto; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsVo; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.mapper.ZhishuShopGoodsMapper; +import org.dromara.zhishu.util.HttpUtils; +import org.dromara.zhishu.util.KongfzApiUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.configurationprocessor.json.JSONException; +import org.springframework.boot.configurationprocessor.json.JSONObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Service +public class KongfzItemService { + + @Autowired + private KongfzApiUtils kongfzApiUtils; + @Autowired + private ZhishuShopGoodsMapper zhishuShopGoodsMapper; + @Autowired + private ObjectMapper objectMapper; + + public String getShopInfo(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url, headers, requestBody); + } + + + public String listing(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + + } + + public String delisting(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + public String shopList(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + public String updateItemNumber(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + + public String updateItemPrice(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + public String updateItemName(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + public String updateItemsn(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + public String deleteItem(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + return HttpUtils.sendPost(url,headers,requestBody); + } + + public String batchDeleteItem(Map params) throws Exception { + String url = "https://kongfz-api.kongfz.com"; + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + String requestBody = HttpUtils.convertObjectToJson(params); + + return HttpUtils.sendPost(url,headers,requestBody); + } + +} + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzServiceImpl.java new file mode 100644 index 0000000..e10825b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/KongfzServiceImpl.java @@ -0,0 +1,328 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.ZhishuShopImages; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.util.CnumberUtils; +import org.dromara.zhishu.util.ImageUtils; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UploadUtil; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.nio.file.Path; +import java.util.*; + +/** + * 店铺主表Service业务层处理 + * + * @author yxy + * @date 2025-05-8 + */ +@RequiredArgsConstructor +@Service +public class KongfzServiceImpl implements IKongFzService { + + private final IShopService shopService; + private final ISysConfigService configService; + private final IBookBaseInfoService bookBaseInfoService; + private final IZhishuShopImagesService zhishuShopImagesService; + private final IPriceTemplateService priceTemplateService; + private final IShopImgService shopImgService; + +// @Override +// public void goodAdd(String shopId, ZhishuShopGoods zhishuShopGoods, ShopDetailVo shopDetailVo) { +// //店铺数据 +// ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); +// //获取中心书库的数据 +// BookBaseInfoVo bookBaseInfoVo = bookBaseInfoService.queryByIsbn(zhishuShopGoods.getIsbn()); +// //获取实拍图 +// List zhishuShopImagesVoList = zhishuShopImagesService.selectShopImagesByShopId(zhishuShopGoods.getId()); +// +// +// +// Map map = new HashMap(); +// map.put("shopId",shopId); +// map.put("goodId", zhishuShopGoods.getId()); +// map.put("userId", zhishuShopGoods.getUserId()); +// map.put("token",shopVo.getToken()); +// map.put("tpl",shopDetailVo.getBookTemplate()); +// map.put("catId",""); +// map.put("myCatId",""); +// /** +// * 获取书名和中央书库不匹配 +// */ +// if (!zhishuShopGoods.getGoodsName().equals(bookBaseInfoVo.getBookName())){ +// map.put("otherName",zhishuShopGoods.getGoodsName()); +// } +// /** +// * 商品标题 +// */ +// map.put("itemName",getGoodTitle(shopDetailVo,zhishuShopGoods,bookBaseInfoVo)); +// map.put("importantDesc",shopDetailVo.getRecommend()); +// /** +// * 价格 +// */ +// map.put("price",getPrice(shopDetailVo,zhishuShopGoods)); +// map.put("number",zhishuShopGoods.getInventory()); +// if(StringUtils.isNotEmpty(zhishuShopGoods.getConditionCode())){ +// String qualityNum = CnumberUtils.getQualityNum(zhishuShopGoods.getConditionCode()); +// if(!qualityNum.equals("UNDEFINED")){ +// map.put("quality",qualityNum); +// }else{ +// map.put("quality",shopDetailVo.getConditionDef()); +// } +// }else{ +// map.put("quality",shopDetailVo.getConditionDef()); +// } +// +// map.put("qualityDesc",shopDetailVo.getConditionDes()); +// map.put("itemSn",zhishuShopGoods.getArtNo()); +// /** +// * 获取水印图片 +// */ +// /** +// * 封面水印 specSyImageUrl +// */ +// String specSyImageUrl = ""; +// List shopImgList = shopImgService.selectVoByShopId(shopId); +// for (ShopImgVo shopImgMap : shopImgList){ +// specSyImageUrl = shopImgMap.getAbsolutePath(); +// } +// +// //无水印图片记录 +// String noSyImage = ""; +// String images = ""; +// if(zhishuShopImagesVoList.size() == 0){ +// //没有实拍图则获取中心书库的图片 +// String image = UploadUtil.getFiles(bookBaseInfoVo.getBookName(), bookBaseInfoVo.getBookPic(),"bookInfoImages",""); +// +// //如果图片访问不到 +// Boolean bool = ImageUtils.isImageExists(image); +// if(!bool){ +// //白底图 +// image = getWhiteImage(zhishuShopGoods); +// noSyImage = image; +// }else{ +// noSyImage = image; +// //图片增加水印,若报错则返回白底图 +// if(specSyImageUrl != ""){ +// image = getImageSy(specSyImageUrl,image,zhishuShopGoods); +// } +// } +// System.out.println("中央书库上传首图-------------"+image+";书名:"+bookBaseInfoVo.getBookName()); +// map.put("imgUrl", image); +// //实拍图 +// images = image; +// }else{ +// //第一张图作为首图,第一张肯定有水印 +// String imageFirst = UploadUtil.getFiles("", "","",zhishuShopImagesVoList.get(0).getPath()); +// +// +// noSyImage = imageFirst; +// if(specSyImageUrl != ""){ +// imageFirst = getImageSy(specSyImageUrl,imageFirst,zhishuShopGoods); +// } +// System.out.println("用户上传首图-------------"+imageFirst+";书名:"+zhishuShopGoods.getGoodsName()); +// map.put("imgUrl", imageFirst); +// // WatermarkPosition 水印位置 0 全部 1第一张 +// if(shopDetailVo.getWatermarkPosition().equals("0")){ +// //为0是全部增加水印 +// for(ZhishuShopImagesVo vo : zhishuShopImagesVoList){ +// //图片路径 +// String image = UploadUtil.getFiles("","","",vo.getPath()); +// //水印不为空则增加水印 +// if(specSyImageUrl != ""){ +// image = getImageSy(specSyImageUrl,image,zhishuShopGoods); +// } +// System.out.println("用户上传后续-------------"+image+";书名:"+zhishuShopGoods.getGoodsName()); +// //记录图片 +// if(images == ""){ +// images = image; +// }else{ +// images = images + ";" + image; +// } +// } +// }else{ +// //实拍图 为1时,正常不加水印图片 +// for(ZhishuShopImagesVo vo : zhishuShopImagesVoList){ +// String image = UploadUtil.getFiles("","","",vo.getPath()); +// System.out.println("实拍图 为1时,正常不加水印图片:用户上传后续-------------"+image+";书名:"+zhishuShopGoods.getGoodsName()); +// if(images == ""){ +// images = image; +// }else{ +// images = images + ";" + image; +// } +// } +// } +// } +// //只有1张图片,并且只在第一张图片上加水印 +// if(images.split(";").length == 1 && shopDetailVo.getWatermarkPosition().equals("1")){ +// images = images +";"+ noSyImage; +// } +// int index = images.indexOf(";") + 1; +// if(index != -1){ +// images = images.substring(index); +// } +// +// +// map.put("images",images); +// +// map.put("itemDesc",bookBaseInfoVo.getContent()); +// if(shopDetailVo.getIsParcel().equals("0")){ +// //不包邮 +// map.put("bearShipping","buyer"); +// }else{ +// //包邮 +// map.put("bearShipping","seller"); +// } +// map.put("mouldld", shopDetailVo.getTemplateId()); +// map.put("weight",shopDetailVo.getBookWeight()); +// map.put("weightPiece",shopDetailVo.getStandardNumber()); +// +// map.put("isbn",zhishuShopGoods.getIsbn()); +// map.put("author",bookBaseInfoVo.getAuthor()); +// map.put("press",bookBaseInfoVo.getPublisher()); +// map.put("pubDate",bookBaseInfoVo.getPublicationTime()); +// map.put("binding",bookBaseInfoVo.getBindingLayout()); +// map.put("oriPrice",bookBaseInfoVo.getFixPrice()); +// +// InterfaceUtils.getInterfacePost(configService.selectConfigByKey("kongfz.ip"), "/api/kfz/goodAddOne", map); +// +// } + + /** + * 获取商品标题 + * @return + */ + public String getGoodTitle(ShopDetailVo shopDetailVo,ZhishuShopGoods zhishuShopGoods,BookBaseInfoVo bookBaseInfoVo){ + //获取标题组成的内容 + String titleStr = shopDetailVo.getTitleConsistOf(); + String[] titleOfArr = titleStr.split(","); + titleStr = ""; + for(int i=0;i 0){ + //大于最高价 + priceL = highPrice; + }else{ + priceL = priceOld; + } + + //获取价格模板 + PriceTemplateVo priceTemplateVo = priceTemplateService.queryById(shopDetailVo.getSaleTemplateId()); + + //根据价格模板换算后的价格 + BigDecimal price = new BigDecimal(String.valueOf(priceTemplateVo.getProportion())) + .divide(new BigDecimal(100)) + .multiply(priceL) + .add(priceL) + .add(new BigDecimal(priceTemplateVo.getAddAmount().toString())) + .multiply(new BigDecimal(100)) + .setScale(0, RoundingMode.DOWN); + + return price.toString(); + } + + /** + * 获取白底图 + */ + public String getWhiteImage(ZhishuShopGoods zhishuShopGoods){ + String uuid = UUID.randomUUID().toString(); + String fileUrl = ImageUtils.generateImage(zhishuShopGoods.getGoodsName(), 800, 800,uuid+".jpg"); + MultipartFile multipartFile = UploadUtil.getMultipartFileFromPath(fileUrl); + //上传文件 + UploadUtil.upload(multipartFile,"userShopGoodsImages"); + //获取上传文件网络地址 + return UploadUtil.getFiles("","","","other/"+ LoginHelper.getUserId()+"/userShopGoodsImages/"+uuid+".jpg"); + } + + /** + * 处理水印图片 + * specSyImageUrl 水印图片 + */ + public String getImageSy(String specSyImageUrl,String iamge,ZhishuShopGoods zhishuShopGoods){ + + try { + String uuid = UUID.randomUUID().toString(); + //本地缓存路径 + String filePath = UploadUtil.mergeImages(iamge,specSyImageUrl); + MultipartFile multipartFile = UploadUtil.getMultipartFileFromPath(filePath); + //上传图片空间 + UploadUtil.upload(multipartFile,"userShopGoodsImages"); + //获取图片空间路径 + return UploadUtil.getFiles("","","","other/"+ LoginHelper.getUserId()+"/userShopGoodsImages/"+multipartFile.getOriginalFilename()); + } catch (IOException e) { + e.printStackTrace(); + return getWhiteImage(zhishuShopGoods); + } + } + + /** + * 调用kongfz服务接口修改商品库存 + * @param map + */ + public void goodUpdateStock(String token,String itemId,String number){ + Map map = new HashMap(); + map.put("token",token); + map.put("itemId",itemId); + map.put("number",number); + InterfaceUtils.getInterfacePost(configService.selectConfigByKey("kongfz.ip"), "/api/kfz/itemNumberUpdate", map); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/LogisticsServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/LogisticsServiceImpl.java new file mode 100644 index 0000000..b6308f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/LogisticsServiceImpl.java @@ -0,0 +1,139 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zhishu.domain.Logistics; +import org.dromara.zhishu.domain.bo.LogisticsBo; +import org.dromara.zhishu.mapper.LogisticsMapper; +import org.dromara.zhishu.service.LogisticsService; +import org.dromara.zhishu.util.JsonObjUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +@Slf4j +@Service +public class LogisticsServiceImpl implements LogisticsService { + @Autowired + private LogisticsMapper logisticsMapper; + ; + + @Override + public Integer insert(LogisticsBo bo) { + Logistics add = new Logistics(); + String are = logisticsMapper.selectByArea(bo.getDelivery_area(), bo.getDelivery_city()); + String city = logisticsMapper.selectByCity(bo.getDelivery_city(), bo.getDelivery_province()); + String province = logisticsMapper.selectByProvince(bo.getDelivery_province()); + add.setDeliveryProvince(province); + add.setDeliveryCity(city); + add.setDeliveryArea(are); + + add.setPricingMethod(bo.getPricing_method().toString()); + add.setShipping(bo.getShipping()); + add.setStatus("0"); + add.setWarehouseId(bo.getWarehouse_id()); + + if (city == null) { + add.setDeliveryAddress(province + "/" + are); + } else { + add.setDeliveryAddress(province + "/" + city + "/" + are); + } + add.setTemplateName(bo.getTemplate_name()); + log.info("打印数据-{}", JSONObject.toJSONString(bo)); + add.setShippingRange(JSONObject.toJSONString(bo.getShippingRange())); + add.setRemark(bo.getRemark()); + logisticsMapper.insert(add); + System.out.println(add); + return 0; + } + + @Override + public List selectLogistics(String warehouseId) { + return logisticsMapper.selectLogistice(warehouseId); + } + + @Override + public Logistics queryById(Long id) { + Logistics logistics = logisticsMapper.selectByWareId(id); + if(logistics!=null) { + String[] name = logistics.getDeliveryAddress().split("/"); + Long proId =logisticsMapper.selectByid(name[0],null,null,null,null); + Long cityId =logisticsMapper.selectByid(null,name[1],null,proId,null); + Long areaId =logisticsMapper.selectByid(null,null,name[2],proId,cityId); + logistics.setDeliveryProvince(proId.toString()); + logistics.setDeliveryCity(cityId.toString()); + logistics.setDeliveryArea(areaId.toString()); + } + return logistics; +// return null; + } + + @Override + public Boolean setTemplate(LogisticsBo bo) { + Integer message = 0; + if (bo.getId() != null) { + Logistics add = new Logistics(); + add.setId(bo.getId()); + String are = logisticsMapper.selectByArea(bo.getDelivery_area(), bo.getDelivery_city()); + String city = logisticsMapper.selectByCity(bo.getDelivery_city(), bo.getDelivery_province()); + String province = logisticsMapper.selectByProvince(bo.getDelivery_province()); + add.setDeliveryProvince(province); + add.setDeliveryCity(city); + add.setDeliveryArea(are); + add.setContact(bo.getContact()); + add.setPhoneNumber(bo.getPhoneNumber()); + add.setFullAddress(bo.getFullAddress()); + add.setPricingMethod(bo.getPricing_method().toString()); + add.setShipping(bo.getShipping()); + add.setStatus("0"); + add.setWarehouseId(bo.getWarehouse_id()); + add.setRemark(bo.getRemark()); + + if (city == null) { + add.setDeliveryAddress(province + "/" + are); + } else { + add.setDeliveryAddress(province + "/" + city + "/" + are); + } + add.setTemplateName(bo.getTemplate_name()); + log.info("打印数据-{}", JSONObject.toJSONString(bo)); + String jsonString = JSONObject.toJSONString(bo.getShippingRange()); + add.setShippingRange(jsonString); + + // 赋值最低价格 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将 JSON 转换为 Map> + Map> regionMap = null; + try { + regionMap = objectMapper.readValue(jsonString, Map.class); + } catch (JsonProcessingException e) { + throw new ServiceException("解析模板运送范围失败", 555); + } + if (ObjectUtil.isNotEmpty(regionMap)) { + List priceList = new ArrayList<>(); + // 遍历 Map 并修改每个列表中的第二个元素 + for (Map.Entry> entry : regionMap.entrySet()) { + List list = entry.getValue(); + String strValue = String.valueOf(list.get(1)); + priceList.add(new BigDecimal(strValue)); + } + BigDecimal minPrice = Collections.min(priceList); + add.setFirPrice(minPrice); + } + message = logisticsMapper.updateByBo(add); + } + + return message > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NewUserServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NewUserServiceImpl.java new file mode 100644 index 0000000..25219aa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NewUserServiceImpl.java @@ -0,0 +1,51 @@ +package org.dromara.zhishu.service.impl; + +import lombok.extern.log4j.Log4j2; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.NewUserInfo; +import org.dromara.zhishu.domain.bo.NewUserBo; +import org.dromara.zhishu.mapper.NewUserBoMapper; +import org.dromara.zhishu.service.NewUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Log4j2 +public class NewUserServiceImpl implements NewUserService { + @Autowired + private NewUserBoMapper newUserMapper; + + + @Transactional + @Override + public boolean insertByBo(NewUserBo newUserBo) { + Long userId = LoginHelper.getUserId(); + NewUserInfo add = MapstructUtils.convert(newUserBo, NewUserInfo.class); + if(add.getLicenseTime().equals("")){ + add.setLicenseTime(null); + } + if(add.getBusinessLicenseTime().equals("")){ + add.setBusinessLicenseTime(null); + } + Integer message = newUserMapper.selectAudit(userId); + //当message不等于0时返回false,否则执行下面代码 +// Integer message2 = newUserMapper.selectByPhone(add.getContactPhone()); + if (message != 0) { + throw new RuntimeException("您已经提交过申请,请耐心等待审核"); + } + try { + newUserMapper.insertAudit(userId); + Long id = newUserMapper.selectId(userId); + add.setAuditId(id); + Integer message1 = newUserMapper.insertAuditInfo(add); + System.out.println(message1); + newUserMapper.updatePhone(newUserBo.getEmail(),newUserBo.getContactPhone(),userId); + } catch (Exception e) { + log.error("插入数据失败",e); + return false; + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NoticeServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..a764578 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/NoticeServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.ShopImg; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.NoticeBo; +import org.dromara.zhishu.domain.vo.NoticeVo; +import org.dromara.zhishu.domain.Notice; +import org.dromara.zhishu.mapper.NoticeMapper; +import org.dromara.zhishu.service.INoticeService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 消息通知Service业务层处理 + * + * @author yxy + * @date 2025-05-17 + */ +@RequiredArgsConstructor +@Service +public class NoticeServiceImpl implements INoticeService { + + private final NoticeMapper baseMapper; + + /** + * 查询消息通知 + * + * @param id 主键 + * @return 消息通知 + */ + @Override + public NoticeVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询消息通知列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 消息通知分页列表 + */ + @Override + public TableDataInfo queryPageList(NoticeBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的消息通知列表 + * + * @param bo 查询条件 + * @return 消息通知列表 + */ + @Override + public List queryList(NoticeBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(NoticeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(Notice::getCreateTime); + lqw.eq(StringUtils.isNotBlank(bo.getSender()), Notice::getSender, bo.getSender()); + lqw.eq(StringUtils.isNotBlank(bo.getRecipient()), Notice::getRecipient, bo.getRecipient()); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), Notice::getContent, bo.getContent()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Notice::getStatus, bo.getStatus()); + lqw.eq(bo.getCreateTime() != null, Notice::getCreateTime, bo.getCreateTime()); + return lqw; + } + + /** + * 新增消息通知 + * + * @param bo 消息通知 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(NoticeBo bo) { + Notice add = MapstructUtils.convert(bo, Notice.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改消息通知 + * + * @param bo 消息通知 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(NoticeBo bo) { + Notice update = MapstructUtils.convert(bo, Notice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Notice entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除消息通知信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PddServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PddServiceImpl.java new file mode 100644 index 0000000..6556326 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PddServiceImpl.java @@ -0,0 +1,996 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.opencsv.bean.CsvToBean; +import com.opencsv.bean.CsvToBeanBuilder; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.FormatsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.domain.bo.ShopBo; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.dto.BookPriceInfoDto; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.dto.request.AddTaskLogRequest; +import org.dromara.zhishu.domain.dto.request.BatchSetSoldOutRequest; +import org.dromara.zhishu.domain.dto.request.DeleteSaleOutGoodsBatchRequest; +import org.dromara.zhishu.domain.dto.request.GoodsSaleStatusSetRequest; +import org.dromara.zhishu.domain.dto.response.AddTaskLogResponse; +import org.dromara.zhishu.domain.dto.response.GetBookByISBNResponse; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.domain.vo.TaskVo; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.service.client.BookCenterClient; +import org.dromara.zhishu.service.client.FileClient; +import org.dromara.zhishu.service.client.LogClient; +import org.dromara.zhishu.service.client.PddClient; +import org.dromara.zhishu.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.text.DecimalFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; + +import static cn.dev33.satoken.SaManager.log; + +/** + * 店铺主表Service业务层处理 + * + * @author yxy + * @date 2025-03-10 + */ +@RequiredArgsConstructor +@Service +public class PddServiceImpl implements IPddService { + + private final ISysConfigService configService; + + private final IShopService shopService; + + private final FileClient fileClient; + + private final TaskServiceImpl taskService; + + private final IRunningTaskService runningTaskService; + + private final IRunningTaskByShopService runningTaskByShopService; + + private final IBookBaseInfoService bookBaseInfoService; + + private final IShopDetailService shopDetailService; + + private final PddClient pddClient; + + private final LogClient logClient; + + private final UrlUtil urlUtil; + + private final BookCenterClient bookCenterClient; + + @Override + public void createShopGoodsList(ShopVo shopVo, TaskBo taskBo, Integer isOnsale) { + System.out.println("任务开始:" + DateUtils.dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS)); + + // 根据shopId查询数据表是否存在 + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopVo.getId()); + if (checkMark == 0) { + // 不存在则创建表 + runningTaskByShopService.createTable("t_running_task_" + shopVo.getId()); + } + // 根据token获取店铺信息 + String accessToken = shopVo.getToken(); + /** + * + */ + Integer page = 1; + Integer pageSize = 100; + // 首次调用第一页,获取查询结果总数 + String pddIp = configService.selectConfigByKey("pdd.ip"); + String url = "/api/pdd/auth/getShopGoodsList?" + + "accessToken=" + accessToken; + if (isOnsale != null) { + url += "&isOnsale=" + isOnsale; + } + String dataStr = InterfaceUtils.getInterface(pddIp, url + "&page=" + page + "&pageSize=" + pageSize); + Map dataMap = JsonUtil.transferToObj(dataStr, Map.class); + // 记录总数据 + List> allList = new ArrayList<>(); + // 结束时间,如果传入的结束时间为空,则使用新的结束时间 + Long startTime = null; + Long endTime = null; + // 标记结束 + int endMark = 0; + // 标记 + int runMark = 0; + do { + for (; page <= 100; page++) { + url = "/api/pdd/auth/getShopGoodsList?" + + "accessToken=" + accessToken; + if (startTime != null) { + url += "&createdAtFrom=" + startTime; + } + if (endTime != null) { + url += "&createdAtEnd=" + endTime; + } + if (isOnsale != null) { + url += "&isOnsale=" + isOnsale; + } + // 继续查询数据 + dataStr = InterfaceUtils.getInterface(pddIp, url + "&page=" + page + "&pageSize=" + pageSize); + dataMap = JsonUtil.transferToObj(dataStr, Map.class); + int errorMark = 0; + while (dataMap == null) { + System.out.println("接口异常,正在重试..."); + dataStr = InterfaceUtils.getInterface(pddIp, url + "&page=" + page + "&pageSize=" + pageSize); + dataMap = JsonUtil.transferToObj(dataStr, Map.class); + errorMark++; + if (errorMark > 10) { + break; + } + } + List> dataList = new ArrayList<>(); + if (dataMap != null) { + dataList = (List>) dataMap.get("goods_list"); + } + if (runMark == 1 && dataList.size() == 0) { + endMark = 1; + } + if (dataList.size() > 0) { + List runningTaskList = new ArrayList<>(); + for (Map map : dataList) { + List> skuList = (List>) map.get("sku_list"); + // 构建 JSON 对象 + JSONObject json = new JSONObject(); + json.put("trilateralId", map.get("goods_id").toString()); + json.put("img", map.get("thumb_url").toString()); + json.put("finishTime", DateUtilsUtils.getNowDate()); + json.put("imageSelect", "11"); + json.put("totalPrice", ""); + json.put("isbn", skuList.get(0).get("outer_goods_id").toString()); + json.put("priority", "3"); + json.put("imageBigUrl", ""); + json.put("title", map.get("goods_name").toString()); + json.put("quality", "100"); + json.put("shopType", shopVo.getShopType()); + json.put("stock", map.get("goods_quantity").toString()); + json.put("skuCode", ""); + json.put("skuId", skuList.get(0).get("sku_id").toString()); + json.put("isOnSale", map.get("is_onsale").toString()); + json.put("isMoreSku", map.get("is_more_sku").toString()); + // 如果数据存在则修改,不存在则添加 + RunningTask runningTask = runningTaskByShopService.selectVoByTrilateralId("t_running_task_" + shopVo.getId(), map.get("goods_id").toString()); + if (runningTask == null) { + String jsonString = json.toString(); + runningTask = new RunningTask(); + runningTask.setTaskId(taskBo.getId()); + runningTask.setShopId(shopVo.getId()); + runningTask.setGoodsId(Long.parseLong(map.get("goods_id").toString())); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName(taskBo.getFileName()); + runningTask.setPriority(255L); + runningTask.setData(""); + runningTask.setStatus("2"); + runningTask.setTaskType("GET_SHOP_GOODS"); + runningTask.setSuccessData(jsonString); + runningTask.setCallBackData("拉取成功"); + // 新增 + runningTaskList.add(runningTask); + } else { + // 解析价格和上架编码 + Map successData = JsonUtil.transferToObj(runningTask.getSuccessData(), Map.class); + String totalPrice = successData.get("totalPrice").toString(); + String skuCode = successData.get("skuCode").toString(); + json.put("totalPrice", totalPrice); + json.put("skuCode", skuCode); + String jsonString = json.toString(); + // 修改文件名和状态 + runningTask.setTaskId(taskBo.getId()); + runningTask.setTaskName(taskBo.getFileName()); + runningTask.setStatus("2"); + runningTask.setSuccessData(jsonString); + runningTaskByShopService.update("t_running_task_" + shopVo.getId(), runningTask); + } + } + if (runningTaskList.size() > 0) { + runningTaskByShopService.batchInsert("t_running_task_" + shopVo.getId(), runningTaskList); + } + } + if (page == 100 || dataList.size() == 0) { + if (startTime == null && endTime == null && dataList.size() == 0) { + runMark = 1; + break; + } + if (dataList.size() == 0) { + startTime = endTime; + } else { + startTime = Long.parseLong(dataList.get(dataList.size() - 1).get("created_at").toString()); + } + Long nowTime = System.currentTimeMillis() / 1000; + Long newEndTime = addDaysToTimestamp(startTime, 30); + if (newEndTime < nowTime) { + endTime = newEndTime; + } else { + endTime = nowTime; + runMark = 1; + } + page = 1; + break; + } + } + } while (endMark == 0); + //此时状态为3的数据都是为拉取的数据,都删除 + runningTaskByShopService.deleteByStatus("t_running_task_" + shopVo.getId(), "3"); + // 修改状态为完成 + runningTaskByShopService.updateStatus("t_running_task_" + shopVo.getId()); + } + + + @Override + public void createShopGoodsDetailList(ShopVo shopVo, TaskBo taskBo, Integer isOnsale) { + System.out.println("任务开始:" + DateUtils.dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS)); + + // 根据shopId查询数据表是否存在 + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopVo.getId()); + if (checkMark == 0) { + // 不存在则创建表 + runningTaskByShopService.createTable("t_running_task_" + shopVo.getId()); + } + // 根据token获取店铺信息 + String accessToken = shopVo.getToken(); + /** + * + */ + Integer page = 1; + Integer pageSize = 100; + // 首次调用第一页,获取查询结果总数 + String pddIp = configService.selectConfigByKey("pdd.ip"); + String url = "/api/pdd/auth/getShopGoodsList?" + + "accessToken=" + accessToken; + if (isOnsale != null) { + url += "&isOnsale=" + isOnsale; + } + String dataStr = InterfaceUtils.getInterface(pddIp, url + "&page=" + page + "&pageSize=" + pageSize); + Map dataMap = JsonUtil.transferToObj(dataStr, Map.class); + // 记录总数据 + List> allList = new ArrayList<>(); + // 结束时间,如果传入的结束时间为空,则使用新的结束时间 + Long startTime = null; + Long endTime = null; + // 标记结束 + int endMark = 0; + // 标记 + int runMark = 0; + do { + for (; page <= 100; page++) { + url = "/api/pdd/auth/getShopGoodsDetailList?" + + "accessToken=" + accessToken; + if (startTime != null) { + url += "&createdAtFrom=" + startTime; + } + if (endTime != null) { + url += "&createdAtEnd=" + endTime; + } + if (isOnsale != null) { + url += "&isOnsale=" + isOnsale; + } + // 继续查询数据 + dataStr = InterfaceUtils.getInterface(pddIp, url + "&page=" + page + "&pageSize=" + pageSize); + dataMap = JsonUtil.transferToObj(dataStr, Map.class); + int errorMark = 0; + while (dataMap == null) { + System.out.println("接口异常,正在重试..."); + dataStr = InterfaceUtils.getInterface(pddIp, url + "&page=" + page + "&pageSize=" + pageSize); + dataMap = JsonUtil.transferToObj(dataStr, Map.class); + errorMark++; + if (errorMark > 10) { + break; + } + } + List> dataList = new ArrayList<>(); + if (dataMap != null) { + dataList = (List>) dataMap.get("goods_list"); + } + if (runMark == 1 && dataList.size() == 0) { + endMark = 1; + } + if (dataList.size() > 0) { + List runningTaskList = new ArrayList<>(); + for (Map map : dataList) { + List> skuList = (List>) map.get("sku_list"); + // 构建 JSON 对象 + JSONObject json = new JSONObject(); + json.put("trilateralId", map.get("goods_id").toString()); + json.put("img", map.get("thumb_url").toString()); + json.put("finishTime", DateUtilsUtils.getNowDate()); + json.put("imageSelect", "11"); + json.put("totalPrice", map.get("price") == null ? "" : map.get("price").toString()); + json.put("isbn", skuList.get(0).get("outer_goods_id").toString()); + json.put("priority", "3"); + json.put("imageBigUrl", ""); + json.put("title", map.get("goods_name").toString()); + json.put("quality", "100"); + json.put("shopType", shopVo.getShopType()); + json.put("stock", map.get("goods_quantity").toString()); + json.put("skuCode", map.get("skuCode") == null ? "" : map.get("skuCode").toString()); + json.put("skuId", skuList.get(0).get("sku_id").toString()); + json.put("isOnSale", map.get("is_onsale").toString()); + json.put("isMoreSku", map.get("is_more_sku").toString()); + String jsonString = json.toString(); + // 如果数据存在则修改,不存在则添加 + RunningTask runningTask = runningTaskByShopService.selectVoByTrilateralId("t_running_task_" + shopVo.getId(), map.get("goods_id").toString()); + if (runningTask == null) { + + runningTask = new RunningTask(); + runningTask.setTaskId(taskBo.getId()); + runningTask.setShopId(shopVo.getId()); + runningTask.setGoodsId(Long.parseLong(map.get("goods_id").toString())); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName(taskBo.getFileName()); + runningTask.setPriority(255L); + runningTask.setData(""); + runningTask.setStatus("2"); + runningTask.setTaskType("GET_SHOP_GOODS"); + runningTask.setSuccessData(jsonString); + runningTask.setCallBackData("拉取成功"); + // 新增 + runningTaskList.add(runningTask); + } else { + // 修改文件名和状态 + runningTask.setTaskId(taskBo.getId()); + runningTask.setTaskName(taskBo.getFileName()); + runningTask.setStatus("2"); + runningTask.setSuccessData(jsonString); + runningTaskByShopService.update("t_running_task_" + shopVo.getId(), runningTask); + } + } + if (runningTaskList.size() > 0) { + runningTaskByShopService.batchInsert("t_running_task_" + shopVo.getId(), runningTaskList); + } + } + if (page == 100 || dataList.size() == 0) { + if (startTime == null && endTime == null && dataList.size() == 0) { + runMark = 1; + break; + } + if (dataList.size() == 0) { + startTime = endTime; + } else { + startTime = Long.parseLong(dataList.get(dataList.size() - 1).get("created_at").toString()); + } + Long nowTime = System.currentTimeMillis() / 1000; + Long newEndTime = addDaysToTimestamp(startTime, 30); + if (newEndTime < nowTime) { + endTime = newEndTime; + } else { + endTime = nowTime; + runMark = 1; + } + page = 1; + break; + } + } + } while (endMark == 0); + //此时状态为3的数据都是为拉取的数据,都删除 + runningTaskByShopService.deleteByStatus("t_running_task_" + shopVo.getId(), "3"); + // 修改状态为完成 + runningTaskByShopService.updateStatus("t_running_task_" + shopVo.getId()); + } + + @Override + public TableDataInfo> getShopGoodsList(String shopId, String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate, Integer page, Integer pageSize,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { +// ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + + String[] shopIds=shopId.split(","); + Page> result = new Page<>(); + result.setCurrent(page); + result.setSize(pageSize); + Long pageNum = (long) ((page - 1) * pageSize); + int total=0; + for (String shopIdsingle : shopIds){ + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopIdsingle); + if (checkMark == 0) { + result.setTotal(0); + result.setRecords(new ArrayList<>()); + } else { + List mapList = runningTaskByShopService.selectGetShopGoodsList("t_running_task_" + shopIdsingle, isOnsale,isbn,priceDown,priceUp,startDate,endDate,pageNum, Long.parseLong(pageSize.toString()), goodsName, stockDown, stockUp, trilateralId, goodsCode, skuCode); + + List> mapList2 = new ArrayList<>(); + + for (Map map : mapList) { + Map successData = JsonUtil.transferToObj((String) map.get("success_data"), Map.class); + + Map map2 = new HashMap(); + map2.put("shopId",map.get("shop_id")); + map2.put("Title", successData.get("title")); + map2.put("TrilateralId", successData.get("trilateralId")); + map2.put("SkuCode", successData.get("skuCode") == null ? (successData.get("artNo") == null ? "": successData.get("artNo")) : successData.get("skuCode")); + map2.put("SkuId", successData.get("skuId")); + map2.put("ISBN", successData.get("isbn")); + map2.put("GoodsCode", successData.get("goodsCode")); + + + + // 获取img值并进行类型判断 + Object imgObj = successData.get("img"); + boolean isImgString = (imgObj instanceof String); + if (isImgString){ + map2.put("Img", imgObj); // 保持原有值 + }else{ + Map imgMap = (Map) imgObj; + List carouselUrlArray = (List) imgMap.get("carousel_url_array"); + if (!carouselUrlArray.isEmpty()){ + map2.put("Img",carouselUrlArray.get(0)); + }else{ + map2.put("Img", ""); + } + } + + + + map2.put("ImgBigUrl", ""); + map2.put("TotalPrice", successData.get("totalPrice")); + map2.put("Stock", successData.get("stock")); + map2.put("FinishTime", successData.get("finishTime")); + map2.put("IsOnSale", successData.get("isOnSale")); + map2.put("IsMoreSku", ""); + mapList2.add(map2); + } + + result.setRecords(mapList2); + total =total+ runningTaskByShopService.selectGetShopGoodsNum("t_running_task_" + shopIdsingle, isOnsale,isbn,priceDown,priceUp,startDate,endDate, goodsName, stockDown, stockUp, trilateralId, goodsCode, skuCode); + } + } + + result.setTotal(total); + + + return TableDataInfo.build(result); + + + } + + @Override + public List emport(String shopId, String isOnsale) { + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopId); + if (checkMark == 0) { + return new ArrayList<>(); + } else { + return runningTaskByShopService.selectGetShopGoodsList("t_running_task_" + shopId, isOnsale,null,"","",null,null, 0L, 9999999L,null,null,null,null,null,null); + } + } + + /** + * 给定一个 10 位秒级时间戳,增加指定的天数(如 30 天),并返回新的秒级时间戳 + * + * @param timestampSeconds 10 位时间戳(秒) + * @param daysToAdd 要增加的天数(如 30 表示加 30 天) + * @return 新的秒级时间戳 + */ + public static long addDaysToTimestamp(long timestampSeconds, int daysToAdd) { + LocalDateTime dateTime = LocalDateTime.ofInstant( + Instant.ofEpochSecond(timestampSeconds), + ZoneId.systemDefault() + ); + + // 增加指定天数 + LocalDateTime newDateTime = dateTime.plusDays(daysToAdd); + + // 返回秒级时间戳 + return newDateTime.atZone(ZoneId.systemDefault()).toEpochSecond(); + } + + + /** + * 下架重复 + * @param shopId 店铺ID + */ + @Override + public void batchSetSoldOut(Long shopId) { + ShopVo shopVo = shopService.queryById(shopId); + // 判断token是否不为空 + String token = shopVo.getToken(); + if (ObjectUtil.isEmpty(token)) { + throw new ServiceException("店铺未授权,无法批量下架商品"); + } + List items = runningTaskByShopService.selectRepeatNoPage("t_running_task_" + shopId); + if (!items.isEmpty()) { + + // 创建下架任务 + TaskBo taskBo = new TaskBo(); + taskBo.setTaskType("EDIT_ISONSALE_GOODS"); + taskBo.setFileName("下架重复商品任务"); + taskBo.setShopIds(shopId.toString()); + taskBo.setShopNames(shopVo.getShopName()); + taskBo.setDataNum((long) items.size()); + taskBo.setTaskStatus("0"); + taskBo.setStatus("0"); + taskService.insertByBo(taskBo); + //开启线程 + Thread thread = new Thread(() -> { + for(SuccessDataItemDto item : items){ + //调用接口 + Map mapData = new HashMap(); + mapData.put("priority","4"); + mapData.put("retry_count","3"); + mapData.put("taskId",taskBo.getId().toString()); + mapData.put("shopId",shopId.toString()); + mapData.put("token",shopVo.getToken()); + mapData.put("isOnsale","1"); + mapData.put("serviceName","EDIT_ISONSALE_GOODS"); + mapData.put("trilateralId", item.getTrilateralId()); + mapData.put("shopType",shopVo.getShopType()); + if(shopVo.getShopType().equals("5")){ + //咸鱼 + mapData.put("appId", shopVo.getMallId().toString()); + mapData.put("shopKey",shopVo.getShopKey()); + } + /** + * 创建运行任务对象 + */ + RunningTask runningTaskDate = new RunningTask(); + runningTaskDate.setTaskId(taskBo.getId()); + runningTaskDate.setShopId(shopVo.getId()); + runningTaskDate.setGoodsId(0L); + runningTaskDate.setRandomNum(System.currentTimeMillis()); + runningTaskDate.setTaskName(taskBo.getFileName()); + runningTaskDate.setPriority(255L); + runningTaskDate.setData(JsonUtil.transferToJson(mapData)); + runningTaskDate.setStatus("0"); + runningTaskDate.setTaskType("EDIT_ISONSALE_GOODS"); + runningTaskService.insert(runningTaskDate); + } + }); + thread.start(); + + }else{ + throw new ServiceException("该店铺下没有需要下架的商品"); + } + + } + + @Override + public void editShopGoodsAllByIsOnSale(ShopVo shopVo, TaskBo taskBo, String isOnSale, String isbn, String priceDown, String priceUp, String startDate, String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { + String isOnSaleNum = isOnSale.equals("0") ? "1" : "0"; + + int count = runningTaskByShopService.selectGetShopGoodsListCount("t_running_task_" + shopVo.getId(), isOnSaleNum, isbn, priceDown, priceUp, startDate, endDate,goodsName,stockDown,stockUp,trilateralId,goodsCode,skuCode); + + Long pageSize = 100L; + // 计算总页数 + Long totalPages = (count + pageSize - 1) / pageSize; + + // 从最后一页开始往前执行 + int runNum = 0; + List> bodyList = new ArrayList<>(); + Map setTaskBodyMap = new HashMap(); + setTaskBodyMap.put("task_id",taskBo.getId()); + + Long usageCount = shopService.checkUsageCount(shopVo); + + for (Long pageNum = totalPages; pageNum >= 1; pageNum--) { + Long page = (pageNum - 1) * pageSize; + List dataMap = runningTaskByShopService.selectGetShopGoodsList("t_running_task_" + shopVo.getId(), isOnSaleNum, isbn, priceDown, priceUp, startDate, endDate, page, pageSize,goodsName,stockDown,stockUp,trilateralId,goodsCode,skuCode); + + if (dataMap.size() == 0) { + continue; + } + + for (Map map : dataMap) { + runNum++; + Map successData = JsonUtil.transferToObj((String) map.get("success_data"), Map.class); + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",successData.get("isbn").toString()); + bookInfo.put("trilateralId",successData.get("trilateralId").toString()); + bookInfo.put("goodsCode",""); + body.put("book_info",bookInfo); + Map detail = new HashMap(); + // 1 上架 2 下架 + detail.put("status",isOnSale.equals("0") ? 2 : 1); + body.put("detail",detail); + bodyList.add(body); + + if (bodyList.size() % 500 == 0 || runNum == count){ + NewTaskUtils.newTaskPost(taskBo.getId().toString(),shopVo.getId().toString(),bodyList); + // 清空列表,准备下一批 + bodyList.clear(); + } + + usageCount--; + if (usageCount == 0){ + break; + } + } + if (usageCount == 0){ + break; + } + } + // 处理剩余数据 + if (!bodyList.isEmpty()) { + NewTaskUtils.newTaskPost(taskBo.getId().toString(),shopVo.getId().toString(),bodyList); + System.out.println("新发布任务发布结束:"+bodyList.size()+"条"); + } + // 更新使用次数 + shopService.updateUsageCount(shopVo,usageCount); + } + + /** + * 通过csv批量翻新商品上架拼多多 + * + * @param file + * @param taskBo + * @param shopVo + */ + @Async + @Override + public void batchRenovateOnSaleByCsv(MultipartFile file, TaskBo taskBo, ShopVo shopVo) { + try { + String defaultStock = "0"; + ShopDetailVo shopDetailVo = shopDetailService.queryByShopId(shopVo.getId()); + if (shopDetailVo != null) defaultStock = String.valueOf(shopDetailVo.getStockDeff()); + // 读取CSV文件 + List dataList = readCsvData(file); + + // 分批处理数据 + int batchSize = 1000; + int totalBatches = (int) Math.ceil((double) dataList.size() / batchSize); + + // 处理每个批次 + for (int batchNum = 0; batchNum < totalBatches; batchNum++) { + int fromIndex = batchNum * batchSize; + int toIndex = Math.min((batchNum + 1) * batchSize, dataList.size()); + List batchList = dataList.subList(fromIndex, toIndex); + + // 计算当前批次需要的线程数 (最多10个) + int threadCount = Math.min(10, batchList.size()); + + // 使用CountDownLatch等待所有线程完成 + CountDownLatch latch = new CountDownLatch(threadCount); + + // 分配每个线程处理的数据量 + int perThreadSize = (int) Math.ceil((double) batchList.size() / threadCount); + + for (int i = 0; i < threadCount; i++) { + int threadFrom = i * perThreadSize; + int threadTo = Math.min((i + 1) * perThreadSize, batchList.size()); + List batchData = batchList.subList(threadFrom, threadTo); + + String finalDefaultStock = defaultStock; + ThreadPoolUtils.execute(() -> { + try { + for (BookPriceInfoDto data : batchData) { + // 调用单条数据处理逻辑 + processSingleData(data, shopVo, taskBo.getId(), taskBo.getFileName(), finalDefaultStock, "0", "1"); + } + } finally { + latch.countDown(); + } + }); + } + + // 等待当前批次所有线程完成 + latch.await(); + } + } catch (Exception e) { + throw new ServiceException("批量处理CSV文件失败:" + e.getMessage()); + } + } + + // 读取CSV文件 + private List readCsvData(MultipartFile file) throws IOException { + try (Reader reader = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8)) { + CsvToBean csvToBean = new CsvToBeanBuilder(reader) + .withType(BookPriceInfoDto.class) + .withIgnoreLeadingWhiteSpace(true) + .build(); + return csvToBean.parse(); + } + } + + // 单条数据处理方法 + public Boolean processSingleData(BookPriceInfoDto data, ShopVo shopVo, Long taskId, String taskName, String defaultStock, String status, String taskType) { + + // 将字符串转换为BigDecimal以确保精确计算 + BigDecimal fen = new BigDecimal(data.getCorePrice()); + // 分转元:除以100 + BigDecimal yuan = fen.divide(new BigDecimal("100")); + // 设置小数位数并四舍五入 + DecimalFormat df = new DecimalFormat("0.00"); + + Map goMap = new HashMap(); + goMap.put("priority", "3"); + goMap.put("retry_count", "3"); + goMap.put("isbn", data.getIsbn()); + goMap.put("totalPrice", df.format(yuan)); + goMap.put("stock", defaultStock); + goMap.put("bookName", data.getBookName()); + goMap.put("code", data.getIsbn()); + goMap.put("imgBigUrl", ""); + goMap.put("artNo", data.getIsbn()); + goMap.put("taskId", taskId.toString()); + goMap.put("shopId", shopVo.getId().toString()); + goMap.put("imageSelect", "12"); + goMap.put("way", "2"); + + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(taskId); + runningTask.setShopId(shopVo.getId()); + runningTask.setGoodsId(Long.valueOf(data.getPlatformId())); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName(taskName); + runningTask.setPriority(255L); + runningTask.setData(JsonUtil.transferToJson(goMap)); + runningTask.setStatus(status); + runningTask.setTaskType(taskType); + + // 删除pdd商品 + DeleteSaleOutGoodsBatchRequest deleteSaleOutGoodsBatchRequest = new DeleteSaleOutGoodsBatchRequest(); + deleteSaleOutGoodsBatchRequest.setToken(shopVo.getToken()); + List goodsIds = List.of(Long.valueOf(data.getPlatformId())); + deleteSaleOutGoodsBatchRequest.setGoodsIds(goodsIds); + R deleteSaleOutGoodsBatchR = pddClient.deleteSaleOutGoodsBatch(UrlUtil.getPddServiceUrl(), deleteSaleOutGoodsBatchRequest); + if (!R.isError(deleteSaleOutGoodsBatchR)) { + // 同步删除数据库商品 + runningTaskByShopService.deleteByGoodsId("t_running_task_" + shopVo.getId(), data.getPlatformId()); + } + + // 无论是否删除成功都要重新发布上架商品 + runningTaskService.insert(runningTask); + return Boolean.TRUE; + } + + // 翻新数据处理方法 + @Async + @Override + public void renovateOnSale(BookPriceInfoDto data, String shopId, String taskId) { + // 获取店铺信息 + ShopVo shopVo = shopService.queryById(Long.valueOf(shopId)); + + // 获取任务详情 + TaskVo taskVo = taskService.queryById(Long.valueOf(taskId)); + + // 获取默认库存 + String defaultStock = "0"; + ShopDetailVo shopDetailVo = shopDetailService.queryByShopId(Long.valueOf(shopId)); + if (shopDetailVo != null) defaultStock = String.valueOf(shopDetailVo.getStockDeff()); + processSingleData(data, shopVo, taskVo.getId(), taskVo.getFileName(), defaultStock, "0", "UPDATE_GOODS_PRICE"); + + } + + public String getSaleTemplateIdByShopId(Long shopId) { + // 直接调用Mapper查询价格模板ID + return shopDetailService.selectSaleTemplateIdByShopId(shopId); + } + + @Override + public void sendPddGoodsToTargetShop(String shopId, String targetShopId, TaskBo taskBo, ShopVo shopVo) { + //查询出搬家数据 + Long pageNum = 1L; + Long pageSize = 100L; + Long maxPages = 5L; // 防止死循环 + String taskId=taskBo.getId().toString(); + try { + while (pageNum <= maxPages) { + Long offset = (pageNum - 1) * pageSize; + List dataMap = runningTaskByShopService.selectGetShopGoodsListAll( + "t_running_task_" + shopId, // 假设商品表名格式 + "1", + offset, + pageSize); + if (dataMap == null || dataMap.isEmpty()) { + break; + } + List runningTaskList = new ArrayList<>(); + List runningTaskList1 = new ArrayList<>(); + for (Map map : dataMap) { + + try { + // 关键字段非空检查 + if (map.get("goods_id") == null) { + log.warn("商品ID为空,跳过处理"); + continue; + } + + // 获取原始 success_data + Object dataObj = map.get("data"); + Map dataMaptable = null; + + Object successDataObj = map.get("success_data"); + Map successDataObjMaptable = null; + Map jsonmap = new HashMap<>(); + + if (dataObj != null && StringUtils.isNotBlank(dataObj.toString())) { + try { + // 尝试解析为 Map + dataMaptable = JsonUtil.transferToObj(dataObj.toString(), Map.class); + } catch (Exception e) { + log.warn("解析 success_data 失败: {}, 原始数据: {}", e.getMessage(), dataObj); + dataMaptable = new HashMap<>(); + dataMaptable.put("originalData", dataObj.toString()); + } + } + if (dataMaptable == null) { + dataMaptable = new HashMap<>(); + } + + if (successDataObj != null && StringUtils.isNotBlank(successDataObj.toString())) { + try { + // 尝试解析为 Map + successDataObjMaptable = JsonUtil.transferToObj(successDataObj.toString(), Map.class); + } catch (Exception e) { + log.warn("解析 success_data 失败: {}, 原始数据: {}", e.getMessage(), successDataObj); + dataMaptable = new HashMap<>(); + dataMaptable.put("originalData", successDataObj.toString()); + } + } + if (successDataObjMaptable == null) { + successDataObjMaptable = new HashMap<>(); + } + + // 添加 isMove 属性 + dataMaptable.put("isMove", "1"); + dataMaptable.put("shopId", targetShopId); + dataMaptable.put("taskId", taskId); + jsonmap.put("retry_count", "3"); + jsonmap.put("priority", "3"); + jsonmap.put("isbn", successDataObjMaptable.get("isbn")); + + // 从Map中获取totalPrice的值 + Object totalPriceObj = successDataObjMaptable.get("totalPrice"); + if (totalPriceObj != null) { + // 将分转换为元 + double totalPriceYuan; + + if (totalPriceObj instanceof Number) { + // 如果是数值类型 + totalPriceYuan = ((Number) totalPriceObj).doubleValue() / 100.0; + } else { + // 如果是字符串或其他类型 + try { + totalPriceYuan = Double.parseDouble(totalPriceObj.toString()) / 100.0; + } catch (NumberFormatException e) { + // 处理转换异常 + totalPriceYuan = 0.0; + } + } + + // 将转换后的元单位价格存入jsonmap + jsonmap.put("totalPrice", totalPriceYuan); + } else { + // 如果totalPrice为null,可以设置默认值或处理异常 + jsonmap.put("totalPrice", 1000); + } + + jsonmap.put("stock",successDataObjMaptable.get("stock")); + jsonmap.put("taskId", taskId); + jsonmap.put("shopId",targetShopId); + jsonmap.put("imageSelect", map.get("imageSelect")); + jsonmap.put("imageChoice", map.get("imageChoice")); + jsonmap.put("way",map.get("way")); + jsonmap.put("isMove", "1"); + jsonmap.put("imgBigUrl", successDataObjMaptable.get("img")); + + + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(Long.parseLong(taskId)); + runningTask.setShopId(Long.parseLong(targetShopId)); // 目标店铺 + runningTask.setGoodsId(Long.parseLong(map.get("goods_id").toString())); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setStatus("3"); + runningTask.setCallBackData("搬家成功"); + runningTask.setPriority(255L); + runningTask.setData(""); + runningTask.setTaskType("GET_SHOP_GOODS"); + + // success_data 可能为空 + RunningTask runningTask1 = new RunningTask(); + runningTask1.setTaskId(Long.parseLong(taskId)); + runningTask1.setShopId(Long.parseLong(targetShopId)); // 目标店铺 + runningTask1.setGoodsId(Long.parseLong(map.get("goods_id").toString())); + runningTask1.setRandomNum(System.currentTimeMillis()); + runningTask1.setStatus("0"); + runningTask1.setPriority(255L); + runningTask1.setData(""); + runningTask1.setTaskType("GET_MOVE_GOODS"); + + + // 序列化并设置 + String successDataJson = JsonUtil.transferToJson(dataMaptable); + String jsonmapDataJson = JsonUtil.transferToJson(jsonmap); + + runningTask.setData(successDataJson); + runningTask1.setData(jsonmapDataJson); + + runningTaskList.add(runningTask); + runningTaskList1.add(runningTask1); + } catch (Exception e) { + // 记录具体错误信息 + log.error("处理商品数据时出错: {}, 数据: {}", + e.getMessage(), map, e); + } + } + + // 批量插入到目标店铺的任务表 + if (!runningTaskList.isEmpty()) { + // 注意:这里应该是目标店铺的任务表 + runningTaskByShopService.batchInsert( + "t_running_task_" + targetShopId, // 关键修改 + runningTaskList); + + log.info("成功插入 {} 条任务到店铺 {}", + runningTaskList.size(), targetShopId); + } + if (!runningTaskList1.isEmpty()) { + System.out.println(runningTaskList1); + //插入任务表中 + runningTaskByShopService.batchInsert("t_running_task",runningTaskList1); + log.info("任务到店铺", runningTaskList1.size()); + } + + + + pageNum++; + // 如果返回的数据少于 pageSize,说明是最后一页 + if (dataMap.size() < pageSize) { + break; + } + + + } + + + }catch (Exception e){ + log.error("sendPddGoodsToTargetShop 执行失败: ", e); + throw new RuntimeException("商品搬家任务执行失败", e); + } + + + } + + @Override + public Boolean clearRedisBuffer(String shopId) { + try { + // 构建请求参数 + Map params = new HashMap<>(); + params.put("key", shopId); + + // 调用接口 + String ip = "http://36.212.12.92:30180"; + String url = "/deleteRedisKey"; + String responseStr = InterfaceUtils.getInterfaceGetWithParams(ip, url, params); + + // 解析响应 + Map responseMap = JsonUtil.transferToObj(responseStr, Map.class); + if (responseMap != null && responseMap.containsKey("success")) { + return (Boolean) responseMap.get("success"); + } + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PrintTemplateServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PrintTemplateServiceImpl.java new file mode 100644 index 0000000..92adbd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/PrintTemplateServiceImpl.java @@ -0,0 +1,149 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.Shop; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.PrintTemplateBo; +import org.dromara.zhishu.domain.vo.PrintTemplateVo; +import org.dromara.zhishu.domain.PrintTemplate; +import org.dromara.zhishu.mapper.PrintTemplateMapper; +import org.dromara.zhishu.service.IPrintTemplateService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 打印模板Service业务层处理 + * + * @author yxy + * @date 2026-03-07 + */ +@RequiredArgsConstructor +@Service +public class PrintTemplateServiceImpl implements IPrintTemplateService { + + private final PrintTemplateMapper baseMapper; + + /** + * 查询打印模板 + * + * @param id 主键 + * @return 打印模板 + */ + @Override + public PrintTemplateVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询打印模板列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 打印模板分页列表 + */ + @Override + public TableDataInfo queryPageList(PrintTemplateBo bo, PageQuery pageQuery) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + // 非管理员只能查看自己创建的 + if (userId != null && userId != 1) { + bo.setCreateBy(userId); + } + pageQuery.setOrderByColumn("t.create_by,t.id"); + pageQuery.setIsAsc("asc,desc"); + + // 调用自定义Mapper方法 + Page page = baseMapper.selectPrintTemplatePage(pageQuery.build(), bo); + return TableDataInfo.build(page); + } + + /** + * 查询符合条件的打印模板列表 + * + * @param bo 查询条件 + * @return 打印模板列表 + */ + @Override + public List queryList(PrintTemplateBo bo) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + // 非管理员只能查看自己创建的 + if (userId != null && userId != 1) { + bo.setCreateBy(userId); + } + // 调用自定义Mapper方法,无分页 + return baseMapper.selectPrintTemplateList(bo); + } + + private LambdaQueryWrapper buildQueryWrapper(PrintTemplateBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(PrintTemplate::getId); + lqw.eq(bo.getCreateBy() != null, PrintTemplate::getCreateBy, bo.getCreateBy()); + lqw.like(StringUtils.isNotBlank(bo.getPrintTemplateName()), PrintTemplate::getPrintTemplateName, bo.getPrintTemplateName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), PrintTemplate::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增打印模板 + * + * @param bo 打印模板 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(PrintTemplateBo bo) { + PrintTemplate add = MapstructUtils.convert(bo, PrintTemplate.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改打印模板 + * + * @param bo 打印模板 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(PrintTemplateBo bo) { + PrintTemplate update = MapstructUtils.convert(bo, PrintTemplate.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(PrintTemplate entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除打印模板信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ProductServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..d63e6f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ProductServiceImpl.java @@ -0,0 +1,241 @@ +package org.dromara.zhishu.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.ShopWarehouseAuto; +import org.dromara.zhishu.domain.SinglePrint; +import org.dromara.zhishu.domain.bo.SinglePrintBo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.service.IProductService; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.service.IShopWarehouseAutoService; +import org.dromara.zhishu.util.DateUtilsUtils; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Service +public class ProductServiceImpl implements IProductService { + + private final IShopService shopService; + + + + private final IShopWarehouseAutoService shopWarehouseAutoService; + + /** + * 获取用户仓库信息 + */ + @Override + public Map getMappingList(){ + + String mappingListStr = InterfaceUtils.getInterfaceGetWithParams( + UrlUtil.getNewWarehouse(), + "/api/warehouse/mapping_list", + new HashMap<>() + ); + + Map map = JsonUtil.transferToObj(mappingListStr,Map.class); + + return map; + } + + @Override + public TableDataInfo queryPageList(Map bo) { + + String userId = bo.get("aboutId").toString(); + String warehouseId = bo.get("warehouseId").toString(); + String page = bo.get("pageNum").toString(); + String pageSize = bo.get("pageSize").toString(); + + Map params = new HashMap<>(); + params.put("page", page); + params.put("page_size", pageSize); + params.put("user_id",userId); + params.put("warehouse_id",warehouseId); + + if (bo.get("barcode") != null){ + params.put("barcode",bo.get("barcode").toString()); + } + if (bo.get("name") != null){ + params.put("name",bo.get("name").toString()); + } + if (bo.get("appearance") != null){ + params.put("appearance",bo.get("appearance").toString()); + } + // 库存 + if (bo.get("stockOperator") != null && bo.get("stockValue") != null){ + params.put("stock_operator",bo.get("stockOperator").toString()); + params.put("stock_value", bo.get("stockValue").toString()); + } + // 价格 + if (bo.get("salepriceOperator") != null && bo.get("salepriceValue") != null){ + params.put("saleprice_operator",bo.get("salepriceOperator").toString()); + // 换算金额 + String saleprice_value = new BigDecimal( bo.get("salepriceValue").toString()).multiply(new BigDecimal(100)).toString(); + params.put("saleprice_value",saleprice_value); + } + // 创建日期 + if (bo.get("startCreatedAt") != null){ + params.put("start_created_at", DateUtilsUtils.dateStringToTimestamp10(bo.get("startCreatedAt").toString(),"yyyy-MM-dd HH:mm:ss")); + } + if (bo.get("endCreatedAt") != null){ + params.put("end_created_at", DateUtilsUtils.dateStringToTimestamp10(bo.get("endCreatedAt").toString(),"yyyy-MM-dd HH:mm:ss")); + } + + String productListStr = InterfaceUtils.getInterfaceGetWithParams( + UrlUtil.getNewWarehouse(), + "/api/product/distribution_list", + params + ); + Map dataMap = JsonUtil.transferToObj(productListStr, Map.class); + Map data = (Map) dataMap.get("data"); + + List productList = (List) data.get("list"); + int total = (int) data.get("total"); + + Page result = new Page<>(Integer.parseInt(page), Integer.parseInt(pageSize), total); + result.setRecords(productList); + return TableDataInfo.build(result); + } + + /** + * 发布商品 + * @param map + * @return + */ + @Override + public void releaseGoods(Map map){ + + // 获取仓库id + Long userId = Long.parseLong(map.get("userId").toString()); + // 店铺id数组 + String[] shopIdArr = map.get("shopIds").toString().split(","); + // 转换成数值类型 + Long[] shopIdLongArr = new Long[shopIdArr.length]; + // 店铺类型数组 + Long[] shopTypeArr = new Long[shopIdArr.length]; + for (int i=0;i tableDataInfo = queryPageList(params); + List productList = tableDataInfo.getRows(); + if (productList == null || productList.isEmpty()){ + // 当查不到数据的时候退出循环 + break; + }else{ + // 存在数据时 + pageNum++; + // 提取id并转换为String数组 + String[] productIdArray = productList.stream() + .map(productMap -> productMap.get("id").toString()) // 将id转换为String + .toArray(String[]::new); // 转换为String数组 + + // 转换成数值类型 + productIdLongArr = Arrays.stream(productIdArray) + .map(String::trim) + .map(Long::valueOf) + .toArray(Long[]::new); + + + // 封装数据 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("user_id",userId); + jsonObject.put("shop_ids",shopIdLongArr); + jsonObject.put("shop_types",shopTypeArr); + jsonObject.put("product_ids",productIdLongArr); + // 调用发布接口 + InterfaceUtils.postJson(UrlUtil.getNewWarehouse(),"/api/product/batchPush",jsonObject.toJSONString()); + // 清空商品 + productIdLongArr = null; + } + } + } + } + + /** + * 自动发布接口 + * @param map + */ + @Override + public void releaseGoodsAuto(Map map){ + // 用户id + Long userId = Long.parseLong(map.get("userId").toString()); + // 仓库id + Long warehouseId = Long.parseLong(map.get("warehouseId").toString()); + // 根据用户id和仓库id查询关联店铺 + ShopWarehouseAuto shopWarehouseAuto = new ShopWarehouseAuto(); + shopWarehouseAuto.setUserId(userId); + shopWarehouseAuto.setWarehouseId(warehouseId); + List shopWarehouseAutoList = shopWarehouseAutoService.queryList(shopWarehouseAuto); + if (!shopWarehouseAutoList.isEmpty()){ + List shopIds = shopWarehouseAutoList.stream() + .map(ShopWarehouseAuto::getShopId) + .toList(); + + List shopVoList = shopService.selectByIds(shopIds); + + String idsStr = shopVoList.stream() + .map(ShopVo::getId) + .map(String::valueOf) + .collect(Collectors.joining(",")); + Map data = new HashMap(); + data.put("userId",userId.toString()); + data.put("shopIds",idsStr); + data.put("oneClick","0"); + data.put("productIds",map.get("productId").toString()); + releaseGoods(data); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningLogFileServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningLogFileServiceImpl.java new file mode 100644 index 0000000..d8ab74f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningLogFileServiceImpl.java @@ -0,0 +1,139 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.RunningLogFileBo; +import org.dromara.zhishu.domain.vo.RunningLogFileVo; +import org.dromara.zhishu.domain.RunningLogFile; +import org.dromara.zhishu.mapper.RunningLogFileMapper; +import org.dromara.zhishu.service.IRunningLogFileService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 程序运行日志表Service业务层处理 + * + * @author yxy + * @date 2025-06-12 + */ +@RequiredArgsConstructor +@Service +public class RunningLogFileServiceImpl implements IRunningLogFileService { + + private final RunningLogFileMapper baseMapper; + + /** + * 查询程序运行日志表 + * + * @param id 主键 + * @return 程序运行日志表 + */ + @Override + public RunningLogFileVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public String selectMaxFileOrderByFileTypeAndCreateBy(String fileType,String userId){ + return baseMapper.selectMaxFileOrderByFileTypeAndCreateBy(fileType,userId); + } + + /** + * 分页查询程序运行日志表列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 程序运行日志表分页列表 + */ + @Override + public TableDataInfo queryPageList(RunningLogFileBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的程序运行日志表列表 + * + * @param bo 查询条件 + * @return 程序运行日志表列表 + */ + @Override + public List queryList(RunningLogFileBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(RunningLogFileBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(RunningLogFile::getId); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), RunningLogFile::getFileName, bo.getFileName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileOrder()), RunningLogFile::getFileOrder, bo.getFileOrder()); + lqw.eq(StringUtils.isNotBlank(bo.getFileType()), RunningLogFile::getFileType, bo.getFileType()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSize()), RunningLogFile::getFileSize, bo.getFileSize()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), RunningLogFile::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增程序运行日志表 + * + * @param bo 程序运行日志表 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(RunningLogFileBo bo) { + RunningLogFile add = MapstructUtils.convert(bo, RunningLogFile.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改程序运行日志表 + * + * @param bo 程序运行日志表 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(RunningLogFileBo bo) { + RunningLogFile update = MapstructUtils.convert(bo, RunningLogFile.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(RunningLogFile entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除程序运行日志表信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskByShopServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskByShopServiceImpl.java new file mode 100644 index 0000000..5a61a47 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskByShopServiceImpl.java @@ -0,0 +1,568 @@ +package org.dromara.zhishu.service.impl; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.dromara.zhishu.domain.dto.RunningTaskShopGoodsDto; +import org.dromara.zhishu.domain.dto.SuccessDataKfz; +import org.springframework.data.redis.core.StringRedisTemplate; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.domain.dto.ErpGoodsDto; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.vo.RunningTaskNumVo; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsVo; +import org.dromara.zhishu.mapper.RunningTaskByShopMapper; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.service.IRunningTaskByShopService; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; // 检查集合是否为空 + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 执行的任务Service业务层处理 + * + * @author yxy + * @date 2025-08-5 + */ +@RequiredArgsConstructor +@Service +public class RunningTaskByShopServiceImpl implements IRunningTaskByShopService { + + private final RunningTaskByShopMapper baseMapper; + + private final ShopMapper shopMapper; + private final StringRedisTemplate stringRedisTemplate; + + @DS("slave") + @Override + public List selectGetShopGoodsList(String tableName,String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate, Long pageNum, Long pageSize,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { + + Long priceUpLong = null; + Long priceDownLong = null; + if (priceUp != null && StringUtils.isNotEmpty(priceUp)){ + priceUpLong = Long.parseLong(new BigDecimal(priceUp).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + if (priceDown != null && StringUtils.isNotEmpty(priceDown)){ + priceDownLong = Long.parseLong(new BigDecimal(priceDown).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + + + return baseMapper.selectGetShopGoodsList(tableName,isOnsale,isbn,priceDownLong,priceUpLong,startDate,endDate, pageNum, pageSize, goodsName, stockDown, stockUp, trilateralId, goodsCode, skuCode); + } + + @DS("slave") + @Override + public int selectGetShopGoodsListCount(String tableName,String isOnsale,String isbn,String priceDown,String priceUp,String startDate,String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { + + Long priceUpLong = null; + Long priceDownLong = null; + if (priceUp != null && StringUtils.isNotEmpty(priceUp)){ + priceUpLong = Long.parseLong(new BigDecimal(priceUp).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + if (priceDown != null && StringUtils.isNotEmpty(priceDown)){ + priceDownLong = Long.parseLong(new BigDecimal(priceDown).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + + return baseMapper.selectGetShopGoodsListCount(tableName,isOnsale,isbn,priceDownLong,priceUpLong,startDate,endDate, goodsName, stockDown, stockUp, trilateralId, goodsCode, skuCode); + } + + @DS("slave") + @Override + public List selectGetShopGoodsListByDto(RunningTaskShopGoodsDto runningTaskShopGoodsDto){ + Long priceUpLong = null; + Long priceDownLong = null; + if (runningTaskShopGoodsDto.getPriceUp() != null){ + priceUpLong = Long.parseLong(new BigDecimal(runningTaskShopGoodsDto.getPriceUp()).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + if (runningTaskShopGoodsDto.getPriceDown() != null){ + priceDownLong = Long.parseLong(new BigDecimal(runningTaskShopGoodsDto.getPriceDown()).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + runningTaskShopGoodsDto.setPriceUp(priceUpLong); + runningTaskShopGoodsDto.setPriceDown(priceDownLong); + return baseMapper.selectGetShopGoodsListByDto(runningTaskShopGoodsDto); + } + + @DS("slave") + @Override + public int selectNumByIsbn(String tableName, String isbn){ + return baseMapper.selectNumByIsbn(tableName,isbn); + } + + + @DS("slave") + @Override + public int selectGetShopGoodsNum(String tableName,String isOnSale,String isbn,String priceDown,String priceUp,String startDate,String endDate,String goodsName,String stockDown,String stockUp,String trilateralId,String goodsCode,String skuCode) { + Long priceUpLong = null; + Long priceDownLong = null; + if (priceUp != null && StringUtils.isNotEmpty(priceUp)){ + priceUpLong = Long.parseLong(new BigDecimal(priceUp).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + if (priceDown != null && StringUtils.isNotEmpty(priceDown)){ + priceDownLong = Long.parseLong(new BigDecimal(priceDown).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + return baseMapper.selectGetShopGoodsNum(tableName,isOnSale,isbn,priceDownLong,priceUpLong,startDate,endDate, goodsName, stockDown, stockUp, trilateralId, goodsCode, skuCode); + } + + @DS("slave") + @Override + public int delShopGoods(String tableName,String isOnSale,String isbn,String priceDown,String priceUp,String startDate,String endDate){ + Long priceUpLong = null; + Long priceDownLong = null; + if (priceUp != null && StringUtils.isNotEmpty(priceUp)){ + priceUpLong = Long.parseLong(new BigDecimal(priceUp).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + if (priceDown != null && StringUtils.isNotEmpty(priceDown)){ + priceDownLong = Long.parseLong(new BigDecimal(priceDown).multiply(new BigDecimal(100)).toBigInteger().toString()); + } + return baseMapper.delShopGoods(tableName,isOnSale,isbn,priceDownLong,priceUpLong,startDate,endDate); + } + + @DS("slave") + @Override + public int selectByTrilateralId(String tableName, String trilateralId) { + return baseMapper.selectByTrilateralId(tableName, trilateralId); + } + + @DS("slave") + @Override + public RunningTask selectVoByTrilateralId(String tableName,String trilateralId){ + return baseMapper.selectVoByTrilateralId(tableName,trilateralId); + } + + @DS("slave") + @Override + public String selectLastFinishTime(String tableName){ + return baseMapper.selectLastFinishTime(tableName); + } + + @DS("slave") + @Override + public List selectByIsbn(String tableName,String isbn){ + return baseMapper.selectByIsbn(tableName,isbn); + } + + @DS("slave") + @Override + public List selectTaskShopNum(String tableName,Long taskId) { + return baseMapper.selectTaskShopNum(tableName,taskId); + } + + @DS("slave") + @Override + public int selectGetShopGoodsNumByTasKId(String tableName, String taskId) { + return baseMapper.selectGetShopGoodsNumByTasKId(tableName, taskId); + } + + @DS("slave") + @Override + public String selectStatus(String tableName) { + int num = checkTableExists(tableName); + if (num == 0) { + return "3"; + } + String status = baseMapper.selectStatus(tableName); + if (status == null || StringUtils.isEmpty(status) || status.equals("3")) { + return "3"; + } else { + return status; + } + } + + @DS("slave") + @Override + public List selectRepeatNoPage(String tableName){ + List mapList = baseMapper.selectRepeat(tableName); + // 按ISBN分组,计算每个ISBN需要保留的记录数 + Map isbnCounts = mapList.stream() + .collect(Collectors.groupingBy( + m -> m.getIsbn().toString(), + Collectors.counting() + )); + + // 收集需要保留的记录 + Map keptCounts = new HashMap<>(); + List result = new ArrayList<>(); + + for (SuccessDataItemDto item : mapList) { + String isbn = item.getIsbn().toString(); + long total = isbnCounts.get(isbn); + int kept = keptCounts.getOrDefault(isbn, 0); + + if (kept < total - 1) { // 保留n-1条 + result.add(item); + keptCounts.put(isbn, kept + 1); + } + } + return result; + } + + @DS("slave") + @Override + public List selectShopGoodsList(ErpGoodsDto erpGoodsDto){ + if (erpGoodsDto.getPriceUp() != null && StringUtils.isNotEmpty(erpGoodsDto.getPriceUp())){ + erpGoodsDto.setPriceUp(new BigDecimal(erpGoodsDto.getPriceUp()).multiply(new BigDecimal(100)).toString()); + } + if (erpGoodsDto.getPriceDown() != null && StringUtils.isNotEmpty(erpGoodsDto.getPriceDown())){ + erpGoodsDto.setPriceDown(new BigDecimal(erpGoodsDto.getPriceDown()).multiply(new BigDecimal(100)).toString()); + } + return baseMapper.selectShopGoodsList(erpGoodsDto); + } + + /** + * kfz专用导出店铺商品数据 + * @param erpGoodsDto + * @return + */ + @DS("slave") + @Override + public List selectKfzShopGoodsList(ErpGoodsDto erpGoodsDto){ + if (erpGoodsDto.getPriceUp() != null && StringUtils.isNotEmpty(erpGoodsDto.getPriceUp())){ + erpGoodsDto.setPriceUp(new BigDecimal(erpGoodsDto.getPriceUp()).multiply(new BigDecimal(100)).toString()); + } + if (erpGoodsDto.getPriceDown() != null && StringUtils.isNotEmpty(erpGoodsDto.getPriceDown())){ + erpGoodsDto.setPriceDown(new BigDecimal(erpGoodsDto.getPriceDown()).multiply(new BigDecimal(100)).toString()); + } + return baseMapper.selectKfzShopGoodsList(erpGoodsDto); + } + + @DS("slave") + @Override + public Page selectRepeat(String tableName,Long pageNum,Long pageSize){ + Page page = new Page<>(pageNum, pageSize); + List mapList = baseMapper.selectRepeat(tableName); + if (CollectionUtils.isEmpty(mapList)) { + return page; + } + + // 按ISBN分组,计算每个ISBN需要保留的记录数 + Map isbnCounts = mapList.stream() + .collect(Collectors.groupingBy( + m -> m.getIsbn().toString(), + Collectors.counting() + )); + + // 收集需要保留的记录 + Map keptCounts = new HashMap<>(); + List result = new ArrayList<>(); + + for (SuccessDataItemDto item : mapList) { + String isbn = item.getIsbn().toString(); + long total = isbnCounts.get(isbn); + int kept = keptCounts.getOrDefault(isbn, 0); + + if (kept < total - 1) { // 保留n-1条 + result.add(item); + keptCounts.put(isbn, kept + 1); + } + } + + // 使用MyBatis-Plus的Page对象 + page.setTotal(result.size()); + + int fromIndex = (pageNum.intValue() - 1) * pageSize.intValue(); + int toIndex = Math.min(fromIndex + pageSize.intValue(), result.size()); + + if (fromIndex > result.size()) { + page.setRecords(Collections.emptyList()); + } else { + page.setRecords(result.subList(fromIndex, toIndex)); + } + + return page; + } + + @DS("slave") + @Override + public int checkTableExists(String tableName) { + return baseMapper.checkTableExists(tableName); + } + + @DS("slave") + @Override + public void createTable(String tableName) { + baseMapper.createTable(tableName); + } + + @DS("slave") + @Override + public void insert(String tableName, RunningTask task) { + baseMapper.insert(tableName, task); + } + + @DS("slave") + @Override + public void update(String tableName, RunningTask task) { + baseMapper.update(tableName, task); + } + + @DS("slave") + @Override + public void batchInsert(String tableName, List list) { + baseMapper.batchInsert(tableName, list); + } + + + @DS("slave") + @Override + public void updateStatus(String tableName) { + baseMapper.updateStatus(tableName); + } + + @DS("slave") + @Override + public void deleteAll(String tableName) { + baseMapper.deleteAll(tableName); + } + + @DS("slave") + @Override + public void deleteByStatus(String tableName,String status){ + baseMapper.deleteByStatus(tableName,status); + } + + @DS("slave") + @Override + public void deleteByTaskId(String tableName,String taskId){ + baseMapper.deleteByTaskId(tableName,taskId); + } + + @DS("slave") + @Override + public void deleteByGoodsId(String tableName, String goodsId) { + baseMapper.deleteByGoodsId(tableName, goodsId); + } + + @DS("slave") + @Override + public List selectOnSaleGoodsId(String tableName) { + return baseMapper.selectOnSaleGoodsId(tableName); + } + + @DS("slave") + @Override + public List selectByGoodsId(String tableName, String trilateralId) { + return baseMapper.selectByGoodsId(tableName, trilateralId); + } + + @DS("slave") + @Override + public void updateSuccessDataById( String tableName, String id, String successDataJsonStr) { + baseMapper.updateSuccessDataById(tableName, id, successDataJsonStr); + } + @DS("slave") + @Override + public List getShopGoodsList(String tableName) { + return baseMapper.getShopGoodsList(tableName); + } + @DS("slave") + @Override + public Integer getShopGoodsTotalNum(String tableName) { + return baseMapper.getShopGoodsTotalNum(tableName); + } + + @DS("slave") + @Override + public Integer getShopGoodsTotalNumByTaskId(String tableName,Long taskId){ + return baseMapper.getShopGoodsTotalNumByTaskId(tableName,taskId); + } + + @DS("slave") + @Override + public Map batchCheckGoodsIdExists(String tableName, List goodsIds) { + if (goodsIds.isEmpty()) { + return new HashMap<>(); + } + + // 分批处理,避免IN条件过长 + List> batches = Lists.partition(goodsIds, 1000); + Map result = new ConcurrentHashMap<>(); + + batches.parallelStream().forEach(batch -> { + List> existsList = baseMapper.batchCheckExists(tableName, batch); + existsList.forEach(item -> { + String goodsId = item.get("goods_id").toString(); + Boolean exists = "1".equals(item.get("exists_flag").toString()); + result.put(goodsId, exists); + }); + }); + + return result; + } + + @Override + @DS("slave") + public List selectGetShopGoodsListAll(String tableName, String isOnsale, Long pageNum, Long pageSize) { + return baseMapper.selectGetShopGoodsListAll(tableName,isOnsale, pageNum, pageSize); + } + + @DS("slave") + @Override + public Integer countAll(String tableName) { + return baseMapper.countAll(tableName); + } + + /** + * 批量查询goods_id是否存在,返回存在的goods_id列表 + * @param tableName + * @param goodsIds + * @return + */ + @DS("slave") + @Override + public List batchSelectExistsByGoodsIds(String tableName,List goodsIds){ + return baseMapper.batchSelectExistsByGoodsIds(tableName,goodsIds); + } + + @DS("slave") + @Override + public Map selectTodayGoods(List shopId) { + + /** 等待修改读取缓存中的数据 */ + + Map resMap = new HashMap<>(); + + if (CollectionUtils.isEmpty(shopId)) { + System.out.println("用户无关联店铺,返回空数据"); + resMap.put("todayPublishGoods", 0); + resMap.put("todayUpdateGoods", 0); + resMap.put("todayDeleteGoods", 0); + return resMap; + } + + String startTime = LocalDate.now().atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + String endTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + + // 初始化统计变量 + int todayPublishGoods = 0; + int todayEditGoodsTotal = 0; + int todayDelGoodsTotal = 0; + + int processedTables = 0; + int skippedTables = 0; + + long startTimeMs = System.currentTimeMillis(); + + for (String shopIdStr : shopId) { + String tableName = "t_running_task_" + shopIdStr; + + try { + int checkMark = baseMapper.checkTableExists(tableName); + if (checkMark == 0) { + skippedTables++; + continue; + } + + Map res = baseMapper.selectTodayGoods(tableName, startTime, endTime); + processedTables++; + + // 安全转换每个店铺的结果 + if (res != null) { + todayPublishGoods += safeConvertToInt(res.get("todayPublishGoods")); + todayEditGoodsTotal += safeConvertToInt(res.get("todayEditGoods")); + todayDelGoodsTotal += safeConvertToInt(res.get("todayDelGoods")); + } + } catch (Exception e) { + System.out.printf("查询店铺今日商品数据异常,店铺ID: %d, 表名: %s, 异常信息: %s", + Long.parseLong(shopIdStr), tableName, e.getMessage()); + } + } + + long endTimeMs = System.currentTimeMillis(); + + // 将统计结果放入返回map + resMap.put("todayPublishGoods", todayPublishGoods); + resMap.put("todayUpdateGoods", todayEditGoodsTotal); + resMap.put("todayDeleteGoods", todayDelGoodsTotal); + + // 添加性能统计信息(可选) + resMap.put("_stats", Map.of( + "processedTables", processedTables, + "skippedTables", skippedTables, + "queryTimeMs", endTimeMs - startTimeMs + )); + + System.out.printf("今日商品数据查询完成: 发布=%d, 修改=%d, 删除=%d, 处理表=%d, 跳过表=%d, 耗时=%dms%n", + todayPublishGoods, todayEditGoodsTotal, todayDelGoodsTotal, + processedTables, skippedTables, endTimeMs - startTimeMs); + + return resMap; + } + + // 安全类型转换方法 + private int safeConvertToInt(Object value) { + if (value == null) return 0; + if (value instanceof Integer) return (Integer) value; + if (value instanceof Long) return ((Long) value).intValue(); + if (value instanceof BigDecimal) return ((BigDecimal) value).intValue(); + if (value instanceof BigInteger) return ((BigInteger) value).intValue(); + if (value instanceof Number) return ((Number) value).intValue(); + try { + return Integer.parseInt(value.toString()); + } catch (NumberFormatException e) { + return 0; + } + } + + @DS("slave") + @Override + public Map selectTodaySales(List shopId) { + Map resMap = new HashMap<>(); + + if (CollectionUtils.isEmpty(shopId)) { + System.out.println("用户无关联店铺,返回空数据"); + resMap.put("todayOrder", 0); + resMap.put("turnover", 0); + return resMap; + } + + String todayDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + int todayOrderTotal = 0; + double profitTotal = 0.0; + + for (String shopIdStr : shopId) { + try { + String orderCountKey = "order_count_" + todayDate + "_" + shopIdStr; + String orderAmountKey = "order_amount_" + todayDate + "_" + shopIdStr; + + String orderCountStr = stringRedisTemplate.opsForValue().get(orderCountKey); + String orderAmountStr = stringRedisTemplate.opsForValue().get(orderAmountKey); + + if (StringUtils.isNotEmpty(orderCountStr)) { + todayOrderTotal += Integer.parseInt(orderCountStr); + } + + // 累加订单金额(利润) + if (StringUtils.isNotEmpty(orderAmountStr)) { + profitTotal += Double.parseDouble(orderAmountStr); + } + + } catch (Exception e) { + System.out.printf("读取Redis数据异常,店铺ID: %s, 异常信息: %s%n", shopIdStr, e.getMessage()); + } + } + + // 将统计结果放入返回map + resMap.put("todayOrder", todayOrderTotal); + resMap.put("turnover", profitTotal); + + System.out.printf("今日销售数据查询完成: 订单数=%d, 利润=%.2f%n", todayOrderTotal, profitTotal); + + return resMap; + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskServiceImpl.java new file mode 100644 index 0000000..169a5a8 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/RunningTaskServiceImpl.java @@ -0,0 +1,200 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.pdd.pop.sdk.common.util.JsonUtil; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.vo.RunningTaskNumVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.RunningTaskBo; +import org.dromara.zhishu.domain.vo.RunningTaskVo; +import org.dromara.zhishu.domain.RunningTask; +import org.dromara.zhishu.mapper.RunningTaskMapper; +import org.dromara.zhishu.service.IRunningTaskService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 执行的任务Service业务层处理 + * + * @author yxy + * @date 2025-07-23 + */ +@RequiredArgsConstructor +@Service +public class RunningTaskServiceImpl implements IRunningTaskService { + + private final RunningTaskMapper baseMapper; + + private final IShopService shopService; + + + @DS("slave") + @Override + public List selectGetShopGoodsList(Long shopId,Long pageNum,Long pageSize){ + return baseMapper.selectGetShopGoodsList(shopId,pageNum,pageSize); + } + + + @DS("slave") + @Override + public List> selectLogByTaskId(Long taskId){ + return baseMapper.selectLogByTaskId(taskId); + } + + @DS("slave") + @Override + public Long selectGetShopGoodsNum(Long shopId){ + return baseMapper.selectGetShopGoodsNum(shopId); + } + + @DS("slave") + @Override + public Map selectTaskStatus(){ + return baseMapper.selectTaskStatus(); + } + + @DS("slave") + @Override + public List selectTaskAllNum(Long taskId){ + return baseMapper.selectTaskAllNum(taskId); + } + + @DS("slave") + @Override + public Long selectTaskIsRunning(Long taskId){ + return baseMapper.selectTaskIsRunning(taskId); + } + + @DS("slave") + @Override + public Long selectShopTaskByGetShopGoods(Long shopId){ + return baseMapper.selectShopTaskByGetShopGoods(shopId); + } + + @DS("slave") + @Override + public Long selectTaskStatusByTaskType(Long shopId,String taskType){ + return baseMapper.selectTaskStatusByTaskType(shopId,taskType); + } + + @DS("slave") + @Override + public Long selectTaskStatusByTaskTypeAndIsbn(Long shopId, String taskType, String isbn) { + return baseMapper.selectTaskStatusByTaskTypeAndIsbn(shopId,taskType,isbn); + + } + + @DS("slave") + @Override + public Long selectTaskStatusRunningCount(){ + return baseMapper.selectTaskStatusRunningCount(); + } + + @DS("slave") + @Override + public List selectTaskByGroupShopMd5(){ + return baseMapper.selectTaskByGroupShopMd5(); + } + + @DS("slave") + @Override + public List selectTaskGroupShop(String taskType){ + return baseMapper.selectTaskGroupShop(taskType); + } + + @DS("slave") + @Override + public List selectTaskShopNum(Long taskId,Long shopId){ + return baseMapper.selectTaskShopNum(taskId,shopId); + } + + /** + * 新增执行的任务 + * + * @param bo 执行的任务 + * @return 是否新增成功 + */ + @DS("slave") + @Override + public Boolean insert(RunningTask runningTask) { + return baseMapper.insert(runningTask) > 0; + } + + @DS("slave") + @Override + public Boolean batchInsert(List list){ + return baseMapper.batchInsert(list) > 0; + } + + /** + * 修改执行的任务 暂停/恢复/中止 + * @param runningTask + * @return + */ + @DS("slave") + @Override + public Boolean update(RunningTask runningTask) { + return baseMapper.update(runningTask) > 0; + } + + + @Override + public Map getJavaTaskPool(String ip,String host,String url){ + + Map javaTaskPoolStatusMap = new HashMap(); + + try{ + String javaTaskPool = InterfaceUtils.getInterfaceGetShort("http://"+ip+":"+host,url); + Map map = JsonUtil.transferToObj(javaTaskPool, Map.class); + Map data = (Map) map.get("data"); + + //活跃线程数 + int active = (int) data.get("active"); + //提交任务数 + int submitted = (int) data.get("submitted"); + //完成任务数 + int completed = (int) data.get("completed"); + String shopMd5 = data.get("shopMd5").toString(); + javaTaskPoolStatusMap.put("ip",ip); + javaTaskPoolStatusMap.put("host",host); + javaTaskPoolStatusMap.put("active",active); + javaTaskPoolStatusMap.put("submitted",submitted); + javaTaskPoolStatusMap.put("completed",completed); + javaTaskPoolStatusMap.put("shopMd5",shopMd5); + }catch (Exception e){ + javaTaskPoolStatusMap.put("ip",ip); + javaTaskPoolStatusMap.put("host",host); + javaTaskPoolStatusMap.put("active",-1); + javaTaskPoolStatusMap.put("submitted",-1); + javaTaskPoolStatusMap.put("completed",-1); + javaTaskPoolStatusMap.put("shopMd5","连接中断"); + } + return javaTaskPoolStatusMap; + } + + /** + * 修改拉取的任务 2变3 + * @param shopId + * @return + */ + @DS("slave") + @Override + public Boolean updataStatus(Long shopId,Long taskId) { + return baseMapper.updataStatus("t_running_task_"+shopId,taskId); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopContextServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopContextServiceImpl.java new file mode 100644 index 0000000..70ff8f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopContextServiceImpl.java @@ -0,0 +1,137 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.ShopContextBo; +import org.dromara.zhishu.domain.vo.ShopContextVo; +import org.dromara.zhishu.domain.ShopContext; +import org.dromara.zhishu.mapper.ShopContextMapper; +import org.dromara.zhishu.service.IShopContextService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 店铺设置商品描述Service业务层处理 + * + * @author yxy + * @date 2025-09-30 + */ +@RequiredArgsConstructor +@Service +public class ShopContextServiceImpl implements IShopContextService { + + private final ShopContextMapper baseMapper; + + /** + * 查询店铺设置商品描述 + * + * @param id 主键 + * @return 店铺设置商品描述 + */ + @Override + public ShopContextVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public ShopContextVo selectByShopId(Long shopId){ + return baseMapper.selectByShopId(shopId); + } + + /** + * 分页查询店铺设置商品描述列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 店铺设置商品描述分页列表 + */ + @Override + public TableDataInfo queryPageList(ShopContextBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的店铺设置商品描述列表 + * + * @param bo 查询条件 + * @return 店铺设置商品描述列表 + */ + @Override + public List queryList(ShopContextBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ShopContextBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(ShopContext::getId); + lqw.eq(bo.getShopId() != null, ShopContext::getShopId, bo.getShopId()); + lqw.eq(StringUtils.isNotBlank(bo.getContext()), ShopContext::getContext, bo.getContext()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ShopContext::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增店铺设置商品描述 + * + * @param bo 店铺设置商品描述 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ShopContextBo bo) { + ShopContext add = MapstructUtils.convert(bo, ShopContext.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改店铺设置商品描述 + * + * @param bo 店铺设置商品描述 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ShopContextBo bo) { + ShopContext update = MapstructUtils.convert(bo, ShopContext.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ShopContext entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除店铺设置商品描述信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopDetailServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopDetailServiceImpl.java new file mode 100644 index 0000000..4de3170 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopDetailServiceImpl.java @@ -0,0 +1,362 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import org.dromara.zhishu.domain.ShopWarehouseAuto; +import org.dromara.zhishu.service.IShopWarehouseAutoService; +import org.dromara.zhishu.util.HttpUtils; +import org.dromara.zhishu.util.JsonObjUtil; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.zhishu.domain.bo.ShopContextBo; +import org.dromara.zhishu.domain.bo.ShopWarehouseBo; +import org.dromara.zhishu.domain.vo.ShopContextVo; +import org.dromara.zhishu.domain.vo.ShopWarehouseVo; +import org.dromara.zhishu.mapper.ShopContextMapper; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.service.IShopContextService; +import org.dromara.zhishu.service.IShopWarehouseService; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.ShopDetailBo; +import org.dromara.zhishu.domain.vo.ShopDetailVo; +import org.dromara.zhishu.domain.ShopDetail; +import org.dromara.zhishu.mapper.ShopDetailMapper; +import org.dromara.zhishu.service.IShopDetailService; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.LinkedHashMap; +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.HashMap; + +/** + * 商品详情Service业务层处理 + * + * @author yxy + * @date 2025-03-13 + */ +@RequiredArgsConstructor +@Service +public class ShopDetailServiceImpl implements IShopDetailService { + + private final ShopDetailMapper baseMapper; + + private final IShopContextService shopContextService; + + private final IShopWarehouseService shopWarehouseService; + + private final IShopWarehouseAutoService shopWarehouseAutoService; + + /** + * 查询商品详情 + * + * @param id 主键 + * @return 商品详情 + */ + @Override + public ShopDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public ShopDetailVo queryByShopId(Long shopId) { + ShopDetailVo shopDetailVo = baseMapper.selectVoByShopId(shopId); + + shopDetailVo.setWarehouseList( + shopWarehouseService.queryListByShopId(shopId) + .stream() + .map(ShopWarehouseVo::getUserId) + .collect(Collectors.toList()) + ); + shopDetailVo.setMappingList( + shopWarehouseAutoService.queryListByShopId(shopId) + .stream() + .map(item -> item.getUserId()+"-"+item.getWarehouseId()) + .collect(Collectors.toList()) + ); + + ShopContextVo shopContextVo = shopContextService.selectByShopId(shopId); + if(shopContextVo != null){ + shopDetailVo.setContext(shopContextVo.getContext()); + } + return shopDetailVo; + } + + /** + * 分页查询商品详情列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品详情分页列表 + */ + @Override + public TableDataInfo queryPageList(ShopDetailBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的商品详情列表 + * + * @param bo 查询条件 + * @return 商品详情列表 + */ + @Override + public List queryList(ShopDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ShopDetailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(ShopDetail::getId); + lqw.eq(bo.getShopId() != null, ShopDetail::getShopId, bo.getShopId()); + lqw.eq(bo.getTemplateId() != null, ShopDetail::getTemplateId, bo.getTemplateId()); + lqw.eq(bo.getHighPrice() != null, ShopDetail::getHighPrice, bo.getHighPrice()); + lqw.eq(bo.getLowPrice() != null, ShopDetail::getLowPrice, bo.getLowPrice()); + lqw.eq(bo.getSaleTemplateId() != null, ShopDetail::getSaleTemplateId, bo.getSaleTemplateId()); + lqw.eq(StringUtils.isNotBlank(bo.getSevenDays()), ShopDetail::getSevenDays, bo.getSevenDays()); + lqw.eq(StringUtils.isNotBlank(bo.getIsSecondHand()), ShopDetail::getIsSecondHand, bo.getIsSecondHand()); + lqw.eq(StringUtils.isNotBlank(bo.getCarouselNum()), ShopDetail::getCarouselNum, bo.getCarouselNum()); + lqw.eq(StringUtils.isNotBlank(bo.getIsDetailsImg()), ShopDetail::getIsDetailsImg, bo.getIsDetailsImg()); + lqw.eq(StringUtils.isNotBlank(bo.getIsCatalogueDetails()), ShopDetail::getIsCatalogueDetails, bo.getIsCatalogueDetails()); + lqw.eq(StringUtils.isNotBlank(bo.getIsInformationImg()), ShopDetail::getIsInformationImg, bo.getIsInformationImg()); + lqw.eq(StringUtils.isNotBlank(bo.getTitlePrefix()), ShopDetail::getTitlePrefix, bo.getTitlePrefix()); + lqw.eq(StringUtils.isNotBlank(bo.getTitleSuffix()), ShopDetail::getTitleSuffix, bo.getTitleSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getTitleFilter()), ShopDetail::getTitleFilter, bo.getTitleFilter()); + lqw.eq(StringUtils.isNotBlank(bo.getItemNumberPrefix()), ShopDetail::getItemNumberPrefix, bo.getItemNumberPrefix()); + lqw.eq(StringUtils.isNotBlank(bo.getTitleConsistOf()), ShopDetail::getTitleConsistOf, bo.getTitleConsistOf()); + lqw.eq(StringUtils.isNotBlank(bo.getSpaceCharacter()), ShopDetail::getSpaceCharacter, bo.getSpaceCharacter()); + lqw.eq(StringUtils.isNotBlank(bo.getAutoTruncation()), ShopDetail::getAutoTruncation, bo.getAutoTruncation()); + lqw.eq(StringUtils.isNotBlank(bo.getMySetUp()), ShopDetail::getMySetUp, bo.getMySetUp()); + lqw.eq(StringUtils.isNotBlank(bo.getSystemSetUp()), ShopDetail::getSystemSetUp, bo.getSystemSetUp()); + lqw.eq(StringUtils.isNotBlank(bo.getFilterSuit()), ShopDetail::getFilterSuit, bo.getFilterSuit()); + lqw.eq(StringUtils.isNotBlank(bo.getIsDelProtect()), ShopDetail::getIsDelProtect, bo.getIsDelProtect()); + lqw.eq(StringUtils.isNotBlank(bo.getIsRemoveProtect()), ShopDetail::getIsRemoveProtect, bo.getIsRemoveProtect()); + lqw.eq(StringUtils.isNotBlank(bo.getBootPrice()), ShopDetail::getBootPrice, bo.getBootPrice()); + lqw.eq(StringUtils.isNotBlank(bo.getOwnPictures()), ShopDetail::getOwnPictures, bo.getOwnPictures()); + return lqw; + } + + /** + * 新增商品详情 + * + * @param bo 商品详情 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ShopDetailBo bo) { + ShopDetail add = MapstructUtils.convert(bo, ShopDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + + +// String url = "http://localhost:30200/api/updateSourceTable"; + String url = "http://localhost:9099/api/updateSourceTable"; + + // 创建请求体,包含ID参数 + Map requestBody = new HashMap<>(); + requestBody.put("ShopID", bo.getShopId().toString()); + + // 设置请求头 + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + try { + // 将请求对象转换为JSON字符串 + String jsonBody = HttpUtils.convertObjectToJson(requestBody); + + // 发送POST请求 + String response = HttpUtils.sendPost(url, headers, jsonBody); + System.out.println("调用updateShopDetail接口成功,响应: " + response); + } catch (Exception e) { + System.err.println("调用updateShopDetail接口失败: " + e.getMessage()); + e.printStackTrace(); + } + +// insertShopDetialIntoRedis(bo); + } + return flag; + } + + /** + * 向redis,db7中添加数据 + * @param bo + */ +// public void insertShopDetialIntoRedis(ShopDetailBo bo){ +// if (ObjectUtil.isEmpty(bo) || bo.getShopId() == null) { +// return; +// } +// +// try { +// String redisKey = bo.getShopId().toString(); +// // 构建shop_detail数据结构 +// Map shopDetailData = new LinkedHashMap<>(); +// shopDetailData.put("source_table", "t_shop_detail"); +// shopDetailData.put("data", bo); +// String shopDetailJson = JsonObjUtil.objectToJsonWithSnakeKeys(shopDetailData); +// +// // 获取Redis中的List +// org.redisson.api.RList redisList = RedisUtils.getThirdClient().getList(redisKey); +// boolean updated = false; +// +// // 遍历List,更新对应source_table的数据 +// for (int i = 0; i < redisList.size(); i++) { +// String item = redisList.get(i); +// Map itemMap = JSONUtil.toBean(item, Map.class); +// if ("t_shop_detail".equals(itemMap.get("source_table"))) { +// redisList.set(i, shopDetailJson); +// updated = true; +// break; +// } +// } +// +// // 如果没有找到对应数据,则添加新元素 +// if (!updated) { +// redisList.add(shopDetailJson); +// } +// +// } catch (Exception e) { +// System.out.println(e.getMessage()); +// } +// } + + + /** + * 修改商品详情 + * + * @param bo 商品详情 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ShopDetailBo bo) { + ShopDetail update = MapstructUtils.convert(bo, ShopDetail.class); + validEntityBeforeSave(update); + + // 修改关联的仓库id + shopWarehouseService.deleteByShopId(bo.getShopId()); + for(Long warehouseId : bo.getWarehouseList()){ + ShopWarehouseBo shopWarehouseBo = new ShopWarehouseBo(); + shopWarehouseBo.setUserId(warehouseId); + shopWarehouseBo.setShopId(bo.getShopId()); + shopWarehouseService.insertByBo(shopWarehouseBo); + } + + // 修改关联的进销存仓库 + shopWarehouseAutoService.deleteByShopId(bo.getShopId()); + for (String data : bo.getMappingList()){ + String[] ids = data.split("-"); + String userId = ids[0]; + String warehouseId = ids[1]; + ShopWarehouseAuto shopWarehouseAuto = new ShopWarehouseAuto(); + shopWarehouseAuto.setShopId(bo.getShopId()); + shopWarehouseAuto.setUserId(Long.parseLong(userId)); + shopWarehouseAuto.setWarehouseId(Long.parseLong(warehouseId)); + shopWarehouseAutoService.insertByBo(shopWarehouseAuto); + } + + ShopContextVo shopContextVo = shopContextService.selectByShopId(bo.getShopId()); + if(shopContextVo != null){ + //修改 + ShopContextBo shopContextBo = new ShopContextBo(); + shopContextBo.setId(shopContextVo.getId()); + shopContextBo.setContext(bo.getContext()); + shopContextService.updateByBo(shopContextBo); + }else{ + ShopContextBo shopContextBo = new ShopContextBo(); + shopContextBo.setShopId(bo.getShopId()); + shopContextBo.setContext(bo.getContext()); + shopContextService.insertByBo(shopContextBo); + } + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + // 修改成功后更新shopDetail的redis数据 + +// String url = "http://localhost:30200/api/updateSourceTable"; + String url = "http://localhost:9099/api/updateSourceTable"; + + // 创建请求体,包含ID参数 + Map requestBody = new HashMap<>(); + requestBody.put("ShopID", bo.getShopId().toString()); + + // 设置请求头 + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + try { + // 将请求对象转换为JSON字符串 + String jsonBody = HttpUtils.convertObjectToJson(requestBody); + + // 发送POST请求 + String response = HttpUtils.sendPost(url, headers, jsonBody); + System.out.println("调用updateShopDetail接口成功,响应: " + response); + } catch (Exception e) { + System.err.println("调用updateShopDetail接口失败: " + e.getMessage()); + e.printStackTrace(); + } +// insertShopDetialIntoRedis(bo); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ShopDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除商品详情信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public UploadResult upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + + return uploadResult; + } + + @Override + public String selectSaleTemplateIdByShopId(Long shopId) { + return baseMapper.selectSaleTemplateIdByShopId(shopId); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsPublishedLogServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsPublishedLogServiceImpl.java new file mode 100644 index 0000000..5c267b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsPublishedLogServiceImpl.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; +import org.dromara.zhishu.mapper.ShopGoodsPublishedLogMapper; +import org.dromara.zhishu.service.ShopGoodsPublishedLogService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ShopGoodsPublishedLogServiceImpl extends ServiceImpl implements ShopGoodsPublishedLogService { + + private final ShopGoodsPublishedLogMapper shopGoodsPublishedLogMapper; + + @Override + public ShopGoodsPublishedLog queryPublishedLogByOrderSn(String platformId, String aboutId, Integer platformType, Integer logType, Integer operationType) { + List list = new LambdaQueryChainWrapper<>(shopGoodsPublishedLogMapper) + .eq(ShopGoodsPublishedLog::getDelFlag, "0") + .eq(ShopGoodsPublishedLog::getPlatformId, platformId) + .eq(ShopGoodsPublishedLog::getAboutId, aboutId) + .eq(ShopGoodsPublishedLog::getPlatformType, platformType) + .eq(ShopGoodsPublishedLog::getLogType, logType) + .eq(ShopGoodsPublishedLog::getOperationType, operationType) + .list(); + if (!list.isEmpty()) + return list.get(0); + return null; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsRejectionServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsRejectionServiceImpl.java new file mode 100644 index 0000000..d84ecfa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopGoodsRejectionServiceImpl.java @@ -0,0 +1,100 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.ShopGoodsPublished; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; +import org.dromara.zhishu.domain.ShopGoodsRejection; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.mapper.ShopGoodsPublishedLogMapper; +import org.dromara.zhishu.mapper.ShopGoodsRejectionMapper; +import org.dromara.zhishu.service.IShopService; +import org.dromara.zhishu.service.ShopGoodsPublishedLogService; +import org.dromara.zhishu.service.ShopGoodsRejectionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.awt.print.Pageable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class ShopGoodsRejectionServiceImpl extends ServiceImpl implements ShopGoodsRejectionService { + + @Autowired + private ShopGoodsRejectionMapper shopGoodsRejectionMapper; + + private final IShopService shopService; + @Override + @Transactional + public boolean save(ShopGoodsRejection shopGoodsRejection) { + if (shopGoodsRejection.getCreateTime() == null) { + shopGoodsRejection.setCreateTime(new java.util.Date()); + } + return shopGoodsRejectionMapper.insert(shopGoodsRejection) > 0; + } + + @Override + @Transactional + public boolean delete(Long id) { + return shopGoodsRejectionMapper.deleteById(id) > 0; + } + + @Override + @Transactional + public boolean update(ShopGoodsRejection shopGoodsRejection) { + return shopGoodsRejectionMapper.update(shopGoodsRejection) > 0; + } + + @Override + public ShopGoodsRejection findById(Long id) { + return shopGoodsRejectionMapper.selectById(id); + } + + @Override + public List findAll() { + return shopGoodsRejectionMapper.selectAll(); + } + + @Override + public List findByShopId(String shopId) { + return shopGoodsRejectionMapper.selectByShopId(shopId); + } + + @Override + public List findByPlatformId(String platformId) { + return shopGoodsRejectionMapper.selectByPlatformId(platformId); + } + + @Override + public List search(ShopGoodsRejection condition) { + return shopGoodsRejectionMapper.selectByCondition(condition); + } + + @Override + public TableDataInfo searchWithPage(ShopGoodsRejection bo, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + if(userId != 1){ + bo.setUserId(userId); + } + Page result =shopGoodsRejectionMapper.selectByConditionWithPage(pageQuery.build(),bo); + for (ShopGoodsRejection shopGoodsRejection : result.getRecords()){ + ShopVo shopVo = shopService.queryById(shopGoodsRejection.getShopId()); + shopGoodsRejection.setShopName(shopVo.getShopName()); + } + return TableDataInfo.build(result); + } + + @Override + public int count(ShopGoodsRejection condition) { + return shopGoodsRejectionMapper.countByCondition(condition); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopWarehouseServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopWarehouseServiceImpl.java new file mode 100644 index 0000000..86167e4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ShopWarehouseServiceImpl.java @@ -0,0 +1,93 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.dromara.zhishu.domain.bo.ShopWarehouseBo; +import org.dromara.zhishu.domain.vo.ShopWarehouseVo; +import org.dromara.zhishu.domain.ShopWarehouse; +import org.dromara.zhishu.mapper.ShopWarehouseMapper; +import org.dromara.zhishu.service.IShopWarehouseService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.stream.Collectors; + +/** + * 店铺与仓库自动发布关联Service业务层处理 + * + * @author yxy + * @date 2025-12-28 + */ +@RequiredArgsConstructor +@Service +public class ShopWarehouseServiceImpl implements IShopWarehouseService { + + private final ShopWarehouseMapper baseMapper; + + /** + * 查询店铺与仓库自动发布关联 + * + * @param id 主键 + * @return 店铺与仓库自动发布关联 + */ + @Override + public ShopWarehouseVo queryById(Long id) { + ShopWarehouse shopWarehouse = baseMapper.selectById(id); + return MapstructUtils.convert(shopWarehouse, ShopWarehouseVo.class); + } + + /** + * 根据店铺ID查询关联列表 + * + * @param shopId 店铺ID + * @return 关联列表 + */ + @Override + public List queryListByShopId(Long shopId) { + List list = baseMapper.selectByShopId(shopId); + return list.stream() + .map(item -> MapstructUtils.convert(item, ShopWarehouseVo.class)) + .collect(Collectors.toList()); + } + + /** + * 新增店铺与仓库自动发布关联 + * + * @param bo 店铺与仓库自动发布关联 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ShopWarehouseBo bo) { + ShopWarehouse add = MapstructUtils.convert(bo, ShopWarehouse.class); + return baseMapper.insert(add) > 0; + } + + /** + * 修改店铺与仓库自动发布关联 + * + * @param bo 店铺与仓库自动发布关联 + * @return 是否修改成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(ShopWarehouseBo bo) { + ShopWarehouse update = MapstructUtils.convert(bo, ShopWarehouse.class); + return baseMapper.update(update) > 0; + } + + /** + * 根据店铺删除关联信息 + * @param shopId 店铺ID + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteByShopId(Long shopId) { + return baseMapper.deleteByShopId(shopId) > 0; + } + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SignGeneratorServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SignGeneratorServiceImpl.java new file mode 100644 index 0000000..1ae2acc --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SignGeneratorServiceImpl.java @@ -0,0 +1,43 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.service.SignGeneratorService; +import org.springframework.stereotype.Service; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +@RequiredArgsConstructor +@Service +public class SignGeneratorServiceImpl implements SignGeneratorService { + + @Override + public String generateCallbackSign(String loginCode, long timestamp, String secret) { + try { + // 签名算法:SHA256(loginCode + timestamp + secret) + String signStr = loginCode + timestamp + secret; + + // 计算SHA256 + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hashed = digest.digest(signStr.getBytes()); + + // 转换为十六进制字符串 + return bytesToHex(hashed); + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("SHA-256 algorithm not found", e); + } + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SpecServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SpecServiceImpl.java new file mode 100644 index 0000000..dbf118d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/SpecServiceImpl.java @@ -0,0 +1,246 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import org.dromara.zhishu.util.HttpUtils; +import org.dromara.zhishu.util.JsonObjUtil; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.SpecBo; +import org.dromara.zhishu.domain.vo.SpecVo; +import org.dromara.zhishu.domain.Spec; +import org.dromara.zhishu.mapper.SpecMapper; +import org.dromara.zhishu.service.ISpecService; + +import java.util.*; + +/** + * 自定义规格设置Service业务层处理 + * + * @author yxy + * @date 2025-03-27 + */ +@RequiredArgsConstructor +@Service +public class SpecServiceImpl implements ISpecService { + + private final SpecMapper baseMapper; + + /** + * 查询自定义规格设置 + * + * @param id 主键 + * @return 自定义规格设置 + */ + @Override + public SpecVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public SpecVo selectVoByShopId(Long shopId) { + return baseMapper.selectVoByShopId(shopId); + } + + /** + * 分页查询自定义规格设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 自定义规格设置分页列表 + */ + @Override + public TableDataInfo queryPageList(SpecBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的自定义规格设置列表 + * + * @param bo 查询条件 + * @return 自定义规格设置列表 + */ + @Override + public List queryList(SpecBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SpecBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(Spec::getId); + lqw.eq(StringUtils.isNotBlank(bo.getSpecTypeId()), Spec::getSpecTypeId, bo.getSpecTypeId()); + lqw.like(StringUtils.isNotBlank(bo.getSpecTypeName()), Spec::getSpecTypeName, bo.getSpecTypeName()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecCompose()), Spec::getSpecCompose, bo.getSpecCompose()); + lqw.like(StringUtils.isNotBlank(bo.getSpecName()), Spec::getSpecName, bo.getSpecName()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecPrefix()), Spec::getSpecPrefix, bo.getSpecPrefix()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecSuffix()), Spec::getSpecSuffix, bo.getSpecSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecCodeCompose()), Spec::getSpecCodeCompose, bo.getSpecCodeCompose()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecCodePrefix()), Spec::getSpecCodePrefix, bo.getSpecCodePrefix()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecCodeSuffix()), Spec::getSpecCodeSuffix, bo.getSpecCodeSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getSpecSyUrl()), Spec::getSpecSyUrl, bo.getSpecSyUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Spec::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增自定义规格设置 + * + * @param bo 自定义规格设置 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SpecBo bo) { + Spec add = MapstructUtils.convert(bo, Spec.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + // 新增成功后添加到Redis + + //更新Redis +// String specUrl = "http://localhost:30200/api/updateSourceTable"; + String specUrl = "http://localhost:9099/api/updateSourceTable"; + + // 创建请求体,包含ID参数 + Map requestBody = new HashMap<>(); + requestBody.put("ShopID", bo.getShopId().toString()); + + // 设置请求头 + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + try { + // 将请求对象转换为JSON字符串 + String jsonBody = HttpUtils.convertObjectToJson(requestBody); + + // 发送POST请求 + String response = HttpUtils.sendPost(specUrl, headers, jsonBody); + System.out.println("调用updateShopHandler接口成功,响应: " + requestBody); + } catch (Exception e) { + System.err.println("调用updateShopHandler接口失败: " + e.getMessage()); + e.printStackTrace(); + } +// insertSpecIntoRedis(bo); + } + return flag; + } + + /** + * 修改自定义规格设置 + * + * @param bo 自定义规格设置 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SpecBo bo) { + Spec update = MapstructUtils.convert(bo, Spec.class); + validEntityBeforeSave(update); + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + // 更新成功后更新Redis中的spec数据 + + + //更新Redis +// String specUrl = "http://localhost:30200/api/updateSourceTable"; + String specUrl = "http://localhost:9099/api/updateSourceTable"; + + // 创建请求体,包含ID参数 + Map requestBody = new HashMap<>(); + requestBody.put("ShopID", bo.getShopId().toString()); + + // 设置请求头 + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + try { + // 将请求对象转换为JSON字符串 + String jsonBody = HttpUtils.convertObjectToJson(requestBody); + + // 发送POST请求 + String response = HttpUtils.sendPost(specUrl, headers, jsonBody); + System.out.println("调用updateShopHandler接口成功,响应: " + requestBody); + } catch (Exception e) { + System.err.println("调用updateShopHandler接口失败: " + e.getMessage()); + e.printStackTrace(); + } +// insertSpecIntoRedis(bo); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Spec entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除自定义规格设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 向redis,db7中添加t_spec数据 + * @param bo + */ +// public void insertSpecIntoRedis(SpecBo bo){ +// if (ObjectUtil.isEmpty(bo) || bo.getShopId() == null) { +// return; +// } +// +// try { +// String redisKey = bo.getShopId().toString(); +// // 构建t_specd数据结构 +// Map specData = new LinkedHashMap<>(); +// specData.put("source_table", "t_spec"); +// specData.put("data", bo); +// String specJson = JsonObjUtil.objectToJsonWithSnakeKeys(specData); +// +// // 获取Redis中的List +// org.redisson.api.RList redisList = RedisUtils.getThirdClient().getList(redisKey); +// boolean updated = false; +// +// // 遍历List,更新对应source_table的数据 +// for (int i = 0; i < redisList.size(); i++) { +// String item = redisList.get(i); +// Map itemMap = JSONUtil.toBean(item, Map.class); +// if ("t_spec".equals(itemMap.get("source_table"))) { +// redisList.set(i, specJson); +// updated = true; +// break; +// } +// } +// +// // 如果没有找到对应数据,则添加新元素 +// if (!updated) { +// redisList.add(specJson); +// } +// +// } catch (Exception e) { +// System.out.println(e.getMessage()); +// } +// } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/StockChangeLogServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/StockChangeLogServiceImpl.java new file mode 100644 index 0000000..dafb2b3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/StockChangeLogServiceImpl.java @@ -0,0 +1,21 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.vo.StockChangeLogVo; +import org.dromara.zhishu.mapper.StockChangeLogMapper; +import org.dromara.zhishu.mapper.TaskMapper; +import org.dromara.zhishu.service.StockChangeLogService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class StockChangeLogServiceImpl implements StockChangeLogService { + + private final StockChangeLogMapper baseMapper; + @Override + public List selectShopStockLogbyCreateBy(String id,String aboutId) { + return baseMapper.selectByShopGoodsIdAndCreateBy(id ,aboutId); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TAuditServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TAuditServiceImpl.java new file mode 100644 index 0000000..98e0469 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TAuditServiceImpl.java @@ -0,0 +1,233 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.NewUserInfo; +import org.dromara.zhishu.domain.TBookAudit; +import org.dromara.zhishu.domain.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.TAuditBo; +import org.dromara.zhishu.domain.vo.TAuditVo; +import org.dromara.zhishu.domain.TAudit; +import org.dromara.zhishu.mapper.TAuditMapper; +import org.dromara.zhishu.service.ITAuditService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; +import org.springframework.http.ResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 审核Service业务层处理 + * + * @author Lion Li + * @date 2025-04-01 + */ +@RequiredArgsConstructor +@Service +public class TAuditServiceImpl implements ITAuditService { + + private static final Logger log = LoggerFactory.getLogger(TAuditServiceImpl.class); + + @Autowired + private final TAuditMapper baseMapper; + + @Autowired + private RestTemplate restTemplate; + + /** + * 查询审核 + * + * @param id 主键 + * @return 审核 + */ + @Override + public TAuditVo queryById(Long id) { + TAuditVo tAuditVo = baseMapper.selectVoById(id); + NewUserInfo infor = baseMapper.selectUserList(id); + tAuditVo.setCompanyName(infor.getCompanyName()); + tAuditVo.setCompanyType(infor.getCompanyType()); + tAuditVo.setContactPerson(infor.getContactPerson()); + tAuditVo.setContactPhone(infor.getContactPhone()); + tAuditVo.setEmail(infor.getEmail()); + tAuditVo.setLicense(infor.getLicense()); + tAuditVo.setRemark(infor.getRemark()); + tAuditVo.setLicenseNumber(infor.getLicenseNumber()); + tAuditVo.setLicenseName(infor.getLicenseName()); + tAuditVo.setCardIdentity(infor.getCardIdentity()); + tAuditVo.setLicenseTime(infor.getLicenseTime()); + tAuditVo.setBusinessLicense(infor.getBusinessLicense()); + tAuditVo.setBusinessLicenseTime(infor.getBusinessLicenseTime()); + tAuditVo.setAdress(infor.getAdress()); + return tAuditVo; + } + + /** + * 分页查询审核列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 审核分页列表 + */ + @Override + public TableDataInfo queryPageList(TAuditBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); +// Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + Page result = baseMapper.selectPageVo(pageQuery.build(), bo); +// //获取result.getRecords()数据,并将里面内容进行赋值 + // 遍历result.getRecords() + for (int i = 0; i < result.getRecords().size(); i++) { + // 获取当前行的id + Long id = result.getRecords().get(i).getAuditId(); + // 获取当前行的用户名称 + TAudit tAudit = baseMapper.selectId(id); + if (tAudit != null) { + String name = baseMapper.selectUserName(tAudit.getUserId()); + + result.getRecords().get(i).setUserName(name); + result.getRecords().get(i).setAdminId(tAudit.getAdminId()); +// result.getRecords().get(i).setUserId(tAudit.getUserId()); + result.getRecords().get(i).setStatus(tAudit.getStatus()); + result.getRecords().get(i).setId(tAudit.getId()); + } + + } + + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的审核列表 + * + * @param bo 查询条件 + * @return 审核列表 + */ + @Override + public List queryList(TAuditBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + + private LambdaQueryWrapper buildQueryWrapper(TAuditBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(TAudit::getId); + lqw.eq(bo.getUserId() != null, TAudit::getUserId, bo.getUserId()); + lqw.eq(bo.getAdminId() != null, TAudit::getAdminId, bo.getAdminId()); +// lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), TAudit::getCompanyName, bo.getCompanyName()) + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TAudit::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增审核 + * + * @param bo 审核 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TAuditBo bo) { + TAudit add = MapstructUtils.convert(bo, TAudit.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { +// bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改审核 + * + * @param bo 审核 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TAuditBo bo) { + // 修改用户信息 + bo.setStatus("2"); + TAudit update = MapstructUtils.convert(bo, TAudit.class); + NewUserInfo newUserInfo = new NewUserInfo(); + newUserInfo.setCompanyName(bo.getCompanyName()); + newUserInfo.setCompanyType(bo.getCompanyType()); + newUserInfo.setContactPerson(bo.getContactPerson()); + newUserInfo.setContactPhone(bo.getContactPhone()); + newUserInfo.setEmail(bo.getEmail()); + newUserInfo.setLicense(bo.getLicense()); + newUserInfo.setRemark(bo.getRemark()); + newUserInfo.setAuditId(update.getId()); + baseMapper.updateByUser(newUserInfo); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TAudit entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除审核信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Transactional + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + baseMapper.deleteUser(ids); + } + return baseMapper.deleteByIds(ids) > 0; + } + + + @Override + public int updateByStatus(TAuditBo bo) { + //获取用户id + Long userId = baseMapper.selectUserId(bo.getId()); + if (bo.getStatus().equals("0")) { + //删除当前用户角色(游客) + Integer message = baseMapper.deleteUserRole(userId, 1906216348137664514L); + //新增角色(入驻书店) + Integer message1 = baseMapper.insertUserRole(userId, 1905510246538407937L); +// 1906216348137664514 --->Visitor +// 1905510246538407937--->Settled + + // 调用外部接口添加会员 + try { + String url = "https://newadmin.buzhiyushu.cn/settledMember/record/addMember?userId=" + userId; + ResponseEntity response = restTemplate.postForEntity(url, null, String.class); + log.info("调用添加会员接口结果: {}", response.getBody()); + } catch (Exception e) { + log.error("调用添加会员接口失败: {}", e.getMessage(), e); + } + } + +//修改审核状态 + return baseMapper.updateStatus(bo); + } + + @Override + public Integer InsertLog(TAuditBo bo) { + Integer message = baseMapper.insertAuditLog(bo); + return message; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TBookAuditServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TBookAuditServiceImpl.java new file mode 100644 index 0000000..6ad259b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TBookAuditServiceImpl.java @@ -0,0 +1,159 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.TBookAuditBo; +import org.dromara.zhishu.domain.vo.TBookAuditVo; +import org.dromara.zhishu.domain.TBookAudit; +import org.dromara.zhishu.mapper.TBookAuditMapper; +import org.dromara.zhishu.service.ITBookAuditService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 图书审核管理Service业务层处理 + * + * @author Lion Li + * @date 2025-04-18 + */ +@RequiredArgsConstructor +@Service +public class TBookAuditServiceImpl implements ITBookAuditService { + + private final TBookAuditMapper baseMapper; + + /** + * 查询图书审核管理 + * + * @param id 主键 + * @return 图书审核管理 + */ + @Override + public TBookAuditVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询图书审核管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 图书审核管理分页列表 + */ + @Override + public TableDataInfo queryPageList(TBookAuditBo bo, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的图书审核管理列表 + * + * @param bo 查询条件 + * @return 图书审核管理列表 + */ + @Override + public List queryList(TBookAuditBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TBookAuditBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TBookAudit::getId); + lqw.eq(StringUtils.isNotBlank(bo.getProductId()), TBookAudit::getProductId, bo.getProductId()); + lqw.like(StringUtils.isNotBlank(bo.getGoodsName()), TBookAudit::getGoodsName, bo.getGoodsName()); + lqw.eq(StringUtils.isNotBlank(bo.getIsbn()), TBookAudit::getIsbn, bo.getIsbn()); + lqw.eq(StringUtils.isNotBlank(bo.getArtNo()), TBookAudit::getArtNo, bo.getArtNo()); + lqw.eq(StringUtils.isNotBlank(bo.getConditionCode()), TBookAudit::getConditionCode, bo.getConditionCode()); + lqw.eq(StringUtils.isNotBlank(bo.getItemNumber()), TBookAudit::getItemNumber, bo.getItemNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TBookAudit::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增图书审核管理 + * + * @param bo 图书审核管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TBookAuditBo bo) { + TBookAudit add = MapstructUtils.convert(bo, TBookAudit.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { +// bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改图书审核管理 + * + * @param bo 图书审核管理 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TBookAuditBo bo) { + TBookAudit update = MapstructUtils.convert(bo, TBookAudit.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TBookAudit entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除图书审核管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 修改图书审核管理状态 + * + * @param bo 图书审核管理 + * @return 是否修改成功 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean updateStatus(TBookAuditBo bo) { + if(bo.getStatus().equals("0")){ + TBookAudit tBookAudit = baseMapper.selectGoods(bo.getId()); + baseMapper.deleteById(bo.getId()); + }else { + baseMapper.deleteById(bo.getId()); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDepotServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDepotServiceImpl.java new file mode 100644 index 0000000..8732ab9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDepotServiceImpl.java @@ -0,0 +1,384 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.collection.ConcurrentHashSet; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.TDepot; +import org.dromara.zhishu.domain.bo.TDepotBo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TLogisticsVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; +import org.dromara.zhishu.mapper.TDepotMapper; +import org.dromara.zhishu.mapper.TShelvesMapper; +import org.dromara.zhishu.service.ITDepotService; +import org.dromara.zhishu.service.ITLogisticsService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 仓库信息设置Service业务层处理 + * + * @author Lion Li + * @date 2025-03-26 + */ +@RequiredArgsConstructor +@Service +public class TDepotServiceImpl implements ITDepotService { + + private final TDepotMapper baseMapper; + private final TShelvesMapper shelvesMapper; + private final ITLogisticsService tLogisticsService; + + private static final char FIRST_LETTER = 'A'; + private static final char LAST_LETTER = 'Z'; + private static final Set usedCodes = new ConcurrentHashSet<>(); + + /** + * 查询仓库信息设置 + * + * @param id 主键 + * @return 仓库信息设置 + */ + @Override + public TDepotVo queryById(Long id) { + TDepotVo record = baseMapper.selectVoById(id); +// 通过record.getTemplateId获取到对应的name + TLogisticsVo tLogisticsVo = tLogisticsService.queryById(record.getTemplateId()); + if (tLogisticsVo != null) { + record.setTemplateName(tLogisticsVo.getTemplateName()); + } + return record; + } + + /** + * 根据仓库code查询仓库信息 + * + * @param code + * @return + */ + @Override + public TDepotVo selectDepotByCode(String artNo) { + return baseMapper.selectDepotByCode(artNo); + } + + /** + * 分页查询仓库信息设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 仓库信息设置分页列表 + */ + @Override + public TableDataInfo queryPageList(TDepotBo bo, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + String userName = baseMapper.selectByName(userId); + bo.setUserId(userId); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVo1(pageQuery.build(), bo); + // 动态添加当前用户信息 + if (result != null) { + result.getRecords().forEach(vo -> { + if (vo.getInventory() == null) { + vo.setInventory(0L); + } + vo.setName(vo.getName() + vo.getUnit()); + vo.setUserId(userId); + vo.setUserName(userName); + vo.setLevel(1); + String temName = baseMapper.selectTemName(vo.getTemplateId()); + vo.setTemplateName(temName); + List list = baseMapper.selectByShe(vo.getId()); + if (!list.isEmpty()) { + vo.setHasChildren(true); + } else { + vo.setHasChildren(false); + } + }); + } + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的仓库信息设置列表 + * + * @param bo 查询条件 + * @return 仓库信息设置列表 + */ + @Override + public List queryList(TDepotBo bo) { + // 查询当前用户id并查询出昵称,赋值给bo中的userId + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List list = baseMapper.selectVoList(lqw); + //获取当前用户id并查询出昵称,赋值给list中userName + + list.forEach(vo -> { + vo.setName(vo.getName() + vo.getUnit()); + Long sheNumber = baseMapper.selectSheCount(vo.getId()); + vo.setSheNumber(sheNumber); + vo.setUserName(baseMapper.selectByName(userId)); + }); + return list; + } + + @Override + public List selectList(TDepotBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List list = baseMapper.selectVoList(lqw); + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(TDepotBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TDepot::getCode, bo.getCode()); + lqw.eq(bo.getUserId() != null, TDepot::getUserId, bo.getUserId()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TDepot::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), TDepot::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getManager()), TDepot::getManager, bo.getManager()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TDepot::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增仓库信息设置 + * + * @param bo 仓库信息设置 + * @return 是否新增成功 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean insertByBo(TDepotBo bo) { + TDepot add = MapstructUtils.convert(bo, TDepot.class); + validEntityBeforeSave(add); + //查询仓库code是否存在 +// Long userId = LoginHelper.getUserId(); + Long userId = bo.getUserId() != null ? bo.getUserId() : LoginHelper.getUserId(); + add.setUserId(userId); + add.setTenantId("000000"); +// 将字母变成大写 + String depotCode = add.getCode().toUpperCase(); + add.setCode(depotCode); + + if (StringUtils.isEmpty(bo.getName())) { + throw new RuntimeException("请稍后重试"); + } + + //查询是否存在仓库名称 + Integer message = baseMapper.selectByUser(userId, null, bo.getName()); + if (message != 0) { + throw new RuntimeException("仓库名称重复"); +// return false; + } + //查询是否存在仓库编码 + Integer message1 = baseMapper.selectByUser(userId, add.getCode(), null); + if (message1 != 0) { + throw new RuntimeException("仓库编码已存在"); + } + //查询是否存在仓库名称和编码 + Integer code = baseMapper.selectByUser(userId, add.getCode(), bo.getName()); + if (code != 0) { + throw new RuntimeException("仓库名称和编码已存在"); + } else { + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + } + +// // 生成A-Z或0-9的随机字符 +// public static String generateRandomChar() { +// int randomChoice = ThreadLocalRandom.current().nextInt(36); // 0-35 +// if (randomChoice < 26) { +// // 生成A-Z(ASCII码65-90) +// String str = String.valueOf((char)(randomChoice + 65)); +//// String str=Integer.toString(randomChoice + 65); +// System.out.println(str); +// return str; +// } else { +// // 生成0-9(ASCII码48-57),或直接数字转字符 +// String str=String.valueOf((char)(randomChoice - 26 + 48)); +//// Integer.toString(randomChoice - 26 + 48); +// System.out.println(str); +// return str; +// } +// } + + /** + * 修改仓库信息设置 + * + * @param bo 仓库信息设置 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TDepotBo bo) { + TDepot update = MapstructUtils.convert(bo, TDepot.class); + validEntityBeforeSave(update); + + Long userId = bo.getUserId() != null ? bo.getUserId() : LoginHelper.getUserId(); + + // 检查名称是否重复,排除当前正在修改的仓库 + Integer message = baseMapper.selectByUserAndExcludeCurrent(userId, update.getName(), update.getId()); + if (message != 0) { + throw new RuntimeException("仓库名称重复"); + } + + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TDepot entity) { + //TODO 做一些数据校验,如唯一约束 + + if (StringUtils.isEmpty(entity.getName())) { + throw new RuntimeException("请稍后重试"); + } + + } + + /** + * 校验并批量删除仓库信息设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid, Long LocalUserId) { + if (isValid) { + Long userId = LocalUserId != null ? LocalUserId : LoginHelper.getUserId(); + //查询仓库下是否有书品 + Integer message = baseMapper.selectCount(userId, ids); + + + //查询仓库code +// List codeList=baseMapper.selectByCodes(userId,ids); + //查询仓库中是否有商品,有商品则不删除货位 +// Integer message1=baseMapper.selectCounts(userId,codeList); + //通过shelist查询货位中是否存在货号 + //判断message是否为空,为空则进行删除操作,否则不进行删除操作 + if (message == 0) { + List sheList = baseMapper.selectByids(ids); + //删除货位中的货号 + if (!sheList.isEmpty()) { + baseMapper.deleteByIdFre(sheList); + //删除货位 + baseMapper.deleteByIdShe(ids); + } + baseMapper.deleteByIds(ids); + } else { + throw new RuntimeException("货区下有书品,请先删除书品"); + } + } + return true; + + } + + @Override + public List queryNameList(String phoneNumber) { + Long userId = LoginHelper.getUserId(); + String status = "0"; + return baseMapper.nameList(userId, phoneNumber, status); + } + + @Override + public List querySheNameList(String depotId) { + return baseMapper.querySheNameList(depotId); + } + + @Override + public List queryFreNameList(String sheId) { + return baseMapper.queryFreNameList(sheId); + } + + @Override + public Map getIds(String depotName, String freightName, String shelvesName) { + return baseMapper.getIdsByNames(depotName, freightName, shelvesName); + } + + @Override + public List queryShelvesList(Long id) { + List list = baseMapper.selectSheList(id); + if (list.size() > 0) { + for (int i = 0; i < list.size(); i++) { +// Integer message= baseMapper.selectFreCount(list.get(i).getId()); + if (list.get(i).getInventory() == null) { + list.get(i).setInventory(0L); + } + if (list.get(i).getSheNumber() > 0) { + list.get(i).setHasChildren(true); + } else { + list.get(i).setHasChildren(false); + } + list.get(i).setLevel(2); + } + } + return list; + } + + @Override + public List queryTFreightList(Long id) { + List list = baseMapper.selectFreList(id); + if (list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + if (list.get(i).getInventory() == null) { + list.get(i).setInventory(0L); + } +// //通过货位id查询货架数据 +// List shelvesList = new LambdaQueryChainWrapper<>(shelvesMapper).eq(ObjectUtil.isNotNull(list.get(i).getId()), TShelves::getId, list.get(i).getShelvesId()).list(); +// //通过货架id查询仓库信息 +// if(!shelvesList.isEmpty()){ +// List depotList = new LambdaQueryChainWrapper<>(baseMapper).eq(ObjectUtil.isNotNull(list.get(i)), TDepot::getId, shelvesList.get(0).getDepotId()).list(); +// if(!depotList.isEmpty()){ +// String artNo=depotList.get(0).getCode()+shelvesList.get(0).getCode()+list.get(i).getCode(); +// Long message=baseMapper.selectGoodsCount(artNo,depotList.get(0).getUserId()); +// list.get(i).setSheNumber(message); +// }else{ +// list.get(i).setSheNumber(0L); +// } +// }else{ +// list.get(i).setSheNumber(0L); +// } +// //根据artNo查询商品数量 +// list.get(i).setName(list.get(i).getName()+list.get(i).getUnit()); + list.get(i).setLevel(3); + } + } + return list; + } + + @Override + public List queryListAll() { + List tDepotVos = baseMapper.selectVoList(); + return tDepotVos; + } + + @Override + public List selectDepotIdByUserIdAndCode(Long userId, String code) { + return baseMapper.selectDepotIdByUserIdAndCode(userId, code); + } + + @Override + public List selectArtNoLists(Long userId) { + return baseMapper.selectArtNoLists(userId); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDistrictServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDistrictServiceImpl.java new file mode 100644 index 0000000..c6f2488 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TDistrictServiceImpl.java @@ -0,0 +1,235 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.TDistrict; +import org.dromara.zhishu.domain.bo.TDistrictBo; +import org.dromara.zhishu.domain.vo.DistrictsVo; +import org.dromara.zhishu.domain.vo.TDistrictVo; +import org.dromara.zhishu.enums.MunicipalityEnum; +import org.dromara.zhishu.mapper.TDistrictMapper; +import org.dromara.zhishu.service.ITDistrictService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +@RequiredArgsConstructor +@Service +public class TDistrictServiceImpl implements ITDistrictService { + + private final TDistrictMapper baseMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 主键 + * @return 【请填写功能名称】 + */ + @Override + public TDistrictVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 分页查询【请填写功能名称】列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 【请填写功能名称】分页列表 + */ + @Override + public TableDataInfo queryPageList(TDistrictBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(TDistrictBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + /** + * 查询符合条件的【请填写功能名称】列表 + * + * @param bo 查询条件 + * @return 【请填写功能名称】列表 + */ + + + private LambdaQueryWrapper buildQueryWrapper(TDistrictBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TDistrict::getId); + lqw.eq(bo.getPid() != null, TDistrict::getPid, bo.getPid()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TDistrict::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TDistrict::getName, bo.getName()); + lqw.eq(bo.getStatus() != null, TDistrict::getStatus, bo.getStatus()); + lqw.eq(bo.getLevel() != null, TDistrict::getLevel, bo.getLevel()); + return lqw; + } + + /** + * 新增【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TDistrictBo bo) { + TDistrict add = MapstructUtils.convert(bo, TDistrict.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改【请填写功能名称】 + * + * @param bo 【请填写功能名称】 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TDistrictBo bo) { + TDistrict update = MapstructUtils.convert(bo, TDistrict.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TDistrict entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除【请填写功能名称】信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public List selectList(){ + return baseMapper.selectDistrictList(); + } + + @Override + public List selectDistrictByPid(String pid){ + return baseMapper.selectDistrictByPid(pid); + } + + @Override + public List selectCityList(TDistrictVo vo) { + return baseMapper.selectCityList(vo); + } + + @Override + public List selectAreaList(TDistrictVo vo) { + return baseMapper.selectAreaList(vo); + } + + /** + * 查询地址数据 + * + * @param vo + * @return + */ + @Override + public List selectDistricts(TDistrictVo vo) { + // 查询所有省级区划 + List districtList = baseMapper.selectDistrictList(); + // 查询所有区级区划 + List cityList = baseMapper.selectCityList(vo); + // 直辖市ID集合 + List municipalityIdList = new ArrayList<>(); + municipalityIdList.add(MunicipalityEnum.BEIJING.getId()); + municipalityIdList.add(MunicipalityEnum.SHANGHAI.getId()); + municipalityIdList.add(MunicipalityEnum.TIANJIN.getId()); + municipalityIdList.add(MunicipalityEnum.CHONGQING.getId()); + // 单独查出直辖市下的区级区划 + List municipalityAreaList = baseMapper.selectMunicipalityAreaList(municipalityIdList); + + // 省级区划响应集合 + List provinceVoList = new ArrayList<>(); + + // 循环将省级区划信息插曲到省级区划响应集合 + for (TDistrictVo tDistrictVo : districtList) { + DistrictsVo provinceDistrictsVo = new DistrictsVo(); + provinceDistrictsVo.setLabel(tDistrictVo.getName()); + provinceDistrictsVo.setValue(tDistrictVo.getName()); + provinceDistrictsVo.setId(tDistrictVo.getCode()); + // + List childrenList = new ArrayList<>(); + // 循环将市级区划信息插曲到市级区划响应集合 + cityList.forEach(city -> { + if (city.getPid().equals(tDistrictVo.getId())) { + DistrictsVo cityDistrictsVo = new DistrictsVo(); + cityDistrictsVo.setLabel(city.getName()); + cityDistrictsVo.setValue(city.getName()); + cityDistrictsVo.setId(city.getCode()); + // 将查出的直辖市下区级区划信息循环插入到市级区划信息中 + if (municipalityIdList.contains(city.getId())) { + List municipalityAreaVoList = new ArrayList<>(); + for (TDistrictVo municipalityArea : municipalityAreaList) { + if (municipalityArea.getPid().equals(city.getId())) { + DistrictsVo municipalityAreaVo = new DistrictsVo(); + municipalityAreaVo.setLabel(municipalityArea.getName()); + municipalityAreaVo.setValue(municipalityArea.getName()); + municipalityAreaVo.setId(municipalityArea.getCode()); + municipalityAreaVoList.add(municipalityAreaVo); + } + } + if (!municipalityAreaVoList.isEmpty()) { + cityDistrictsVo.setChildren(municipalityAreaVoList); + } + } + childrenList.add(cityDistrictsVo); + } + }); + if (!childrenList.isEmpty()) { + provinceDistrictsVo.setChildren(childrenList); + } + provinceVoList.add(provinceDistrictsVo); + } + return provinceVoList; + } + + @Override + public List queryListByName(List districtNames) { + return new LambdaQueryChainWrapper<>(baseMapper) + .eq(TDistrict::getStatus, 0) + .in(TDistrict::getName, districtNames) + .list().stream().map(o -> { + TDistrictVo tDistrictVo = new TDistrictVo(); + BeanUtils.copyProperties(o, tDistrictVo); + return tDistrictVo; + }).toList(); + } + + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TFreightServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TFreightServiceImpl.java new file mode 100644 index 0000000..256e888 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TFreightServiceImpl.java @@ -0,0 +1,382 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.bo.TDepotBo; +import org.dromara.zhishu.domain.bo.TFreightBo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TFreightVo; +import org.dromara.zhishu.domain.vo.TShelvesVo; +import org.dromara.zhishu.mapper.TFreightMapper; +import org.dromara.zhishu.mapper.TShelvesMapper; +import org.dromara.zhishu.service.ITDepotService; +import org.dromara.zhishu.service.ITFreightService; +import org.dromara.zhishu.service.ITShelvesService; +import org.dromara.zhishu.service.IZhishuShopGoodsService; +import org.springframework.stereotype.Service; + + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 三级货区管理Service业务层处理 + * + * @author Lion Li + * @date 2025-04-19 + */ +@RequiredArgsConstructor +@Service +public class TFreightServiceImpl implements ITFreightService { + + private final TFreightMapper baseMapper; + + private final TShelvesMapper tShelvesMapper; + + private final ITShelvesService shelvesService; + + private final ITDepotService depotService; + + private final IZhishuShopGoodsService zhishuShopGoodsService; + + + @Override + public List selectDepotTree(){ + Long userId = LoginHelper.getUserId(); + TDepotBo depotBo = new TDepotBo(); + depotBo.setUserId(userId); + List depotTree = new ArrayList<>(); + //获取一级货区 + List depotVoList = depotService.selectList(depotBo); + for (TDepotVo depotVo : depotVoList){ + Map depotMap = new HashMap(); + depotMap.put("value",depotVo.getId()); + depotMap.put("label","货架编号:"+depotVo.getCode()+";货架名称"+depotVo.getName()); + List depotChildren = new ArrayList<>(); + //获取二级货区 + List shelvesVoList = shelvesService.selectShelvesByDepotId(depotVo.getId().toString()); + for (TShelvesVo shelvesVo : shelvesVoList){ + Map shelvesMap = new HashMap(); + shelvesMap.put("value",shelvesVo.getId()); + shelvesMap.put("label","货架编号:"+shelvesVo.getCode()+";货架名称"+shelvesVo.getName()); + + List shelvesChildren = new ArrayList<>(); + //获取三级货区 + List freightVoList = selectByShelvesId(shelvesVo.getId()); + for (TFreightVo freightVo : freightVoList){ + Map freightMap = new HashMap(); + freightMap.put("value",freightVo.getId()); + freightMap.put("label","货架编号:"+freightVo.getCode()+";货架名称"+freightVo.getName()); + shelvesChildren.add(freightMap); + } + shelvesMap.put("children",shelvesChildren); + depotChildren.add(shelvesMap); + } + depotMap.put("children",depotChildren); + depotTree.add(depotMap); + } + return depotTree; + } + + @Override + public List selectByShelvesId(Long shelvesId){ + return baseMapper.selectByShelvesId(shelvesId); + } + + @Override + public Map selectByFreightId(Long freightId){ + return baseMapper.selectByFreightId(freightId); + } + + /** + * 查询三级货区管理 + * + * @param id 主键 + * @return 三级货区管理 + */ + @Override + public TFreightVo queryById(Long id){ + TFreightVo vo=baseMapper.selectVoById(id); + TFreight shelvesVo=baseMapper.selectSheName(id); + vo.setShelvesName(shelvesVo.getName()); + vo.setShelvesCode(shelvesVo.getCode()); + return vo; + } + + /** + * 分页查询三级货区管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 三级货区管理分页列表 + */ + @Override + public TableDataInfo queryPageList(TFreightBo bo, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + List depotids=baseMapper.selectV(userId); + + Page result = new Page<>(); + if(!depotids.isEmpty()){ + List sheIds=baseMapper.selectShe(depotids); + if(!sheIds.isEmpty()){ + result =baseMapper.selectVo(pageQuery.build(), bo,sheIds); + for (int i = 0; i < result.getRecords().size(); i++) { + Long id = result.getRecords().get(i).getId(); + String unit = result.getRecords().get(i).getUnit(); + String name = result.getRecords().get(i).getName(); + result.getRecords().get(i).setName(name+unit); + TShelvesVo vo = baseMapper.setShelvesName1(id); + String depotCode =baseMapper.selectDepotCode(vo.getDepotId()); + result.getRecords().get(i).setComcode(depotCode+vo.getCode()+result.getRecords().get(i).getCode()); + result.getRecords().get(i).setShelvesName(vo.getName()+vo.getUnit()); + } + + } + } + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的三级货区管理列表 + * + * @param bo 查询条件 + * @return 三级货区管理列表 + */ + @Override + public List queryList(TFreightBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Long userId = LoginHelper.getUserId(); + //获取三级货区 + List vo=new ArrayList<>(); + //获取当前用户下的一级货区id + List depotids=baseMapper.selectV(userId); + //判断是否为空 + if(!depotids.isEmpty()){ + //通过一级货区id查询出二级货区id + List sheIds=baseMapper.selectShe(depotids); + //判断二级货区是否为空 + if(!sheIds.isEmpty()) { + //查询出二级货区下的所有三级货区 + vo=baseMapper.selectVoLists(sheIds); + for (int i = 0; i < vo.size(); i++) { + //设置三级货区名称 + vo.get(i).setName(vo.get(i).getName()+vo.get(i).getUnit()); + //查询二级货区名称和单位 + TShelvesVo vo1 = baseMapper.setShelvesName1(vo.get(i).getId()); + //设置二级货区名称 + vo.get(i).setShelvesName(vo1.getName()+vo1.getUnit()); + } + } + } + + + return vo; + } + + private LambdaQueryWrapper buildQueryWrapper(TFreightBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TFreight::getId); + lqw.eq(bo.getShelvesId() != null, TFreight::getShelvesId, bo.getShelvesId()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TFreight::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getName()), TFreight::getName, bo.getName()); + lqw.eq(bo.getCapMax() != null, TFreight::getCapMax, bo.getCapMax()); + lqw.eq(StringUtils.isNotBlank(bo.getArtNo()), TFreight::getArtNo, bo.getArtNo()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TFreight::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增三级货区管理 + * + * @param bo 三级货区管理 + * @return 是否新增成功 + */ + @Override + public TFreightBo insertByBo(TFreightBo bo) { +// Long userId = LoginHelper.getUserId(); + Long userId = bo.getUserId() != null ? bo.getUserId() : LoginHelper.getUserId(); + TFreight add = MapstructUtils.convert(bo, TFreight.class); + validEntityBeforeSave(add); + add.setTenantId("000000"); + // 获取货架编码 + String sheCode = baseMapper.selectByCode(add.getShelvesId()); + // 获取货架的depotId + Long depotId = tShelvesMapper.selectDepotIdByShelvesId(add.getShelvesId()); + // 获取仓库编码 + String depotCode = null; + if (depotId != null) { + depotCode = baseMapper.selectDepotCode(String.valueOf(depotId)); + } + + // 判断shelvesCode和depotCode相加是否为四位 + if (sheCode != null && depotCode != null && (sheCode + depotCode).length() == 4) { + // 如果是四位,判断用户输入的code是否为两位 + if (add.getCode() != null && add.getCode().length() >= 2) { + throw new RuntimeException("货架编码错误,请输入正确的货架编码"); + } + } + + if(sheCode != null && sheCode.length()==1){ + if(add.getCode().length()==1&& Character.isDigit(add.getCode().charAt(0))) { + add.setCode("0" + add.getCode()); // 补零 + }else if(add.getCode().matches("[a-zA-Z][0-9]")){ + add.setCode(add.getCode().toUpperCase()); + }else{ + add.setCode(add.getCode()); + } + } + + if (StringUtils.isEmpty(add.getName())) { + throw new RuntimeException("请稍后重试"); + } + + Integer message1 = baseMapper.selectFreName(add.getName(), add.getShelvesId(), null); + Integer message2 = baseMapper.selectFreName(null, add.getShelvesId(), add.getCode()); + if(message1!=0 || message2!=0){ + throw new RuntimeException("货区编码或名称已存在"); + } + boolean flag = baseMapper.insertFre(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return bo; + } + + /** + * 修改三级货区管理 + * + * @param bo 三级货区管理 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TFreightBo bo) { + TFreight update = MapstructUtils.convert(bo, TFreight.class); + validEntityBeforeSave(update); + Integer message = baseMapper.selectByExcludeCurrent(bo.getName(), bo.getShelvesId(), bo.getId()); + if (message != 0) { + throw new RuntimeException("货区名称重复"); + } + + /** + * 如果修改了是否开启分销,则将该货架上的商品全部修改 + */ + if(StringUtils.isNotEmpty(bo.getAllowDistribution())){ + TFreightVo vo = queryById(bo.getId()); + if(!bo.getAllowDistribution().equals(vo.getAllowDistribution())){ + Long userId = LoginHelper.getUserId(); + Long limitNum = 1000L; + /** + * 确认 分销 状态 修改 + */ + //获取货号 + TShelvesVo shelvesVo = shelvesService.queryById(vo.getShelvesId()); + TDepotVo depotVo = depotService.queryById(Long.parseLong(shelvesVo.getDepotId())); + //拼接货号前缀 + String artNoPrefix = depotVo.getCode() + shelvesVo.getCode() + vo.getCode(); + //根据货号前缀,将所有这个前缀的商品分销状态修改 + while (true){ + int num = zhishuShopGoodsService.updateByArtNoPrefix(bo.getAllowDistribution(),artNoPrefix,userId,limitNum); + if (num == 0){ + break; + } + } + } + } + return baseMapper.updateBydate(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TFreight entity){ + //TODO 做一些数据校验,如唯一约束 + if (StringUtils.isEmpty(entity.getName())) { + throw new RuntimeException("请稍后重试"); + } + } + + /** + * 校验并批量删除三级货区管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid,Long LocalUserId) { + Long userId = LocalUserId != null ? LocalUserId : LoginHelper.getUserId(); + + List list=baseMapper.selectListVo(ids,userId); + if(!list.isEmpty()){ + for (int i = 0; i < list.size(); i++) { + if(list.get(i).getSheNumber()>0){ + throw new RuntimeException("货区下有书品,请先删除书品"); + }else{ + baseMapper.deleteByIds(ids); // 主表删除 + return true; + } + } + } + +// // 2. 批量查询货架编码(空值保护) +// List codes = baseMapper.selectCode(ids); +// if (CollectionUtils.isEmpty(codes)) { +//// log.warn(" 未查询到有效货架编码: ids={}", ids); +// return false; +// } +// // 4. 批量校验占用状态(优化数据库交互) +// Map occupiedMap = codes.stream() +// .collect(Collectors.toMap( +// code -> code, +// code -> code.length() == 2 ? +// baseMapper.selectByCount2(userId, code) : +// baseMapper.selectByCount1(userId, code) +// )); +// // 5. 统一决策(全部未被占用才允许删除) +// boolean allUnoccupied = occupiedMap.values().stream() +// .allMatch(count -> count == 0); +// if (allUnoccupied) { +// baseMapper.deleteByIds(ids); // 主表删除 +// return true; +// } + return false; + } + + @Override + public List querySheNameList() { + //获取当前用户id + Long userId = LoginHelper.getUserId(); + List depotIdList = baseMapper.selectDepotId(userId); + List list=new ArrayList<>(); + if(!depotIdList.isEmpty()){ + list= baseMapper.selectByList(depotIdList); + for (TShelvesVo vo:list){ + vo.setLevel(3); + } + } + return list; + } + + /** + * 根据三级获取名称获取获取信息 + * @param freightName + * @param shelvesId + * @return + */ + @Override + public TFreightVo selectByFreightName(String freightName, Long shelvesId){ + return baseMapper.selectByFreightName(freightName,shelvesId); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteCodeServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteCodeServiceImpl.java new file mode 100644 index 0000000..c51c31d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteCodeServiceImpl.java @@ -0,0 +1,200 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.RandomStringUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zhishu.domain.TInviteCode; +import org.dromara.zhishu.domain.TInviteRelation; +import org.dromara.zhishu.domain.bo.InviteCodeBo; +import org.dromara.zhishu.domain.vo.InviteCodeVo; +import org.dromara.zhishu.mapper.TInviteCodeMapper; +import org.dromara.zhishu.mapper.TInviteRelationMapper; +import org.dromara.zhishu.service.ITInviteCodeService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * 邀请码 Service 实现 + */ +@Service +@RequiredArgsConstructor +public class TInviteCodeServiceImpl implements ITInviteCodeService { + + private final TInviteCodeMapper inviteCodeMapper; + private final TInviteRelationMapper inviteRelationMapper; + + @Value("${invite.url.prefix:https://erp.buzhiyushu.cn/register?code=}") + private String inviteUrlPrefix; + + @Value("${invite.code.expireDays:30}") + private int defaultExpireDays; + + /** + * 查询邀请码 + * + * @param id 邀请码主键 + * @return 邀请码 + */ + @Override + public InviteCodeVo queryById(Long id) { + return MapstructUtils.convert(inviteCodeMapper.selectById(id), InviteCodeVo.class); + } + + /** + * 查询邀请码列表 + * + * @param userId 用户ID + * @return 邀请码列表 + */ + @Override + public List queryListByUserId(Long userId) { + return inviteCodeMapper.selectListByUserId(userId); + } + + /** + * 查询邀请码分页列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 邀请码分页列表 + */ + @Override + public TableDataInfo queryPageList(InviteCodeBo bo, PageQuery pageQuery) { + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + page = inviteCodeMapper.selectPageList(page, bo.getUserId(), bo.getCode(), bo.getUsed()); + return TableDataInfo.build(page); + } + + /** + * 生成邀请码 + * + * @param bo 邀请码信息 + * @return 邀请码 + */ + @Override + public int generateInviteCode(InviteCodeBo bo) { + TInviteCode inviteCode = new TInviteCode(); + inviteCode.setUserId(bo.getUserId()); + + // 生成随机邀请码 + String code = generateUniqueCode(); + inviteCode.setCode(code); + + // 生成邀请链接 + inviteCode.setInviteUrl(inviteUrlPrefix + code); + + // 设置为永不过期(使用非常远的未来日期) + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.YEAR, 100); // 100年后过期,实际上相当于永不过期 + inviteCode.setExpireTime(calendar.getTime()); + + // 设置未使用状态 + inviteCode.setUsed(false); + inviteCode.setCreatedAt(new Date()); + // 3. 转换为 VO 对象并返回 + return inviteCodeMapper.insertGenerateInviteCode(inviteCode); + } + + /** + * 验证邀请码 + * + * @param code 邀请码 + * @return 邀请码信息,如果无效则返回null + */ + @Override + public TInviteCode validateInviteCode(String code) { + return inviteCodeMapper.validateInviteCode(code); + } + + /** + * 使用邀请码 + * + * @param code 邀请码 + * @param inviteeId 被邀请人ID + * @return 是否使用成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean useInviteCode(String code, Long inviteeId) { + // 验证邀请码是否有效 + TInviteCode inviteCode = validateInviteCode(code); + if (inviteCode == null) { + return false; + } + + // 检查用户是否已被邀请 + LambdaQueryWrapper checkWrapper = Wrappers.lambdaQuery(); + checkWrapper.eq(TInviteRelation::getInviteeId, inviteeId); + if (inviteRelationMapper.selectCount(checkWrapper) > 0) { + return false; // 用户已经被邀请过 + } + + // 创建邀请关系 + TInviteRelation relation = new TInviteRelation(); + relation.setInviterId(inviteCode.getUserId()); + relation.setInviteeId(inviteeId); + relation.setInviteCode(code); + relation.setInviteTime(new Date()); + inviteRelationMapper.insert(relation); + + return true; + } + + /** + * 构建查询条件 + * + * @param bo 查询条件 + * @return 构建好的查询条件 + */ + private LambdaQueryWrapper buildQueryWrapper(InviteCodeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getUserId() != null, TInviteCode::getUserId, bo.getUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), TInviteCode::getCode, bo.getCode()); + lqw.eq(bo.getUsed() != null, TInviteCode::getUsed, bo.getUsed()); + return lqw; + } + + /** + * 生成唯一邀请码 + * + * @return 唯一邀请码 + */ + private String generateUniqueCode() { + String code; + boolean exists; + do { + // 生成8位字母数字混合邀请码 + code = RandomStringUtils.randomAlphanumeric(8); + + // 检查邀请码是否已存在 + LambdaQueryWrapper checkWrapper = Wrappers.lambdaQuery(); + checkWrapper.eq(TInviteCode::getCode, code); + exists = inviteCodeMapper.selectCount(checkWrapper) > 0; + } while (exists); + + return code; + } + + /** + * 获取过期时间 + * + * @param days 过期天数 + * @return 过期时间 + */ + private Date getExpireTime(int days) { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, days); + return calendar.getTime(); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteRelationsServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteRelationsServiceImpl.java new file mode 100644 index 0000000..dbeb2e2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TInviteRelationsServiceImpl.java @@ -0,0 +1,32 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.TInviteRelations; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.mapper.TInviteRelationsMapper; +import org.dromara.zhishu.service.ITInviteRelationsService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@RequiredArgsConstructor +@Service +public class TInviteRelationsServiceImpl implements ITInviteRelationsService { + + private final TInviteRelationsMapper relationsMapper ; + private final ShopMapper shopMapper ; + + + @Override + public List selectByInviterId(Long inviterId) { + return relationsMapper.selectByInviterId(inviterId); + } + + @Override + public List selectUserShopList(Long userId) { + + return shopMapper.selectByUserId(userId); + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TLogisticsServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TLogisticsServiceImpl.java new file mode 100644 index 0000000..ece4494 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TLogisticsServiceImpl.java @@ -0,0 +1,225 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.ExcelTask; +import org.dromara.zhishu.domain.Printer; +import org.dromara.zhishu.domain.TLogistics; +import org.dromara.zhishu.domain.bo.TLogisticsBo; +import org.dromara.zhishu.domain.vo.ExcelTaskVo; +import org.dromara.zhishu.domain.vo.TDepotVo; +import org.dromara.zhishu.domain.vo.TLogisticsVo; +import org.dromara.zhishu.mapper.TLogisticsMapper; +import org.dromara.zhishu.service.IFastMailService; +import org.dromara.zhishu.service.ITLogisticsService; +import org.springframework.stereotype.Service; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.stream.Collectors; + +/** + * 物流管理Service业务层处理 + * + * @author Lion Li + * @date 2025-04-22 + */ +@RequiredArgsConstructor +@Service +public class TLogisticsServiceImpl implements ITLogisticsService { + + private final TLogisticsMapper baseMapper; + + /** + * 查询物流管理 + * + * @param id 主键 + * @return 物流管理 + */ + @Override + public TLogisticsVo queryById(Long id){ + TLogisticsVo vo = baseMapper.selectByLId(id); + return vo; + } + + /** + * 分页查询物流管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 物流管理分页列表 + */ + @Override + public TableDataInfo queryPageList(TLogisticsBo bo, PageQuery pageQuery) { + Long userId; + if (bo.getUserId() != null){ + userId = bo.getUserId(); + }else{ + userId = LoginHelper.getUserId(); + } + + bo.setUserId(userId); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 物流类型转换 + if(bo.getShipping()!=null){ + if(bo.getShipping().equals("物流")){ + bo.setShipping("1"); + }else if(bo.getShipping().equals("快递")){ + bo.setShipping("0"); + } + } + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的物流管理列表 + * + * @param bo 查询条件 + * @return 物流管理列表 + */ + @Override + public List queryList(TLogisticsBo bo) { + // 获取当前用户id + Long userId; + if (bo.getUserId() != null){ + userId = bo.getUserId(); + }else{ + userId = LoginHelper.getUserId(); + } + // 获取白名单 + if (userId != 1) { + bo.setCreateBy(userId); + } + + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List vo=baseMapper.selectVoList(lqw); + for (int i = 0; i < vo.size(); i++) { + Long depotId = vo.get(i).getWarehouseId(); + if (depotId != null) { + TDepotVo vo1= baseMapper.selectDepotName(depotId); + vo.get(i).setWarehouseName(vo1.getName()+vo1.getUnit()); + } + } + return vo; + } + + private LambdaQueryWrapper buildQueryWrapper(TLogisticsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TLogistics::getId); +// 管理员可以查看所有信息 +// if (bo.getUserId() != null && !Long.valueOf(1).equals(bo.getUserId())) { +// lqw.eq(TLogistics::getCreateBy, bo.getUserId()); +// } + lqw.eq(bo.getCreateBy() != null, TLogistics::getCreateBy, bo.getCreateBy()); + lqw.eq(bo.getUserId()!=null, TLogistics::getCreateBy, bo.getUserId()); + lqw.like(StringUtils.isNotBlank(bo.getTemplateName()), TLogistics::getTemplateName, bo.getTemplateName()); + lqw.eq(StringUtils.isNotBlank(bo.getDeliveryProvince()), TLogistics::getDeliveryProvince, bo.getDeliveryProvince()); + lqw.eq(StringUtils.isNotBlank(bo.getDeliveryCity()), TLogistics::getDeliveryCity, bo.getDeliveryCity()); + lqw.eq(StringUtils.isNotBlank(bo.getDeliveryArea()), TLogistics::getDeliveryArea, bo.getDeliveryArea()); + lqw.eq(StringUtils.isNotBlank(bo.getShippingRange()), TLogistics::getShippingRange, bo.getShippingRange()); + lqw.eq(bo.getWarehouseId() != null, TLogistics::getWarehouseId, bo.getWarehouseId()); + return lqw; + } + + /** + * 新增物流管理 + * + * @param bo 物流管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TLogisticsBo bo) { + TLogistics add = MapstructUtils.convert(bo, TLogistics.class); + validEntityBeforeSave(add); + String are = baseMapper.selectByArea(bo.getDeliveryArea(), bo.getDeliveryCity()); + String city = baseMapper.selectByCity(bo.getDeliveryCity(), bo.getDeliveryProvince()); + String province = baseMapper.selectByProvince(bo.getDeliveryProvince()); + add.setDeliveryProvince(province); + add.setDeliveryCity(city); + add.setDeliveryArea(are); + if (city == null) { + add.setDeliveryAddress(province + "/" + are); + } else { + add.setDeliveryAddress(province + "/" + city + "/" + are); + } + add.setStatus("1"); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + } + return flag; + } + + /** + * 修改物流管理 + * + * @param bo 物流管理 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TLogisticsBo bo) { + TLogistics update = MapstructUtils.convert(bo, TLogistics.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TLogistics entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除物流管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteIds(ids) > 0; + } + + @Override + public List queryNameList() { + //获取当前用户id + Long userId = LoginHelper.getUserId(); + //通过userid查询所有仓库id +// List depotIds = baseMapper.selectDepotId(userId); + List list = baseMapper.selectUserId(userId); +// List list=new ArrayList<>(); +// if(depotIds.isEmpty()){ +// return list; +// }else{ +// list= baseMapper.nameList(depotIds); +// } + return list; + } + + @Override + public List getList(Long userId){ + return baseMapper.selectUserId(userId); + } + + @Override + public List queryNameListByXcx(Long userId) { + return baseMapper.selectUserId(userId); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopDepotAotuServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopDepotAotuServiceImpl.java new file mode 100644 index 0000000..b59a85a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopDepotAotuServiceImpl.java @@ -0,0 +1,68 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.mapper.TShopDepotAotuMapper; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.TShopDepotAotuBo; +import org.dromara.zhishu.domain.vo.TShopDepotAotuVo; +import org.dromara.zhishu.service.ITShopDepotAotuService; + +import java.util.ArrayList; +import java.util.List; + +/** + * 店铺自动发布仓库关联Service业务层处理 + * + * @author Lion Li + * @date 2025-09-05 + */ +@RequiredArgsConstructor +@Service +public class TShopDepotAotuServiceImpl implements ITShopDepotAotuService { + + private final TShopDepotAotuMapper baseMapper; + + /** + * 查询店铺自动发布仓库关联 + * + * @param id 主键 + * @return 店铺自动发布仓库关联 + */ + @Override + public TShopDepotAotuVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询店铺自动发布仓库关联列表 + * 联表查询获取店铺名称和仓库名称,支持按名称搜索 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 店铺自动发布仓库关联分页列表 + */ + @Override + public TableDataInfo queryPageList(TShopDepotAotuBo bo, PageQuery pageQuery) { + + System.out.println(bo.getDepotName()); + Page result = baseMapper.selectVoPageByCondition(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 查询所有店铺自动发布仓库关联列表 + * 联表查询获取店铺名称和仓库名称,支持按名称搜索 + * + * @param bo 查询条件 + * @return 店铺自动发布仓库关联列表 + */ + @Override + public List queryList(TShopDepotAotuBo bo) { + System.out.println(bo.getDepotName()); + return baseMapper.selectVoListByCondition(bo); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopGoodsPublishedServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopGoodsPublishedServiceImpl.java new file mode 100644 index 0000000..917d6b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopGoodsPublishedServiceImpl.java @@ -0,0 +1,279 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.zhishu.domain.dto.TShopGoodsPublishedDto; +import org.dromara.zhishu.mapper.TShopGoodsPublishedMapper; +import org.dromara.zhishu.service.TShopGoodsPublishedService; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +/** + * 已发布商品信息Service实现类 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class TShopGoodsPublishedServiceImpl implements TShopGoodsPublishedService { + + private final TShopGoodsPublishedMapper tShopGoodsPublishedMapper; + + // ==================== 表管理 ==================== + + @DS("slave") + @Override + public boolean checkTableExists() { + try { + int count = tShopGoodsPublishedMapper.checkTableExists(); + return count > 0; + } catch (Exception e) { + log.error("检查表是否存在失败", e); + return false; + } + } + + @DS("slave") + @Override + public void createTable() { + try { + tShopGoodsPublishedMapper.createTable(); + log.info("创建表成功"); + } catch (Exception e) { + log.error("创建表失败", e); + throw new RuntimeException("创建表失败: " + e.getMessage(), e); + } + } + + @DS("slave") + @Override + public void initTable() { + if (!checkTableExists()) { + createTable(); + log.info("初始化表成功"); + } else { + log.info("表已存在"); + } + } + + // ==================== 插入操作 ==================== + + @DS("slave") + @Override + public int insert(TShopGoodsPublishedDto dto) { + if (dto == null) { + throw new IllegalArgumentException("已发布商品信息不能为空"); + } + try { + return tShopGoodsPublishedMapper.insert(dto); + } catch (Exception e) { + log.error("插入已发布商品失败", e); + throw new RuntimeException("插入已发布商品失败: " + e.getMessage(), e); + } + } + + @DS("slave") + @Override + public int batchInsert(List list) { + if (CollectionUtils.isEmpty(list)) { + log.warn("批量插入已发布商品列表为空"); + return 0; + } + try { + return tShopGoodsPublishedMapper.batchInsert(list); + } catch (Exception e) { + log.error("批量插入已发布商品失败, size: {}", list.size(), e); + throw new RuntimeException("批量插入已发布商品失败: " + e.getMessage(), e); + } + } + + // ==================== 删除操作 ==================== + + @DS("slave") + @Override + public int deleteById(Long id) { + if (id == null) { + throw new IllegalArgumentException("ID不能为空"); + } + try { + return tShopGoodsPublishedMapper.deleteById(id); + } catch (Exception e) { + log.error("根据ID删除已发布商品失败, id: {}", id, e); + throw new RuntimeException("删除已发布商品失败: " + e.getMessage(), e); + } + } + + @DS("slave") + @Override + public int deleteByCondition(Long erpShopId, Long shopId, Long productId, Long warehouseId) { + try { + return tShopGoodsPublishedMapper.deleteByCondition(erpShopId, shopId, productId, warehouseId); + } catch (Exception e) { + log.error("根据条件删除已发布商品失败", e); + throw new RuntimeException("删除已发布商品失败: " + e.getMessage(), e); + } + } + + @DS("slave") + @Override + public int batchDeleteByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + log.warn("批量删除已发布商品ID列表为空"); + return 0; + } + try { + return tShopGoodsPublishedMapper.batchDeleteByIds(ids); + } catch (Exception e) { + log.error("批量删除已发布商品失败, ids: {}", ids, e); + throw new RuntimeException("批量删除已发布商品失败: " + e.getMessage(), e); + } + } + + @DS("slave") + @Override + public int deleteAll() { + try { + return tShopGoodsPublishedMapper.deleteAll(); + } catch (Exception e) { + log.error("删除所有已发布商品失败", e); + throw new RuntimeException("删除所有已发布商品失败: " + e.getMessage(), e); + } + } + + // ==================== 更新操作 ==================== + + @DS("slave") + @Override + public int updateById(TShopGoodsPublishedDto dto) { + if (dto == null) { + throw new IllegalArgumentException("已发布商品信息不能为空"); + } + if (dto.getId() == null) { + throw new IllegalArgumentException("ID不能为空"); + } + try { + return tShopGoodsPublishedMapper.updateById(dto); + } catch (Exception e) { + log.error("根据ID更新已发布商品失败, id: {}", dto.getId(), e); + throw new RuntimeException("更新已发布商品失败: " + e.getMessage(), e); + } + } + + // ==================== 查询操作 ==================== + + @DS("slave") + @Override + public TShopGoodsPublishedDto selectById(Long id) { + if (id == null) { + return null; + } + try { + return tShopGoodsPublishedMapper.selectById(id); + } catch (Exception e) { + log.error("根据ID查询已发布商品失败, id: {}", id, e); + return null; + } + } + + @DS("slave") + @Override + public List selectByErpShopId(Long erpShopId) { + if (erpShopId == null) { + return List.of(); + } + try { + return tShopGoodsPublishedMapper.selectByErpShopId(erpShopId); + } catch (Exception e) { + log.error("根据ERP店铺ID查询已发布商品失败, erpShopId: {}", erpShopId, e); + return List.of(); + } + } + + @DS("slave") + @Override + public List selectByShopId(Long shopId) { + if (shopId == null) { + return List.of(); + } + try { + return tShopGoodsPublishedMapper.selectByShopId(shopId); + } catch (Exception e) { + log.error("根据平台店铺ID查询已发布商品失败, shopId: {}", shopId, e); + return List.of(); + } + } + + @DS("slave") + @Override + public TShopGoodsPublishedDto selectByProductId(Long productId) { + if (productId == null) { + return null; + } + try { + return tShopGoodsPublishedMapper.selectByProductId(productId); + } catch (Exception e) { + log.error("根据商品ID查询已发布商品失败, productId: {}", productId, e); + return null; + } + } + + @DS("slave") + @Override + public List selectByCondition(TShopGoodsPublishedDto dto) { + try { + return tShopGoodsPublishedMapper.selectByCondition(dto); + } catch (Exception e) { + log.error("分页条件查询已发布商品失败", e); + return List.of(); + } + } + + @DS("slave") + @Override + public int selectCountByCondition(TShopGoodsPublishedDto dto) { + try { + return tShopGoodsPublishedMapper.selectCountByCondition(dto); + } catch (Exception e) { + log.error("条件查询已发布商品总数失败", e); + return 0; + } + } + + @DS("slave") + @Override + public List selectAll() { + try { + return tShopGoodsPublishedMapper.selectAll(); + } catch (Exception e) { + log.error("查询所有已发布商品失败", e); + return List.of(); + } + } + + @DS("slave") + @Override + public int countAll() { + try { + return tShopGoodsPublishedMapper.countAll(); + } catch (Exception e) { + log.error("统计总记录数失败", e); + return 0; + } + } + + @DS("slave") + @Override + public TShopGoodsPublishedDto selectByErpShopIdAndProductId(Long erpShopId, Long productId) { + if (erpShopId == null || productId == null) { + return null; + } + try { + return tShopGoodsPublishedMapper.selectByErpShopIdAndProductId(erpShopId, productId); + } catch (Exception e) { + log.error("根据ERP店铺ID和商品ID查询失败, erpShopId: {}, productId: {}", erpShopId, productId, e); + return null; + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopMessageSubscribeServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopMessageSubscribeServiceImpl.java new file mode 100644 index 0000000..c1def00 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopMessageSubscribeServiceImpl.java @@ -0,0 +1,57 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.dromara.zhishu.domain.TShopMessageSubscribe; +import org.dromara.zhishu.domain.vo.MessageSubscribeVo; +import org.dromara.zhishu.mapper.TShopMessageSubscribeMapper; +import org.dromara.zhishu.service.TShopMessageSubscribeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +public class TShopMessageSubscribeServiceImpl implements TShopMessageSubscribeService { + + @Autowired + private TShopMessageSubscribeMapper tShopMessageSubscribeMapper; + + @Override + public void insertOrUpdate(List messageSubscribeVo, Long id) { + // 查询库中是否存在该店铺的消息订阅记录 + List tShopMessageSubscribeList = new LambdaQueryChainWrapper<>(tShopMessageSubscribeMapper) + .eq(TShopMessageSubscribe::getDelFlag, "0") + .eq(TShopMessageSubscribe::getShopId, id) + .list(); + ObjectMapper mapper = new ObjectMapper(); + try { + if (ObjectUtil.isEmpty(tShopMessageSubscribeList)) { + // 没有则插入 + TShopMessageSubscribe tShopMessageSubscribe = new TShopMessageSubscribe(); + tShopMessageSubscribe.setShopId(id); + + // tShopMessageSubscribe.setSubscribeDetail(JSONObject.toJSONString(messageSubscribeVo)); + tShopMessageSubscribe.setSubscribeDetail(mapper.writeValueAsString(messageSubscribeVo)); + tShopMessageSubscribeMapper.insert(tShopMessageSubscribe); + } else { + // 有则更新 + new LambdaUpdateChainWrapper<>(tShopMessageSubscribeMapper) + .eq(TShopMessageSubscribe::getDelFlag, "0") + .eq(TShopMessageSubscribe::getShopId, id) + // .set(TShopMessageSubscribe::getSubscribeDetail, JSONObject.toJSONString(messageSubscribeVo)) + .set(TShopMessageSubscribe::getSubscribeDetail, mapper.writeValueAsString(messageSubscribeVo)) + .update(); + } + } catch (JsonProcessingException e) { + log.info("json转换异常"); + throw new RuntimeException(e); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopOrderDetailServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopOrderDetailServiceImpl.java new file mode 100644 index 0000000..a40db60 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TShopOrderDetailServiceImpl.java @@ -0,0 +1,211 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.gson.*; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.enums.PddOrderDetailEnum; +import org.dromara.zhishu.enums.PddOrderEnum; +import org.dromara.zhishu.util.JsonObjUtil; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.TShopOrderDetailBo; +import org.dromara.zhishu.domain.vo.TShopOrderDetailVo; +import org.dromara.zhishu.domain.TShopOrderDetail; +import org.dromara.zhishu.mapper.TShopOrderDetailMapper; +import org.dromara.zhishu.service.ITShopOrderDetailService; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 订单详情Service业务层处理 + * + * @author Lion Li + * @date 2025-03-13 + */ +@RequiredArgsConstructor +@Service +public class TShopOrderDetailServiceImpl implements ITShopOrderDetailService { + + private final TShopOrderDetailMapper baseMapper; + + /** + * 查询订单详情 + * + * @param id 主键 + * @return 订单详情 + */ + @Override + public TShopOrderDetailVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 分页查询订单详情列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 订单详情分页列表 + */ + @Override + public TableDataInfo queryPageList(TShopOrderDetailBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByDesc(TShopOrderDetail::getCreateTime); + lqw.orderByDesc(TShopOrderDetail::getId); +// Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的订单详情列表 + * + * @param bo 查询条件 + * @return 订单详情列表 + */ + @Override + public List queryList(TShopOrderDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TShopOrderDetailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(TShopOrderDetail::getId); + lqw.eq(StringUtils.isNotBlank(bo.getShopId()), TShopOrderDetail::getShopId, bo.getShopId()); + lqw.like(StringUtils.isNotBlank(bo.getShopName()), TShopOrderDetail::getShopName, bo.getShopName()); + lqw.eq(bo.getGoodsCount() != null, TShopOrderDetail::getOrderId, bo.getOrderId()); + lqw.eq(bo.getGoodsCount() != null, TShopOrderDetail::getGoodsCount, bo.getGoodsCount()); + lqw.eq(StringUtils.isNotBlank(bo.getGoodsId()), TShopOrderDetail::getGoodsId, bo.getGoodsId()); + lqw.eq(StringUtils.isNotBlank(bo.getGoodsImg()), TShopOrderDetail::getGoodsImg, bo.getGoodsImg()); + lqw.like(StringUtils.isNotBlank(bo.getGoodsName()), TShopOrderDetail::getGoodsName, bo.getGoodsName()); + lqw.eq(StringUtils.isNotBlank(bo.getGoodsPrice()), TShopOrderDetail::getGoodsPrice, bo.getGoodsPrice()); + lqw.eq(StringUtils.isNotBlank(bo.getGoodsSpec()), TShopOrderDetail::getGoodsSpec, bo.getGoodsSpec()); + lqw.eq(StringUtils.isNotBlank(bo.getOuterGoodsId()), TShopOrderDetail::getOuterGoodsId, bo.getOuterGoodsId()); + lqw.eq(StringUtils.isNotBlank(bo.getOuterId()), TShopOrderDetail::getOuterId, bo.getOuterId()); + lqw.eq(StringUtils.isNotBlank(bo.getSkuId()), TShopOrderDetail::getSkuId, bo.getSkuId()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TShopOrderDetail::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增订单详情 + * + * @param bo 订单详情 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TShopOrderDetailBo bo) { + TShopOrderDetail add = MapstructUtils.convert(bo, TShopOrderDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改订单详情 + * + * @param bo 订单详情 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TShopOrderDetailBo bo) { + TShopOrderDetail update = MapstructUtils.convert(bo, TShopOrderDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TShopOrderDetail entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除订单详情信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + + /** + * 校验并批量删除订单详情信息 + * + + * @return 是否删除成功 + */ + @Override + public void insertBatchOrderDetail(String itemList, String orderSn, Long orderId) { + + Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); + JsonArray jsonArray = gson.fromJson(itemList, JsonArray.class); + + QueryWrapper queryWrapper =new QueryWrapper<>(); + queryWrapper.lambda().eq(TShopOrderDetail::getOrderSn,orderSn); + baseMapper.delete(queryWrapper); + + + for (Object o : jsonArray) { + + JsonObject orderObject = gson.fromJson(o.toString(), JsonObject.class); + + TShopOrderDetail detail = new TShopOrderDetail(); + detail.setOrderId(orderId); + detail.setOrderSn(orderSn); + + Long goodsCount = JsonObjUtil.getLong(orderObject, PddOrderDetailEnum.GOODS_COUNT.getCode()); + Integer count = goodsCount.intValue(); + detail.setGoodsCount(count); + + String goodsImg = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.GOODS_IMG.getCode()); + detail.setGoodsImg(goodsImg); + String goodsName = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.GOODS_NAME.getCode()); + detail.setGoodsName(goodsName); + BigDecimal goodsPrice = JsonObjUtil.getDecimal(orderObject, PddOrderDetailEnum.GOODS_PRICE.getCode()); + detail.setGoodsPrice(goodsPrice); + String goodsSpec = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.GOODS_SPEC.getCode()); + detail.setGoodsSpec(goodsSpec); + String outerGoodsId = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.OUTER_GOODS_ID.getCode()); + detail.setOuterGoodsId(outerGoodsId); + String outerId = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.OUTER_ID.getCode()); + detail.setOuterId(outerId); + String skuId = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.SKU_ID.getCode()); + detail.setSkuId(skuId); + + String goodsId = JsonObjUtil.getString(orderObject, PddOrderDetailEnum.GOODS_ID.getCode()); + detail.setGoodsId(goodsId); + + + baseMapper.insert(detail); + + + } + + + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TUserPlatformServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TUserPlatformServiceImpl.java new file mode 100644 index 0000000..77627f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TUserPlatformServiceImpl.java @@ -0,0 +1,21 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.dromara.zhishu.domain.TUserPlatform; +import org.dromara.zhishu.mapper.TShopOrderMapper; +import org.dromara.zhishu.mapper.TUserPlatformMapper; +import org.dromara.zhishu.service.ITUserPlatformService; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +@Log4j2 +public class TUserPlatformServiceImpl implements ITUserPlatformService { + + private final TUserPlatformMapper baseMapper; + + public void insertTUserPlatform(TUserPlatform userPlatform){ + baseMapper.insertTUserPlatform(userPlatform); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TaskServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..96aef7f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/TaskServiceImpl.java @@ -0,0 +1,1175 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddGoodsSkuPriceUpdateRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsSkuPriceUpdateResponse; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.pqc.math.linearalgebra.BigEndianConversions; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysOss; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.*; +import org.dromara.zhishu.domain.bo.*; +import org.dromara.zhishu.domain.dto.BookPriceInfoDto; +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.dromara.zhishu.domain.dto.request.GoodsSaleStatusSetRequest; +import org.dromara.zhishu.domain.dto.request.SoldOutRequest; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.enums.TaskStatusTypeEnum; +import org.dromara.zhishu.enums.TaskTypeEnum; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.service.client.PddClient; +import org.dromara.zhishu.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.mapper.TaskMapper; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.transfer.s3.model.Upload; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 任务列表Service业务层处理 + * + * @author yxy + * @date 2025-03-21 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class TaskServiceImpl implements ITaskService { + + private final TaskMapper baseMapper; + private final IRunningTaskService runningTaskService; + private final IRunningTaskByShopService runningTaskByShopService; + private final IShopService shopService; + private final IShopDetailService shopDetailService; + private final PddClient pddClient; + private final IPriceTemplateService priceTemplateService; + private final ITaskPauseService taskPauseService; + + @Lazy + @Autowired + private PddServiceImpl pddService; + + + + + /** + * 锁对象 + */ + private final Map lockMap = new HashMap<>(); + private final Map runMap = new HashMap<>(); + @Autowired + private TaskMapper taskMapper; + + /** + * 查询任务列表 + * + * @param id 主键 + * @return 任务列表 + */ + @Override + public TaskVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public TaskVo selectByFileName(String fileName) { + return baseMapper.selectByFileName(fileName); + } + + @Override + public List selectRunningTask(Integer pageSize,Integer pageNum){ + return baseMapper.selectRunningTask( pageSize, pageNum); + } + + @Override + public int selectRunningTaskCount(){ + return baseMapper.selectRunningTaskCount(); + } + + /** + * 分页查询任务列表列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 任务列表分页列表 + */ + @Override + public TableDataInfo queryPageList(TaskBo bo, PageQuery pageQuery) { + // 当前用户id + Long userId = LoginHelper.getUserId(); + if(userId != 1){ + bo.setCreateBy(userId); + } + // 通过用户id找到店铺id + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + for (TaskVo record : result.getRecords()) { + if (TaskTypeEnum.SYNC_GOODS_KFZ.getCode().equals(record.getTaskType())||TaskTypeEnum.SYNC_GOODS_WLN.getCode().equals(record.getTaskType())) { + if (TaskStatusTypeEnum.EXECUTED.getCode().equals(record.getTaskStatus())) { + record.setHasSyncFile(false); + } else { + // 判断redis中是否存在未完成的任务 + String lockKey = "ReadExcelKey_" + record.getShopIds(); + String writeExcelLock = RedisUtils.getCacheObject(lockKey); + if (ObjectUtil.isNotEmpty(writeExcelLock)) { + log.info("============正在读取文件:{}=============", writeExcelLock); + record.setHasSyncFile(false); + } else { + // 指定读取需要新增的商品Excel文件路径 + String newGoodsExcelPath = Paths.get(UrlUtil.getUrl(), "New_" + record.getShopIds() + "_0.xlsx").toString(); + log.info("============新增文件:{}=============", newGoodsExcelPath); + // 指定读取需要修改的商品Excel文件路径 + String updateGoodsExcelPath = Paths.get(UrlUtil.getUrl(), "Changed_" + record.getShopIds() + "_0.xlsx").toString(); + log.info("============变更文件:{}=============", updateGoodsExcelPath); + // 若获取存在说明存在读取该文件的线程,则直接返回,不进行后续操作 + record.setHasSyncFile(FileUtil.isFileExists(newGoodsExcelPath) || FileUtil.isFileExists(updateGoodsExcelPath)); + } + } + } + + } + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的任务列表列表 + * + * @param bo 查询条件 + * @return 任务列表列表 + */ + @Override + public List queryList(TaskBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TaskBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(Task::getCreateTime); + lqw.eq(StringUtils.isNotBlank(bo.getTaskType()), Task::getTaskType, bo.getTaskType()); + lqw.eq(StringUtils.isNotBlank(bo.getShopIds()), Task::getShopIds, bo.getShopIds()); + + lqw.like(StringUtils.isNotBlank(bo.getShopNames()), Task::getShopNames, bo.getShopNames()); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), Task::getFileName, bo.getFileName()); + lqw.eq(bo.getDataNum() != null, Task::getDataNum, bo.getDataNum()); + lqw.eq(bo.getId() != null, Task::getId, bo.getId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskStatus()), Task::getTaskStatus, bo.getTaskStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Task::getStatus, bo.getStatus()); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), Task::getCreateBy, bo.getCreateBy()); + return lqw; + } + + /** + * 新增任务列表 + * + * @param bo 任务列表 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(TaskBo bo) { + Task add = MapstructUtils.convert(bo, Task.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + +// @Override +// public void addGoods(Map map, TaskBo taskBo, Long userId) { +// // 图书列表 +// Map data = (Map) map.get("data"); +// Map addMap = new HashMap(); +// addMap.put("shopIds",map.get("shopIds").toString()); +// addMap.put("taskId",taskBo.getId().toString()); +// addMap.put("taskName",taskBo.getFileName()); +// addMap.put("url", data.get("url").toString()); +// addMap.put("imageSelect",map.get("imageSelect").toString()); +// addMap.put("way",map.get("way").toString()); +// //调用接口 +// InterfaceUtils.postForm("http://localhost:16001","/huidiao/pdd/addGoods", addMap); +// } + + + @Override + public void addGoods(Map map, TaskBo taskBo, Long userId) { + String way = taskBo.getWay(); + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + // 图书列表 + Map data = (Map) map.get("data"); + List rawList = null; + try { + rawList = EasyExcelUtil.readExcelFromUrl(data.get("url").toString(),SuccessDataItemDto.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + // 获取原始数据并过滤掉所有字段都为空的无效行 + List list = rawList.stream() + .filter(dto -> dto.isValidData()) + .collect(Collectors.toList()); + + try { + DecryptUtils.decryptDtoList(list); + System.out.println("数据解密成功"); + } catch (Exception e) { + System.err.println("数据解密失败: " + e.getMessage()); + throw new RuntimeException("解密失败", e); + } + + for(String shopId : shopIdsArr){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + // 剩余额度 + Long usageCount = shopService.checkUsageCount(shopVo); + ShopDetailVo shopDetails =shopDetailService.queryByShopId(Long.parseLong(shopId)); + String createResStr = map.get("createResStr").toString(); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + String taskId = createResMap.get("data").toString(); + Map setTaskBodyMap = new HashMap(); + setTaskBodyMap.put("task_id",taskId); + List> bodyList = new ArrayList<>(); + int runNum = 0; + for (SuccessDataItemDto bookVo : list) { + runNum++; + if (shopDetails.getOpenRepeat().equals("1")){ + // 多店过滤 + List ShopVoList = shopService.selectMallIdsById(Long.parseLong(shopId)); + String ids = ShopVoList.stream() + .map(ShopVo::getId) // 提取 id,假设返回类型为 Long 或 String + .map(String::valueOf) // 转换为字符串 + .collect(Collectors.joining(",")); + // 构建请求参数 + Map formData = new HashMap(); + // 注意:接口需要的格式是数组字符串 "[id1,id2,id3]" + String shopIdsArray = "[" + ids + "]"; + formData.put("shopIds", shopIdsArray); + formData.put("isbn", bookVo.getIsbn()); + String res = InterfaceUtils.postForm("http://36.212.20.113:8182","/api/goods/goofish/multipleStores",formData); + Map resMap = JsonUtil.transferToObj(res,Map.class); + Boolean bool = (Boolean) resMap.get("success"); + if (!bool){ + continue; + } + }else if (way.equals("0")){ + Map formData = new HashMap(); + formData.put("shopid",shopId); + formData.put("isbn",bookVo.getIsbn()); + String res = InterfaceUtils.postForm("http://36.212.20.113:8182","/api/goods/simple",formData); + Map resMap = JsonUtil.transferToObj(res,Map.class); + Boolean bool = (Boolean) resMap.get("success"); + if (!bool){ + continue; + } + } + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",bookVo.getIsbn()); + bookInfo.put("book_name",bookVo.getTitle()); + if(StringUtils.isNotEmpty(bookVo.getImageBigUrl())){ + JSONObject imageObject = new JSONObject(); + List carouselUrlArray = new ArrayList<>(); + String[] images = bookVo.getImageBigUrl().split(","); + for (String image : images){ + carouselUrlArray.add(image); + } + imageObject.put("carousel_url_array",carouselUrlArray); + bookInfo.put("image_object",imageObject); + } + body.put("book_info",bookInfo); + Map detail = new HashMap(); + BigDecimal totalPrice = new BigDecimal(bookVo.getTotalPrice()); + detail.put("price",totalPrice.longValue()); + detail.put("stock",bookVo.getStock() == null || StringUtils.isEmpty(bookVo.getStock()) ? shopDetails.getStockDeff() : Long.parseLong(bookVo.getStock())); + // 商品编码 + detail.put("out_goods_id",bookVo.getGoodsCode() == null ? "" : bookVo.getGoodsCode()); + // 规格编码 + detail.put("sku_code",bookVo.getSkuCode() == null ? "" : bookVo.getSkuCode()); + // 上下架状态 + String isOnSale = bookVo.getIsOnSale() == null ? "0" : bookVo.getIsOnSale().equals("0") ? "1" : "0"; + detail.put("is_onsale",Long.parseLong(isOnSale)); + body.put("detail",detail); + bodyList.add(body); + if (bodyList.size() % 1000 == 0 || runNum == list.size()){ + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId, bodyList); + System.out.println("新发布任务发布"+bodyList.size()+"条"); + // 清空列表,准备下一批 + bodyList.clear(); + } + + usageCount--; + if (usageCount == 0){ + break; + } + } + // 处理剩余数据 + if (!bodyList.isEmpty()) { + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId, bodyList); + System.out.println("新发布任务发布结束:"+bodyList.size()+"条"); + } + // 更新使用次数 + shopService.updateUsageCount(shopVo,usageCount); + } + } + + + @Override + public void addGoodsCenter(Map map, TaskBo taskBo, Long userId) { + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + // 图书列表 + List list = (List) map.get("data"); + for(String shopId : shopIdsArr){ + ShopDetailVo shopDetails =shopDetailService.queryByShopId(Long.parseLong(shopId)); + //获取价格模板 + PriceTemplateVo priceTemplateVo = priceTemplateService.queryById(shopDetails.getSaleTemplateId()); + BigDecimal lowPrice = new BigDecimal(priceTemplateVo.getLowPrice()).divide(new BigDecimal(100)); + BigDecimal highPrice = new BigDecimal(priceTemplateVo.getHighPrice()).divide(new BigDecimal(100)); + for (Map bookVo : list) { + BigDecimal totalPrice = new BigDecimal(bookVo.get("price").toString()); + Map goMap = new HashMap(); + goMap.put("priority","4"); + goMap.put("retry_count","3"); + goMap.put("isbn", bookVo.get("bookNum") == null ? "" : bookVo.get("bookNum").toString()); + goMap.put("totalPrice", bookVo.get("price") == null ? "" : bookVo.get("price").toString()); + goMap.put("stock", bookVo.get("stock") == null ? "" : bookVo.get("stock").toString()); + goMap.put("bookName", bookVo.get("bookName") == null ? "" : bookVo.get("bookName").toString()); + goMap.put("code", bookVo.get("code") == null ? "" : bookVo.get("code").toString()); + goMap.put("imgBigUrl", bookVo.get("bookImgUrl") == null ? "" : bookVo.get("bookImgUrl").toString()); + goMap.put("artNo", bookVo.get("artNo") == null ? "" : bookVo.get("artNo").toString()); + goMap.put("taskId", taskBo.getId().toString()); + goMap.put("shopId",shopId); + goMap.put("imageSelect", map.get("imageSelect")); //1是官图 2是实拍图 + goMap.put("way",map.get("way")); + /** + * 创建运行任务对象 + */ + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(taskBo.getId()); + runningTask.setShopId(Long.valueOf(shopId)); + runningTask.setGoodsId(0L); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName(taskBo.getFileName()); + runningTask.setPriority(255L); + runningTask.setData(JsonUtil.transferToJson(goMap)); + + if(totalPrice.compareTo(highPrice) > 0 || totalPrice.compareTo(lowPrice) < 0){ + runningTask.setStatus("3"); + runningTask.setCallBackData("商品价格不在设置的价格区间"); + }else{ + runningTask.setStatus("0"); + } + runningTask.setTaskType("1"); + runningTaskService.insert(runningTask); + } + } + } + + /** + * 表格更新任务 + */ + @Override + public void editGoodsPrice(Map map, TaskBo taskBo, Long userId) { + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + // 图书列表 + Map data = (Map) map.get("data"); + List rawList = null; + try { + rawList = EasyExcelUtil.readExcelFromUrl(data.get("url").toString(),SuccessDataItemDto.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + // 获取原始数据并过滤掉所有字段都为空的无效行 + List list = rawList.stream() + .filter(dto -> dto.isValidData()) + .collect(Collectors.toList()); + + //根据isbn查询商品信息 + for(String shopId : shopIdsArr){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + Long usageCount = shopService.checkUsageCount(shopVo); + ShopDetailVo shopDetailVo = shopDetailService.queryByShopId(Long.parseLong(shopId)); + PriceTemplateVo priceTemplateVo = priceTemplateService.queryById(shopDetailVo.getSaleTemplateId()); + + String createResStr = map.get("createResStr").toString(); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + String taskId = createResMap.get("data").toString(); + Map setTaskBodyMap = new HashMap(); + setTaskBodyMap.put("task_id",taskId); + List> bodyList = new ArrayList<>(); + int runNum = 0; + for (SuccessDataItemDto bookVo : list) { + + //调用任务池方法,如果正常则继续,如果不正常则休息5秒 + BigDecimal priceL = null; + BigDecimal priceOld = new BigDecimal(bookVo.getTotalPrice()).divide(new BigDecimal(100)); + BigDecimal highPrice = new BigDecimal(priceTemplateVo.getHighPrice()).divide(new BigDecimal(100));; + BigDecimal lowPrice = new BigDecimal(priceTemplateVo.getLowPrice()).divide(new BigDecimal(100)); + + if(priceOld.compareTo(highPrice) > 0 || priceOld.compareTo(lowPrice) < 0){ + //商品价格不在店铺设置的价格区间 + continue; + }else{ + priceL = priceOld; + } + //加价百分比 + BigDecimal proportion = new BigDecimal(0); + //加价价格 + BigDecimal addAmount = new BigDecimal(0); + //获取价格区间 + List priceListMap = JsonUtil.transferToObj(priceTemplateVo.getRangePrice(),List.class); + for (int i=0;i= 0 && priceOld.compareTo(maxPrice) <= 0){ + /** + * 当商品在这个价格区间内时,获取加价百分比喝加价价格 + */ + proportion = new BigDecimal(priceMap.get("adjustPercent").toString()).divide(new BigDecimal(100)); + addAmount = new BigDecimal(priceMap.get("adjustAmount").toString()).divide(new BigDecimal(100)); + break; + } + /** + * 如果执行到这里,则代表没有匹配的价格模板,则使用第一条 + */ + if(i == priceListMap.size() - 1){ + //如果最后一条执行完毕还是没有匹配到,则使用第一条 + priceMap = priceListMap.get(0); + proportion = new BigDecimal(priceMap.get("adjustPercent").toString()).divide(new BigDecimal(100)); + addAmount = new BigDecimal(priceMap.get("adjustAmount").toString()).divide(new BigDecimal(100)); + } + } + //拼单价格 + BigDecimal pricePd = proportion + .multiply(priceL) + .add(priceL) + .add(addAmount) + .multiply(new BigDecimal(100)) + .setScale(0, RoundingMode.DOWN); + + runNum++; + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",bookVo.getIsbn()); + bookInfo.put("trilateralId",bookVo.getTrilateralId()); + bookInfo.put("goodsCode",bookVo.getGoodsCode()); + body.put("book_info",bookInfo); + Map detail = new HashMap(); + // 1 上架 2 下架 3 删除 4 修改库存 5 修改价格 + detail.put("status",5); + detail.put("price",pricePd.longValue()); + body.put("detail",detail); + bodyList.add(body); + + if (bodyList.size() % 500 == 0 || runNum == list.size()){ + NewTaskUtils.newTaskPost(taskId,shopVo.getId().toString(),bodyList); + // 清空列表,准备下一批 + bodyList.clear(); + } + + usageCount--; + if (usageCount == 0){ + break; + } + } + // 处理剩余数据 + if (!bodyList.isEmpty()) { + NewTaskUtils.newTaskPost(taskId,shopVo.getId().toString(),bodyList); + } + + + // 更新使用次数 + shopService.updateUsageCount(shopVo,usageCount); + } + } + + @Override + public void editGoodsStock(Map map, TaskBo taskBo, Long userId) { + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + // 图书列表 + Map data = (Map) map.get("data"); + List rawList = null; + try { + rawList = EasyExcelUtil.readExcelFromUrl(data.get("url").toString(), SuccessDataItemDto.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + // 获取原始数据并过滤掉所有字段都为空的无效行 + List list = rawList.stream() + .filter(dto -> dto.isValidData()) + .collect(Collectors.toList()); + + for(String shopId : shopIdsArr) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + Long usageCount = shopService.checkUsageCount(shopVo); + String createResStr = map.get("createResStr").toString(); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + String taskId = createResMap.get("data").toString(); + Map setTaskBodyMap = new HashMap(); + setTaskBodyMap.put("task_id",taskId); + List> bodyList = new ArrayList<>(); + int runNum = 0; + for (SuccessDataItemDto bookVo : list) { + runNum++; + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",bookVo.getIsbn()); + bookInfo.put("trilateralId",bookVo.getTrilateralId()); + bookInfo.put("goodsCode",bookVo.getGoodsCode()); + body.put("book_info",bookInfo); + Map detail = new HashMap(); + // 1 上架 2 下架 3 删除 4 修改库存 5 修改价格 + detail.put("status",4); + detail.put("stock",Long.parseLong(bookVo.getStock())); + body.put("detail",detail); + bodyList.add(body); + + if (bodyList.size() % 500 == 0 || runNum == list.size()){ + NewTaskUtils.newTaskPost(taskId,shopVo.getId().toString(),bodyList); + // 清空列表,准备下一批 + bodyList.clear(); + } + + usageCount--; + if (usageCount == 0){ + break; + } + } + // 处理剩余数据 + if (!bodyList.isEmpty()) { + NewTaskUtils.newTaskPost(taskId,shopVo.getId().toString(),bodyList); + } + // 更新使用次数 + shopService.updateUsageCount(shopVo,usageCount); + } + } + + +// @Override +// public void editTwoPiecesDiscount(Long shopId){ +// ShopVo shopVo = shopService.queryById(shopId); +// List runningTaskList = runningTaskByShopService.selectGetShopGoodsList("t_running_task_"+shopId,"",null,null,null,null,null,0L,100000L); +// for(Map map : runningTaskList){ +// //解析数据 +// Map successData = JsonUtil.transferToObj(map.get("success_data").toString(), Map.class); +// String goodsId = successData.get("trilateralId").toString(); +// String skuId = successData.get("skuId").toString(); +// Map mapData = new HashMap(); +// mapData.put("goodsId",goodsId); +// mapData.put("skuId",skuId); +// mapData.put("token",shopVo.getToken()); +// String clientId = "203c5a7ba8bd4b8488d5e26f93052642"; +// String clientSecret = "892ffaa86e12b7a3d8d2942b669d9aa520ad8179"; +// PopClient client = new PopHttpClient(clientId, clientSecret); +// PddGoodsSkuPriceUpdateRequest request = new PddGoodsSkuPriceUpdateRequest(); +// request.setGoodsId(Long.parseLong(goodsId)); +// List skuPriceList = new ArrayList(); +// PddGoodsSkuPriceUpdateRequest.SkuPriceListItem item = new PddGoodsSkuPriceUpdateRequest.SkuPriceListItem(); +// item.setSkuId(Long.parseLong(skuId)); +// skuPriceList.add(item); +// request.setSkuPriceList(skuPriceList); +// request.setTwoPiecesDiscount(95); +// PddGoodsSkuPriceUpdateResponse response = null; +// while (true) { +// try { +// response = client.syncInvoke(request, shopVo.getToken()); +// // 如果没有错误或者错误不是频率限制错误,则退出循环 +// if (response.getErrorResponse() == null || +// (!response.getErrorResponse().getErrorMsg().contains("调用过于频繁,请调整调用频率") && +// !response.getErrorResponse().getErrorMsg().contains("系统内部异常"))) { +// break; +// } +// } catch (Exception e) { +// System.out.println(e.getMessage()); +// } +// } +// System.out.println(JsonUtil.transferToJson(response)); +// } +// } + + /** + * 表格更新商品上下级状态 + */ + @Override + public void editGoodsIsOnSale(Map map, TaskBo taskBo, Long userId) { + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + // 图书列表 + Map data = (Map) map.get("data"); + List rawList = null; + try { + rawList = EasyExcelUtil.readExcelFromUrl(data.get("url").toString(),SuccessDataItemDto.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + // 获取原始数据并过滤掉所有字段都为空的无效行 + List list = rawList.stream() + .filter(dto -> dto.isValidData()) + .collect(Collectors.toList()); + //根据isbn查询商品信息 + for(String shopId : shopIdsArr){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + Long usageCount = shopService.checkUsageCount(shopVo); + // 拼多多 + String createResStr = map.get("createResStr").toString(); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + String taskId = createResMap.get("data").toString(); + Map setTaskBodyMap = new HashMap(); + setTaskBodyMap.put("task_id",taskId); + List> bodyList = new ArrayList<>(); + int runNum = 0; + for (SuccessDataItemDto bookVo : list) { + runNum++; + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",bookVo.getIsbn()); + bookInfo.put("trilateralId",bookVo.getTrilateralId()); + bookInfo.put("goodsCode",bookVo.getGoodsCode()); + body.put("book_info",bookInfo); + Map detail = new HashMap(); + // 1 上架 2 下架 + detail.put("status",bookVo.getIsOnSale().equals("0") ? 2 : 1); + body.put("detail",detail); + bodyList.add(body); + if (bodyList.size() % 500 == 0 || runNum == list.size()){ + NewTaskUtils.newTaskPost(taskId,shopVo.getId().toString(),bodyList); + // 清空列表,准备下一批 + bodyList.clear(); + } + usageCount--; + if (usageCount == 0){ + break; + } + } + // 处理剩余数据 + if (!bodyList.isEmpty()) { + NewTaskUtils.newTaskPost(taskId,shopVo.getId().toString(),bodyList); + } + + // 更新使用次数 + shopService.updateUsageCount(shopVo,usageCount); + } + } + + @Override + public void updateGoodsTask(Map map, TaskBo taskBo, Long userId){ + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + // 图书列表 + Map data = (Map) map.get("data"); + List list = null; + try { + list = EasyExcelUtil.readExcelFromUrl(data.get("url").toString(),BookVo.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + for(String shopId : shopIdsArr){ + for (BookVo bookVo : list) { + Map goMap = new HashMap(); + goMap.put("priority","3"); + goMap.put("retry_count","3"); + goMap.put("isbn", bookVo.getBookNum()); + goMap.put("totalPrice", bookVo.getPrice()); + goMap.put("stock", bookVo.getStock()); + goMap.put("bookName", bookVo.getBookName()); + goMap.put("code", bookVo.getCode()); + goMap.put("imgBigUrl", bookVo.getBookImgUrl()); + goMap.put("artNo", bookVo.getArtNo()); + goMap.put("taskId", taskBo.getId().toString()); + goMap.put("shopId",shopId); + goMap.put("imageSelect", map.get("imageSelect")); + goMap.put("imageChoice", map.get("imageChoice")); + goMap.put("way",map.get("way")); + goMap.put("serviceName","UPDATE_GOODS_TASK"); + /** + * 创建运行任务对象 + */ + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(taskBo.getId()); + runningTask.setShopId(Long.valueOf(shopId)); + runningTask.setGoodsId(0L); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName(taskBo.getFileName()); + runningTask.setPriority(255L); + runningTask.setData(JsonUtil.transferToJson(goMap)); + runningTask.setTaskType(taskBo.getTaskType()); + runningTask.setStatus("0"); + runningTaskService.insert(runningTask); + } + } + + + } + + /** + * 手动库存同步任务 + * @param map + * @param taskBo + * @param userId + */ + @Override + public void stockSynchronize(Map map,TaskBo taskBo,Long userId){ + + // 记录参数日志 + FileUtil.logParameters("stockSynchronize",map, taskBo, userId); + + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + //转换类型,确保是数值型 + List> stockNumMapList = ((List) map.get("priceAdjustments")) + .stream() + .map(item -> { + Map newItem = new HashMap<>(item); + + // 处理 proportion + if (newItem.containsKey("proportion")) { + Object proportion = newItem.get("proportion"); + if (proportion == null) { + newItem.put("proportion", 100L); // 为空时默认给100 + } else if (proportion instanceof String) { + String proportionStr = ((String) proportion).trim(); + if (proportionStr.isEmpty()) { + newItem.put("proportion", 100L); // 空字符串时默认给100 + } else { + newItem.put("proportion", Long.parseLong(proportionStr)); + } + } else if (proportion instanceof Integer) { + newItem.put("proportion", ((Integer) proportion).longValue()); + } + // 如果是 Long 类型则保持不变 + } else { + newItem.put("proportion", 100L); // 不存在该字段时默认给100 + } + + // 处理 addNum + if (newItem.containsKey("addNum")) { + Object addNum = newItem.get("addNum"); + if (addNum == null) { + newItem.put("addNum", 0L); // 为空时默认给0 + } else if (addNum instanceof String) { + String addNumStr = ((String) addNum).trim(); + if (addNumStr.isEmpty()) { + newItem.put("addNum", 0L); // 空字符串时默认给0 + } else { + newItem.put("addNum", Long.parseLong(addNumStr)); + } + } else if (addNum instanceof Integer) { + newItem.put("addNum", ((Integer) addNum).longValue()); + } + // 如果是 Long 类型则保持不变 + } else { + newItem.put("addNum", 0L); // 不存在该字段时默认给0 + } + + return newItem; + }) + .collect(Collectors.toList()); + + for (String shopId : shopIdsArr){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("taskId",taskBo.getId().toString()); + jsonObject.put("shopId",shopId); + jsonObject.put("token",shopVo.getToken()); + jsonObject.put("shopType",shopVo.getShopType()); + if(shopVo.getShopType().equals("5")){ + //咸鱼 + jsonObject.put("appId", shopVo.getMallId().toString()); + jsonObject.put("shopKey",shopVo.getShopKey()); + } + + jsonObject.put("priceAdjustments",stockNumMapList); + String json = jsonObject.toString(); + Map dataMap = new HashMap(); + dataMap.put("data",json); + InterfaceUtils.postForm("http://36.212.12.247:8115","/api/stockSynchronize",dataMap); +// InterfaceUtils.postForm("http://localhost:8115","/api/stockSynchronize",dataMap); + } + } + + @Override + public void deleteShopGoods(Map map, TaskBo taskBo, Long userId) { + // 店铺ids + String[] shopIdsArr = map.get("shopIds").toString().split(","); + int deleteNum = Integer.parseInt(map.get("deleteNum").toString()); + int numDay = deleteNum / 5000; + int num = deleteNum % 5000; + if(num > 0){ + numDay = numDay + 1; + } + //根据isbn查询商品信息 + for(String shopId : shopIdsArr){ + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + String taskId = taskBo.getId().toString(); + //存储redis + RedisUtils.setCacheObject("deleteGoods_"+taskId,taskId+","+shopId+","+shopVo.getToken(), Duration.ofDays(numDay)); + } + } + + + // 线程暂停 + public void taskWait(String threadId) { + if (runMap.get(threadId)) { + try { + synchronized (lockMap.get(threadId)) { + lockMap.get(threadId).wait(); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public int zanTing(String threadId) { + if (runMap.get(threadId) == null) { + return 0; + } + runMap.put(threadId, true); + return 1; + } + + @Override + public int huanXing(String threadId) { + if (lockMap.get(threadId) == null) { + return 0; + } + synchronized (lockMap.get(threadId)) { + runMap.put(threadId, false); + lockMap.get(threadId).notify(); + } + return 1; + } + + /** + * 修改任务列表 + * + * @param bo 任务列表 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(TaskBo bo) { + Task update = MapstructUtils.convert(bo, Task.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Task entity) { + // TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除任务列表信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public void editTaskDataNum(String shopIds, Long dataNum, String taskType) { + baseMapper.editTaskDataNum(shopIds,dataNum,taskType); + } + + + /** + * 处理拉取任务 + */ + @Override + public Map handlePullTask(TaskVo taskVo) { + Map result = new HashMap<>(); + List> shopDataList = new ArrayList<>(); + + long shopId = Long.parseLong(taskVo.getShopIds()); + ShopVo shopVo = shopService.queryById(shopId); + + Map shopData = createShopDataMap(taskVo.getId(), shopVo); + + String tableName = "t_running_task_" + shopId; + if (runningTaskByShopService.checkTableExists(tableName) == 0) { + // 表不存在 + setDefaultCounts(shopData); + } else { + int taskCount = runningTaskByShopService.selectGetShopGoodsNumByTasKId(tableName, taskVo.getId().toString()); + if (taskCount == 0) { + // 不是最新任务 + setDefaultCounts(shopData); + } else { + String status = runningTaskByShopService.selectStatus(tableName); + shopData.put("num", taskCount); + if ("2".equals(status)) { + // 未完成 + shopData.put("successCount", 0); + shopData.put("waitCount", taskCount); + } else { + // 已完成 + shopData.put("successCount", taskCount); + shopData.put("waitCount", 0); + } + } + } + + shopDataList.add(shopData); + + result.put("successCount", shopData.get("successCount")); + result.put("waitCount", shopData.get("waitCount")); + result.put("allData", shopDataList); + + return result; + } + + /** + * 处理其他类型任务 + */ + @Override + public Map handleOtherTask(TaskVo taskVo) { + Map result = new HashMap<>(); + List> shopDataList = new ArrayList<>(); + + // 从文件获取数据 + int allNum = getTaskCountFromFile(taskVo.getId()); + + // 从数据库获取任务数据 + List taskNumList = runningTaskService.selectTaskAllNum(taskVo.getId()); + + // 处理数据库中的任务数据 + processTaskDataFromDatabase(taskNumList, shopDataList); + + // 合并文件数据和数据库数据 + mergeFileAndDatabaseData(allNum, shopDataList); + + // 计算总计 + calculateTotalCounts(result, shopDataList); + + result.put("allData", shopDataList); + return result; + } + + /** + * 从文件获取任务数量 + */ + private int getTaskCountFromFile(Long taskId) { + String fileUrl = "https://book.center.file.buzhiyushu.cn/task_log/task-log-csv/" + + taskId + "/" + taskId + "_count.json"; + + try { + Map numMap = JsonObjUtil.parseJsonFromUrl(fileUrl); + return Integer.parseInt(numMap.get("totalTaskCount").toString()); + } catch (IOException e) { + log.warn("无法从文件获取任务数量: {}", fileUrl, e); + return 0; + } + } + + /** + * 处理数据库中的任务数据 + */ + private void processTaskDataFromDatabase(List taskNumList, + List> shopDataList) { + // 使用Map按shopId分组,避免重复处理 + Map> shopDataMap = new HashMap<>(); + Map shopNameCache = new HashMap<>(); + + for (RunningTaskNumVo vo : taskNumList) { + Long shopId = vo.getShopId(); + + // 获取或创建店铺数据 + Map shopData = shopDataMap.computeIfAbsent(shopId, k -> { + ShopVo shopVo = shopService.queryById(shopId); + shopNameCache.put(shopId, shopVo.getShopName()); + return createShopDataMap(vo.getTaskId(), shopId, shopVo.getShopName()); + }); + + // 更新计数 + updateShopCounts(shopData, vo); + } + + // 添加到结果列表 + shopDataList.addAll(shopDataMap.values()); + } + + /** + * 合并文件和数据库数据 + */ + private void mergeFileAndDatabaseData(int fileTaskCount, List> shopDataList) { + if (fileTaskCount > 0) { + // 这里需要根据实际情况调整合并逻辑 + // 假设文件数据是额外的成功任务 + for (Map shopData : shopDataList) { + int currentSuccess = (int) shopData.get("successCount"); + shopData.put("successCount", currentSuccess + fileTaskCount); + shopData.put("num", (int) shopData.get("num") + fileTaskCount); + } + } + } + + /** + * 计算总计数量 + */ + private void calculateTotalCounts(Map result, List> shopDataList) { + int totalSuccess = 0; + int totalWait = 0; + + for (Map shopData : shopDataList) { + totalSuccess += (int) shopData.get("successCount"); + totalWait += (int) shopData.get("waitCount"); + } + + result.put("successCount", totalSuccess); + result.put("waitCount", totalWait); + } + + /** + * 创建店铺数据Map + */ + private Map createShopDataMap(Long taskId, ShopVo shopVo) { + return createShopDataMap(taskId, shopVo.getId(), shopVo.getShopName()); + } + + private Map createShopDataMap(Long taskId, Long shopId, String shopName) { + Map shopData = new HashMap<>(); + shopData.put("taskId", taskId); + shopData.put("shopId", shopId); + shopData.put("shopName", shopName); + shopData.put("num", 0); + shopData.put("successCount", 0); + shopData.put("waitCount", 0); + return shopData; + } + + /** + * 设置默认计数 + */ + private void setDefaultCounts(Map shopData) { + shopData.put("num", 0); + shopData.put("successCount", 0); + shopData.put("waitCount", 0); + } + + /** + * 更新店铺计数 + */ + private void updateShopCounts(Map shopData, RunningTaskNumVo vo) { + int currentNum = (int) shopData.get("num"); + shopData.put("num", currentNum + vo.getAllNum()); + + if ("3".equals(vo.getStatus()) || "4".equals(vo.getStatus())) { + int currentSuccess = (int) shopData.get("successCount"); + shopData.put("successCount", currentSuccess + vo.getAllNum()); + } else { + int currentWait = (int) shopData.get("waitCount"); + shopData.put("waitCount", currentWait + vo.getAllNum()); + } + } + + @Override + public List getShopsBatch(List ids) { + if (ids == null || ids.isEmpty()) { + return Collections.emptyList(); + } + return taskMapper.selectShopsByIds(ids); + } + @Override + public List getShopDetailsBatch(List ids) { + if (ids == null || ids.isEmpty()) { + return Collections.emptyList(); + } + return taskMapper.selectShopDetailsByIds(ids); + } + + /** + * 暂停任务 + * @param taskId + * @return + */ + @Override + public Boolean taskPause(Long taskId){ + Long userId = LoginHelper.getUserId(); + TaskVo taskVo = taskMapper.selectVoById(taskId); + String[] shopIds = taskVo.getShopIds().split(","); + for(String shopId:shopIds){ + TaskPause taskPause = new TaskPause(); + taskPause.setCreateBy(userId); + taskPause.setTaskId(taskId); + taskPause.setShopId(Long.parseLong(shopId)); + taskPauseService.insert(taskPause); + } + //修改任务的状态为5 + TaskBo bo = new TaskBo(); + bo.setId(taskVo.getId()); + bo.setTaskStatus("5"); + return updateByBo(bo); + } + + /** + * 恢复任务 + * @param taskId + * @return + */ + @Override + public Boolean taskRecover(Long taskId){ + TaskVo taskVo = taskMapper.selectVoById(taskId); + TaskBo bo = new TaskBo(); + bo.setId(taskVo.getId()); + bo.setTaskStatus("0"); + taskPauseService.deleteByTaskId(taskId); + return updateByBo(bo); + } + + @Override + public Task getTaskBoById(String id) { + return this.baseMapper.selectById(id); + } + + @Override + public Task getTaskBoByRelationId(String id) { + return this.baseMapper.getTaskBoByRelationId(id); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserAccountServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserAccountServiceImpl.java new file mode 100644 index 0000000..d632181 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserAccountServiceImpl.java @@ -0,0 +1,154 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysOss; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.UserAccountBo; +import org.dromara.zhishu.domain.vo.UserAccountVo; +import org.dromara.zhishu.domain.UserAccount; +import org.dromara.zhishu.mapper.UserAccountMapper; +import org.dromara.zhishu.service.IUserAccountService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 账号管理Service业务层处理 + * + * @author yxy + * @date 2026-02-25 + */ +@RequiredArgsConstructor +@Service +public class UserAccountServiceImpl implements IUserAccountService { + + private final UserAccountMapper baseMapper; + + /** + * 查询账号管理 + * + * @param id 主键 + * @return 账号管理 + */ + @Override + public UserAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询账号管理列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 账号管理分页列表 + */ + @Override + public TableDataInfo queryPageList(UserAccountBo bo, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + if (userId != 1){ + bo.setCreateBy(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的账号管理列表 + * + * @param bo 查询条件 + * @return 账号管理列表 + */ + @Override + public List queryList(UserAccountBo bo) { + Long userId = LoginHelper.getUserId(); + if (userId != 1){ + bo.setCreateBy(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public List queryListAdmin(UserAccountBo bo){ + bo.setCreateBy(1L); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(UserAccount::getId); + lqw.eq(StringUtils.isNotBlank(bo.getType()), UserAccount::getType, bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getAccountType()), UserAccount::getAccountType, bo.getAccountType()); + lqw.like(StringUtils.isNotBlank(bo.getAccountName()), UserAccount::getAccountName, bo.getAccountName()); + lqw.eq(StringUtils.isNotBlank(bo.getAccount()), UserAccount::getAccount, bo.getAccount()); + lqw.eq(StringUtils.isNotBlank(bo.getIsDefault()), UserAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), UserAccount::getStatus, bo.getStatus()); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), UserAccount::getCreateBy, bo.getCreateBy()); + return lqw; + } + + /** + * 新增账号管理 + * + * @param bo 账号管理 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(UserAccountBo bo) { + UserAccount add = MapstructUtils.convert(bo, UserAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改账号管理 + * + * @param bo 账号管理 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(UserAccountBo bo) { + UserAccount update = MapstructUtils.convert(bo, UserAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除账号管理信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserRechargeServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserRechargeServiceImpl.java new file mode 100644 index 0000000..bdebbb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserRechargeServiceImpl.java @@ -0,0 +1,270 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; +import org.dromara.system.service.IUserTransferService; +import org.dromara.zhishu.domain.Shop; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.service.IShopService; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.UserRechargeBo; +import org.dromara.zhishu.domain.vo.UserRechargeVo; +import org.dromara.zhishu.domain.UserRecharge; +import org.dromara.zhishu.mapper.UserRechargeMapper; +import org.dromara.zhishu.service.IUserRechargeService; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 用户充值Service业务层处理 + * + * @author yxy + * @date 2025-04-26 + */ +@RequiredArgsConstructor +@Service +public class UserRechargeServiceImpl implements IUserRechargeService { + + private final UserRechargeMapper baseMapper; + private final ISysUserService userService; + private final IShopService shopService; + private final IUserTransferService userTransferService; + + /** + * 查询用户充值 + * + * @param id 主键 + * @return 用户充值 + */ + @Override + public UserRechargeVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询用户充值列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 用户充值分页列表 + */ + @Override + public TableDataInfo queryPageList(UserRechargeBo bo, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + if (userId != 1) { + bo.setCreateBy(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的用户充值列表 + * + * @param bo 查询条件 + * @return 用户充值列表 + */ + @Override + public List queryList(UserRechargeBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserRechargeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(UserRecharge::getCreateTime); + lqw.eq(bo.getUserId() != null, UserRecharge::getUserId, bo.getUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getRechargType()), UserRecharge::getRechargType, bo.getRechargType()); + if(bo.getRechargPrice() != null){ + bo.setRechargPrice(bo.getRechargPrice().multiply(new BigDecimal(100))); + } + lqw.eq(bo.getRechargPrice() != null, UserRecharge::getRechargPrice, bo.getRechargPrice()); + lqw.eq(bo.getSuccessTime() != null, UserRecharge::getSuccessTime, bo.getSuccessTime()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + UserRecharge::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.eq(StringUtils.isNotBlank(bo.getAllDataStr()), UserRecharge::getAllDataStr, bo.getAllDataStr()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), UserRecharge::getStatus, bo.getStatus()); + lqw.eq(bo.getCreateBy()!=null, UserRecharge::getCreateBy, bo.getCreateBy()); + lqw.like(bo.getLogTxt() != null, UserRecharge::getLogTxt, bo.getLogTxt()); + return lqw; + } + + /** + * 新增用户充值 + * + * @param bo 用户充值 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(UserRechargeBo bo) { + UserRecharge add = MapstructUtils.convert(bo, UserRecharge.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改用户充值 + * + * @param bo 用户充值 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(UserRechargeBo bo) { + UserRecharge update = MapstructUtils.convert(bo, UserRecharge.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserRecharge entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除用户充值信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 充值金额到钱包里 + * @return + */ + @Override + public R addUserBalance(UserRechargeBo bo){ + // 获取充值金额 + BigDecimal money = bo.getRechargPrice(); + // 换算成单位 分 + money = money.multiply(new BigDecimal(100)); + // 查询支付订单 + UserRechargeVo userRechargeVo = queryById(bo.getId()); + // 如果 1.不存在支付订单 2.支付订单已完成支付 3.传入的金额与支付订单中的金额不一致 + if(userRechargeVo == null || userRechargeVo.getIsBalance().equals("1") || money.compareTo(new BigDecimal(userRechargeVo.getRechargPrice())) != 0){ + // 返回异常信息 + return R.fail("异常操作"); + }else{ + // 修改支付订单 + UserRechargeBo userRechargeBo = new UserRechargeBo(); + // 支付订单id + userRechargeBo.setId(bo.getId()); + // 支付订单支付状态 + userRechargeBo.setIsBalance("1"); + // 获取登陆人id + Long userId = LoginHelper.getUserId(); + // 获取用户信息 + SysUserVo userVo = userService.selectUserById(userId); + // 充值金额 + BigDecimal newPrice = userVo.getBalance().add(money); + // 创建用户信息 + SysUserBo userBo = new SysUserBo(); + // 用户id + userBo.setUserId(userId); + // 充值金额 + userBo.setBalance(newPrice); + // 原始价格 + userRechargeBo.setOriginalPrice(userVo.getBalance()); + // 更新价格 + userRechargeBo.setUpdatePrice(newPrice); + // 修改用户信息 + userService.updateUser(userBo); + // 修改支付订单的支付状态 + updateByBo(userRechargeBo); + // 返回 + return R.ok(); + } + } + + /** + * 余额支付 + * @param userId + * @param shopId + * @param logType + * @param rechargPrice + * @return + */ + @Override + public R balancePayment(Long userId, Long shopId, int logType, BigDecimal rechargPrice){ + String logTxt = ""; + switch (logType){ + case 1: + logTxt = "孔夫子店铺订阅;"; + break; + case 3: + logTxt = "闲鱼店铺订阅;"; + break; + case 1001: + logTxt = "开通子账号权限;"; + break; + } + if (shopId != null){ + ShopVo shopVo = shopService.queryById(shopId); + logTxt = "店铺名称:"+shopVo.getShopName()+";" + logTxt; + } + + SysUserVo userVo = userService.selectUserById(userId); + BigDecimal balance = userVo.getBalance(); + + if (balance.compareTo(rechargPrice) < 0){ + // 余额不足 + return R.fail("余额不足"); + }else{ + BigDecimal newBalance = balance.subtract(rechargPrice); +// SysUserBo bo = new SysUserBo(); +// bo.setUserId(userId); +// bo.setBalance(newBalance); + userTransferService.updateBalance(userId,newBalance.longValue()); + + UserRechargeBo userRechargeBo = new UserRechargeBo(); + userRechargeBo.setCommission(BigDecimal.ZERO); + userRechargeBo.setRechargPrice(rechargPrice); + userRechargeBo.setRechargType("6"); + userRechargeBo.setStatus("6"); + userRechargeBo.setUserId(userId); + userRechargeBo.setCreateBy(userId); + userRechargeBo.setUpdateBy(userId); + userRechargeBo.setLogTxt(logTxt); + userRechargeBo.setOriginalPrice(balance); + userRechargeBo.setUpdatePrice(newBalance); + insertByBo(userRechargeBo); + + Map returnMap = new HashMap(); + returnMap.put("code",200); + returnMap.put("msg","余额充足"); + returnMap.put("id", userRechargeBo.getId()); + return R.ok(returnMap); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserTAuditServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserTAuditServiceImpl.java new file mode 100644 index 0000000..75e2e07 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/UserTAuditServiceImpl.java @@ -0,0 +1,214 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.NewUserInfo; +import org.dromara.zhishu.domain.TAudit; +import org.dromara.zhishu.domain.vo.TAuditVo; +import org.dromara.zhishu.mapper.TAuditMapper; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.UserTAuditBo; +import org.dromara.zhishu.domain.vo.UserTAuditVo; +import org.dromara.zhishu.domain.UserTAudit; +import org.dromara.zhishu.mapper.UserTAuditMapper; +import org.dromara.zhishu.service.IUserTAuditService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 列表Service业务层处理 + * + * @author Lion Li + * @date 2025-04-02 + */ +@RequiredArgsConstructor +@Service +public class UserTAuditServiceImpl implements IUserTAuditService { + + private final UserTAuditMapper baseMapper; + private final TAuditMapper userTAuditMapper; + + /** + * 查询列表 + * + * @param id 主键 + * @return 列表 + */ + @Override + public UserTAuditVo queryById(Long id){ + NewUserInfo infor=baseMapper.selectU(id); + // 根据audit_id查询出t_audit_info表中数据 + UserTAuditVo tAuditVo=baseMapper.selectM(infor.getAuditId()); + // 赋值给tAuditVo + tAuditVo.setId(infor.getId()); + tAuditVo.setCompanyName(infor.getCompanyName()); + tAuditVo.setCompanyType(infor.getCompanyType()); + tAuditVo.setContactPerson(infor.getContactPerson()); + tAuditVo.setContactPhone(infor.getContactPhone()); + tAuditVo.setEmail(infor.getEmail()); + tAuditVo.setLicense(infor.getLicense()); + tAuditVo.setRemark(infor.getRemark()); + tAuditVo.setCardIdentity(infor.getCardIdentity()); + tAuditVo.setLicenseName(infor.getLicenseName()); + tAuditVo.setLicenseNumber(infor.getLicenseNumber()); + tAuditVo.setAdress(infor.getAdress()); + tAuditVo.setBusinessLicense(infor.getBusinessLicense()); + tAuditVo.setLicenseTime(infor.getLicenseTime()); + tAuditVo.setBusinessLicenseTime(infor.getBusinessLicenseTime()); + return tAuditVo; + + } + + /** + * 分页查询列表列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 列表分页列表 + */ + @Override + public TableDataInfo queryPageList(UserTAuditBo bo, PageQuery pageQuery) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + // 根据用户id查询出t_audit_info表中对应id + Long id= baseMapper.selectId(userId); + // 判断id是否为空 + if(id==null){ + return TableDataInfo.build(); + } + //把id和userId赋值给bo,并传入baseMapper + bo.setId(id); + bo.setUserId(userId); + //自定义分页查询 + Page result = baseMapper.customPageList(pageQuery.build(), bo); + + // 遍历result,把id和userId赋值给result + for (int i = 0; i < result.getRecords().size(); i++) { + Long ids = result.getRecords().get(i).getId(); + String status = baseMapper.selectStatus(id); + result.getRecords().get(i).setId(ids); + result.getRecords().get(i).setStatus(status); + String name = baseMapper.selectUserName(userId); + NewUserInfo info = baseMapper.selectUserList(ids); + result.getRecords().get(i).setCompanyName(info.getCompanyName()); + result.getRecords().get(i).setCompanyType(info.getCompanyType()); + result.getRecords().get(i).setContactPerson(info.getContactPerson()); + result.getRecords().get(i).setContactPhone(info.getContactPhone()); + result.getRecords().get(i).setEmail(info.getEmail()); + result.getRecords().get(i).setLicense(info.getLicense()); + result.getRecords().get(i).setRemark(info.getRemark()); + result.getRecords().get(i).setUserName(name); + } + + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的列表列表 + * + * @param bo 查询条件 + * @return 列表列表 + */ + @Override + public List queryList(UserTAuditBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserTAuditBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getId() != null, UserTAudit::getAdminId, bo.getId()); + return lqw; + } + + /** + * 新增列表 + * + * @param bo 列表 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(UserTAuditBo bo) { + UserTAudit add = MapstructUtils.convert(bo, UserTAudit.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + } + return flag; + } + + /** + * 修改列表 + * + * @param bo 列表 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(UserTAuditBo bo) { + bo.setStatus("2"); + UserTAudit update = MapstructUtils.convert(bo, UserTAudit.class); + NewUserInfo newUserInfo=new NewUserInfo(); + newUserInfo.setCompanyName(bo.getCompanyName()); + newUserInfo.setCompanyType(bo.getCompanyType()); + newUserInfo.setContactPerson(bo.getContactPerson()); + newUserInfo.setContactPhone(bo.getContactPhone()); + newUserInfo.setEmail(bo.getEmail()); + newUserInfo.setLicense(bo.getLicense()); + newUserInfo.setRemark(bo.getRemark()); + newUserInfo.setId(update.getId()); + newUserInfo.setLicenseName(bo.getLicenseName()); + newUserInfo.setLicenseNumber(bo.getLicenseNumber()); + newUserInfo.setCardIdentity(bo.getCardIdentity()); + newUserInfo.setAdress(bo.getAdress()); + newUserInfo.setLicenseTime(bo.getLicenseTime()); + newUserInfo.setBusinessLicenseTime(bo.getBusinessLicenseTime()); + newUserInfo.setBusinessLicense(bo.getBusinessLicense()); + // 修改t_audit_info表中的数据 + userTAuditMapper.updateByUser(newUserInfo); + //更新时间 + Boolean message= baseMapper.updateUserId(update); + return message; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserTAudit entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除列表信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + Long auditId = baseMapper.selectAudit(ids); + Integer message=baseMapper.deleteAudit(auditId); + if(message==0){ + return false; + } + Long message1 = baseMapper.deleteByAudit(ids); + return message1> 0; + } + + @Override + public UserTAuditVo getAuditLog() { + Long userId = LoginHelper.getUserId(); + Long message= baseMapper.selectId(userId); + return baseMapper.getAuditLog(message); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsAttributeServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsAttributeServiceImpl.java new file mode 100644 index 0000000..f34b76c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsAttributeServiceImpl.java @@ -0,0 +1,32 @@ +package org.dromara.zhishu.service.impl; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.WarehouseSettingsAttribute; +import org.dromara.zhishu.service.IWarehouseSettingsAttributeService; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +@Service +public class WarehouseSettingsAttributeServiceImpl implements IWarehouseSettingsAttributeService { + + /** + * 查询规则属性列表 + * + * @param warehouseSettingsAttribute + * @return + */ + @Override + public List selectList(WarehouseSettingsAttribute warehouseSettingsAttribute){ + Map params = new HashMap<>(); + String warehouseSettingsAttributeListStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/warehouseSettingAttribute/getList",params); + List warehouseSettingsAttributeList = JsonUtil.transferToObj(warehouseSettingsAttributeListStr,List.class); + return warehouseSettingsAttributeList; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsServiceImpl.java new file mode 100644 index 0000000..c87a075 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WarehouseSettingsServiceImpl.java @@ -0,0 +1,144 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pdd.pop.sdk.common.util.JsonUtil; +import org.apache.commons.beanutils.BeanUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.WarehouseSettings; +import org.dromara.zhishu.domain.dto.OrderExternalGoodsDto; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.WarehouseSettingsBo; +import org.dromara.zhishu.domain.vo.WarehouseSettingsVo; +import org.dromara.zhishu.service.IWarehouseSettingsService; + +import java.util.HashMap; +import java.util.List; +import java.util.Collection; +import java.util.Map; + +/** + * 设置Service业务层处理 + * + * @author yxy + * @date 2025-12-19 + */ +@RequiredArgsConstructor +@Service +public class WarehouseSettingsServiceImpl implements IWarehouseSettingsService { + + /** + * 查询设置 + * + * @param id 主键 + * @return 设置 + */ + @Override + public WarehouseSettingsVo queryById(Long id){ + String WarehouseSettingsStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/warehouseSetting/"+id,new HashMap<>()); + WarehouseSettingsVo WarehouseSettings = JsonUtil.transferToObj(WarehouseSettingsStr,WarehouseSettingsVo.class); + return WarehouseSettings; + } + + /** + * 分页查询设置列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设置分页列表 + */ + @Override + public TableDataInfo queryPageList(WarehouseSettingsBo bo, PageQuery pageQuery) { + + Map params = new HashMap<>(); + params.put("pageNum",pageQuery.getPageNum()); + params.put("pageSize",pageQuery.getPageSize()); + params.put("delFlag",0); + String WarehouseSettingsListStr = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/warehouseSetting/getList",params); + Map dataMap = JsonUtil.transferToObj(WarehouseSettingsListStr,Map.class); + List WarehouseSettingsList = (List) dataMap.get("data"); + int total = (int) dataMap.get("total"); + Page result = new Page<>(pageQuery.getPageNum(),pageQuery.getPageSize(),total); + result.setRecords(WarehouseSettingsList); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的设置列表 + * + * @param bo 查询条件 + * @return 设置列表 + */ + @Override + public List queryList(WarehouseSettingsBo bo) { + return null; + } + + + + /** + * 新增设置 + * + * @param bo 设置 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(WarehouseSettingsBo bo) { + bo.setCreateBy(LoginHelper.getUserId()); + bo.setUpdateBy(LoginHelper.getUserId()); + Map map = new HashMap(); + map.put("warehouseSettingsStr",JsonUtil.transferToJson(bo)); + InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/warehouseSetting/add",map); + return true; + } + + /** + * 修改设置 + * + * @param bo 设置 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(WarehouseSettingsBo bo) { + bo.setUpdateBy(LoginHelper.getUserId()); + Map map = new HashMap(); + map.put("warehouseSettingsStr",JsonUtil.transferToJson(bo)); + InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/warehouseSetting/edit",map); + return true; + } + + /** + * 修改启用状态 + * @param bo + * @return + */ + @Override + public Boolean updateStatus(WarehouseSettingsBo bo){ + bo.setUpdateBy(LoginHelper.getUserId()); + Map map = new HashMap(); + map.put("warehouseSettingsStr",JsonUtil.transferToJson(bo)); + InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/warehouseSetting/editStatus",map); + return true; + } + + /** + * 校验并批量删除设置信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + + for (Long id:ids){ + InterfaceUtils.postForm(UrlUtil.getOrderServiceUrl(),"/api/warehouseSetting/deleteById/"+id,new HashMap<>()); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WaveDetailServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WaveDetailServiceImpl.java new file mode 100644 index 0000000..c27e075 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/WaveDetailServiceImpl.java @@ -0,0 +1,155 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.WaveDetail; +import org.dromara.zhishu.domain.dto.WaveDetailRequestDto; +import org.dromara.zhishu.domain.vo.EmployeeInfoVo; +import org.dromara.zhishu.mapper.WaveDetailMapper; +import org.dromara.zhishu.service.IWaveDetailService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 波次信息Service业务层处理 + * + * @author Lion Li + * @date 2026-01-22 + */ +@RequiredArgsConstructor +@Service +public class WaveDetailServiceImpl implements IWaveDetailService { + + private final WaveDetailMapper waveDetailMapper; + + /** + * 新增波次信息 + * + * @param requestDto 波次信息请求DTO + * @return 是否新增成功 + */ + @Override + public Boolean insertWaveDetail(String userId, WaveDetailRequestDto requestDto) { + // 获取当前时间戳 + long currentTime = System.currentTimeMillis() / 1000; + + // 遍历ISBN列表,创建WaveDetail实体并保存 + List waveDetailList = new ArrayList<>(); + for (WaveDetailRequestDto.IsbnDto isbnDto : requestDto.getIsbnList()) { + + // 获取仓库id + String shipmentId = requestDto.getShipmentId(); + Long stockId = parseShipmentId(userId, shipmentId); + + WaveDetail waveDetail = new WaveDetail(); + waveDetail.setUserId(Long.valueOf(userId)); + waveDetail.setWaveId(requestDto.getWaveId()); + waveDetail.setIsbn(isbnDto.getIsbn()); + waveDetail.setQuality(isbnDto.getQuality()); + waveDetail.setStockId(stockId); + // shipmentId作为stockNum存储 + waveDetail.setStockNum(requestDto.getShipmentId()); + waveDetail.setCreatedTime(currentTime); + waveDetail.setUpdatedTime(currentTime); + waveDetail.setIsDel(0L); // 默认未删除 + waveDetailList.add(waveDetail); + } + + // 批量插入数据库 + if (!waveDetailList.isEmpty()) { + return waveDetailMapper.insertBatch(waveDetailList) > 0; + } + + return false; + } + + @Override + public Long getWaveID() { + return waveDetailMapper.getWaveId(); + } + + @Override + public String getEmployeeId(String name, String userId) { + return waveDetailMapper.getEmployeeId(name, userId); + } + + @Override + public Boolean countVerWave(String waveId, String employeeId, Integer submitCount) { + + Long timestamp = System.currentTimeMillis() / 1000; + + // 从wave_employee表查询员工姓名 + Map staffInfo = waveDetailMapper.getWaveEmployeeName(employeeId); + + + // 插入employeeInfo记录 + EmployeeInfoVo employeeInfo = new EmployeeInfoVo(); + + String name = staffInfo.get("name"); + String userId = staffInfo.get("user_id"); + + + employeeInfo.setEmployeeId(employeeId); // 设置员工ID + employeeInfo.setName(name); // 使用从wave_employee表获取的员工姓名 + employeeInfo.setUserId(Long.valueOf(staffInfo.get("user_id").toString())); + employeeInfo.setWave(waveId); + employeeInfo.setCount(submitCount); + employeeInfo.setCreatedTime(timestamp); + employeeInfo.setUpdatedTime(timestamp); + employeeInfo.setDelFlag(0); + + long insertResult = waveDetailMapper.insertEmployeeInfo(employeeInfo); + if (insertResult <= 0) { + return false; + } + + // 从employeeInfo表统计count的和 + Long countSum = waveDetailMapper.getEmployeeInfoCountSum(userId, waveId); + if (countSum == null) { + countSum = 0L; + } + + // 检查wave表中是否存在记录 + int exists = waveDetailMapper.checkWaveExists(employeeId, userId); + if (exists > 0) { + // 如果存在,更新count + int updateResult = waveDetailMapper.updateWaveCount(employeeId, userId, countSum, timestamp); + return updateResult > 0; + } else { + // 如果不存在,新增一条数据 + int insertWaveResult = waveDetailMapper.insertWave(employeeId, name, employeeId, countSum, timestamp, timestamp); + return insertWaveResult > 0; + } + } + + /** + * 解析shipmentId,获取一、二、三级货区号 + * @param shipmentId 货号 + */ + private Long parseShipmentId(String userId, String shipmentId) { + if (shipmentId != null && shipmentId.length() == 5) { + // 一级货区:前2位 + String firstLevel = shipmentId.substring(0, 2); + + char thirdChar = shipmentId.charAt(2); + String secondLevel; + String thirdLevel; + + if (Character.isDigit(thirdChar)) { + // 第三位是数字:第三位是二级货区,第四五位是三级货区 + secondLevel = shipmentId.substring(2, 3); + thirdLevel = shipmentId.substring(3, 5); + } else { + // 第三位是字母:第三四位是二级货区,第五位是三级货区 + secondLevel = shipmentId.substring(2, 4); + thirdLevel = shipmentId.substring(4, 5); + } + + return waveDetailMapper.getFreightId(userId, firstLevel, secondLevel, thirdLevel); + } + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XianYvQueryShopImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XianYvQueryShopImpl.java new file mode 100644 index 0000000..5209e15 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XianYvQueryShopImpl.java @@ -0,0 +1,111 @@ +package org.dromara.zhishu.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.util.*; + +@Slf4j +@Service +public class XianYvQueryShopImpl { + + private final RestTemplate restTemplate; + + @Autowired + public XianYvQueryShopImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + public R>> XianYvQueryShop(String appId, String appSecret) { + try { + String url = "http://119.45.237.193:9102/xianyv/getShopList"; + log.info("开始调用咸鱼API: {}", url); + + // 设置请求头 - 使用表单格式 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + // 创建表单参数 + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("appId", appId); + formData.add("appSecret", appSecret); + + HttpEntity> entity = new HttpEntity<>(formData, headers); + + // 使用POST请求 + ResponseEntity response = restTemplate.exchange( + url, HttpMethod.POST, entity, String.class); + + log.info("咸鱼API响应状态: {}", response.getStatusCode()); + log.info("咸鱼API响应内容: {}", response.getBody()); + + if (response.getStatusCode().value() == 200) { + JSONObject jsonObject = JSON.parseObject(response.getBody()); + + if (jsonObject.getInteger("code") == 0) { + JSONObject data = jsonObject.getJSONObject("data"); + if (data == null) { + log.warn("咸鱼API返回data为空"); + return R.ok(Collections.emptyList()); + } + + JSONArray list = data.getJSONArray("list"); + if (list == null || list.isEmpty()) { + log.info("咸鱼店铺列表为空"); + return R.ok(Collections.emptyList()); + } + + List> shopList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + JSONObject item = list.getJSONObject(i); + String userName = item.getString("user_name"); + String shopName = item.getString("shop_name"); + String expirationTime = item.getString("valid_end_time"); + + // 创建一个Map来存储用户名称和店铺名称 + Map shopInfo = new HashMap<>(); + if (userName != null && !userName.trim().isEmpty()) { + shopInfo.put("user_name", userName); + } + if (shopName != null && !shopName.trim().isEmpty()) { + shopInfo.put("shop_name", shopName); + } + if (expirationTime != null && !expirationTime.trim().isEmpty()) { + shopInfo.put("expiration_time", expirationTime); + } + + // 只有当至少有一个字段不为空时才添加到结果列表 + if (!shopInfo.isEmpty()) { + shopList.add(shopInfo); + log.info("找到店铺 - 用户名称: {}, 店铺名称: {}", userName, shopName); + } + } + + log.info("成功获取咸鱼店铺数量: {}", shopList.size()); + return R.ok(shopList); + } else { + String errorMsg = jsonObject.getString("msg"); + log.error("咸鱼API业务异常: {}", errorMsg); + return R.fail("咸鱼API返回错误: " + errorMsg); + } + } else { + log.error("咸鱼API请求失败,状态码: {}", response.getStatusCode().value()); + return R.fail("咸鱼API请求失败,状态码: " + response.getStatusCode().value()); + } + + } catch (Exception e) { + log.error("调用咸鱼API异常: {}", e.getMessage(), e); + return R.fail("调用咸鱼API异常: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyBindServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyBindServiceImpl.java new file mode 100644 index 0000000..482e76b --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyBindServiceImpl.java @@ -0,0 +1,125 @@ +package org.dromara.zhishu.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.Shop; +import org.dromara.zhishu.domain.XyBind; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.mapper.XyBindMapper; +import org.dromara.zhishu.service.IXyBindService; + +import org.dromara.zhishu.domain.bo.XyBindBo; +import org.dromara.zhishu.domain.vo.XyBindVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; + +import static com.baomidou.mybatisplus.extension.toolkit.Db.update; + +@RequiredArgsConstructor +@Service +@Slf4j +public class XyBindServiceImpl implements IXyBindService { + + private final XyBindMapper baseMapper; + private final ShopMapper shopMapper; + + @Override + public XyBindVo queryById(String token) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(XyBind::getToken, token); + return baseMapper.selectVoOne(wrapper); + } + + @Override + public TableDataInfo queryPageList(XyBindBo bo, PageQuery pageQuery) { + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + + // 如果不是管理员,设置创建者条件 + if (userId != 1) { + bo.setCreateBy(userId); + } + + // 构建查询条件 + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + + // 执行分页查询 + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + return TableDataInfo.build(result); + } + + private LambdaQueryWrapper buildQueryWrapper(XyBindBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(XyBind::getId); + + // 只保留常用搜索条件 + lqw.eq(bo.getCreateBy() != null, XyBind::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getAppName()), XyBind::getAppName, bo.getAppName()); + lqw.like(bo.getMallId() != null, XyBind::getMallId, bo.getMallId()); + lqw.eq(StringUtils.isNotBlank(bo.getToken()), XyBind::getToken, bo.getToken()); + return lqw; + } + + @Override + public Boolean insertByBo(XyBindBo bo) { + XyBind xyBind = new XyBind(); + xyBind.setAppName(bo.getAppName()); + xyBind.setMallId(bo.getMallId()); + xyBind.setToken(bo.getToken()); + xyBind.setCreateBy(bo.getCreateBy()); + // 执行插入操作 + return baseMapper.insert(xyBind) > 0; + } + + @Override + public Boolean updateByBo(XyBindBo bo) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(XyBind::getToken, bo.getToken()) + .set(XyBind::getAppName, bo.getAppName()) + .set(XyBind::getUpdateBy, bo.getUpdateBy()) + .set(XyBind::getUpdateTime, new Date()); + + return baseMapper.update(updateWrapper) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteByToken(String token) { + // 获取当前登录用户ID + Long userId = LoginHelper.getUserId(); + + // 1. 逻辑删除xy_bind表中的数据 + LambdaUpdateWrapper xyBindUpdateWrapper = new LambdaUpdateWrapper<>(); + xyBindUpdateWrapper.eq(XyBind::getToken, token) + .set(XyBind::getDelFlag, 1) + .set(XyBind::getUpdateTime, new Date()) + .set(userId != null, XyBind::getUpdateBy, userId); + + int xyBindResult = baseMapper.update(null, xyBindUpdateWrapper); + + LambdaUpdateWrapper shopUpdateWrapper = new LambdaUpdateWrapper<>(); + shopUpdateWrapper.eq(Shop::getToken, token) + .set(Shop::getDelFlag, 1) + .set(Shop::getUpdateTime, new Date()) + .set(userId != null, Shop::getUpdateBy, userId); + + int shopResult = shopMapper.update(null, shopUpdateWrapper); + + + log.info("删除操作完成 - xy_bind表影响行数: {}, t_shop表影响行数: {}", xyBindResult, shopResult); + + // 只要xy_bind表删除成功就返回true,或者您可以根据业务需求调整 + return xyBindResult > 0; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyCategoryServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyCategoryServiceImpl.java new file mode 100644 index 0000000..7f89e17 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/XyCategoryServiceImpl.java @@ -0,0 +1,23 @@ +package org.dromara.zhishu.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.zhishu.domain.vo.XyCategoryVo; +import org.dromara.zhishu.mapper.XyCategoryMapper; +import org.dromara.zhishu.service.IXyCategoryService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@RequiredArgsConstructor +@Service +@Slf4j +public class XyCategoryServiceImpl implements IXyCategoryService { + + private final XyCategoryMapper xyCategoryMapper; + + @Override + public List selectXyCategoryList() { + return xyCategoryMapper.selectXyCategoryList(); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsAopServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsAopServiceImpl.java new file mode 100644 index 0000000..7debf23 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsAopServiceImpl.java @@ -0,0 +1,180 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zhishu.annotation.LogRecord; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.dto.request.UpdateArtNoRequest; +import org.dromara.zhishu.domain.dto.request.ZhishuShopGoodsRequest; +import org.dromara.zhishu.domain.vo.FreightGoodsCountVo; +import org.dromara.zhishu.domain.vo.SaveGoodsVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.enums.TaskTypeEnum; +import org.dromara.zhishu.mapper.ZhishuShopGoodsMapper; +import org.dromara.zhishu.service.IZhishuShopGoodsService; +import org.dromara.zhishu.service.ZhishuShopGoodsAopService; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.util.CnumberUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@RequiredArgsConstructor +@Service +public class ZhishuShopGoodsAopServiceImpl implements ZhishuShopGoodsAopService { + + @Autowired + private ZhishuShopGoodsMapper baseMapper; + + @Autowired + private KfzClient kfzClient; + + @Autowired + @Lazy + private IZhishuShopGoodsService zhishuShopGoodsService; + + @Override + @LogRecord(logResult = true) + public void insertNewDataList( + @Param("data") ZhishuShopGoodsRequest data, @Param("userId") Long userId, + @Param("freightGoodsCountList") List freightGoodsCountList, + @Param("saveGoodsVo") SaveGoodsVo saveGoodsVo, + @Param("failedList") List failedList, + @Param("successList") List successList, + @Param("successMarkI") AtomicInteger successMarkI, @Param("failMarkI") AtomicInteger failMarkI, + @Param("shopVo") ShopVo shopVo, @Param("totalNum") Integer totalNum, @Param("time") long time, + @Param("status") AtomicBoolean status, + @Param("taskType") String taskType + ) { + try { + ZhishuShopGoods zhishuShopGoods = new ZhishuShopGoods(); + BeanUtils.copyProperties(data, zhishuShopGoods); + zhishuShopGoods.setCreateBy(Long.valueOf(data.getUserId())); + zhishuShopGoods.setUserId(userId); + // 处理品相码 + double conditionCode; + if (ObjectUtil.isNotEmpty(data.getConditionCode())) { + conditionCode = Math.round(data.getConditionCode().doubleValue()) / 10.0; + String conditionCodeString = CnumberUtils.getConditionCode(conditionCode); + zhishuShopGoods.setConditionCode(conditionCodeString); + } else { + conditionCode = 8.5; + } + // 处理价格 + if (ObjectUtil.isNotEmpty(data.getPrice())) { + zhishuShopGoods.setPrice(data.getPrice() * 100); + } + if (ObjectUtil.isNotEmpty(data.getFixPrice())) { + zhishuShopGoods.setFixPrice(data.getFixPrice() * 100); + } + // 处理库存 + if (ObjectUtil.isNotEmpty(data.getInventory())) { + zhishuShopGoods.setInventory(Long.valueOf(data.getInventory())); + } + // 判断ISBN码是否为空 + if (ObjectUtil.isEmpty(data.getIsbn())) { + String isbn = CnumberUtils.generateRandomIsbn(); + zhishuShopGoods.setIsbn(isbn); + } + + // 自动为书籍分配一二三级存储区域 + FreightGoodsCountVo freightGoodsCountVo = CnumberUtils.autoAllocatingAreas(freightGoodsCountList); + // 将freightGoodsCountList对应货区书籍数量+1 + for (FreightGoodsCountVo goodsCountVo : freightGoodsCountList) { + if (goodsCountVo.getFreightId().equals(freightGoodsCountVo.getFreightId())) { + goodsCountVo.setGoodsCount(goodsCountVo.getGoodsCount() + 1); + } + } + + // 获取货号 + String artNo = zhishuShopGoodsService.artNoProcessing(saveGoodsVo.getSaveArtNoRule(), userId, zhishuShopGoods.getIsbn(), data.getArtNo(), conditionCode, freightGoodsCountVo); + zhishuShopGoods.setArtNo(artNo); + + // 写入仓库id + zhishuShopGoods.setDepotId(freightGoodsCountVo.getDepotId()); + TaskTypeEnum taskTypeEnum = TaskTypeEnum.valueOfCode(taskType); + switch (taskTypeEnum) { + case SYNC_GOODS_KFZ: + // 写入原始货号 + zhishuShopGoods.setOriginalArtNo(data.getArtNo()); + // 将新生成的货号同步到kfz + if (saveGoodsVo.getSaveArtNoRule() != 0) { + UpdateArtNoRequest request = new UpdateArtNoRequest(); + request.setShopId(saveGoodsVo.getShopId()); + request.setProductId(Long.valueOf(zhishuShopGoods.getProductId())); + request.setArtNo(zhishuShopGoods.getArtNo()); + try { + Thread.sleep(1000L); // 在调用前休眠 + // kfzClient.updateArtNo(UrlUtil.getKfzServiceUrl(), request); + // 是否已货号转换 + zhishuShopGoods.setIsArtNoConversion(1); + } catch (Exception e) { + throw new ServiceException("同步货号失败:" + e.getMessage()); + } + } + break; + case SYNC_GOODS_WLN: + // 写入原始货号 + zhishuShopGoods.setOriginalArtNo(data.getProductId()); + break; + } + // 将这条数据插入到数据库 + baseMapper.insert(zhishuShopGoods); + // 初始化该商品redis库存 + zhishuShopGoodsService.batchRedisInitInventory(List.of(zhishuShopGoods)); + successList.add(data); + } catch (Exception e) { + log.error(e.getMessage()); + failedList.add(data); + status.set(false); + } + } + + @Override + @LogRecord(logResult = true) + public void updateChangedDataList( + @Param("data") ZhishuShopGoodsRequest data, @Param("userId") Long userId, + @Param("freightGoodsCountList") List freightGoodsCountList, + @Param("saveGoodsVo") SaveGoodsVo saveGoodsVo, + @Param("failedList") List failedList, + @Param("successList") List successList, + @Param("successMarkI") AtomicInteger successMarkI, @Param("failMarkI") AtomicInteger failMarkI, + @Param("shopVo") ShopVo shopVo, @Param("totalNum") Integer totalNum, @Param("newTime") long time, + @Param("status") AtomicBoolean status + ) { + List originalList = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ZhishuShopGoods::getId, data.getId()) + .list(); + if (ObjectUtil.isNotEmpty(originalList)) { + ZhishuShopGoods zhishuShopGoods = new ZhishuShopGoods(); + zhishuShopGoods.setId(data.getId()); + zhishuShopGoods.setUserId(userId); + // 判断ISBN码是否为空 + if (ObjectUtil.isEmpty(data.getIsbn())) { + String isbn = CnumberUtils.generateRandomIsbn(); + zhishuShopGoods.setIsbn(isbn); + } + // 处理品相码 + double conditionCode = Math.round(data.getConditionCode().doubleValue()) / 10.0; + String conditionCodeString = CnumberUtils.getConditionCode(conditionCode); + zhishuShopGoods.setConditionCode(conditionCodeString); + // 处理库存 + zhishuShopGoods.setInventory(Long.valueOf(data.getInventory())); + // 更新数据 + baseMapper.updateById(zhishuShopGoods); + successList.add(data); + } + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsDetailServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsDetailServiceImpl.java new file mode 100644 index 0000000..91c89a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsDetailServiceImpl.java @@ -0,0 +1,142 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.zhishu.domain.bo.ZhishuShopGoodsDetailBo; +import org.dromara.zhishu.domain.vo.ZhishuShopGoodsDetailVo; +import org.dromara.zhishu.domain.ZhishuShopGoodsDetail; +import org.dromara.zhishu.mapper.ZhishuShopGoodsDetailMapper; +import org.dromara.zhishu.service.IZhishuShopGoodsDetailService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商品信息补全表Service业务层处理 + * + * @author yxy + * @date 2025-06-13 + */ +@RequiredArgsConstructor +@Service +public class ZhishuShopGoodsDetailServiceImpl implements IZhishuShopGoodsDetailService { + + private final ZhishuShopGoodsDetailMapper baseMapper; + + /** + * 查询商品信息补全表 + * + * @param id 主键 + * @return 商品信息补全表 + */ + @Override + public ZhishuShopGoodsDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public ZhishuShopGoodsDetailVo selectByPid(Long pid){ + return baseMapper.selectByPid(pid); + } + + /** + * 分页查询商品信息补全表列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品信息补全表分页列表 + */ + @Override + public TableDataInfo queryPageList(ZhishuShopGoodsDetailBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的商品信息补全表列表 + * + * @param bo 查询条件 + * @return 商品信息补全表列表 + */ + @Override + public List queryList(ZhishuShopGoodsDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ZhishuShopGoodsDetailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(ZhishuShopGoodsDetail::getId); + lqw.eq(bo.getPid() != null, ZhishuShopGoodsDetail::getPid, bo.getPid()); + lqw.eq(StringUtils.isNotBlank(bo.getAuthor()), ZhishuShopGoodsDetail::getAuthor, bo.getAuthor()); + lqw.eq(StringUtils.isNotBlank(bo.getPublisher()), ZhishuShopGoodsDetail::getPublisher, bo.getPublisher()); + lqw.eq(StringUtils.isNotBlank(bo.getPublishertime()), ZhishuShopGoodsDetail::getPublishertime, bo.getPublishertime()); + lqw.eq(StringUtils.isNotBlank(bo.getFormat()), ZhishuShopGoodsDetail::getFormat, bo.getFormat()); + lqw.eq(StringUtils.isNotBlank(bo.getWordage()), ZhishuShopGoodsDetail::getWordage, bo.getWordage()); + lqw.eq(StringUtils.isNotBlank(bo.getUnifiedisbn()), ZhishuShopGoodsDetail::getUnifiedisbn, bo.getUnifiedisbn()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ZhishuShopGoodsDetail::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增商品信息补全表 + * + * @param bo 商品信息补全表 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ZhishuShopGoodsDetailBo bo) { + ZhishuShopGoodsDetail add = MapstructUtils.convert(bo, ZhishuShopGoodsDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商品信息补全表 + * + * @param bo 商品信息补全表 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ZhishuShopGoodsDetailBo bo) { + ZhishuShopGoodsDetail update = MapstructUtils.convert(bo, ZhishuShopGoodsDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ZhishuShopGoodsDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除商品信息补全表信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsServiceImpl.java new file mode 100644 index 0000000..bf0c995 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopGoodsServiceImpl.java @@ -0,0 +1,5205 @@ +package org.dromara.zhishu.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.file.request.PddGoodsImgUploadRequest; +import com.pdd.pop.sdk.http.api.file.response.PddGoodsImgUploadResponse; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.dromara.common.core.enums.FormatsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.zhishu.domain.*; +import org.dromara.zhishu.domain.bo.*; +import org.dromara.zhishu.domain.dto.BatchProcessingContext; +import org.dromara.zhishu.domain.dto.RunningTaskShopGoodsDto; +import org.dromara.zhishu.domain.dto.request.BatchGoodsRequest; +import org.dromara.zhishu.domain.dto.request.GoodsComparisonRequest; +import org.dromara.zhishu.domain.dto.request.UpdateArtNoRequest; +import org.dromara.zhishu.domain.dto.request.ZhishuShopGoodsRequest; +import org.dromara.zhishu.domain.vo.*; +import org.dromara.zhishu.domain.vo.ProductSubmitResultVo; +import org.dromara.zhishu.enums.*; +import org.dromara.zhishu.mapper.*; +import org.dromara.zhishu.service.*; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.service.client.PddClient; +import org.dromara.zhishu.service.factory.InventorySynchronizedStrategyFactory; +import org.dromara.zhishu.service.strategy.InventorySynchronizedStrategy; +import org.dromara.zhishu.threads.KfzAutoAddRunnable; +import org.dromara.zhishu.threads.ShopGoodsTaskRunnable; +import org.dromara.zhishu.util.*; +import org.hibernate.validator.internal.util.stereotypes.Lazy; +import org.redisson.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.repository.query.Param; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.ProxySelector; +import java.net.URI; +import java.net.URL; +import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static org.dromara.zhishu.util.UrlUtil.getImgResultUrl; +import static org.dromara.zhishu.util.UrlUtil.getUploadImgUrl; + +/** + * 商品信息Service业务层处理 + * + * @author Lion Li + * @date 2025-03-07 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ZhishuShopGoodsServiceImpl implements IZhishuShopGoodsService { + + private static final String UPLOAD_DIR = "D:\\images"; + + private final WaveDetailMapper waveDetailMapper; + + + /** + * 锁对象 + */ + private final Map lockMap = new HashMap<>(); + private final Map runMap = new HashMap<>(); + + private final ApplicationContext applicationContext; + private final IZhishuShopGoodsDetailService zhishuShopGoodsDetailService; + + private final ZhishuShopGoodsMapper baseMapper; + + private final IRunningTaskService runningTaskService; + + + private final TBookAuditMapper tBookAuditMapper; + + private final IShopGoodsPublishedService shopGoodsPublishedService; + + private final IZhishuShopImagesService zhishuShopImagesService; + + private final IRunningTaskByShopService runningTaskByShopService; + + private final ScheduledExecutorService scheduledExecutorService; + + private final ITaskService taskService; + + private final ISysConfigService configService; + + private final IShopDetailService shopDetailService; + + private final ITDepotService depotService; + + + private final ITLogisticsService logisticsService; + // 每隔多少秒续期一次 Redis 锁(比如 30 秒) + private static final int INITIAL_DELAY_AND_PERIOD = 30; + + @Resource + private TDepotMapper tDepotMapper; + + @Resource + private TShelvesMapper tShelvesMapper; + + @Autowired + private IShopService shopService; + + @Autowired + private TaskServiceImpl taskServiceImpl; + + @Autowired + private CnumberUtils cnumberUtils; + + @Autowired + private TDepotMapper TDepotMapper; + + @Autowired + private TShelvesMapper TShelvesMapper; + + @Autowired + private TFreightMapper TFreightMapper; + + @Autowired + private TLogisticsMapper tLogisticsMapper; + + @Autowired + private ZhishuShopImagesMapper zhishuShopImagesMapper; + + @Lazy + @Autowired + private SysUserMapper sysUserMapper; + + @Autowired + private ShopMapper shopMapper; + + @Lazy + @Autowired + private KongfzServiceImpl kongfzService; + + @Autowired + private ShopGoodIsbnMapper shopGoodIsbnMapper; + + @Autowired + private ArtNoMoveMapper artNoMoveMapper; + + // 品相对应的数值 + private static final double[] CONDITION_CODES = {1, 2, 3, 4, 5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10}; + // 品相对应的字母标识 + private static final String[] CONDITION_CODE = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"}; + + // 品相对应的中文标识 + private static final String[] CHINESE_CODE = {"一品", "二品", "三品", "四品", "五品", "六品", "六五品", "七品", "七五品", "八品", "八五品", "九品", "九五品", "全新"}; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private KfzClient kfzClient; + + @Autowired + private UploadUtil uploadUtil; + + @Autowired + private ZhishuShopGoodsAopService zhishuShopGoodsAopService; + + @Autowired + private StockChangeLogMapper stockChangeLogMapper; + @Autowired + private PddClient pddClient; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + private PlatformTransactionManager transactionManager; + + + + /** + * 批量查询商品根据id + * @param ids + * @return + */ + @Override + public List selectByIds(List ids){ + return baseMapper.selectByIds(ids); + } + + /** + * 查询商品信息 + * + * @param id 主键 + * @return 商品信息 + */ + @Override + public ZhishuShopGoodsVo queryById(String id) { + // 查询商品信息 + Long userId = LoginHelper.getUserId(); + ZhishuShopGoodsVo result = baseMapper.selectByIdVo(id); + // 判断result不为空并且result.getPrice不为空 + if (result != null) { + // 查询仓库编码 + String depotCode = result.getArtNo().substring(0, 2); + TDepotVo vo = baseMapper.selectDepotName(userId, depotCode); + if (vo != null) { + result.setDepotName(vo.getName() + vo.getUnit()); + result.setDepotId(vo.getId()); + } + result.setConditionCode(CHINESE_TO_CODE_MAP2.get(result.getConditionCode())); + } + return result; + } + + + /** + * 查询商品信息 + * + * @param isbn 主键 + * @return 商品信息 + */ + @Override + public List getProductByBarcode(String isbn) { + List results = baseMapper.selectShopGoodsByIsbn(isbn); + if (results.isEmpty()) { + + } + return results; + } + + /** + * 查询商品信息 + * + * @param isbn 主键 + * @return 商品信息 + */ + private static final int MAX_RETRIES = 1; + private static final long RETRY_DELAY_MS = 1000; + + @Override + public List getProductByKongfz(String keyword, String searchType, String sortType, String conditionValue, String cookies, String publisher, String author) { + // 记录程序开始时间 + long startTime = System.currentTimeMillis(); + // 创建线程池 + ExecutorService executorService = Executors.newFixedThreadPool(20); + // 获取Cookie的API地址 +// String cookieUrl = "https://test.kongfz.buzhiyushu.cn/api/auth/getCookies/1915230113968467969/18904056801/Long6166@"; + // 调用孔夫子API获取图书信息 + String searchUrl = "https://search.kongfz.com/pc-gw/search-web/client/pc/product/keyword/list"; + Map params = new HashMap<>(); + params.put("searchType", searchType); + params.put("dataType", "0"); + params.put("page", "1"); + params.put("keyword", keyword); + params.put("sortType", sortType); + params.put("quality", conditionValue); + params.put("actionPath", "sortType,quality"); + params.put("quaSelect", "2"); + params.put("userArea", "13003000000"); + if (publisher != null && !publisher.trim().isEmpty()) { + params.put("press", publisher); + } + if (author != null && !author.trim().isEmpty()) { + params.put("author", author); + } + + List productList = new ArrayList<>(); + Exception lastException = null; + + for (int attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + if (StringUtils.isEmpty(cookies)) { + throw new ServiceException("Cookie数据为空,响应内容:" + cookies); + } + // 将参数编码并拼接到URL + StringBuilder urlWithParams = new StringBuilder(searchUrl); + if (!params.isEmpty()) { + urlWithParams.append("?"); + for (Map.Entry entry : params.entrySet()) { + String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8); + String encodedValue = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8); + urlWithParams.append(encodedKey).append("=").append(encodedValue).append("&"); + } + // 删除末尾多余的"&" + urlWithParams.deleteCharAt(urlWithParams.length() - 1); + } + + + // 设置请求头 + Map headers = new HashMap<>(); + // headers.put("Cookie", "PHPSESSID=" + cookie); + + // 构建HTTP请求 + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(urlWithParams.toString())).header("Cookie", "PHPSESSID=" + cookies).GET() // 显式指定GET方法 + .build(); + // 记录请求开始时间 + long requestStartTime = System.currentTimeMillis(); + // 发送HTTP请求并获取响应 + HttpClient client = HttpClient.newBuilder() + .executor(executorService) // 使用声明的线程池 + .connectTimeout(Duration.ofSeconds(5)) + .version(HttpClient.Version.HTTP_2) + .followRedirects(HttpClient.Redirect.NORMAL) + .proxy(ProxySelector.getDefault()) + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + System.out.println("响应状态码: " + response.statusCode() + "数据" + response); + // 记录请求结束时间 + long requestEndTime = System.currentTimeMillis(); + // 计算请求耗时 + long requestTime = requestEndTime - requestStartTime; + // 打印到控制台 + System.out.println("请求耗时:" + requestTime + "ms"); + + // 打印响应内容,特别是在出错时 + String responseBody = response.body(); +// System.out.println("孔夫子API响应: " + responseBody); + + // 检查状态码,非200状态码可能表示请求失败 + if (response.statusCode() != 200) { + System.err.println("孔夫子API返回非200状态码: " + response.statusCode()); + throw new ServiceException("孔夫子API请求失败,状态码: " + response.statusCode() + ", 响应内容: " + responseBody); + } + + // 检查响应内容中是否包含错误信息 + Map responseMap = JSON.parseObject(responseBody); + if (responseMap != null && responseMap.containsKey("status") && !Integer.valueOf(1).equals(responseMap.get("status"))) { + System.err.println(" 孔夫子API返回错误:" + responseBody); + String errorMessage = responseMap.containsKey("message") ? responseMap.get("message").toString() : "未知错误"; + throw new ServiceException(errorMessage); + } + + // 解析响应JSON + if (responseMap != null && responseMap.get("data") != null) { + Map data = (Map) responseMap.get("data"); + if (data.get("itemResponse") != null) { + Map itemResponse = (Map) data.get("itemResponse"); + List> list = (List>) itemResponse.get("list"); + + // 只取前12条记录 + int limit = Math.min(12, list.size()); + for (int i = 0; i < limit; i++) { + Map item = list.get(i); + KongfzVo productVo = new KongfzVo(); + // 设置ProductVo的属性 + productVo.setName((String) item.get("title")); + productVo.setAuthor((String) item.get("author")); + productVo.setPress((String) item.get("press")); + productVo.setShopName((String) item.get("shopName")); + Object priceObj = item.get("price"); + if (priceObj instanceof Number) { + productVo.setPrice(((Number) priceObj).longValue()); + } + productVo.setImgUrl((String) item.get("imgUrl")); + productVo.setImgBigUrl((String) item.get("imgBigUrl")); + productVo.setPriceText((String) item.get("priceText")); + productVo.setQualityText((String) item.get("qualityText")); + // 关键修复:解析运费信息 + Map postage = (Map) item.get("postage"); + if (postage != null) { + List> shippingList = (List>) postage.get("shippingList"); + if (shippingList != null && !shippingList.isEmpty()) { + // 取第一个运费选项 + Map shipping = shippingList.get(0); + // 处理 shippingFee + Object shippingFeeObj = shipping.get("shippingFee"); + if (shippingFeeObj != null) { + BigDecimal shippingFee = new BigDecimal(shippingFeeObj.toString()); + productVo.setShippingFee(shippingFee); + } + // 处理 shippingFeeText + productVo.setShippingFeeText((String) shipping.get("shippingFeeText")); + } + } + productList.add(productVo); + } + // 记录程序结束时间 + long endTime = System.currentTimeMillis(); + System.out.println("程序运行时间:" + (endTime - startTime) + "毫秒"); + // 关闭线程池 + shutdownAndAwaitTermination(executorService); + return productList; + } + } + + } catch (Exception e) { + lastException = e; + System.err.println("孔夫子API请求失败: " + e.getMessage()); + + if (attempt < MAX_RETRIES - 1) { + try { + Thread.sleep(RETRY_DELAY_MS * (attempt + 1)); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + // 确保在异常情况下也关闭线程池 + shutdownAndAwaitTermination(executorService); + throw new ServiceException("重试过程被中断"); + } + } + } + } + + // 确保在所有重试失败时也关闭线程池 + shutdownAndAwaitTermination(executorService); + // 如果所有重试都失败,抛出最后一次的异常 + throw new ServiceException((lastException != null ? lastException.getMessage() : "未知错误")); + } + + // 添加线程池关闭的辅助方法 + private void shutdownAndAwaitTermination(ExecutorService pool) { + if (pool != null && !pool.isShutdown()) { + pool.shutdown(); // 禁止新任务提交 + try { + // 等待现有任务完成 + if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { + pool.shutdownNow(); // 取消当前执行的任务 + // 等待任务响应关闭操作 + if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { + System.err.println("线程池未能完全终止"); + } + } + } catch (InterruptedException ie) { + // (重新)取消如果当前线程也被中断 + pool.shutdownNow(); + // 保持中断状态 + Thread.currentThread().interrupt(); + } + } + } + + + @Override + public ZhishuShopGoodsVo selectShopGoodsByItemNumber(String itemNumber) { + return baseMapper.selectShopGoodsByItemNumbers(itemNumber); + } + + /** + * 根据货号查询商品 + * + * @param artNo + * @return + */ + @Override + public ZhishuShopGoodsVo selectShopGoodsByArtNo(String artNo) { + return baseMapper.selectShopGoodsByArtNo(artNo); + } + + /** + * 提交商品信息 + * + * @return 商品信息 + */ + @Override + public ProductSubmitResultVo submitProduct(ProductForm form) { + // 书名去除首位空格 + form.setName(form.getName().trim()); + String depotName = form.getDepotName(); + if (StringUtils.isBlank(depotName)) { + throw new IllegalArgumentException("仓库名称不能为空"); + } + + Long userId = sysUserMapper.selectUserIdByNameAndPassWord(form.getPhoneNumber()); + Long depotId = TDepotMapper.getDepotIdByName(depotName, userId); + Long shelvesId = TShelvesMapper.getShelvesIdByName(form.getShelvesName(), depotId); + //获取三级货区信息 + TFreightVo freightVo = TFreightMapper.selectByFreightName(form.getFreightName(), shelvesId); + Long freightId = freightVo.getId(); + // 获取品相数值 + // 中文 + String conCodeTxt = form.getConditionCode(); + // 对应的数值 + String conCode = CnumberUtils.getQualityNum(conCodeTxt); + // 对应的字母 + String letterCode = CnumberUtils.getQualityNum(conCode); + + if (conCode == null) { + throw new IllegalArgumentException("无效的中文品相名称: " + conCode); + } + // 获取货号 + String artNo = cnumberUtils.getArtNo(Double.valueOf(new BigDecimal(conCode).divide(new BigDecimal(10)).toString()), userId, form.getBarcode(), depotId, shelvesId, freightId, form.getSeries()); + // 根据isbn 货号 userid 品相 价格 查询是否存在一样的数据 + long count = baseMapper.selectCountByIsbnAndArtNoAndUserIdAndBarcode(form.getBarcode(), artNo, userId.toString(), letterCode, form.getPrice().toString()); + + ZhishuShopGoods shopGoods = new ZhishuShopGoods(); + + + if (count == 0) { + // 添加库存表 + shopGoods.setIsbn(form.getBarcode()); + shopGoods.setGoodsName(form.getName()); + shopGoods.setUserId(userId); + shopGoods.setPrice(form.getPrice()); + shopGoods.setProductId(""); + shopGoods.setConditionCode(letterCode); + shopGoods.setDepotId(depotId); + shopGoods.setTenantId("000000"); +// shopGoods.setCategoryId(form.getCategoryId()); + if (form.getBarcode().equals("0000000000000")) { + shopGoods.setTemplateType("2"); + } + shopGoods.setFixPrice(form.getFixPrice()); + shopGoods.setInventory(Long.valueOf(0)); + // 根据仓库获取Id + shopGoods.setArtNo(artNo); + shopGoods.setIsJoinDistribution(Integer.parseInt(StringUtils.isNotEmpty(freightVo.getAllowDistribution()) ? freightVo.getAllowDistribution() : "0")); + + baseMapper.insert(shopGoods); + List list = form.getFiles(); + if (list != null && !list.isEmpty()) { + for (FilesVo filesVo : list) { + String url = filesVo.getUrl(); + // 过滤掉临时路径 + if (url == null || url.isEmpty()) { + continue; + } + // 跳过临时文件路径,只保留线上图片 + if (url.startsWith("wxfile://") || + url.startsWith("file://") || + url.startsWith("blob:") || + url.contains("tmp")) { + continue; + } + + // 只插入 https 图片路径 + if (url.startsWith("https://")) { + ZhishuShopImagesBo zhishuShopImagesBo = new ZhishuShopImagesBo(); + zhishuShopImagesBo.setGoodsId(shopGoods.getId()); + zhishuShopImagesBo.setPath(url); + zhishuShopImagesService.insertByBo(zhishuShopImagesBo); + } + } + } + +// List list = form.getFiles(); +// for (FilesVo filesVo : list) { +// ZhishuShopImagesBo zhishuShopImagesBo = new ZhishuShopImagesBo(); +// zhishuShopImagesBo.setGoodsId(shopGoods.getId()); +// zhishuShopImagesBo.setPath(filesVo.getUrl()); +// zhishuShopImagesService.insertByBo(zhishuShopImagesBo); +// } + operatingInventory(1, shopGoods.getId(), Math.toIntExact(form.getInventory()), 4, null, userId); + shopGoods.setInventory(form.getInventory()); + if (form.getBarcode() == null) { + // 增加商品审核 + TBookAudit tBookAudit = new TBookAudit(); + tBookAudit.setGoodsName(form.getName()); + tBookAudit.setIsbn(form.getBarcode()); + tBookAudit.setUserId(userId); + tBookAudit.setProductId(""); + tBookAudit.setArtNo(artNo); + tBookAudit.setPrice(form.getPrice()); + tBookAudit.setFixPrice(form.getFixPrice()); + tBookAudit.setConditionCode(letterCode); + tBookAudit.setInventory(Long.valueOf(form.getInventory())); + tBookAudit.setTenantId("000000"); + tBookAudit.setStatus("2"); + tBookAuditMapper.insert(tBookAudit); + } + } else if (count > 0) { + ZhishuShopGoods existingGoods = baseMapper.selectartNoByIsbnAndConditionCodeAndArtNo(form.getBarcode(), letterCode, artNo, form.getPrice(), userId); + // 价格相同 修改 + long newInventory = existingGoods.getInventory() + form.getInventory(); + shopGoods.setId(existingGoods.getId()); + List list = form.getFiles(); + for (FilesVo filesVo : list) { + ZhishuShopImagesBo zhishuShopImagesBo = new ZhishuShopImagesBo(); + zhishuShopImagesBo.setGoodsId(shopGoods.getId()); + zhishuShopImagesBo.setPath(filesVo.getUrl()); + zhishuShopImagesService.insertByBo(zhishuShopImagesBo); + } + operatingInventory(1, shopGoods.getId(), Math.toIntExact(form.getInventory()), 4, null, userId); + shopGoods.setInventory(newInventory); + tBookAuditMapper.updateInventory(newInventory, userId, letterCode, artNo, form.getPrice(), form.getBarcode()); + } + + + + /** + * 执行孔夫子店铺自动发布商品线程 + */ + //赋值分类 + shopGoods.setCategoryId(form.getCategoryId()); + shopGoods.setDepotId(depotId); + shopGoods.setPrice(form.getPrice()); + TDepotVo depotVo = depotService.queryById(depotId); + TLogisticsVo logisticsVo = logisticsService.queryById(depotVo.getTemplateId()); + if (logisticsVo == null) { + shopGoods.setTemplateMinPrice("0"); + } else { + shopGoods.setTemplateMinPrice(logisticsVo.getFirPrice() == null ? "0" : logisticsVo.getFirPrice().toString()); + } + + System.out.println("shopGoods:" + shopGoods); + TShopDepotAotuMapper tShopDepotAotuMapper = applicationContext.getBean(TShopDepotAotuMapper.class); + KfzAutoAddRunnable kfzAutoAddRunnable = new KfzAutoAddRunnable(userId, + shopService, + shopDetailService, + shopGoodsPublishedService, + kongfzService, + this, + applicationContext, + zhishuShopGoodsDetailService, + shopGoods, + tShopDepotAotuMapper); + Thread thread = new Thread(kfzAutoAddRunnable, "yxy-submitFromCopyrightPage"); + thread.setDaemon(true); // 设置为守护线程 + thread.start(); + // 创建返回对象 + ProductSubmitResultVo result = new ProductSubmitResultVo(); + result.setGoodsId(shopGoods.getId()); + result.setUserId(userId); + result.setDepotId(depotId); + result.setShelvesId(shelvesId); + result.setFreightId(freightId); + result.setArtNo(artNo); + + return result; + } + + + /** + * 上传商品照片 + * + * @param photos 照片文件列表 + * @return 商品信息 + */ + @Override + public void uploadPhotos(MultipartFile[] photos) { + // 确保上传目录存在 + Path uploadPath = Paths.get(UPLOAD_DIR); + if (!Files.exists(uploadPath)) { + try { + Files.createDirectories(uploadPath); + } catch (IOException e) { + throw new RuntimeException("无法创建上传目录", e); + } + } + + // 遍历照片文件并保存 + for (MultipartFile photo : photos) { + if (photo.isEmpty()) { + continue; // 跳过空文件 + } + + try { + // 生成唯一文件名 + String fileName = System.currentTimeMillis() + "_" + photo.getOriginalFilename(); + Path filePath = uploadPath.resolve(fileName); + + // 保存文件 + Files.copy(photo.getInputStream(), filePath); + System.out.println("照片已保存:" + filePath); + } catch (IOException e) { + throw new RuntimeException("照片保存失败", e); + } + } + } + + /** + * 分页查询商品信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品信息分页列表 + */ + @Override + public TableDataInfo queryPageList(ZhishuShopGoodsBo bo, PageQuery pageQuery) { + Long userId; + if(bo.getIsQueryAllGoods() != null && bo.getIsQueryAllGoods() == 2){ + bo.setIsJoinDistribution(1); + } + if(bo.getIsQueryAllGoods() == 2 && StringUtils.isNotEmpty(bo.getWarehouseUserId())){ + //修改为单独查一个仓库 + userId = Long.parseLong(bo.getWarehouseUserId()); + bo.setIsQueryAllGoods(1); + }else{ + userId = LoginHelper.getUserId(); + } + + // 小程序传递的userId + if (userId == null) { + // 这里假设bo中有getUserId方法,如果没有需要根据实际情况调整 + if (bo.getUserId() != null) { + userId = bo.getUserId(); + } + } + + bo.setUserId(userId); + // 动态拼接查询条件 + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + + // 获取当前用户id + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + result.getRecords().forEach(item -> { + if (item.getBookPic() == null) { + String path = baseMapper.selectByBookPic(item.getId()); + if (StringUtils.isNotEmpty(path) && !path.contains("wxfile")) { + item.setBookPic(path); + } else { + item.setBookPic(""); + } + } + }); + // 若查询条件不为空构建响应参数 + if (ObjectUtil.isNotEmpty(result.getRecords())) { + // 根据UserId查询用户电话号码 + List userIdList = result.getRecords().stream().map(ZhishuShopGoodsVo::getUserId).distinct().toList(); + Map> userPhoneNumberMap = new LambdaQueryChainWrapper<>(sysUserMapper) + .in(SysUser::getUserId, userIdList) + .list().stream().collect(Collectors.toMap(SysUser::getUserId, user -> { + Map info = new HashMap<>(); + info.put("phonenumber", user.getPhonenumber()); + info.put("warehouseName", user.getWarehouseName() == null ? "" : user.getWarehouseName()); + return info; + })); + // 根据depotId查询仓库名称 + List depotIdList = result.getRecords().stream().map(ZhishuShopGoodsVo::getDepotId).distinct().toList(); + List depotList = new LambdaQueryChainWrapper<>(TDepotMapper).in(TDepot::getId, depotIdList).list(); + Map depotMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(depotList)) { + for (TDepot tDepot : depotList) { + tDepot.setName(tDepot.getName() + tDepot.getUnit()); + depotMap.put(tDepot.getId(), tDepot); + } + } + List templateIdList = depotList.stream().map(TDepot::getTemplateId).distinct().toList(); + // 根据仓库id查询物流信息 + Map logisticsMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(templateIdList)) { + List logisticsList = new LambdaQueryChainWrapper<>(tLogisticsMapper).in(TLogistics::getId, templateIdList).list(); + if (ObjectUtil.isNotEmpty(logisticsList)) { + for (TLogistics tLogistics : logisticsList) { + logisticsMap.put(tLogistics.getId(), tLogistics); + } + + } + } + + // 循环赋值 + for (ZhishuShopGoodsVo record : result.getRecords()) { + // 电话打码 + if (ObjectUtil.isNotEmpty(userPhoneNumberMap)) { + Map userMap = userPhoneNumberMap.get(record.getUserId()); + String phoneNumber = userMap.get("phonenumber"); + String warehouseName = userMap.get("warehouseName"); + if (ObjectUtil.isNotEmpty(phoneNumber)) { + String phoneNumberMark = EncryptionUtil.maskPhoneNumber(Long.valueOf(phoneNumber)); + record.setPhoneNumberMark(phoneNumberMark); + } + if (StringUtils.isNotEmpty(warehouseName)){ + record.setWarehouseName(warehouseName); + } + } + // // 商品Id打码 + // if (!userId.equals(record.getUserId())) { + // record.setId(EncryptionUtil.maskString(record.getId())); + // } + record.setUserId(null); + // 品相转换 + record.setConditionCode(CHINESE_TO_CODE_MAP2.get(record.getConditionCode())); + // 价格转换 + // 除于100后保留两位小数 + record.setPrice(record.getPrice()); + if (ObjectUtil.isNotEmpty(depotMap)) { + TDepot tDepot = depotMap.get(record.getDepotId()); + if (ObjectUtil.isNotEmpty(tDepot) && ObjectUtil.isNotNull(tDepot)) { + // 赋值仓库名称 + record.setDepotName(tDepot.getName()); + + // 赋值模板名称,详细地址,最低价格 + if (ObjectUtil.isNotEmpty(logisticsMap)) { + + TLogistics tLogistics = logisticsMap.get(tDepot.getTemplateId()); + if (ObjectUtil.isNotEmpty(tLogistics)) { + // 赋值模板名称 + record.setTemplateName(tLogistics.getTemplateName()); + // 赋值模板Id + record.setTemplateId(tLogistics.getId()); + if (ObjectUtil.isNotEmpty(tLogistics.getShippingRange())) { + // 赋值详细地址 + String split = tLogistics.getDeliveryAddress().split("/")[0]; + record.setDeliveryAddress(split); + // 赋值最低价格 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将 JSON 转换为 Map> + Map> regionMap = null; + try { + regionMap = objectMapper.readValue(tLogistics.getShippingRange(), Map.class); + } catch (JsonProcessingException e) { + throw new ServiceException("解析模板运送范围失败", 555); + } + if (ObjectUtil.isNotEmpty(regionMap)) { + List priceList = new ArrayList<>(); + // 遍历 Map 并修改每个列表中的第二个元素 + for (Map.Entry> entry : regionMap.entrySet()) { + List list = entry.getValue(); + String strValue = String.valueOf(list.get(1)); + priceList.add(new BigDecimal(strValue)); + } + BigDecimal minPrice = Collections.min(priceList); + record.setPricingMethod(tLogistics.getPricingMethod()); + record.setTemplateMinPrice(minPrice); + } + } + + } + } + } + + } + + } + } + return TableDataInfo.build(result); + } + + + public Page queryPageList2(ZhishuShopGoodsBo bo, PageQuery pageQuery) { + // 动态拼接查询条件 + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 获取当前用户id + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + // 若查询条件不为空构建响应参数 + if (ObjectUtil.isNotEmpty(result.getRecords())) { + // 根据UserId查询用户电话号码 + List userIdList = result.getRecords().stream().map(ZhishuShopGoodsVo::getUserId).distinct().toList(); + Map userPhoneNumberMap = new LambdaQueryChainWrapper<>(sysUserMapper) + .in(SysUser::getUserId, userIdList) + .list().stream().collect(Collectors.toMap(SysUser::getUserId, SysUser::getPhonenumber)); + // 根据depotId查询仓库名称 + List depotIdList = result.getRecords().stream().map(ZhishuShopGoodsVo::getDepotId).distinct().toList(); + List depotList = new LambdaQueryChainWrapper<>(TDepotMapper).in(TDepot::getId, depotIdList).list(); + Map depotMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(depotList)) { + for (TDepot tDepot : depotList) { + tDepot.setName(tDepot.getName() + tDepot.getUnit()); + depotMap.put(tDepot.getId(), tDepot); + } + } + List templateIdList = depotList.stream().map(TDepot::getTemplateId).distinct().toList(); + // 根据仓库id查询物流信息 + Map logisticsMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(templateIdList)) { + List logisticsList = new LambdaQueryChainWrapper<>(tLogisticsMapper).in(TLogistics::getId, templateIdList).list(); + if (ObjectUtil.isNotEmpty(logisticsList)) { + for (TLogistics tLogistics : logisticsList) { + logisticsMap.put(tLogistics.getId(), tLogistics); + } + + } + } + + // 循环赋值 + for (ZhishuShopGoodsVo record : result.getRecords()) { + // 电话打码 + if (ObjectUtil.isNotEmpty(userPhoneNumberMap)) { + String phoneNumber = userPhoneNumberMap.get(record.getUserId()); + if (ObjectUtil.isNotEmpty(phoneNumber)) { + String phoneNumberMark = EncryptionUtil.maskPhoneNumber(Long.valueOf(phoneNumber)); + record.setPhoneNumberMark(phoneNumberMark); + } + } + record.setUserId(null); + // 品相转换 + record.setConditionCode(CHINESE_TO_CODE_MAP2.get(record.getConditionCode())); + // 价格转换 + // 除于100后保留两位小数 + record.setPrice(record.getPrice()); + if (ObjectUtil.isNotEmpty(depotMap)) { + TDepot tDepot = depotMap.get(record.getDepotId()); + if (ObjectUtil.isNotEmpty(tDepot) && ObjectUtil.isNotNull(tDepot)) { + // 赋值仓库名称 + record.setDepotName(tDepot.getName()); + + // 赋值模板名称,详细地址,最低价格 + if (ObjectUtil.isNotEmpty(logisticsMap)) { + + TLogistics tLogistics = logisticsMap.get(tDepot.getTemplateId()); + if (ObjectUtil.isNotEmpty(tLogistics)) { + // 赋值模板名称 + record.setTemplateName(tLogistics.getTemplateName()); + // 赋值模板Id + record.setTemplateId(tLogistics.getId()); + if (ObjectUtil.isNotEmpty(tLogistics.getShippingRange())) { + // 赋值详细地址 + String split = tLogistics.getDeliveryAddress().split("/")[0]; + record.setDeliveryAddress(split); + // 赋值最低价格 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将 JSON 转换为 Map> + Map> regionMap = null; + try { + regionMap = objectMapper.readValue(tLogistics.getShippingRange(), Map.class); + } catch (JsonProcessingException e) { + throw new ServiceException("解析模板运送范围失败", 555); + } + if (ObjectUtil.isNotEmpty(regionMap)) { + List priceList = new ArrayList<>(); + // 遍历 Map 并修改每个列表中的第二个元素 + for (Map.Entry> entry : regionMap.entrySet()) { + List list = entry.getValue(); + String strValue = String.valueOf(list.get(1)); + priceList.add(new BigDecimal(strValue)); + } + BigDecimal minPrice = Collections.min(priceList); + record.setPricingMethod(tLogistics.getPricingMethod()); + record.setTemplateMinPrice(minPrice); + } + } + + } + } + } + + } + + } + } + return result; + } + + /** + * 查询符合条件的商品信息列表 + * + * @param bo 查询条件 + * @return 商品信息列表 + */ + @Override + public List queryList(ZhishuShopGoodsBo bo) { + if (bo.getUserId() == null){ + Long userId = LoginHelper.getUserId(); + bo.setUserId(userId); + } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List list = baseMapper.selectVoList(lqw); + // 若查询条件不为空构建响应参数 + if (ObjectUtil.isNotEmpty(list)) { + // 根据depotId查询仓库名称 + List depotIdList = list.stream().map(ZhishuShopGoodsVo::getDepotId).distinct().toList(); + List depotList = new LambdaQueryChainWrapper<>(TDepotMapper).in(TDepot::getId, depotIdList).list(); + Map depotNameMap = depotList.stream().collect(Collectors.toMap(TDepot::getId, TDepot::getName)); + List templateIdList = depotList.stream().map(TDepot::getTemplateId).distinct().toList(); + // 根据仓库id查询物流信息 + Map logisticsMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(templateIdList)) { + List logisticsList = new LambdaQueryChainWrapper<>(tLogisticsMapper).in(TLogistics::getId, templateIdList).list(); + if (ObjectUtil.isNotEmpty(logisticsList)) { + for (TLogistics tLogistics : logisticsList) { + logisticsMap.put(tLogistics.getWarehouseId(), tLogistics); + } + } + } + + // 循环赋值 + for (ZhishuShopGoodsVo record : list) { + // 品相转换 + record.setConditionCode(CHINESE_TO_CODE_MAP2.get(record.getConditionCode())); + // 价格转换 + record.setPrice(record.getPrice().divide(new BigDecimal(100))); + + // 赋值仓库名称 + if (ObjectUtil.isNotEmpty(depotNameMap)) { + record.setDepotName(depotNameMap.get(record.getDepotId())); + } + // 赋值模板名称,详细地址,最低价格 + if (ObjectUtil.isNotEmpty(logisticsMap)) { + TLogistics tLogistics = logisticsMap.get(record.getDepotId()); + if (ObjectUtil.isNotEmpty(tLogistics)) { + // 赋值模板名称 + record.setTemplateName(tLogistics.getTemplateName()); + // 赋值模板Id + record.setTemplateId(tLogistics.getId()); + if (ObjectUtil.isNotEmpty(tLogistics.getShippingRange())) { + // 赋值详细地址 + record.setDeliveryAddress(tLogistics.getDeliveryAddress()); + // 赋值最低价格 + ObjectMapper objectMapper = new ObjectMapper(); + + // 将 JSON 转换为 Map> + Map> regionMap = null; + try { + regionMap = objectMapper.readValue(tLogistics.getShippingRange(), Map.class); + } catch (JsonProcessingException e) { + throw new ServiceException("解析模板运送范围失败", 555); + } + if (ObjectUtil.isNotEmpty(regionMap)) { + List priceList = new ArrayList<>(); + // 遍历 Map 并修改每个列表中的第二个元素 + for (Map.Entry> entry : regionMap.entrySet()) { + List regionMaplist = entry.getValue(); + priceList.add(new BigDecimal(regionMaplist.get(2))); + } + BigDecimal minPrice = Collections.min(priceList); + record.setPricingMethod(tLogistics.getPricingMethod()); + record.setTemplateMinPrice(minPrice); + } + } + + } + } + } + } + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(ZhishuShopGoodsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(ZhishuShopGoods::getCreateTime); +// lqw.orderByAsc(ZhishuShopGoods::getId); + // 若不是查询所有商品,则拼接用id过滤 + if (IsQueryAllGoodsEnum.NO.getCode().equals(bo.getIsQueryAllGoods())) { + // 用户Id + lqw.eq(ObjectUtil.isNotEmpty(bo.getUserId()), ZhishuShopGoods::getUserId, bo.getUserId()); + } else { + // 查询所有商品 + lqw.and(wrapper -> wrapper + .eq(ObjectUtil.isNotEmpty(bo.getUserId()), ZhishuShopGoods::getUserId, bo.getUserId()) + .or() + .eq(ZhishuShopGoods::getIsJoinDistribution, IsJoinDistributionEnum.YES.getCode())); + } + // 是否分销 + lqw.eq(ObjectUtil.isNotEmpty(bo.getIsJoinDistribution()), ZhishuShopGoods::getIsJoinDistribution, bo.getIsJoinDistribution()); + // 管理员可以查看所有数据 + // if (bo.getUserId() != null && !Long.valueOf(1).equals(bo.getUserId())) { + // lqw.eq(ZhishuShopGoods::getUserId, bo.getUserId()); + // } + // 商品名称 + lqw.like(StringUtils.isNotBlank(bo.getGoodsName()), ZhishuShopGoods::getGoodsName, bo.getGoodsName()); + // 货号 + lqw.like(StringUtils.isNotBlank(bo.getArtNo()), ZhishuShopGoods::getArtNo, bo.getArtNo()); + + + // 图片是否为空 + if (ObjectUtil.isNotNull(bo.getIsBookPicNull())) { + List zhishuShopImages = baseMapper.selectImages(); +// 2. 根据查询条件处理 + if (bo.getIsBookPicNull() == 0) { + // 情况1:要求无图(记录不存在或path为空) + if (!zhishuShopImages.isEmpty()) { + // 排除fistImage中有图片路径的 + List goodsIds = zhishuShopImages.stream() + .filter(image -> StringUtils.isNotEmpty(image.getPath())) + .map(ZhishuShopImages::getGoodsId) + .toList(); + lqw.notIn(ZhishuShopGoods::getId, goodsIds); + } else { + lqw.eq(ZhishuShopGoods::getId, -1); + } + } else { + // 情况2:要求有图(path不为空) + if (!zhishuShopImages.isEmpty()) { + List goodsIds = zhishuShopImages.stream() + .filter(image -> StringUtils.isNotEmpty(image.getPath())) + .map(ZhishuShopImages::getGoodsId) + .toList(); + lqw.in(ZhishuShopGoods::getId, goodsIds); + } else { + lqw.eq(ZhishuShopGoods::getId, -1); + } + } + } + + + // 原始货号 + lqw.like(StringUtils.isNotBlank(bo.getOriginalArtNo()), ZhishuShopGoods::getOriginalArtNo, bo.getOriginalArtNo()); + + if (StringUtils.isNotEmpty(bo.getMinprice()) && bo.getMaxprice() != null) { + String operator = bo.getMinprice(); + Long price = new BigDecimal(bo.getMaxprice()).multiply(new BigDecimal(100)).longValue(); + switch (operator) { + case "=": + lqw.eq(ZhishuShopGoods::getPrice, price); + break; + case ">": + lqw.gt(ZhishuShopGoods::getPrice, price); // 使用 gt 而不是 ge + break; + case ">=": + lqw.ge(ZhishuShopGoods::getPrice, price); + break; + case "<": + lqw.lt(ZhishuShopGoods::getPrice, price); // 使用 lt 而不是 le + break; + case "<=": + lqw.le(ZhishuShopGoods::getPrice, price); + break; + default: + break; + } + } + +// // 最低价格 +// Optional.ofNullable(bo.getMinprice()).map(price -> price * 100).ifPresent(value -> lqw.ge(ZhishuShopGoods::getPrice, value)); +// // 最高价格 +// Optional.ofNullable(bo.getMaxprice()).map(price -> price * 100).ifPresent(value -> lqw.le(ZhishuShopGoods::getPrice, value)); +// // 最低库存 +// lqw.ge(ObjectUtil.isNotNull(bo.getMininventory()), ZhishuShopGoods::getInventory, bo.getMininventory()); +// // 最高库存 +// lqw.le(ObjectUtil.isNotNull(bo.getMaxinventory()), ZhishuShopGoods::getInventory, bo.getMaxinventory()); + + if (StringUtils.isNotEmpty(bo.getMininventory()) && bo.getMaxinventory() != null) { + String operator = bo.getMininventory(); + Long inventory = bo.getMaxinventory(); + switch (operator) { + case "=": + lqw.eq(ZhishuShopGoods::getInventory, inventory); + break; + case ">": + lqw.gt(ZhishuShopGoods::getInventory, inventory); // 使用 gt 而不是 ge + break; + case ">=": + lqw.ge(ZhishuShopGoods::getInventory, inventory); + break; + case "<": + lqw.lt(ZhishuShopGoods::getInventory, inventory); // 使用 lt 而不是 le + break; + case "<=": + lqw.le(ZhishuShopGoods::getInventory, inventory); + break; + default: + break; + } + } + + + // 商品编号 + lqw.eq(StringUtils.isNotBlank(bo.getItemNumber()), ZhishuShopGoods::getProductId, bo.getItemNumber()); + + // ISBN + if (StringUtils.isNotBlank(bo.getIsbn()) || bo.getIsExistIsbn() != null) { + if (bo.getIsExistIsbn() != null) { + if (bo.getIsExistIsbn() == 0) { + // 情况1:isExistIsbn=0 + if (StringUtils.isNotBlank(bo.getIsbn())) { + if (bo.getIsbn().startsWith("678")) { + lqw.likeRight(ZhishuShopGoods::getIsbn, bo.getIsbn()); + } else { + // 不符合678开头的条件,返回空结果 + lqw.eq(ZhishuShopGoods::getId, -1); + } + } else { + // 默认查询678开头的记录 + lqw.likeRight(ZhishuShopGoods::getIsbn, "678"); + } + } else { + // 情况2:isExistIsbn=1,查询不以678开头的记录 + lqw.notLikeRight(ZhishuShopGoods::getIsbn, "0") + .notLikeRight(ZhishuShopGoods::getIsbn, "1") + .notLikeRight(ZhishuShopGoods::getIsbn, "4") + .notLikeRight(ZhishuShopGoods::getIsbn, "5") + .notLikeRight(ZhishuShopGoods::getIsbn, "6") + .notLikeRight(ZhishuShopGoods::getIsbn, "8") + .eq(StringUtils.isNotBlank(bo.getIsbn()), ZhishuShopGoods::getIsbn, bo.getIsbn()); + } + } else { + // 情况3:isExistIsbn=null,精确查询 + lqw.eq(ZhishuShopGoods::getIsbn, bo.getIsbn()); + } + } + + // 品相 + if (StringUtils.isNotBlank(bo.getConditionCode())) { +// String conditionCode = CHINESE_TO_CODE_MAP1.get(bo.getConditionCode()); +// Assert.isTrue(ObjectUtil.isNotEmpty(conditionCode), "没有对应品级"); + lqw.eq(ZhishuShopGoods::getConditionCode, bo.getConditionCode()); + } + // 仓库名称 仓库Id + if (ObjectUtil.isNotNull(bo.getDepotId()) || ObjectUtil.isNotEmpty(bo.getDepotName())) { + + + + List depotList = new LambdaQueryChainWrapper<>(TDepotMapper).eq(ObjectUtil.isNotNull(bo.getDepotId()), TDepot::getId, bo.getDepotId()).like(ObjectUtil.isNotEmpty(bo.getDepotName()), TDepot::getName, bo.getDepotName()).list(); + if (ObjectUtil.isNotEmpty(depotList)) { + List depotIds = depotList.stream().map(TDepot::getId).toList(); + lqw.in(ZhishuShopGoods::getDepotId, depotIds); + } + } + // 模板名称 模板Id 详细地址 + if (ObjectUtil.isNotNull(bo.getTemplateId()) || ObjectUtil.isNotEmpty(bo.getTemplateName())) { + List logisticsList = new LambdaQueryChainWrapper<>(tLogisticsMapper).eq(ObjectUtil.isNotNull(bo.getTemplateId()), TLogistics::getId, bo.getTemplateId()).like(ObjectUtil.isNotEmpty(bo.getTemplateName()), TLogistics::getTemplateName, bo.getTemplateName()).like(ObjectUtil.isNotEmpty(bo.getAddress()), TLogistics::getDeliveryAddress, bo.getAddress()).list(); + if (ObjectUtil.isNotEmpty(logisticsList)) { + List warehouseId = logisticsList.stream().map(TLogistics::getWarehouseId).toList(); + lqw.in(ZhishuShopGoods::getDepotId, warehouseId); + } + } + + + // 货区ids列表 + if (ObjectUtil.isNotEmpty(bo.getCargoAreaIds())) { + Integer cargoAreaId = bo.getCargoAreaIds().size(); + ArrayList ids = new ArrayList<>(); + List zhishuShopGoodsList = new LambdaQueryChainWrapper<>(baseMapper).eq(ObjectUtil.isNotNull(bo.getCargoAreaIds()), ZhishuShopGoods::getDepotId, bo.getCargoAreaIds().get(0)).list(); + if (ObjectUtil.isNotEmpty(zhishuShopGoodsList)) { + List depotList = new LambdaQueryChainWrapper<>(TDepotMapper).eq(ObjectUtil.isNotNull(bo.getCargoAreaIds()), TDepot::getId, bo.getCargoAreaIds().get(0)).list(); + if (ObjectUtil.isNotEmpty(depotList)) { + if (cargoAreaId == 1) { + List depotIds = depotList.stream().map(TDepot::getId).toList(); + lqw.in(ZhishuShopGoods::getDepotId, depotIds); + } else if (cargoAreaId == 2) { + List shelvesList = new LambdaQueryChainWrapper<>(TShelvesMapper).eq(ObjectUtil.isNotNull(bo.getCargoAreaIds()), TShelves::getId, bo.getCargoAreaIds().get(1)).list(); + if (ObjectUtil.isNotEmpty(shelvesList)) { + // 获取depotList中的code + List depotCodes = depotList.stream().map(TDepot::getCode).toList(); + // 获取shelvesList中的code + List sheCodes = shelvesList.stream().map(TShelves::getCode).toList(); + String depotCode = depotCodes.get(0) + sheCodes.get(0); + // 判断zhishuShopGoodsList中的artNo的前缀是否包含depotCode + for (ZhishuShopGoods item : zhishuShopGoodsList) { + if (item.getArtNo().startsWith(depotCode)) { + ids.add(item.getId()); + } + } + if (ids.isEmpty()) { + lqw.eq(ZhishuShopGoods::getDepotId, -1); + } else { + lqw.in(ZhishuShopGoods::getId, ids); + } + } else { + lqw.eq(ZhishuShopGoods::getDepotId, -1); + } + } else if (cargoAreaId == 3) { + List shelvesList = new LambdaQueryChainWrapper<>(TShelvesMapper).eq(ObjectUtil.isNotNull(bo.getCargoAreaIds()), TShelves::getId, bo.getCargoAreaIds().get(1)).list(); + List freightList = new LambdaQueryChainWrapper<>(TFreightMapper).eq(ObjectUtil.isNotNull(bo.getCargoAreaIds()), TFreight::getId, bo.getCargoAreaIds().get(2)).list(); + if (ObjectUtil.isNotEmpty(shelvesList) && ObjectUtil.isNotEmpty(freightList)) { + // 获取depotList中的code + List depotCodes = depotList.stream().map(TDepot::getCode).toList(); + // 获取shelvesList中的code + List sheCodes = shelvesList.stream().map(TShelves::getCode).toList(); + // 获取freightList中的code + List freCodes = freightList.stream().map(TFreight::getCode).toList(); + String depotCode = depotCodes.get(0) + sheCodes.get(0) + freCodes.get(0); + // 判断zhishuShopGoodsList中的artNo的前缀是否包含depotCode + for (ZhishuShopGoods item : zhishuShopGoodsList) { + if (item.getArtNo().startsWith(depotCode)) { + ids.add(item.getId()); + } + } + if (ids.isEmpty()) { + lqw.eq(ZhishuShopGoods::getDepotId, -1); + } else { + lqw.in(ZhishuShopGoods::getId, ids); + } + } else { + lqw.eq(ZhishuShopGoods::getDepotId, -1); + } + } + } else { + lqw.eq(ZhishuShopGoods::getDepotId, -1); + } + } else { + lqw.eq(ZhishuShopGoods::getDepotId, -1); + } + } + + // 发货地址 + if (ObjectUtil.isNotNull(bo.getAddress())) { + List logisticsList = new LambdaQueryChainWrapper<>(tLogisticsMapper).eq(ObjectUtil.isNotNull(bo.getAddress()), TLogistics::getDeliveryProvince, bo.getAddress()).list(); + if (ObjectUtil.isNotEmpty(logisticsList)) { + List depotIds = new ArrayList<>(); + for (TLogistics item : logisticsList) { + List depotList = new LambdaQueryChainWrapper<>(TDepotMapper) + .eq(TDepot::getTemplateId, item.getId()) + .list(); + depotIds.addAll(depotList.stream().map(TDepot::getId).toList()); + } + + if (ObjectUtil.isNotEmpty(depotIds)) { + lqw.in(ZhishuShopGoods::getDepotId, depotIds); + } else { + // 如果没有匹配的仓库,直接返回空结果 + lqw.eq(ZhishuShopGoods::getId, -1); + } + } else { + // 如果没有匹配的物流信息,直接返回空结果 + lqw.eq(ZhishuShopGoods::getId, -1); + } + } + + // 添加入库时间比较 + if (ObjectUtil.isNotNull(bo.getStartTime()) && ObjectUtil.isNotNull(bo.getEndTime())) { + lqw.between(ZhishuShopGoods::getCreateTime, bo.getStartTime(), bo.getEndTime()); + } else if (ObjectUtil.isNotNull(bo.getStartTime())) { + // 只有开始时间,查询该时间之后的数据 + lqw.ge(ZhishuShopGoods::getCreateTime, bo.getStartTime()); + } else if (ObjectUtil.isNotNull(bo.getEndTime())) { + // 只有结束时间,查询该时间之前的数据 + lqw.le(ZhishuShopGoods::getCreateTime, bo.getEndTime()); + } + + + return lqw; + } + + + public static final Map CHINESE_TO_CODE_MAP2 = IntStream.range(0, CHINESE_CODE.length).boxed().collect(Collectors.toMap(i -> CONDITION_CODE[i], // 值:字母标识(如"A") + i -> CHINESE_CODE[i], // 键:中文标识(如"一品") + (oldVal, newVal) -> oldVal, LinkedHashMap::new // 保持插入顺序 + )); + + /** + * 新增商品信息 + * + * @param bo 商品信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ZhishuShopGoodsBo bo) { + validEntityBeforeSave(bo); + ZhishuShopGoods add = MapstructUtils.convert(bo, ZhishuShopGoods.class); + Long userId = LoginHelper.getUserId(); + add.setUserId(userId); + add.setProductId(""); +// if (add.getFixPrice() != null) { +// add.setFixPrice(add.getFixPrice() * 100); +// } +// if (add.getPrice() != null) { +// add.setPrice(add.getPrice() * 100); +// } + add.setConditionCode(CHINESE_TO_CODE_MAP1.get(add.getConditionCode())); + Double s = convertChineseToCode(bo.getConditionCode()); + List sheCount = baseMapper.selectSheCount(bo.getDepotId()); + if (sheCount.size() == 0) { + throw new RuntimeException("二级货区不存在,请先创建二级货区"); + } + List freCount = baseMapper.selectFreCount1(sheCount); + if (freCount.size() == 0) { + throw new RuntimeException("三级货区不存在,请创建三级货区"); + } + Map map = new HashMap<>(); + sheCount.forEach(she -> { + // 跳过无效code长度(非1位或2位) + if (she.getCode().length() != 1 && she.getCode().length() != 2) { + return; // 在forEach中相当于continue + } + List tFreight = baseMapper.selectBySId(she.getId()); + if (tFreight == null) { + return; // 跳过空数据 + } + for (int i = 0; i < tFreight.size(); i++) { + if (tFreight.get(i).getCode() == null) { + return; // 跳过空数据 + } + // 核心匹配逻辑 + if ((she.getCode().length() == 2 && tFreight.get(i).getCode().length() == 1) || (she.getCode().length() == 1 && tFreight.get(i).getCode().length() == 2)) { + map.put(tFreight.get(i).getId(), she.getId()); + } + } + }); + if (map.isEmpty()) { + return false; + } + Long sheId = null; + Long freId = null; + // 1. 转换为可随机访问的Entry集合 + List> entries = new ArrayList<>(map.entrySet()); + // 2. 线程安全随机选择(Java 8+) + if (!entries.isEmpty()) { + Map.Entry randomEntry = entries.get(ThreadLocalRandom.current().nextInt(entries.size())); + freId = randomEntry.getKey(); + sheId = randomEntry.getValue(); + } + + + String artNo = cnumberUtils.getArtNo(s, userId, bo.getIsbn(), bo.getDepotId(), sheId, freId, null); + add.setArtNo(artNo); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + + // @Override + public void insertByBo1(ZhishuShopGoodsBo bo,String type) { + validEntityBeforeSave(bo); + ZhishuShopGoods add = MapstructUtils.convert(bo, ZhishuShopGoods.class); + add.setConditionCode(CHINESE_TO_CODE_MAP1.get(add.getConditionCode())); + add.setPrice(add.getPrice() * 100); + if (add.getIsbn() == null) { + boolean flag = baseMapper.insert(add) > 0; + } else { + add.setProductId(""); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + } + + //修改成功后,记录自营书品库存修改表 + StockChangeLog stockChangeLog = new StockChangeLog(); + stockChangeLog.setShopGoodsId(Long.parseLong(add.getId())); + //类型 2-订单减扣 3-退单添加 + stockChangeLog.setType(Integer.parseInt(type)); + stockChangeLog.setAboutId("0"); + stockChangeLog.setBeforeInv(0L); + stockChangeLog.setAfterInv(bo.getInventory()); + stockChangeLog.setCreateBy(bo.getUserId()); + stockChangeLog.setUpdateBy(bo.getUserId()); + stockChangeLog.setCreateTime(DateUtils.getNowDate()); + stockChangeLog.setUpdateTime(DateUtils.getNowDate()); + stockChangeLog.setDelFlag("0"); + stockChangeLogMapper.insert(stockChangeLog); + } + + public void insertByBo2(ZhishuShopGoodsBo bo, List zhishuShopGoodsList, + List stockChangeLogList, List zhishuShopImagesList, + String accessToken,Long taskId,Long shopId) { +// validEntityBeforeSave(bo); + //查询当前货号是否在自营书品已经存在 + ZhishuShopGoodsVo zhishuShopGoodsVo = selectShopGoodsByArtNo(bo.getArtNo()); + if(zhishuShopGoodsVo == null){ + ZhishuShopGoods add = MapstructUtils.convert(bo, ZhishuShopGoods.class); + add.setTaskId(taskId); + add.setConditionCode(CHINESE_TO_CODE_MAP1.get(add.getConditionCode())); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + // 获取pdd图片 + bo.setId(add.getId()); + // 增加图片 + if (ObjectUtil.isNotEmpty(add.getBookPic())) { + ZhishuShopImages zhishuShopImages = new ZhishuShopImages(); + zhishuShopImages.setGoodsId(add.getId()); + zhishuShopImages.setPath(add.getBookPic()); + zhishuShopImages.setCreateBy(add.getUserId()); + zhishuShopImages.setUpdateBy(add.getUserId()); + zhishuShopImages.setCreateTime(DateUtils.getNowDate()); + zhishuShopImages.setUpdateTime(DateUtils.getNowDate()); + zhishuShopImages.setDelFlag("0"); + zhishuShopImagesList.add(zhishuShopImages); + } + // 增加库存操作日志 + StockChangeLog stockChangeLog = new StockChangeLog(); + stockChangeLog.setShopGoodsId(Long.valueOf(add.getId())); + stockChangeLog.setType(5); + // 孔网拉取的数据初始库存为0 + stockChangeLog.setBeforeInv(0L); + stockChangeLog.setAfterInv((long) add.getInventory()); + stockChangeLog.setCreateBy(add.getUserId()); + stockChangeLog.setUpdateBy(add.getUserId()); + stockChangeLog.setCreateTime(DateUtils.getNowDate()); + stockChangeLog.setUpdateTime(DateUtils.getNowDate()); + stockChangeLog.setDelFlag("0"); + // 增加库存操作日志 + stockChangeLog.setAfterInv((long) add.getInventory()); + stockChangeLogList.add(stockChangeLog); + // todo 新增已发布商品记录 + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + shopGoodsPublishedBo.setShopId(shopId+""); + shopGoodsPublishedBo.setShopGoodsId(add.getId()); + shopGoodsPublishedBo.setPlatformId(bo.getProductId()); + shopGoodsPublishedBo.setCreateBy(add.getUserId()); + shopGoodsPublishedBo.setCreateTime(DateUtils.getNowDate()); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + zhishuShopGoodsList.add(add); + } + }else{ + //已存在自营书品,校验已发布商品是否存在记录 + ShopGoodsPublishedVo shopGoodsPublishedVo = shopGoodsPublishedService.queryByShopIdAndShopGoodsId(shopId+"",zhishuShopGoodsVo.getId()); + if(shopGoodsPublishedVo == null){ + //如果为空代表没有已发布商品记录,新增记录 + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + shopGoodsPublishedBo.setShopId(shopId+""); + shopGoodsPublishedBo.setShopGoodsId(zhishuShopGoodsVo.getId()); + shopGoodsPublishedBo.setPlatformId(bo.getProductId()); + shopGoodsPublishedBo.setCreateBy(zhishuShopGoodsVo.getUserId()); + shopGoodsPublishedBo.setCreateTime(DateUtils.getNowDate()); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + } + } + } + + private String fullBookPic(ZhishuShopGoods add) { + // 获取md5加密的32位首位小写字母 + String md5 = DigestUtils.md5Hex(add.getGoodsName()); + String substring = md5.substring(0, 1); + return String.format("https://book.center.image.buzhiyushu.cn/%s/%s%s", substring, add.getIsbn(), "_s_01.jpg"); + } + + + @Transactional(rollbackFor = Exception.class) + public Boolean insertListGoods(ZhishuShopGoods add) { + Long message = baseMapper.findBookMsgByISBN(add); + if (message == 0) { + // Integer Inventory = baseMapper.selectGoods(add); + // if(Inventory!=0){ + // add.setInventory(add.getInventory() + Inventory); + // baseMapper.updateBook(add); + // }else { + Integer msg = baseMapper.setExamineBook(add); + System.out.println(msg); + } + return true; + // }else{ + // return false; + } + + // } + + + private String callApi(String apiUrl) throws Exception { + URL url = new URL(apiUrl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Accept", "application/json"); + conn.setInstanceFollowRedirects(true); // 自动跟随重定向 + + if (conn.getResponseCode() != 200) { + throw new RuntimeException("HTTP error code : " + conn.getResponseCode()); + } + + BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); + StringBuilder response = new StringBuilder(); + String output; + while ((output = br.readLine()) != null) { + response.append(output); + } + conn.disconnect(); + + return response.toString(); + } + + private String parseBookName(String jsonResponse) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JsonNode root = mapper.readTree(jsonResponse); + + // 解析出 book_name + JsonNode dataNode = root.path("data"); + if (dataNode.isMissingNode()) { + throw new RuntimeException("Data field not found in response"); + } + + JsonNode bookNameNode = dataNode.path("book_name"); + if (bookNameNode.isMissingNode()) { + throw new RuntimeException("book_name field not found in data"); + } + + return bookNameNode.asText(); + } + + public Boolean insertByBo(List bo, Long userId,String type) { + for (ZhishuShopGoodsBo goodsBo : bo) { + // 检查书名是否为null,如果是则根据ISBN搜索 + if (goodsBo.getGoodsName() == null && goodsBo.getIsbn() != null && !goodsBo.getIsbn().isEmpty()) { + String apiUrl = "https://book.center.yushutx.com/api/es/searchByISBN?isbn=" + goodsBo.getIsbn(); + try { + String response = callApi(apiUrl); + String bookName = parseBookName(response); + goodsBo.setGoodsName(bookName); + } catch (Exception e) { + // 异常处理,可以根据实际情况调整 + log.error("Error searching book by ISBN: {}", e.getMessage()); + } + } + + // 将ZhishuShopGoodsBo数据 转换为到ZhishuShopGoods数据 + Integer isJoinDistribution = goodsBo.getIsJoinDistribution() == null ? this.parseShipmentId(userId.toString(), goodsBo.getArtNo().substring(0, 5)) : goodsBo.getIsJoinDistribution(); + + + ZhishuShopGoods zhishuShopGoods = MapstructUtils.convert(goodsBo, ZhishuShopGoods.class); + zhishuShopGoods.setUserId(userId); + zhishuShopGoods.setConditionCode(CHINESE_TO_CODE_MAP1.get(zhishuShopGoods.getConditionCode())); + zhishuShopGoods.setPrice(zhishuShopGoods.getPrice() * 100); + zhishuShopGoods.setIsJoinDistribution(isJoinDistribution); + if (zhishuShopGoods.getPrice() != null) { + zhishuShopGoods.setFixPrice(zhishuShopGoods.getPrice() * 100); + } + ZhishuShopGoodsVo zhishuShopGoodsVo = baseMapper.selectShopGoodsByItemNumber1(zhishuShopGoods); + zhishuShopGoods.setUserId(userId); + if (zhishuShopGoodsVo != null ) { + Long Inventory = Long.parseLong(zhishuShopGoodsVo.getInventory()); + Long oldInventory = Inventory; + Long newInventory = Inventory + zhishuShopGoods.getInventory(); + // 商品存在 + zhishuShopGoods.setInventory(newInventory); + Integer a = baseMapper.updateByProduct(zhishuShopGoods); + // 添加日志 + //修改成功后,记录自营书品库存修改表 + StockChangeLog stockChangeLog = new StockChangeLog(); + stockChangeLog.setShopGoodsId(Long.parseLong(zhishuShopGoodsVo.getId())); + //类型 2-订单减扣 3-退单添加 + stockChangeLog.setType(Integer.parseInt(type)); + stockChangeLog.setAboutId("0"); + stockChangeLog.setBeforeInv(oldInventory); + stockChangeLog.setAfterInv(newInventory); + stockChangeLog.setCreateBy(zhishuShopGoods.getUserId()); + stockChangeLog.setUpdateBy(zhishuShopGoods.getUserId()); + stockChangeLog.setCreateTime(DateUtils.getNowDate()); + stockChangeLog.setUpdateTime(DateUtils.getNowDate()); + stockChangeLog.setDelFlag("0"); + stockChangeLogMapper.insert(stockChangeLog); + } else { + goodsBo.setUserId(userId); + goodsBo.setIsJoinDistribution(isJoinDistribution); + this.insertByBo1(goodsBo,type); + } + + /** + * yxy增加代码:如果 goodsBo 的 params 不为空,则进行新增已发布商品 + */ + if (goodsBo.getParams() != null) { + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + // 商品id + shopGoodsPublishedBo.setShopGoodsId(goodsBo.getId()); + // 店铺id + shopGoodsPublishedBo.setShopId(goodsBo.getParams().get("shopId") == null ? null : goodsBo.getParams().get("shopId").toString()); + // 三方平台商品id + shopGoodsPublishedBo.setPlatformId(goodsBo.getParams().get("trilateralId") == null ? null : goodsBo.getParams().get("trilateralId").toString()); + // 创建人 + shopGoodsPublishedBo.setCreateBy(userId); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + } + } + return true; + } + + public Boolean insertByBo1(List bo, Long userId, List zhishuShopGoodsList, + List stockChangeLogList, List zhishuShopImagesList, + String accessToken,Long taskId,Long shopId) { + for (ZhishuShopGoodsBo goodsBo : bo) { + this.insertByBo2(goodsBo, zhishuShopGoodsList, stockChangeLogList, zhishuShopImagesList,accessToken,taskId,shopId); + + // 新增商品详情 + if(ObjectUtil.isEmpty(goodsBo.getIsbn()) || Objects.equals(goodsBo.getIsbn().substring(0,1),"6")){ + System.out.println("商品描述详情:"+JSONObject.toJSONString(goodsBo)); + ZhishuShopGoodsDetailBo zhishuShopGoodsDetail = new ZhishuShopGoodsDetailBo(); + zhishuShopGoodsDetail.setPid(Long.valueOf(goodsBo.getId())); + zhishuShopGoodsDetail.setAuthor(goodsBo.getAuthor()); + zhishuShopGoodsDetail.setPublisher(goodsBo.getPublisher()); + zhishuShopGoodsDetail.setPublishertime(goodsBo.getPublisherTime()); + zhishuShopGoodsDetail.setFormat(goodsBo.getFormat()); + zhishuShopGoodsDetail.setWordage(goodsBo.getWordage()); + zhishuShopGoodsDetail.setUnifiedisbn(goodsBo.getUnifiedIsbn()); + zhishuShopGoodsDetailService.insertByBo(zhishuShopGoodsDetail); + } + } + return true; + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean insertList(List list, Long depotId, String Filename) { + // 开始时间 + long time1 = System.currentTimeMillis(); + // 获取列表总数量 + int count = list.size(); + + // 每批次插入的数据量 + int pageSize = 1000; + // 根据总数量和每批次的数量计算需要的线程数 + int threadNum = count % pageSize == 0 ? (count / pageSize) : (count / pageSize + 1); + // 获取当前用户id + Long userId = LoginHelper.getUserId(); + + // 通过变量存储数据库中数据 + List countList = baseMapper.selectAll(userId); + // 生成任务key + String cat = buildTaskKey(depotId.toString(), Filename, LocalDateTime.now()); + + // 判断当前仓库是否有货架 + List sheCount = baseMapper.selectSheCount(depotId); + if (sheCount.size() == 0) { + throw new RuntimeException("当前一级货区未存在二级货区"); + } + // 判断当前货区是否有货位 + List freCount = baseMapper.selectFreCount1(sheCount); + if (freCount.size() == 0) { + throw new RuntimeException("当前一级货区未存在三级货区"); + } + + Map map = new HashMap<>(); + sheCount.forEach(she -> { + // 跳过无效code长度(非1位或2位) + if (she.getCode().length() != 1 && she.getCode().length() != 2) { + return; // 在forEach中相当于continue + } + + List tFreight = baseMapper.selectBySId(she.getId()); + if (tFreight == null) { + return; // 跳过空数据 + } + for (int i = 0; i < tFreight.size(); i++) { + if (tFreight.get(i).getCode() == null) { + return; // 跳过空数据 + } + // 核心匹配逻辑 + if ((she.getCode().length() == 2 && tFreight.get(i).getCode().length() == 1) || (she.getCode().length() == 1 && tFreight.get(i).getCode().length() == 2)) { + map.put(tFreight.get(i).getId(), she.getId()); + } + } + }); + if (map.isEmpty()) { + return false; + } + + + baseMapper.insertTask(depotId, Filename, count, userId); + + // 初始化线程池 + ExecutorService executor = Executors.newFixedThreadPool(100); + // 创建计数器 + CountDownLatch end = new CountDownLatch(threadNum); + // 将列表按照线程数量进行分批处理 + Lists.partition(list, threadNum).forEach(batch -> executor.execute(() -> { + try { + // 5.并行化ArtNo生成(线程安全处理) + // 随机获取sheCount列表中的任意一个数并判断是否为空 + Long sheId = null; + Long freId = null; + // 1. 转换为可随机访问的Entry集合 + List> entries = new ArrayList<>(map.entrySet()); + // 2. 线程安全随机选择(Java 8+) + if (!entries.isEmpty()) { + Map.Entry randomEntry = entries.get(ThreadLocalRandom.current().nextInt(entries.size())); + freId = randomEntry.getKey(); + sheId = randomEntry.getValue(); + } + + processArtNoConcurrently(list, userId, depotId, sheId, freId); + Boolean b = this.insertByBo(batch, userId,null); + + } finally { + // 6. 计数器减一,表示一个线程完成任务 + end.countDown(); + } + })); + + try { + // 等待所有线程完成任务 + end.await(); + // 关闭线程池 + executor.shutdown(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ServiceException("任务被中断"); + } + // finally { + // // 7.双重保障清理机制(即使线程崩溃也会执行) + // redisTemplate.delete(depotId); + // log.info(" 任务[{}]已执行完成并清理锁", userId); + // } + long time2 = System.currentTimeMillis(); + System.out.println("总耗时:" + (time2 - time1)); + return true; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean insertListGoodsInfo(List list, Long depotId, Long shelvesDepotId, Long freightDepotId, String Filename, String code,Long userId,String type) { + // 获取当前用户id + if (userId == null){ + userId = LoginHelper.getUserId(); + } + + // 开始时间 + long time1 = System.currentTimeMillis(); + // 获取列表总数量 + int count = list.size(); + + // 每批次插入的数据量 + int pageSize = 1000; + // 根据总数量和每批次的数量计算需要的线程数 + int threadNum = count % pageSize == 0 ? (count / pageSize) : (count / pageSize + 1); + + + // 通过变量存储数据库中数据 + List countList = baseMapper.selectAll(userId); + // 生成任务key + String cat = buildTaskKey(depotId.toString(), Filename, LocalDateTime.now()); + + baseMapper.insertTask(depotId, Filename, count, userId); + + // 初始化线程池 + ExecutorService executor = Executors.newFixedThreadPool(100); + // 创建计数器 + CountDownLatch end = new CountDownLatch(threadNum); + // 将列表按照线程数量进行分批处理 + Long finalUserId = userId; + Lists.partition(list, threadNum).forEach(batch -> executor.execute(() -> { + try { + // 直接使用传入的ID + Long sheId = shelvesDepotId; + Long freId = freightDepotId; + + processArtNoConcurrently(list, finalUserId, depotId, sheId, freId); + Boolean b = this.insertByBo(batch, finalUserId,type); + } finally { + // 计数器减一,表示一个线程完成任务 + end.countDown(); + } + })); + + try { + // 等待所有线程完成任务 + end.await(); + // 关闭线程池 + executor.shutdown(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ServiceException("任务被中断"); + } + + long time2 = System.currentTimeMillis(); + System.out.println("总耗时:" + (time2 - time1)); + return true; + } + /** + * 处理ArtNo生成的并发问题 + */ + private void processArtNoConcurrently(List list, Long userId, Long depotId, Long sheId, Long freId) { + + List tDepotList = tDepotMapper.selectV(userId); + List tShelvesList = tShelvesMapper.selectM(userId); + List tFreightList = tShelvesMapper.selectFList(userId); + // 并行处理每个商品对象 + list.stream().forEach(zhishuShopGoodsBo -> { +// if (zhishuShopGoodsBo.getIsArtNoConversion() == 0) { +// return; +// } + + int count= baseMapper.selectArtNobyartNo(zhishuShopGoodsBo.getArtNo(), userId); + if(count>0){ + return; + } + // 设置商品对象的用户ID + zhishuShopGoodsBo.setUserId(userId); + // 初始化新的ArtNo为空字符串 + String newArtNo = ""; + // 接收新的artNo + String artNo1 = zhishuShopGoodsBo.getArtNo(); + // 获取商品的品相 + String conCode = zhishuShopGoodsBo.getConditionCode(); + // 获取商品的ISBN + String isbn = zhishuShopGoodsBo.getIsbn(); + // 调用方法获取新的ArtNo + Double s = convertChineseToCode(conCode); + + String letterCode = CnumberUtils.CHINESE_TO_CODE_MAP.get(conCode); + // 判断artNo是否为 +// if (StringUtils.isEmpty(artNo1)) { + // 调用生成货号的工具类 + newArtNo = cnumberUtils.getArtNo(s, userId, isbn, depotId, sheId, freId, letterCode, tDepotList, tShelvesList, tFreightList); +// } else if (artNo1.length() < 13) { + // 货号小于13位,则补全货号 + +// String depotCode = TDepotMapper.selectByCode(userId, depotId); +// String sheCode = TShelvesMapper.selectFreCode(depotCode, userId); +// String freCode = String.valueOf(generateRandomNumber(1, 5)); +// String conditionCode = getConditionCode(convertChineseToCode(zhishuShopGoodsBo.getConditionCode())); +// newArtNo = depotCode + sheCode + freCode + conditionCode + "-" + artNo1; +// } else { +// newArtNo = artNo1; +// } + zhishuShopGoodsBo.setArtNo(newArtNo); + }); + } + + + /** + * 修改商品信息 + * + * @param bo 商品信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ZhishuShopGoodsBo bo) { + ZhishuShopGoods update = MapstructUtils.convert(bo, ZhishuShopGoods.class); + if (update != null) { + update.setConditionCode(CHINESE_TO_CODE_MAP1.get(bo.getConditionCode())); + } + try { + boolean inven = false; + ZhishuShopGoods zhishuShopGoods = baseMapper.selectById(update.getId()); + if (bo.getInventory() != null && !bo.getInventory().equals(zhishuShopGoods.getInventory())) { + int caozuoType = 0; + int inverend = 0; + if (zhishuShopGoods.getInventory() == null) { + caozuoType = 1; + inverend = bo.getInventory().intValue(); + } else { + int newInventory = bo.getInventory().intValue(); + int oldInventory = zhishuShopGoods.getInventory().intValue(); + // 通过三元运算符实现当newInventory大于oldInventory时,caozuoType为1(增加库存),否则为2(减少库存) + caozuoType = newInventory > oldInventory ? 1 : 2; + inverend = newInventory > oldInventory ? newInventory - oldInventory : oldInventory - newInventory; + } + boolean authorizeStatus = getshopAuthorize(zhishuShopGoods); + if (authorizeStatus) { + //执行库存同步操作 + Boolean invent = CaoZuoInvent(caozuoType, zhishuShopGoods, inverend); + // 获取当前库存数量 + Boolean count = baseMapper.updateChunkInventory(update); + if (invent && count) { + inven = true; + } + if (!inven) { + throw new RuntimeException("线上库存修改失败"); + } + } + } + return inven; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 获取店铺授权状态 + * + * @param zhishuShopGoods + * @return + */ + public Boolean getshopAuthorize(ZhishuShopGoods zhishuShopGoods) { + List shopGoodsPublishedVoList = shopGoodsPublishedService.queryByShopGoodsId(zhishuShopGoods.getId()); + // 循环根据店铺Id查询出店铺信息 + List shopNames = new ArrayList<>(); + for (ShopGoodsPublishedVo goodsPublishedVo : shopGoodsPublishedVoList) { + // 根据店铺Id查询出店铺信息 + ShopVo shop = shopService.queryById(Long.valueOf(goodsPublishedVo.getShopId())); + if (shop == null){ + shopGoodsPublishedService.deleteWithValidByIds(List.of(goodsPublishedVo.getId()), true); + continue; + } + // 根据店铺类型分别推送平台同步库存 + try { + if (shop.getShopAuthorize().equals("2")) { + shopNames.add(shop.getShopName()); + } + } catch (Exception e) { + throw new RuntimeException(shop.getShopName() + "同步失败:" + e); + } finally { + continue; + } + } + if (!shopNames.isEmpty()) { + String formattedShops = String.join(",", shopNames); // 中文逗号分隔 + throw new RuntimeException("店铺:" + formattedShops + ",授权已过期,请重新授权"); + } + return true; + } + + + /** + * 根据库存操作类型操作库存并同步平台库存 + * + * @param operationType + * @param zhishuShopGoods + * @param count + * @return + */ + public Boolean CaoZuoInvent(Integer operationType, ZhishuShopGoods zhishuShopGoods, Integer count) { + Boolean result = operatingInventory(operationType, zhishuShopGoods.getId(), count, 1, "0", zhishuShopGoods.getUserId()); + Assert.isTrue(result, "操作redis/数据库库存失败"); + // 根据商品Id查询出拥有同商品的店铺Id和平台商品Id + List shopGoodsPublishedVoList = shopGoodsPublishedService.queryByShopGoodsId(zhishuShopGoods.getId()); + // 循环根据店铺Id查询出店铺信息 + for (ShopGoodsPublishedVo goodsPublishedVo : shopGoodsPublishedVoList) { + // 根据店铺Id查询出店铺信息 + ShopVo shop = shopService.queryById(Long.valueOf(goodsPublishedVo.getShopId())); + if (shop == null){ + shopGoodsPublishedService.deleteWithValidByIds(List.of(goodsPublishedVo.getId()), true); + continue; + } + // 根据店铺类型分别推送平台同步库存 + try { + InventorySynchronizedStrategy strategy = InventorySynchronizedStrategyFactory.getStrategy(shop.getShopType()); + /** + * operationType 1 添加库存任务 2 减少库存任务 + * type 3 添加库存 2 减少库存 + */ + Integer type = operationType == 1 ? 3 : 2; + strategy.inventorySynchronized(shop, goodsPublishedVo,type); + } catch (Exception e) { + throw new RuntimeException(shop.getShopName() + "同步失败:" + e); + } finally { + continue; + } + } + return true; + } + + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ZhishuShopGoodsBo entity) { + + // 获取当前用户id + // Long userId = LoginHelper.getUserId(); + // if (entity.getArtNo() == null || entity.getArtNo().length() < 13) { + // Double s = convertChineseToCode(entity.getConditionCode()); + // entity.setUserId(userId); + // String artNo = cnumberUtils.getArtNo(s, userId, entity.getIsbn(), null, null, null, null); + // entity.setArtNo(artNo); + // + // } + + // TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除商品信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + boolean message = false; + ArrayList idsList = new ArrayList<>(); + if (isValid) { +// 删除商品信息 +// 循环ids设置ZhishuShopGoods中的id和设置库存为0 + ids.forEach(id -> { + ZhishuShopGoods zhishuShopGoods = baseMapper.selectById(id); + if (zhishuShopGoods.getInventory() != null) { + Integer inventory = zhishuShopGoods.getInventory().intValue(); + Boolean result = CaoZuoInvent(2, zhishuShopGoods, inventory); + if (result) { + idsList.add(id); + } + } + }); + if (!idsList.isEmpty()) { + for (String id : idsList) { + // 查询是否存在已发布商品信息 + Integer count = baseMapper.selectPubCount(id); + if (count > 0) { + // 删除已发布商品信息 + baseMapper.delPubGood(id); + } + } + message = baseMapper.deleteIds(idsList) > 0; + } + } else { + for (String id : ids) { + // 查询是否存在已发布商品信息 + Integer count = baseMapper.selectPubCount(id); + if (count > 0) { + // 删除已发布商品信息 + baseMapper.delPubGood(id); + } + } + message = baseMapper.deleteIds(ids) > 0; + } + + // baseMapper.selectPubCount(ids); + + return message; + } + + + /** + * 构建任务的唯一键 + *

+ * 该方法通过结合仓库ID、目录路径的MD5值和时间来生成一个全局唯一的任务键 + * 使用MD5值是为了确保即使目录路径非常长,生成的键也不会超过一定的长度,并且是唯一的 + * 时间格式化为yyyyMMddHHmm是为了确保时间的部分在键中是固定长度和格式的 + * + * @param depotId 仓库ID,标识任务所属的仓库 + * @param catalogPath 目录路径,标识任务所在的目录结构 + * @param time 时间,标识任务创建的时间 + * @return 返回构建的任务键字符串 + */ + public static String buildTaskKey(String depotId, String catalogPath, LocalDateTime time) { + return String.format("TASK:%s:%s:%s", depotId, DigestUtils.md5Hex(catalogPath), time.format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"))); + } + + public static final Map CHINESE_TO_CODE_MAP1 = IntStream.range(0, CHINESE_CODE.length).boxed().collect(Collectors.toMap(i -> CHINESE_CODE[i], // 键:中文标识(如"一品") + i -> CONDITION_CODE[i], // 值:字母标识(如"A") + (oldVal, newVal) -> oldVal, LinkedHashMap::new // 保持插入顺序 + )); + + public static final Map CHINESE_TO_CODE_MAP = IntStream.range(0, CHINESE_CODE.length).boxed().collect(Collectors.toMap(i -> CHINESE_CODE[i], // 键:中文标识(如"一品") + i -> CONDITION_CODES[i], // 值:字母标识(如"1") + (oldVal, newVal) -> oldVal, LinkedHashMap::new // 保持插入顺序 + )); + + // 品相映射表 + public static final Map CODE_MAP = IntStream.range(0, CONDITION_CODES.length).boxed().collect(Collectors.toMap(i -> CONDITION_CODES[i], + i -> CONDITION_CODE[i], + (oldVal, newVal) -> oldVal, () -> new TreeMap<>(Comparator.comparingDouble(Double::doubleValue)))); + + public Double convertChineseToCode(String chineseName) { + Double code = CHINESE_TO_CODE_MAP.get(chineseName); + if (code == null) { + throw new IllegalArgumentException("无效的中文品名: " + chineseName); + } + return code; + } + + private int generateRandomNumber(int min, int max) { + Random random = new Random(); + return random.nextInt(max - min + 1) + min; + } + + + public static String getConditionCode(double input) { + return CODE_MAP.getOrDefault(input, "UNDEFINED"); + } + + /** + * 调用Python脚本查询图书信息 + * + * @param isbn ISBN编号 + * @return 查询结果 + */ + public ProductVo queryBookByPython(String isbn) { + try { + // 1. 确认线上Python脚本路径 + String scriptPath = "/www/wwwroot/python/chaxun.py"; // 线上绝对路径 + File scriptFile = new File(scriptPath); + + // 2. 检查脚本是否存在 + if (!scriptFile.exists()) { + throw new RuntimeException("Python脚本不存在: " + scriptPath); + } + + // 3. 检查执行权限(Linux/Unix环境) + if (!scriptFile.canExecute()) { + throw new RuntimeException("Python脚本无执行权限: " + scriptPath); + } + + // 4. 构建进程命令(明确使用python3) + ProcessBuilder processBuilder = new ProcessBuilder("python3", scriptPath, // 脚本路径 + isbn // ISBN参数 + ); + processBuilder.redirectErrorStream(true); // 合并错误流到标准输出 + + // 5. 启动进程并等待完成 + System.out.println("执行命令: " + String.join(" ", processBuilder.command())); + Process process = processBuilder.start(); + + // 6. 读取输出 + StringBuilder output = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + output.append(line).append("\n"); + } + } + + // 7. 检查执行结果 + int exitCode = process.waitFor(); + if (exitCode != 0) { + throw new RuntimeException("Python脚本执行失败,退出码: " + exitCode + "\n输出: " + output); + } + + // 8. 解析JSON结果 + return JSON.parseObject(output.toString().trim(), ProductVo.class); + } catch (Exception e) { + throw new RuntimeException("调用Python脚本失败: " + e.getMessage(), e); + } + } + + /** + * 查询上书记录 + */ +// @Override +// public List selectShopGoodsByPhoneNumber(String phoneNumber) { +// Long userId = sysUserMapper.selectUserIdByNameAndPassWord(phoneNumber); +// // 获取用户对应的店铺ID列表 +// Map> shopIdsMap = getShopIdsByUserId(userId); +// // 获取拼多多店铺ID列表 +// List pddShopIds = shopIdsMap.get("1"); +// // 获取孔夫子店铺ID列表 +// List kfzShopIds = shopIdsMap.get("2"); +// // 根据UserId获取商品列表ID +// List goodsList = baseMapper.selectShopGoodsByUser(userId); +// // 提取当前用户上传的商品ID列表 +// List goodsIds = goodsList.stream().map(ZhishuShopGoodsVo::getId).collect(Collectors.toList()); +// +// // 合并所有店铺ID +// List allShopIds = new ArrayList<>(); +// if (pddShopIds != null) allShopIds.addAll(pddShopIds); +// if (kfzShopIds != null) allShopIds.addAll(kfzShopIds); +// +// // 查询所有商品的发布状态 +// if (!goodsIds.isEmpty() && !allShopIds.isEmpty()) { +// List> publishedStatusList = shopGoodsPublishedService.selectPublishedStatus(goodsIds, allShopIds); +// +// // 将发布状态设置到商品对象中 +// Map> statusMap = publishedStatusList.stream() +// .collect(Collectors.toMap( +// map -> String.valueOf(map.get("goodsId")), +// map -> map, +// (v1, v2) -> v1 +// )); +// +// goodsList.forEach(goods -> { +// Map status = statusMap.get(goods.getId()); +// if (status != null) { +// goods.setPddPublishedStatus((Long) status.get("pddStatus")); +// goods.setKfzPublishedStatus((Long) status.get("kfzStatus")); +// } else { +// goods.setPddPublishedStatus(0L); +// goods.setKfzPublishedStatus(0L); +// } +// }); +// } +// +// // 获取商品图片 +// if (!goodsIds.isEmpty()) { +// // 批量查询图片路径 +// List> imagePathList = zhishuShopImagesMapper.batchQueryFirstPathByGoodsIds(goodsIds); +// +// // 将图片路径列表转换为Map +// Map imagePathMap = imagePathList.stream() +// .collect(Collectors.toMap( +// map -> String.valueOf(map.get("goodsId")), +// map -> String.valueOf(map.get("path")), +// (v1, v2) -> v1 +// )); +// +// // 设置图片路径并调用getFiles方法获取图片 +// goodsList.forEach(goods -> { +// String path = imagePathMap.get(goods.getId()); +// if (path != null && !path.isEmpty()) { +// try { +// // 调用getFiles方法获取图片 +// String bookPic = uploadUtil.getFiles(null, goods.getGoodsName(), path); +// goods.setBookPic(bookPic); +// } catch (Exception e) { +// // 记录错误但继续处理其他商品 +// log.error("获取商品图片失败: goodsId={}, path={}", goods.getId(), path, e); +// } +// } +// }); +// } +// +// return goodsList; +// } + public Map> getShopIdsByUserId(Long userId) { + // 构建查询条件 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(Shop::getCreateBy, userId) + .eq(Shop::getStatus, "0") // 正常状态 + .eq(Shop::getDelFlag, "0") // 未删除 + .select(Shop::getId, Shop::getShopType); // 只查询需要的字段 + + // 执行查询 + List shopList = shopMapper.selectList(wrapper); + + // 按店铺类型分组 + Map> resultMap = new HashMap<>(); + + // 初始化结果Map + resultMap.put("1", new ArrayList<>()); // 拼多多店铺 + resultMap.put("2", new ArrayList<>()); // 孔夫子店铺 + resultMap.put("5", new ArrayList<>()); // 闲鱼店铺 + + // 遍历店铺列表,按类型分组 + for (Shop shop : shopList) { + String shopType = shop.getShopType(); + if (shopType != null) { + List idList = resultMap.getOrDefault(shopType, new ArrayList<>()); + idList.add(shop.getId()); + resultMap.put(shopType, idList); + } + } + + return resultMap; + } + + + /** + * 初始化Redis库存 + */ + @Override + public void batchInitInventoryToRedis() { + List goodsList = new LambdaQueryChainWrapper<>(baseMapper).list(); + batchRedisInitInventory(goodsList); + } + + public void batchRedisInitInventory(List goodsList) { + if (ObjectUtil.isNotEmpty(goodsList)) { + RBatch batch = RedisUtils.getClient().createBatch(); + + goodsList.forEach(goods -> { + String inventoryKey = "zhishu_shop_goods_inventory:" + goods.getId(); + RListAsync list = batch.getList(inventoryKey); + for (int i = 0; i < goods.getInventory(); i++) { + list.addAsync(goods.getId()); + } + }); + + // 执行批量操作 + batch.execute(); + } + } + + /** + * 操作Redis/db库存 + * + * @param shopGoodsId + * @param count + * @return + */ + @Override + public Boolean operatingInventory(Integer operationType, String shopGoodsId, Integer count, Integer type, String aboutId, Long operationBy) { + // 确定操作类型 + OperationInventoryTypeEnum operationEnum = OperationInventoryTypeEnum.valueOfCode(operationType); + // 指定redis库000000 + String inventoryKey = "zhishu_shop_goods_inventory:" + shopGoodsId; + String lockKey = "lock:" + shopGoodsId; // 分布式锁的键 + RLock lock = null; + boolean isLockAcquired = false; + try { + // 尝试获取分布式锁 + lock = RedisUtils.getClient().getLock(lockKey); + isLockAcquired = lock.tryLock(10, 10, TimeUnit.SECONDS); // 尝试获取锁,等待时间10秒,锁持有时间为10秒 + + if (!isLockAcquired) { + throw new ServiceException("未能获取到锁,请稍后重试"); + } + + // 查询原始库存 + ZhishuShopGoods zhishuShopGoods = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ZhishuShopGoods::getId, shopGoodsId) + .oneOpt().orElseThrow(() -> new ServiceException("查询商品数据异常-shopGoodsId:" + shopGoodsId)); + + Long currentInventorySize = zhishuShopGoods.getInventory(); + + boolean dbUpdateResult = false; + + // 增加库存操作日志 + StockChangeLog stockChangeLog = new StockChangeLog(); + stockChangeLog.setShopGoodsId(Long.valueOf(shopGoodsId)); + stockChangeLog.setType(type); + stockChangeLog.setAboutId(aboutId); + stockChangeLog.setBeforeInv((long) zhishuShopGoods.getInventory()); + stockChangeLog.setCreateBy(operationBy); + stockChangeLog.setUpdateBy(operationBy); + stockChangeLog.setCreateTime(DateUtils.getNowDate()); + stockChangeLog.setUpdateTime(DateUtils.getNowDate()); + stockChangeLog.setDelFlag("0"); + + switch (operationEnum) { + case REDUCE_INVENTORY: + //减少库存 + if (currentInventorySize < count) { + stockChangeLog.setAfterInv((long) currentInventorySize); // 库存保持不变 + break; // 跳出switch,继续后续流程 + } + // 扣除库存 + + // 更新数据库中的库存 + dbUpdateResult = new LambdaUpdateChainWrapper<>(baseMapper).eq(ZhishuShopGoods::getId, shopGoodsId).setSql("inventory = inventory - " + count).update(); + stockChangeLog.setAfterInv((long) (currentInventorySize - count)); + break; + case INCREASE_INVENTORY: + // 增加库存 + + // 更新数据库中的库存 + dbUpdateResult = new LambdaUpdateChainWrapper<>(baseMapper).eq(ZhishuShopGoods::getId, shopGoodsId).setSql("inventory = inventory + " + count).update(); + stockChangeLog.setAfterInv((long) (currentInventorySize + count)); + break; + default: + throw new ServiceException("未知的操作类型"); + } + + if (!dbUpdateResult) { + throw new ServiceException("扣减库存,操作数据库失败"); + } + + int insert = stockChangeLogMapper.insert(stockChangeLog); + if (insert <= 0) { + throw new ServiceException("库存操作日志插入失败"); + } + return true; + } catch (ServiceException be) { + System.out.println("库存操作异常: " + be.getMessage() + be); + throw be; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); // 恢复线程中断状态 + throw new ServiceException(e.getMessage()); + } finally { + // 确保释放锁 + safeUnlock(lock, isLockAcquired); + } + } + + private void safeUnlock(RLock lock, boolean isLockAcquired) { + if (isLockAcquired && lock != null) { + try { + // 检查当前线程是否还持有锁 + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } else { + System.err.println("当前线程已不再持有锁,跳过释放操作"); + } + } catch (Exception e) { + System.err.println("释放锁异常: " + e.getMessage()); + // 这里可以记录日志,但不要抛出异常 + } + } + } + + + + + /** + * 比对店铺商品信息并生成Excel文件 + * + * @param request + */ + @Async + @Override + public void goodsComparison(GoodsComparisonRequest request) { + Long shopId = request.getShopId(); + Long userId = request.getUserId(); + List zhishuShopGoodsRequestList = request.getZhishuShopGoodsRequestList(); + // 尝试获取锁 + String lockKey = "WriteExcelKey_" + shopId; + String lockValue = "WriteExcelLock"; + Duration lockExpireDuration = Duration.ofMinutes(2); // 设置锁的过期时间为2分钟 + String writeExcelLock = RedisUtils.getCacheObject(lockKey); + // 若获取存在说明存在读取该文件的线程,则直接返回,不进行后续操作 + if (ObjectUtil.isNotEmpty(writeExcelLock)) throw new ServiceException("已在处理该文件,请勿重复操作"); + System.out.println("获取到redis锁,执行读取文件操作"); + // 若不存在,则设置锁,并执行后续操作 + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + ScheduledExecutorService scheduler = null; + ScheduledFuture future = null; + try { + scheduler = Executors.newScheduledThreadPool(1); + // 设置一个定时任务来不断延长锁的过期时间 + Runnable renewLockTask = () -> { + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + System.out.println("Redis锁过期时间已更新"); + }; + // 启动定时任务 + future = scheduler.scheduleAtFixedRate(renewLockTask, 0, INITIAL_DELAY_AND_PERIOD, TimeUnit.SECONDS); + + // 使用并发流处理 + List changedData = Collections.synchronizedList(new ArrayList<>()); + List newData = Collections.synchronizedList(new ArrayList<>()); + + List artNoList = zhishuShopGoodsRequestList.stream() + .map(ZhishuShopGoodsRequest::getArtNo) + .filter(Objects::nonNull) // 过滤掉 null + .filter(s -> !s.isEmpty()) // 过滤掉 空字符串 "" + .distinct() // 去重 + .toList(); + List alreadyExistList = new ArrayList<>(); + if (!ObjectUtil.isEmpty(artNoList)) { + // 查出数据库是否存在数据 + alreadyExistList = new LambdaQueryChainWrapper<>(baseMapper) + .in(ZhishuShopGoods::getArtNo, artNoList) + .list(); + } + Map goodsHashMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(alreadyExistList)) { + for (ZhishuShopGoods zhishuShopGoods : alreadyExistList) { + goodsHashMap.put(zhishuShopGoods.getProductId(), zhishuShopGoods); + } + } + + for (ZhishuShopGoodsRequest zhishuShopGoodsRequest : zhishuShopGoodsRequestList) { + // 是否发生变化辨识 + Boolean isChanged = false; + // 若经过ISBN码、价格、货号都匹配,则却该数据已在库中存在,则进行具体的其他参数值对比,看是否有其他参数做了修改 + if (ObjectUtil.isNotEmpty(alreadyExistList)) { + // 默认取第一条,多条情况为数据存在异常,不考虑 + if (ObjectUtil.isNotEmpty(goodsHashMap)) { + ZhishuShopGoods zhishuShopGoods = goodsHashMap.get(zhishuShopGoodsRequest.getItemNumber()); + if (ObjectUtil.isNotEmpty(zhishuShopGoods)) { + // 判断ISBN码是否发生变化 + if (!Objects.equals(zhishuShopGoodsRequest.getIsbn(), zhishuShopGoods.getIsbn())) + isChanged = true; + // 判断品相是否发生变化 + double conditionCode = Math.round(zhishuShopGoodsRequest.getConditionCode().doubleValue()) / 10.0; + String conditionCodeString = CnumberUtils.getConditionCode(conditionCode); + if (!conditionCodeString.equals(zhishuShopGoods.getConditionCode())) isChanged = true; + // 判断库存是否发生变化 + if (!zhishuShopGoodsRequest.getInventory().equals(zhishuShopGoods.getInventory().intValue())) + isChanged = true; + // 将原数据库中该条数据的id赋值给当前新拉取下来的数据,用于后续更新数据库 + zhishuShopGoodsRequest.setId(zhishuShopGoods.getId()); + if (isChanged) { + changedData.add(zhishuShopGoodsRequest); + } + } else { + // 若数据库中未查询到符合判定规则的数据,说明该数据为新增数据,将其加入到newData中 + newData.add(zhishuShopGoodsRequest); + } + } + } else { + // 若数据库中未查询到符合判定规则的数据,说明该数据为新增数据,将其加入到newData中 + newData.add(zhishuShopGoodsRequest); + } + } + + List fileNameList = new ArrayList<>(); + // 分别指定新增和修改的数据生成的Excel文件存储路径,文件名称前缀,并写到该路径下 + if (!changedData.isEmpty()) { + fileNameList.add("Changed_" + shopId + "_0.xlsx"); + ExcelFileHandlerUtil.handleExport(changedData, UrlUtil.getUrl(), "Changed", shopId.toString(), ZhishuShopGoodsRequest.class); + } + if (!newData.isEmpty()) { + fileNameList.add("New_" + shopId + "_0.xlsx"); + ExcelFileHandlerUtil.handleExport(newData, UrlUtil.getUrl(), "New", shopId.toString(), ZhishuShopGoodsRequest.class); + } + + + RedisUtils.setCacheObject("lastGoodsSynTime_" + shopId, request.getCurrentDateTime()); + + if (!newData.isEmpty() || !changedData.isEmpty()) { + // 查询店铺名称 + ShopVo shop = shopService.queryById(shopId); + // 将任务信息插入到数据库中,创建一条任务 + TaskBo taskBo = new TaskBo(); + taskBo.setTaskType(TaskTypeEnum.SYNC_GOODS_KFZ.getCode()); + taskBo.setShopIds(shopId.toString()); + taskBo.setShopNames(shop.getShopName()); + taskBo.setFileName(String.join("/", fileNameList)); + taskBo.setDataNum((long) zhishuShopGoodsRequestList.size()); + taskBo.setTaskStatus("0"); + taskBo.setStatus("0"); + taskBo.setCreateBy(userId); + taskServiceImpl.insertByBo(taskBo); + } + + // 发送消息给前端告知拉取下来的数据已比对完毕 + scheduledExecutorService.schedule(() -> + + { + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("已拉取到商品数据总计:" + zhishuShopGoodsRequestList.size() + "条,新增:" + newData.size() + "条新数据,更新:" + changedData.size() + "条数据"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 5, TimeUnit.SECONDS); + } catch (Exception e) { + // 捕获其他未知异常 + log.error("商品导入写入Excel过程中发生异常: {}", e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } finally { + // 取消定时任务 + if (future != null) { + future.cancel(false); + } + // 关闭线程池 + if (scheduler != null) { + scheduler.shutdownNow(); + } + // 确保释放锁 + RedisUtils.deleteObject(lockKey); + System.out.println("已释放redis锁"); + } + + } + + // 新增成员变量,用于存储分批处理的状态 + private final ConcurrentHashMap batchContextMap = new ConcurrentHashMap<>(); + + /** + * 分批比对商品 + */ + @Override + public void batchGoodsComparison(BatchGoodsRequest request) { + Long shopId = request.getShopId(); + Long userId = request.getUserId(); + + // 获取或创建处理上下文 + BatchProcessingContext context = batchContextMap.computeIfAbsent(shopId, k -> { + BatchProcessingContext newContext = new BatchProcessingContext(); + newContext.setShopId(shopId); + newContext.setUserId(userId); + newContext.setCurrentDateTime(request.getCurrentDateTime()); + newContext.setTotalBatches(request.getTotalBatches()); + + // 初始化锁 + String lockKey = "WriteExcelKey_" + shopId; + String lockValue = "WriteExcelLock"; + Duration lockExpireDuration = Duration.ofMinutes(30); // 延长锁时间 + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + newContext.setLockKey(lockKey); + + return newContext; + }); + + try { + // 处理当前批次数据 + processBatchData(request.getBatchData(), context); + + // 更新已接收批次计数 + int received = context.getReceivedBatches().incrementAndGet(); + + // 如果是最后一批,完成处理 + if (request.getIsLastBatch() && received == context.getTotalBatches()) { + completeBatchProcessing(context); + } + } catch (Exception e) { + // 发生异常时清理资源 + cleanupBatchProcessing(context); + throw new ServiceException("分批处理商品数据异常: " + e.getMessage() + "异常详情:" + e); + } + } + + /** + * 处理单批数据 + */ + private void processBatchData(List batchData, BatchProcessingContext context) { + List artNoList = batchData.stream() + .map(ZhishuShopGoodsRequest::getArtNo) + .filter(Objects::nonNull) + .filter(s -> !s.isEmpty()) + .distinct() + .toList(); + + // 查询数据库已有数据 + List alreadyExistList = Collections.emptyList(); + if (!artNoList.isEmpty()) { + alreadyExistList = new LambdaQueryChainWrapper<>(baseMapper) + .in(ZhishuShopGoods::getArtNo, artNoList) + .list(); + } + + Map goodsHashMap = alreadyExistList.stream() + .collect(Collectors.toMap(ZhishuShopGoods::getProductId, Function.identity())); + + // 分类处理当前批次数据 + for (ZhishuShopGoodsRequest request : batchData) { + Boolean isChanged = false; + + if (!goodsHashMap.isEmpty()) { + ZhishuShopGoods existingGoods = goodsHashMap.get(request.getItemNumber()); + if (existingGoods != null) { + // 检查数据是否有变化 + if (!Objects.equals(request.getIsbn(), existingGoods.getIsbn())) { + isChanged = true; + } + + double conditionCode = Math.round(request.getConditionCode().doubleValue()) / 10.0; + String conditionCodeString = CnumberUtils.getConditionCode(conditionCode); + if (!conditionCodeString.equals(existingGoods.getConditionCode())) { + isChanged = true; + } + + if (!request.getInventory().equals(existingGoods.getInventory().intValue())) { + isChanged = true; + } + + request.setId(existingGoods.getId()); + + if (isChanged) { + context.getAllChangedData().add(request); + } + } else { + context.getAllNewData().add(request); + } + } else { + context.getAllNewData().add(request); + } + } + } + + /** + * 完成批次处理 + */ + private void completeBatchProcessing(BatchProcessingContext context) { + ScheduledExecutorService scheduler = null; + ScheduledFuture future = null; + + try { + // 设置锁续期 + scheduler = Executors.newScheduledThreadPool(1); + Runnable renewLockTask = () -> { + RedisUtils.setCacheObject(context.getLockKey(), "WriteExcelLock", Duration.ofMinutes(30)); + }; + future = scheduler.scheduleAtFixedRate(renewLockTask, 0, 1, TimeUnit.MINUTES); + + // 处理所有数据 + List fileNameList = new ArrayList<>(); + + if (!context.getAllChangedData().isEmpty()) { + fileNameList.add("Changed_" + context.getShopId() + "_0.xlsx"); + ExcelFileHandlerUtil.handleExport( + context.getAllChangedData(), + UrlUtil.getUrl(), + "Changed", + context.getShopId().toString(), + ZhishuShopGoodsRequest.class + ); + } + + if (!context.getAllNewData().isEmpty()) { + fileNameList.add("New_" + context.getShopId() + "_0.xlsx"); + ExcelFileHandlerUtil.handleExport( + context.getAllNewData(), + UrlUtil.getUrl(), + "New", + context.getShopId().toString(), + ZhishuShopGoodsRequest.class + ); + } + + // 更新同步时间 + RedisUtils.setCacheObject("lastGoodsSynTime_" + context.getShopId(), context.getCurrentDateTime()); + + if (!context.getAllNewData().isEmpty() || !context.getAllChangedData().isEmpty()) { + // 查询店铺名称 + ShopVo shop = shopService.queryById(context.getShopId()); + + // 创建任务 + TaskBo taskBo = new TaskBo(); + taskBo.setTaskType(TaskTypeEnum.SYNC_GOODS_KFZ.getCode()); + taskBo.setShopIds(context.getShopId().toString()); + taskBo.setShopNames(shop.getShopName()); + taskBo.setFileName(String.join("/", fileNameList)); + taskBo.setDataNum((long) (context.getAllNewData().size() + context.getAllChangedData().size())); + taskBo.setTaskStatus("0"); + taskBo.setStatus("0"); + taskBo.setCreateBy(context.getUserId()); + taskServiceImpl.insertByBo(taskBo); + } + + // 发送通知 + scheduledExecutorService.schedule(() -> { + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("已拉取到商品数据总计:" + + (context.getAllNewData().size() + context.getAllChangedData().size()) + + "条,新增:" + context.getAllNewData().size() + + "条新数据,更新:" + context.getAllChangedData().size() + "条数据"); + dto.setUserIds(List.of(context.getUserId())); + SseMessageUtils.publishMessage(dto); + }, 5, TimeUnit.SECONDS); + } finally { + // 清理资源 + if (future != null) { + future.cancel(false); + } + if (scheduler != null) { + scheduler.shutdownNow(); + } + cleanupBatchProcessing(context); + } + } + + /** + * 清理批次处理资源 + */ + private void cleanupBatchProcessing(BatchProcessingContext context) { + if (context != null) { + // 释放锁 + RedisUtils.deleteObject(context.getLockKey()); + // 移除上下文 + batchContextMap.remove(context.getShopId()); + } + } + + /** + * 根据用户选择货号规则将商品存入数据库 + * + * @param saveGoodsVo + */ + @Async + @Override + public void saveShopGoodsInDb(SaveGoodsVo saveGoodsVo) { + System.out.println("开始根据用户选择货号规则将商品存入数据库"); + System.out.println("saveShopGoodsInDb:request-" + JSONObject.toJSONString(saveGoodsVo)); + // 指定读取需要新增的商品Excel文件路径 + String newGoodsExcelPath = Paths.get(UrlUtil.getUrl(), "New_" + saveGoodsVo.getShopId() + "_0.xlsx").toString(); + // 指定读取需要修改的商品Excel文件路径 + String updateGoodsExcelPath = Paths.get(UrlUtil.getUrl(), "Changed_" + saveGoodsVo.getShopId() + "_0.xlsx").toString(); + // 初期化任务对象 + TaskBo taskBo = new TaskBo(); + taskBo.setId(saveGoodsVo.getTaskId()); + + // 尝试获取锁 + String lockKey = "ReadExcelKey_" + saveGoodsVo.getShopId(); + String lockValue = "ReadExcelLock"; + Duration lockExpireDuration = Duration.ofMinutes(2); // 设置锁的过期时间为2分钟 + String readExcelLock = RedisUtils.getCacheObject(lockKey); + // 若获取存在说明存在读取该文件的线程,则直接返回,不进行后续操作 + if (ObjectUtil.isNotEmpty(readExcelLock)) throw new ServiceException("已在处理该文件,请勿重复操作"); + System.out.println("获取到redis锁,执行读取文件操作"); + // 若不存在,则设置锁,并执行后续操作 + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + ScheduledExecutorService scheduler = null; + ScheduledFuture future = null; + try { + scheduler = Executors.newScheduledThreadPool(1); + // 设置一个定时任务来不断延长锁的过期时间 + Runnable renewLockTask = () -> { + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + System.out.println("Redis锁过期时间已更新"); + }; + // 启动定时任务 + future = scheduler.scheduleAtFixedRate(renewLockTask, 0, INITIAL_DELAY_AND_PERIOD, TimeUnit.SECONDS); + + // 修改任务执行状态为执行中 + taskBo.setTaskStatus(TaskStatusTypeEnum.EXECUTING.getCode()); + taskServiceImpl.updateByBo(taskBo); + + // 分别定义两个列表,用于存储读取的数据 + List newDataList = new ArrayList<>(); + List updateDataList = new ArrayList<>(); + try { + System.out.println("尝试读取新增的数据:path-" + newGoodsExcelPath); + // 尝试读取新增的数据 + newDataList = EasyExcel.read(newGoodsExcelPath) + .head(ZhishuShopGoodsRequest.class) + .sheet("New_" + saveGoodsVo.getShopId() + "_0") + .doReadSync(); + } catch (Exception e) { + // 读取不到说明没有对应需要处理的数据,不做处理,仅记录日志以防其他未知原因导致,不抛出异常 + System.out.println("未能读取新增数据文件: " + newGoodsExcelPath + "原因:{}" + e.getMessage()); + } + try { + System.out.println("尝试读取更新的数据:path-" + newGoodsExcelPath); + // 尝试读取更新的数据 + updateDataList = EasyExcel.read(updateGoodsExcelPath) + .head(ZhishuShopGoodsRequest.class) + .sheet("Changed_" + saveGoodsVo.getShopId() + "_0") + .doReadSync(); + } catch (Exception e) { + // 读取不到说明没有对应需要处理的数据,不做处理,仅记录日志以防其他未知原因导致,不抛出异常 + System.out.println("未能读取新增数据文件: " + updateGoodsExcelPath + "原因:{}" + e.getMessage()); + } + + // 查询当前任务状态,若任务状态为暂停/停止,说明存在未执行完数据,读取txt文件 + TaskVo taskVo = taskService.queryById(saveGoodsVo.getTaskId()); + AtomicInteger successMarkI; + AtomicInteger failMarkI; + if (TaskStatusTypeEnum.EXECUTE_PAUSE_STOP.getCode().equals(taskVo.getTaskStatus())) { + // 初始化markI计数器用来统计处理成功的数据条数,AtomicInteger线程安全 + successMarkI = new AtomicInteger(taskVo.getDataNum().intValue() - (newDataList.size() + updateDataList.size())); + // 初始化markI计数器用来统计处理失败的数据条数,AtomicInteger线程安全 + failMarkI = new AtomicInteger(newDataList.size() + updateDataList.size()); + } else if (TaskStatusTypeEnum.EXECUTED.getCode().equals(taskVo.getTaskStatus())) { + return; + } else { + // 初始化markI计数器用来统计处理成功的数据条数,AtomicInteger线程安全 + successMarkI = new AtomicInteger(0); + // 初始化markI计数器用来统计处理失败的数据条数,AtomicInteger线程安全 + failMarkI = new AtomicInteger(0); + } + + // 将新增的和更新的数据合并到一起并写入文件 + writeAllDateToExcel(newDataList, updateDataList, saveGoodsVo.getShopId(), saveGoodsVo.getTaskId(), ZhishuShopGoodsRequest.class); + + // 总计读取数据条数 + Integer totalNum = newDataList.size() + updateDataList.size(); + // 根据商店id查询出对应的userId + ShopVo shopVo = shopService.queryById(saveGoodsVo.getShopId()); + System.out.println("根据商店id查询出对应的userId:" + JSONObject.toJSONString(shopVo)); + Long userId = shopVo.getCreateBy(); + + // 查询出该用户下所有货架 + List freightGoodsCountList = baseMapper.selectFreightGoodsNumber(userId, saveGoodsVo.getFreightIdList()); + if (ObjectUtil.isEmpty(freightGoodsCountList)) + throw new ServiceException("该用户下或没有三级货区,请检查后重试"); + + // 对新增的数据进行处理 + List failedInsertedList = new CopyOnWriteArrayList<>(); + List successInsertedList = new CopyOnWriteArrayList<>(); + if (ObjectUtil.isNotEmpty(newDataList)) { + // 将 newDataList 分成 8 个批次 + int totalSize = newDataList.size(); + int batchSize = (int) Math.ceil((double) totalSize / 8); + List> partitionedData = new ArrayList<>(); + for (int i = 0; i < totalSize; i += batchSize) { + int end = Math.min(i + batchSize, totalSize); + partitionedData.add(newDataList.subList(i, end)); + } + // 使用 CopyOnWriteArrayList 确保线程安全 + CountDownLatch latch = new CountDownLatch(partitionedData.size()); + long newTime = System.currentTimeMillis(); + + for (List subList : partitionedData) { + ThreadPoolUtils.execute(() -> { + try { + for (ZhishuShopGoodsRequest newData : subList) { + // TODO 新增数据处理逻辑 + try { + AtomicBoolean insertNewDataStatus = new AtomicBoolean(true); + zhishuShopGoodsAopService.insertNewDataList(newData, userId, freightGoodsCountList, saveGoodsVo, failedInsertedList, successInsertedList, successMarkI, failMarkI, shopVo, totalNum, newTime, insertNewDataStatus, taskVo.getTaskType()); + } catch (Exception e) { + log.error(e.getMessage()); + failedInsertedList.add(newData); + } + // 将这条数据写入到异常记录中,后去完成后会删除 + ExcelFileHandlerUtil.syncWriteRecord(UrlUtil.getUrl(), "Error_New_" + saveGoodsVo.getShopId() + "_" + Thread.currentThread().getId(), List.of(newData), "0"); + } + } finally { + latch.countDown(); + } + }); + } + try { + latch.await(); // 等待所有线程完成 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("线程等待中断", e); + } + // 数据处理完毕删除异常文件 + ExcelFileHandlerUtil.deleteFilesByPrefix(UrlUtil.getUrl(), "Error_New_" + saveGoodsVo.getShopId()); + // 将这条数据写入到历史版本中 + if (!successInsertedList.isEmpty()) { + ExcelFileHandlerUtil.handleExport(successInsertedList, UrlUtil.getUrl(), "New", saveGoodsVo.getShopId().toString() + "_" + newTime, ZhishuShopGoodsRequest.class); + } + // 处理失败数据和文件删除 + if (!failedInsertedList.isEmpty()) { + ExcelFileHandlerUtil.handleExport(failedInsertedList, UrlUtil.getUrl(), "New", saveGoodsVo.getShopId().toString(), ZhishuShopGoodsRequest.class); + } else { + FileUtil.fileDelete(newGoodsExcelPath); + } + } + // 对更新的数据进行处理 + List failedUpdateList = new CopyOnWriteArrayList<>(); + List successUpdateList = new CopyOnWriteArrayList<>(); + if (ObjectUtil.isNotEmpty(updateDataList)) { + // 将 updateDataList 分成 8 个批次 + int totalSize = updateDataList.size(); + int batchSize = (int) Math.ceil((double) totalSize / 8); + List> partitionedData = new ArrayList<>(); + for (int i = 0; i < totalSize; i += batchSize) { + int end = Math.min(i + batchSize, totalSize); + partitionedData.add(updateDataList.subList(i, end)); + } + CountDownLatch latch = new CountDownLatch(partitionedData.size()); + long updateTime = System.currentTimeMillis(); + for (List subList : partitionedData) { + ThreadPoolUtils.execute(() -> { + try { + for (ZhishuShopGoodsRequest changedData : subList) { + // TODO 更新数据处理逻辑 + try { + AtomicBoolean updateChangedDataStatus = new AtomicBoolean(true); + zhishuShopGoodsAopService.updateChangedDataList(changedData, userId, freightGoodsCountList, saveGoodsVo, failedUpdateList, successUpdateList, successMarkI, failMarkI, shopVo, totalNum, updateTime, updateChangedDataStatus); + } catch (Exception e) { + log.error(e.getMessage()); + failedUpdateList.add(changedData); + } + // 将这条数据写入到异常记录中,后去完成后会删除 + ExcelFileHandlerUtil.syncWriteRecord(UrlUtil.getUrl(), "Error_Changed_" + saveGoodsVo.getShopId() + "_" + Thread.currentThread().getId(), List.of(changedData), "0"); + } + } finally { + latch.countDown(); // 当前线程完成 + } + }); + } + try { + latch.await(); // 等待所有线程完成 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("线程等待中断", e); + } + // 数据处理完毕删除异常文件 + ExcelFileHandlerUtil.deleteFilesByPrefix(UrlUtil.getUrl(), "Error_Changed_" + saveGoodsVo.getShopId()); + // 将这条数据写入到历史版本中 + if (!successUpdateList.isEmpty()) { + ExcelFileHandlerUtil.handleExport(successUpdateList, UrlUtil.getUrl(), "Changed", + saveGoodsVo.getShopId().toString() + "_" + updateTime, ZhishuShopGoodsRequest.class); + } + // 处理失败数据和文件删除 + if (!failedUpdateList.isEmpty()) { + ExcelFileHandlerUtil.handleExport(failedUpdateList, UrlUtil.getUrl(), "Changed", saveGoodsVo.getShopId().toString(), ZhishuShopGoodsRequest.class); + } else { + FileUtil.fileDelete(updateGoodsExcelPath); + } + } + + // 数据全部正常执行完毕,修改任务状态为已完成 + if (ObjectUtil.isNotEmpty(failedInsertedList) || ObjectUtil.isNotEmpty(failedUpdateList)) { + // 若存在失败数据则修改任务状态为暂停/停止 + taskBo.setTaskStatus(TaskStatusTypeEnum.EXECUTE_PAUSE_STOP.getCode()); + } else { + // 若不存在失败数据则修改任务状态为已完成 + taskBo.setTaskStatus(TaskStatusTypeEnum.EXECUTED.getCode()); + } + taskServiceImpl.updateByBo(taskBo); + + // 发送消息给前端告知拉取下来的数据已下载完毕 + scheduledExecutorService.schedule(() -> { + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("成功新增:" + successInsertedList.size() + "条,新增失败:" + failedInsertedList.size() + "条,更新成功:" + successUpdateList.size() + "条,更新失败:" + failedUpdateList.size() + "条"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 5, TimeUnit.SECONDS); + + } catch (Exception e) { + // 若执行中出现异常,修改任务执行结束 + taskBo.setTaskStatus(TaskStatusTypeEnum.EXECUTE_PAUSE_STOP.getCode()); + taskServiceImpl.updateByBo(taskBo); + // 捕获其他未知异常 + log.error("读取商品导入Excel过程中发生异常: {}", e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } finally { + // 取消定时任务 + if (future != null) { + future.cancel(false); + } + // 关闭线程池 + if (scheduler != null) { + scheduler.shutdownNow(); + } + // 确保释放锁 + RedisUtils.deleteObject(lockKey); + System.out.println("已释放redis锁"); + } + } + + + /** + * 将全部数据写入到Excel中 + * + * @param newDataList + * @param updateDataList + * @param shopId + * @param taskId + * @param clazz + * @param + */ + private void writeAllDateToExcel(List newDataList, List updateDataList, Long shopId, Long taskId, Class clazz) { + List allDataList = new ArrayList<>(); + allDataList.addAll(newDataList); + allDataList.addAll(updateDataList); + EasyExcelUtil.exportToExcel(UrlUtil.getUrl(), taskId + "" + shopId + ".xlsx", allDataList, "0", clazz); + } + + @Override + public ProductForm repeatBook(ProductForm form) { + Long userId = sysUserMapper.selectUserIdByNameAndPassWord(form.getPhoneNumber()); + Long depotId = TDepotMapper.getDepotIdByName(form.getDepotName(), userId); + Long shelvesId = TShelvesMapper.getShelvesIdByName(form.getShelvesName(), depotId); + Long freightId = TFreightMapper.getFreightIdByName(form.getFreightName(), shelvesId); + // 获取品相数值 + String conCode = null; + String chineseName = form.getConditionCode(); + String letterCode = null; + if (CnumberUtils.CHINESE_TO_CODE_MAP.containsKey(chineseName)) { + // String letterCode = CnumberUtils.CHINESE_TO_CODE_MAP.get(chineseName); + letterCode = CnumberUtils.CHINESE_TO_CODE_MAP.get(chineseName); + for (Map.Entry entry : CnumberUtils.CODE_MAP.entrySet()) { + if (entry.getValue().equals(letterCode)) { + conCode = String.valueOf(entry.getKey()); + break; + } + } + } + if (conCode == null) { + throw new IllegalArgumentException("无效的中文品相名称: " + chineseName); + } + String artNo = cnumberUtils.getArtNo(Double.valueOf(conCode), userId, form.getBarcode(), depotId, shelvesId, freightId, null); + System.out.println("重复商品货号为:" + artNo); + // 查询对应的图片 + + Long count = baseMapper.selectArtNoCount1(artNo, form.getPrice(), letterCode); + System.out.println("重复商品数量为:" + count); + String shopId = baseMapper.selectArtNoCount(artNo, form.getPrice()); + System.out.println("重复商品ID为:" + shopId); + String image = baseMapper.queryByShopId(shopId); + System.out.println("重复商品图片为:" + image); + ProductForm productForm = new ProductForm(); + productForm.setImage(image); + productForm.setArtNo(artNo); + productForm.setCount(count); + productForm.setName(form.getName()); + System.out.println("==============" + productForm); + return productForm; + } + + /** + * 根据库存操作类型操作库存并同步平台库存 + * + * @param operationType + * @param shopGoodsPublishedVo + * @param count + * @return + */ + @Override + public Boolean operatingGoodsInventory(Long shopId, Integer shopType, Integer operationType, ShopGoodsPublishedVo shopGoodsPublishedVo, Integer count, String orderSn) { + Integer type; + if (operationType == 1) { + // 退单添加 + type = 3; + } else { + // 订单减扣 + type = 2; + } + Boolean result = operatingInventory(operationType, shopGoodsPublishedVo.getShopGoodsId(), count, type, orderSn, null); + Assert.isTrue(result, "操作redis/数据库库存失败"); + // 根据商品Id查询出拥有同商品的店铺Id和平台商品Id + List shopGoodsPublishedVoList = shopGoodsPublishedService.queryByShopGoodsId(shopGoodsPublishedVo.getShopGoodsId()); + + // 若是订单扣减或是孔夫子平台操作则去除掉自己 + if (type == 2 || shopType == 2) { + // 过滤掉自己的 + shopGoodsPublishedVoList = shopGoodsPublishedVoList.stream().filter(o -> !o.getShopId().equals(shopId.toString())).toList(); + } + System.out.println("shopGoodsPublishedVoList:" + shopGoodsPublishedVoList+"zhuxiaodong1028"); + + // 循环根据店铺Id查询出店铺信息 + for (ShopGoodsPublishedVo goodsPublishedVo : shopGoodsPublishedVoList) { + // 根据店铺Id查询出店铺信息 + ShopVo shop = shopService.queryById(Long.valueOf(goodsPublishedVo.getShopId())); + if (shop == null){ + shopGoodsPublishedService.deleteWithValidByIds(List.of(goodsPublishedVo.getId()), true); + continue; + } + // 根据店铺类型分别推送平台同步库存 + InventorySynchronizedStrategy strategy = InventorySynchronizedStrategyFactory.getStrategy(shop.getShopType()); + Objects.requireNonNull(strategy).inventorySynchronized(shop, goodsPublishedVo,type); + } + return true; + } + + @Override + public Boolean goofishoperatingGoodsInventory(Long shopId, Integer shopType, Integer operationType, ZhishuShopGoodsVo zhishuShopGoodsVo, Integer count, String orderSn) { + Integer type; + if (operationType == 1) { + // 退单添加 + type = 3; + } else { + // 订单减扣 + type = 2; + } + Boolean result = operatingInventory(operationType, zhishuShopGoodsVo.getId(), count, type, orderSn, null); + Assert.isTrue(result, "操作redis/数据库库存失败"); + // 根据商品Id查询出拥有同商品的店铺Id和平台商品Id + List shopGoodsPublishedVoList = shopGoodsPublishedService.queryByShopGoodsId(zhishuShopGoodsVo.getId()); + + // 若是订单扣减或是孔夫子平台操作则去除掉自己 + if (type == 2 || shopType == 2) { + // 过滤掉自己的 + shopGoodsPublishedVoList = shopGoodsPublishedVoList.stream().filter(o -> !o.getShopId().equals(shopId.toString())).toList(); + } + System.out.println("shopGoodsPublishedVoList:" + shopGoodsPublishedVoList+"zhuxiaodong1028"); + + // 循环根据店铺Id查询出店铺信息 + for (ShopGoodsPublishedVo goodsPublishedVo : shopGoodsPublishedVoList) { + // 根据店铺Id查询出店铺信息 + ShopVo shop = shopService.queryById(Long.valueOf(goodsPublishedVo.getShopId())); + if (shop == null){ + shopGoodsPublishedService.deleteWithValidByIds(List.of(goodsPublishedVo.getId()), true); + continue; + } + // 根据店铺类型分别推送平台同步库存 + InventorySynchronizedStrategy strategy = InventorySynchronizedStrategyFactory.getStrategy(shop.getShopType()); + Objects.requireNonNull(strategy).inventorySynchronized(shop, goodsPublishedVo,type); + } + return true; + } + + /** + * Excel文件处理 + * + * @param filePath + */ + private void fileProcessing(String filePath) { + String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + Path source = Paths.get(filePath); + Path target = Paths.get(UrlUtil.getUrl(), source.getFileName().toString().replace(".xlsx", "_" + timestamp + ".xlsx")); + try { + // 文件移动 + Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + log.error("文件移动失败: {}", e.getMessage()); + } + } + + /** + * 货号处理 + * + * @param saveArtNoRule 保存商品规则:0-不修改直接保存货号 1-按照系统默认规则保存货号 + * @param conditionCode 品相码(如9.5/8.0) + * @param userId 用户Id + * @param isbn ISBN + * @param oldArtNo 原始货号 + * @param freightGoodsCountVo 货区信息 + * @return + */ + @Override + public String artNoProcessing(Integer saveArtNoRule, Long userId, String isbn, String oldArtNo, double conditionCode, FreightGoodsCountVo freightGoodsCountVo) { + // 若保存商品规则:1-按照系统默认规则保存货号 + if (saveArtNoRule == 1) { + // 若传入货号为null或空字符串"" + return cnumberUtils.getArtNo(conditionCode, userId, isbn, freightGoodsCountVo.getDepotId(), freightGoodsCountVo.getShelvesId(), freightGoodsCountVo.getFreightId(), "A"); + } + // 若保存商品规则:0-不修改直接保存货号 ,则不做处理直接返回原本的货号 + // 或其他暂时未知情况货号规则,暂时先返回原本货号 + return oldArtNo; + } + + + /** + * 随机修改孔夫子货号(仅测试使用) + */ + @Override + public void randomUpdateArtNo(Long userId, Long shopId) { + List list = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ZhishuShopGoods::getUserId, userId) + .list(); + for (ZhishuShopGoods zhishuShopGoods : list) { + UpdateArtNoRequest request = new UpdateArtNoRequest(); + request.setShopId(shopId); + request.setProductId(Long.valueOf(zhishuShopGoods.getProductId())); + request.setArtNo(generateRandomString()); + try { + kfzClient.updateArtNo(UrlUtil.getKfzServiceUrl(), request); + } catch (Exception e) { + log.error("同步货号失败:{}", e.getMessage()); + } + } + + } + + @Override + public void goodsAdd(Map map) { + // 获取用户系统库数据 + Long userId; + if (map.get("userId") != null && StringUtils.isNotEmpty(map.get("userId").toString())) { + userId = Long.parseLong(map.get("userId").toString()); + } else { + userId = LoginHelper.getUserId(); + } + // 店铺ids + List shopIdList = (List) map.get("shopIds"); + // 商品信息download + List bookList = map.get("bookList") == null ? new ArrayList<>() : (List) map.get("bookList"); + + for (String shopId : shopIdList) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + if (shopService.checkUsageCount(shopVo) == 0){ + // 无可用额度 + continue; + } + Map createMap = new HashMap(); + createMap.put("shop_id",shopVo.getId().toString()); + createMap.put("shop_type",shopVo.getShopType()); + createMap.put("task_count",bookList.size()+""); + createMap.put("task_type","8"); + + // 图片类型 1 仅官图 2 仅实拍图 11 优先实拍图 12 优先官图 + String imageSelect = map.get("imageSelect").toString(); + // 对应 1 仅官图 2 仅实拍图 3 优先官图 4 优先实拍图 + switch (imageSelect){ + case "1","2":createMap.put("img_type",imageSelect);break; + case "3":createMap.put("img_type","2");break; + case "12":createMap.put("img_type","3");break; + case "11":createMap.put("img_type","4");break; + } + + String createResStr = InterfaceUtils.postFormWithSign(UrlUtil.getNewTaskUrl(),"/task/create",createMap); + map.put("createResStr",createResStr); + + + + // 执行线程 + ShopGoodsTaskRunnable shopGoodsTaskRunnable = new ShopGoodsTaskRunnable(this, map, userId,shopVo); + Thread thread = new Thread(shopGoodsTaskRunnable, "yxy-goodsAdd"); + thread.start(); + + } + + } + + @Override + public void goodsAutoAdd(Map map) { + // 获取用户系统库数据 + Long userId; + if (map.get("userId") != null && StringUtils.isNotEmpty(map.get("userId").toString())) { + userId = Long.parseLong(map.get("userId").toString()); + } else { + userId = LoginHelper.getUserId(); + } + // 店铺ids + List shopIdList = (List) map.get("shopIds"); + // 商品信息 + List bookList = (List) map.get("bookList"); + + String shopIds = ""; + String shopNames = ""; + String isbn = bookList.get(0).get(1).toString(); + String bookName = bookList.get(0).get(2).toString(); + String artNo = bookList.get(0).get(6) == null ? "" : bookList.get(0).get(6).toString(); + + for (String shopId : shopIdList) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + if (shopNames.equals("")) { + shopIds = shopId; + shopNames = shopVo.getShopName(); + } else { + shopIds = shopIds + "," + shopId; + shopNames = shopNames + "," + shopVo.getShopName(); + } + } + TaskBo taskBo = new TaskBo(); + // 存储任务信息 + taskBo.setTaskType("1"); + taskBo.setFileName("小程序-"+bookName+"-"+isbn+"-"+artNo); + taskBo.setShopIds(shopIds); + taskBo.setShopNames(shopNames); + taskBo.setDataNum(Long.parseLong(bookList.size() + "")); + taskBo.setTaskStatus("0"); + taskBo.setCreateBy(userId); + taskService.insertByBo(taskBo); + goodsAdd2(map, taskBo, userId); + } + + public void goodsAdd2(Map map, TaskBo taskBo, Long userId) { + + String pati = map.get("X-PDD-Pati") == null ? "" : map.get("X-PDD-Pati").toString(); + + // 线程锁对象初始化 + lockMap.put(String.valueOf(Thread.currentThread().getId()), new Object()); + runMap.put(String.valueOf(Thread.currentThread().getId()), false); + + String mark = map.get("mark") != null ? map.get("mark").toString() : ""; + //分类 + String categoryId = map.get("categoryId") != null ? map.get("categoryId").toString() : ""; + + // 店铺ids + List shopIdList = (List) map.get("shopIds"); + // 商品信息 + List bookList = (List) map.get("bookList"); + + for (String shopId : shopIdList) { + ShopVo shopVo = shopService.queryById(Long.parseLong(shopId)); + //如果是孔夫子店铺则等待十秒钟 + if(shopVo.getShopType().equals("2")){ + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + System.out.println("睡眠失败"); + } + } + for (List list : bookList) { + taskWait(String.valueOf(Thread.currentThread().getId())); + + String goodsId = list.get(0).toString(); + String isbn = list.get(1).toString(); + String bookName = list.get(2).toString(); + String price = new BigDecimal(list.get(3).toString()).divide(new BigDecimal(100)).toString(); + + String stock = list.get(4).toString(); + // 品相 + String conditionCode = list.get(5) == null ? "" : list.get(5).toString(); + String artNo = list.get(6) == null ? "" : list.get(6).toString(); + // 运费 + String templateMinPrice = list.get(7) == null ? "" : list.get(7).toString(); + + //先获取redis是否存在该商品的自拍图 + Object zhishuShopImagesVoObj = RedisUtils.getSecondCacheObject(goodsId+"-img"); + if(zhishuShopImagesVoObj == null){ + List zhishuShopImagesVoList = zhishuShopImagesService.selectShopImagesByShopId(goodsId); + if(!zhishuShopImagesVoList.isEmpty()){ + RedisUtils.setSecondCacheObject(goodsId+"-img",JsonUtil.transferToJson(zhishuShopImagesVoList)); + } + } + + Map goMap = new HashMap(); + goMap.put("priority", "1"); + goMap.put("retry_count", "3"); + goMap.put("isbn", isbn); + goMap.put("totalPrice", price); + goMap.put("stock", stock); + goMap.put("bookName", bookName); + goMap.put("code", ""); + goMap.put("imgBigUrl", ""); + goMap.put("artNo", artNo); + goMap.put("taskId", taskBo.getId().toString()); + goMap.put("shopId", shopId); + goMap.put("imageSelect", "12"); + goMap.put("goodsId", goodsId); + goMap.put("conditionCode", conditionCode); + goMap.put("mark", map.get("mark")); + goMap.put("templateMinPrice", templateMinPrice); + goMap.put("categoryId", categoryId); + + System.out.println("task_verifyPricePublishGoods接口"+goMap); + + try { + InterfaceUtils.postForm("http://146.56.192.164:10098", "/api/task_verifyPricePublishGoods", goMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + lockMap.remove(String.valueOf(Thread.currentThread().getId())); + runMap.remove(String.valueOf(Thread.currentThread().getId())); + } + + + @Override + public void goodsAdd(Map map, Long userId,ShopVo shopVo) { + // 获取余额 + Long usageCount = shopService.checkUsageCount(shopVo); + + // 商品信息download + List bookList = map.get("bookList") == null ? new ArrayList<>() : (List) map.get("bookList"); + ZhishuShopGoodsBo bo = map.get("params") != null ? MapUtils.convertToObject((Map) map.get("params"),ZhishuShopGoodsBo.class) : null; + if(bo == null){ + bo = new ZhishuShopGoodsBo(); + bo.setIsQueryAllGoods(1); + } + bo.setUserId(userId); + int pageNum = 1,pageSize = 1000; + //查询全部自营商品数据一键发布 + PageQuery pageQuery = new PageQuery(pageSize,pageNum); + String createResStr = map.get("createResStr").toString(); + Map createResMap = JsonUtil.transferToObj(createResStr,Map.class); + String taskId = createResMap.get("data").toString(); + List> bodyList = new ArrayList<>(); + if (usageCount > 0){ + if(bookList.isEmpty()){ + //一键发布 + while (true){ + pageQuery.setPageNum(pageNum); + pageQuery.setPageSize(pageSize); + Page pageList = queryPageList2(bo, pageQuery); + + List zhishuShopGoodsVoList = pageList.getRecords(); + // 提取列表中的全部商品id + List shopGoodsIds = zhishuShopGoodsVoList.stream() + .map(vo -> Long.valueOf(vo.getId())) // String转Long + .collect(Collectors.toList()); + // 查询是否存在商品记录 + List result = shopGoodsPublishedService.selectByShopGoodsIds(shopGoodsIds,shopVo.getId()); + // 提取查询到的已存在发布记录的商品id + Set publishedGoodsIds = result.stream() + .map(vo -> Long.valueOf(vo.getShopGoodsId())) + .collect(Collectors.toSet()); + + + // 过滤掉已发布的商品(即不在publishedGoodsIds中的保留) + List filteredList = zhishuShopGoodsVoList.stream() + .filter(vo -> !publishedGoodsIds.contains(Long.valueOf(vo.getId()))) + .collect(Collectors.toList()); + + // 替换原列表(如果需要) + zhishuShopGoodsVoList = filteredList; + + for (ZhishuShopGoodsVo zhishuShopGoodsVo : zhishuShopGoodsVoList){ + String goodsId = zhishuShopGoodsVo.getId(); + String isbn = zhishuShopGoodsVo.getIsbn(); + String bookName = zhishuShopGoodsVo.getGoodsName(); + String price = zhishuShopGoodsVo.getPrice().divide(new BigDecimal(100)).toString(); + String stock = zhishuShopGoodsVo.getInventory().toString(); + // 品相 + String conditionCode = StringUtils.isEmpty(zhishuShopGoodsVo.getConditionCode()) ? "" : zhishuShopGoodsVo.getConditionCode(); + String artNo = StringUtils.isEmpty(zhishuShopGoodsVo.getArtNo()) ? "" : zhishuShopGoodsVo.getArtNo(); + // 运费 + String templateMinPrice = zhishuShopGoodsVo.getTemplateMinPrice() == null ? "" : zhishuShopGoodsVo.getTemplateMinPrice().toString(); + List zhishuShopImagesVoList = zhishuShopImagesService.selectShopImagesByShopId(goodsId); + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",isbn); + bookInfo.put("book_name",bookName); + if(!zhishuShopImagesVoList.isEmpty()){ + JSONObject imageObject = new JSONObject(); + List carouselUrlArray = new ArrayList<>(); + for (ZhishuShopImagesVo zhishuShopImagesVo : zhishuShopImagesVoList){ + String path = zhishuShopImagesVo.getPath(); + // 只有拼多多店铺并且是孔夫子图片上传图片 + if(path.contains("www0.kfzimg.com") && shopVo.getShopType().equals("1")){ + path = path.replace("_s","_n"); + Map imgMap = new HashMap(); + imgMap.put("shop_id",shopVo.getId().toString()); + imgMap.put("img_url",path); + String pddImgData = InterfaceUtils.postFormWithSign(UrlUtil.getNewTaskUrl(),"/uploadImg/ImgUploadToPdd",imgMap); + Map pddImgMap = JsonUtil.transferToObj(pddImgData,Map.class); + if (pddImgMap.get("code").equals("200")){ + path = pddImgMap.get("data").toString(); + } + } + carouselUrlArray.add(path); + } + imageObject.put("carousel_url_array",carouselUrlArray); + bookInfo.put("image_object",imageObject); + } + body.put("book_info",bookInfo); + Map detail = new HashMap(); + BigDecimal totalPrice = new BigDecimal(price).multiply(new BigDecimal(100)); + detail.put("price",totalPrice.longValue()); + detail.put("stock",Long.parseLong(stock)); + // 商品编码 + detail.put("out_goods_id",isbn); + // 规格编码 + detail.put("sku_code",artNo); + // 运费 + detail.put("shipping_cost",new BigDecimal(templateMinPrice).multiply(new BigDecimal(100)).longValue()); + // 品相 + detail.put("condition",Integer.parseInt(CnumberUtils.getQualityNum(conditionCode))); + // 上下架状态 + detail.put("is_onsale",0); + //商品id + JSONObject json = new JSONObject(); + json.put("erp_goods_id",goodsId); + json.put("user_id",userId+""); + detail.put("msg",json.toString()); + body.put("detail",detail); + bodyList.add(body); + if (bodyList.size() % 1000 == 0){ + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId, bodyList); + System.out.println("新发布任务发布"+bodyList.size()+"条"); + // 清空列表,准备下一批 + bodyList.clear(); + } + } + if (!bodyList.isEmpty()) { + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId, bodyList); + System.out.println("新发布任务发布"+bodyList.size()+"条"); + // 清空列表,准备下一批 + bodyList.clear(); + } + pageNum++; + + usageCount--; + //获取总数 + if((pageList.getTotal() / 1000 + 1) < pageNum || pageList.getRecords().isEmpty() || usageCount == 0){ + break; + } + } + }else{ + + // 提取列表中的全部商品id + List shopGoodsIds = bookList.stream() + .map(vo -> Long.valueOf(vo.get(0).toString())) // String转Long + .collect(Collectors.toList()); + // 查询是否存在商品记录 + List result = shopGoodsPublishedService.selectByShopGoodsIds(shopGoodsIds,shopVo.getId()); + // 提取查询到的已存在发布记录的商品id + Set publishedGoodsIds = result.stream() + .map(vo -> Long.valueOf(vo.getShopGoodsId())) + .collect(Collectors.toSet()); + + // 过滤掉已发布的商品(即不在publishedGoodsIds中的保留) + List filteredList = bookList.stream() + .filter(vo -> !publishedGoodsIds.contains(Long.valueOf(vo.get(0).toString()))) + .collect(Collectors.toList()); + + // 替换原列表(如果需要) + bookList = filteredList; + + for (List list : bookList) { + String goodsId = list.get(0).toString(); + String isbn = list.get(1).toString(); + String bookName = list.get(2).toString(); + String price = new BigDecimal(list.get(3).toString()).divide(new BigDecimal(100)).toString(); + String stock = list.get(4).toString(); + // 品相 + String conditionCode = list.get(5) == null ? "" : list.get(5).toString(); + String artNo = list.get(6) == null ? "" : list.get(6).toString(); + // 运费 + String templateMinPrice = list.get(7) == null ? "" : list.get(7).toString(); + List zhishuShopImagesVoList = zhishuShopImagesService.selectShopImagesByShopId(goodsId); + Map body = new HashMap(); + Map bookInfo = new HashMap(); + bookInfo.put("isbn",isbn); + bookInfo.put("book_name",bookName); + if(!zhishuShopImagesVoList.isEmpty()){ + JSONObject imageObject = new JSONObject(); + List carouselUrlArray = new ArrayList<>(); + for (ZhishuShopImagesVo zhishuShopImagesVo : zhishuShopImagesVoList){ + String path = zhishuShopImagesVo.getPath(); + if(path.contains("www0.kfzimg.com")){ + path = path.replace("_s","_n"); + Map imgMap = new HashMap(); + imgMap.put("shop_id",shopVo.getId().toString()); + imgMap.put("img_url",path); + String pddImgData = InterfaceUtils.postFormWithSign(UrlUtil.getNewTaskUrl(),"/uploadImg/ImgUploadToPdd",imgMap); + Map pddImgMap = JsonUtil.transferToObj(pddImgData,Map.class); + if (pddImgMap.get("code").equals("200")){ + path = pddImgMap.get("data").toString(); + } + } + carouselUrlArray.add(path); + } + imageObject.put("carousel_url_array",carouselUrlArray); + bookInfo.put("image_object",imageObject); + } + body.put("book_info",bookInfo); + Map detail = new HashMap(); + BigDecimal totalPrice = new BigDecimal(price).multiply(new BigDecimal(100)); + detail.put("price",totalPrice.longValue()); + detail.put("stock",Long.parseLong(stock)); + // 商品编码 + detail.put("out_goods_id",isbn); + // 规格编码 + detail.put("sku_code",artNo); + // 运费 + detail.put("shipping_cost",new BigDecimal(templateMinPrice).multiply(new BigDecimal(100)).longValue()); + // 品相 + detail.put("condition",Integer.parseInt(CnumberUtils.getQualityNum(conditionCode))); + // 上下架状态 + detail.put("is_onsale",0); + // erp 商品id + JSONObject json = new JSONObject(); + json.put("erp_goods_id",goodsId); + json.put("user_id",userId+""); + detail.put("msg",json.toString()); + body.put("detail",detail); + bodyList.add(body); + if (bodyList.size() % 1000 == 0){ + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId, bodyList); + System.out.println("新发布任务发布"+bodyList.size()+"条"); + // 清空列表,准备下一批 + bodyList.clear(); + } + + usageCount--; + if (usageCount == 0){ + break; + } + } + // 处理剩余数据 + if (!bodyList.isEmpty()) { + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId, bodyList); + System.out.println("新发布任务发布结束:"+bodyList.size()+"条"); + } + } + + + // 更新使用次数 + shopService.updateUsageCount(shopVo,usageCount); + } + } + + // 线程暂停 + public void taskWait(String threadId) { + if (runMap.get(threadId)) { + try { + synchronized (lockMap.get(threadId)) { + lockMap.get(threadId).wait(); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public int zanTing(String threadId) { + if (runMap.get(threadId) == null) { + return 0; + } + runMap.put(threadId, true); + return 1; + } + + @Override + public int huanXing(String threadId) { + if (lockMap.get(threadId) == null) { + return 0; + } + synchronized (lockMap.get(threadId)) { + runMap.put(threadId, false); + lockMap.get(threadId).notify(); + } + return 1; + } + + @Override + public List selectShopStockLog(String id) { + List list = baseMapper.selectStockLog(id); + try{ + if (!list.isEmpty()) { + Map params = new HashMap<>(); + params.put("jsonList",JsonUtil.transferToJson(list)); + String result = InterfaceUtils.getInterfaceGetWithParams(UrlUtil.getOrderServiceUrl(),"/api/erpGoodsOrder/handleShopStockLog",params); + list = JsonUtil.transferToObj(result,List.class); + } + } catch (Exception e){ + System.out.println("关联数据查询失败"); + } + return list; + } + + @Override + public Integer queryInventory(Long shopGoodsId) { + String inventoryKey = "zhishu_shop_goods_inventory:" + shopGoodsId; + // 获取当前库存数量 + RList inventoryList = RedisUtils.getClient().getList(inventoryKey); + int currentInventorySize = inventoryList.size(); + if (currentInventorySize == 0) { + return 0; + } else { + return currentInventorySize; + } + } + + @Override + public List getAuthorAndPublisher(String keyword, String cookies) { + // 定义两个URL + String authorUrl = "https://search.kongfz.com/pc-gw/search-web/client/pc/product/keyword/more/author/facet"; + String pressUrl = "https://search.kongfz.com/pc-gw/search-web/client/pc/product/keyword/more/press/facet"; + + // 构建请求参数 + Map params = new HashMap<>(); + params.put("keyword", keyword); + + // 存储结果的列表 + List resultList = new ArrayList<>(); + + try { + // 构建作者查询URL + StringBuilder authorUrlWithParams = new StringBuilder(authorUrl); + if (!params.isEmpty()) { + authorUrlWithParams.append("?"); + for (Map.Entry entry : params.entrySet()) { + String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8); + String encodedValue = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8); + authorUrlWithParams.append(encodedKey).append("=").append(encodedValue).append("&"); + } + authorUrlWithParams.deleteCharAt(authorUrlWithParams.length() - 1); + } + + // 构建出版社查询URL + StringBuilder pressUrlWithParams = new StringBuilder(pressUrl); + if (!params.isEmpty()) { + pressUrlWithParams.append("?"); + for (Map.Entry entry : params.entrySet()) { + String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8); + String encodedValue = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8); + pressUrlWithParams.append(encodedKey).append("=").append(encodedValue).append("&"); + } + pressUrlWithParams.deleteCharAt(pressUrlWithParams.length() - 1); + } + + // 构建HTTP客户端 + HttpClient client = HttpClient.newBuilder() + .executor(Executors.newFixedThreadPool(20)) + .connectTimeout(Duration.ofSeconds(5)) + .version(HttpClient.Version.HTTP_2) + .followRedirects(HttpClient.Redirect.NORMAL) + .proxy(ProxySelector.getDefault()) + .build(); + + // 发送作者查询请求 + HttpRequest authorRequest = HttpRequest.newBuilder() + .uri(URI.create(authorUrlWithParams.toString())) + .header("Cookie", "PHPSESSID=" + cookies) + .GET() + .build(); + + // 发送出版社查询请求 + HttpRequest pressRequest = HttpRequest.newBuilder() + .uri(URI.create(pressUrlWithParams.toString())) + .header("Cookie", "PHPSESSID=" + cookies) + .GET() + .build(); + + // 执行请求并获取响应 + HttpResponse authorResponse = client.send(authorRequest, HttpResponse.BodyHandlers.ofString()); + HttpResponse pressResponse = client.send(pressRequest, HttpResponse.BodyHandlers.ofString()); + + // 解析作者响应 + if (authorResponse.statusCode() == 200) { + JSONObject authorJson = JSON.parseObject(authorResponse.body()); + if (authorJson != null && authorJson.getJSONObject("data") != null) { + JSONArray authorLabels = authorJson.getJSONObject("data").getJSONArray("labels"); + if (authorLabels != null) { + for (int i = 0; i < authorLabels.size(); i++) { + JSONObject label = authorLabels.getJSONObject(i); + AuthorPressVo vo = new AuthorPressVo(); + vo.setAuthor(label.getString("showName")); + resultList.add(vo); + } + } + } + } + + // 解析出版社响应 + if (pressResponse.statusCode() == 200) { + JSONObject pressJson = JSON.parseObject(pressResponse.body()); + if (pressJson != null && pressJson.getJSONObject("data") != null) { + JSONArray pressLabels = pressJson.getJSONObject("data").getJSONArray("labels"); + if (pressLabels != null) { + for (int i = 0; i < pressLabels.size(); i++) { + JSONObject label = pressLabels.getJSONObject(i); + AuthorPressVo vo = new AuthorPressVo(); + vo.setPress(label.getString("showName")); + resultList.add(vo); + } + } + } + } + + } catch (Exception e) { + log.error("获取作者和出版社信息失败: {}", e.getMessage(), e); + throw new ServiceException("获取作者和出版社信息失败: " + e.getMessage()); + } + + return resultList; + } + + + @Override + public ProductSubmitResultVo submitFromCopyrightPage(ProductForm form) { + // 书名去除首位空格 + form.setName(form.getName().trim()); + String depotName = form.getDepotName(); + if (StringUtils.isBlank(depotName)) { + throw new IllegalArgumentException("仓库名称不能为空"); + } + + Long userId = sysUserMapper.selectUserIdByNameAndPassWord(form.getPhoneNumber()); + Long depotId = TDepotMapper.getDepotIdByName(depotName, userId); + Long shelvesId = TShelvesMapper.getShelvesIdByName(form.getShelvesName(), depotId); + //获取三级货区信息 + TFreightVo freightVo = TFreightMapper.selectByFreightName(form.getFreightName(), shelvesId); + Long freightId = freightVo.getId(); + // 获取品相数值 + // 中文 + String conCodeTxt = form.getConditionCode(); + // 对应的数值 + String conCode = CnumberUtils.getQualityNum(conCodeTxt); + // 对应的字母 + String letterCode = CnumberUtils.getQualityNum(conCode); + + if (conCode == null) { + throw new IllegalArgumentException("无效的中文品相名称: " + conCode); + } + // 获取货号 + String artNo = cnumberUtils.getArtNo(Double.valueOf(new BigDecimal(conCode).divide(new BigDecimal(10)).toString()), userId, form.getBarcode(), depotId, shelvesId, freightId, form.getSeries()); + // 根据isbn 货号 userid 品相 价格 查询是否存在一样的数据 + long count = baseMapper.selectCountByIsbnAndArtNoAndUserIdAndBarcode(form.getBarcode(), artNo, userId.toString(), letterCode, form.getPrice().toString()); + + ZhishuShopGoods shopGoods = new ZhishuShopGoods(); + ShopGoodIsbn shopGoodIsbn = new ShopGoodIsbn(); + + if (count == 0) { + // 添加库存表 + shopGoods.setIsbn(form.getBarcode()); + shopGoods.setGoodsName(form.getName()); + shopGoods.setUserId(userId); + shopGoods.setPrice(form.getPrice()); + shopGoods.setProductId(""); + shopGoods.setConditionCode(letterCode); + shopGoods.setDepotId(depotId); + shopGoods.setTenantId("000000"); + shopGoods.setFixPrice(form.getFixPrice()); + shopGoods.setInventory(Long.valueOf(0)); + // 根据仓库获取Id + shopGoods.setArtNo(artNo); + //新增分销字段 + shopGoods.setIsJoinDistribution(Integer.parseInt(StringUtils.isNotEmpty(freightVo.getAllowDistribution()) ? freightVo.getAllowDistribution() : "0")); + baseMapper.insert(shopGoods); + List list = form.getFiles(); + for (FilesVo filesVo : list) { + ZhishuShopImagesBo zhishuShopImagesBo = new ZhishuShopImagesBo(); + zhishuShopImagesBo.setGoodsId(shopGoods.getId()); + zhishuShopImagesBo.setPath(filesVo.getUrl()); + zhishuShopImagesService.insertByBo(zhishuShopImagesBo); + } + operatingInventory(1, shopGoods.getId(), Math.toIntExact(form.getInventory()), 4, null, userId); + shopGoods.setInventory(form.getInventory()); + if (form.getBarcode() != null && form.getBarcode().length() == 13 && !form.getBarcode().startsWith("9")) { + shopGoods.setTemplateType("2"); + } + shopGoods.setAuthor(form.getAuthor()); + shopGoods.setPublisher(form.getPublisher()); + shopGoods.setFormat(form.getFormat()); + shopGoods.setPrintTime(form.getPrintTime()); + shopGoods.setWordage(form.getWordage()); + shopGoods.setGoodUnifyIsbn(form.getGoodUnifyIsbn()); + shopGoodIsbn.setGoodIsbn(form.getBarcode()); + shopGoodIsbn.setShopGoodsId(shopGoods.getId()); + shopGoodIsbn.setGoodUnifyIsbn(form.getGoodUnifyIsbn()); + shopGoodIsbnMapper.insert(shopGoodIsbn); + if (form.getBarcode() == null) { + // 增加商品审核 + TBookAudit tBookAudit = new TBookAudit(); + tBookAudit.setGoodsName(form.getName()); + tBookAudit.setIsbn(form.getBarcode()); + tBookAudit.setUserId(userId); + tBookAudit.setProductId(""); + tBookAudit.setArtNo(artNo); + tBookAudit.setPrice(form.getPrice()); + tBookAudit.setFixPrice(form.getFixPrice()); + tBookAudit.setConditionCode(letterCode); + tBookAudit.setInventory(Long.valueOf(form.getInventory())); + tBookAudit.setTenantId("000000"); + tBookAudit.setStatus("2"); + tBookAuditMapper.insert(tBookAudit); + } + } else if (count > 0) { + ZhishuShopGoods existingGoods = baseMapper.selectartNoByIsbnAndConditionCodeAndArtNo(form.getBarcode(), letterCode, artNo, form.getPrice(), userId); + // 价格相同 修改 + long newInventory = existingGoods.getInventory() + form.getInventory(); + shopGoods.setId(existingGoods.getId()); + List list = form.getFiles(); + for (FilesVo filesVo : list) { + ZhishuShopImagesBo zhishuShopImagesBo = new ZhishuShopImagesBo(); + zhishuShopImagesBo.setGoodsId(shopGoods.getId()); + zhishuShopImagesBo.setPath(filesVo.getUrl()); + zhishuShopImagesService.insertByBo(zhishuShopImagesBo); + } + operatingInventory(1, shopGoods.getId(), Math.toIntExact(form.getInventory()), 4, null, userId); + shopGoods.setInventory(newInventory); + if (form.getBarcode() != null && form.getBarcode().length() == 13 && !form.getBarcode().startsWith("9")) { + shopGoods.setTemplateType("2"); + } + shopGoods.setAuthor(form.getAuthor()); + shopGoods.setPublisher(form.getPublisher()); + shopGoods.setFormat(form.getFormat()); + shopGoods.setPrintTime(form.getPrintTime()); + shopGoods.setWordage(form.getWordage()); + tBookAuditMapper.updateInventory(newInventory, userId, letterCode, artNo, form.getPrice(), form.getBarcode()); + } + + + /** + * 执行孔夫子店铺自动发布商品线程 + */ + shopGoods.setCategoryId(form.getCategoryId()); + shopGoods.setDepotId(depotId); + shopGoods.setPrice(form.getPrice()); + TDepotVo depotVo = depotService.queryById(depotId); + TLogisticsVo logisticsVo = logisticsService.queryById(depotVo.getTemplateId()); + if (logisticsVo == null) { + shopGoods.setTemplateMinPrice("0"); + } else { + shopGoods.setTemplateMinPrice(logisticsVo.getFirPrice() == null ? "0" : logisticsVo.getFirPrice().toString()); + } + System.out.println("shopGoods:" + shopGoods); + TShopDepotAotuMapper tShopDepotAotuMapper = applicationContext.getBean(TShopDepotAotuMapper.class); + KfzAutoAddRunnable kfzAutoAddRunnable = new KfzAutoAddRunnable(userId, shopService, shopDetailService, shopGoodsPublishedService, kongfzService, this, applicationContext, zhishuShopGoodsDetailService, shopGoods,tShopDepotAotuMapper); + Thread thread = new Thread(kfzAutoAddRunnable, "yxy-submitFromCopyrightPage"); + thread.setDaemon(true); // 设置为守护线程 + thread.start(); + + ProductSubmitResultVo result = new ProductSubmitResultVo(); + result.setGoodsId(shopGoods.getId()); + result.setUserId(userId); + result.setDepotId(depotId); + result.setShelvesId(shelvesId); + result.setFreightId(freightId); + result.setArtNo(artNo); + + return result; + } + + // 定义可用字符集 + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + private static final int LENGTH = 8; + + public static String generateRandomString() { + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < LENGTH; i++) { + int index = random.nextInt(CHARACTERS.length()); + sb.append(CHARACTERS.charAt(index)); + } + return sb.toString(); + } + + public TableDataInfo selectShopGoodsByPhoneNumber(String phoneNumber, int pageNum, int pageSize, String date) { + Long userId = sysUserMapper.selectUserIdByNameAndPassWord(phoneNumber); + + // 分页查询 + Page page = new Page<>(pageNum, pageSize); + + // 构建日期查询条件 + if (StringUtils.isNotEmpty(date)) { + // 将日期字符串转换为日期范围 + LocalDate localDate = LocalDate.parse(date); + LocalDateTime startOfDay = localDate.atStartOfDay(); + LocalDateTime endOfDay = localDate.plusDays(1).atStartOfDay().minusSeconds(1); + + // 使用日期范围查询 + Page goodsPage = baseMapper.selectShopGoodsByUserPageWithDate( + page, + userId, + Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()) + ); + + List goodsList = goodsPage.getRecords(); + List goodsIds = goodsList.stream().map(ZhishuShopGoodsVo::getId).collect(Collectors.toList()); + + // 合并所有店铺ID + Map> shopIdsMap = getShopIdsByUserId(userId); + List allShopIds = new ArrayList<>(); + List pddShopIds = shopIdsMap.get("1"); + List kfzShopIds = shopIdsMap.get("2"); + List xyShopIds = shopIdsMap.get("5"); + if (pddShopIds != null) allShopIds.addAll(pddShopIds); + if (kfzShopIds != null) allShopIds.addAll(kfzShopIds); + if (xyShopIds != null) allShopIds.addAll(xyShopIds); + + // 查询所有商品的发布状态 + if (!goodsIds.isEmpty() && !allShopIds.isEmpty()) { + List> publishedStatusList = shopGoodsPublishedService.selectPublishedStatus(goodsIds, allShopIds); + Map> statusMap = publishedStatusList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> map, + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + Map status = statusMap.get(goods.getId()); + if (status != null) { + goods.setPddPublishedStatus((Long) status.get("pddStatus")); + goods.setKfzPublishedStatus((Long) status.get("kfzStatus")); + goods.setXyPublishedStatus((Long) status.get("xyStatus")); + } else { + goods.setPddPublishedStatus(0L); + goods.setKfzPublishedStatus(0L); + goods.setXyPublishedStatus(0L); + } + }); + } + + // 获取商品图片 + if (!goodsIds.isEmpty()) { + List> imagePathList = zhishuShopImagesMapper.batchQueryFirstPathByGoodsIds(goodsIds); + Map imagePathMap = imagePathList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> String.valueOf(map.get("path")), + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + String path = imagePathMap.get(goods.getId()); + if (path != null && !path.isEmpty()) { + try { +// String bookPic = uploadUtil.getFiles("", "", "", path); + goods.setBookPic(path); + } catch (Exception e) { + log.error("获取商品图片失败: goodsId={}, path={}", goods.getId(), path, e); + } + } + }); + } + + // 返回分页对象 + return TableDataInfo.build(goodsPage); + } else { + // 如果没有日期参数,使用原来的查询方法 + Page goodsPage = baseMapper.selectShopGoodsByUserPage(page, userId); + List goodsList = goodsPage.getRecords(); + List goodsIds = goodsList.stream().map(ZhishuShopGoodsVo::getId).collect(Collectors.toList()); + + // 合并所有店铺ID + Map> shopIdsMap = getShopIdsByUserId(userId); + List allShopIds = new ArrayList<>(); + List pddShopIds = shopIdsMap.get("1"); + List kfzShopIds = shopIdsMap.get("2"); + List xyShopIds = shopIdsMap.get("5"); + if (pddShopIds != null) allShopIds.addAll(pddShopIds); + if (kfzShopIds != null) allShopIds.addAll(kfzShopIds); + if (xyShopIds != null) allShopIds.addAll(xyShopIds); + + // 查询所有商品的发布状态 + if (!goodsIds.isEmpty() && !allShopIds.isEmpty()) { + List> publishedStatusList = shopGoodsPublishedService.selectPublishedStatus(goodsIds, allShopIds); + Map> statusMap = publishedStatusList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> map, + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + Map status = statusMap.get(goods.getId()); + if (status != null) { + goods.setPddPublishedStatus((Long) status.get("pddStatus")); + goods.setKfzPublishedStatus((Long) status.get("kfzStatus")); + goods.setXyPublishedStatus((Long) status.get("xyStatus")); + } else { + goods.setPddPublishedStatus(0L); + goods.setKfzPublishedStatus(0L); + goods.setXyPublishedStatus(0L); + } + }); + } + + // 获取商品图片 + if (!goodsIds.isEmpty()) { + List> imagePathList = zhishuShopImagesMapper.batchQueryFirstPathByGoodsIds(goodsIds); + Map imagePathMap = imagePathList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> String.valueOf(map.get("path")), + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + String path = imagePathMap.get(goods.getId()); + if (path != null && !path.isEmpty()) { + try { +// String bookPic = uploadUtil.getFiles("", "", "", path); + goods.setBookPic(path); + } catch (Exception e) { + log.error("获取商品图片失败: goodsId={}, path={}", goods.getId(), path, e); + } + } + }); + } + + // 返回分页对象 + return TableDataInfo.build(goodsPage); + } + } + + + @Override + public Map selectDepotIds(String userId, String artNo) { + ArrayList list = new ArrayList(); + + String dcode = artNo.substring(0, 2); + // 当货号第三位是字母时,截取第三和第四位,若为数字,截取第三位 + String scode = ""; + String fcode = ""; + if (artNo.charAt(2) >= 'A' && artNo.charAt(2) <= 'Z') { + scode = artNo.substring(2, 4); + fcode = artNo.substring(4, 5); + } else { + scode = artNo.substring(2, 3); + fcode = artNo.substring(3, 5); + } + + // 查询一级二级三级获取 + Map map = baseMapper.selectArt(userId, dcode, scode, fcode); + + return map; + } + + @Override + public StockChangeLog queryStockChangeLogByOrderSn(String orderSn, Integer type) { + List list = new LambdaQueryChainWrapper<>(stockChangeLogMapper) + .eq(StockChangeLog::getAboutId, orderSn) + .eq(StockChangeLog::getType, type) + .ne(StockChangeLog::getDelFlag, "1") + .list(); + if (!list.isEmpty()) + return list.get(0); + return null; + } + + @Override + public Boolean operatingGoodsSoldOut(Long shopId, Integer platformType, Integer logType, Integer operationType, ShopGoodsPublishedVo shopGoodsPublishedVo, String orderSn) { + // 根据商品Id查询出拥有同商品的店铺Id和平台商品Id + List shopGoodsPublishedVoList = shopGoodsPublishedService.queryByShopGoodsId(shopGoodsPublishedVo.getShopGoodsId()); + + // 过滤掉自己的 + shopGoodsPublishedVoList = shopGoodsPublishedVoList.stream().filter(o -> !o.getShopId().equals(shopId.toString())).toList(); + + // 循环根据店铺Id查询出店铺信息 + for (ShopGoodsPublishedVo goodsPublishedVo : shopGoodsPublishedVoList) { + // 根据店铺Id查询出店铺信息 + ShopVo shop = shopService.queryById(Long.valueOf(goodsPublishedVo.getShopId())); + if (shop == null){ + shopGoodsPublishedService.deleteWithValidByIds(List.of(goodsPublishedVo.getId()), true); + continue; + } + // 根据店铺类型分别推送平台同步库存 + InventorySynchronizedStrategy strategy = InventorySynchronizedStrategyFactory.getStrategy(shop.getShopType()); + strategy.operatingGoodsSoldOut(shop, goodsPublishedVo, platformType, logType, operationType, orderSn); + } + return true; + } + + /** + * 获取货区对应商品数据 + * + * @param code + * @param userId + * @param pageNum + * @param pageSize + * @return + */ + @Override + public TableDataInfo queryGoodListByArtNo(String code, Long userId, int pageNum, int pageSize, String date) { + // 分页查询 + Page page = new Page<>(pageNum, pageSize); + + // 构建日期查询条件 + if (StringUtils.isNotEmpty(date)) { + // 将日期字符串转换为日期范围 + LocalDate localDate = LocalDate.parse(date); + LocalDateTime startOfDay = localDate.atStartOfDay(); + LocalDateTime endOfDay = localDate.plusDays(1).atStartOfDay().minusSeconds(1); + + // 使用日期范围查询 + Page goodsPage = baseMapper.selectShopGoodsByUserPageWithDateArtNo( + page, + userId, + Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()), + code + ); + + List goodsList = goodsPage.getRecords(); + List goodsIds = goodsList.stream().map(ZhishuShopGoodsVo::getId).collect(Collectors.toList()); + + // 合并所有店铺ID + Map> shopIdsMap = getShopIdsByUserId(userId); + List allShopIds = new ArrayList<>(); + List pddShopIds = shopIdsMap.get("1"); + List kfzShopIds = shopIdsMap.get("2"); + if (pddShopIds != null) allShopIds.addAll(pddShopIds); + if (kfzShopIds != null) allShopIds.addAll(kfzShopIds); + + // 查询所有商品的发布状态 + if (!goodsIds.isEmpty() && !allShopIds.isEmpty()) { + List> publishedStatusList = shopGoodsPublishedService.selectPublishedStatus(goodsIds, allShopIds); + Map> statusMap = publishedStatusList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> map, + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + Map status = statusMap.get(goods.getId()); + if (status != null) { + goods.setPddPublishedStatus((Long) status.get("pddStatus")); + goods.setKfzPublishedStatus((Long) status.get("kfzStatus")); + } else { + goods.setPddPublishedStatus(0L); + goods.setKfzPublishedStatus(0L); + } + }); + } + + // 获取商品图片 + if (!goodsIds.isEmpty()) { + List> imagePathList = zhishuShopImagesMapper.batchQueryFirstPathByGoodsIds(goodsIds); + Map imagePathMap = imagePathList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> String.valueOf(map.get("path")), + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + String path = imagePathMap.get(goods.getId()); + if (path != null && !path.isEmpty()) { + try { +// String bookPic = uploadUtil.getFiles(null, goods.getGoodsName(), path); + goods.setBookPic(path); + } catch (Exception e) { + log.error("获取商品图片失败: goodsId={}, path={}", goods.getId(), path, e); + } + } + }); + } + + // 返回分页对象 + return TableDataInfo.build(goodsPage); + } else { + // 如果没有日期参数,使用原来的查询方法 + Page goodsPage = baseMapper.selectShopGoodsByUserPageArtNo(page, userId, code); + List goodsList = goodsPage.getRecords(); + List goodsIds = goodsList.stream().map(ZhishuShopGoodsVo::getId).collect(Collectors.toList()); + + // 合并所有店铺ID + Map> shopIdsMap = getShopIdsByUserId(userId); + List allShopIds = new ArrayList<>(); + List pddShopIds = shopIdsMap.get("1"); + List kfzShopIds = shopIdsMap.get("2"); + if (pddShopIds != null) allShopIds.addAll(pddShopIds); + if (kfzShopIds != null) allShopIds.addAll(kfzShopIds); + + // 查询所有商品的发布状态 + if (!goodsIds.isEmpty() && !allShopIds.isEmpty()) { + List> publishedStatusList = shopGoodsPublishedService.selectPublishedStatus(goodsIds, allShopIds); + Map> statusMap = publishedStatusList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> map, + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + Map status = statusMap.get(goods.getId()); + if (status != null) { + goods.setPddPublishedStatus((Long) status.get("pddStatus")); + goods.setKfzPublishedStatus((Long) status.get("kfzStatus")); + } else { + goods.setPddPublishedStatus(0L); + goods.setKfzPublishedStatus(0L); + } + }); + } + + // 获取商品图片 + if (!goodsIds.isEmpty()) { + List> imagePathList = zhishuShopImagesMapper.batchQueryFirstPathByGoodsIds(goodsIds); + Map imagePathMap = imagePathList.stream() + .collect(Collectors.toMap( + map -> String.valueOf(map.get("goodsId")), + map -> String.valueOf(map.get("path")), + (v1, v2) -> v1 + )); + goodsList.forEach(goods -> { + String path = imagePathMap.get(goods.getId()); + if (path != null && !path.isEmpty()) { + try { +// String bookPic = uploadUtil.getFiles(null, goods.getGoodsName(), path); + goods.setBookPic(path); + } catch (Exception e) { + log.error("获取商品图片失败: goodsId={}, path={}", goods.getId(), path, e); + } + } + }); + } + + // 返回分页对象 + return TableDataInfo.build(goodsPage); + } + } + + /** + * 根据用户ID查询商品数量 + * + * @param userId 用户ID + * @return 商品数量 + */ + @Override + public Long queryGoodsCountByUserId(Long userId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(ZhishuShopGoods.class); + lqw.eq(ZhishuShopGoods::getUserId, userId); + return baseMapper.selectCount(lqw); + } + + @Override + public SysUser queryUserByUserId(Long userId) { + return sysUserMapper.selectUserById(userId); + } + + /** + * 批量移动商品位置 + * + * @param itemIds 商品ID列表 + * @param userId 用户ID + * + * @return 操作结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String batchMoveItems(List itemIds, String warehouse, String shelf, String freight, Long userId) { + if (itemIds == null || itemIds.isEmpty()) { + return "请选择要移动的商品"; + } + + +// // 检查仓库、货架、货位是否存在 + TDepotVo depot = baseMapper.selectDepotName(userId, warehouse); + if (depot == null) { + return "仓库编码不存在"; + } + + Long sheId = baseMapper.selectSheId(depot.getId(), shelf); + if (sheId == null) { + return "货架编码不存在"; + } + + Long freId = baseMapper.selectFreId(sheId, freight); + if (freId == null) { + return "货位编码不存在"; + } + // 拼接新的货号 + String newLocationCode = warehouse + shelf + freight; + // 校验是否为五位 + if (newLocationCode.length() != 5) { + return "货位编码长度必须为5位"; + } + + int successCount = 0; + StringBuilder failItems = new StringBuilder(); + + for (String id : itemIds) { + try { + // 查询商品信息 + ZhishuShopGoodsVo goodsVo = baseMapper.selectByIdVo(id); + if (goodsVo == null) { + failItems.append(id).append("(商品不存在),"); + continue; + } + + // 获取原货号,保留后面的部分 + String artNo = goodsVo.getArtNo(); + String newArtNo = ""; + + // 处理新的货号 + if (artNo.length() > 5) { + // 替换前5位,保留后面的部分 + newArtNo = newLocationCode + artNo.substring(5); + } else if(artNo.isEmpty()){ + return "原货号错误"; + } + + // 更新商品货号 + ZhishuShopGoodsBo updateBo = new ZhishuShopGoodsBo(); + updateBo.setId(id); + updateBo.setArtNo(newArtNo); + updateBo.setUserId(userId); + updateBo.setDepotId(depot.getId()); + boolean updateByBo =baseMapper.updateByArtNo(updateBo); + if (updateByBo) { + successCount++; + } else { + failItems.append(id).append("(更新失败),"); + } + // 同时插入货号移动表 + ArtNoMove artNoMove = new ArtNoMove(); + ZhishuShopGoods zhishuShopGoods = baseMapper.selectById(id); + artNoMove.setOldArtNo(artNo); + artNoMove.setNewArtNo(newArtNo); + artNoMove.setUserId(userId); + artNoMove.setOldDepotId(zhishuShopGoods.getDepotId()); + artNoMove.setNewDepotId(depot.getId()); + artNoMove.setCreateBy(userId); + artNoMove.setUpdateBy(userId); + // 插入时间戳 + artNoMove.setCreateTime(System.currentTimeMillis()); + artNoMove.setUpdateTime(System.currentTimeMillis()); + artNoMove.setIsDel(0L); + artNoMoveMapper.insert(artNoMove); + } catch (Exception e) { + log.error("批量移动商品位置异常,商品ID:{}", id, e); + failItems.append(id).append("(").append(e.getMessage()).append("),"); + } + } + + if (successCount == itemIds.size()) { + return "成功移动" + successCount + "件商品"; + } else { + return "成功移动" + successCount + "件商品,失败" + (itemIds.size() - successCount) + "件:" + failItems; + } + } + + @Override + public int updateByArtNoPrefix(String isJoinDistribution,String artNoPrefix,Long userId, Long limitNum){ + return baseMapper.updateByArtNoPrefix(isJoinDistribution,artNoPrefix,userId,limitNum); + } + + @Override + public int batchUpdateCargo(BatchUpdateCargoBo bo) { + //分别获取bo.getAres中的三个货区Id + Long deId = bo.getAreas().get(0); + Long shId = bo.getAreas().get(1); + Long frId = bo.getAreas().get(2); + String beartNo = baseMapper.getSelectArtNo(deId, shId, frId, bo.getUserId()); + Integer flag = baseMapper.batchUpdateartNo(deId, beartNo, bo.getIds()); + return flag; + } + + @Override + public void createShopGoodsList(BatchGoodsRequest request) { + System.out.println("zhuxiaodong=================== createShopGoodsList"); + Long shopId = request.getShopId(); + ShopVo shopVo = shopService.queryById(shopId); + System.out.println("zhuxiaodong=================== createShopGoodsList"+request.getBatchData()); + new Thread(() -> { + + createShopGoodsList(shopVo, request); + }).start(); + System.out.println("zhuxiaodong=================== Thread"+Thread.currentThread().getId()); + + } + + @Override + public void deleteTaskDataByShopId(Long shopId) { + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopId); + if (checkMark == 1) { + runningTaskByShopService.deleteAll("t_running_task_" + shopId); + } + } + + private void createShopGoodsList(ShopVo shopVo, BatchGoodsRequest request) { + log.info("任务开始:" + DateUtils.dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS)+request.getBatchData()); + System.out.println("zhuxiaodong==================="); + System.out.println("任务开始:" + DateUtils.dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS)+request.getBatchData()); + System.out.println("zhuxiaodong==================="); + // 根据shopId查询数据表是否存在 + int checkMark = runningTaskByShopService.checkTableExists("t_running_task_" + shopVo.getId()); + if (checkMark == 0) { + // 不存在则创建表 + runningTaskByShopService.createTable("t_running_task_" + shopVo.getId()); + } + List dataList = request.getBatchData(); + + if (dataList.isEmpty()) { + return; + } + + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + + transactionTemplate.execute(status -> { + try { + // 批量检查存在性(在事务内) + Map existsMap = runningTaskByShopService + .batchCheckGoodsIdExists("t_running_task_" + shopVo.getId(), + dataList.stream() + .map(ZhishuShopGoodsRequest::getItemNumber) + .collect(Collectors.toList())); + + // 过滤并构建数据 + List runningTaskList = dataList.stream() + .filter(item -> !existsMap.getOrDefault(item.getItemNumber(), false)) + .map(item -> buildRunningTask(shopVo, request, item)) + .collect(Collectors.toList()); + + log.info("过滤后需要插入的数据量: {},跳过重复数据: {}", + runningTaskList.size(), dataList.size() - runningTaskList.size()); + + // 批量插入 + if (!runningTaskList.isEmpty()) { + runningTaskByShopService.batchInsert("t_running_task_" + shopVo.getId(), runningTaskList); + runningTaskByShopService.updateStatus("t_running_task_" + shopVo.getId()); + } + + return null; + } catch (Exception e) { + status.setRollbackOnly(); + log.error("批量插入商品数据失败: {}", e.getMessage(), e); + throw e; + } + }); + + if (request.getIsLastBatch()) { + RedisUtils.setCacheObject("lastGoodsSynTime_" + shopVo.getId(), + DateUtilsUtils.getNowDate()); + } + + + // 添加数据 + // if (dataList.size() > 0) { + // List runningTaskList = new ArrayList<>(); + // for (ZhishuShopGoodsRequest map : dataList) { + // + // + // + // // 构建 JSON 对象 + // JSONObject json = new JSONObject(); + // // 平台的商品id + // json.put("trilateralId", map.getItemNumber()); + // json.put("author", map.getAuthor()); + // json.put("publisher", map.getPublisher()); + // json.put("publisherTime", map.getPublisherTime()); + // json.put("format", map.getFormat()); + // json.put("wordage", map.getWordage()); + // json.put("unifiedIsbn", map.getUnifiedIsbn()); + // json.put("img", map.getBookPic()); + // // 当前时间 + // json.put("finishTime", DateUtilsUtils.getNowDate()); + // json.put("imageSelect", "2"); + // // 商品价格单位分 + // json.put("totalPrice", map.getPrice()); + // // 书号 + // json.put("isbn", map.getIsbn()); + // // 权重不用管 + // json.put("priority", "3"); + // // 不用填,上传的实拍图 + // json.put("imageBigUrl", ""); + // // 商品标题 + // json.put("title", map.getGoodsName()); + // json.put("quality", map.getConditionCode()); + // json.put("shopType", shopVo.getShopType()); + // json.put("artNo", map.getArtNo()); + // // 库存 + // json.put("stock", map.getInventory()); + // json.put("isOnSale", "1"); + // json.put("skuCode", ""); + // json.put("skuId", ""); + // // json.put("isOnSale", map.get("is_onsale").toString()); + // // json.put("isMoreSku", map.get("is_more_sku").toString()); + // String jsonString = json.toString(); + // + // RunningTask runningTask = new RunningTask(); + // runningTask.setTaskId(request.getTaskId()); + // runningTask.setShopId(shopVo.getId()); + // runningTask.setGoodsId(Long.valueOf(map.getItemNumber())); + // runningTask.setRandomNum(System.currentTimeMillis()); + // runningTask.setTaskName("拉取孔网商品任务"); + // runningTask.setPriority(255L); + // runningTask.setData(""); + // runningTask.setStatus("2"); + // runningTask.setTaskType("GET_KW_SHOP_GOODS"); + // runningTask.setSuccessData(jsonString); + // runningTask.setCallBackData("拉取成功"); + // runningTaskList.add(runningTask); + // } + // if (ObjectUtil.isNotEmpty(runningTaskList)) { + // runningTaskByShopService.batchInsert("t_running_task_" + shopVo.getId(), runningTaskList); + // runningTaskByShopService.updateStatus("t_running_task_" + shopVo.getId()); + // } + // if (request.getIsLastBatch()) { + // RedisUtils.setCacheObject("lastGoodsSynTime_" + shopVo.getId(), DateUtilsUtils.getNowDate()); + // } + // } + } + + + private RunningTask buildRunningTask(ShopVo shopVo, BatchGoodsRequest request, + ZhishuShopGoodsRequest map) { + JSONObject json = buildGoodsJson(shopVo, map); + + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(request.getTaskId()); + runningTask.setShopId(shopVo.getId()); + runningTask.setGoodsId(Long.valueOf(map.getItemNumber())); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName("拉取孔网商品任务"); + runningTask.setPriority(255L); + runningTask.setData(""); + runningTask.setStatus("2"); + runningTask.setTaskType("GET_KW_SHOP_GOODS"); + runningTask.setSuccessData(json.toString()); + runningTask.setCallBackData("拉取成功"); + + return runningTask; + } + + private JSONObject buildGoodsJson(ShopVo shopVo, ZhishuShopGoodsRequest map) { + JSONObject json = new JSONObject(); + json.put("trilateralId", map.getItemNumber()); + json.put("author", map.getAuthor()); + json.put("publisher", map.getPublisher()); + json.put("publisherTime", map.getPublisherTime()); + json.put("format", map.getFormat()); + json.put("wordage", map.getWordage()); + json.put("unifiedIsbn", map.getUnifiedIsbn()); + json.put("img", map.getBookPic()); + json.put("finishTime", DateUtilsUtils.getNowDate()); + json.put("imageSelect", "11"); + json.put("totalPrice", map.getPrice()); + json.put("isbn", map.getIsbn()); + json.put("priority", "3"); + json.put("imageBigUrl", ""); + json.put("title", map.getGoodsName()); + json.put("quality", map.getConditionCode()); + json.put("shopType", shopVo.getShopType()); + json.put("artNo", map.getArtNo()); + json.put("stock", map.getInventory()); + json.put("isOnSale", "1"); + json.put("skuCode", ""); + json.put("skuId", ""); + return json; + } + + + + @Override + public void syncRunningTaskToShopGoods(Long shopId, Long freightId,Long userId,TaskBo taskBo) { + /** + * 查询货号 + */ + Map freightMap = TFreightMapper.selectByFreightId(freightId); + Long pageSize = 100L; + Long page = 1L; + + RunningTaskShopGoodsDto runningTaskShopGoodsDto = new RunningTaskShopGoodsDto(); + runningTaskShopGoodsDto.setTableName("t_running_task_"+shopId); + runningTaskShopGoodsDto.setTaskId(taskBo.getRelationId()); + runningTaskShopGoodsDto.setPageSize(pageSize); + while(true){ + /** + * 循环开始查询店铺商品数据进行同步自营书品操作 + */ + Long pageNum = (long) ((page - 1) * pageSize); + runningTaskShopGoodsDto.setPageNum(pageNum); + List shopGoodsMapList = runningTaskByShopService.selectGetShopGoodsListByDto(runningTaskShopGoodsDto); + if(shopGoodsMapList.isEmpty()){ + break; + } + for (Map shopGoodsMap : shopGoodsMapList){ + Map successData = JsonUtil.transferToObj(shopGoodsMap.get("success_data").toString(),Map.class); + String artNo = successData.get("artNo") == null ? "" : successData.get("artNo").toString(); + String trilateralId = successData.get("trilateralId") == null ? "" : successData.get("trilateralId").toString(); + String isbn = successData.get("isbn") == null ? "" : successData.get("isbn").toString(); + if(StringUtils.isEmpty(isbn)){ + isbn = generate13DigitId(); + } + /** + * 定义任务日志对象 + */ + String callBackData = ""; + + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(taskBo.getId()); + runningTask.setShopId(Long.valueOf(shopId)); + runningTask.setGoodsId(0L); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName("同步至自营书品任务"); + runningTask.setPriority(255L); + runningTask.setTaskType("SYNCHRONIZE_TO_ERP"); + runningTask.setStatus("3"); + + try{ + //校验货号是否符合规则 +// Boolean artNoIsOk = ArtNoUtil.validateArtNo(artNo); + ZhishuShopGoodsVo zhishuShopGoodsVo = baseMapper.selectShopGoodsByProductId(trilateralId,userId); + + if(zhishuShopGoodsVo == null){ + //若根据货号未查询到则根据店铺id和平台id查询商品 + zhishuShopGoodsVo = baseMapper.selectShopGoodsByShopIdAndPlatformId(shopId.toString(),trilateralId); + } + if(zhishuShopGoodsVo != null){ + /** + * 当前商品在自营书品中存在 则执行修改操作 + */ + ZhishuShopGoods zhishuShopGoods = new ZhishuShopGoods(); + zhishuShopGoods.setId(zhishuShopGoodsVo.getId()); + //获取库存 + if(successData.get("stock") != null){ + Long stock = Long.parseLong(successData.get("stock").toString()); + //比较新旧库存是否一致 + if(Long.parseLong(zhishuShopGoodsVo.getInventory()) != stock){ + //库存不一致,则进行修改操作 + zhishuShopGoods.setInventory(stock); + //记录旧库存 + successData.put("oldStock", zhishuShopGoodsVo.getInventory()); + } + } + if (successData.get("totalPrice") != null){ + Long price = Long.parseLong(successData.get("totalPrice").toString()); + //比较新旧价格是否一致 + Long oldPrice = zhishuShopGoodsVo.getPrice().longValue(); + if (!oldPrice.equals(price)) { + //价格不一致,则进行修改操作 + zhishuShopGoods.setPrice(price); + //记录旧价格 + successData.put("oldPrice", oldPrice); + } + } + //进行修改库存 + if(zhishuShopGoods.getInventory() != null || zhishuShopGoods.getPrice() != null){ + int updateMark = baseMapper.updateById(zhishuShopGoods); + if(zhishuShopGoods.getInventory() != null && updateMark >= 1){ + StockChangeLog stockChangeLog = new StockChangeLog(); + stockChangeLog.setShopGoodsId(Long.parseLong(zhishuShopGoodsVo.getId())); + stockChangeLog.setType(5); + stockChangeLog.setBeforeInv(Long.parseLong(zhishuShopGoodsVo.getInventory())); //初始库存 + stockChangeLog.setAfterInv(Long.parseLong(successData.get("stock").toString())); + stockChangeLog.setCreateBy(zhishuShopGoodsVo.getUserId()); + stockChangeLog.setUpdateBy(zhishuShopGoodsVo.getUserId()); + stockChangeLog.setCreateTime(DateUtils.getNowDate()); + stockChangeLog.setUpdateTime(DateUtils.getNowDate()); + stockChangeLog.setDelFlag("0"); + stockChangeLogMapper.insert(stockChangeLog); + + //记录日志 + callBackData += "修改库存成功;"; + } + if(zhishuShopGoods.getPrice() != null && updateMark > 1){ + callBackData += "修改价格成功;"; + } + + if(updateMark == 0){ + callBackData += "修改自营商品失败;"; + } + } + //查看是否存在已发布商品记录 + ShopGoodsPublishedVo shopGoodsPublishedVo = shopGoodsPublishedService.queryByPlatformId(shopId.toString(),trilateralId); + if (shopGoodsPublishedVo == null || !shopGoodsPublishedVo.getPlatformId().equals(trilateralId)){ + //不存在,或者三方平台对不上的情况则新增已发布商品记录 + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + shopGoodsPublishedBo.setShopId(shopId+""); + shopGoodsPublishedBo.setShopGoodsId(zhishuShopGoodsVo.getId()); + shopGoodsPublishedBo.setPlatformId(trilateralId); + shopGoodsPublishedBo.setCreateBy(zhishuShopGoodsVo.getUserId()); + shopGoodsPublishedBo.setCreateTime(DateUtils.getNowDate()); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + //记录日志 + callBackData += "新增已发布记录成功;"; + } + }else{ + //不存在,则执行新增操作 + //新增标记为空,代表需要进行新增操作 + ZhishuShopGoods zhishuShopGoods = new ZhishuShopGoods(); + zhishuShopGoods.setUserId(userId); + zhishuShopGoods.setProductId(trilateralId); + zhishuShopGoods.setIsJoinDistribution(freightMap.get("allow_distribution") == null ? 0 : Integer.parseInt(freightMap.get("allow_distribution").toString())); + zhishuShopGoods.setDepotId(Long.parseLong(freightMap.get("did").toString())); + zhishuShopGoods.setGoodsName((String) successData.get("title")); + zhishuShopGoods.setIsbn(isbn); + zhishuShopGoods.setPrice(Long.parseLong(successData.get("totalPrice").toString())); + // successData.get("quality") + + Double quality = new BigDecimal(successData.get("quality").toString()).divide(new BigDecimal(10)).setScale(1, RoundingMode.HALF_UP).stripTrailingZeros().doubleValue(); + zhishuShopGoods.setConditionCode(successData.get("quality") == null ? "K" : CODE_MAP.get(quality)); + zhishuShopGoods.setInventory(Long.parseLong(successData.get("stock").toString())); + zhishuShopGoods.setBookPic((String) successData.get("img")); + zhishuShopGoods.setOriginalArtNo((String) successData.get("artNo")); + zhishuShopGoods.setIsArtNoConversion(1); + zhishuShopGoods.setCreateBy(userId); + zhishuShopGoods.setUpdateBy(userId); + zhishuShopGoods.setCreateTime(DateUtils.getNowDate()); + zhishuShopGoods.setUpdateTime(DateUtils.getNowDate()); + Double s = 85.0; + try{ + s = convertChineseToCode(successData.get("quality").toString()); + }catch (Exception e){ + s = Double.parseDouble(successData.get("quality").toString()); + System.out.println("获取品相异常:"+e.getMessage()+";更改赋值:"+s); + } + s = s / 10; + artNo = cnumberUtils.getArtNo(s, userId, successData.get("isbn").toString(), Long.parseLong(freightMap.get("did").toString()), Long.parseLong(freightMap.get("sid").toString()), Long.parseLong(freightMap.get("fid").toString()), null); + zhishuShopGoods.setArtNo(artNo); + boolean flag = baseMapper.insert(zhishuShopGoods) > 0; + if(flag){ + //记录日志 + callBackData += "同步成功;"; + /** + * 新增成功后,增加 库存操作记录、已发布商品记录、商品实拍图。 + * 若是无效isbn则需要增加书籍信息 + */ + //新增库存操作记录 + StockChangeLog stockChangeLog = new StockChangeLog(); + stockChangeLog.setShopGoodsId(Long.parseLong(zhishuShopGoods.getId())); + stockChangeLog.setType(5); + stockChangeLog.setBeforeInv(0L); //初始库存 + stockChangeLog.setAfterInv(Long.parseLong(successData.get("stock").toString())); + stockChangeLog.setCreateBy(zhishuShopGoods.getUserId()); + stockChangeLog.setUpdateBy(zhishuShopGoods.getUserId()); + stockChangeLog.setCreateTime(DateUtils.getNowDate()); + stockChangeLog.setUpdateTime(DateUtils.getNowDate()); + stockChangeLog.setDelFlag("0"); + stockChangeLogMapper.insert(stockChangeLog); + //已发布商品记录 + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + shopGoodsPublishedBo.setShopId(shopId+""); + shopGoodsPublishedBo.setShopGoodsId(zhishuShopGoods.getId()); + shopGoodsPublishedBo.setPlatformId(trilateralId); + shopGoodsPublishedBo.setCreateBy(zhishuShopGoods.getUserId()); + shopGoodsPublishedBo.setUpdateBy(zhishuShopGoods.getUserId()); + shopGoodsPublishedBo.setCreateTime(DateUtils.getNowDate()); + shopGoodsPublishedBo.setUpdateTime(DateUtils.getNowDate()); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + //商品实拍图 + if (successData.get("img") != null){ + ZhishuShopImagesBo zhishuShopImagesBo = new ZhishuShopImagesBo(); + zhishuShopImagesBo.setGoodsId(zhishuShopGoods.getId()); + zhishuShopImagesBo.setPath((String) successData.get("img")); + zhishuShopImagesService.insertByBo(zhishuShopImagesBo); + } + //书籍信息 判断isbn首个字符是不是6 + if(isbn.substring(0,1).equals("6")){ + ZhishuShopGoodsDetailBo zhishuShopGoodsDetailBo = new ZhishuShopGoodsDetailBo(); + zhishuShopGoodsDetailBo.setPid(Long.parseLong(zhishuShopGoods.getId())); + zhishuShopGoodsDetailBo.setAuthor(successData.get("author") == null ? "" : successData.get("author").toString()); + zhishuShopGoodsDetailBo.setPublisher(successData.get("publisher") == null ? "" : successData.get("publisher").toString()); + zhishuShopGoodsDetailBo.setPublishertime(successData.get("publisherTime") == null ? "" : successData.get("publisherTime").toString()); + zhishuShopGoodsDetailBo.setFormat(successData.get("format") == null ? "" : successData.get("format").toString()); + zhishuShopGoodsDetailBo.setWordage(successData.get("wordage") == null ? "" : successData.get("wordage").toString()); + zhishuShopGoodsDetailService.insertByBo(zhishuShopGoodsDetailBo); + } + } + } + if(StringUtils.isEmpty(callBackData)){ + callBackData = "商品已存在并且库存价格一致,不做处理"; + } + }catch (Exception e){ + e.printStackTrace(); + callBackData += "同步失败;"; + } + //记录数据日志 + runningTask.setSuccessData(JsonUtil.transferToJson(successData)); + runningTask.setCallBackData(callBackData); + runningTaskService.insert(runningTask); + } + //进行下100条数据 + page++; + } + } + + @Override + public void synchronousTask(ShopVo shopVo, TaskBo taskBo){ + + shopGoodsPublishedService.deleteByShopId(shopVo.getId()); + Long pageSize = 100L; + Long page = 1L; + RunningTaskShopGoodsDto runningTaskShopGoodsDto = new RunningTaskShopGoodsDto(); + runningTaskShopGoodsDto.setTableName("t_running_task_"+shopVo.getId()); + runningTaskShopGoodsDto.setTaskId(taskBo.getRelationId()); + runningTaskShopGoodsDto.setPageSize(pageSize); + while(true){ + Long pageNum = (long) ((page - 1) * pageSize); + runningTaskShopGoodsDto.setPageNum(pageNum); + List shopGoodsMapList = runningTaskByShopService.selectGetShopGoodsListByDto(runningTaskShopGoodsDto); + if(shopGoodsMapList.isEmpty()){ + break; + } + + + for (Map shopGoodsMap : shopGoodsMapList){ + + + Map successData = JsonUtil.transferToObj(shopGoodsMap.get("success_data").toString(),Map.class); + + RunningTask runningTask = new RunningTask(); + runningTask.setTaskId(taskBo.getId()); + runningTask.setShopId(shopVo.getId()); + runningTask.setGoodsId(0L); + runningTask.setRandomNum(System.currentTimeMillis()); + runningTask.setTaskName("同步至自营书品任务"); + runningTask.setPriority(255L); + runningTask.setTaskType("SYNCHRONOUS_TASK"); + runningTask.setStatus("3"); + runningTask.setSuccessData(JsonUtil.transferToJson(successData)); + + String artNo = successData.get("skuCode") == null ? "" : successData.get("skuCode").toString(); + if (StringUtils.isEmpty(artNo)){ + runningTask.setCallBackData("规格编码为空"); + }else{ + String trilateralId = successData.get("trilateralId") == null ? "" : successData.get("trilateralId").toString(); + ZhishuShopGoodsVo zhishuShopGoodsVo = baseMapper.selectShopGoodsByArtNoAndUserId(artNo,shopVo.getCreateBy()); + + if (zhishuShopGoodsVo != null){ + // 存在数据,查询是否存在已发布商品 + //查看是否存在已发布商品记录 + ShopGoodsPublishedVo shopGoodsPublishedVo = shopGoodsPublishedService.queryByPlatformId(shopVo.getId().toString(),trilateralId); + if (shopGoodsPublishedVo == null || !shopGoodsPublishedVo.getPlatformId().equals(trilateralId)){ + //不存在,或者三方平台对不上的情况则新增已发布商品记录 + ShopGoodsPublishedBo shopGoodsPublishedBo = new ShopGoodsPublishedBo(); + shopGoodsPublishedBo.setShopId(shopVo.getId().toString()); + shopGoodsPublishedBo.setShopGoodsId(zhishuShopGoodsVo.getId()); + shopGoodsPublishedBo.setPlatformId(trilateralId); + shopGoodsPublishedBo.setCreateBy(zhishuShopGoodsVo.getUserId()); + shopGoodsPublishedBo.setCreateTime(DateUtils.getNowDate()); + shopGoodsPublishedService.insertByBo(shopGoodsPublishedBo); + //记录日志 + runningTask.setCallBackData("商品对应成功"); + }else{ + runningTask.setCallBackData("已存在商品"); + } + }else{ + runningTask.setCallBackData("未对应到自营商品"); + } + } + runningTaskService.insert(runningTask); + } + page++; + } + } + + /** + * 生成13位ID:6 + 秒级时间戳 + 随机数 + * 格式:6 + 秒级时间戳(10位) + 随机数(2位) = 13位 + */ + public static String generate13DigitId() { + // 获取秒级时间戳(10位) + long timestamp = Instant.now().getEpochSecond(); + + // 生成2位随机数(00-99) + int randomNum = ThreadLocalRandom.current().nextInt(0, 100); + + // 格式化为2位数字,不足补0 + String randomPart = String.format("%02d", randomNum); + + // 拼接:6 + 时间戳 + 随机数 + return "6" + timestamp + randomPart; + } + + public Map uploadImg1(MultipartFile file ,String accessToken) { + + org.springframework.core.io.Resource fileResource = null; + try { + fileResource = new ByteArrayResource(file.getBytes()) { + @Override + public String getFilename() { + return file.getOriginalFilename(); + } + }; + } catch (Exception e) { + throw new RuntimeException(e); + } + + Map pddMap = new HashMap(); + pddMap.put("token", accessToken); + pddMap.put("file", fileResource); + + Map map = InterfaceUtils.postFormObject(getUploadImgUrl(), "/upload", pddMap); + // Map map = InterfaceUtils.postFormObject("http://10.206.0.10:8069", "/upload", pddMap); + + if (map.get("message").toString().contains("上传成功")) { + String imageUrl = map.get("image_url").toString(); + String serviceUrl = map.get("service_url").toString(); + if (serviceUrl.contains("https://")) { + map.put("url", serviceUrl); + } else if (imageUrl.contains("https://")) { + String pddImage = InterfaceUtils.getInterface(getImgResultUrl(), "/upload?token=" + accessToken + "&imageURL=" + imageUrl); + // String pddImage = InterfaceUtils.getInterface("http://10.206.0.10:8070", "/upload?token=" + accessToken + "&imageURL=" + imageUrl); + //调用pdd图片上传接口 + map.put("url", pddImage); + } else { + map.put("message", "图片上传失败"); + } + } + + return map; + } + + @Override + public Map uploadImg(MultipartFile file) { + String accessToken = configService.selectConfigByKey("image.token"); + Map map = PddUtils.pddImageUpload(file,accessToken); + System.out.println("图片上传"+ map); + return map; + } + + @Override + public void synShopImg(Long userId) { + ExecutorService executorService = Executors.newFixedThreadPool(100); + // 获取该店铺下的所有商品 + List zhishuShopGoodsVoList = baseMapper.selectShopGoodsByUser(userId); + List zhishuShopImagesList = Collections.synchronizedList(new ArrayList<>()); + List zhishuShopGoodsList = Collections.synchronizedList(new ArrayList<>()); + + // 创建CountDownLatch等待所有任务完成 + CountDownLatch latch = new CountDownLatch(zhishuShopGoodsVoList.size()); + + for (ZhishuShopGoodsVo bo : zhishuShopGoodsVoList) { + executorService.submit(() -> { + try { + ZhishuShopGoods add = MapstructUtils.convert(bo, ZhishuShopGoods.class); + add.setConditionCode(CHINESE_TO_CODE_MAP1.get(add.getConditionCode())); + Map map = new HashMap(); + // 修剪孔网图片url + map.put("filepath", add.getBookPic()); + map.put("goodsName", add.getGoodsName()); + map.put("isbn", add.getIsbn()); + map.put("isKW", true); + map.put("isNet", true); + InterfaceUtils.processImage(JSONObject.toJSONString(map)); + + String bookPic = fullBookPic(add); + add.setBookPic(bookPic); + try { + MultipartFile multipartFile = new UrlMultipartFile(bookPic, "book_cover.jpg"); + Map pddImg = uploadImg(multipartFile); + String pddImgUrl = (String) pddImg.get("url"); + + baseMapper.updateById(add); + + if (pddImgUrl != null) { + ZhishuShopImages zhishuShopImages = new ZhishuShopImages(); + zhishuShopImages.setGoodsId(add.getId()); + zhishuShopImages.setPath(pddImgUrl); + zhishuShopImages.setCreateBy(add.getUserId()); + zhishuShopImages.setUpdateBy(add.getUserId()); + zhishuShopImages.setCreateTime(DateUtils.getNowDate()); + zhishuShopImages.setUpdateTime(DateUtils.getNowDate()); + zhishuShopImages.setDelFlag("0"); + zhishuShopImagesList.add(zhishuShopImages); + } + } catch (IOException e) { + log.error("上传图片失败", e); + } + } finally { + latch.countDown(); + } + }); + } + /*try { + latch.await(); // 等待所有任务完成 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + }*/ + + // baseMapper.updateBatchById(zhishuShopGoodsList); + zhishuShopImagesMapper.insertBatch(zhishuShopImagesList); + } + + @Override + public void synPddShopImg(Long userId) { + ExecutorService executorService = Executors.newFixedThreadPool(100); + // 获取该店铺下的所有商品 + List zhishuShopGoodsVoList = baseMapper.selectShopGoodsByUser(userId); + + for (ZhishuShopGoodsVo bo : zhishuShopGoodsVoList) { + executorService.submit(() -> { + + ZhishuShopGoods add = MapstructUtils.convert(bo, ZhishuShopGoods.class); + + try { + MultipartFile multipartFile = new UrlMultipartFile(bo.getBookPic(), "book_cover.jpg"); + Map pddImg = uploadImg(multipartFile); + String pddImgUrl = (String) pddImg.get("url"); + + if (pddImgUrl != null) { + ZhishuShopImages zhishuShopImages = new ZhishuShopImages(); + zhishuShopImages.setGoodsId(add.getId()); + zhishuShopImages.setPath(pddImgUrl); + zhishuShopImages.setCreateBy(add.getUserId()); + zhishuShopImages.setUpdateBy(add.getUserId()); + zhishuShopImages.setCreateTime(DateUtils.getNowDate()); + zhishuShopImages.setUpdateTime(DateUtils.getNowDate()); + zhishuShopImages.setDelFlag("0"); + zhishuShopImagesMapper.insert(zhishuShopImages); + } + } catch (IOException e) { + log.error("上传图片失败", e); + } + }); + } + } + + @Override + public Long getTaskDataNum(Long taskId) { + return this.baseMapper.getTaskDataNum(taskId); + } + + + /** + * 解析shipmentId,获取一、二、三级货区号 + * @param shipmentId 货号 + */ + private Integer parseShipmentId(String userId, String shipmentId) { + if (shipmentId != null && shipmentId.length() == 5) { + // 一级货区:前2位 + String firstLevel = shipmentId.substring(0, 2); + + char thirdChar = shipmentId.charAt(2); + String secondLevel; + String thirdLevel; + + if (Character.isDigit(thirdChar)) { + // 第三位是数字:第三位是二级货区,第四五位是三级货区 + secondLevel = shipmentId.substring(2, 3); + thirdLevel = shipmentId.substring(3, 5); + } else { + // 第三位是字母:第三四位是二级货区,第五位是三级货区 + secondLevel = shipmentId.substring(2, 4); + thirdLevel = shipmentId.substring(4, 5); + } + +// return waveDetailMapper.getIsJoinDistribution(userId, firstLevel, secondLevel, thirdLevel); + } + return null; + } +} + + + + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopImagesServiceImpl.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopImagesServiceImpl.java new file mode 100644 index 0000000..0345323 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/impl/ZhishuShopImagesServiceImpl.java @@ -0,0 +1,137 @@ +package org.dromara.zhishu.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.zhishu.domain.ZhishuShopImages; +import org.dromara.zhishu.domain.bo.ZhishuShopImagesBo; +import org.dromara.zhishu.domain.vo.ZhishuShopImagesVo; +import org.dromara.zhishu.mapper.ZhishuShopImagesMapper; +import org.dromara.zhishu.service.IZhishuShopImagesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商品图片Service业务层处理 + * + * @author Lion Li + * @date 2025-03-13 + */ +@RequiredArgsConstructor +@Service +public class ZhishuShopImagesServiceImpl implements IZhishuShopImagesService { + + private final ZhishuShopImagesMapper baseMapper; + + /** + * 查询商品图片 + * + * @param id 主键 + * @return 商品图片 + */ + @Override + public ZhishuShopImagesVo queryById(String id){ + return baseMapper.selectVoById(id); + } + + @Override + public List selectShopImagesByShopId(String goodsId) { + return baseMapper.selectShopImagesByShopId(goodsId); + } + + /** + * 分页查询商品图片列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 商品图片分页列表 + */ + @Override + public TableDataInfo queryPageList(ZhishuShopImagesBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的商品图片列表 + * + * @param bo 查询条件 + * @return 商品图片列表 + */ + @Override + public List queryList(ZhishuShopImagesBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ZhishuShopImagesBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(ZhishuShopImages::getId); + lqw.eq(StringUtils.isNotBlank(bo.getGoodsId()), ZhishuShopImages::getGoodsId, bo.getGoodsId()); + lqw.eq(StringUtils.isNotBlank(bo.getPath()), ZhishuShopImages::getPath, bo.getPath()); + return lqw; + } + + /** + * 新增商品图片 + * + * @param bo 商品图片 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ZhishuShopImagesBo bo) { + ZhishuShopImages add = MapstructUtils.convert(bo, ZhishuShopImages.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商品图片 + * + * @param bo 商品图片 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ZhishuShopImagesBo bo) { + ZhishuShopImages update = MapstructUtils.convert(bo, ZhishuShopImages.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ZhishuShopImages entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除商品图片信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedGFtrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedGFtrategy.java new file mode 100644 index 0000000..3404a05 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedGFtrategy.java @@ -0,0 +1,56 @@ +package org.dromara.zhishu.service.strategy; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.dto.request.SoldOutRequest; +import org.dromara.zhishu.domain.vo.ShopGoodsPublishedVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.mapper.ShopGoodsPublishedLogMapper; +import org.dromara.zhishu.mapper.ZhishuShopGoodsMapper; +import org.dromara.zhishu.service.IGoofishService; +import org.dromara.zhishu.service.IKongFzService; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class InventorySynchronizedGFtrategy implements InventorySynchronizedStrategy { + + @Autowired + private IGoofishService goofishService; ; + + + @Autowired + private ZhishuShopGoodsMapper zhishuShopGoodsMapper; + + + + @Override + public void inventorySynchronized(ShopVo shop, ShopGoodsPublishedVo goodsPublishedVo, Integer type) { + String shopGoodsId = goodsPublishedVo.getShopGoodsId(); + ZhishuShopGoods zhishuShopGoods = new LambdaQueryChainWrapper<>(zhishuShopGoodsMapper) + .eq(ZhishuShopGoods::getId, shopGoodsId) + .oneOpt().orElseThrow(() -> new BaseException("数据异常")); + goofishService.goodUpdateStock(shop, goodsPublishedVo.getPlatformId(), zhishuShopGoods.getInventory().toString(), type); + } + + @Override + public void operatingGoodsSoldOut(ShopVo shop, ShopGoodsPublishedVo goodsPublishedVo, Integer platformType, Integer logType, Integer operationType, String orderSn) { + // SoldOutRequest soldOutRequest = new SoldOutRequest(shop.getToken(), goodsPublishedVo.getPlatformId()); + // R booleanR = kfzClient.soldOut(UrlUtil.getKfzServiceUrl(), soldOutRequest); + // ShopGoodsPublishedLog shopGoodsPublishedLog = new ShopGoodsPublishedLog(); + // shopGoodsPublishedLog.setShopGoodsId(Long.valueOf(goodsPublishedVo.getShopGoodsId())); + // shopGoodsPublishedLog.setShopGoodsPublishedId(goodsPublishedVo.getId()); + // shopGoodsPublishedLog.setPlatformId(goodsPublishedVo.getPlatformId()); + // shopGoodsPublishedLog.setAboutId(orderSn); + // shopGoodsPublishedLog.setLogType(logType); + // shopGoodsPublishedLog.setOperationType(operationType); + // shopGoodsPublishedLog.setPlatformType(platformType); + // shopGoodsPublishedLog.setStatus(R.isSuccess(booleanR) ? 0 : 1); + // shopGoodsPublishedLogMapper.insert(shopGoodsPublishedLog); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedKWStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedKWStrategy.java new file mode 100644 index 0000000..5ad40a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/InventorySynchronizedKWStrategy.java @@ -0,0 +1,58 @@ +package org.dromara.zhishu.service.strategy; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.zhishu.domain.ShopGoodsPublishedLog; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.dto.request.SoldOutRequest; +import org.dromara.zhishu.domain.vo.ShopGoodsPublishedVo; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.mapper.ShopGoodsPublishedLogMapper; +import org.dromara.zhishu.mapper.ZhishuShopGoodsMapper; +import org.dromara.zhishu.service.IKongFzService; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class InventorySynchronizedKWStrategy implements InventorySynchronizedStrategy { + + @Autowired + private IKongFzService kongFzService; + + @Autowired + private KfzClient kfzClient; + + @Autowired + private ZhishuShopGoodsMapper zhishuShopGoodsMapper; + + @Autowired + private ShopGoodsPublishedLogMapper shopGoodsPublishedLogMapper; + + @Override + public void inventorySynchronized(ShopVo shop, ShopGoodsPublishedVo goodsPublishedVo, Integer type) { + String shopGoodsId = goodsPublishedVo.getShopGoodsId(); + ZhishuShopGoods zhishuShopGoods = new LambdaQueryChainWrapper<>(zhishuShopGoodsMapper) + .eq(ZhishuShopGoods::getId, shopGoodsId) + .oneOpt().orElseThrow(() -> new BaseException("数据异常")); + kongFzService.goodUpdateStock(shop.getToken(), goodsPublishedVo.getPlatformId(), zhishuShopGoods.getInventory().toString()); + } + + @Override + public void operatingGoodsSoldOut(ShopVo shop, ShopGoodsPublishedVo goodsPublishedVo, Integer platformType, Integer logType, Integer operationType, String orderSn) { + SoldOutRequest soldOutRequest = new SoldOutRequest(shop.getToken(), goodsPublishedVo.getPlatformId()); + R booleanR = kfzClient.soldOut(UrlUtil.getKfzServiceUrl(), soldOutRequest); + ShopGoodsPublishedLog shopGoodsPublishedLog = new ShopGoodsPublishedLog(); + shopGoodsPublishedLog.setShopGoodsId(Long.valueOf(goodsPublishedVo.getShopGoodsId())); + shopGoodsPublishedLog.setShopGoodsPublishedId(goodsPublishedVo.getId()); + shopGoodsPublishedLog.setPlatformId(goodsPublishedVo.getPlatformId()); + shopGoodsPublishedLog.setAboutId(orderSn); + shopGoodsPublishedLog.setLogType(logType); + shopGoodsPublishedLog.setOperationType(operationType); + shopGoodsPublishedLog.setPlatformType(platformType); + shopGoodsPublishedLog.setStatus(R.isSuccess(booleanR) ? 0 : 1); + shopGoodsPublishedLogMapper.insert(shopGoodsPublishedLog); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseGFStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseGFStrategy.java new file mode 100644 index 0000000..b730c8d --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseGFStrategy.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.service.strategy; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import org.dromara.zhishu.domain.vo.GoodsItemGFVo; +import org.dromara.zhishu.domain.vo.ItemListVo; +import org.springframework.stereotype.Service; + +@Service +public class ItemListJsonStringParseGFStrategy implements ItemListJsonStringParseStrategy{ + @Override + public ItemListVo itemListJsonStringParse(String itemListStr) { + return JSON.parseObject(itemListStr, new TypeReference>() {}); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseKWStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseKWStrategy.java new file mode 100644 index 0000000..a93aedf --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseKWStrategy.java @@ -0,0 +1,15 @@ +package org.dromara.zhishu.service.strategy; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import org.dromara.zhishu.domain.vo.GoodsItemKfzVo; +import org.dromara.zhishu.domain.vo.ItemListVo; +import org.springframework.stereotype.Service; + +@Service +public class ItemListJsonStringParseKWStrategy implements ItemListJsonStringParseStrategy{ + @Override + public ItemListVo itemListJsonStringParse(String itemListStr) { + return JSON.parseObject(itemListStr, new TypeReference>() {}); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseStrategy.java new file mode 100644 index 0000000..c5fe1f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ItemListJsonStringParseStrategy.java @@ -0,0 +1,9 @@ +package org.dromara.zhishu.service.strategy; + +import org.dromara.zhishu.domain.vo.ItemListVo; + +public interface ItemListJsonStringParseStrategy { + + ItemListVo itemListJsonStringParse(String itemListStr); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderGFStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderGFStrategy.java new file mode 100644 index 0000000..b9437aa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderGFStrategy.java @@ -0,0 +1,44 @@ +package org.dromara.zhishu.service.strategy; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryKWRequest; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryRequest; +import org.dromara.zhishu.domain.dto.response.LogisticsMethodResponse; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.util.InterfaceUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class OrderGFStrategy implements OrderStrategy { + + + + @Override + public List deliveryMethodList(Long shopId) { + return null; + } + + @Override + public Boolean orderDelivery(OrderDeliveryRequest request) { + return false; + } + + @Override + public Boolean syncKfzHistoryOrder(Long shopId, Integer days) { + Map orderParams = new HashMap<>(); + orderParams.put("shopId", shopId.toString()); + orderParams.put("days", days.toString()); + //访问go闲鱼服务 + String service = InterfaceUtils.postForm(UrlUtil.getgoofishServiceUrl(), "/huidiao/goofish/getAllGoofishOrderByDays", orderParams); + System.out.println("service:"+service); + + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderKWStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderKWStrategy.java new file mode 100644 index 0000000..0a55247 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderKWStrategy.java @@ -0,0 +1,57 @@ +package org.dromara.zhishu.service.strategy; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zhishu.domain.dto.response.LogisticsMethodResponse; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryKWRequest; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryRequest; +import org.dromara.zhishu.service.client.KfzClient; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class OrderKWStrategy implements OrderStrategy { + + @Autowired + private KfzClient kfzClient; + + @Override + public List deliveryMethodList(Long shopId) { + return kfzClient.deliveryMethodList(UrlUtil.getKfzServiceUrl(), shopId); + } + + @Override + public Boolean orderDelivery(OrderDeliveryRequest request) { + String methodId = request.getMethodId(); + OrderDeliveryKWRequest orderDeliveryKWRequest = new OrderDeliveryKWRequest(); + orderDeliveryKWRequest.setShopId(request.getShopId()); + orderDeliveryKWRequest.setOrderId(Long.valueOf(request.getOrderSn())); + String[] parts = methodId.split("_"); + // 确保分割后的数组有足够的元素 + if (parts.length == 2) { + String shippingId = parts[0]; // 第一部分是shippingId + String shippingCom = parts[1]; // 第二部分是shippingCom + orderDeliveryKWRequest.setShippingId(shippingId); + orderDeliveryKWRequest.setShippingCom(shippingCom); + if (shippingId.equals("other")) orderDeliveryKWRequest.setUserDefined(request.getUserDefined()); + } else { + String shippingId = parts[0]; // 第一部分是shippingId + orderDeliveryKWRequest.setShippingId(shippingId); + } + orderDeliveryKWRequest.setShipmentNum(request.getTrackingNumber()); + orderDeliveryKWRequest.setMoreShipmentNum(request.getMoreShipmentNum()); + R r = kfzClient.orderDelivery(UrlUtil.getKfzServiceUrl(), orderDeliveryKWRequest); + if (R.isError(r)) throw new ServiceException(r.getMsg()); + return r.getData(); + } + + @Override + public Boolean syncKfzHistoryOrder(Long shopId, Integer days) { + String result = kfzClient.fullSynchronizationOrder(UrlUtil.getKfzServiceUrl(), days, "manual", List.of(shopId)); + if (!result.equals("true")) throw new ServiceException("同步历史订单失败:店铺Id-" + shopId); + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderPddStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderPddStrategy.java new file mode 100644 index 0000000..a421331 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderPddStrategy.java @@ -0,0 +1,43 @@ +package org.dromara.zhishu.service.strategy; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zhishu.domain.dto.response.LogisticsMethodResponse; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryPddRequest; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryRequest; +import org.dromara.zhishu.service.client.PddClient; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class OrderPddStrategy implements OrderStrategy { + + @Autowired + private PddClient pddClient; + + @Override + public List deliveryMethodList(Long shopId) { + return pddClient.deliveryMethodList(UrlUtil.getPddServiceUrl()); + } + + @Override + public Boolean orderDelivery(OrderDeliveryRequest request) { + OrderDeliveryPddRequest orderDeliveryPddRequest = new OrderDeliveryPddRequest(); + BeanUtils.copyProperties(request, orderDeliveryPddRequest); + orderDeliveryPddRequest.setLogisticsId(Long.valueOf(request.getMethodId())); + R r = pddClient.orderDelivery(UrlUtil.getPddServiceUrl(), orderDeliveryPddRequest); + if (R.isError(r)) throw new ServiceException(r.getMsg()); + return r.getData(); + } + + @Override + public Boolean syncKfzHistoryOrder(Long shopId, Integer days) { + String result = pddClient.fullSynchronizationOrder(UrlUtil.getPddServiceUrl(), days, "manual", List.of(shopId)); + if (!result.equals("true")) throw new ServiceException("同步历史订单失败:店铺Id-" + shopId); + return true; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderStrategy.java new file mode 100644 index 0000000..19ecae0 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/OrderStrategy.java @@ -0,0 +1,16 @@ +package org.dromara.zhishu.service.strategy; + +import org.dromara.zhishu.domain.dto.response.LogisticsMethodResponse; +import org.dromara.zhishu.domain.dto.request.OrderDeliveryRequest; + +import java.util.List; + +public interface OrderStrategy { + + List deliveryMethodList(Long shopId); + + Boolean orderDelivery(OrderDeliveryRequest request); + + Boolean syncKfzHistoryOrder(Long shopId, Integer days); + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ShopGoodsWlnStrategy.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ShopGoodsWlnStrategy.java new file mode 100644 index 0000000..917ad8e --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/service/strategy/ShopGoodsWlnStrategy.java @@ -0,0 +1,253 @@ +package org.dromara.zhishu.service.strategy; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.zhishu.domain.Shop; +import org.dromara.zhishu.domain.ZhishuShopGoods; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.domain.dto.request.ErpGoodsQueryOlnGoodsRequest; +import org.dromara.zhishu.domain.dto.request.GoodsComparisonRequest; +import org.dromara.zhishu.domain.dto.request.UpdateShopGoodsPriceRequest; +import org.dromara.zhishu.domain.dto.request.ZhishuShopGoodsRequest; +import org.dromara.zhishu.domain.dto.response.ErpGoodsQueryOlnGoodsResponse; +import org.dromara.zhishu.domain.dto.response.WlnBaseResponse; +import org.dromara.zhishu.domain.vo.ShopVo; +import org.dromara.zhishu.enums.TaskTypeEnum; +import org.dromara.zhishu.mapper.ShopMapper; +import org.dromara.zhishu.mapper.ZhishuShopGoodsMapper; +import org.dromara.zhishu.service.client.WlnClient; +import org.dromara.zhishu.service.impl.TaskServiceImpl; +import org.dromara.zhishu.util.CnumberUtils; +import org.dromara.zhishu.util.ExcelFileHandlerUtil; +import org.dromara.zhishu.util.ThreadPoolUtils; +import org.dromara.zhishu.util.UrlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import static cn.dev33.satoken.SaManager.log; + +@Service +public class ShopGoodsWlnStrategy implements ShopGoodsStrategy { + + // 每隔多少秒续期一次 Redis 锁(比如 30 秒) + private static final int INITIAL_DELAY_AND_PERIOD = 30; + + @Autowired + private WlnClient wlnClient; + + @Autowired + private ShopMapper shopMapper; + + @Autowired + private ZhishuShopGoodsMapper zhishuShopGoodsMapper; + + @Autowired + private ScheduledExecutorService scheduledExecutorService; + + @Autowired + private TaskServiceImpl taskServiceImpl; + + @Async + @Override + public void synchronizationGoods(Long shopId) { + // 根据店铺Id查询店铺信息 + Shop shopInfo = new LambdaQueryChainWrapper<>(shopMapper) + .eq(Shop::getId, shopId) + .oneOpt().orElseThrow(() -> new ServiceException("查询不到店铺信息:" + shopId)); + // 获取当前时间 + LocalDateTime now = LocalDateTime.now(); + // 定义格式:YYYY-MM-DD HH:mm:ss + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 格式化当前时间 + String currentDateTime = now.format(formatter); + // 从Redis中获取上次同步时间 + String lastGoodsSynTime = (String) RedisUtils.getCacheObject("lastGoodsSynTime_" + shopInfo.getId()); + ThreadPoolUtils.execute(() -> { + List shopGoodsList = queryShopGoods(shopInfo.getAccount(), shopInfo.getPassword(), shopInfo.getShopNike(), lastGoodsSynTime); + List zhishuShopGoodsRequestList = new ArrayList<>(); + for (ErpGoodsQueryOlnGoodsResponse.Element spu : shopGoodsList) { + ZhishuShopGoodsRequest zhishuShopGoodsRequest = new ZhishuShopGoodsRequest(); + zhishuShopGoodsRequest.setUserId(shopInfo.getCreateBy().toString()); + zhishuShopGoodsRequest.setProductId(spu.getItemId()); + zhishuShopGoodsRequest.setStock(0L); + zhishuShopGoodsRequest.setCreateBy(shopInfo.getCreateBy()); + zhishuShopGoodsRequest.setInventory(0); + zhishuShopGoodsRequest.setGoodsName(spu.getTitle()); + zhishuShopGoodsRequest.setBookPic(spu.getPic()); + if (ObjectUtil.isNotEmpty(spu.getSkus())) { + for (ErpGoodsQueryOlnGoodsResponse.Element.Sku sku : spu.getSkus()) { + zhishuShopGoodsRequest.setGoodsName(sku.getName()); + zhishuShopGoodsRequest.setItemNumber(sku.getSkuId()); + if (ObjectUtil.isNotEmpty(sku.getPic())) zhishuShopGoodsRequest.setBookPic(sku.getPic()); + zhishuShopGoodsRequestList.add(zhishuShopGoodsRequest); + } + } else { + zhishuShopGoodsRequestList.add(zhishuShopGoodsRequest); + } + } + GoodsComparisonRequest request = new GoodsComparisonRequest(); + request.setShopId(shopId); + request.setUserId(shopInfo.getCreateBy()); + request.setZhishuShopGoodsRequestList(zhishuShopGoodsRequestList); + request.setCurrentDateTime(currentDateTime); + goodsComparison(request); + }); + } + + // 获取万里牛商品列表 + public List queryShopGoods(String appKey, String appSecret, String shopNick, String lastGoodsSynTime) { + Boolean pageQueryFlag = true; + List shopGoodsList = new ArrayList<>(); + ErpGoodsQueryOlnGoodsRequest request = new ErpGoodsQueryOlnGoodsRequest(); + request.setShopNick(shopNick); + while (pageQueryFlag) { + WlnBaseResponse response = wlnClient.erpGoodsQueryOlnGoods(UrlUtil.getWlnServiceUrl(), appKey, appSecret, request); + if (response.getCode() != 0) throw new ServiceException("获取万里牛商品列表失败:" + response.getMessage()); + if (ObjectUtil.isNotEmpty(response.getData())) { + shopGoodsList.addAll(response.getData().getElements()); + } + request.setPage(request.getPage() + 1); + pageQueryFlag = response.getData().getNext(); + } + return shopGoodsList; + } + + + // 比对店铺商品信息并生成Excel文件 + public void goodsComparison(GoodsComparisonRequest request) { + Long shopId = request.getShopId(); + Long userId = request.getUserId(); + List zhishuShopGoodsRequestList = request.getZhishuShopGoodsRequestList(); + // 尝试获取锁 + String lockKey = "WriteExcelKey_" + shopId; + String lockValue = "WriteExcelLock"; + Duration lockExpireDuration = Duration.ofMinutes(2); // 设置锁的过期时间为2分钟 + String writeExcelLock = RedisUtils.getCacheObject(lockKey); + // 若获取存在说明存在读取该文件的线程,则直接返回,不进行后续操作 + if (ObjectUtil.isNotEmpty(writeExcelLock)) throw new ServiceException("已在处理该文件,请勿重复操作"); + System.out.println("获取到redis锁,执行读取文件操作"); + // 若不存在,则设置锁,并执行后续操作 + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + ScheduledExecutorService scheduler = null; + ScheduledFuture future = null; + try { + scheduler = Executors.newScheduledThreadPool(1); + // 设置一个定时任务来不断延长锁的过期时间 + Runnable renewLockTask = () -> { + RedisUtils.setCacheObject(lockKey, lockValue, lockExpireDuration); + System.out.println("Redis锁过期时间已更新"); + }; + // 启动定时任务 + future = scheduler.scheduleAtFixedRate(renewLockTask, 0, INITIAL_DELAY_AND_PERIOD, TimeUnit.SECONDS); + + // 使用并发流处理 + List changedData = Collections.synchronizedList(new ArrayList<>()); + List newData = Collections.synchronizedList(new ArrayList<>()); + + for (ZhishuShopGoodsRequest zhishuShopGoodsRequest : zhishuShopGoodsRequestList) { + if (!ObjectUtil.isEmpty(zhishuShopGoodsRequest.getItemNumber())) { + // 查出数据库是否存在数据 + List list = new LambdaQueryChainWrapper<>(zhishuShopGoodsMapper) + .eq(ZhishuShopGoods::getItemNumber, zhishuShopGoodsRequest.getItemNumber()) + .list(); + if (!ObjectUtil.isNotEmpty(list)) { + newData.add(zhishuShopGoodsRequest); + } + } else { + // 查出数据库是否存在数据 + List list = new LambdaQueryChainWrapper<>(zhishuShopGoodsMapper) + .eq(ZhishuShopGoods::getProductId, zhishuShopGoodsRequest.getProductId()) + .list(); + if (!ObjectUtil.isNotEmpty(list)) { + newData.add(zhishuShopGoodsRequest); + } + } + } + + List fileNameList = new ArrayList<>(); + // 分别指定新增和修改的数据生成的Excel文件存储路径,文件名称前缀,并写到该路径下 + if (!changedData.isEmpty()) { + fileNameList.add("Changed_" + shopId + "_0.xlsx"); + ExcelFileHandlerUtil.handleExport(changedData, UrlUtil.getUrl(), "Changed", shopId.toString(), ZhishuShopGoodsRequest.class); + } + if (!newData.isEmpty()) { + fileNameList.add("New_" + shopId + "_0.xlsx"); + ExcelFileHandlerUtil.handleExport(newData, UrlUtil.getUrl(), "New", shopId.toString(), ZhishuShopGoodsRequest.class); + } + + + RedisUtils.setCacheObject("lastGoodsSynTime_" + shopId, request.getCurrentDateTime()); + + if (!newData.isEmpty() || !changedData.isEmpty()) { + // 根据店铺Id查询店铺信息 + Shop shopInfo = new LambdaQueryChainWrapper<>(shopMapper) + .eq(Shop::getId, shopId) + .oneOpt().orElseThrow(() -> new ServiceException("查询不到店铺信息:" + shopId)); + // 将任务信息插入到数据库中,创建一条任务 + TaskBo taskBo = new TaskBo(); + taskBo.setTaskType(TaskTypeEnum.SYNC_GOODS_WLN.getCode()); + taskBo.setShopIds(shopId.toString()); + taskBo.setShopNames(shopInfo.getShopName()); + taskBo.setFileName(String.join("/", fileNameList)); + taskBo.setDataNum((long) zhishuShopGoodsRequestList.size()); + taskBo.setTaskStatus("0"); + taskBo.setStatus("0"); + taskBo.setCreateBy(userId); + taskServiceImpl.insertByBo(taskBo); + } + + // 发送消息给前端告知拉取下来的数据已比对完毕 + scheduledExecutorService.schedule(() -> + + { + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("已拉取到商品数据总计:" + zhishuShopGoodsRequestList.size() + "条,新增:" + newData.size() + "条新数据,更新:" + changedData.size() + "条数据"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }, 5, TimeUnit.SECONDS); + } catch (Exception e) { + // 捕获其他未知异常 + log.error("商品导入写入Excel过程中发生异常: {}", e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } finally { + // 取消定时任务 + if (future != null) { + future.cancel(false); + } + // 关闭线程池 + if (scheduler != null) { + scheduler.shutdownNow(); + } + // 确保释放锁 + RedisUtils.deleteObject(lockKey); + System.out.println("已释放redis锁"); + } + + } + + @Override + public Boolean setShopGoodsOnSaleStatus(Long mallId, String token, Integer isOnSale, List ItemList) { + return false; + } + + @Override + public Boolean updateShopGoodsPrice(Long mallId, String token, List ItemList) { + return false; + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ArtNoUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ArtNoUtil.java new file mode 100644 index 0000000..febb3f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ArtNoUtil.java @@ -0,0 +1,99 @@ +package org.dromara.zhishu.util; + +import org.dromara.common.core.utils.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 货号工具类 + */ +public class ArtNoUtil { + + public Map parseArtNo(String artNo) { + /** + * 从货号前五位解析 一级 二级 三级 货区编码 + */ + Map result = new HashMap<>(); + + if (artNo == null || artNo.length() < 5) { + throw new IllegalArgumentException("货号长度不能少于5位"); + } + + String depotFive = artNo.substring(0, 5); + + // 1.字符串前两位是一级货区 + String depotLevel = depotFive.substring(0, 2); + result.put("depotLevel", depotLevel); + + // 2.字符串第三位如果是数字 则二级货区1位 ,字符串如果是字母 则 二级货区2位 + String shelvesLevel; + String freightLevel; + + char freightChar = depotFive.charAt(2); + if (Character.isDigit(freightChar)) { + // 二级货区1位 + shelvesLevel = String.valueOf(freightChar); + // 3.如果二级货区编码只有一位 则三级货区是两位 + freightLevel = depotFive.substring(3, 5); + } else { + // 二级货区2位 + shelvesLevel = depotFive.substring(2, 4); + // 3.如果二级货区两位 则三级货区一位 + freightLevel = depotFive.substring(4, 5); + } + + result.put("shelvesLevel", shelvesLevel); + result.put("freightLevel", freightLevel); + + return result; + } + + /** + * 校验货号是否符合规则 + * @param artNo 货号 + * @return 是否符合规则 + */ + public static boolean validateArtNo(String artNo) { + // 长度校验 + if ( StringUtils.isEmpty(artNo) || artNo.length() < 19) { + return false; + } + + String depotFive = artNo.substring(0, 5); + + // 校验前两位(一级货区) + String depotLevel = depotFive.substring(0, 2); + // 这里可以根据实际需求添加对一级货区的具体校验 + + char thirdChar = depotFive.charAt(2); + + // 第一种情况:第三位是数字 + if (Character.isDigit(thirdChar)) { + // 二级货区1位(第三位),三级货区2位(第四、五位) + String freightLevel = depotFive.substring(3, 5); + + // 校验三级货区格式:纯数字 或者 第四位是字母+第五位是数字 + char fourthChar = freightLevel.charAt(0); + char fifthChar = freightLevel.charAt(1); + + // 情况1:纯数字 + boolean isAllDigits = Character.isDigit(fourthChar) && Character.isDigit(fifthChar); + + // 情况2:第四位是字母 + 第五位是数字 + boolean isLetterAndDigit = Character.isLetter(fourthChar) && Character.isDigit(fifthChar); + + return isAllDigits || isLetterAndDigit; + } + // 第二种情况:第三位是字母 + else if (Character.isLetter(thirdChar)) { + // 二级货区2位(第三、四位),三级货区1位(第五位) + // 第四位不需要管,直接校验第五位是否是数字 + char fifthChar = depotFive.charAt(4); + return Character.isDigit(fifthChar); + } + + // 如果第三位既不是数字也不是字母,返回false + return false; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/Base64Utils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/Base64Utils.java new file mode 100644 index 0000000..03341a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/Base64Utils.java @@ -0,0 +1,56 @@ +package org.dromara.zhishu.util; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Base64; + +public class Base64Utils { + + /** + * 从指定URL读取CSV文件并返回Base64编码字符串 + * + * @param csvUrl CSV文件的网络路径 + * @return Base64编码的文件内容 + * @throws IOException 网络连接或文件读取异常 + */ + public static String readCsvAndEncodeToBase64(String csvUrl) throws IOException { + HttpURLConnection connection = null; + try { + URL url = new URL(csvUrl); + connection = (HttpURLConnection) url.openConnection(); + + // 设置请求属性 + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); // 连接超时5秒 + connection.setReadTimeout(10000); // 读取超时10秒 + connection.setRequestProperty("User-Agent", "Mozilla/5.0"); + + // 检查响应码 + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new IOException("Failed to download file. HTTP response code: " + responseCode); + } + + // 读取文件内容并转换为Base64 + try (InputStream inputStream = connection.getInputStream(); + ByteArrayOutputStream buffer = new ByteArrayOutputStream()) { + + byte[] data = new byte[1024]; + int bytesRead; + + while ((bytesRead = inputStream.read(data)) != -1) { + buffer.write(data, 0, bytesRead); + } + + byte[] fileBytes = buffer.toByteArray(); + return Base64.getEncoder().encodeToString(fileBytes); + } + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/CnumberUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/CnumberUtils.java new file mode 100644 index 0000000..a902a78 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/CnumberUtils.java @@ -0,0 +1,804 @@ +package org.dromara.zhishu.util; + + +import com.baomidou.mybatisplus.core.toolkit.Assert; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.zhishu.domain.TDepot; +import org.dromara.zhishu.domain.TFreight; +import org.dromara.zhishu.domain.TShelves; +import org.dromara.zhishu.domain.vo.FreightGoodsCountVo; +import org.dromara.zhishu.mapper.TDepotMapper; +import org.dromara.zhishu.mapper.TShelvesMapper; +import org.dromara.zhishu.mapper.ZhishuShopGoodsMapper; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static org.apache.commons.lang3.ObjectUtils.isEmpty; + +/** + * CnumberUtils 类用于生成货号 + */ +@Component +@Log4j2 +@RequiredArgsConstructor +public class CnumberUtils { + @Resource + TDepotMapper tDepotMapper; + @Resource + TShelvesMapper tShelvesMapper; + @Resource + ZhishuShopGoodsMapper baseMapper; + //品相对应的数值 + private static final double[] CONDITION_CODES={1,2,3,4,5,6,6.5,7,7.5,8,8.5,9,9.5,10}; + // 品相对应的字母标识 + private static final String[] CONDITION_CODE={"A","B","C","D","E","F","G","H","I","J","K","L","M","N"}; + + // 品相对应的中文标识 + private static final String[] CHINESE_CODE={"一品","二品","三品","四品","五品","六品","六五品","七品","七五品","八品","八五品","九品","九五品","全新"}; + + //字母转数值 + private static final Map QUALITY_MAP = new HashMap<>(); + static { + QUALITY_MAP.put("A", "10"); + QUALITY_MAP.put("B", "20"); + QUALITY_MAP.put("C", "30"); + QUALITY_MAP.put("D", "40"); + QUALITY_MAP.put("E", "50"); + QUALITY_MAP.put("F", "60"); + QUALITY_MAP.put("G", "65"); + QUALITY_MAP.put("H", "70"); + QUALITY_MAP.put("I", "75"); + QUALITY_MAP.put("J", "80"); + QUALITY_MAP.put("K", "85"); + QUALITY_MAP.put("L", "90"); + QUALITY_MAP.put("M", "95"); + QUALITY_MAP.put("N", "100"); + + QUALITY_MAP.put("10","A"); + QUALITY_MAP.put("20","B"); + QUALITY_MAP.put("30","C"); + QUALITY_MAP.put("40","D"); + QUALITY_MAP.put("50","E"); + QUALITY_MAP.put("60","F"); + QUALITY_MAP.put("65","G"); + QUALITY_MAP.put("70","H"); + QUALITY_MAP.put("75","I"); + QUALITY_MAP.put("80","J"); + QUALITY_MAP.put("85","K"); + QUALITY_MAP.put("90","L"); + QUALITY_MAP.put("95","M"); + QUALITY_MAP.put("100","N"); + + QUALITY_MAP.put("一品","10"); + QUALITY_MAP.put("二品","20"); + QUALITY_MAP.put("三品","30"); + QUALITY_MAP.put("四品","40"); + QUALITY_MAP.put("五品","50"); + QUALITY_MAP.put("六品","60"); + QUALITY_MAP.put("六五品","65"); + QUALITY_MAP.put("七品","70"); + QUALITY_MAP.put("七五品","75"); + QUALITY_MAP.put("八品","80"); + QUALITY_MAP.put("八五品","85"); + QUALITY_MAP.put("九品","90"); + QUALITY_MAP.put("九五品","95"); + QUALITY_MAP.put("全新","100"); + } + //数字转中文 + public static final Map NUM_CHINESE_MAP = new HashMap<>(); + static { + NUM_CHINESE_MAP.put("10","一品"); + NUM_CHINESE_MAP.put("20","二品"); + NUM_CHINESE_MAP.put("30","三品"); + NUM_CHINESE_MAP.put("40","四品"); + NUM_CHINESE_MAP.put("50","五品"); + NUM_CHINESE_MAP.put("60","六品"); + NUM_CHINESE_MAP.put("65","六五品"); + NUM_CHINESE_MAP.put("70","七品"); + NUM_CHINESE_MAP.put("75","七五品"); + NUM_CHINESE_MAP.put("80","八品"); + NUM_CHINESE_MAP.put("85","八五品"); + NUM_CHINESE_MAP.put("90","九品"); + NUM_CHINESE_MAP.put("95","九五品"); + NUM_CHINESE_MAP.put("100","全新"); + } + private static final String BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + + private static final String CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final int BASE = 62; + + + /** + * 单品上书获取货号 + * + * @param conCode 品相 + * @param userId 用户ID + * @param isbn ISBN号 + * @param depotId 仓库ID + * @param sheId 货架ID + * @param freId 自由区ID + * @return 生成的货号 + */ + public String getArtNo(Double conCode, Long userId, String isbn, Long depotId, Long sheId, Long freId,String Series) { + + if (conCode == null) { + throw new IllegalArgumentException("品相和用户ID不能为空"); + } + // 获取条件码 + String conditionCode = getConditionCode(conCode); + String goodNumber = ""; + String depotCode = ""; + String sheCode = ""; + String freCode = ""; + String newisbn=""; + // ISBN 处理逻辑 + if (StringUtils.isEmpty(isbn)) { + String newisbn1 = generateRandomIsbn(); + newisbn = convertISBN(newisbn1); + saveIsbn(newisbn1,newisbn); +// String oldisbn = revertRandomISBN(newisbn); + } else { + if(isbn.length() < 13) { + String newIsbnCon = convert8To13(isbn); + newisbn=convertISBN(newIsbnCon); + saveIsbn(newIsbnCon,newisbn); +// String oldisbn = revertISBN(newisbn); + // 判断数据库中是否有oldisbn和newisbn的数据 +// Integer number = tDepotMapper.selectByNewIsbn(Long.parseLong(isbn), Long.parseLong(newisbn)); +//// // 如果数据库中没有oldisbn和newisbn的数据,则插入数据 +// if (number == 0) { +// tDepotMapper.insertIsbn(Long.parseLong(isbn), Long.parseLong(newisbn)); +// } + }else if(isbn.length()==13){ + newisbn= convertISBN(isbn); + saveIsbn(isbn,newisbn); + // String oldisbn = revertISBN(newisbn); +// newisbn=isbn; + } + } + // 仓库id不能为空 + if(depotId==null){ + throw new RuntimeException("仓库ID不能为空"); + } + //二级货区必须存在 + List sheCount= baseMapper.selectSheCount(depotId); + if(sheCount.size()==0){ + throw new RuntimeException("二级货区为空"); + } + //三级货区必须存在 + List freCount=baseMapper.selectFreCount1(sheCount); + if(freCount.size()==0){ + throw new RuntimeException("三级货区为空"); + } + Map map=new HashMap<>(); + //查询出货架编码sheCode与之匹配货架编码freCode + sheCount.forEach(she -> { + // 跳过无效code长度(非1位或2位) + if (she.getCode().length() != 1 && she.getCode().length() != 2) { + return; // 在forEach中相当于continue + } + // 查询货架编码 + List tFreight = baseMapper.selectBySId(she.getId()); + if (tFreight == null) { + return; // 跳过空数据 + } + for (int i = 0; i < tFreight.size(); i++) { + if(tFreight.get(i).getCode() == null){ + return; // 跳过空数据 + } + // 核心匹配逻辑,将符合的数据添加到map中 + if ((she.getCode().length() == 2 && tFreight.get(i).getCode().length() == 1) || + (she.getCode().length() == 1 && tFreight.get(i).getCode().length() == 2)) { + map.put(tFreight.get(i).getId(), she.getId()); + } + } + }); + // 判断map是否为空 + if(map.isEmpty()){ + throw new RuntimeException("货区不存在"); + } + + // 根据不同 ID 情况生成对应的代码 + if (isEmpty(depotId)) { + depotCode = tDepotMapper.selectByCode(userId, depotId); + sheCode = tShelvesMapper.selectFreCode(depotCode, userId); + freCode = String.valueOf(generateRandomNumber(1, 5)); + } else if (isEmpty(sheId)) { + // 1. 转换为可随机访问的Entry集合 + List> entries = new ArrayList<>(map.entrySet()); + // 2. 线程安全随机选择(Java 8+) + if (!entries.isEmpty()) { + Map.Entry randomEntry = entries.get( + ThreadLocalRandom.current().nextInt(entries.size()) + ); + freId = randomEntry.getKey(); + sheId = randomEntry.getValue(); + } + depotCode = tDepotMapper.selectByCode(userId, depotId); + sheCode = tShelvesMapper.selectSCode(sheId); + freCode = tShelvesMapper.selectByFreCode(freId); +// freCode = String.valueOf(generateRandomNumber(1, 5)); + } else if (isEmpty(freId)) { + // 1. 转换为可随机访问的Entry集合 + List> entries = new ArrayList<>(map.entrySet()); + // 2. 线程安全随机选择(Java 8+) + if (!entries.isEmpty()) { + Map.Entry randomEntry = entries.get( + ThreadLocalRandom.current().nextInt(entries.size()) + ); + freId = randomEntry.getKey(); + sheId = randomEntry.getValue(); + } + depotCode = tDepotMapper.selectByCode(userId, depotId); + sheCode = tShelvesMapper.selectSCode(sheId); + freCode = tShelvesMapper.selectByFreCode(freId); +// freCode = String.valueOf(generateRandomNumber(1, 5)); + } else { + depotCode = tDepotMapper.selectByCode(userId, depotId); + sheCode = tShelvesMapper.selectSCode(sheId); + freCode = tShelvesMapper.selectByFreCode(freId); + } + // 构建最终的货号 + goodNumber = buildArtNo(depotCode, sheCode, freCode, conditionCode, newisbn, Series); + return goodNumber; + } + + + + /** + * Excel表上传生成货号 + * @param conCode + * @param userId + * @param isbn + * @param depotId + * @param sheId + * @param freId + * @param Series + * @param tDepotList + * @param tShelvesList + * @param tFreightList + * @return + */ + public String getArtNo(Double conCode, Long userId, String isbn, Long depotId, Long sheId, Long freId,String Series,List tDepotList ,List tShelvesList,List tFreightList){ + // 检查必要参数 + if (conCode == null) { + throw new IllegalArgumentException("品相和用户ID不能为空"); + } + // 获取条件码 + String conditionCode = getConditionCode(conCode); + String goodNumber = ""; + String depotCode = ""; + String sheCode = ""; + String freCode = ""; + String newisbn=""; + // ISBN 处理逻辑 + if (StringUtils.isEmpty(isbn)) { + String newisbnCon = generateRandomIsbn(); + newisbn = convertISBN(newisbnCon); +// saveIsbn(newisbnCon,newisbn); +// 解压isbn + // String oldisbn = revertRandomISBN(newisbn); + } else { + if(isbn.length() < 13) { + String newisbnCon = convert8To13(isbn); + newisbn = convertISBN(newisbnCon); +// saveIsbn(isbn,newisbnCon); + // String oldisbn = revertISBN(newisbn); + }else if(isbn.length()==13){ + newisbn= convertISBN(isbn); +// String oldisbn = revertISBN(newisbn); +// saveIsbn(isbn,newisbn); + } + } + int randomIndex = ThreadLocalRandom.current().nextInt(tDepotList.size()); + if (isEmpty(depotId)) { + depotCode= tDepotList.get(randomIndex).getCode(); + sheCode = getShe(tDepotList.get(randomIndex).getId(),sheId,tShelvesList); + freCode = String.valueOf(generateRandomNumber(1, 5)); + }else if (isEmpty(sheId)) { + for ( TDepot tDepot : tDepotList){ + if (tDepot.getId().equals(depotId)) { + depotCode = tDepot.getCode(); + sheCode = getShe(tDepot.getId(),sheId,tShelvesList); + } + } + freCode = String.valueOf(generateRandomNumber(1, 5)); + }else if (isEmpty(freId)) { + for ( TDepot tDepot : tDepotList){ + if (tDepot.getId().equals(depotId)) { + depotCode = tDepot.getCode(); + } + } + sheCode = getShe(depotId,sheId,tShelvesList); + freCode = String.valueOf(generateRandomNumber(1, 5)); + }else { + for ( TDepot tDepot : tDepotList){ + if (tDepot.getId().equals(depotId)) { + depotCode = tDepot.getCode(); + } + } + sheCode = getShe(depotId,sheId,tShelvesList); + freCode = getFre(sheId,freId,tFreightList); + } + // 构建最终的货号 + goodNumber = buildArtNo(depotCode, sheCode, freCode, conditionCode, newisbn, Series); + return goodNumber; + } + +// 保存原始和压缩后的isbn数据 +//@Transactional +private void saveIsbn(String newisbnCon,String oldisbn){ + // 判断数据库中是否有oldisbn和newisbn的数据 + Integer number = tDepotMapper.selectByNewIsbn(Long.parseLong(newisbnCon), oldisbn); + // 如果数据库中没有oldisbn和newisbn的数据,则插入数据 + if (number == 0) { + tDepotMapper.insertIsbn(Long.parseLong(newisbnCon),oldisbn); + } + } + + + /** + * 获取货架编码sheCode + * @param depotId + * @param sheId + * @param tShelvesList + * @return + */ + private String getShe(Long depotId,Long sheId,List tShelvesList) { + String sheCode=""; + if(sheId!=null){ + for ( TShelves tShelves : tShelvesList){ + if (tShelves.getId().equals(sheId)) { + sheCode = tShelves.getCode(); + } + } + }else{ + List list= tShelvesList.stream().filter(tShelves -> tShelves.getDepotId().equals(depotId)).collect(Collectors.toList()); + int randomIndex = ThreadLocalRandom.current().nextInt(list.size()); + sheCode=list.get(randomIndex).getCode(); + } + return sheCode; + } + + + /** + * 获取货位编码freCode + * @param shelvesId + * @param freightId + * @param tFreightList + * @return + */ + private String getFre(Long shelvesId,Long freightId,List tFreightList) { + String freCode=""; + if(freightId!=null){ + for ( TFreight tFreight : tFreightList){ + if (tFreight.getId().equals(freightId)) { + freCode = tFreight.getCode(); + } + } + }else{ + List list= tFreightList.stream().filter(tFreight -> tFreight.getShelvesId().equals(shelvesId)).collect(Collectors.toList()); + int randomIndex = ThreadLocalRandom.current().nextInt(list.size()-1); + freCode=list.get(randomIndex).getCode(); + } + return freCode; + } + + + + // 生成A-Z或0-9的随机字符 +// public static char generateRandomChar() { +// int randomChoice = ThreadLocalRandom.current().nextInt(36); // 0-35 +// if (randomChoice < 26) { +// // 生成A-Z(ASCII码65-90) +// return (char) (randomChoice + 65); +// } else { +// // 生成0-9(ASCII码48-57),或直接数字转字符 +// return (char) (randomChoice - 26 + 48); +// } +// } + + + + + // 辅助方法:生成随机13位 ISBN + public static String generateRandomIsbn() { + StringBuilder sb = new StringBuilder(13); + ThreadLocalRandom random = ThreadLocalRandom.current(); + //国定第一个字符为6 + sb.append(678); + for (int i = 0; i < 10; i++) { + sb.append(random.nextInt(10)); // 生成0-9随机数 + } + return sb.toString(); + } + + + + /** + * 生成指定范围内的随机数 + * + * @param min 最小值 + * @param max 最大值 + * @return 随机数 + */ + private int generateRandomNumber(int min, int max) { + Random random=new Random(); + return random.nextInt(max - min + 1) + min; + } + + + + /** + * 构建货号 + * + * @param depotCode 仓库代码 + * @param sheCode 货架代码 + * @param freCode 自由区代码 + * @param conditionCode 品相 + * @param isbn ISBN号 + * @return 拼接后的货号 + */ + private String buildArtNo(String depotCode, String sheCode, String freCode, String conditionCode, String isbn,String Series) { + + //Series为空时,默认为A + if(isEmpty(Series)){ + Series="A"; + } +// 毫秒级时间戳 + long timestamp = System.currentTimeMillis(); + String time = encodeBase62(timestamp); + StringBuilder builder = new StringBuilder(); + builder.append(depotCode).append(sheCode).append(freCode).append(conditionCode).append(isbn).append(Series).append(time); + return builder.toString(); + } + + + // 品相映射表 + public static final Map CODE_MAP = IntStream.range(0, CONDITION_CODES.length).boxed().collect(Collectors.toMap( + i -> CONDITION_CODES[i], //键:数字标识(如"1") + i -> CONDITION_CODE[i], //值:字母标识(如"A") + (oldVal, newVal) -> oldVal, () -> new TreeMap<>(Comparator.comparingDouble(Double::doubleValue)))); + + + + public static final Map CHINESE_TO_CODE_MAP = IntStream.range(0, CHINESE_CODE.length).boxed().collect(Collectors.toMap( + i -> CHINESE_CODE[i], // 键:中文标识(如"一品") + i -> CONDITION_CODE[i], // 值:字母标识(如"A") + (oldVal, newVal) -> oldVal, + LinkedHashMap::new)); // 保持插入顺序 + + + public String convertChineseToCode(String chineseName) { + String code = CHINESE_TO_CODE_MAP.get(chineseName); + if (code == null) { + throw new IllegalArgumentException("无效的中文品名: " + chineseName); + } + return code; + } + + + /** + * 品相 字母对应 数字 + */ + public static String getQualityNum(String qualityStr){ + return QUALITY_MAP.getOrDefault(qualityStr, "UNDEFINED"); + } + + /** + * 根据输入的数值获取对应的条件代码 + * + * @param input 输入的数值,用于查找对应的条件代码 + * @return 对应的条件代码,如果找不到则返回"UNDEFINED" + */ + public static String getConditionCode(double input) { + return CODE_MAP.getOrDefault(input, "UNDEFINED"); + } + + /** + * 将ISBN-8转换为ISBN-13 + * + * @param isbn8 ISBN-8格式的字符串 + * @return ISBN-13格式的字符串 + * @throws IllegalArgumentException 如果输入的ISBN-8格式不正确,则抛出异常 + */ + public static String convert8To13(String isbn8) { + // 移除所有非数字字符 + String cleaned = isbn8.replaceAll("[^0-9]", ""); + + // 验证输入长度 + if (cleaned.length() != 8) { + throw new IllegalArgumentException("ISBN-8必须包含8位数字"); + } + + // 在前面添加978前缀 + String prefix = "978" + cleaned.substring(0, 7)+"00"; + // 计算新的校验位 + int checkDigit = calculateCheckDigit13(prefix); + // 返回完整的ISBN-13 + return prefix + checkDigit; + } + + /** + * 计算ISBN-13的校验位 + * + * @param digits ISBN-13的前12位数字 + * @return 计算得到的校验位 + */ + private static int calculateCheckDigit13(String digits) { + int sum = 0; + + for (int i = 0; i < digits.length(); i++) { + int digit = Character.getNumericValue(digits.charAt(i)); + // 奇数位(从0开始计数)乘以1,偶数位乘以3 + sum += (i % 2 == 0) ? digit * 1 : digit * 3; + } + int remainder = sum % 10; + return (remainder == 0) ? 0 : 10 - remainder; + } + + /** + * 书籍自动分配货区 + * + * @param freightGoodsCountList 货区商品数量列表 调用ZhishuShopGoodsMapper的selectFreightGoodsNumber()方法获得 + * @return 自动分配货区结果 + */ + public static FreightGoodsCountVo autoAllocatingAreas(List freightGoodsCountList) { + Assert.isTrue(!freightGoodsCountList.isEmpty(), "该用户下或没有库房区域,请检查后重试"); + // 找到最低的商品数量 + int minGoodsCount = Integer.MAX_VALUE; + for (FreightGoodsCountVo item : freightGoodsCountList) { + if (item.getGoodsCount() < minGoodsCount) { + minGoodsCount = item.getGoodsCount(); + } + } + // 收集所有具有最低商品数量的记录 + List minGoodsCountItems = new ArrayList<>(); + for (FreightGoodsCountVo item : freightGoodsCountList) { + if (item.getGoodsCount() == minGoodsCount) { + minGoodsCountItems.add(item); + } + } + // 如果有多个相同最低数量的记录,随机选择一个 + if (!minGoodsCountItems.isEmpty()) { + Random random = new Random(); + return minGoodsCountItems.get(random.nextInt(minGoodsCountItems.size())); + } + // 在正常情况下不会到达这里 + return null; + } + + + + + /** + * ISBN压缩 + * + * @param originalISBN 原始的ISBN + * @return 转换后的ISBN + */ + public static String convertISBN(String originalISBN) { + // 提取ISBN的前四位 + String firstFour = originalISBN.substring(0, 4); + // 提取ISBN的后九位 + String lastNine = originalISBN.substring(4, 13); + + // 对前四位进行编码 + String encodedFirstFour = encodeFirstFour(firstFour); + // 对后九位进行编码 + String encodedLastNine = encodeLastNine(lastNine); + // 返回编码后的ISBN + return encodedFirstFour + encodedLastNine; + } + + //正常isbn全部解压 + public static String revertISBN(String convertedISBN) { + String encodedFirstFour = convertedISBN.substring(0, 1); + String encodedLastNine = convertedISBN.substring(1, 6); + + String decodedFirstFour = decodeFirstFour(encodedFirstFour); + String decodedLastNine = decodeLastNine(encodedLastNine); + + return decodedFirstFour + decodedLastNine; + } + + //自定义isbn全部解压 + public static String revertRandomISBN(String convertedISBN) { + String encodedFirstFour = convertedISBN.substring(0, 1); + String encodedLastNine = convertedISBN.substring(1, 6); + + String decodedFirstFour = decodeRandomFirstFour(encodedFirstFour); + String decodedLastNine = decodeLastNine(encodedLastNine); + + return decodedFirstFour + decodedLastNine; + } + + /** + * 将字符串中的前四位数字转换为对应的字母 + * 此方法旨在处理特定格式的数据转换,将数字字符串的每一位数字映射到字母, + * 以便用于可能的编码或加密需求每个数字对应字母的规则是基于ASCII码, + * 数字0对应字母'A',1对应'B',以此类推 + * + * @param firstFour 一个包含四位数字的字符串如果输入的字符串不全为数字或者长度不是四, + * 将抛出IllegalArgumentException异常 + * @return 转换后的由字母组成的字符串 + * @throws IllegalArgumentException 如果输入字符串中包含非数字字符,抛出此异常 + */ + private static String encodeFirstFour(String firstFour) { + StringBuilder sb = new StringBuilder(); + if(firstFour.equals("9777")){ + sb.append('a'); + } + // 常规编码逻辑(9780-9789 → A-Z) + if (firstFour.startsWith("978") && firstFour.length() == 4) { + int lastDigit = firstFour.charAt(3) - '0'; + if (lastDigit >= 0 && lastDigit <= 9) { + sb.append((char) ('A' + lastDigit)); +// return String.valueOf((char)('A' + lastDigit)); + } + } + if (firstFour.startsWith("678") && firstFour.length() == 4) { + int lastDigit = firstFour.charAt(3) - '0'; + if (lastDigit >= 0 && lastDigit <= 9) { + sb.append((char) ('A' + lastDigit)); + } + } + return sb.toString(); + } + + +// 解压正常isbn前1位 + private static String decodeFirstFour(String encoded) { + StringBuilder sb = new StringBuilder(); + //将encoded转换为字符 + char encod = encoded.charAt(0); + if(encod==97){ + sb.append("9777"); + }else{ + // 校验输入范围(A-J) + if (encod < 'A' || encod > 'J') { + throw new IllegalArgumentException("输入字母必须为A-J之间"); + }else{ + // 计算数字部分(A=0, B=1,... J=9) + int digit = encod - 'A'; + String con= "978" + digit; + sb.append(con); + } + } + + // 返回构建好的字符串 + return sb.toString(); + } + + + // 解压自定义isbn前1位 + private static String decodeRandomFirstFour(String encoded) { + StringBuilder sb = new StringBuilder(); + //将encoded转换为字符 + char encod = encoded.charAt(0); + + int digit = encod - 'A'; + String con= "678" + digit; + sb.append(con); + // 返回构建好的字符串 + return sb.toString(); + } + + + + /** + * 将最后九位数字编码为Base64字符串 + * 此方法首先验证输入的最后九位数字是否有效,然后将其转换为Base64编码的字符串 + * 选择Base64编码是因为它可以在不增加存储空间的情况下,有效处理数字信息 + * 为何使用5作为toBase64的第二个参数:这里的5是根据具体的编码需求和目标字符集大小来选择的, + * 由于Base64字符集有64个字符,使用5个字符可以表示的数字范围与9位数字相符 + * + * @param lastNine 一个字符串,包含最后九位数字 + * @return 编码后的Base64字符串 + * @throws IllegalArgumentException 如果输入的数字不是9位 + */ + private static String encodeLastNine(String lastNine) { + // 验证输入的最后九位数字是否为有效的9位数字 + validateNineDigits(lastNine); + // 将验证过的字符串转换为长整型数字,以便进行后续的编码处理 + long number = Long.parseLong(lastNine); + // 使用Base64编码方式将数字编码为字符串,这里指定编码长度为5 + return toBase64(number, 5); + } + + private static String toBase64(long number, int length) { + char[] chars = new char[length]; + for (int i = length - 1; i >= 0; i--) { + chars[i] = BASE64_CHARS.charAt((int) (number % 64)); + number /= 64; + } + if (number != 0) { + throw new IllegalArgumentException("Number too large"); + } + return new String(chars); + } + +// isbn前4位压缩 + private static String decodeLastNine(String encoded) { + long number = fromBase64(encoded); + return String.format("%09d", number); + } + + +// 压缩毫秒级时间戳 + private static long fromBase64(String encoded) { + // 前置校验 + if (encoded == null || encoded.length() != 5) { + throw new IllegalArgumentException("必须为5位编码字符串"); + } + + // 解码计算 + long result = 0; + for (char c : encoded.toCharArray()) { + int index = BASE64_CHARS.indexOf(c); + if (index == -1) throw new IllegalArgumentException("非法字符: " + c); + if (result > (Long.MAX_VALUE - 63) / 64) { + throw new ArithmeticException("数值溢出"); + } + result = result * 64 + index; + } + return result; + } + + private static void validateNineDigits(String s) { + // 使用正则表达式检查字符串是否为9位数字 + if (!s.matches("\\d{9}")) { + // 如果不是9位数字,抛出异常并提示必须为9位数字 + throw new IllegalArgumentException("必须为9位数字"); + } + } + + + + + + /** + * 编码为 base62,结果填充至长度 7 + */ + public static String encodeBase62(long num) { + // 特殊情况处理:当输入数字为0时,直接返回编码字符的第一个字符 + if (num == 0) { + return CHARS.substring(0, 1); + } + + StringBuilder sb = new StringBuilder(); + // 循环将输入数字除以基数,并将余数转换为对应的Base62字符添加到字符串构建器中 + while (num > 0) { + long rem = num % BASE; + sb.append(CHARS.charAt((int) rem)); + num /= BASE; + } + // 将字符串构建器中的字符反转,以获得正确的编码顺序 + String encoded = sb.reverse().toString(); + // 填充到7位 + // 确保编码后的字符串长度至少为7位,不足7位时在前面补0 + return String.format("%7s", encoded).replace(' ', '0'); + } + + /** + * 解码 base62 字符串为 long 数值 + */ + public static long decodeBase62(String s) { + long num = 0; + for (char c : s.toCharArray()) { + num = num * BASE + CHARS.indexOf(c); + } + return num; + } + + +} + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ContentUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ContentUtils.java new file mode 100644 index 0000000..21272b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ContentUtils.java @@ -0,0 +1,104 @@ +package org.dromara.zhishu.util; + +import com.hankcs.hanlp.HanLP; +import com.hankcs.hanlp.seg.common.Term; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + + +public class ContentUtils { + + + + /** + * 在章节词(如 第一、第1)前插入换行符 + */ + public static String insertLineBreakBeforeChapter(String text) { + // 匹配 "第一章"、"第一节"、"第1章"、"第12节" + return text.replaceAll("(第[一二三四五六七八九十零百千万]+[章|节]|第\\d+[章|节])", "\n$1"); } + + /** + * 判断字符串是否为章节标题格式,如: + * 第一章、第一节、第一、第1章、第1节 + */ + public static boolean isChapterTitle(String word) { + return word.matches("第[一二三四五六七八九十零百千万]+[章|节]") || // 中文数字 + 章/节 + word.matches("第\\d+[章|节]"); // 阿拉伯数字 + 章/节 + } + + public static String applyLineBreaks(String text) { + List sentences = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + +// // 先预处理文本,在章节词前加换行符 + String processedText = insertLineBreakBeforeChapter(text); + + List terms = HanLP.segment(processedText); + for (Term term : terms) { + if (term.word.equals("。") || term.word.equals("!") || term.word.equals("?") || term.word.equals(",")) { + // 标点断句逻辑保持不变 + sb.append(term.word); + sentences.add(sb.toString()); + sb = new StringBuilder(); + } else { + sb.append(term.word); + } + } + + // 添加最后一段未闭合的内容 + if (sb.length() > 0) { + //根据 \n 换行符 截断生成数组 + String[] words = sb.toString().split("\n"); + for(int i=0;i> readLargeCsvAsMap(String fileUrl, int page, int pageSize) throws Exception { + List> result = new ArrayList<>(); + HttpURLConnection connection = (HttpURLConnection) new URL(fileUrl).openConnection(); + + try (InputStreamReader isr = new InputStreamReader(connection.getInputStream()); + CSVReader reader = new CSVReader(isr)) { + + // 读取表头 + String[] headers = reader.readNext(); + if (headers == null) return result; + + // 跳过前N行(不加载到内存) + long skipLines = (page - 1) * pageSize; + while (skipLines-- > 0 && reader.readNext() != null); + + // 读取当前页 + String[] line; + int count = 0; + while (count < pageSize && (line = reader.readNext()) != null) { + Map row = new HashMap<>(); + for (int i = 0; i < headers.length; i++) { + row.put(headers[i], i < line.length ? line[i] : null); + } + result.add(row); + count++; + } + } finally { + connection.disconnect(); + } + return result; + } + + public static List queryCsvData(String csvUrl, Long taskId) { + // 读取CSV文件 + List csvData = null; + try { + csvData = readCsvFromUrl(csvUrl); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (CsvException e) { + throw new RuntimeException(e); + } + + // 处理数据并分组统计 + Map resultMap = new HashMap<>(); + + // 跳过表头行 + for (int i = 1; i < csvData.size(); i++) { + String[] row = csvData.get(i); + + // 解析CSV行数据 + Long currentTaskId = Long.parseLong(row[1]); + Long shopId = Long.parseLong(row[9]); + String status = row[5]; + + // 只处理指定taskId的数据 + if (!currentTaskId.equals(taskId)) { + continue; + } + + // 创建分组键 + String groupKey = shopId + "_" + status; + + // 更新统计结果 + RunningTaskNumVo vo = resultMap.computeIfAbsent(groupKey, k -> { + RunningTaskNumVo newVo = new RunningTaskNumVo(); + newVo.setTaskId(taskId); + newVo.setShopId(shopId); + newVo.setStatus(status); + newVo.setAllNum(0); + return newVo; + }); + + vo.setAllNum(vo.getAllNum() + 1); + } + + return new ArrayList<>(resultMap.values()); + } + + private static List readCsvFromUrl(String csvUrl) throws IOException, CsvException { + URL url = new URL(csvUrl); + try (CSVReader reader = new CSVReaderBuilder(new InputStreamReader(url.openStream())) + .withSkipLines(0) // 不跳过任何行,包括表头 + .build()) { + return reader.readAll(); + } + } + + + /** + * 查询店铺日志 + */ + public static List queryTaskDataFromCsv(String csvUrl, Long taskId, Long shopId) { + List result = new ArrayList<>(); + Map groupMap = new HashMap<>(); + + try (CSVReader reader = new CSVReader(new InputStreamReader(new URL(csvUrl).openStream()))) { + // 读取CSV头 + String[] headers = reader.readNext(); + if (headers == null) return result; + + // 确定各字段索引 + int taskIdIndex = findIndex(headers, "task_id"); + int shopIdIndex = findIndex(headers, "shop_id"); + int statusIndex = findIndex(headers, "status"); + int callbackIndex = findIndex(headers, "call_back_data"); + + String[] line; + while ((line = reader.readNext()) != null) { + // 解析字段 + Long currentTaskId = Long.parseLong(line[taskIdIndex]); + Long currentShopId = Long.parseLong(line[shopIdIndex]); + int status = Integer.parseInt(line[statusIndex]); + String callBackData = line[callbackIndex]; + + // 应用过滤条件 + if (!currentTaskId.equals(taskId) || + !currentShopId.equals(shopId) || + status == 0 || status == 1 || status == 2) { + continue; + } + + // 处理call_back_data分组逻辑 + String processedCallback = processCallbackData(callBackData); + + // 创建分组键 + String groupKey = status + "_" + processedCallback; + + // 更新统计结果 + RunningTaskNumVo vo = groupMap.computeIfAbsent(groupKey, k -> { + RunningTaskNumVo newVo = new RunningTaskNumVo(); + newVo.setTaskId(taskId); + newVo.setShopId(shopId); + newVo.setStatus(String.valueOf(status)); + newVo.setMsg(processedCallback); + newVo.setAllNum(0); + return newVo; + }); + + vo.setAllNum(vo.getAllNum() + 1); + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("处理CSV文件时出错"); + } + + result.addAll(groupMap.values()); + return result; + } + + private static String processCallbackData(String callBackData) { + if (callBackData == null) { + return ""; + } + if (callBackData.contains("上传成功")) { + return "上传成功"; + } else if (callBackData.contains("属性[ISBN编号]校验错误")) { + return "属性[ISBN编号]校验错误"; + } + return callBackData; + } + + private static int findIndex(String[] headers, String columnName) { + for (int i = 0; i < headers.length; i++) { + if (columnName.equalsIgnoreCase(headers[i])) { + return i; + } + } + throw new IllegalArgumentException("CSV中未找到列: " + columnName); + } + + public static List> readCsvAsMap(String fileUrl) throws Exception { + List> result = new ArrayList<>(); + HttpURLConnection connection = (HttpURLConnection) new URL(fileUrl).openConnection(); + + try (InputStreamReader isr = new InputStreamReader(connection.getInputStream()); + CSVReader reader = new CSVReaderBuilder(isr).build()) { + + // 读取表头 + String[] headers = reader.readNext(); + if (headers == null) return result; + + // 读取所有数据行 + String[] line; + while ((line = reader.readNext()) != null) { + Map row = new HashMap<>(); + for (int i = 0; i < headers.length; i++) { + row.put(headers[i], i < line.length ? line[i] : null); + } + result.add(row); + } + } finally { + connection.disconnect(); + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DateUtilsUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DateUtilsUtils.java new file mode 100644 index 0000000..110c149 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DateUtilsUtils.java @@ -0,0 +1,102 @@ +package org.dromara.zhishu.util; + + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * 文件处理工具类 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DateUtilsUtils { + + public static String getNowDate() { + // 获取当前日期和时间 + LocalDateTime now = LocalDateTime.now(); + + // 自定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // 格式化日期和时间 + String formattedDateTime = now.format(formatter); + + return formattedDateTime; + } + + /** + * 根据传入的几个月,获取几个月后的当前时间 + * + * @param months 月份数量 + * @return 几个月后的日期时间,Date类型 + */ + public static Date getNextMonths(int months) { + // 获取当前日期和时间 + LocalDateTime now = LocalDateTime.now(); + + // 获取几个月后的日期和时间 + LocalDateTime futureMonth = now.plusMonths(months); + + // 转换为Date类型 + return Date.from(futureMonth.atZone(java.time.ZoneId.systemDefault()).toInstant()); + } + + /** + * 获取偏移天数的当前时间,格式为 yyyy-MM-dd HH:mm:ss + * + * @param dayOffset 天数偏移量 + * 0:当前时间 + * 1:当前时间 + 30天 + * -1:当前时间 - 30天 + * @return 格式化后的日期时间字符串 + */ + public static String getDateTimeWithOffset(int dayOffset) { + // 获取当前日期和时间 + LocalDateTime now = LocalDateTime.now(); + + // 计算偏移天数(乘以30) + int offsetDays = dayOffset * 30; + + // 根据偏移量调整日期 + LocalDateTime targetDateTime = now.plusDays(offsetDays); + + // 自定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // 格式化日期和时间 + return targetDateTime.format(formatter); + } + + + /** + * 将日期字符串(格式:yyyy-MM-dd HH:mm:ss)转换为10位时间戳(秒级) + * 支持自定义格式 + * + * @param dateTimeStr 日期时间字符串 + * @param pattern 日期时间格式,例如 "yyyy-MM-dd HH:mm:ss" + * @return 10位时间戳(秒数),如果转换失败返回0 + */ + public static long dateStringToTimestamp10(String dateTimeStr, String pattern) { + if (dateTimeStr == null || dateTimeStr.trim().isEmpty() || pattern == null) { + return 0; + } + + try { + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + // 将字符串解析为LocalDateTime + LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, formatter); + // 转换为时间戳(秒级) + return localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond(); + } catch (Exception e) { + // 日志记录异常,可根据需要处理 + return 0; + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DecryptUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DecryptUtils.java new file mode 100644 index 0000000..f38f285 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/DecryptUtils.java @@ -0,0 +1,247 @@ +package org.dromara.zhishu.util; + +import org.dromara.zhishu.domain.dto.SuccessDataItemDto; +import org.springframework.util.StringUtils; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.List; + +/** + * 商品导出数据解密工具类 + * 对应 Python 脚本的解密逻辑 + */ +public class DecryptUtils { + + // 固定主密钥的 Base64 表示 (对应 Python 中的 MASTER_KEY_BASE64) + private static final String MASTER_KEY_BASE64 = "sx3ad0ApTJnKTSByRWwJQG/gO8CiCYzLjHTTMza0Aw0="; + + // Nonce 长度:8字节 + private static final int NONCE_BYTES = 8; + + // 需要解密的字段名列表 + private static final String[] ENCRYPTED_FIELDS = {"isbn", "goodsCode", "title", "skuCode"}; + + // 主密钥 + private static byte[] masterKey; + + static { + try { + masterKey = Base64.getDecoder().decode(MASTER_KEY_BASE64); + if (masterKey.length != 32) { + throw new RuntimeException("主密钥长度错误:期望 32 字节,实际 " + masterKey.length + " 字节"); + } + } catch (Exception e) { + throw new RuntimeException("初始化解密密钥失败", e); + } + } + + /** + * 解密单个加密字段值(增加判断) + */ + private static String decryptField(String encryptedValue) throws Exception { + if (!StringUtils.hasText(encryptedValue)) { + return encryptedValue; + } + + // 关键:如果不是加密数据,直接返回原值 + if (!isEncryptedData(encryptedValue)) { + System.out.println("[debug] 跳过非加密数据: " + encryptedValue); + return encryptedValue; + } + + try { + // 1. Base64 URL-Safe 解码 + String base64Str = encryptedValue + .replace('-', '+') + .replace('_', '/'); + + int padLen = (4 - (base64Str.length() % 4)) % 4; + base64Str += "=".repeat(padLen); + + byte[] raw = Base64.getDecoder().decode(base64Str); + + // 2. 检查长度 + if (raw.length < NONCE_BYTES) { + throw new IllegalArgumentException("密文长度不足"); + } + + // 3. 分离 nonce 和密文 + byte[] nonce = new byte[NONCE_BYTES]; + byte[] ciphertext = new byte[raw.length - NONCE_BYTES]; + System.arraycopy(raw, 0, nonce, 0, NONCE_BYTES); + System.arraycopy(raw, NONCE_BYTES, ciphertext, 0, ciphertext.length); + + // 4. 构造 IV + byte[] iv = new byte[16]; + System.arraycopy(nonce, 0, iv, 0, NONCE_BYTES); + + // 5. AES-CTR 解密 + SecretKeySpec keySpec = new SecretKeySpec(masterKey, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + + Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); + cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); + + byte[] decrypted = cipher.doFinal(ciphertext); + + // 6. UTF-8 解码 + String result = new String(decrypted, StandardCharsets.UTF_8); + + // 7. 验证解密结果(可选) + if (!StringUtils.hasText(result)) { + System.err.println("[warn] 解密结果为空,可能密钥错误"); + } + + return result; + + } catch (Exception e) { + // 解密失败时返回原值,而不是抛出异常 + System.err.println("[warn] 解密失败,保留原值: " + encryptedValue + ", 原因: " + e.getMessage()); + return encryptedValue; + } + } + + /** + * 解密 SuccessDataItemDto 列表中的加密字段 + * + * @param dtoList 需要解密的 DTO 列表 + * @throws Exception 解密失败时抛出异常 + */ + public static void decryptDtoList(List dtoList) throws Exception { + if (dtoList == null || dtoList.isEmpty()) { + return; + } + + int decryptedCount = 0; + int skippedCount = 0; + + for (SuccessDataItemDto dto : dtoList) { + try { + // 解密 ISBN + if (StringUtils.hasText(dto.getIsbn())) { + try { + dto.setIsbn(decryptField(dto.getIsbn())); + decryptedCount++; + } catch (Exception e) { + skippedCount++; + System.err.println("[warn] ISBN 解密失败: " + e.getMessage()); + } + } + + // 解密商品编码 + if (StringUtils.hasText(dto.getGoodsCode())) { + try { + dto.setGoodsCode(decryptField(dto.getGoodsCode())); + decryptedCount++; + } catch (Exception e) { + skippedCount++; + System.err.println("[warn] 商品编码 解密失败: " + e.getMessage()); + } + } + + // 解密商品名称 + if (StringUtils.hasText(dto.getTitle())) { + try { + dto.setTitle(decryptField(dto.getTitle())); + decryptedCount++; + } catch (Exception e) { + skippedCount++; + System.err.println("[warn] 商品名称 解密失败: " + e.getMessage()); + } + } + + // 解密规格编码 + if (StringUtils.hasText(dto.getSkuCode())) { + try { + dto.setSkuCode(decryptField(dto.getSkuCode())); + decryptedCount++; + } catch (Exception e) { + skippedCount++; + System.err.println("[warn] 规格编码 解密失败: " + e.getMessage()); + } + } + + } catch (Exception e) { + System.err.println("[warn] 处理 DTO 时发生错误: " + e.getMessage()); + } + } + + System.out.println("解密完成:解密 " + decryptedCount + " 个字段,跳过 " + skippedCount + " 个字段"); + } + + /** + * 判断字符串是否为加密数据 + * 特征:包含Base64字符、长度>12、不是纯数字或纯字母 + */ + private static boolean isEncryptedData(String value) { + if (!StringUtils.hasText(value)) { + return false; + } + + // 长度至少大于12字节(8字节nonce + 至少4字节密文) + if (value.length() < 12) { + return false; + } + + // 纯数字的ISBN不是加密数据 + if (value.matches("\\d+")) { + return false; + } + + // 纯字母(如书名)不是加密数据 + if (value.matches("[a-zA-Z\\s\\u4e00-\\u9fa5]+")) { + return false; + } + + // 包含Base64特征字符 + return value.matches("^[A-Za-z0-9+/_-]+=*$"); + } + + + /** + * 获取主密钥指纹(用于验证) + * + * @return 密钥 SHA-256 前8位 + */ + public static String getKeyFingerprint() { + try { + java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(masterKey); + StringBuilder hexString = new StringBuilder(); + for (int i = 0; i < Math.min(4, hash.length); i++) { + String hex = Integer.toHexString(0xff & hash[i]); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } catch (Exception e) { + return "unknown"; + } + } + + /** + * 测试方法:验证解密功能 + */ + public static void main(String[] args) { + System.out.println("主密钥指纹: " + getKeyFingerprint()); + System.out.println("预期指纹: 63c70bdd"); + + // 测试用例:使用第一行数据的加密值 + String testIsbn = "m4Z6uhZiuc5-lDmv6p97FglNap0u"; + String testGoodsCode = "m4Z6uhZiuc5-lDmv6p97FglNap0u"; + String testTitle = "中学教材全练:九年级化学"; + String testSkuCode = "y4P9HTM8ThQ1BD7to7mC-4vhK-OI36Jh7Q"; + + try { + System.out.println("\n测试解密:"); + System.out.println("原始 ISBN: " + testIsbn); + // 注意:这里测试需要的是加密后的数据,示例中的是明文,实际使用时会自动解密 + } catch (Exception e) { + System.err.println("测试失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EasyExcelUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EasyExcelUtil.java new file mode 100644 index 0000000..7591f99 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EasyExcelUtil.java @@ -0,0 +1,700 @@ +package org.dromara.zhishu.util; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.opencsv.CSVReader; +import com.opencsv.CSVWriterBuilder; +import com.opencsv.ICSVWriter; +import lombok.RequiredArgsConstructor; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.json.utils.JsonUtils; + +import java.io.*; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +import com.alibaba.fastjson.JSON; +import org.dromara.zhishu.domain.vo.BookEditIsOnsaleVo; +import org.dromara.zhishu.domain.vo.BookEditPriceVo; +import org.dromara.zhishu.domain.vo.BookEditStockVo; +import org.dromara.zhishu.domain.vo.BookVo; +import org.dromara.zhishu.service.client.FileClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + + +/** + * EasyExcel工具类 + * + * @author CWW + * @date 2024/12/18 16:46 + */ +@RequiredArgsConstructor +@Component +public class EasyExcelUtil { + + private static final String UTF_8 = "UTF-8"; + + /** + * 读取文件数据,并返回一个包含指定类型数据的列表。 + * + * @param inputStream 文件对象输入流 + * @param clazz 数据对象的类型 + * @param 泛型类型,表示数据对象的类型 + * @return 包含解析后数据对象的列表 + */ + public static List readMultipartFile(InputStream inputStream, Class clazz) { + // 用于存储解析后的数据对象 + final List dataList = new ArrayList<>(); + + EasyExcel.read(inputStream, clazz, new AnalysisEventListener() { + @Override + public void invoke(T data, AnalysisContext analysisContext) { + // 每一条数据解析都会调用此方法 + // 将解析后的数据对象添加到 dataList中 + dataList.add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 读取完成后可以进行一些操作 + } + }).sheet(0).doRead(); // 读取 Excel 文件中的第一个工作表 + + // 返回解析后数据对象的列表 + return dataList; + } + + + /** + * 将数据列表写入 Excel 文件,并设置表头 + * + * @param filePath 文件路径 + * @param data 数据列表 + * @param headMap 表头配置,键为字段名,值为表头显示名称 + */ + public static void writeExcel(String filePath, List> data, Map headMap) { + try ( + Workbook workbook = new XSSFWorkbook(); + FileOutputStream fileOut = new FileOutputStream(filePath)) { + Sheet sheet = workbook.createSheet("Sheet1"); + // 创建表头 + Row headerRow = sheet.createRow(0); + Cell headerCell = headerRow.createCell(0); + headerCell.setCellValue("书号"); + Cell headerCell4 = headerRow.createCell(1); + headerCell4.setCellValue("书名"); + Cell headerCell1 = headerRow.createCell(2); + headerCell1.setCellValue("价格"); + Cell headerCell2 = headerRow.createCell(3); + headerCell2.setCellValue("库存"); + Cell headerCell3 = headerRow.createCell(4); + headerCell3.setCellValue("日志"); + Cell headerCell5 = headerRow.createCell(5); + headerCell5.setCellValue("三方平台商品id"); + workbook.write(fileOut); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 将 Map 列表转换为 JSON 字符串并存储到文本文件中 + * + * @param fileName 文件名称 + * @param data 数据列表 + */ + public static void writeJsonToFile(String fileName, List> data) { + try { + String filePath = UrlUtil.getUrl() + fileName; + // 获取文件路径的父目录 + Path parentDir = Paths.get(filePath).getParent(); + // 如果父目录不存在,则创建它 + if (parentDir != null && !Files.exists(parentDir)) { + Files.createDirectories(parentDir); + } + + // 将 Map 列表转换为 JSON 字符串 + String jsonString = JSON.toJSONString(data); + + // 将 JSON 字符串写入文件 + try (FileWriter fileWriter = new FileWriter(filePath)) { + fileWriter.write(jsonString); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void writeJsonToFile(String fileName, String jsonString) { + try { + jsonString = jsonString == null ? "" : jsonString; + String filePath = UrlUtil.getUrl() + fileName; + // 获取文件路径的父目录 + Path parentDir = Paths.get(filePath).getParent(); + // 如果父目录不存在,则创建它 + if (parentDir != null && !Files.exists(parentDir)) { + Files.createDirectories(parentDir); + } + + // 将 JSON 字符串写入文件 + try (FileWriter fileWriter = new FileWriter(filePath)) { + fileWriter.write(jsonString); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取text文本文件中的字符串 + * + * @param filePath + * @return + */ + public static List> readFileContent(String filePath) { + StringBuilder contentBuilder = new StringBuilder(); + try { + Path path = Paths.get(filePath); + List lines = Files.readAllLines(path); + for (String line : lines) { + contentBuilder.append(line).append(System.lineSeparator()); + } + } catch (IOException e) { + e.printStackTrace(); + } + List> mapList = JsonUtils.parseObject(contentBuilder.toString(), List.class); + return mapList; + } + + public static String readFileContentString(String filePath) { + StringBuilder contentBuilder = new StringBuilder(); + try { + Path path = Paths.get(filePath); + // 先判断文件是否存在 + if (!Files.exists(path)) { + return ""; + } + List lines = Files.readAllLines(path); + for (String line : lines) { + contentBuilder.append(line).append(System.lineSeparator()); + } + } catch (IOException e) { + e.printStackTrace(); + return ""; + } + return contentBuilder.toString(); + } + + + /** + * 根据文件路径持续写入数据 + * + * @param excelFilePath 文件路径 + */ + public static void continuousWriting(String excelFilePath, List list) { + try ( + FileInputStream fis = new FileInputStream(excelFilePath); + Workbook workbook = new XSSFWorkbook(fis)) { + // 获取第一个工作表 + Sheet sheet = workbook.getSheetAt(0); + // 创建一行 + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + // 创建单元格并写入数据 + for (int i = 0; i < list.size(); i++) { + Cell cell = row.createCell(i); + cell.setCellValue(list.get(i)); + } + // 写入文件 + try (FileOutputStream fos = new FileOutputStream(excelFilePath)) { + workbook.write(fos); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 导出数据到Excel文件的通用方法。 + * + * @param 数据对象类型 + * @param basePath 文件保存的基础路径 + * @param fileName 文件名(包括扩展名) + * @param data 要导出的数据列表 + * @param sheetName Excel工作表名称 + * @param headClazz 数据对象类,用于映射Excel列标题 + */ + public static void exportToExcel(String basePath, String fileName, List data, String sheetName, Class headClazz) { + // 确保目录存在 + new File(basePath).mkdirs(); + + String filePath = basePath + fileName; + + try { + // 使用 EasyExcel 写入数据 + EasyExcel.write(filePath, headClazz) + .sheet(sheetName.length() > 31 ? sheetName.substring(0, 31) : sheetName) + .doWrite(data); + } catch (Exception e) { + // 处理异常 + e.printStackTrace(); + // 可以在这里添加更多的错误处理逻辑,例如记录日志、通知等 + throw new RuntimeException("导出Excel文件失败", e); + } + } + + public static List> convertExcelToMap(String filePath) { + List> result = new ArrayList<>(); + + try (FileInputStream fileInputStream = new FileInputStream(new File(filePath)); + Workbook workbook = new XSSFWorkbook(fileInputStream)) { + + Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表 + Iterator rowIterator = sheet.iterator(); + + // 获取表头(第一行) + Row headerRow = rowIterator.next(); + List headers = new ArrayList<>(); + for (Cell cell : headerRow) { + headers.add(cell.getStringCellValue()); + } + + // 遍历数据行 + while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + Map rowMap = new HashMap<>(); + + for (int i = 0; i < headers.size(); i++) { + Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + rowMap.put(headers.get(i), getCellValue(cell)); + } + + result.add(rowMap); + } + + } catch (IOException e) { + e.printStackTrace(); + } + + return result; + } + + + /** + * 从URL读取Excel文件并转换为指定类型的对象列表 + * @param url Excel文件的URL地址 + * @param clazz 要转换的目标类类型 + * @param 泛型类型 + * @return 读取后的对象列表 + * @throws RuntimeException 当读取失败时抛出 + */ + public static List readExcelFromUrl(String url, Class clazz) { + try (InputStream inputStream = new URL(url).openStream()) { + return EasyExcel.read(inputStream) + .head(clazz) + .sheet() + .doReadSync(); + } catch (Exception e) { + throw new RuntimeException("读取Excel失败: " + e.getMessage(), e); + } + } + + + + private static Object getCellValue(Cell cell) { + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + return cell.getLocalDateTimeCellValue(); + } else { + return cell.getNumericCellValue(); + } + case BOOLEAN: + return cell.getBooleanCellValue(); + case FORMULA: + return cell.getCellFormula(); + default: + return ""; + } + } + + public static void writeTxtMsgLog(Long taskId, Integer totalNum, Integer executedNum) { + StringBuffer stringBuffer = new StringBuffer(); + String str = "开始执行文件" + System.lineSeparator() + + "开始进行数据加载" + System.lineSeparator() + + "数据加载完毕" + System.lineSeparator() + + "正在执行" + System.lineSeparator() + + "已执行数据:" + executedNum + "条" + System.lineSeparator() + + "待执行数据:" + (totalNum - executedNum) + "条" + System.lineSeparator(); + stringBuffer.append(str); + if (executedNum.equals(totalNum)) { + stringBuffer.append("文件执行完成"); + } + // 记录日志 + EasyExcelUtil.writeJsonToFile(taskId + "-msg.txt", stringBuffer.toString()); + } + + public static void writeTxtLog(Long taskId, Long shopId, String shopName, Integer total, Integer executedNum) { + List> mapList = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("shopId", shopId); + map.put("shopName", shopName); + map.put("num", executedNum); + // 计算百分比 + map.put("progress", CountUtils.calculatePercentage(total, executedNum)); + map.put("createTime", DateUtilsUtils.getNowDate()); + map.put("updateTime", DateUtilsUtils.getNowDate()); + map.put("taskId", taskId); + mapList.add(map); + // 写入txt文件中 + EasyExcelUtil.writeJsonToFile(taskId + ".txt", mapList); + } + + /** + * 存储任务中店铺里的日志类型进度 + * + * @param taskId + * @param shopId + * @param shopName + * @param logName + * @param mark + * @param total + */ + public static void writeDetailTxtLog(Long taskId, Long shopId, String shopName, Integer total, Integer executedNum, String logName, String mark) { + String filePath = UrlUtil.getUrl() + taskId + "" + shopId + ".txt"; + // true为txt文件中不存在店铺信息,false代表存在 + Boolean bool = true; + List> mapList = new ArrayList<>(); + if (FileUtils.isFileExists(filePath)) { + mapList = EasyExcelUtil.readFileContent(filePath); + // txt文本不为空,则遍历List对象,查看是否存在店铺id,存在,则数量+1,不存在则添加 + for (Map map : mapList) { + if (map.get("logName").equals(logName)) { + bool = false; + map.put("num", executedNum); + map.put("progress", CountUtils.calculatePercentage(total, executedNum)); + } + } + } + if (bool) { + Map map = new HashMap<>(); + map.put("shopId", shopId); + map.put("shopName", shopName); + map.put("num", executedNum); + // 计算百分比 + map.put("progress", CountUtils.calculatePercentage(total, executedNum)); + map.put("taskId", taskId); + map.put("logName", logName); + map.put("mark", mark); + mapList.add(map); + } + // 写入txt文件中 + EasyExcelUtil.writeJsonToFile(taskId + "" + shopId + ".txt", mapList); + } + + + + /** + * 将 List> 转换为CSV并上传到资源服务器 + * + * @param fileName 文件名(如 output.csv) + * @param dataList 数据列表 + * @param headers 表头字段(用于生成列名) + * @return 是否上传成功 + */ + public static boolean writeMapsToCsvWithHeader(String fileName, List> dataList, + List headers, FileClient fileClient,Long mallId) { + try { + // 1. 将数据转换为CSV格式的字符串 + StringWriter stringWriter = new StringWriter(); + try (ICSVWriter csvWriter = new CSVWriterBuilder(stringWriter) + .build()) { + // 写入表头 + csvWriter.writeNext(headers.toArray(new String[0])); + // 写入数据 + for (Map data : dataList) { + String[] row = new String[headers.size()]; + for (int j = 0; j < headers.size(); j++) { + String header = headers.get(j); + Object value = data.get(header); + // 如果是 sku_list 字段,转换为 JSON 字符串 + if ("sku_list".equals(header) && value instanceof List) { + row[j] = JSON.toJSONString(value); // 转换为 JSON 字符串 + } else { + row[j] = value != null ? value.toString() : ""; + } + } + csvWriter.writeNext(row); + } + } + // 2. 将CSV内容转换为Base64 + String csvContent = stringWriter.toString(); + String base64Content = Base64.getEncoder().encodeToString(csvContent.getBytes(StandardCharsets.UTF_8)); + + // 3. 上传到资源服务器 + R result = fileClient.upload(UrlUtil.getFileServiceUrl(), base64Content, "ShopGoodsDataCSV/"+mallId, fileName); + + return R.isSuccess(result); + + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + // public static void writeMapsToCsvWithHeader(String filePath, List> dataList, List headers, boolean append) { + // Path path = Paths.get(filePath); + // Path parentDir = path.getParent(); + // + // try { + // // 1. 创建父目录(如果不存在) + // if (parentDir != null && !Files.exists(parentDir)) { + // Files.createDirectories(parentDir); + // } + // + // // 2. 创建文件(如果不存在) + // if (!Files.exists(path)) { + // Files.createFile(path); + // } + // + // // 3. 使用 BufferedWriter + OpenCSV 高性能写入 + // try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8); + // ICSVWriter csvWriter = new CSVWriterBuilder(writer) + // .withQuoteChar('"') // 替换为实际字符 + // .withEscapeChar('\\') // 替换为实际字符 + // .build()) { + // + // // 写入表头(仅在文件为空或非追加模式下写入) + // if (!append || Files.size(path) == 0) { + // csvWriter.writeNext(headers.toArray(new String[0])); + // } + // + // // 4. 倒序遍历 dataList + // for (int i = dataList.size() - 1; i >= 0; i--) { + // Map data = dataList.get(i); + // String[] row = new String[headers.size()]; + // for (int j = 0; j < headers.size(); j++) { + // Object value = data.get(headers.get(j)); + // row[j] = value != null ? value.toString() : ""; + // } + // csvWriter.writeNext(row); + // } + // + // } + // } catch (IOException e) { + // e.printStackTrace(); + // } + // } + + /** + * 分页读取 CSV 文件内容 + * + * @param fileBase64Str 文件Base64编码 + * @param page 当前页码(从1开始) + * @param pageSize 每页行数 + * @param hasHeader 是否有表头(true=第一行是标题) + * @return 当前页的数据(List>),key是列名,value是单元格值 + */ + public static List> readCsvWithPagination(String fileBase64Str, + int page, + int pageSize, + boolean hasHeader) { + List> currentPageData = new ArrayList<>(); + + if (page < 1 || pageSize < 1) { + throw new IllegalArgumentException("页码和每页行数必须大于等于1"); + } + + try { + + // 如果是Base64编码,需要解码 + byte[] decodedBytes = Base64.getDecoder().decode(fileBase64Str); + String csvContent = new String(decodedBytes, StandardCharsets.UTF_8); + + // 使用CSVReader读取内容 + try (CSVReader reader = new CSVReader(new StringReader(csvContent))) { + List allRows = reader.readAll(); + int totalRows = allRows.size(); + + // 计算起始行号(跳过表头) + int startRow = hasHeader ? 1 : 0; + int endRow = Math.min(startRow + (page - 1) * pageSize + pageSize, totalRows); + + // 获取当前页的行数据 + for (int i = startRow + (page - 1) * pageSize; i < endRow; i++) { + String[] row = allRows.get(i); + Map rowMap = new HashMap<>(); + + // 如果有表头,则用表头字段作为key,否则用"col_0", "col_1"... + if (hasHeader && !allRows.isEmpty()) { + String[] header = allRows.get(0); + for (int j = 0; j < row.length; j++) { + if (j < header.length) { + rowMap.put(header[j], j < row.length ? row[j] : ""); + } else { + rowMap.put("col_" + j, j < row.length ? row[j] : ""); + } + } + } else { + for (int j = 0; j < row.length; j++) { + rowMap.put("col_" + j, row[j]); + } + } + + currentPageData.add(rowMap); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return currentPageData; + } + // public static List> readCsvWithPagination(String filePath, int page, int pageSize, boolean hasHeader) { + // List> currentPageData = new ArrayList<>(); + // Path path = Paths.get(filePath); + // + // if (page < 1 || pageSize < 1) { + // throw new IllegalArgumentException("页码和每页行数必须大于等于 1"); + // } + // + // try (CSVReader reader = new CSVReader(new FileReader(path.toFile()))) { + // List allRows = reader.readAll(); + // int totalRows = allRows.size(); + // + // // 计算起始行号(跳过表头) + // int startRow = hasHeader ? 1 : 0; + // int endRow = Math.min(startRow + (page - 1) * pageSize + pageSize, totalRows); + // + // // 获取当前页的行数据 + // for (int i = startRow + (page - 1) * pageSize; i < endRow; i++) { + // String[] row = allRows.get(i); + // Map rowMap = new HashMap<>(); + // + // // 如果有表头,则用表头字段作为 key,否则用 "col_0", "col_1" ... + // if (hasHeader && !allRows.isEmpty()) { + // String[] header = allRows.get(0); + // for (int j = 0; j < row.length; j++) { + // if (j < header.length) { + // rowMap.put(header[j], j < row.length ? row[j] : ""); + // } else { + // rowMap.put("col_" + j, j < row.length ? row[j] : ""); + // } + // } + // } else { + // for (int j = 0; j < row.length; j++) { + // rowMap.put("col_" + j, row[j]); + // } + // } + // + // currentPageData.add(rowMap); + // } + // + // } catch (Exception e) { + // e.printStackTrace(); + // } + // + // return currentPageData; + // } + + /** + * 获取 CSV 文件中除第一行标题外的总行数 + * + * @param base64Content CSV 文件的 Base64 编码内容 + * @return 除标题行外的数据行数(-1 表示出错,0 表示文件为空) + */ + public static int getRowCountWithoutHeader(String base64Content) { + if (base64Content == null || base64Content.isEmpty()) { + System.err.println("Base64 内容为空"); + return -1; + } + + try { + // 解码 Base64 内容 + byte[] decodedBytes = Base64.getDecoder().decode(base64Content); + String csvContent = new String(decodedBytes, StandardCharsets.UTF_8); + + try (CSVReader reader = new CSVReader(new StringReader(csvContent))) { + List allRows = reader.readAll(); + + if (allRows.isEmpty()) { + System.out.println("CSV 内容为空"); + return 0; + } + + // 假设第一行是标题行,返回剩余行数 + return allRows.size() - 1; + } + } catch (IllegalArgumentException e) { + System.err.println("Base64 解码失败"); + e.printStackTrace(); + return -1; + } catch (Exception e) { + System.err.println("解析 CSV 内容失败"); + e.printStackTrace(); + return -1; + } + } + // public static int getRowCountWithoutHeader(String filePath) { + // Path path = Paths.get(filePath); + // + // if (!Files.exists(path)) { + // System.err.println("文件不存在:" + filePath); + // return -1; + // } + // + // try (CSVReader reader = new CSVReader(new FileReader(path.toFile()))) { + // List allRows = reader.readAll(); + // + // // 如果文件有标题行,则减去一行 + // if (!allRows.isEmpty()) { + // return allRows.size() - 1; // 减去标题行 + // } else { + // System.out.println("文件为空"); + // return 0; + // } + // } catch (Exception e) { + // System.err.println("读取文件失败:" + filePath); + // e.printStackTrace(); + // return -1; + // } + // } + + /** + * 如果文件存在,则删除该文件 + * + * @param filePath 文件路径 + * @return 如果文件被成功删除或不存在,返回 true;否则返回 false + */ + public static boolean deleteFileIfExist(String filePath) { + Path path = Paths.get(filePath); + + try { + if (Files.exists(path)) { + Files.delete(path); // 删除文件 + System.out.println("文件已删除:" + filePath); + return true; + } else { + System.out.println("文件不存在,无需删除:" + filePath); + return true; + } + } catch (IOException e) { + System.err.println("删除文件失败:" + filePath); + e.printStackTrace(); + return false; + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EnvironmentVariableCredentialsProvider2.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EnvironmentVariableCredentialsProvider2.java new file mode 100644 index 0000000..8330aaa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/EnvironmentVariableCredentialsProvider2.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.util; + +import com.aliyun.oss.common.auth.Credentials; +import com.aliyun.oss.common.auth.CredentialsProvider; +import com.aliyun.oss.common.auth.DefaultCredentials; +import com.aliyun.oss.common.auth.InvalidCredentialsException; +import com.aliyun.oss.common.utils.StringUtils; + +public class EnvironmentVariableCredentialsProvider2 implements CredentialsProvider { + + public EnvironmentVariableCredentialsProvider2() { + } + + @Override + public void setCredentials(Credentials credentials) { + + } + + @Override + public Credentials getCredentials() { + String accessKeyId = "LTAI5tAsqEnyKfXngHep4X96"; + String secretAccessKey = "rO8ADdtgQ1ddp6EzJHPCvNpviGfP3r"; + String sessionToken = ""; + if (accessKeyId != null && !accessKeyId.equals("")) { + if (secretAccessKey != null && !secretAccessKey.equals("")) { + return new DefaultCredentials(accessKeyId, secretAccessKey, sessionToken); + } else { + throw new InvalidCredentialsException("Secret access key should not be null or empty."); + } + } else { + throw new InvalidCredentialsException("Access key id should not be null or empty."); + } + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExcelFileHandlerUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExcelFileHandlerUtil.java new file mode 100644 index 0000000..ac3ecfc --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExcelFileHandlerUtil.java @@ -0,0 +1,462 @@ +package org.dromara.zhishu.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.utils.IOUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.*; +import java.lang.reflect.Field; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +public class ExcelFileHandlerUtil { + + /** + * 处理导出 + * + * @param data + * @param type + * @param shopId + */ + public static void handleExport(List data, String basePath, String type, String shopId, Class clazz) { + if (ObjectUtil.isNotEmpty(data)) { + // 拼接文件名称 + String fileName = type + "_" + shopId + "_0.xlsx"; + // 拼接导出Excel的默认第一个sheet页名称 + String sheetName = type + "_" + shopId + "_0"; + // 用EasyExcel导出工具类,将数据写入Excel文件 + EasyExcelUtil.exportToExcel(basePath, fileName, data, sheetName, clazz); + } + } + + // 方法一:同步写入 Excel 文件 + public static void syncWriteRecord(String baseDir, String prefix, List records, String sheetName) { + try { + // 构造完整文件路径 + String filename = prefix + "_0.xlsx"; + File dir = new File(baseDir); + if (!dir.exists()) { + dir.mkdirs(); // 如果目录不存在,则创建目录 + } + String fullPath = baseDir + filename; + File file = new File(fullPath); + + Workbook workbook; + Sheet sheet; + + // 判断文件是否存在并打开或创建工作簿 + if (file.exists()) { + try (FileInputStream fis = new FileInputStream(file)) { + workbook = WorkbookFactory.create(fis); + } + } else { + workbook = new XSSFWorkbook(); + } + + // 确保有指定名称的sheet,如果没有就创建 + if (workbook.getSheetIndex(sheetName) == -1) { + sheet = workbook.createSheet(sheetName); + createHeaderRow(sheet, records.get(0)); + } else { + sheet = workbook.getSheet(sheetName); + } + + // 写入数据行 + int nextRowNum = sheet.getLastRowNum() + 1; + for (T record : records) { + Row row = sheet.createRow(nextRowNum++); + writeDataRow(row, record); + } + + // 写入文件 + try (FileOutputStream fos = new FileOutputStream(file)) { + workbook.write(fos); + } + + workbook.close(); + } catch (Exception e) { + log.error("写入Excel错误-{}", JSONObject.toJSONString(e)); + } + } + + // 创建表头行(仅在新建 sheet 时调用) + private static void createHeaderRow(Sheet sheet, T record) { + Row headerRow = sheet.createRow(0); + Field[] fields = record.getClass().getDeclaredFields(); + + for (int i = 0; i < fields.length; i++) { + fields[i].setAccessible(true); + Cell cell = headerRow.createCell(i); + cell.setCellValue(fields[i].getName()); + } + } + + // 将记录对象的数据写入到指定的行中 + private static void writeDataRow(Row row, T record) throws IllegalAccessException { + Field[] fields = record.getClass().getDeclaredFields(); + + for (int i = 0; i < fields.length; i++) { + fields[i].setAccessible(true); + Cell cell = row.createCell(i); + Object value = fields[i].get(record); + setValueToCell(cell, value); + } + } + + // 设置单元格值 + private static void setValueToCell(Cell cell, Object value) { + if (value instanceof String) { + cell.setCellValue((String) value); + } else if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else if (value instanceof Boolean) { + cell.setCellValue((Boolean) value); + } else if (value instanceof java.util.Date) { + cell.setCellValue((java.util.Date) value); + } else { + cell.setCellValue(value != null ? value.toString() : ""); + } + } + + // 方法二:批量删除指定文件夹下名称前缀相同的文件 + public static void deleteFilesByPrefix(String baseDir, String prefix) { + File dir = new File(baseDir); + if (!dir.exists() || !dir.isDirectory()) { + return; + } + + // 遍历目录下的所有文件 + for (File file : Objects.requireNonNull(dir.listFiles())) { + if (file.isFile() && file.getName().startsWith(prefix)) { + boolean deleted = file.delete(); + System.out.println((deleted ? "已删除:" : "删除失败:") + file.getAbsolutePath()); + } + } + } + + /** + * 读取指定目录下以 prefix 开头的 Excel 文件,并将其解析为指定 Java 对象列表 + * + * @param baseDir 目标目录 + * @param prefix 文件名前缀 + * @param clazz Java对象类型 + * @return 解析后的Java对象列表 + */ + public static List readExcelWithPrefix(String baseDir, String prefix, Class clazz) { + List result = new ArrayList<>(); + File dir = new File(baseDir); + + if (!dir.exists() || !dir.isDirectory()) { + log.warn("目录不存在或无效: {}", baseDir); + return result; + } + + // 查找匹配的Excel文件 + File targetFile = null; + for (File file : Objects.requireNonNull(dir.listFiles())) { + if (file.isFile() && file.getName().startsWith(prefix) && file.getName().endsWith(".xlsx")) { + targetFile = file; + break; + } + } + + if (targetFile == null) { + log.info("未找到以 {} 开头的 Excel 文件", prefix); + return result; + } + + try (Workbook workbook = WorkbookFactory.create(targetFile)) { + Sheet sheet = workbook.getSheetAt(0); // 只读取第一个sheet + Iterator rowIterator = sheet.iterator(); + + if (!rowIterator.hasNext()) { + log.warn("Excel 文件为空: {}", targetFile.getAbsolutePath()); + return result; + } + + Row headerRow = rowIterator.next(); // 跳过表头 + Map headerMap = new HashMap<>(); + + // 构建列索引 -> 字段名的映射 + headerRow.forEach(cell -> { + int columnIndex = cell.getColumnIndex(); + String fieldName = cell.getStringCellValue(); + headerMap.put(columnIndex, fieldName); + }); + + // 获取类字段并设置可访问 + Field[] fields = clazz.getDeclaredFields(); + Map fieldMap = new HashMap<>(); + for (Field field : fields) { + field.setAccessible(true); + fieldMap.put(field.getName(), field); + } + + // 读取数据行 + while (rowIterator.hasNext()) { + Row dataRow = rowIterator.next(); + T instance = clazz.getDeclaredConstructor().newInstance(); + + dataRow.forEach(cell -> { + int colIndex = cell.getColumnIndex(); + String fieldName = headerMap.get(colIndex); + Field field = fieldMap.get(fieldName); + + if (field != null) { + try { + Object value = getCellValue(cell, field.getType()); + field.set(instance, value); + } catch (Exception e) { + log.warn("设置字段 [{}] 值失败: {}", fieldName, e.getMessage()); + } + } + }); + + result.add(instance); + } + + log.info("成功从文件 {} 中读取 {} 条记录", targetFile.getName(), result.size()); + + } catch (Exception e) { + log.error("读取Excel文件异常: {}", JSONObject.toJSONString(e)); + } + + return result; + } + + /** + * 根据 Cell 和目标类型提取对应值 + */ + private static Object getCellValue(Cell cell, Class targetType) throws Exception { + if (targetType.equals(String.class)) { + return cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.toString(); + } else if (Number.class.isAssignableFrom(targetType)) { + if (cell.getCellType() == CellType.NUMERIC) { + return cell.getNumericCellValue(); + } else { + String text = cell.toString(); + if (targetType.equals(Integer.class) || targetType.equals(int.class)) { + return Integer.parseInt(text); + } else if (targetType.equals(Long.class) || targetType.equals(long.class)) { + return Long.parseLong(text); + } else if (targetType.equals(Double.class) || targetType.equals(double.class)) { + return Double.parseDouble(text); + } else if (targetType.equals(Float.class) || targetType.equals(float.class)) { + return Float.parseFloat(text); + } + } + } else if (targetType.equals(Boolean.class) || targetType.equals(boolean.class)) { + return cell.getBooleanCellValue(); + } else if (targetType.equals(java.util.Date.class)) { + return cell.getDateCellValue(); + } + + return cell.toString(); // 默认返回字符串表示 + } + + /** + * 根据指定目录和多个 type 类型,读取所有符合命名规则的 Excel 文件, + * 并按照 type -> shopId -> 数据列表 的结构返回。 + * + * @param baseDir 目标目录 + * @param types 允许读取的 type 列表(如 ["New", "Update"]) + * @param clazz Java对象类型 + * @return 嵌套Map: Map>> + */ + public static Map>> readExcelByTypeAndShopId( + String baseDir, + Collection types, + Class clazz) { + Map>> result = new HashMap<>(); + + File dir = new File(baseDir); + if (!dir.exists() || !dir.isDirectory()) { + log.warn("目录不存在或无效: {}", baseDir); + return result; + } + + for (File file : Objects.requireNonNull(dir.listFiles())) { + if (!file.isFile() || !file.getName().endsWith(".xlsx")) continue; + + String fileName = file.getName(); + if (!fileName.startsWith("Error_")) continue; + + String[] parts = fileName.replace(".xlsx", "").split("_"); + if (parts.length < 5) continue; // Error + type + shopId + threadId + index + + String type = parts[1]; + String shopIdStr = parts[2]; + + if (!types.contains(type)) continue; + + Long shopId; + try { + shopId = Long.valueOf(shopIdStr); + } catch (NumberFormatException e) { + log.warn("无法解析 shopId: {}", shopIdStr); + continue; + } + + // 构造 prefix(去掉最后的 _0.xlsx) + String prefix = fileName.substring(0, fileName.lastIndexOf('_')); + + List dataList = readExcelWithPrefix(baseDir, prefix, clazz); + + result.computeIfAbsent(type, k -> new ConcurrentHashMap<>()) + .computeIfAbsent(shopId, k -> new ArrayList<>()) + .addAll(dataList); + } + + log.info("成功读取 {} 个类型的数据", result.size()); + return result; + } + + /** + * 追加数据到Excel文件(保持与EasyExcel相同的表头格式) + * @param baseDir 基础目录 + * @param prefix 文件名前缀(格式:Type_ShopId) + * @param records 要追加的数据列表 + * @param clazz 数据类型 + */ + public static void appendToExcel(String baseDir, String prefix, List records, Class clazz) { + if (CollUtil.isEmpty(records)) { + return; + } + + FileOutputStream fos = null; + Workbook workbook = null; + try { + // 构造完整文件路径 + String filename = prefix + ".xlsx"; + File dir = new File(baseDir); + if (!dir.exists()) { + dir.mkdirs(); + } + String fullPath = baseDir + File.separator + filename; + File file = new File(fullPath); + + // 1. 准备表头(模仿EasyExcel的样式) + List headers = new ArrayList<>(); + Map fieldOrder = new HashMap<>(); + + // 解析类注解获取表头信息(与EasyExcel相同逻辑) + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + if (excelProperty != null) { + String[] value = excelProperty.value(); + String header = value.length > 0 ? value[0] : field.getName(); + headers.add(header); + fieldOrder.put(field.getName(), excelProperty.index()); + } + } + + // 2. 处理工作簿 + if (file.exists()) { + // 已有文件:追加模式 + try (FileInputStream fis = new FileInputStream(file)) { + workbook = WorkbookFactory.create(fis); + } + + Sheet sheet = workbook.getSheet(prefix); + if (sheet == null) { + sheet = workbook.createSheet(prefix); + // 创建与EasyExcel相同的表头 + createEasyExcelStyleHeader(sheet, headers); + } + } else { + // 新文件 + workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet(prefix); + // 创建与EasyExcel相同的表头 + createEasyExcelStyleHeader(sheet, headers); + } + + // 3. 追加数据 + Sheet sheet = workbook.getSheet(prefix); + int lastRowNum = sheet.getLastRowNum(); + int startRow = (lastRowNum == 0 && sheet.getRow(0) != null) ? 1 : lastRowNum + 1; + + // 按字段顺序写入数据 + for (int i = 0; i < records.size(); i++) { + T record = records.get(i); + Row row = sheet.createRow(startRow + i); + + for (Field field : fields) { + field.setAccessible(true); + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + if (excelProperty != null) { + int colIndex = excelProperty.index(); + Object value = field.get(record); + Cell cell = row.createCell(colIndex); + setCellValue(cell, value); + } + } + } + + // 4. 写入文件(增量写入) + fos = new FileOutputStream(file); + workbook.write(fos); + + } catch (Exception e) { + log.error("追加数据到Excel文件错误", e); + throw new RuntimeException("导出Excel文件失败", e); + } finally { + IOUtils.closeQuietly(workbook); + IOUtils.closeQuietly(fos); + } + } + + /** + * 创建与EasyExcel风格一致的表头 + */ + private static void createEasyExcelStyleHeader(Sheet sheet, List headers) { + Row headerRow = sheet.createRow(0); + + // 设置表头样式(模仿EasyExcel的默认样式) + CellStyle headerStyle = sheet.getWorkbook().createCellStyle(); + Font font = sheet.getWorkbook().createFont(); + font.setBold(true); + font.setFontHeightInPoints((short) 12); + headerStyle.setFont(font); + headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerStyle.setBorderBottom(BorderStyle.THIN); + + // 写入表头 + for (int i = 0; i < headers.size(); i++) { + Cell cell = headerRow.createCell(i); + cell.setCellValue(headers.get(i)); + cell.setCellStyle(headerStyle); + // 自动调整列宽 + sheet.autoSizeColumn(i); + } + } + + /** + * 设置单元格值(类型处理) + */ + private static void setCellValue(Cell cell, Object value) { + if (value == null) { + cell.setCellValue(""); + } else if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else if (value instanceof Boolean) { + cell.setCellValue((Boolean) value); + } else if (value instanceof Date) { + cell.setCellValue((Date) value); + // 设置日期格式 + CellStyle style = cell.getSheet().getWorkbook().createCellStyle(); + style.setDataFormat(cell.getSheet().getWorkbook().createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss")); + cell.setCellStyle(style); + } else { + cell.setCellValue(value.toString()); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExpressCompanyDetector.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExpressCompanyDetector.java new file mode 100644 index 0000000..31826ba --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ExpressCompanyDetector.java @@ -0,0 +1,378 @@ +package org.dromara.zhishu.util; + +import java.util.*; +import java.util.regex.Pattern; + +/** + * 纯本地快递公司识别工具 + * 不依赖外部API,基于规则识别 + */ +public class ExpressCompanyDetector { + + // 快递公司信息类 + public static class ExpressInfo { + private String code; // 公司编码 + private String name; // 公司名称 + + public ExpressInfo(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { return code; } + public String getName() { return name; } + + } + + // 快递公司规则定义 + private static class ExpressRule { + String code; + String name; + List patterns; + int priority; // 优先级,数字越小优先级越高 + + ExpressRule(String code, String name, String[] regexes, int priority) { + this.code = code; + this.name = name; + this.patterns = new ArrayList<>(); + for (String regex : regexes) { + this.patterns.add(Pattern.compile(regex)); + } + this.priority = priority; + } + + boolean matches(String trackingNumber) { + for (Pattern pattern : patterns) { + if (pattern.matcher(trackingNumber).matches()) { + return true; + } + } + return false; + } + } + + // 规则库(按优先级排序) + private static final List RULES = new ArrayList<>(); + + static { + // 初始化规则库(规则越具体,优先级越高) + initializeRules(); + } + + private static void initializeRules() { + // 高优先级规则:精确匹配的特定规则 + + // 1. 中通快递 (ZTO) + RULES.add(new ExpressRule("zhongtong", "中通快递", new String[]{ + "^78\\d{12}$", // 14位,78开头(你的例子) + "^7[3-8]\\d{11}$", // 13位,73-78开头 + "^7[3-8]\\d{9}$", // 11位,73-78开头 + "^ZTO\\d{10,}$", // ZTO开头 + "^ZT\\d{10,}$", // ZT开头 + "^75\\d{8}$", // 10位,75开头 + "^73\\d{10}$", // 12位,73开头 + "^77\\d{10}$", // 12位,77开头 + "^\\d{10}$", // 10位纯数字(中通常见) + "^\\d{12}$" // 12位纯数字(中通常见) + }, 1)); + + // 2. 顺丰速运 (SF) + RULES.add(new ExpressRule("shunfeng", "顺丰速运", new String[]{ + "^SF\\d{13}$", // SF+13位数字 + "^SF\\d{10}$", // SF+10位数字 + "^1[0-2]\\d{10}$", // 10、11、12开头+10位数字 + "^00\\d{10}$", // 00开头+10位数字 + "^118\\d{9}$", // 118开头+9位数字 + "^SF\\w{2}\\d{8}$", // SF+2字母+8数字 + "^SF\\d{12}$" // SF+12位数字 + }, 1)); + + // 3. 圆通速递 (YTO) + RULES.add(new ExpressRule("yuantong", "圆通速递", new String[]{ + "^YT\\d{10,}$", // YT开头 + "^YTO\\d{10,}$", // YTO开头 + "^8[0-6]\\d{8}$", // 80-86开头+8位数字(10位) + "^8[0-6]\\d{10}$", // 80-86开头+10位数字(12位) + "^1[0-9]\\d{11}$", // 10-19开头+11位数字(13位) + "^[DV]\\d{10}$", // D或V开头+10位数字 + "^Y\\d{10}$" // Y开头+10位数字 + }, 2)); + + // 4. 申通快递 (STO) + RULES.add(new ExpressRule("shentong", "申通快递", new String[]{ + "^ST\\d{10,}$", // ST开头 + "^STO\\d{10,}$", // STO开头 + "^SHEX\\d{8,}$", // SHEX开头 + "^7[7-8]\\d{10}$", // 77或78开头+10位数字(12位) + "^33\\d{10}$", // 33开头+10位数字 + "^55\\d{10}$", // 55开头+10位数字 + "^66\\d{10}$", // 66开头+10位数字 + "^88\\d{10}$" // 88开头+10位数字 + }, 2)); + + // 5. 韵达快递 (YD) + RULES.add(new ExpressRule("yunda", "韵达快递", new String[]{ + "^YD\\d{10,}$", // YD开头 + "^YUNDA\\d{8,}$", // YUNDA开头 + "^39\\d{11}$", // 39开头+11位数字(13位) + "^19\\d{11}$", // 19开头+11位数字 + "^15\\d{11}$", // 15开头+11位数字 + "^55\\d{11}$", // 55开头+11位数字 + "^17\\d{11}$", // 17开头+11位数字 + "^1[2-9]\\d{11}$", // 12-19开头+11位数字 + "^\\d{13}$" // 13位纯数字 + }, 2)); + + // 6. 京东物流 (JD) + RULES.add(new ExpressRule("jd", "京东物流", new String[]{ + "^JD\\d{10,}$", // JD开头 + "^JDX\\d{9,}$", // JDX开头 + "^JDL\\d{9,}$", // JDL开头 + "^JDV\\d{9,}$", // JDV开头 + "^VA\\d{9}$", // VA开头+9位数字 + "^JD\\d{11}$", // JD+11位数字 + "^J\\d{12}$" // J+12位数字 + }, 3)); + + // 7. 极兔速递 (JT) + RULES.add(new ExpressRule("jtexpress", "极兔速递", new String[]{ + "^JT\\d{10,}$", // JT开头 + "^JTSD\\d{8,}$", // JTSD开头 + "^JITU\\d{8,}$", // JITU开头 + "^JT\\d{12}$", // JT+12位数字 + "^J\\d{13}$" // J+13位数字 + }, 3)); + + // 8. 邮政EMS (EMS) + RULES.add(new ExpressRule("ems", "邮政EMS", new String[]{ + "^1\\d{12}$", // 1开头+12位数字(13位) + "^E\\d{13}$", // E开头+13位数字 + "^9[0-9]\\d{10}$", // 90-99开头+10位数字(12位) + "^EMS\\d{9,}$", // EMS开头 + "^9\\d{11}$", // 9开头+11位数字(12位) + "^CN\\d{13}$" // CN开头+13位数字 + }, 3)); + + // 9. 百世快递 (BS) + RULES.add(new ExpressRule("baishiwuliu", "百世快递", new String[]{ + "^BS\\d{9,}$", // BS开头 + "^HT\\d{9,}$", // HT开头 + "^HTKY\\d{8,}$", // HTKY开头 + "^12\\d{10}$", // 12开头+10位数字 + "^A\\d{10}$", // A开头+10位数字 + "^\\d{12}$" // 12位纯数字(默认) + }, 4)); + + // 10. 德邦快递 (DBL) + RULES.add(new ExpressRule("debangwuliu", "德邦快递", new String[]{ + "^DB\\d{9,}$", // DB开头 + "^DBL\\d{8,}$", // DBL开头 + "^DEPPON\\d{8,}$", // DEPPON开头 + "^[0-9]{8}$", // 8位纯数字 + "^[0-9]{10}$", // 10位纯数字 + "^[0-9]{12}$", // 12位纯数字 + "^5\\d{9}$" // 5开头+9位数字 + }, 4)); + + // 11. 其他快递公司(优先级较低) + RULES.add(new ExpressRule("zhaijisong", "宅急送", new String[]{ + "^ZJS\\d{9,}$" // ZJS开头 + }, 5)); + + RULES.add(new ExpressRule("guoeryue", "天天快递", new String[]{ + "^TT\\d{9,}$", // TT开头 + "^6\\d{9}$" // 6开头+9位数字 + }, 5)); + + RULES.add(new ExpressRule("qf", "全峰快递", new String[]{ + "^QF\\d{9,}$", // QF开头 + "^QFKD\\d{8,}$" // QFKD开头 + }, 5)); + + RULES.add(new ExpressRule("uc", "优速快递", new String[]{ + "^UC\\d{9,}$" // UC开头 + }, 5)); + + RULES.add(new ExpressRule("yz", "邮政包裹", new String[]{ + "^9\\d{11}$", // 9开头+11位数字 + "^YZ\\d{10,}$" // YZ开头 + }, 5)); + } + + /** + * 识别快递公司(主方法) + * @param trackingNumber 快递单号 + * @return ExpressInfo对象,包含公司信息和置信度 + */ + public static ExpressInfo detect(String trackingNumber) { + if (trackingNumber == null || trackingNumber.trim().isEmpty()) { + return new ExpressInfo("unknown", "未知快递"); + } + + String cleanNumber = trackingNumber.trim().toUpperCase(); + + // 1. 首先尝试精确匹配(高优先级规则) + for (ExpressRule rule : RULES) { + if (rule.matches(cleanNumber)) { + return new ExpressInfo(rule.code, rule.name); + } + } + + // 2. 如果没有精确匹配,尝试模糊匹配 + ExpressInfo fuzzyMatch = fuzzyDetect(cleanNumber); + if (fuzzyMatch != null) { + return fuzzyMatch; + } + + // 3. 最终无法识别 + return new ExpressInfo("unknown", "未知快递"); + } + + /** + * 模糊匹配(当精确匹配失败时使用) + */ + private static ExpressInfo fuzzyDetect(String trackingNumber) { + // 纯数字单号的模糊识别 + if (trackingNumber.matches("^\\d+$")) { + return detectNumericOnly(trackingNumber); + } + + // 包含字母的模糊识别 + if (trackingNumber.matches("^[A-Z]+\\d+$")) { + return detectWithLetters(trackingNumber); + } + + return null; + } + + /** + * 纯数字单号识别 + */ + private static ExpressInfo detectNumericOnly(String number) { + int length = number.length(); + String prefix2 = length >= 2 ? number.substring(0, 2) : ""; + String prefix3 = length >= 3 ? number.substring(0, 3) : ""; + + // 根据长度和前缀猜测 + Map commonPatterns = new HashMap<>(); + + // 10位单号 + if (length == 10) { + commonPatterns.put("75", "中通快递"); + commonPatterns.put("73", "中通快递"); + commonPatterns.put("80", "圆通速递"); + commonPatterns.put("82", "圆通速递"); + } + + // 12位单号 + if (length == 12) { + commonPatterns.put("77", "申通快递"); + commonPatterns.put("88", "申通快递"); + commonPatterns.put("33", "申通快递"); + commonPatterns.put("12", "百世快递"); + commonPatterns.put("39", "韵达快递"); + commonPatterns.put("19", "韵达快递"); + } + + // 13位单号 + if (length == 13) { + commonPatterns.put("1", "邮政EMS"); + commonPatterns.put("39", "韵达快递"); + commonPatterns.put("19", "韵达快递"); + commonPatterns.put("10", "顺丰速运"); + } + + // 14位单号(你的例子) + if (length == 14) { + if (prefix2.equals("78")) { + return new ExpressInfo("zhongtong", "中通快递"); + } + } + + // 根据前缀匹配 + for (Map.Entry entry : commonPatterns.entrySet()) { + if (number.startsWith(entry.getKey())) { + String code = getCodeByName(entry.getValue()); + return new ExpressInfo(code, entry.getValue()); + } + } + + // 根据长度猜测 + switch (length) { + case 10: return new ExpressInfo("zhongtong", "中通快递"); + case 12: return new ExpressInfo("baishiwuliu", "百世快递"); + case 13: return new ExpressInfo("ems", "邮政EMS"); + case 14: return new ExpressInfo("zhongtong", "中通快递"); + default: return null; + } + } + + /** + * 包含字母的单号识别 + */ + private static ExpressInfo detectWithLetters(String trackingNumber) { + // 提取字母前缀 + String prefix = trackingNumber.replaceAll("^(\\D+).*$", "$1"); + + Map prefixMap = new HashMap<>(); + prefixMap.put("SF", "顺丰速运"); + prefixMap.put("JD", "京东物流"); + prefixMap.put("YT", "圆通速递"); + prefixMap.put("YTO", "圆通速递"); + prefixMap.put("ST", "申通快递"); + prefixMap.put("STO", "申通快递"); + prefixMap.put("ZT", "中通快递"); + prefixMap.put("ZTO", "中通快递"); + prefixMap.put("YD", "韵达快递"); + prefixMap.put("JT", "极兔速递"); + prefixMap.put("EMS", "邮政EMS"); + prefixMap.put("BS", "百世快递"); + prefixMap.put("DB", "德邦快递"); + prefixMap.put("ZJS", "宅急送"); + prefixMap.put("TT", "天天快递"); + + for (Map.Entry entry : prefixMap.entrySet()) { + if (prefix.startsWith(entry.getKey())) { + String code = getCodeByName(entry.getValue()); + return new ExpressInfo(code, entry.getValue()); + } + } + + return null; + } + + /** + * 根据公司名称获取编码 + */ + private static String getCodeByName(String name) { + Map nameToCode = new HashMap<>(); + nameToCode.put("中通快递", "zhongtong"); + nameToCode.put("顺丰速运", "shunfeng"); + nameToCode.put("圆通速递", "yuantong"); + nameToCode.put("申通快递", "shentong"); + nameToCode.put("韵达快递", "yunda"); + nameToCode.put("京东物流", "jd"); + nameToCode.put("极兔速递", "jtexpress"); + nameToCode.put("邮政EMS", "ems"); + nameToCode.put("百世快递", "baishiwuliu"); + nameToCode.put("德邦快递", "debangwuliu"); + nameToCode.put("宅急送", "zhaijisong"); + nameToCode.put("天天快递", "guoeryue"); + nameToCode.put("全峰快递", "qf"); + nameToCode.put("优速快递", "uc"); + nameToCode.put("邮政包裹", "yz"); + + return nameToCode.getOrDefault(name, "unknown"); + } + + /** + * 获取所有支持的快递公司 + */ + public static List getSupportedCompanies() { + Set companies = new LinkedHashSet<>(); + for (ExpressRule rule : RULES) { + companies.add(rule.name); + } + return new ArrayList<>(companies); + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/FileUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/FileUtil.java new file mode 100644 index 0000000..bc349af --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/FileUtil.java @@ -0,0 +1,233 @@ +package org.dromara.zhishu.util; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.List; +import java.util.Map; + + +public class FileUtil { + + /** + * 判断指定路径下的指定文件是否存在 + * + * @param filePath 文件的完整路径(包括文件名和扩展名) + * @return 存在返回 true,不存在返回 false + */ + public static boolean isFileExists(String filePath) { + if (filePath == null || filePath.trim().isEmpty()) { + return false; + } + + File file = new File(filePath); + return file.exists() && file.isFile(); + } + + public static boolean fileDelete(String filePath) { + if (filePath == null || filePath.trim().isEmpty()) { + return false; + } + + File file = new File(filePath); + if (file.exists() && file.isFile()) { + if (file.delete()) { + System.out.println("原文件删除成功: " + filePath); + return true; + } else { + System.err.println("尝试删除原文件时发生错误: " + filePath); + return false; + } + } else { + System.err.println("未找到原文件或不是文件: " + filePath); + return false; + } + } + + /** + * 校验文件大小是否超过指定值 + * @param filePath 文件路径 + * @return 如果文件大小超过最大值返回 true,否则返回 false + */ + public static boolean isFileSizeExceeds(String filePath) { + long maxSize = 1024 * 1024 * 2; // 2MB + File file = new File(filePath); + if (file.exists() && file.isFile()) { + return file.length() > maxSize; + } + return false; + } + + /** + * 根据路径获取TXT文件内容,如果文件不存在则创建。 + * + * @param filePath 文件的路径 + * @param contentToAppend 要追加的内容 + * @return 文件的完整内容 + */ + public static String processTxtFile(String filePath, String contentToAppend) { + try { + File file = new File(filePath); + + // 确保父目录存在 + if (!file.getParentFile().exists()) { + if (!file.getParentFile().mkdirs()) { + throw new IOException("无法创建目标目录: " + file.getParent()); + } + } + + // 如果文件不存在,则创建 + if (!file.exists()) { + file.createNewFile(); + } + + // 读取文件内容 + String fileContent = new String(Files.readAllBytes(Paths.get(filePath))); + + // 追加内容并换行 + try (FileWriter writer = new FileWriter(file, true)) { + writer.write(System.lineSeparator() + contentToAppend); + } + + return fileContent; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static String convertToBase64(MultipartFile file) { + try { + InputStream inputStream = new ByteArrayInputStream(file.getBytes()); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + byte[] buffer = new byte[1024]; + int bytesRead; + + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + byte[] byteArray = outputStream.toByteArray(); + return Base64.getEncoder().encodeToString(byteArray); + } catch (Exception e) { + // 处理异常 + e.printStackTrace(); + return null; + } + } + + + /** + * 通用参数日志记录方法 + * @param methodName 方法名称 + * @param parameters 可变参数,可以传入任意数量的参数 + */ + public static void logParameters(String methodName, Object... parameters) { + FileWriter fileWriter = null; + BufferedWriter bufferedWriter = null; + + try { + // 获取当前项目路径 + String projectPath = System.getProperty("user.dir"); + String logDirPath = projectPath + File.separator + methodName; + File logDir = new File(logDirPath); + + // 创建目录(如果不存在) + if (!logDir.exists()) { + logDir.mkdirs(); + } + + // 查找可用的日志文件(不超过50MB) + File logFile = findAvailableLogFile(logDir); + + // 创建文件写入器(追加模式) + fileWriter = new FileWriter(logFile, true); + bufferedWriter = new BufferedWriter(fileWriter); + + // 构建日志内容 + StringBuilder logContent = new StringBuilder(); + logContent.append("=== Method Parameter Log ===\n"); + logContent.append("Time: ").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append("\n"); + logContent.append("Method: ").append(methodName).append("\n"); + + // 记录所有参数 + logContent.append("Parameters:\n"); + if (parameters != null && parameters.length > 0) { + for (int i = 0; i < parameters.length; i++) { + Object param = parameters[i]; + String paramJson = JsonUtil.transferToJson(param); + logContent.append(" Parameter ").append(i + 1).append(": ").append(paramJson).append("\n"); + } + } else { + logContent.append(" No parameters\n"); + } + + logContent.append("=============================\n\n"); + + // 写入日志 + bufferedWriter.write(logContent.toString()); + bufferedWriter.flush(); + + } catch (Exception e) { + // 日志记录失败不应该影响主流程,只打印错误信息 + e.printStackTrace(); + } finally { + // 关闭资源 + try { + if (bufferedWriter != null) { + bufferedWriter.close(); + } + if (fileWriter != null) { + fileWriter.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 查找可用的日志文件(不超过50MB) + * @param logDir 日志目录 + * @return 可用的日志文件 + */ + private static File findAvailableLogFile(File logDir) { + // 基础日志文件名 + String baseFileName = "stock_sync_log"; + String fileExtension = ".txt"; + + // 首先检查当前日期的最新文件 + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String todayFileName = baseFileName + "_" + currentDate + fileExtension; + File todayFile = new File(logDir, todayFileName); + + // 如果文件不存在,直接返回新文件 + if (!todayFile.exists()) { + return todayFile; + } + + // 如果文件存在且小于50MB,则使用该文件 + if (todayFile.length() < 50 * 1024 * 1024) { // 50MB in bytes + return todayFile; + } + + // 如果今天的文件已满,创建带序号的新文件 + int fileIndex = 1; + File newFile; + do { + String newFileName = baseFileName + "_" + currentDate + "_" + fileIndex + fileExtension; + newFile = new File(logDir, newFileName); + fileIndex++; + } while (newFile.exists() && newFile.length() >= 50 * 1024 * 1024); + + return newFile; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ImageUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ImageUtils.java new file mode 100644 index 0000000..31d2e71 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ImageUtils.java @@ -0,0 +1,172 @@ +package org.dromara.zhishu.util; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class ImageUtils { + + private static final String CACHE_DIR = System.getProperty("java.io.tmpdir"); // 获取系统缓存目录 + private static final String IMAGE_PATH = CACHE_DIR + File.separator; // 图片完整路径 + + /** + * 生成图片并保存到缓存文件夹 + * + * @param text 要显示的字符串 + * @param width 图片宽度 + * @param height 图片高度 + * @param fileName 文件名称 例如 123.jpg + */ + public static String generateImage(String text, int width, int height,String fileName) { + // 创建一个白底的BufferedImage + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = image.createGraphics(); + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, width, height); + + // 设置字体和颜色 + Font font = new Font("Alibaba PuHuiTi", Font.BOLD, 40); + g2d.setFont(font); + g2d.setColor(Color.BLACK); + + // 计算字符串的宽度和高度 + FontMetrics fm = g2d.getFontMetrics(); + int textWidth = fm.stringWidth(text); + int textHeight = fm.getHeight(); + + // 计算字符串的绘制位置 + int x = (width - textWidth) / 2; + int y = (height - textHeight) / 2 + fm.getAscent(); + + // 绘制字符串 + g2d.drawString(text, x, y); + + // 释放资源 + g2d.dispose(); + + // 保存图片到缓存文件夹 + try { + File outputFile = new File(IMAGE_PATH+fileName); + ImageIO.write(image, "jpg", outputFile); + return IMAGE_PATH+fileName; + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + + public static boolean isImageExists(String imageUrl) { + try { + URL url = new URL(imageUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("HEAD"); + int responseCode = connection.getResponseCode(); + return responseCode == HttpURLConnection.HTTP_OK; + } catch (Exception e) { + return false; + } + } + + /** + * 判断文件是否存在 + * + * @param absolutePath 文件的绝对路径 + * @return 如果文件存在返回 true,否则返回 false + */ + public static boolean isFileExists(String absolutePath) { + Path path = Paths.get(absolutePath); + return Files.exists(path); + } + + public static boolean isImageExistsWithGet(String imageUrl) { + try { + URL url = new URL(imageUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setRequestProperty("User-Agent", "Java Client"); + + int responseCode = connection.getResponseCode(); + return responseCode == HttpURLConnection.HTTP_OK; + } catch (Exception e) { + return false; + } + } + + /** + * 生成图片,左上开头 + * @param text + * @param width + * @param height + * @param fileName + * @return + */ + public static String generateMultiLineImage(String text, int width,int height, String fileName) { + String[] lines = text.split("\n"); + + // 设置字体样式 + Font font = new Font("Alibaba PuHuiTi", Font.BOLD, 20); + + // 创建临时图像用于计算字体大小 + BufferedImage tempImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2dTemp = tempImage.createGraphics(); + g2dTemp.setFont(font); + FontMetrics fm = g2dTemp.getFontMetrics(); + int lineHeight = fm.getHeight(); + int ascent = fm.getAscent(); + g2dTemp.dispose(); + + // 创建实际图像 + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = image.createGraphics(); + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, width, height); + g2d.setFont(font); + g2d.setColor(Color.BLACK); + + // 绘制文本 + int y = 10 + ascent; + int lineCount = 0; + + for (String line : lines) { + if (y + lineHeight > height) { + // 如果超出高度,则画 ... + if (lineCount == 0) { + // 整段都放不下,尝试截断 + String truncated = ContentUtils.truncateLineToFit(line, width, fm, "..."); + g2d.drawString(truncated, 10, y); + } else { + g2d.drawString("...", 10, y); + } + break; + } + + g2d.drawString(line, 10, y); + y += lineHeight + 5; // 每行间距 5px + lineCount++; + } + + g2d.dispose(); + + // 保存图片到缓存文件夹 + try { + File outputFile = new File(IMAGE_PATH+fileName); + ImageIO.write(image, "jpg", outputFile); + return IMAGE_PATH+fileName; + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/JsonExporterUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/JsonExporterUtils.java new file mode 100644 index 0000000..8fb2590 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/JsonExporterUtils.java @@ -0,0 +1,49 @@ +package org.dromara.zhishu.util; + +import cn.hutool.json.JSONUtil; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * 导出json文件工具类 + */ +public class JsonExporterUtils { + + /** + * 导出json文件方法 + * + * @param data 导出数据对象 + * @param filename 导出文件名称 + * @param + * @return + * @throws IOException + */ + public static ResponseEntity exportJsonAsFile(List data, String filename) throws IOException { + if (data == null || data.isEmpty()) { + throw new IllegalArgumentException("Data cannot be null or empty."); + } + + // 将列表转换为JSON字符串 + String jsonStr = JSONUtil.toJsonStr(data); + + // 将JSON字符串写入ByteArrayOutputStream + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(jsonStr.getBytes()); + ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + + // 设置响应头,让浏览器知道这是一个文件下载 + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename); + headers.setContentType(MediaType.APPLICATION_JSON); + + return new ResponseEntity<>(new InputStreamResource(in), headers, HttpStatus.OK); + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/KongfzApiUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/KongfzApiUtils.java new file mode 100644 index 0000000..b89b01a --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/KongfzApiUtils.java @@ -0,0 +1,85 @@ +package org.dromara.zhishu.util; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +@Log4j2 +@RequiredArgsConstructor +public class KongfzApiUtils { + private static final String API_URL = "https://api.kongfz.com/router/rest"; + @Value("${kongfz.appId}") + private String appId; + @Value("${kongfz.appSecret}") + private String appSecret; + @Value("${kongfz.accessToken}") + private String accessToken; + + + /** + * 生成当前时间字符串 + */ + public static String getCurrentDateTime() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + sdf.setTimeZone(TimeZone.getTimeZone("GMT+8")); + return sdf.format(new Date()); + } + + /** + * 生成签名 + */ + + public static String generateSign(Map params, String secretKey) { + StringBuilder paramStr = new StringBuilder(); + for (Map.Entry entry : params.entrySet()) { + paramStr.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + paramStr.append("secret=").append(secretKey); + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + byte[] digest = md.digest(paramStr.toString().getBytes()); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b & 0xff)); + } + return sb.toString(); + } + + public static Map buildKongfzParams(String appId, String secretKey) throws NoSuchAlgorithmException { + Map params = new HashMap<>(); + params.put("method", "kongfz.shop.simple.get"); + params.put("appId", appId); + // 若需要授权,设置 accessToken + // params.put("accessToken", "YOUR_ACCESS_TOKEN"); + params.put("datetime", getCurrentDateTime()); + params.put("format", "json"); + params.put("v", "1.0"); + params.put("signMethod", "md5"); + String sign = generateSign(params, secretKey); + params.put("sign", sign); + params.put("simplify", "0"); + return params; +} + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ListUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ListUtils.java new file mode 100644 index 0000000..2671c46 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ListUtils.java @@ -0,0 +1,34 @@ +package org.dromara.zhishu.util; + +import java.util.*; +import java.util.stream.Collectors; + +public class ListUtils { + + /** + * 根据两个字段组合去重 + * + * @param list 数据列表 + * @param key1 第一个字段名 + * @param key2 第二个字段名 + * @return 去重后的列表 + */ + public static List> removeDuplicatesByTwoKeys( + List> list, String key1, String key2) { + + Set> seen = new HashSet<>(); + List> result = new ArrayList<>(); + + for (Map map : list) { + if (map.containsKey(key1) && map.containsKey(key2)) { + List compositeKey = Arrays.asList(map.get(key1), map.get(key2)); + if (!seen.contains(compositeKey)) { + seen.add(compositeKey); + result.add(map); + } + } + } + + return result; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/LoginUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/LoginUtils.java new file mode 100644 index 0000000..7f896d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/LoginUtils.java @@ -0,0 +1,31 @@ +// 创建新文件: org.dromara.zhishu.util.LoginUtils.java +package org.dromara.zhishu.util; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; + +import org.dromara.zhishu.domain.PddLoginVo; +import org.dromara.zhishu.domain.PddLoginVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import static cn.dev33.satoken.SaManager.log; + +@Component +@RequiredArgsConstructor +public class LoginUtils { + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/NewTaskUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/NewTaskUtils.java new file mode 100644 index 0000000..a5856aa --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/NewTaskUtils.java @@ -0,0 +1,22 @@ +package org.dromara.zhishu.util; + +import com.pdd.pop.sdk.common.util.JsonUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NewTaskUtils { + + public static String newTaskPost(String taskId,String shopId,List bodyList){ + Map requestShopDataMap = new HashMap(); + requestShopDataMap.put("shopId",shopId); + requestShopDataMap.put("data", JsonUtil.transferToJson(bodyList)); + String shopDataListStr = InterfaceUtils.postForm("http://119.45.237.193:14008","/shopGoods/getShopGoods",requestShopDataMap); + // String shopDataListStr = InterfaceUtils.postForm("http://localhost:18099","/shopGoods/getShopGoods",requestShopDataMap); + List shopDataList = JsonUtil.transferToObj(shopDataListStr,List.class); + String response = InterfaceUtils.postTaskBodyWithSign(UrlUtil.getNewTaskUrl(), "/task/setTaskBody", taskId.toString(), shopDataList); + System.out.println("新发布任务发布"+bodyList.size()+"条"+";查询后数据:"+shopDataList.size()+"条"); + return response; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/OcrUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/OcrUtil.java new file mode 100644 index 0000000..efec0d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/OcrUtil.java @@ -0,0 +1,42 @@ +package org.dromara.zhishu.util; + +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import com.tencentcloudapi.common.AbstractModel; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.ocr.v20181119.OcrClient; + +/** + * ocr工具类 + */ +@Component +@Log4j2 +@RequiredArgsConstructor +public class OcrUtil { + + public OcrClient upload(MultipartFile file){ +// try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性 + // 以下代码示例仅供参考,建议采用更安全的方式来使用密钥 + // 请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential("AKID4ECwSkodEbjdIiusAJFE3e2DB3h7IIFy", "av2zkGaoobBYheNs8AyXu3yd7PTccPnz"); + // 使用临时密钥示例 + // Credential cred = new Credential("SecretId", "SecretKey", "Token"); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ocr.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + OcrClient client = new OcrClient(cred, "", clientProfile); + return client; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PddResultUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PddResultUtil.java new file mode 100644 index 0000000..3ede6fe --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PddResultUtil.java @@ -0,0 +1,16 @@ +package org.dromara.zhishu.util; + +import jakarta.servlet.http.HttpServletRequest; + +import java.util.HashMap; +import java.util.Map; + +public class PddResultUtil { + + public static Map getPddHeaderMap(HttpServletRequest request){ + Map headers = new HashMap<>(); + headers.put("X-PDD-Pati", request.getHeader("X-PDD-Pati")); // 从请求头获取 + headers.put("X-PDD-PageCode", request.getHeader("X-PDD-PageCode")); // 自定义 Head + return headers; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PricingUrlUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PricingUrlUtil.java new file mode 100644 index 0000000..e254839 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/PricingUrlUtil.java @@ -0,0 +1,181 @@ +package org.dromara.zhishu.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; +import com.fasterxml.jackson.core.type.TypeReference; +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; +import java.util.List; + +@Component +@Log4j2 +@RequiredArgsConstructor +public class PricingUrlUtil { + + private String publicKeyStr= "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmdgZjjpySFAd+3Go33tshTOhRcSl6Sl4x8bR5vrEzsvFqQQW+VXLco0E1jy9dIR4NguRIGWOowi/4EU5PEM3ZVrXQCxCnyyqIuuDtY9QNTh5DTn60aDOLEL2X7+mvICgFg+VAKPik+8fBSUfzcGiLqFlx+VhUAkq9hCyd/wtYInuAxPSoCr8F2cmI4/V6sAhVUkHUZhJvWlyDLUpYKOGgYM4rXjCXXKrPO0FNf1iY70AWACSJmXUwBVuIRYWfTRVOvzEPWkp/tuqir/XcvMfKKVU5/eCr8abNVIG99HTF1iKvQPdQUldAyk5z9YPV5IwAbrjlEACmJ5JvuT3bypewIDAQAB"; + private String privateKeyStr= "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqZ2BmOOnJIUB37cajfe2yFM6FFxKXpKXjHxtHm+sTOy8WpBBb5VctyjQTWPL10hHg2C5EgZY6jCL/gRTk8QzdlWtdALEKfLKoi64O1j1A1OHkNOfrRoM4sQvZfv6a8gKAWD5UAo+KT7x8FJR/NwaIuoWXH5WFQCSr2ELJ3/C1gie4DE9KgKvwXZyYjj9XqwCFVSQdRmEm9aXIMtSlgo4aBgziteMJdcqs87QU1/WJjvQBYAJImZdTAFW4hFhZ9NFU6/MQ9aSn+26qKv9dy8x8opVTn94Kvxps1Ugb30dMXWIq9A91BSV0DKTnP1g9XkjABuuOUQAKYnkm+5PdvKl7AgMBAAECggEAY0xmYmsb4PadiMVokXEaiEGTrv6o+PEbMeS4ktwK+mPsprboSYS1bpt8CSI2QoUtoeaX35fcITX0VwuzT04gfydJLyLuB/xuZ8Utoru5agQjtkYWN4YZhXm2PAHDACuyxXOmrnHnj2OzpGKhvhgkmJyIqG3hRYsBU5psIRN8Q2gnCarhiB948YDu6EfvFJPv0ET9T+mzQWLmMVz+lorepfcXV1Wwvr0awRPfyS2s7te9AW4GYEzKN9ijZx05XnYOSgh/hD82iqh+poPXiqamhZGcQBQ8CveVbyNatTpbZYca8gXByOIipSEqg3UVQ2rnd/hYAh4VKSagyKXtFt7REQKBgQDgjGtbit3JK8jJuQTWBqgNHWphc1/4tAidjWeEF1NBi0NZuSZiVLoh9J794lO67psAZheZV70gXD9pHF7tiSESTIsHZiOtU9rrEVACc6EHJIeBrmB4oNWvzzix5S0S6RZxLYm5oiEoNjXSfqcFqCHGiT3lnxUhSp3JywlcIx0QZQKBgQDCRYEMt+u0Hp8JbhxhHx5Z87dZRJe0AGRQXnz3blxq+MTIVB6oj6NKBxPN6BmNLGI/xnxO8XTog5JCv9SZRZpY6eZmdCt2sVK2k2i1kxpd3sLjlbFTNnyC9RJFeZMjIlvW03KmDu0VBDf4CW/zSP3aej+vgxvOZesYcgI9isoEXwKBgEmrJ+mflIXUfIpZzhFdm7K5zNXt4TWZ8x2lb6mxcVoWk2ETUll+TJapR6Qppai1cVrfI6zmUSEVwqP8b9RkYdo8DHy/8MKDuVXXlzVGtDTAskhEalgJBDIqvQH4GyKSIA+/jei+HTyxFFVbwfYkI/ibvBfiai9C6KN0njyBNJ7VAoGAVgDZCZ1efmXT+CPD8ocJM78+GwnPswM9ZYr+/bbguQaabyk2TV8RZdNORCiNLz9H233uSDCClfCxTlWIM7ZphxU9R3wERc5olKUbhM6zrHzSgFgjoXgMlRkTVqhkp/gs+iSvq64N7PDqKidbZTOaFh9qlDORmsTp1++Y6E/J8TcCgYEA0cszTR9OuvrQDpiX5PW+HB66GIxuEFBCla0HphtV16i/tzXnIaZ6q2hf1e9qejO3lOIzi3e1PVHOuMIemzl17batonERhBIjDYEtGraFyaHSgkp+zRdjPGj8A0dq7iwdv0M4ravQcF9dVvfEucVhN3XSJXSqdJRSoZzOvRZH4VY="; + private static final String AES_ALGORITHM = "AES/GCM/NoPadding"; + private static final String RSA_ALGORITHM = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"; + private static final int GCM_IV_LENGTH = 12; + private static final int GCM_TAG_LENGTH = 16; + + + + + + /** + * 加密List集合 + * @param plaintextList 原始文本列表 + * @return Base64编码的加密数据 + */ + public String encryptList(List plaintextList) throws Exception { + // 将List转换为JSON字符串 + ObjectMapper mapper = new ObjectMapper(); + String jsonString = mapper.writeValueAsString(plaintextList); + + // 使用现有的加密方法加密JSON字符串 + return encrypt(jsonString); + } + + + /** + * 解密List集合 + * @param encryptedData Base64编码的加密数据 + * @return 原始文本列表 + */ + public List decryptList(String encryptedData) throws Exception { + // 先解密得到JSON字符串 + String jsonString = decrypt(encryptedData); + + // 将JSON字符串转换回List + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(jsonString, new TypeReference>() {}); + } + + + + /** + * 加密方法(不限长度) + * @param plaintext 原始文本 + // * @param publicKeyStr RSA公钥(Base64编码) + * @return Base64编码的加密数据 + */ + public String encrypt(String plaintext) throws Exception { + // 1. 生成随机的AES密钥 + KeyGenerator keyGen = KeyGenerator.getInstance("AES"); + keyGen.init(256); // AES-256 + SecretKey aesKey = keyGen.generateKey(); + + // 2. 使用AES加密数据 + byte[] iv = new byte[GCM_IV_LENGTH]; + SecureRandom random = new SecureRandom(); + random.nextBytes(iv); + + Cipher aesCipher = Cipher.getInstance(AES_ALGORITHM); + GCMParameterSpec ivSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); + aesCipher.init(Cipher.ENCRYPT_MODE, aesKey, ivSpec); + byte[] encryptedData = aesCipher.doFinal(plaintext.getBytes("UTF-8")); + + // 3. 使用RSA加密AES密钥 + PublicKey publicKey = getPublicKey(publicKeyStr); + Cipher rsaCipher = Cipher.getInstance(RSA_ALGORITHM); + rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); + + // 4. 组合IV + 加密的AES密钥 + 加密的数据 + ByteBuffer byteBuffer = ByteBuffer.allocate( + GCM_IV_LENGTH + encryptedAesKey.length + encryptedData.length + ); + byteBuffer.put(iv); + byteBuffer.put(encryptedAesKey); + byteBuffer.put(encryptedData); + + // 5. 返回Base64编码结果 + return Base64.getEncoder().encodeToString(byteBuffer.array()); + } + + private static PublicKey getPublicKey(String publicKeyStr) throws Exception { + byte[] encodedKey = Base64.getDecoder().decode(publicKeyStr); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); + } + // 解密方法 + public String decrypt(String encryptedData) throws Exception { + // 1. 解码Base64并分离各部分 + //将encryptedData中的空格转为+号 + String encryptedData1 = encryptedData.replace(" ", "+"); + byte[] decoded = Base64.getDecoder().decode(encryptedData1); + ByteBuffer byteBuffer = ByteBuffer.wrap(decoded); + + byte[] iv = new byte[GCM_IV_LENGTH]; + byteBuffer.get(iv); + + // RSA密钥长度决定加密后的AES密钥长度(2048位密钥加密后是256字节) + byte[] encryptedAesKey = new byte[256]; + byteBuffer.get(encryptedAesKey); + + byte[] remainingData = new byte[byteBuffer.remaining()]; + byteBuffer.get(remainingData); + + // 2. 使用RSA解密AES密钥 + byte[] encodedPrivateKey = Base64.getDecoder().decode(privateKeyStr); + PrivateKey privateKey = KeyFactory.getInstance("RSA") + .generatePrivate(new PKCS8EncodedKeySpec(encodedPrivateKey)); + + Cipher rsaCipher = Cipher.getInstance(RSA_ALGORITHM); + rsaCipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] aesKeyBytes = rsaCipher.doFinal(encryptedAesKey); + SecretKey aesKey = new SecretKeySpec(aesKeyBytes, "AES"); + + // 3. 使用AES解密数据 + GCMParameterSpec ivSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); + Cipher aesCipher = Cipher.getInstance(AES_ALGORITHM); + aesCipher.init(Cipher.DECRYPT_MODE, aesKey, ivSpec); + + byte[] decryptedData = aesCipher.doFinal(remainingData); + return new String(decryptedData, StandardCharsets.UTF_8); + } + + + /** + * 获取加密后的URL + * + * @param url 原始URL + * @return 加密后的URL + */ + public String getPricingUrl(String url) { + try { + String encryptedUrl = encrypt(url); + return encryptedUrl; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 获取加密后的URL + * + * @param url 原始URL + * @return 加密后的URL + */ + public String getPricingUrlList(List url) { + try { + String encryptedUrl = encryptList(url); + return encryptedUrl; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/RunningLogUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/RunningLogUtils.java new file mode 100644 index 0000000..33055b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/RunningLogUtils.java @@ -0,0 +1,134 @@ +package org.dromara.zhishu.util; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.poi.ss.formula.functions.T; +import org.aspectj.lang.ProceedingJoinPoint; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.zhishu.domain.bo.RunningLogFileBo; +import org.dromara.zhishu.domain.vo.ProductForm; +import org.dromara.zhishu.service.IRunningLogFileService; + +import java.math.BigDecimal; +import java.util.Map; + +public class RunningLogUtils { + + private static IRunningLogFileService runningLogFileService; + + private RunningLogUtils(){} + + public static void init(IRunningLogFileService service) { + runningLogFileService = service; + } + + + public static Object runningLog(ProceedingJoinPoint joinPoint, Map data , String content,String fileType){ + //日志记录 用户id + String userId = data.get("userId").toString(); + String methodName = joinPoint.getSignature().getName(); + // 1.根据文件类型获取文件最大顺序 + String maxOrder = runningLogFileService.selectMaxFileOrderByFileTypeAndCreateBy(fileType,userId); + content = "【"+fileType + "】" + content; + Object result = ""; + try{ + /** + * 调用日志方法 + */ + maxOrder = RunningLogUtils.editRunning(fileType,"【日志开始,方法名称:"+methodName+"】"+content,maxOrder,userId); + maxOrder = RunningLogUtils.editRunning(fileType,"【执行参数】"+ JsonUtils.toJsonString(data),maxOrder,userId); + // 执行方法 + result = joinPoint.proceed(); + maxOrder = RunningLogUtils.editRunning(fileType,"【返回参数】"+JsonUtils.toJsonString(result),maxOrder,userId); + +// //获取成功日志文件 +// //获取当前日期 +// String successNum = EasyExcelUtil.readFileContentString(UrlUtil.getUrl()+"log/"+DateUtils.dataYMD()+"_successNumLog.txt"); +// successNum = successNum.replaceAll("\r\n", ""); +// if(StringUtils.isEmpty(successNum)){ +// successNum = "1"; +// }else{ +// successNum = new BigDecimal(successNum).add(new BigDecimal(1)).toString(); +// } +// //记录成功数据日志 +// EasyExcelUtil.writeJsonToFile("log/"+DateUtils.dataYMD()+"_successNumLog.txt",successNum); + + }catch (Throwable e){ + String msgAll = ExceptionUtils.getStackTrace(e); + maxOrder = RunningLogUtils.editRunning(fileType,"【系统异常】【异常方法】"+methodName,maxOrder,userId); + maxOrder = RunningLogUtils.editRunning(fileType,"【系统异常】【异常内容】"+msgAll,maxOrder,userId); +// //获取失败日志文件 +// String errorNum = EasyExcelUtil.readFileContentString(UrlUtil.getUrl()+"log/"+DateUtils.dataYMD()+"_errorNumLog.txt"); +// errorNum = errorNum.replaceAll("\r\n", ""); +// if(StringUtils.isEmpty(errorNum)){ +// errorNum = "1"; +// }else{ +// errorNum = new BigDecimal(errorNum).add(new BigDecimal(1)).toString(); +// } +// //记录失败日志 +// EasyExcelUtil.writeJsonToFile("log/"+DateUtils.dataYMD()+"_errorNumLog.txt",errorNum); + } finally { + maxOrder = RunningLogUtils.editRunning(fileType,"【日志结束,方法名称:"+methodName+"】"+content,maxOrder,userId); + + } + return result; + } + + /** + * 编写运行日志 + * @param fileTyle 文件类型 + * @param context 日志内容 + * @param maxOrder 文件最大顺序 + */ + public static String editRunning(String fileTyle,String context,String maxOrder,String userId){ + /** + * 处理日志 + * 时间+日志信息 + */ + context = "【"+DateUtils.getTime() + "】" + context; + /** + * 执行文件 + */ + String path = UrlUtil.getUrl() + "log/"; + String fileName = fileTyle + "_" + userId + "_"; + + if(StringUtils.isEmpty(maxOrder)){ + maxOrder = "1"; + + //生成新的文件名 + fileName += maxOrder; + //新增数据 + RunningLogFileBo bo = new RunningLogFileBo(); + bo.setFileName(fileName+".txt"); + bo.setFileType(fileTyle); + bo.setFileOrder(maxOrder); + bo.setCreateBy(Long.parseLong(userId)); + runningLogFileService.insertByBo(bo); + }else{ + // 2.根据 "文件类型+最大顺序" 生成文件名获取文件 + fileName += maxOrder; + // 3.判断文件大小,达到最大大小,则生成新的文件 + String pathMark = path + fileName + ".txt"; + + if(FileUtil.isFileSizeExceeds(pathMark)){ + //超过2M 则生成新文件 + maxOrder = new BigDecimal(maxOrder).add(new BigDecimal(1)).toString(); + //生成新的文件名 + fileName = fileTyle + "_" + userId + "_" + maxOrder; + //新增数据 + RunningLogFileBo bo = new RunningLogFileBo(); + bo.setFileName(fileName+".txt"); + bo.setFileType(fileTyle); + bo.setFileOrder(maxOrder); + bo.setCreateBy(Long.parseLong(userId)); + runningLogFileService.insertByBo(bo); + } + } + path = path+fileName+".txt"; + //处理好文件名称,写入文件 + FileUtil.processTxtFile(path,context); + + return maxOrder; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/TaskRunnable.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/TaskRunnable.java new file mode 100644 index 0000000..76c3e28 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/TaskRunnable.java @@ -0,0 +1,62 @@ +package org.dromara.zhishu.util; + + + +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.zhishu.domain.bo.TaskBo; +import org.dromara.zhishu.service.IPddService; +import org.dromara.zhishu.service.ITaskService; +import org.dromara.zhishu.service.IZhishuShopGoodsService; +import org.springframework.context.ApplicationContext; + +import java.util.Map; + +public class TaskRunnable implements Runnable { + + private final ITaskService taskService; + private ApplicationContext applicationContext; + + private final Map map; + private final TaskBo taskBo; + private final LoginUser user; + private final String type; + + + + public TaskRunnable(ITaskService taskService, Map map, TaskBo taskBo, LoginUser user,ApplicationContext applicationContext,String type) { + this.taskService = taskService; + this.map = map; + this.taskBo = taskBo; + this.user = user; + this.applicationContext = applicationContext; + this.type = type; + } + @Override + public void run() { + ITaskService taskService = applicationContext.getBean(ITaskService.class); + if(type.equals("1")){ + // 发布任务 + taskService.addGoods(map,taskBo,user.getUserId()); + }else if(type.equals("2")){ + //表格更新价格任务 + taskService.editGoodsPrice(map,taskBo,user.getUserId()); + }else if(type.equals("4")){ + //表格更新库存 + taskService.editGoodsStock(map,taskBo,user.getUserId()); + }else if(type.equals("5")){ + //修改商品上下架状态 + taskService.editGoodsIsOnSale(map,taskBo,user.getUserId()); + }else if(type.equals("6")){ + //手动同步库存任务 + taskService.stockSynchronize(map,taskBo,user.getUserId()); + }else if (type.equals("7")){ + //更新商品数据 + taskService.updateGoodsTask(map,taskBo,user.getUserId()); + } else{ + //核价任务 + taskService.addGoodsCenter(map,taskBo,user.getUserId()); + } + } +} + + diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ThreadPoolUtils.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ThreadPoolUtils.java new file mode 100644 index 0000000..98c916f --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/ThreadPoolUtils.java @@ -0,0 +1,74 @@ +package org.dromara.zhishu.util; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.*; + +/** + * 自定义线程创建工具类,创建线程池后不需要关闭 + * + * @author liangxn + */ +public class ThreadPoolUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolUtils.class); + private static ThreadPoolExecutor threadPool = null; + private static final String POOL_NAME = "myPool"; + // 等待队列长度 + private static final int BLOCKING_QUEUE_LENGTH = 20000; + // 闲置线程存活时间 + private static final int KEEP_ALIVE_TIME = 60 * 1000; + + private ThreadPoolUtils() { + throw new IllegalStateException("utility class"); + } + + + /** + * 无返回值直接执行 + * + * @param runnable 需要运行的任务 + */ + public static void execute(Runnable runnable) { + getThreadPool().execute(runnable); + } + + /** + * 有返回值执行 + * 主线程中使用Future.get()获取返回值时,会阻塞主线程,直到任务执行完毕 + * + * @param callable 需要运行的任务 + */ + public static Future submit(Callable callable) { + return getThreadPool().submit(callable); + } + + public static synchronized ThreadPoolExecutor getThreadPool() { + if (threadPool == null) { + // 获取处理器数量 + int cpuNum = Runtime.getRuntime().availableProcessors(); + // 根据cpu数量,计算出合理的线程并发数 + int maximumPoolSize = cpuNum * 2 + 1; + // 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂、当前线程数已经超过最大线程数时的异常处理策略 + threadPool = new ThreadPoolExecutor(maximumPoolSize - 1, + maximumPoolSize, + KEEP_ALIVE_TIME, + TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(BLOCKING_QUEUE_LENGTH), + new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(), + new ThreadPoolExecutor.AbortPolicy() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { + LOGGER.warn("线程爆炸了,当前运行线程总数:{},活动线程数:{}。等待队列已满,等待运行任务数:{}", + e.getPoolSize(), + e.getActiveCount(), + e.getQueue().size()); + } + }); + + } + + return threadPool; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/UploadUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/UploadUtil.java new file mode 100644 index 0000000..dd2a34c --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/UploadUtil.java @@ -0,0 +1,358 @@ +package org.dromara.zhishu.util; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.utils.EncryptUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zhishu.domain.LocalMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.io.File; +import java.io.*; +import java.util.UUID; + + +@Component +public final class UploadUtil { + + /** + * 上传文件 + * @param file 文件内容 + * @param name MD5加密前的名称 + * @param isbn ISBN + * @param num 顺序号 + * @return + */ + public static String upload(MultipartFile file, + String name, + String isbn, + String num, + String warehouseId, + String shelfId, + String locationId) { + // 获取文件后缀 + String originalfileName = file.getOriginalFilename(); + // 获取文件后缀 + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + + String path = "userShopGoodsImages/"+warehouseId+"/"+shelfId+"/"+locationId+"/"+isbn+num+suffix; +// System.out.println("上传图片地址:" + path); + try { + AliOssUtils.setIamge(path,file.getBytes()); + } catch (Exception e) { + System.out.println("上传失败"); + e.printStackTrace(); + return "上传失败"; + } + return path; + } + + /** + * 上传文件 + * @param file + * @return + */ + public static String upload(MultipartFile file,String folderName) { + + // 获取文件后缀 + String originalfileName = file.getOriginalFilename(); + String path = "other/"+ LoginHelper.getUserId()+"/"+folderName+"/"+originalfileName; +// System.out.println("上传图片地址:" + path); + try { + AliOssUtils.setIamge(path,file.getBytes()); + + return path; + } catch (Exception e) { + System.out.println("上传失败"); + e.printStackTrace(); + return "上传失败"; + } + } + + /** + * 获取文件路径 + * @param name 名称 + * @param fileName 文件名 + * @return + */ + public static String getFiles(String name, String fileName,String folderName,String objectName){ + + String path = ""; + if(folderName.equals("bookInfoImages")){ + String result = getMd5FirstChart(name); + path = folderName+"/"+result+"/"+fileName; + }else{ + path = objectName; + } + return AliOssUtils.getImagePath(path); + } + + /** + * 获取文件路径 + * @param bookName 书名 + * @param fileName 文件名 + * @return + */ + public static String getFiles(String imgVesselUrl,String bookName, String fileName){ + + if(StringUtils.isEmpty(imgVesselUrl)){ + imgVesselUrl = "https://img.buzhiyushu.cn/zhishu1"; + + String result = getMd5FirstChart(bookName); + + return imgVesselUrl + StringUtils.SLASH + result+StringUtils.SLASH+fileName; + + }else{ + return imgVesselUrl+fileName; + } + } + + + /** + * 根据MD5加密后获取大写首字母 + * @param bookName + * @return + */ + public static String getMd5FirstChart(String bookName){ + //书名进行md5加密 + String bookNameMd5 = EncryptUtils.encryptByMd5(bookName); + //获取加密后打首字母大写 + return StringUtils.getFirstCharToUpper(bookNameMd5); + } + + /** + * 校验图片文件宽高 + * @param file + * @return + * @throws IOException + */ + public static Boolean getImageDimensions(MultipartFile file) { + // 将 MultipartFile 转换为 BufferedImage + BufferedImage image = null; + try { + image = ImageIO.read(file.getInputStream()); + } catch (IOException e) { + return true; + } + + if (image == null) { + return true; + } + // 获取图片的长宽 + if(image.getWidth() == 800 && image.getHeight() == 800){ + return false; + }else{ + return true; + } + } + + public static MultipartFile getMultipartFileFromPath(String filePath){ + // 创建 File 对象 + File file = new File(filePath); + + MultipartFile multipartFile = new LocalMultipartFile(file); + + return multipartFile; + } + + public static MultipartFile getMultipartFileFromPathUrl(String filePath) { + try { + URL url = new URL(filePath); + // 提取文件后缀 + String fileSuffix = ""; + String path = url.getPath(); + int lastDotIndex = path.lastIndexOf("."); + if (lastDotIndex > 0 && lastDotIndex < path.length()) { + fileSuffix = path.substring(lastDotIndex); // 如 ".jpg" + } + + // 创建带后缀的临时文件 + Path tempFile = Files.createTempFile("upload-"+ UUID.randomUUID(), fileSuffix); + + // 下载远程文件到本地临时文件 + try (InputStream in = url.openStream()) { + Files.copy(in, tempFile, StandardCopyOption.REPLACE_EXISTING); + } + + // 构建 MultipartFile + return new LocalMultipartFile(tempFile.toFile()); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + } + + + /** + * 将主图和水印图片合成一张,水印图片完美覆盖主图 + * + * @param mainImageUrl 主图的 URL + * @param watermarkImageUrl 水印图片的 URL + */ + public static String mergeImages(String mainImageUrl, String watermarkImageUrl) throws IOException { + // 从 URL 读取主图 + BufferedImage mainImage = ImageIO.read(new URL(mainImageUrl)); + // 从 URL 读取水印图片 + BufferedImage watermarkImage = ImageIO.read(new URL(watermarkImageUrl)); + + // 获取主图的宽高 + int mainWidth = mainImage.getWidth(); + int mainHeight = mainImage.getHeight(); + + // 将水印图片缩放到主图的尺寸 + Image scaledWatermark = watermarkImage.getScaledInstance(mainWidth, mainHeight, Image.SCALE_SMOOTH); + + // 创建一个新的 BufferedImage,类型为 ARGB(支持透明度) + BufferedImage combined = new BufferedImage( + mainWidth, mainHeight, BufferedImage.TYPE_INT_ARGB); + + // 获取 Graphics2D 对象 + Graphics2D g2d = combined.createGraphics(); + + // 绘制主图 + g2d.drawImage(mainImage, 0, 0, null); + // 绘制缩放后的水印图片 + g2d.drawImage(scaledWatermark, 0, 0, null); + + // 释放资源 + g2d.dispose(); + + + // 创建临时文件 + Path tempFile = Files.createTempFile("combined-image-", ".png"); + + // 保存合成后的图片到临时文件 + ImageIO.write(combined, "PNG", tempFile.toFile()); + + // 返回临时文件的路径 + return tempFile.toAbsolutePath().toString(); + } + + /** + * 校验文件是否存在 + * @param imageUrl + * @return + */ + public static Boolean isImageExists(String imageUrl,String fileName) { + File file = new File(imageUrl+fileName); + if (file.exists()) { + System.out.println("文件存在: " + imageUrl+fileName); + return true; + } else { + System.out.println("文件不存在: " + imageUrl+fileName); + try { + // 将字符串路径转换为Path对象 + Path path = Paths.get(imageUrl); + // 检查目录是否存在 + if (!Files.exists(path)) { + // 如果不存在,则创建目录 + Files.createDirectories(path); + System.out.println("目录已创建: " + imageUrl); + } else { + System.out.println("目录已存在: " + imageUrl); + } + }catch (Exception e) { + System.err.println("无法创建目录: " + e.getMessage()); + } + return false; + } + } + + /** + * 校验文件是否存在 + * @param fileUrl + * @return + */ + public static boolean isFileExists(String fileUrl) { + try { + URL url = new URL(fileUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); // 改用 GET 更可靠 + connection.setInstanceFollowRedirects(true); // 自动处理重定向 + + int responseCode = connection.getResponseCode(); + return (responseCode == HttpURLConnection.HTTP_OK); + } catch (IOException e) { + return false; // 简化异常处理,直接返回 false + } + } + + /** + * 校验图片是否存在 + */ + public static boolean isImageExists(String imageUrl) { + try { + URL url = new URL(imageUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("HEAD"); + int responseCode = connection.getResponseCode(); + return responseCode == HttpURLConnection.HTTP_OK; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据网络路径获取图片并下载到本地系统缓存目录 + * + * @param imageUrl 图片的网络路径(URL) + * @return 下载后的本地文件路径 + * @throws IOException 如果下载过程中发生错误 + */ + public static String downloadImageToCache(String imageUrl) throws IOException { + // 创建 URL 对象 + URL url = new URL(imageUrl); + + // 获取系统缓存目录(例如:Windows 是 C:\Users\用户名\AppData\Local\Temp\) + Path cacheDir = Files.createTempDirectory("image-cache-"); + + // 提取图片文件名(从 URL 中提取) + String fileName = extractFileNameFromUrl(url); + + // 定义目标文件路径 + Path targetFile = cacheDir.resolve(fileName); + + // 从网络下载图片并保存到本地缓存目录 + try (InputStream in = url.openStream()) { + Files.copy(in, targetFile, StandardCopyOption.REPLACE_EXISTING); + } + + // 返回下载后的文件路径 + return targetFile.toAbsolutePath().toString(); + } + + /** + * 从 URL 中提取文件名 + * + * @param url 图片的 URL + * @return 文件名 + */ + private static String extractFileNameFromUrl(URL url) { + String path = url.getPath(); + int lastSlashIndex = path.lastIndexOf('/'); + if (lastSlashIndex != -1) { + return path.substring(lastSlashIndex + 1); + } + return "downloaded_file"; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/WxPayUtil.java b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/WxPayUtil.java new file mode 100644 index 0000000..1386946 --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/java/org/dromara/zhishu/util/WxPayUtil.java @@ -0,0 +1,411 @@ +package org.dromara.zhishu.util; + + +import com.alibaba.fastjson.JSONObject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; +import com.wechat.pay.java.service.payments.jsapi.model.Payer; +import com.wechat.pay.java.service.payments.nativepay.NativePayService; +import com.wechat.pay.java.service.payments.nativepay.model.Amount; +import com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest; +import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse; +import com.wechat.pay.java.service.payments.jsapi.JsapiService; +import jakarta.servlet.http.HttpServletRequest; + +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.*; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.*; +import java.util.stream.Collectors; + +public final class WxPayUtil { + + /** + * 商户号 + */ + private static String MERCHANT_ID = "1524946931"; + /** + * 商户API私钥路径 + */ +// private static String PRIVATE_KEY_PATH = "C:\\Users\\www\\erp1\\wxPay\\apiclient_key.pem"; + private static String PRIVATE_KEY_PATH = "/wxPay/apiclient_key.pem"; + /** + * 商户证书序列号 + */ + private static String MERCHANT_SERIAL_NUMBER = "1FD5B441796BE0250622018DF43EC4BAFB34FB78"; + /** + * 商户APIV3密钥 + */ + private static String APIV3KEY = "wjshUHNCGJKO1239874HSJKL8Q52F3G1"; + + // 使用自动更新平台证书的RSA配置 + // 建议将 config 作为单例或全局静态对象,避免重复的下载浪费系统资源 + private static Config config = + new RSAAutoCertificateConfig.Builder() + .merchantId(MERCHANT_ID) + .privateKeyFromPath(PRIVATE_KEY_PATH) + .merchantSerialNumber(MERCHANT_SERIAL_NUMBER) + .apiV3Key(APIV3KEY) + .build(); + + public static String getApiV3Key() { + return APIV3KEY; + } + + /** + * 调用微信支付接口 + * + * @param taskId 充值任务id + * @param total 计算后带手续费的金额 + * @param totalStr 充值金额 + * @return + */ + public static String wxPay(Long taskId, Integer total, String totalStr, String orderId, String userId) { + // 构建service + NativePayService service = new NativePayService.Builder().config(config).build(); + // JsapiService service = new JsapiService.Builder().config(config).build(); + PrepayRequest request = new PrepayRequest(); + Amount amount = new Amount(); + amount.setTotal(total); + request.setAmount(amount); + request.setAppid("wxec160b6872dc24cf"); + request.setMchid("1524946931"); + request.setDescription("充值金额:" + totalStr); + request.setNotifyUrl("https://api.buzhiyushu.cn/weChat/wxPayCallBack"); +// request.setNotifyUrl("https://test.api.buzhiyushu.cn/weChat/wxPayCallBack"); + request.setOutTradeNo(UUID.randomUUID().toString().replace("-", "")); + JSONObject attach = new JSONObject(); + attach.put("taskId", taskId); + attach.put("orderId", orderId); + attach.put("userId", userId); + request.setAttach(attach.toJSONString()); + // 调用下单方法,得到应答 + PrepayResponse response = service.prepay(request); + return response.getCodeUrl(); + } + + public static String wxPay(Long taskId, Integer total, String totalStr) { + // 构建service + NativePayService service = new NativePayService.Builder().config(config).build(); + // JsapiService service = new JsapiService.Builder().config(config).build(); + PrepayRequest request = new PrepayRequest(); + Amount amount = new Amount(); + amount.setTotal(total); + request.setAmount(amount); + request.setAppid("wxec160b6872dc24cf"); + request.setMchid("1524946931"); + request.setDescription("充值金额:" + totalStr); + request.setNotifyUrl("https://api.buzhiyushu.cn/weChat/wxPayCallBack2"); +// request.setNotifyUrl("https://test.api.buzhiyushu.cn/weChat/wxPayCallBack"); + request.setOutTradeNo(UUID.randomUUID().toString().replace("-", "")); + request.setAttach(taskId + ""); + // 调用下单方法,得到应答 + PrepayResponse response = service.prepay(request); + return response.getCodeUrl(); + } + + + /** + * 调用微信支付接口 + * + * @param taskId 充值任务id + * @param total 计算后带手续费的金额 + * @param totalStr 充值金额 + * @return + */ + public static String xcxPay(Long taskId, Integer total, String totalStr, String openid, String appid,String outTradeNo) { + // 构建service + JsapiService service = new JsapiService.Builder().config(config).build(); + // 使用jsapi包中的请求和金额模型 + com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest request = + new com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest(); + com.wechat.pay.java.service.payments.jsapi.model.Amount amount = + new com.wechat.pay.java.service.payments.jsapi.model.Amount(); + + amount.setTotal(total); + request.setAmount(amount); + request.setOutTradeNo(outTradeNo); + request.setAppid(appid); // 使用传入的appid + request.setMchid("1524946931"); + request.setDescription("充值金额:" + totalStr); + request.setNotifyUrl("https://api.buzhiyushu.cn/weChat/wxPayCallBack"); +// request.setOutTradeNo(UUID.randomUUID().toString().replace("-", "")); + request.setAttach(taskId + ""); +// System.out.println("微信支付使用的订单号: " + outTradeNo); + // 设置支付者信息 - JSAPI支付必须设置 + // 设置支付者(JSAPI必须) + Payer payer = new Payer(); + payer.setOpenid(openid); + request.setPayer(payer); + + // 调用下单方法,得到应答 + com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse response = service.prepay(request); + + // JSAPI支付返回的是prepay_id + return response.getPrepayId(); + } + + /** + * 生成微信支付API签名 + */ + public static String generateSignature(String body, String path) throws Exception { + String method = "POST"; + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonce = UUID.randomUUID().toString().replace("-", ""); + + // 构建签名字符串 + String signString = method + "\n" + path + "\n" + timestamp + "\n" + nonce + "\n" + body + "\n"; + + // 使用商户私钥签名 + PrivateKey privateKey = loadPrivateKeyFromPem(PRIVATE_KEY_PATH); + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(signString.getBytes(StandardCharsets.UTF_8)); + + String sign = Base64.getEncoder().encodeToString(signature.sign()); + + // 构建Authorization头 + return "mchid=\"" + MERCHANT_ID + "\",nonce_str=\"" + nonce + "\",timestamp=\"" + timestamp + + "\",serial_no=\"" + MERCHANT_SERIAL_NUMBER + "\",signature=\"" + sign + "\""; + } + + /** + * xcx生成微信支付API签名 + */ + public static String xcxGenerateSignature(String body, String path, String httpMethod) throws Exception { + // 修复1:动态传入HTTP方法 + String method = httpMethod; + // 修复2:使用秒级时间戳 + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonce = UUID.randomUUID().toString().replace("-", ""); + + // 修复3:处理URL参数排序 + URI uri = new URI("https://api.mch.weixin.qq.com" + path); + String query = uri.getQuery(); + if (query != null) { + // 对查询参数按字典序排序 + String sortedQuery = Arrays.stream(query.split("&")) + .sorted() + .collect(Collectors.joining("&")); + path = uri.getPath() + "?" + sortedQuery; + } else { + path = uri.getPath(); + } + + // 修复4:正确构建签名串(GET请求末尾需两个换行符) + String signString = method + "\n" + + path + "\n" + + timestamp + "\n" + + nonce + "\n" + + (body == null ? "" : body) + "\n"; // 关键:GET请求时body为空,但需保留末尾空行 + + // 使用商户私钥签名 + PrivateKey privateKey = loadPrivateKeyFromPem(PRIVATE_KEY_PATH); + Signature signer = Signature.getInstance("SHA256withRSA"); + signer.initSign(privateKey); + signer.update(signString.getBytes(StandardCharsets.UTF_8)); + + String signature = Base64.getEncoder().encodeToString(signer.sign()); + + // 构建Authorization头 + return "mchid=\"" + MERCHANT_ID + "\"," + + "nonce_str=\"" + nonce + "\"," + + "timestamp=\"" + timestamp + "\"," + + "serial_no=\"" + MERCHANT_SERIAL_NUMBER + "\"," + + "signature=\"" + signature + "\""; + } + + /** + * 生成小程序调起支付的签名 + */ + public static String generatePaySign(String signString) throws Exception { + // 使用商户私钥签名 + PrivateKey privateKey = loadPrivateKeyFromPem(PRIVATE_KEY_PATH); + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(signString.getBytes(StandardCharsets.UTF_8)); + + return Base64.getEncoder().encodeToString(signature.sign()); + } + + /** + * 从PEM文件加载私钥 + */ + public static PrivateKey loadPrivateKeyFromPem(String pemFilePath) throws Exception { + // 读取PEM文件内容 + String pemContent = new String(Files.readAllBytes(Path.of(pemFilePath)), StandardCharsets.UTF_8); + + // 提取BASE64编码的私钥部分 + String privateKeyPEM = pemContent + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + .replaceAll("\\s", ""); + + byte[] encoded = Base64.getDecoder().decode(privateKeyPEM); + + // 创建PKCS8EncodedKeySpec + java.security.spec.PKCS8EncodedKeySpec keySpec = new java.security.spec.PKCS8EncodedKeySpec(encoded); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + + return keyFactory.generatePrivate(keySpec); + } + + // Java后端生成二维码示例 + public static String generateQRCode(String url) { + try { + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix matrix = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(matrix, "PNG", out); + + // 将二维码图片转换为Base64字符串 + return Base64.getEncoder().encodeToString(out.toByteArray()); + } catch (Exception e) { + throw new RuntimeException("生成二维码失败", e); + } + } + + // 获取请求头 + public static Map getHeaders(HttpServletRequest request) { + Map headers = new HashMap<>(); + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + headers.put(headerName.toLowerCase(), request.getHeader(headerName)); + } + return headers; + } + + // 获取请求体 + public static String getRequestBody(HttpServletRequest request) throws Exception { + StringBuilder sb = new StringBuilder(); + String line; + try (var reader = request.getReader()) { + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } + System.out.println("请求体:" + sb); + return sb.toString(); + } + + // 获取请求体 返回Map + public static Map getRequestBodyAsMap(HttpServletRequest request) throws IOException { + // 读取请求体 + StringBuilder requestBody = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + String line; + while ((line = reader.readLine()) != null) { + requestBody.append(line); + } + } + // 将请求体解析为 JSON 对象 + JSONObject jsonObject = JSONObject.parseObject(requestBody.toString()); +// System.out.println("方法体转为map前的字符串" + JSONObject.parseObject(requestBody.toString())); + // 将 JSON 对象转换为 Map + return jsonObject.getInnerMap(); + } + + /** + * AES-GCM 解密 + * + * @param ciphertext Base64编码的密文 + * @param nonce 随机数(Base64编码) + * @param associatedData 关联数据 + * @param aesKey APIv3密钥 + * @return 解密后的明文 + */ + public static String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext, byte[] aesKey) + throws GeneralSecurityException, IOException { + try { + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + SecretKeySpec key = new SecretKeySpec(aesKey, "AES"); + GCMParameterSpec spec = new GCMParameterSpec(128, nonce); + cipher.init(Cipher.DECRYPT_MODE, key, spec); + cipher.updateAAD(associatedData); + return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8"); + } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { + throw new IllegalStateException(e); + } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { + throw new IllegalArgumentException(e); + } + } + + /** + * 从PEM文件加载公钥 + * + * @param pemFilePath PEM文件路径 + * @return 公钥对象 + */ + public static PublicKey loadPublicKeyFromPem(String pemFilePath) throws Exception { + // 读取PEM文件内容 + String pemContent = new String(Files.readAllBytes(Path.of(pemFilePath)), StandardCharsets.UTF_8); + + // 提取BASE64编码的公钥部分 + String publicKeyPEM = pemContent + .replace("-----BEGIN CERTIFICATE-----", "") + .replace("-----END CERTIFICATE-----", "") + .replaceAll("\\s", ""); + + byte[] encoded = Base64.getDecoder().decode(publicKeyPEM); + + // 创建X509证书工厂 + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + X509Certificate certificate = (X509Certificate) certFactory.generateCertificate( + new java.io.ByteArrayInputStream(encoded)); + + return certificate.getPublicKey(); + } + + + /** + * 验证微信支付回调签名 + * + * @param publicKey 微信支付平台公钥 + * @param body 回调请求体 + * @param signature 微信支付签名 + * @param timestamp 时间戳 + * @param nonce 随机串 + * @return 验证结果 + */ + public static boolean verifyWechatPaySignature( + PublicKey publicKey, + String body, + String signature, + String timestamp, + String nonce) throws Exception { + + // 构造签名字符串 + String message = buildSignMessage(timestamp, nonce, body); + + // 验证签名 + Signature sign = Signature.getInstance("SHA256withRSA"); + sign.initVerify(publicKey); + sign.update(message.getBytes("UTF-8")); + + return sign.verify(Base64.getDecoder().decode(signature)); + } + + /** + * 构造微信支付签名字符串 + */ + private static String buildSignMessage(String timestamp, String nonce, String body) { + return timestamp + "\n" + nonce + "\n" + body + "\n"; + } +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/resources/BookParamsEnum.java b/ruoyi-modules/ruoyi-zhishu/src/main/resources/BookParamsEnum.java new file mode 100644 index 0000000..b576dfc --- /dev/null +++ b/ruoyi-modules/ruoyi-zhishu/src/main/resources/BookParamsEnum.java @@ -0,0 +1,50 @@ +package org.dromara.zhishu; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum BookParamsEnum { + + ISBN("isbn", "isbn"), + + BOOK_NAME("bookName", "书名"), + + AUTHOR("author", "作者"), + + PRESS("press", "出版社"), + + PRESS_DATE("pressDate", "出版日期"), + + + PRICE("price", "价格(单位:分)"), + + PRESS_PLACE("pressPlace", "出版地"), + + PICTURES("pictures", "出版地"), + + BOOK_DESC("bookDesc", "出版地"), + + + BINDING("binding", "装订方式"), + + LANGUAGE("language", "语言"), + + FORMAT("format", "开本"), + + PAGES("pages", "页数"), + + EDITION("edition", "字数"), + + WORDS("words", "字数"); + + private final String params; + + /** + * SpEL 模板表达式,用于构建 SQL 查询条件 + */ + private final String name; + + +} diff --git a/ruoyi-modules/ruoyi-zhishu/src/main/resources/lib/pop-sdk-1.19.52-all.jar b/ruoyi-modules/ruoyi-zhishu/src/main/resources/lib/pop-sdk-1.19.52-all.jar new file mode 100644 index 0000000000000000000000000000000000000000..099571f765df96ee1d649829ac97d73a983cd365 GIT binary patch literal 7369755 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%0Dq1L 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

CXOtDMOX)57F~D@&Z9UEy9voN~96 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

-Ed&`T-+z?CIn z{!YP|7GXs_IERDS#D=WNmm^-WWI`QZ%RP~WmWw;!YaxtYoIU>z)Bv-vpd}@HZMZ3c2R4c1~7o@$tcX^U(=9>#;45hf(hMK7F8d( zT#TRckJ+Kl@Uym<&S7XOb%{y$z*1uxs!>IZBDaxmc8b)XklAQ)DbB1X@e*u0NEy?< zM=wzF_6#L5QAL3p+)5#^;4ak($jIsORsk_}37G^tKXo}GYe zdiQapg;Wp5N%Vr|>t#L9J)TDn^F`toCtXiR@d;Fc80yG=3py9NCVjHuv-6e|fb zFVcn>@z(bVkD*(~OBG4c{j1PgqE$fxg04lBF$_KfQm^M}trS!9J3y62_1k{pkE*o) zl-Rrm8=32v{9`Qk_hG3fj>CZZoY_>=l%m+Q5ZnR%dT4HBQ$PqADfu5zxj4B1GR z^-uyiYAEwXjF;l71Ah#kG*u-JUFO5P4gL`)y4C&$-^Yd@9`M?@gK%29(KbmWuU2%n zeF3jlbct-qS2M=%T)0Ic$if3AV#`e!lVEb3#Crfa61O9R_dTBInx3Rj_-=_hITsT( zk(jXlK5hr+8q-j3{I_51zS5Txz_}qzo&c<8LS-)~&Oq0F>;a^HVIr=pzmgIxCne+TPwgue080e^v8xAwx;>Rei6L;D>IUue>@2KYMq-LP|4=|ap&W=qf z?dHKLl+hoQa!n-?Gmo3}BUf!aMQ!Av;v?wXCrD~4H!!1oA@{EH#O#03ZIk+2nlW0UcFnR^(hO!?txcd zG`HRv_G~^qZyvG&NtKh1!A1v4WQpX8Qfb(e2(RSH=D4DlZ%uTuMLoz|^*oe@_T5C& z;6xs$B%Toj;6F1e8&#C?K~?u0DEBKTWE{cwpxRbblwaTSh3AoY$G_<2Q&E8oUq(YS z^NA10U9lv=^}!T7c#bw0alYw4fjM$SCr?Lt$4#-@pDLltuDBj49wOgEqUkccV|H_E z5fycvH$;bD#71nHdh2R+VHipiik`%3_d=6#A&-5W28~+hbPudrFDndP1VYL^A-Pt5 ziJuxwZuzFaZuFg@hnrEqDae#`S;l8~KHCpdbpCRXu8Lf`4h?Bup2IsV5 z$0Qrq#g0+Z-5v%t8zD||gyj?C{yWEyv$z(f2tA!C7KMXAUMidhsRlkh;HJXHk}yEKK1-ciNWCV z$+jcHIw1Q>cjGk#z#y3eTNf!SaG-N!$dk3|(u1kr2sd4(Vj5bwhGSWkp5DS z@Z(rRNU($g51oZ!b*wvUm|IU*Ep_s-=xo~BA%-^|Ccha?7&su0w+5$&0RY*6$w@(z2oPgZKL00&KB*pz|o)MQ@jv^ckJ<dZeD!&h^F3(&L-hGx#?X#wu6Fw zyJYZLgnLeXYqB1ctWR?bdn``{IZ&uWl$N$n_PwSwkTM51QG^6ElA0ImA&2lTW8y*~ z65fD|SJKPW)rH#PB!MV=3swOc+Oay$g%t^4&<>g1AoKz%lq$sI=x51P4{$3iL*|mo zGpOJppso|T!SmSI!n(WP46i?LEmR@Jc89F+P1-u0G?DK^o>x=OE#BWisJ}d^>n=i( zC7lmYkneqa$0CU5&MZ?pLf-hy`t#gMBLrOmU~Kib=hh#wLH~x+-`uKyky-vm)vvgK zx@wKOQljp6^733Ux*-p1#64hU`QL=FjagbFO`Kx9ms4zv#LoT;Rn2NtLiG92*E%N+ zw@cydcC7Pdt6W~dXNcmyc^)bLWMTYSpNuz`tryu*V6yxL=t{;DVs*&F)Kq(GDb6Hs2grkjp1yK4urNA_ zEjW-*ijeq#mc<@=pG%W2y~M-wU2rS7o^88cgX7z$HK9s5X|gIAtJOS>P$uzE|-_VFhPuEO@@&f-rO) z6ce`3P=UPAK%pj)62fiQC^f6Y(1!zyWeiagThjVWHO%K$i`ae)pK9_;B)P>YpXPV7 z@>R1r;gX!+OK`HV;quNqOvEM#>5u8a*y?2R8N)TnKa(68O8AqfDCG z$zNV@U(p3(w6nhhKv&Ce%O!z7Il%xMRXsB$fDP*>K*r7A@55iX%8?xu<7YrjxiT@E zu5AU!I8ntgT(6WZ{_<75CVwiY%S{j4%?dfHda6wpP{{+Ls7XgkYJw2d>-&-cTU4e5 z!qIo(Qb6U<)L;j#LHY0?g|WFTdlO-HiHx-VzUzwAChQgv9R+fpx5-$Z`S*|dsC^)W z(swdh1y}G@?)XpPMOpE6YvmY*OEgua+13sq{bDr= zpG5&fPjETFOq7_$+v3y^-fJUiMtCxlcqLN*toyL1RI@O+NgI1^8pbvX< z{!Fw$1FZ`t^+IJ%SBQRyE%=S)BuW(ib*8wbki@h6b;#(gK%dT=Zn+<5P((L;$-Rpt z8(^u)ew+{@&0y8An3-R}7+RizCY|<3w2>^r5QdmT6Uz5$M26l=_k82Nw|gu)&Q2y(Pf`W58JD-&Xo zBGrG&Zd4P9mcYg=>?n}S#;Nr2+q->!D4Nl!f~XwE-iv8{A(taP8SULNPCS+tkay4P za~@Y$#fBJV&ZZWk14l4NhHdadMlyH>i2Z2_Imrc&B+A6G3@nBD zclXJgpjNndKjNC2@(PRR$;a0}{m_|mD-I0#(B%ecql)i|-A!D#2RuUrd)_rIiwj{S3l(0g+T=PMQ z>jqWeTlZ<>E6UFtc-`9vZ6xhGI65?$(roMC-(Owbjm+*c?p~!ydA|639hqPa@hrYC z#ho&BT!VC!U#!Fy17|_d&x8_0{h>*6w5@t9YhgBiYc_7X*VG!->O^dh?nlm7+9fu4 zqMR!j&nqfanD3iJ++*w>eQLe9uDRS=TR~Y!CHxd3`67O5q|1_(=1Q7#xOmAceRcAK z{jF~Gl|<*jIIs}xC_yb=;cTPG;rqw7DDii?_9tzt-;JlPS+j`;-f+tUVSbAHKcu~5 ze4SgjJ{;S2(SVuAFy!>=5}wJPRDnW2}3C_)|akVjZiS6V)|$hDUad>uGPdKjRuWk>aL5ck4h_ zG2e-WP7=AZvf0qawR(~(ZKE!{Wy{Zv0Qs8N?#80n@0a(^L6H2yr1U=u%mrID$?|)g zh=}C^Lh=u<+b8X**;NcHr!gS&8y}ydXW=T|>|Z94n{SjoNw#_*M)G$#l8m@k zDB>q$gvppR7o?isTl(rul?yB)i&fII_M?oIj2>D1-Ut16tHj}~zZ;;cQ9(l+P zq(Hjm24tEF5dQ+rkq+?#g-G^}10iJissQ291J{7CnS<46vn zO{DuKF!>{P>cp}FFE3%=_a(#}P1rmh7SzPYlZyA+==B6KCz|eTZ4|q-kHj3V>oATI z?0JY>LoV+jT?;;s@MVvaUhrkJx_8G)ZG^lIe#xF9^?`gUi}R$&c;((R5xLf9d4e37 zirS-E-s_0fksamhPM7M2bo+MrPD%nrb>*)YwdMp~ ztD|8bMVWPIFa)5I>Av7Rn8;jye|$RQ1fu4T^R;lRK3Z))^61813i;tD-!0}v08Rqy zDFZgK)_g{j69#WQnq0F`R*&GUZ~4Qe7ea|CI>jwlJiJYf5DWtMHZ&ap-N~V1K{t6! zfXuIqH&GQ19cDgECRyeq{m0?LTf>Ju5V@S+ugQ< zMdtD)hKzZS-X~sjRrF%I)X^$#aEii_a9=}>hsZ1%m??Oq9$+vvt56OzvnsG`(X01A zf-XWE&I2Ptx$ggbR=ujeaVln6x%rTl)$s@dH^R>YiEkUhXOn@SRcsr*k(~qlMu&8L za487&WCCg08!PRs5|FWj$Cl5Z;EU{k)`u-SP4VFvgJri5o30o<20GH9GoFbZl$7ZR zo8U6hk%JnP)XBLsIxLG+TuXTyxQ5;GY)@;~mf;y5K7~7i1D%pxcu3n63NEot*G?RN z^uk@rtd5n-F)|)W5(6IxjM^7hl`6nThP!oV9mFr?@NNg^Jrd{{saK*C3XX^_u@Fl{ zmjoJ1I5#%&7zM;YEZh!^G~Ra{N|Lmw-M@rz+d!lvJT{D~ugT(_O44gc3bIqc;*gNw zCuw!f)gr!d@r?Aq1o#zZ>l=lVCcg)yG3wwA;67=Ji9)q0f$1aEkxJg3LtCBa6}xmV z-|qV1tYC0VX7($5qYUcTskyHpXAy(VDzjfvu9`x>gP*hp%T$8aKVt8B|Mp(V3u+sg z0~``-|JI}HAHh=pz8Cx<<@u{m-hbg`{JK5>)arkz)@_XpelPw!Br1$s&+(ygCzznZ zSqZu&y5#ZAf;Z@@1uCM)f*{i{!;G8jBOZ}VE?rBO3+)sD>{j&qATQ-YIivjqh=aiO z=^vcV(_XM%PFkjPfVc)R1_(m|kdz<*l49MC{h*d%8&^slE1od8@}>JjaCcO|Hg4P) z*(?lt7tXk&d+ct8N7y`P*zSv{&~c?ntk)oZ*tD z?N88Qeb;B1^s0OT^q<8B!Qme}@Z~qNbfR4J*Efxq&ND4VrKx?WB9o2`(XRZUf=PcN zQW|>bX;Y({GP^>>&f=%nb)iG?dB>D^<#a9DBNT$WLiC%(lvFK=pAhi19gJOuYD~6Y z>&J+TlDsBlEt}g3CJm~hQE2HBPvaQij-NSqwNS~6+)R8I@S-{HWtiW}^e zEx%gy?Ek>Mv_%-FeIX4n8xHUTF5_(l8USEXcgT=EaQb~qy@W9-@*7HQ`q{a9wT{7vGwpy**bE$pbnL2m3-#O3XiB2j6Z3$ z4}V2o-1tnQ5f4zNAv`VUUkC0DX z{M+$}`#;$ne#xwVao_%%%$nqXee?VO|Ftpvcbf&}WqW|9Zx?>euIWyn#)v>@AGEV? zD3UX0@Zg|vd>G@s?&dAFbFFK-rtMAD>k^-)C{HJ zHmX5&B(^J&{(^vT+=y>1Y!5l1*W#jTm&#V3k1Rz)=_$`vUYd`Vz2`c6y2f$!10k@! zz3UWL#P=Vr?v}P;T#MAa>xr~vcZMV57&-2SiR(F@)jdUqzs7CF*?3$gHD=0VgZ%vNRca@HC=`xHq z^c)Roy^A{<)~D7Uuf`7zpj~L@)^jbwD0-v;RDQ%II?y=HEk>f%QHSkJhm||ep7>#I z^Y@;ci+u|AFGJ?QdxI)kYDIGQUIbOH&UiPe#`LlLuXil90>OiasF~9G+(DbJlAnN( z)OqQkb;ThiK~rad8G&+(y|>_e8#sp8fexH{9e`*LeGh;&6}7xzw!pet!QoJb#( zqvqt!WSQj8Z^SfD(mZZ>_q0k#PKlk_GTD|Vj}n>Z7GLY*e#Xw#W~ke9=XfIA`!zqr z+>Bmxco*ddkMwi+twW)kM((Aw`mQQI{?=sg2u-g1n*Q^`{oUDA`=7L*-@Qc8#>v{z z-t9k4X8*YN{`cqqp4eK<19ru^bL$C~dxP%_&rRkLjlUH9))Zs@MJSDp^`V~`G9p)( zNf|#fQqb)90EQ>O728*&5KT$K{D3&DhsiV#hp9Hq>$}y1&p-tFN!vz-^4VYMrzD50 zJbNFq##=`e!S`m3MKnfTc3j6(m+qzVw7fe%ty{k}asWT{V*MBf*pCSvBKz>*jgPpc z8Xro(uLRWl>NzS`nv*ClSaAZt0D7+HO=ALDy0w>faF8kN0TInC6X8prN9JRlIO1pjvn4DQJGS;+-b$TUML}B^Z zkz9-?jxxn&mPBRi1U+{vFQnW62`eVsw7l*6BqLWRW0bJD(=YAs7mOE`RXN%2zCf5> zlG``|JtZRQtwdz_;~k16^6aw8@TgCZCALKChZ(8z9C=|v3`lJNYDPX2oC5#}Py-+V z+Qb*{rtaMyRu{jJ092)T=;o$mH{M@J0B2zbe-DgE_7LAa#CkDZM8=*8R89e-&2J|S%rZ(S zDlPNIgici9vn4~hVahYaAl#mbLT>Iq#J}eB89o0+K!;e1nSfjB^YQar9 zK8JSMgSxc*^NxGinB)f!os#9HbX;$^!WFIkwRZE|aZQV%2} zw!g8Pb3P6?Se(U%FDNRx?L1ik%x-|gnVj5W`WUC>QfTi)ZC?ug)jS~DbnBHqW+))F}(v2i2+oCzf8 z06?IWaZI<=;Tc=UWlzfUFnAi~H)r{ayTlD;*qKB3&tv>zALUnt&}QKz$#=4A#bpQe ztg(K87VY0qV}Ie)+jv*J{dwB8!JG!a&zKZperiTz#rZ3{HK%6VDorxpB6iQi{fic~@f@mg5s|4>AH|5$Vi$4=oF(3O8m~2oA}mGb(|g^q zNqQk8w6FgGT^rjXQ0lt8G%wmSiaB261>#rXU7m{5UIPk``ENl2!++A`0FyodlhG02 z!DwdS@auB@*V_B*yMI;Uzgpd&HJD(@s$~j|M6MGgpO*~EV=Jiy%?yHGmCHmf+PlnL z_M4Zcd?Urg4_F9pKo9I` z?UjH4Nv;*wDC;-A8l~L>TM| zeqa+!bl%9R4byRGgd5?Zber{I{0xXI5sU2-?qJs(w7QN6{5+%H+$uy! zwHbSg&+!}i9H?o1Zu^CNzCz3lF<-lwF;f;w-E%0DTeLsIT6?Ffb#i=Eir1>h=QvNW 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∋CL67ONHdqDQ(@?VUP#dp;3Lu#_wh4x{p_t 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

S7%MRS`8qCQ35QD!+1kl~tDHWA5%RqA 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

iBzP!YY;+yEql3h-Xmm3wV`ma8zZ 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�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Μ?2Nmc zaa}3iJ1f-ZB%4f+L;hZ{Q*q*3Q@-R$v>-MaLW<=B>KiJMwIcA2;D#aIwb+(1f)wY@ ziahl=GSRGH^mC5GGZ_x#8im%R(AW;_v6nLq&I~D6*z@k5OC&>cTSHim{XMxCi9~E& zR*BB~?|w9(SXrt`*O+ocZbdJ7@%@gv~G?^i1F;NnvlQP<^`hQp8bj@6>&Gjc?g zUq>B>&pe0OUKh)ERenD~PGWjR3h3M#)uWz;nsc)c-WU^-+_W@GYxV=pPXQc06g`4pmS4$C03G}?jo zf^x}a!jQ-(oQ1&b{TNI7t*_r&OS?sKICPuWKc(JL1CYMy-~ALp^TVDF(ZP&O)rK7fGh zNUd5Jhj9wWVz^3Srs*GBIV4(SfO31>4pa1btX`JCQqjwZym-3KnNvK=Su_{1)8f5{ zqfQJE-UtpTa*&aC1s)M!ePK14rD&;|YrB-q(o9m-YRsM4Sw7=HJ(&d0Z^vUA0(B~A zB{#K744i_g4_x#<_6XUD_{OM!PWfV5TB_6%+NlSN*7OO zRAbnAhhB@}QSbrVg`?D2gi}7~q={O$kfVCOnf1&%(krE=l)GL7WPp)ngIXHxhKloW_N(wxsxiLWbJDq`p8Ts#z-LgMAaibco(b z@Q^6v!#z(KYoj@zwfMwGmewx)%7&Zp&WVO#>gXK-I=qUdX1>UbISNwAPR^5w&rf5y z+eeC>)oCq?i_)qIKV_nKZPCs)j`$4|5GRHet} zMe2(@uUeZ&YIZ}Je1KfWdx^|ix&!wJmekPc*{mm}kA&!YG}L$RzAUk!$_er09>J)b z1-`$mP?|>S7fc%@M!#kh!;f4yjO0_?@?ocW5Mn~d^cFyOZ;FltSHy>nVmj;IVhO+Z zDf#V7G%>w-)Iv$Tas*xuvWLHQMt|l0*~%LsC_NQ^>AmJ=d&%=)+||(0eNVc8C9IoR z0btQ|@nlMKe7yucrnR&iw(_dbKA#GgwM!_ZvD5#gZhY-g>;Q_a2 zBh~rgCWagV%RseGok(wvT!O;793~Lo3E&0?to)10DT;futy{;)&E_0B zTd`bypm_6#2!a@wLL7C4cb^e7k%+$$uOgQ(n`t_l%vCQ0+#{n>@>ZRWS3|w`;DcI_ zh-==~avr3KI^k6pR z&u1{K!lOTUycwFLa9@90Qery2mdMyB6c9rqoL(rLqhUDfBo;An+D}!TafC} zCu{tgk&}cxpgN=s&-^R5oL-2Ry}OLDY%sMx*Mv5zfSjxJk#r+2}2GT7$LUYLt- zbkW<_0+!{$)S>BU>r6?nkhM6BV{BnQ7fYh0L2RK72iG?{L!Pf|n(_Ezxr@6$bEijk zr7cG*$Zx5ibs}QKjP#WrOmf1$8Q4Ra>J1ra))mG=qI0Pr6(+c58Mdq2wWak#en3kz zPOAoGl4f)K8jUGYScG0BlsC$C^+eZ_Fy%A_Zr>2W(4XfiLsT-$>Hx?Y#}-fWKWg(m zL*J0$0<28aChcN@s3|x!?As$}Q6?Io5YmzB&d92I_B>DsY4iEk#|uU}o8plX$@;?h zEJfaz4w{U^zEDKbMz{0Z>T$H;;{n@`M`f&qs1>XyiudmwT%9wXb|S{`-BhS?tw9+! zp(D}Ld4i5~nJ7n2iEc5@uDU_D=p{hdF-5{rb~(ooVM0rB&)RE9EP?%`N6A*ma1Xk; z%IWlx_(gIo2g|tjY!1PiffI8&ggPuZ=eR5_u|%BM#K8^ZM;+lx;6dvHN971irCZ;9 zcHC*R!-{Aj0`mje9DY7NzD&E#@7|D%QEH(&E@g$w(V=EKjR)-6pLLX1aGP9^ z?E9iX{-^4etRwOwoEU>vTFOmhufqHnXB1u7_P3lXL^o(djuLwy~IaIHuG)i1UU(OEr>6K+go~N|=m*tdaO#jkKR+rM3)OcT zLzE0$_F+wu^qHqtdtqw~`=6yum?eqRg&|ULnAhP$X@!LS^qooeqivK@Ddr0`?Ahc{ z4!`->=zCXks1D)5`l-FXr)E4WBp+Q@aAn2vu6xE6DJ|uYV^~GJAKo6cQ8}Skng#gu zA~(6|kx*djG~(_h0P0TGN*p8(_i8GEsEcyfCF?85F|oYo-)nw77~);Z1#qunWlg@R zU8`ag1vS9Dxl>O%&s*`hI4E#Hd_2AhJ@O0G>o`HI<*>vMf^D+E|Hv!%-4F{WFztmZ zzC%t2HySvQ+e3Ngcj}NbWX4S_9#`m)?(2Z06ff@3MVa$BJbm_*`HpQxf`H76G1$|c z@g91aj1yOu>jfuK$kA^E%|s#ONFHG!i_{Cs+{bFVcwl2&HxBP~_h2}iQl6aH%dpyd z`g=PM`U5G$Gl^AwB$c}1M;;yb*p}GlhlSlT&D|_Mfs_ou;Cr#Qw*34!)bS+wmD}vX z)AqB^>-kxDns*H}tTeIih6msWfi%|y$<2$_>ol-Z_a(Z8Jn4^W7niJN=(HQy|6-yM z1%u_=gQiB?f6HDG{RimIzpX|^O|4CxP5I%4USYB%dJB1wn^;y2# zSEBDfp$steq32fRC+&F%dR=sTFTdapYPW?tk56rVvwIm?6wjZvv?})TB<5?Vpevl8 zwV(tinOY^lE7)#EDyZr#AoQw=b>lVvJ#3!WY_%v;uYy^7N_EC5fWZ94{&*7M{Sk6z z)6uw?%-)oP5j&;6ZJ^TFZCDjgQj>3SApWl5Ci{_YSF};VXOO+XhDX~f@r3LrXxOZl z?JIOQ$6|S(EcnsjX@y+ObG=>;fF+qSQt=+PIcX4G4^8secou6Z%~=p_MQFxb;}|6G zJRoD#q0y%*{l>>aM?2k`++W_s>eE!1^7=`)DBW{z%`2h*G`_=7%4g4=FQ6rWn5R)4 zu+KCyk75jESF=)m(m@vRJTt**0(NP@6x-wwJz)~Lbg1bvk5pO;HK=wT>|*Kw*h0+; zY~)veS=y#%V9BjHbiU}jtCX`J-U44(Tl#zfM<)l=5QN#sxBc29WXSJ_u$MyN!)|M~ z1q5-?mY%A1vxSoPU#0!_X{$*1mdP|~(3S2REOBBBb!eMv(-??@tPx?#VbK{#Ar?Zx z@>v|ZYu()QR$4K~4gux+IM;+97C~Gz#8B;DgNij2&2_0^%E&`Z!$D6c<4K{HdMy;y zSM_$E>x#9D>7uT(;Gc!E(vHpHST4YEvB?y zDhXiQ%>TM$7)ScpTN879nW}d@7sxWik=41VjwB~z7}1fo(>o4_&zku;%WqcK>BkNK zyx?}3@H0*md}ZLN>b|+IuM|Z9!ica*ABOIJ>+mN6?VBXAvA(TLCQhv{ueQ(`_yH5j z6R`oEOgOEAE&d!~D)K)A-NL%_sXr+*L~jGK$J%6{2{&SM=dm+h2x)tl=AauzpGl5U zMd}AkRx;g@U#ywVB$_e8EUrJHe5Il7Uri>mKcrmq!`TVayq(s=r=8*#kDhLvbbmie zImh114zR&5D1!n`QpNZWeR5cQkc!60!IlJR)jpZ|D4f<%0joB2n|QTUA9D zu&o=g>2Q%-JX^N~*3_?}Hr9NoM{jgJ)qa7N!)jzwU)y7M$Xv?ynQbsO#)F4Il_U=M z{nq^p{u(-zb7Hh60Y*-#a`M)VkpJ=N((l)gsBrn|FjT-8c7JgC_($1Z z*`?(M(QGG{+>8v`>ZJlxs(CV&yPOtsZa2?D3SRuZl_*2=)wk4lv3$p&#~v7qhqD!2=Sz8o#V2P z^XQ!=^N=S$hcho*U1VD?Wj)3l^N!Q4BD9gQqu))e%ut%(3XfE0DYmpWTju#sIa~S4 z7a0p@)0KFGqR>$97X#+nK{y} zV#szVi)!NoelAfcs&i*!bhRC)+w}mqyFf;Tv(}l1wnS`Xgh2xe4?oZ4iGI-8p}u2| zcA25-2z(9m9(nX>|H?f(qp?V<0ev@IT(8>08pE&z)UQcTR;6zUkBd(W*WA%2VJgcY z6R}Kh#ehv*ld^Hfsna|qna24pvKu}pd62516&lN_!XsDZ0_GrIWCKfGKOc~jYS|{t z7pN6Sou^o3P&qVLrATycpH{|vu1ZCd#$mcrF~!immSkBa>=hhKGwU1j0P~S{)?XMr zaCq2RFjuI%d`CE4@45Ii3dcqpNa^6}6k7$;%w;hv>e2Mj|6|mJik_QG2@w8PBYwus zQp4JqqGk6>Y{dI~CTie)Wh8iG1?sGh6UO7p_<~A=lAdnNru+Iupg~P*6;1Pga)VcH zfm6lMOhyGg*3$Ec`Fn%h8?3IOl8|~UOBy=Ntlr~-qPiAkhjgv%0+zyk=j2qnDGofl zzS*}S@l&TB=IdHctXKW~?Ynkb)1-3vwgL=nR~I~WHYJYiW)<>jzEqL)J^1LdE*lF~ z>!3VJ$r^&l4Pr3}*tIlqF#+^x;(mE5S4e7Cks3;>0X?b*Na_a>CgcKae2}f7pO&=3>$-v@#rUB4e7cGz)+ zCwfaRD($7IJuWes-3GjTxai_;ZA**tidz$&dslA4LRUjss)^(ef*W|SY3Jd~2E*>5 zHHid!f@)^Qt37=*iNH>cC8du{-YqnkX&MEn)$oHY6vwS04zy0g)1LIcz-#7+)S>_z z=HNf4BAvn+_`nRC*?&*TG(5k)KczMBK^V?5pj&|doP%_VXW#=j%+sw20wTcq%P;-! z`N-XZY8EmK5nif&-z~&`?X$5OEa#ex`30JZe1Kj+&AQ0~p$~OPe}_K&ldzuu3b0c# z1G-T18loiI7Zxxzw1*aL7FV{%0sCH|V zGpexOkv^v1pG%FdDJ0quu);VSN2{PX?p`Kq%TzKv?97QR7yxzW%n+j z5xLhlX+7t3Bh9_`p*PE~u7`liBkf6-dpcERSlYo?`2vU3jNIU#N-$cx2~80#iokH5 z6^9B_LRFb)c=`SK-UvGJD}Rz-{DIp-pT7DTZOoS2UW6A_W@u%1=i`h02o2>8A1-ba z8UJZlqG?RnHp@rNs9Qvim^un=9fns-1VM> z%{|*7nXtscR+J+0K{VQ|2axROqmG+4;Ua;Q*R%i;(Z0S(IS<>*%#Mj!B$2aP5m`&? zX1v_>7?Z;dTsEbNroUp^R}bt$KNC-*v99TtG8kA!E*2q#X3QmK>!KpAr%cnYOl zUis*r;9CMEN_p>j2nm5=eF-b(QvD*X$WEcQTPXYJVsZu~x+srG8PomO zkpE9nZYzBSt*UM0PDq&ziuyK+h!HMZnmArp=Se+JSJ%ec|C42hM`Eg?e`jbu;e7~- zvvZm_o7CU*d$-hs+54(@#1ntYt%S`r!simx5Q9%Rj2_+}CQ5Z)4|p`iZarzCb+KX< z*-Z8P=Og{MyGl&{^m9(2XnCO`6jcC|s=^bF8!sU~mt8AmUa<_esV1&`n_&WW z#xFrb7_rc2LuQcClp_uoD*96RERw<*sJ92Qw zXQ=~P?#E{V_hWlORX!SI8s`yKQ$(MX{GkX4Ha`Uj52G79(1X*>( zE_4wgBANavo43p1_!1@xXP(cavgcO%z-ne1Q=maiu57p08=U++l%0i9mGN5N#&|eS z5jFc6a0?8u>_5|>G`^EUB_F0mA9}3KXU9AmWb?I7flRXgZicI!B0o3`ewX_ofE)c< z$ihB!ew4J%ttCsPSDYXk)=JYjZB^zyz0Y*Kv@75B+2oKVX^7bo?5%GP;UhP1$`?|^ zu^z_hgaG%fCqQX7N%9+Ggx5|8>jy6mXwkL1W@TZ+fD65^MD>C^4OsA}&aL8Y&(@H$ z_$T{ngAiP2?eLlS^X)*INKhnqo=cD};yKW@>>6V>XBe9VIw>bGt()#V_L#-8ddw58 z>1CJ)ozKWSy5Uo^Pdr~{?whr-=^`^P#%>*^fmT%TTDLdhVuzuw79~Todidw$xYy@a z%ut7A5L2#ip4fy*fANN~^2EQ=WoL!h1hPyc;|(E}|E*y;bI&h9Tx&_z5@(qLnEM0o z_m*%+19R~Mp`NpU8*TSb?oc4Ui-MtxGbqH-$qwXFX!_>o z>uVcVP)LogEOb&aWjsC#3Jcpb^#419<&Enn_-W0_?}Tom{p<8~iuUsWLInXvufvIs z$=kJbo?d}pKkqqE)(cC8%S`htGm;~%aEq)oCgxR0WRue~cB`La5p3bu^uLv>PB@j5 z$Rjn|u$D6m)LNbD3fO~_7EqD9de_{9w)9zdf~`hnKO$MjuN393wiA`%#RG@@*jtWKeuB%*X2iSx zbi#HIOrEq6(MYev3xq*9z&!96Wo)6)BlSAsDr0LFmP)NKX`H4g(>=sQYggpocY%tB zm8+N1WCr4zb1Qz#h^JVEp=UEWvzUDi|CCWA91&HL;~pWUFf~U5+fQ$Yhp3;?o@k_k z)jmS62xJeE?umfqM&I_3TkLyZbewMVrRXRN8)3Q)Hl*)cDC)w8tlLaBtS4hNhR7w% zvs~fCW1R2#(CBs&$C1Kh;Q+(HmiypF*p?0|xwfC)(Gh69rL;*W?=00a&K$&#T7^*# z3mhq7OPO8!z;)tlHT3#4It)_N+h#nU?DGE0pGhh`% zA@1QOJzwb1LUUIkLPt!QQ}O4};?uD5A%Bv0JGx+8FPfZwnVM}k7-citC8p$NA9WD! zdC_U@NAU~?RJU-}w(PHQdaTYc7>ii2xum8qryC`S@1W-%F+v{Evf6ru3O}}?d3qI$ zC-U&`n#L#Fyt4VAf$tb4G4xZ*=cD>kNEOTJf(*Sg;u6=X3U`tm zHEx=bi;92h6{kFRYV*c=kD>zD3{I8y9Vc~?q#q9^(H+>3J2qZzWea@>5pe_-FfTjM z44ZFm3?-N3iRwEL2pGo)QW=>CNm{+9rb5&Y#l{z6K6_v9><1l8)hcb@;INI9tDB?@ zAUjZf&}u5W?GS%U)5$h({;KBk5f}5!yyN`Q^_OrFH(RczLVxewFK)>e%9_C5#-e#n zxqQCRt601NECg99m^u{iuyQlIn+CU@u_CYc4Zhcl@1W)DoUX*aBaXI`(w*9PNLcd;)yy&Yt7J z7PygmbGJVM2QD5Z+75RMST^#sXx#7)a1m|j1bJXFnc?%NXIv|be4pvKSW{HEz#Vv1 zBs|J{Gh#evC*WZ+?edkx0MT{DI)l(@m-&j`Oh{5}(3!+85LK~o^PzopEY{)0B*zitr!BLZ8^$<$Ha#m30g z@vqk5zfQ}BKdFEsI?^(b5al}@kuyd+yiZ#qFcEnl=hfnbeaJ;XZGx+7RyxJqU*;VW zIG5Hk{lZ4xTZWfeUKfL3xL96q7axhB1Rx((0iFM=ouAq`4C>kg?Vhu(69SjlR|hC zR2>>RxwYE%8CATl-Wr;e;|`R2AM#u*$i_n!;?d-%Z`k@zKSmZh08Se?+Bp|XW5bcU!ZVkQphB&QD;`(pOp95Qns%bj(K*)qPtNA0y>DAE}~Xy6R! z&dr7xHY)R#VM=k2W$YkEB*@>5SWlD2;?=jX2(JPx*~wyAc*`MrFUwsg2r1Tj&Pi=| z5JhrxAL{KRNPG_2QO{K+*ptv|UP~SCRP!G4r&%TDE`_7cCR8Qa(atxdn6aTRNJn`jFw1=ZM5Zv3kX38}vD+-+ z`{fGNCzbAFTrMOZeC;E3|1irZa3VMDA7=%q7pV26 z${b6Ib~~s%fVo$HlzW+>Cs9dIx!?QSA*b3uSla)a4~@E^wWY~_Y-s)jPgUhqeh=l* zP;a_n1BgMiR#GU%1v?~7O-w5cb?LZZ-ESm3!6cc>rfw;uYMxg_#~?3akQI%D)`JOn zfpA|Cp=(jG{^RKdN8*nk_irEk!`w%z)o(KzFF6}8pIwhw&j1xZnXk3y(0#t-!ZuYr z@?s0P!l`)E;(L);F?A>+ENU0h#pIdFPV{`qP{u=-*Wk8oy7T7^=X^@DmhgKjYzOQJyA=i3}W6W_`!EKD0BOm1;ww?X`f zI+J$4KllNUyXr&sr}yi5XLDd~WIGcX%sQXvSmo>y00Bq$uv0dj%aTt+shTI!f-m7g4?(iQ5Jo3v5z0@SwxK-Dq}4 z7!kq9ebU;imE0=D5k1n7xW$U>c%Qaq2u$0ugo+9rl_1r`jt)p~wk{+K3=tmlU8UMh zb|F>+u>m+2#R$E=ZKvxY9IX|2Mb$g6rZ!2565J&P&6^{tk)$juuo zRGx_m$+f2(7*xYRf_SZGT^09PMRwC`C_x_-+`M$kT{5|q5{%Y{N1UHr#JwT>t^j=>OVbKK z+vMPHyW)Rh*YsCcEMn+nVQy*W{NKS4ic+Ah;^h1vj%|fvn>;uZ@)v|SxNZL{Uv^3V z_mB)!Lac)#LX>)7o|K2=p;10xe7vz#iDCKuV}+j*-a|;TYTf|d+D`$KtFNQ9{x)=I z6Pc}}2~s%xe_ny#2)uhZw$lh%}5MYAdNcm;tv4$}&nd}U&} ztc_-3i{L0U96z$_(#qI*Y}Uey?imF&Ur)0t+JW|0pF}*UP{liC#i=f&Db5KEzqUG@ z8)NS?Loo?s*ArMm-(PK>FOejbSFWm-vKzLxqWEghY5)dK9vc}htooU0ja{wlTOB_j zp#?K#I+|*ecFeWNYgUDBc5FNshQ(6LrZPp~JT41L1Tx~Be2lH~pz$EXOyxoz5c$?8 zwP4eX=u@b>sI`I~#*FkMLzxu8$QH<`Db&53TJ@gFZFc)hRGP6PZ~ZgGuNpVL%c;vK z?EbV}$fl?k;ecKTRbO-g%r^{2z#cs-vNasgSd?<9{3pP5*T4YEY3;Ko>&( znUS?_x`?3;;jGmCAq^7kbqhr#P!z!|D0p#sBMT}c>zJ_33;HK5A9nN~*#???BEit1 zQG~5!CuNHo^DF|szORT|IGETQ2(lw}oCoQ{%~4@Lre1+jvKao!mrlpLo50=0fj(Qn zC0-_M6>wwRXnS8Bhf&|%tvr0c^zk8tNu&^o9hh2)I55SJIv7YPOmx-sM#gpJqKb`K zN%P8Dz|{VO692S>Y3xT9l?X)>Ot0uA@T{?EPtQ#ABI}S?fp-&YLdGlM;}1zto~Z>x zJ$vWT=w@7prQFAgUxLf?#_@XzxevOQ`x+%GZVpu;r`VrKdpJe*kT6h=9)CW5Mo!O2 z^yPr(p6}qa{5mgK7l0zm1oTwdflplTAAMl{MQK>8qAhr#rfhAPn#9cwZ@d9}{!qBi z1ZM8;-RbkJMyEfMAHvhT+6RBZI~(L5J+ATxQDN`C>c8I2%#>S zJDC5<-@+*+UfX&Hd9F|ZR7Ciy7T6pBlYn$Q_a3$3xHDpSb`K+x5T>(`GKa}0g%6Nd zyevf963jim6~$d5&Jql2J>Wz;jUINBMa_nPm4ufXbyDGpR~n;7{~_T*U-vqO0fL61_XuuU7x1wKQw?r4BMVFK& zZY1*L6k+ZXu5Fu;FZo%vGTStZ^al2`B%8lZi)0yMmdw-9)$HN-)qJeO?StO0*GBQ#8hg!dcD)LLYJpoq zP|tpwe?Oe*nY{+gbKWxJg9j*xo<2w?rJ^~8Ddk!(rID<_Gva7lWWxeRJe7A_M~=~Y zIm0N*3tz{D-gm@DrV%Ggf7*pZd&C-h<^9?r*lZUeA3(vKo_E~=>iF3O->7U`DjHpO zR8>qocTAQ|$}&TCiqWT!s{BDVRq0xln}oE6R#i{8nG9Cx)McTDHD+XRU7S?0tA2)WaZCMSb9PLIh#8JpZ07wFuSB!x(#lSp0F&Q4< zOnRYjyi}`HI>h={9L}I`UNO%dWCnug#+oi1!bP5iF#zWV7^ld)UV&Zs%Gpjk zS43-)F0%olLNhzPShhAiscOucQNZHNE-!M2kZ)oRk?+;*zu|jSoz(a!Cb#cm&i^$G zhInGof>eqcclIjkNPkd+c`;hYowm|$nrOJipHLht_o)x=d~htRrOB-HC|-W26KhoS zqkG*^Gu$b?OuC#B8^EcJ$&J2JTiH($&XqvLs=xADJXt2O*GmM68=;6| zL3`YW#AnpZ4y_|qp#0d@)7zSV`)!OTS*wX`* z0d(ySyZ%0j?E8crK25VB&Y08dv{9&J{WY4Y(!+LFC=5p0AOH@>7)A%mEYySZl@j2- z-=D<=#jqzTBZ zo#vvFcb3gWGirxSnS#pv$mbe@yx)VgNKM>Q2AT{hMfdfL&+s>1bL~^o0vB6w+$Q#! zBzEAHV*$_)F6ic(M2pGZB_m0=h!;D0h;H^dhBh3k>JOqSxXU;FiJQH7F-46HlzGFS zPm~isB+N#?4NaMUlcG2=tP-0~l(ba{6Vl;Lj^9;HM(u8#{7v;8pDGb_{dj_cO&I4E z@L<6Og#|OD0FFr&D^~ZhO+HSBC!Y`SGjOz+X&*|962=IJwjRrJyg$ClM8m-}tsMi7 zxV-%t=5zkpJURDRjC{mUI3orH^4~Ru-2cLo=xi#+Fk}4{1&PSyj zm{0vpGgO21zzLi&vRAm@tsd~y!HjN|=MUDekeM?`{%mM%>hwP% zs~XgFoK{8A`SExfcd1fa<)mAZl`XymYtmB`&XG_o9@wH$*am!<{J6m>Z6YOkDnEKP zK$HjHv>iay6>IdQj_P3jd8ex@$W0)N@9=dZo3HKX?&PK~W!~!@M*g`-ac)~f#szof z#iIPZF*P6yq|&|WTa??D>Ci2+k=C;H3>#d-qNw`V9zsUV8>G{-$?VgD$6XY`^x{gJ zQg_xI1+51j(|))^ptJMaw5}QGd8GB_6LUs$foDbn(2Sw2t_Q|%0teuvYuJPjKWsW{ z?(8B%e~Q_3`qD}-25=uLSZWlw7CwKcGG}_3H`W0v>R35)#S<6*U*%qLB8?0t zV($DW0Y-D(8HNJY-%+AZ-mItVp7h(UGemlQX8)`9uY>tP4cNfD0yEF@8V&T#BgI z(%jWjOze2!V}Z^p%M39#Z<0r!?c|n0yts*dk^Lf8dY{a;{$c4*C^l&oGyj((6tZ(~ zi2M&(VC!;D6UyA2C}FiFFCH=cvldB}C9#yKDKgcTG+7pqsjS(a6{5cu0S}E^?P>#~qT?K$Z$FUX>pf3zm7N#G?zgchk#o3a zHnQU78ND0?P+(4ElTcBne#uab4R#u;fPIujjOAl1AxLXnvSddL#?pd>N$wn{KWWV+H6f0{azKfC%@J28q?D}*H{_rj3 zSP#3W$9}B`8goi|9gYi`>Au;BwYtFAEbX<}H}_iOolkw35?r)%mR@grtUgV(3Dd^c z#r&;wD$aPX+t-*WQH>)4pk06P#u)*qyb>gRBirw*Vx7iW%enyopRw1!ZM4>57as>v z)gy;|^!tj$W1I-6iDldUURW?TxvuORfw#0RA6gnI#3Rhey3DDo}XnY_ck zV(IEfW&o=Uw#TqXxKbnj+BeXBhqWyMGiemjm%_?N4@#xhodPT{BSi`fK*`2EUK| z<6ZgB=f|q=5fiacbMH)sA0|`WG--}4aboDY*4+0snFX{l#4`8P6^=j>3O^dy+HGz$Tix7)ZNKZSGGUnyR0WgNC#(| zih-k>4>Utcq0=*isuuV+SYMQK>3uZ9Y#Ok$Ru<%ExAg|s9y$;q=3b=HJ|!<7PEmqb1KKB`UGUX1OWS;gbrJj8;Ej9+*C<_+rr1h1FhRvkGHeU4T1xlT4J0ZIJ+T^x&qKGTTU`jQPx2EARhFy=8Hx6aq9 zWBkBw^tw-ZDB@c#z^@wLa=k2rTh++~Ys6V9*%h#`v)-vr4#X&a;9u!@mrjPa0vCAX zWGw9H43kyudg=u{7(Ad=PNzw9PA|o#J@Vj~$3sMN=$ZA&iuw|#_zPl@N&<=-751JL zeP$=2?dzvxL>7ePg#L8l84c4=%4Y$6RX`7Ig zvCz$)@Z`p~k8ZfSEBGj0D;E5#XtAvqopBN7wYF}&m940+z1wI%oO8ODeSMlSBl1@F zf6dFTrwFfKjub7`6A0aM=E3~P+yeh<{_YevyQo@zM+3TM9?!eP;BqTDBH1vjsvS=XX5mv7*_c+unB&SDejPd%u7Qk=n$8Y ziiFBm##IB*0jhpVbNCjo+L5(Su;G1|aXemkQx$1^mEc{u<#RoqW;!`KO$*%*K9y+K zDkMr!Ufh~SSw7jZbI#|$WRiIZr^tlY`g8~@zlG`Qu)t~~{`o=RcjJ=iW+(3pBCzcL zE#q1CA2i*+H~nvj3WNwan*Ix*QnYjWi^K9KYOfJthi;1QH~YExygr1!BCtPDca;=y zEo@WaxMGw`t3wl6EALjkYUyS^kiIP4an*^UdL@1>$TSTBPlL;rVUZ_}CdWE0`U_+C zGSluM5$tB=@)Uqoh-9rTH1Y zkc#!}S$qy$nL^i+^s#Ct%K^abf~yYo{Jc@o?!^uvNdoyuH1x1hQG=9AJ&D1lm*AP^ z*okJ*wuRcPW9rXt--v}DqxB@Ei5BAj> zLT&$;oCzzrQkq@SR&O85tmLavlsWxKt!ZXmYdnN*xLWP{P2LJ0pqj4V(5sy(xhJ=$ zw9(y2czl#Z!OZ0o6?Gg&_kur9of$4D6K0&$15E=jduj}!#%df&?+fe;g3Qu5T#Y|j&U@OgtZq%@8`nS9gCe+d098tpHn$7-`EP- z+;r;*zQ{yiig}72el_#%kWJ0=e6m#nBx~q4@$t8+6d~vm^G>@2rU`{-k?-yd64P3kOmepxig2|+Yn3C;@T zX?x{ibsOnJtQ55DNv7q_&Aaf>6|P5E9~9p;My1b5Rmdg5wJkWc;F-WW8CIwm$4MsW ze5jqjNun}5`jrt)vNDX=esJN+%2Tvrg~`<$pAb}1YCo)s7fONq{+8|ST%k%Ub(P`qDp~jNm?O0Z7Js4+ zT%LfZ&JC>J3-hmbSO9zLAf%b^N_vD@!Q_mtzx03j0P8~xawWi%IGz)q4T7@xY(qmB1rHZ zdHedOY+;*7?u22~kxjvFK9`i}eCOvwcdEK*!bn!aR zREg^wN$2`*9fgiCZo^vL^`tZ)Wh(h(7NLS@WwLvn@`*1Go^Lmz4l!3w!XBP;U5IAx zyO&xcmp)wM=Mr4eDDZImtqlGsyT-IIb_OqwV;3w9`00GPa#gv(!ur5;4%QB1|0%5L z-Nh~=ScxMiSlW&vxU3T=BN}gtzQ4)j*nWsS?yro4MPcq>QFlXn(##)=;8DO?D*DsL7YwsWH-ncV}|%^<`&?5 zGMPtQ<>x3XA`;Y6lZir~4D$60!j351JAr;xQ!t*%^3zOyObY(@4xT-mqe2#%^avfF z1@dZkS`IPT(P^x&!m!JVhwBIiQM|x2D37WA?2HR_y@J+L9BW!MR_JHzQ)<2=JfQjZ zUv@bncfiqXXjB;S^G1E4?0zO>4eQgjVym?GKlQQqc{gszq*02i;pKmd-YhS23rwR0 zM3<3uxj^X>3Ek37{2$8RGOEsH&DstGNpOO@ySux4a1SmEcXwGh1b3I^^96FdiB_z8I9>Ln|^HHhkqo;v|{rtR~Ot^4JU zR~LryCsGc-p(e(*+s~^9n^-@CrZ%6TGc^14V9On=kQ{!)Rd3{Zs*m3Zb5u(QoVYvu zhL~WvV)tsr)wDOn{r$1}JKXnTt0Vo3wM*nbhp;gmhbuf7<~xq|cMnDXq=e^xs0aT8 z=nGC10^H1;{=5I=KcT)&YX8*_^}e{+?2$h2A%+waWx*beg&amKNP`$%mR*_k49U#U zz4=@o^)*=#I|f{)=AU$RZdZ(GGY#vznC?B5?!7;m4)A|@`9;v<%Wu9|`IMvYj^A+( zvOPOp=@^{1{gR4`5`K@EAJetZ%@m_;4fRvMS|Y;RRkIQ%_CpT5CSmxdrN9^NnJhL# zg!kSr0V|A}9Nta!ROKOVtmCg$3wm0Um&duBX(AaUbMn|;dfzFV;?=uOnRlbAVpEe* zIZ(&h#<5oTP{P2O(B<&WY3DP6FKeLg`ZksBElHJ!pzEfdny4OpWmgb{J6=#P?>azt zR-nnKdaVQBg;Q31i|BG*0Pp(n5!M&Egnk!{%4n$E=qod+oDbM3v<2QiVvi zc4)^%Gi(S%0zg*Z#(v;@L9s})vFGx;y7}m>l{TP<)MCUIUB#6YpF=IjKv(VI_7Z*Q zr4rSR)`jqWbd436{2K<|R?oCSl58b=C)^n!SzCe<7kP?ln%0GHm~{f!!;DSV;-(y*L6Ts+jn0Vz^NeP2M-j9f1NHaHX35oPonD8Z^Oe z%X=-Ba2CD1M+o1e51yhs5_(pcOw-4)Uo&$aqv@)SXRvKG!jyd~KT}~jW)|sF?$TCM z0Q80A=-dj5?=l+KQJl!MPxiHSf~gwU6BhVHDHEIEEC72-mX5RKD6FAJs^V2t z-eC`6Gv$o@k)}8UI4=K^+Z>r~>`VW=U;S;Tn)pAMS|v@L|6NS=zjO6X>ekL^T<8Lk z1m7Jzv5nyxLy{U7kv#Gt5*ErnLP5&B|Ft=veZ;(@+!@(m)YV~W2J?#H@|59shP>rJ^7L5^h>kvw$z1 zDuayo$zN;Qo9m`lrhGvxtvjuebWtgpxB98oR7GA2hexTa=O2M`B5+mubM|dIC1#0= z72ww9?lH1DW1f_9)_%AFb4)4+)?h%Ead?Hmn1z;raSply5Gqsj37xtxUDQ!7x7x`0 zn+bbTV;0h*JcoUeL&_HRBlxmv|NR&B>w|gWFY?fv{4P7^rjt>|zVUY>z(R2;X=5G^ zWBF}TF;;3R+f)*RMeMNg?N9rxX#*C!^0N6}IrWUHXQLu#qwQ{H%ko>!z&OkN=f}Fw z-qj-x>7=;2rQK))TztJ05u_CQH5|=2`;^yabpaKCB!`$S({KK0Ae-~Kk!(V06~iJF zjX1BV#8#1`XHnk+cpP>Xz#d$_nv!<&RhoCQFhsR#S!)@{Fu~2_k`gWLf;7X!xogEe_Th731 zQnZC4mP`TOYtXV&N*4xP1AjDIGu%}?fWBZk4wTFq#L2jrV?xzppF_Ateb9l5-4pa< zgNlg}wy@;qg7Gq9z2%R|-JIL{YVv*Sn%RSWR~z?W=+KWv+dXHHj#_-$2`c6-{F<3l zFo8T_;5VXL91rHAL%NvTjXwt_3Xa5eEcn(s^0!^h|K!#xZ*Kv%%K%KA#hg{aF)Xlp z1;$4>{jXcA`m;T{I=bK-jiKYE}4*cum#nDm>33g0dxOUH6|76OQR!U+7E6ble755Y^cb=6>o;m!^_X z+0Gd^cLW|XROsaQlSe)RSb48qDz(cdDzmLMN|tfw>aze}m`JO|KHz{73*evD9ueV7 zzm?C^^qF~@lVu`!58mPL;?Kd2?|)o|z8x-H^p0?>IwetBI`7qv`4;}MNtr?(ho?DK z<>eiTYyBO4gNH4eIa0Mg22bK0x~v4t&ThqTHVH;L!W9q3Fzd}8`r)SfRnBs}c0NjF zYh&iBX$UVyN!`Odaa4DiFyH#6HLp>;n393(aRs(aUGn7|Y=jOdhNB%;!~)pMuDrGk z?vUZV`PE8!sZc@f=~an2M%j5?v3gJbmE$C3FI0=|wfHuPh^J4gM)7djd5J8%icGyY z>Ege97k@kCcXk-PJhfOZZs8>zAuPk$zp|UBb(n4!As5t758CqPPX!AyC-fMyyU>`F@dx2mJ>z=g>_5Dtxd^Q|S z5IAyd7up`;pkC4{stdrwsvc?7&nGl$BT>y2?Gp7+Ey;#EL;117dZtop&~M3lrfk`Q z;>3EUYFXnjHr8m64?#k|qoDozOX;VbdE=J34`Oc5S|DXOr+Q5Ny14JAA#NXp9mv|8 z5Pe781ZihRz#zxgH{vT-4}f>mHJ^3CV?6nqU3D}l%{Ut)GfhL6#GsNuYwahky|`;? zFs*9Yo7Ko>B3BjPlW1U!<{-Zfst8&xXM+w&)lxf5oM-o?A=!KMB;Ua$2Rtx@_VZ8sSv=I9+vd6NPppDT0e0`Hs<-%mo= zQ+Xjcyhev`Y%YBPnxE~%`=-$_>j;4B%wj|cd_NHQj1G~<>fnKEMnD1PQ^dk$*goMj zBcaIThc~*)dn1*rh+_Z(*fE@qufV3GDpe;ub$x9rF|F;8dPG4d zEbK__C_j?z`YB3gC_z%2PuLkM9{OB(j(1SUPf&Wfq7Ar{t{teF_5mks4!%eeI^3Ei zsG!()Ags-&PZ@WYehlo}$H=!QbPm3V6O!Cm*8NRj%SFcS9}h> z$P*n~dUP?ZFpzpe0Vh(#R~b5v8xJjKe`%PsMmaD^U|*&8-{y1wiE-c`y6gXKbaI}P zMDd$+djZlI5;KHis;t|^BnR^ zz-uXzcY^fg*nBa8|K<9+RqmR_y$03W-F>b-#A*+1pAtihwbxnmQCrSY%l$Y(F@K`B zhUM37ZDJp@g_Sd@*p+2#s2mGj(N~lYOS)KV3?$Z*%^j=HGg#M-dG|`B(lF6md&|Rz zt{~n0ZVzd%(=P7is{r7i*-tU=X+7mmkjNKX(ONI9U+k;jp7XU_>agr! z6$whrYsQJbssAf|awfD780{jzMJ*pLF9{?`k4Ps#3KgCT2)GEArGev%*%>4M*`8bQzDVOGpv*5HK3Y zM+6p=)5s*#s9g;&lzx+ba_@@5d^nv|V#)q9U$lUJ_14fG?vzWfBv<8PZKc!P>H-hV+-f3y{9K}=K;Z5AT0W4Xea_5l_@dB+#Zm7}v3D49o-euqiDJH(yK;7P4P0x`l?Ti!e?Gim$q43K;;*Z>rU4OyPy(b-! zYsD9f0T;SJYr@u*k=TS5iRhud2h_wVS#SFt-VlWT&UjUlAjxQyvs5!{_Gq}K+xPFw z29fyjoZ3Cm#}+ryo~ty%K6^Hr#j|Hq5qWJC^`=ER`zk4=Tq@`tf6{K0YG-|hxq&r7 zHIuopkQw?D)eThKCEx zBenBIU+^62I^^b3^|KBg7+I4dfpK`Gw(RWfx9LaQCJ5$IqS4n@cH^3}Y#JxXfI2 z)g8@bdY%Zk<0M?Ld5Sd2Ed&OXw4o!^B=PeiKP6$h?-qh^3|Q#JQcw~nn%Kd#j#+jw zO`L(3wS{wHED=CJepV{l9JOPT!k&J9#UZVXhH80?3QrOn(@4%0?K!%075Ri!Ql4of>1{~-FTtRhMCBfjn$Cl=rh5q~Om%pn!UF)aUnaQ%8AIM1 zqf9D$20SLy%$;J|!j4gVva^I}+!MDRp$w93#4X-8WN$&f*s&(!=+Y9eXn zdpTU+8CL#6+sL1DLoo;@R0ePzeG{1Oh_T@%xN4X{it=DT-PU}npUi)dWLR$AFC{`R znodUCOr0sri55$5>N@I0E`5Zp1XqL1&Jw}damAz4?) za>|A6`UI!kS8t${>Z`coCy&t>Cyf4Cx{@?4^?EFQ=+WTl=t3=|4YC0}jmfb3htEL+ zZD{B_R9fm2j4H80xAJO!>)IqQ7&vhXmtlBfgM!~0ee%cQ9t!q9M3Xj^JFi}@?Qd@@ z0gz1(Wjg#e%aI%0R`vw^>1&VivM6I`Ad3Icd)TH0vn86oQ(dxv;4EhXK}oT51Fgx}z9rv1%~JefnK!x8^1)C-m=H^R76XS1z!*%x=LmG%!(s+g_>`Gr1fcP##jY|!tJ(X>R`## zhBguHn0ZW<+iJ<39znw(=*Rx3Or3B!=0`f#*ub_TinZQ*)s>nQ+D?Dz(p9$ zn)jkbnqk5Tw-B>TskG`b=D?@9Be8ZiN%&h-MZBvlK^SYy8^?@9fjt%3kk9}gn}np~p^t9* z?5B7?ciEay5Uq%Hl;HA4ETPJ)Fl*N45gzN_S9|^|fxat=e17;@5cMO{8t@WCrZi{D z`NX+r)e0e;qG*4o)|@LGTv1tfSWb9lds^2Fu9A63WKL5IT^LEkox{}&m%TRQrLg(;6kRg*MwMHspK;6lGuJ=H*oO_) zjsMIgEvXZnJNXKNN&7-%#|!TnY$que3swb69sP$}h!0>d*9j*(-lc2$%(4?@4EmRJ zD6e?ro{{d7`XZOc}<~HDlGe&m=o*+7E7|36IdmWxLCN} z=oqAyK3Uj&{Mor?qf!`V0|;I3i4Z{0?jD$AO#b1-hGPuI#$V9;@?F6t)|!s1ml2<7_?D5 z=p`ic>gAKsnhJez>Ku=p=e5k+aqSspD^AuoKdhOueQpKD)5^9^ey)F}HSySZ$kmiM z(_jN=`j4?_e6I|%wnq6Wa%=RXiSaB0Z+z%8#5yB)#(;yM6|_&BQxy$2Hn_!XEh(ps zJF5dbfxU(H`0xpckBp36y{vX#bM{}xvy z!nC}DM=`;sdQR((6kF8QvESSWT(O$nw=KT>uvq1-AY_`JvjT$=_;Sjl>OPoZqOmSz zpC~d_=fmrLbR_uX)WQc+W2#<;W|Y(8A(?CSm&vOs^?#`lrb73h9icU;6B`@8XAbB! z_@fY$;HXUMfM19>{x)wZ{SW^1|ISO0n8A-!UAg8jdG_z(yky1#*meoHc$rVSh#@S|U=Pg|&;{bCX zo%cDCCXqdFx-7?H_`H@%K7Yn(^U;lLN^fCP&|M&OP$NX9hOMFi%Lmj*JIoJq{O~#t zYDtHE`xevQ-8afH)$9T$`%U?vZ7ZDKRG&G3{DFtPRF#Adp-5vk6yF%KHBeVm@RBDi zkn{#u>X~!}YaFoN_2sLM*r>_+9j3rxKsOlEB&A3)ts-b=;f3nd+SsmSTShhOAB;mT zlWeJ8TZxPybUhKwy^FT?YPuxtu@Z-Y>DC5mrU&QAWoLj3K#mu}GY~&&c^Yq)6I$4{ zwMYBV(4>f;?>aMKEsF9j1M7{$+;hFolcRf(2+(dy%%0#kv(jm-ZZWf^=ZL$irUMK( z0(1FFm%ik89rPzVeGk9ROMz1`HQ&}LsPPafX5%LIaUQp*_j}I;e_~BLA?@2e`C_|b zOU=FnFoZFhzcqGKB|~fqA|9D_ zNSNx8m>OZuc6O!HcdH#tL{ zHdg4t3@GFDK#><%tL2}|A5XMkwoM?hQg zta1z`K-T8G)J47!0BEb3b&Ofh;~LmUB^+Lt!-G93uHNEIKQiZ2?e`A5zl#-NPmVa^ z1^Y_dMvvH{&vc&0k3Ov8@sct_Om%wn7eL|J_L+Zp{_(0OZQ^ckj~{JOa3f5tU=NjI z&*?F9J6^^6yUoA1MVwg6X3=I`|C-?CgJejgpxBdt+xR9@hWMItj%qEtE&ud2~6 zM0|(`!cgQ;41lIkbu{UvGV;=K`KrS!R1EA=#2;rZrgg=Ur_GSJ?mj4e3(*l6>|&YT z_`#5JgoHC8_84wFJ<6vaAh|0$p7R`9-SniyDt*c(%}%ssw;23GL!_)?Iw=r8xM>+) zu6qSj15wM>(u2Rohp96D0~4MW68nlFcCh+kD8)B1__6mXtu3{>%Z{t z|2>k38@U+$uTZ?ozuF_NMYcboKnyUcky7T53V1|IBnN2(qEdfyE~e}d!>&))cc(;u zp%c*3A$);&r5?-C4?!=w{9)u>VxaWhZ>{V5+sg~|CWZ!%TbIM8WcP)n(XQ3^3qoA9 zHvWWSm?djz(>7=(@P$%X>)WIznp?mNt%>UfGzS6PsOK}NHfOI*#PNuMJ)w{!^*_MH7U zlmcF?%Zjv3(n=S2k<1-BLg>wL>i0ie0lW4UE`T8^jm&s&Ff0aLydUX`!&OjmRtqI& zZ`=!gxv9VP!p>KIoFfOeS=p|Brc31`_7|SR!^I&ddl65COtIvp+?OQ^Zza&lGBQ)s zeL~|HoOifHpOWakRA=~vcO z;#0mQ^*4t1<`P|l_V$d6Sqgf7VF zMnQH7i&|!{t0XM5d-#MR`&x83V$F=41Hw-I z*cxso#?LLYgkE3nxJbPcA!8W1I#Z5xQ;xj5adbNNn^C$)eE3wLUW_usepG5{@YH&I zHqKwuY7%n{j&d~{`&ts;k|C>l<>PUg*>iO?a2uTMk$=%f@|GDe+FIL~H&f=1%`8TS zOK_6t?-(XvjEl3{lp^3hhNPnzBFR>vV#_;jn?YB-sX$14D60AErH;8pi`wI|buW#t zvJTIydPEO|CchZaLaYfnbr9$Qc`+k34secf`k)SOwR8mvSIIg|fmwY$HZw04bh65;3M(Jh=ErbP{FubL}aOZnakZ&%4JMpy&` zlO=$CMPk=_}zywRY;uaHSJ2iU<ZaS3FMo%3uDkp#F2 zwwi^7dUT~%TSq2I=ihD!9U?GnLy9t8v}ckB8;nTi zxa-&5Lf5uA_!_wg{LJjtMtNFJwKp@q+~JOw)%BQj*O6dpcbr|XoGnly8&7!rv}>1U ze%HORlKQqXCEv|Qkc3C&PCVF# zFhH!H${P{Z5d19a#4KNegY<(r**pzsL^ z`z`&87aX&AhZbUSQR)%38?3)cJZ01!HlqYjZcKLAHzl7`2ZD1){U1+OktZX))ni&p z$|UL6mrQE%y!RzOXcg(7?pHTkt+h6Kz8j4;VRyv(DA`l_N_qK!>bk|?xqlM;TI)5s zP@&`9337{AkD~DlV-NZL`f_wMb|duph^igQUrEO5rPFuUo%=#8|Qrx$P)!4)=7uargt6BxqluZ_{w5MC`WKQ zMj^IKY3L;(*YH*zE2ief*A4C~y-61@9qG~iZjFWl zF}C7ca?Z7BJUi}v(j#m&jfruob`q){fztfI2oaM!*|Z*KP1}2i(@H4TH`jK4yOSZ~ z;0saBl)of<&<={T=Ip)uy3nN0vyOY6Q$7Q@|G1LOZ^MzDqoy(ooS8U z=8gk_a{~)vs32GqvY!HPoFp5nab2K6K0;Ms_W|(uJJ0j|&%5%TV)xx~Vv5?^U$nHa z*KO#-9)s%+&~V7n15QONb-28>Ye+a1@0TjDmX{OrHF~3}O$de;j1JpUT=bRXY*o9a z-tKyC)bk8J3Eb)N3Q&BFkq#Azz=@huFzeFC&@s+*CV=r82)-B64DMf^=0CKK98Kde!q;*Hix@XZ$d@s=@%pigQe}+wXle)m4(d|M=Cql8dBdwvw!0y!$pAO z1hjzR#lT7bvEc0qi=(y}3|=VtaL24)^*>=o`gZ3u6P)DVRur3KvU!?*&6b3ugM8#d zg{`&zFES_9?s>j@Zo%<-AU@jlhbFz_F{lI*M)yp4(7z zJJx4^Uf%lq$E^&a@$gK-1BZr(@9h@2@zx%@YVNjDM)7Rv+gv&J%Lv&Ayl)eiS->MY z^}7u@)thE?t+9K_oT;e)Nc+M2QdCe!wH4-oALzY=#PE6mFTU0sTFZDZV6HP)j@+ngi$jAx)6#-N zW+EbuO^^)I)=YA`m{4`{7D_FuZWh4whT3Su|5?U@BFCQsem z-4-P%6s9^s2fmZ(_ni&?ufLy(#BaIRG%WjTZ)B(vWq6wtZ&^W!V_AGMYb?IOV|M6i zLy2Yb`{NlqtW$i+Bhf5F`wg>mvXP>XBhp`!&axH++>o451n>!3wI{&pj7j`nk+r3% zbbj!?R&{a)`m(#`c`)5mdG+TGBV9eNhsGQWxB;qAj`X=I8>iTgl4ObAe7JR+7^+m4 zI5u~NT)FDQLD#9~gm$wfy#vbrkB2lMx3n=({90%E0bIaBkSKhLfy~$k#!d24n#KW5 ztlI*@#Ph5&F#vMb-g4;(XowBYHHC$+g?o(Ey%frV*s@n#Epxn%t@1;c;lrqg0S=ph z&B7+6Lx+n6q^fp1e*v-nxoC+=OGSxUZM_Q>^W#y%75&(@$5%2Otk!fn#UrG}YBe2T zg~5;SAJf<+D%2&SAN&V`4IJKc+Gg#gHQ4AbDx3h1hS^j|psD6rZFDG!luKD=au*Io zcu@+?y`=LgyKS~zvnoM9UC&Xd2kN80rJp>8xRE~-pO^zv4%T-ag+2k^V!&Oqw~y+IpH(Pyg);>gr6O? zCnA*Y9N`NDw{aT9XqLiI5gptE5A`va-0wu=4;pcxyt-UPbpY7jiWB1#bn}{6N`bGOlPCXTivT{W`e?V&;w-`pjeX0e+uSp0fT>}1{V_^k%e@=Gq1D(0(| z>B?;9g?B8+t`S0G!_dwbuDi|59Yb+^q;C&y*m2%(C&}uv&yxGd7FXfAN}DMbw@R*9 zc6{zJ4wKBDy$O->IRSg2miHd67-6Jz)mz-T71MuTGC77|;Hl$JY2W6BexEluhrpc}}syl-_uqYVp*^(w2#I zZMg$zO}&SJ`6AoHw#M@e-hzVxQkV)r-I1tYd|Tk2v1`=Ew>SrP3W(_7yxoX?e=pGX z=FNSE7g6{7f-g3cjIA(y*8A9Z`6iiH6{Q49da^2q7zTYui5}|RVo^>ufrVtFbr?u` z4OUY4v6H3I1P(3|W-fhoY_uj=_yWo}9a}vZ15dR0h>cwMwaA0()Wcu6e@XE?3G1M4 z2vyefCikoMHh6AodOgG%?73EEu+NgYpiFUHZfxs9sRTU*@Aio}nY>IR=g$w8&$BN` zk*UC*eEZUyQ8e@;3D3W9XKUAL6jUpSqkLcXQTYvk zuAFQ(HP2)XTl1{YlT&;E8U8(wW3!FLf!fb*lPcpOw1i|*n4f7tJN!na^W9YeI+I8z z{Qw?(hNtmCUPE+6)ubAdZ!Kj+R%^m6X|q z)+%o#sZJYsO{+aG-=+HFbFnoPI`cjqOsB$zD3<&PEM2eN1nd zj5zlte#)Iw(4S-zcYd^jfpuVxfk0sC-)%l;rN8AH^V5`SJSzFBzSUY3z9r4Lp^Gb4 z!upIo5-x{i@a`O z>`G{M=s9Z65~p0g!Flp;O#!Hh1HIHEUhWjboO{DEYFLYCz2hI1%rvfATmBS#;kn?g{dU5~xm*?CwQ`U( z@%v|6nOGVEp~4}ooJ0wo#!A^o3Zxwu`}eosgfH|tV3s->BZ))3*^v^26uygK;W)9} zagcTh|HVxV{9%FbbzpR!IN_4T9Zeq-bsObPm<+&{^0_o4!k>ukMied-m`1Ia63ZKU z7E}5v5SS=3GQ)(89OO+A7cYSIgKs9+J?Io#?>1k82-iDKPQ<1XHj~ObojLy9S@LV6 z#M^ZW^_jZfjj9>|L%H;anp^uN1Y54dNp_fKnY(6YF+kM;fT+S^|m&McI3)Ud`B+7q>N%{*IJ3O#mXu5$mZ zZ)%`EuPt~Koc!BS@E><${vY6szt;YL@-oznjQ?vZ_%HMBfZCcOnh5$U(3Yku*hA$+KJ(ix0PVN6K9 z>YTy+j0-*s^Iu~irCf;BK7HT;0Y-b>MMqtv{@F!4-(WvuoEZ%HwghdXBgp41UZvY_ zQ!bGP5d%0|c|U%G)0k4KMJ@@~WhLI)yAr4s)2s#&ZPYk+-->r>x#GKg9vMs1W0b}x zaF&2*EIpZFRMP126;8>@L;)IsmHkz84HAf*@>K?6Pwup>SR<5!WSArA(rDvVbA{Uli zm`hG3V9I*5%A<}l2(3sa_&lcm@A_Jq1?kK5{u381L9O4o~S zS}eOECPoVp9TC7i)T={V#o^&q!d~pY@4$nkgd3i!nRr z)37AE(BiK2|CBc-_n1T7p;Vrx|HvC0Ckp#w|B^S>;m0xLEM%<@dtxKy*zHYOsF=kz zyj8}!QUwzg1guU4N4D3xyUwM3H=*?d<^HX4M1eJqbqn3XWp`w#{iv0lubw{PbUZ!* z6)u#jxxZQEY95A))pe9@lT&CIqvD_^XXeHq>t@3UpWFH?2i;ERBY3`KZzl9w(06vP zETa8e;sCO`10V72Ehpkhq`3K}ONWQio7YFlhVy<9hRFJ3mFF?OU!pL|UpzPgtke<8 zeb=!vXGxTTSptyPl71D6LeV0CiMAWU89RTCw>m1<2CZmKuxt~Y*AXRd5F#}FTK-%& z(7AgfM&n?XzPo>=o5g@6G^nC#xCNN{>88nX2JY0E9~>DoAuY=Q?L%U?b*8vvu-1YZ zqS4Hz%@sMf?a#E~40DJbJK(OZQhy=d+Lp(OKN^QMSmS7U`0n+W#?h5me7+L1W#W-adBdpe7o=oj zNdYYJ8w6(*If58e{1n^!QK~r7fAMmX<>L1F1>!k|Q@&9kly~a2YQI9a`1P%6qOSL6 zTx<-~MgO8Gk9NBV8Pe)5Xhw~h@z~hqtnAm*?bPlAIhLI?V#m37K5DM=>PHF6J%vyZ zFf9Sb)fG39n*8R;&!sG$4E~&K$ocUJM&Ogp?Qc)Ef8sp(>-16p7d<-xjBNf7DlnSV zA1ZJHebl>p$8A00L7A_n(~vM?q(lA9kZJXGa6DckVpjAqdmMkTz~a3Ip=x#m?}@&~ z$?lyFVCe@@M~0mpogK}6>-c5?Zqd5Kdne~XT)Xbn4qUOrtKPx&doFX#YqFLGAt2^> zEvR;L9-sYsKLmJQQK6ek(ooQrt)QB*gAv_aS{N2~9nw$j_L3I(^#$k5JZOe2G?M8svEgwGi~iZY3trZza=GDH z`eWQlRo}Wz@MfC{7@B16P~T2+c4(EplY4EqHG0V!9*6H?C9)r3%yHh83)gE|?Z*$L z<5OP73(FFvbqm|-^{sD(OXr+Wuc_rsbwZg(7OM_$G+F@nC^ER}(~N>{t7I754cg_o z?n>)!xTE68yw?)EHm=$sv7Ul#mUUc{hNut1z!?+DuOBNmmax(o>|#atub>(CFL@Ye z(&bT~@#$(@f<|ejY%3c3mg`&T9e}aD%Jy`=o3)wn@>Ztb6|>T|i&+?PeEQl?_+s<} zAM38JsSDU6=%}47)23#=+G))mKq%hd(Xg|IE{C zBVy-GbE+n)tungXEXta8#)kA%@DwxA)E1p|X02pl z3Wn^6AqD3&;=I=c_6AZ$fJ=47=brQago5?R4|Ws3sQOvrR9kg@YR;j3hdHuxKq~iO zFmR3qYcFgL7B9C;b;V2OHtz`2fhr<;H+#~3tC<6a9@VJ-)+rtB#~0!BxM=RM8$HlN zvDlwQeT4190AAEsegpxOVR>vx4P<$_(P5LylUsAWNs0bDV0 zI0xR@Kpo_nt{P62+c=t5cVROop~QiZ&$VQKe&(nA3a%$_73)d|Ijg; zG~U2ECQ7cYT!(EcX7%U1fZ==VKt5EFMvP*gcu_f}YV^;ytLwHa#qJ$r=Y*fpCB!9! zyFXG>my&*O-@y5f9S`MV6c-%jm2|?PVarz*bDiw+LffEIZ})J58#%rd0Qd5Pwe$C19A}>x{Cb+KOJxfvkTujz zC!}4Uwlc>n8D>n0 zBk*@>!+sV9u9bo>(v8NGcjj)yRe`F3a-`WeMpi8VgvVp?sSJ?W80YrXWinsG2yd@wHFHKsI9Fs^26kR&sN$rBywgyM=zzMgFhpYgX zDcgG;yQYw>id8mF8(f~Lkbx#0kcO(xM(Mx@0iG={S=TVT!*kpSFjn(7T+>VfZ-%g3 z9nX1fY_#`a2m9M@cfoKw$;27R2G&BkfM!c$W?l1^DfLJ>>D|U%dBt^O1?P}=%V=Z5 z4$J9I9>9V;Lq|N}J9eU653U!a?q>GGx=2JupMHUK=yF+MY);X)&FJKZWB8dMX&4Gg zmwD`~47?F9bxHap92Tu?R)JszDU^;UfebzyW3~e_5hJu4MQQg*ZbptqLV@tR!DsRe zKE_;8yrU(ZW#LSR`L9!p(>kddOFTBT$LX-7p*e3Zf(xIyI^Jb;tj(OJSykZBwQ^<8v|Mkye@R&iVSXmn~4 zFy+G6Lh#r6YIqD(f%>h|3)X#;olFzJWzO{NY`G zhlVeu+=2Am0wb@R#y)n&X8j9(lf&_H*b~2ibIS(cm@m9CRKOG~U!v!M10)q)F1$3V z&zCP3xWAc_R$L1b`k2j8A43kPB=+I-I5JxMsb1D{@6dYob$(XmYfbcE4?+r7`TQcX z5-(SNhPmt#@`Qi>ttkTF#abQfN5v;;dSCz;FiG$&w6Fr%MuoAr!BJn+35w zAixDW?)SC~R#AZy(26fY!+mjx%#;j=v^YnAp?#9b5f*mAyrO%c1LUL^_;; z#+Nb8FM)gVYYn?B)+4x1S=!Dttros)HCo49E5sQkBYf*3Dqf6+L0YZ;i6{;=?kZ~J zf*9e8Ro`AqvoDLPu>{BbBVCh6QsDZz4oo-OKzEx`DCMImkv3akD>3wzuWU@AHJ#zUJU z9kdv~Xl(?X(8T^UsBGVBG68Gy`Lw`|cVMRqtYyPa^Hw|T_zGT`{VfCapuQ7pp^Z<6 zH{b*n4;6sH8nLGa|G;29^U;Ji!zS)%AZSaFgkj<_$M;uQ_L3eXNE?g@nuRK1yJ$G3MoB@qK~#IuTqlMiy|~Lp(ex+q3(E+HU}IqM42NtdhlpI@=>Lt; z-`~yPx2NGsecIIP9`PWUW=`e0J{X1hrFKdT)~s>j%i zWYRky!l7(bz;9F!yif}_e|!OH63WqoWd{ma_RU5qcU5EjIaly*RDTb$cs0D4kPBC7 z7!rEXT996xH8&02w3OI5nTZ!LjJVg3gADtR8e zU$ZTB;FeA{97DZPREz_ba+5y8c$c#EhjO=mMXRvyX4xr@UQ&$sNoj~&?QBDP9{g3R zB3Q|?a0}&5r)xv(v#S>}-$e)zU0|!X7EJFU-;gJ^;US;0CpO|?@vgkI06ZL9OcM`( zatLR)x856+ly8q9E?57Ybd()><>ni7wt<2AuUiVOkuFNKHB;|vsO&8fFz!SR#yai- zYjqsbOZnZ(ygd?@>|W;su1cjaSX9AE5)G408$dAYb(6v+hZa_|hFQt}J)19%>Yh{# zyaPlXRo5#{O=nMDj4zUA?z=kz^Cwya4gUiKXo1H+_S!2<8SgfL#N__B5|i9ND5(FI znEv#nf9XvBH^XAR@{tPwN#EgsWhC}pcg*7H=&ZhlVnuYR{*fj(F9jM5p z!nrd7WO`F|NvXXH_|H>NTYlIkV8F1rVrM~nsMnC%-onRh!pOrN3bM_Jcah{s^=bi> zO!Bd%^F|_qD|EoNc9?aKj+qw+0-OfXn|IeLik$lOMbYMFqjXZ;M2QU$*nKFC{p7VF z*)=AZixA@S)13h+2?qW4dv1bB4f3jHUq7%;meTBgDwtU(TEGu~`*OxqO50NR|? zY_w#KEhl72rHZ{5^L|Q$8V^Vu5{0r@4anML{|^Dd)aF`=nH!Dp;3MZ#f42EJ1vDpz zcRiCyq0(;Q)D_qsq_ojd=X!O7hI1AS@(r;`<2wJvXQ}D{MW`rYR>@XQh_uVoeiB5{ z!Zii6V=S?QoB_{Bdk@^qR?_N-5xUGJ@DZgW3S)(v&tpT^n>~iv{jj^`$=Lg=d4qGS zIF8axse(rSmE=yJ{WChO0n3qCb5z4nYuz$m!`m6~h-7dLz`|P#z66a5^88_|DEY9p=cnk0IaV>mj(~1gE)WXMbqdI%qWyWXrKL)ey8k+mM==O-V{t zsgQvn9zI!wwr~y|bPkN@QB*KetI55^9G9&4g6^FKw5{N;lqkaW@C<>Wd<3MOFs$J} zpp0?Nl@5_6M}9`W0+FU*KCKwugqx)MdUjn;byLybIOuA@G#Sw5m7;qemO35?y{Uyx zcpl;=D+IZ`Jd&(Wfarx`+h13SY5^@OS&mCF5)br|%!r=(672X2q2H{EZ9`HT@#MMoct z8_^c*(Wtv!z`8=fFyZIr7_b=|ct^w1Z?Az@Jbm|*1P_%)2QyGh*=Coh8o^CKmwu#` z0$TTdFrk`RYTuf6!dk!H<8|1X8$-t;+#P)qo*f_lo`gW8zHU59BM*OF7c%M{ z=@C|m|3-s7&5-z7dlJeMxPP`xKow7z1h7z|a3b#0{~Av*d^2|6mPx(w4(jy+A3@zx zgL~4C0;_c_3C(Efs$NbZ|*QeHAw z{=l@FhG%{2X*AgbWe&KU`ykkEo&vjPn6kqz*#&P z=%K~VM`hV1zt$=9uw&4?7izq3vlFIVoa-s#o3 zOnT#8R*Eer>Q;;@?vQh`EDdF!G~6dzlWJ(w!Tzns;lEq{(c|zuwo?Im+@{dzO?q_k zG-aXnv9h00&Fmmy3?jSKCZk`%c}hpuep7>YAAcOrf=Wv+S9U6d6slw%q!d%7DLplv z@P>5B-Z)e;L=nz>W0ujSyHS<8!f$pRRlP#m!7rL+4OeIYd_8>tEii-rtEMN=&wj8x zfW#hj&F&Qj1(4YLe4-Oo)y#xz>m(L`O00HM(bQz#K+C+;Ok)=jS9g_*u$&G8BzCl& z_-t}3ilN7uj;H_Q|OF>XxO9+RQC8l+>o^I^D5 zT-Iesl}yBm+gfA5@JK~6imLEx5RWqqIEn4-7d+5Nz_+a}Hj}00HC1VCnBZHKB*#d% zbj8zw-Nq-u3NJb(D~QUQAwMLu%K#ai&P2w3eXA0Dy2iDi^-IbyGpw%E^)7B;sj?Qm z<|Uf~oYLmZ`KA&cr@#c8OxCyg3v0?cR;lIb)|$szqOS{EhR=bri&nk@8Mkafoc-@} z-8pd0Ei>0?#~tS6qt{v_5A)Y5U|p=ErG7mJ!B=25=vp8PVON|PUc$tF zo(YeGp^9u{&QZD?b-QFxY={9>{hLPm`+J|5*nu+(Gq68%bK-D_vWGYZkdtogY~um! zgx3kzgl?z<*EDiIQ6qnBgjF?cq0%t=5eXZyH1vFykwxvnx09v;`kno^Y(fFPVV{(B zs8-23yT=-vt||J!YE1Il*;I1YgcGM&;M{>mTxaKd458a>?J$xIDsh{C`v2ZhP&J3( zn%?W*u)j8=B1pQym*l{y%}W{K@>`kx0k9FmE!^;a^a%|%)tov2EiT}1wYY!c4f$(7 z`Oll?PnPn37PPXjD}pFe`xjvFB{bsjx#hx3QIH?y^JyaDatO>M2!h0WH@p+TBu3wj zUDvR=_BH3S8a!U|aC2}=i)>vMh^Umfj<@Kp@5Wm1JMQd>r>T{`_SJd~j z+@xI4+S#}+#Kr-(LB!r$|DO&8qkwY0RS=^aeeu03;C_o|lyaHv4qrRNaHtrwt1WzK z8LEiZ`B?!=p7hLsT9x0?%T2zjs;#)OQ{fF*=d@98*qz36%*;BeJOfw7`RZ{>%#@Onl~ETGb!iTL{Ky9^Gt(?&vSK_#W%$5j{*J-dP^MQ8NvttcH<1 z#|>Fx<109*o&Mw&#()9Pu<(X$O@zcC-6>i+mKF_Cu!o9rL!0f9?4tHVuiSYXDM{`R zj|-pEb~(v|j!ipJ$X9coxbb~2|1ewP)mU)NZu9kzF;~e^)6AvJ#PGSJ(QFvae!)Xu z%Xe)mVO?9<{0>W^DuaK8fI>HD`#z8lN}Z#d&+pPBWpjT`;}gqzQ;h0O5f67e3pK*) zpB3=3%BZHt}_Qws3 zB-fd9V-Tjt0H(;V?b?I**Asv+Qli_W<;%kKl=~*|_Fd!1HDCXJHOb8=1?Z;}zu^t( z*F3nWFK9TEGr(s%a_xkSg)|NqdI;zYhpb`qAx`--<7T*&9o;1hJbQ#1^<809h32{i zw$t}y7v>od-3x+tT%LE0;7mN9xMfdN1#=EW1x?LfF;IVy|Jv9#K;lZdGS;AlnQCXy zXyiM&Z^96e#AmwXtQ4&Y`&=GQBVSn)dO9{$+jy}UqfWStdq|%1^#&>L)ykgc+3*r> z^gXE6C}~KG;JRM6z|4_fO{}aO@*MHZI`)Jdb?LCw7% zmr0_E?VfZ$rjSTZ0*8XQS6}OvR5+7*DoAPYCqstik)W1FV3~y0h!F_-fc*9SuJ6Zz zK#^r&l?6BuzWyzc<)4W2D&{V>M#heouI4sIwyuB91i(da>+E1??D!vt!v~WEkZ$Qi z0^!c6EYz=Y0;Oz;z*MF}#v(?UgA5suu{u*F=mHKkbk4!Ze^gbT$*}e0ms;$9=$1)vyr@w%I5Qt{e z0Ox?7zq=2qMph1jqE%b7oa=1a5G5JCgW%iIm~w8TSI8DZ7^YfR0A9R@zL*%O@UpLU zMTd+)@IGZu$NENT5Q?hP57L%nWDfD3<6NChXd5}|gh|tbg&KiQwC|vW1&(Cy?m!&QI6y$|f zUqEe_v|2I<=EwAqTC?0{&27QaJsq4IkL=gtj5uG5-idL3U)mTu1sPB?_D^ttE5>?p z6M1Z=aRm`iATrF-B9R={i5{B9uEWmAFue;2bM2F>;+)?*hp=5u= z*tqq7Cf3croc^><+3Q|4`M_N{@Mjhmb<)15gxerx7*t2%VP*?kR9}rYuv%2tc*vVZ z79?F3$e&31%O?4~`$qERhM;dEWDcgYzd2I5UmM^b%l_qNGQ`03NcY6TJfJjsOX;23 zJ8`LUFlb0Hy*K1b?>&hEFX@p@jLo{lKaS4f$C*z)oYvQCCu2w+sW&)H5wiOJQTS3D zToE3C!ms?>!v81x!~aj7$-n5}*5*!sw8MYB^%eic%%?6eCNIDX&&~-2Nsyl+g`WB< zO^0bNv6o2IDu~{aS<(6v80Q5SkXsYR^H2yNnE)0GaE;qqN0OZtac}fZ&$&&{n{gSR z|By^j?2>aWJgL`Ru-5OEx$M%sG*4I>ml;64E~$|G_LYB?NVbySXfT!sRk|IDX-hVh zC~v@bkZUSvYIsn94ahCmxKN*Kly{q8%59>36L+ zYU@MJO|C!_?%R7)N<;)-prWIUeIM%2+SgRc3F=&Mc#Jk?{UU2GNlrVp8#7e(q@(%Z zk^SRmYZ4|TDB*bB7EV4zi>UJK{YoDk_7_YJ5lH%4tRVT^nxFclI=-je5Sq}BfpT$c zuCf#*$!H#wj3=NX_NCvT2hbQiG(n-6uYETtnAM<#6n3|eeo>GcMjj94#frj>GeRpy zKCXO%Mnb$p=-tG}9Kj$X9yLzu!56H+BqM!LP7Ar4ucK8C(63`~B=GiENL0+s{J!yH z1+w00htg9*1eS3&=8hWK3ZnB|n639_$S2;kH6^~c3#$^9E&>yJr(Vu{3E_kxHoel# z?uO$Kfng*|P*shEd&OaaT35sA2M+ZOxKs)7ZG-p{Vt)00PzN>6&>+1^0>WFZC5Rt5 zop`(Hq3_tFOdiM=QrmBLhm1hb2=Y>d!J%XY@V!C_GokP|ar|)M^XWqN%jjoIOSEjS zVUakiKjy^vGP>E$8jm7+y0T_GP!3@IlMkI_`^Lt-2ZDAEYk;{!qs#Lv#EQP!pMun$ z662%J)RVNBBXid2#LZg@kj&IqI?Yfxo3-OtGzLl)SW3IjP`H}46IR>@Y6W?6!L%40skq54<*pt@&9h7 z{_hUBMIAUcDoh**jg&t=0EG?>fnCN6qA!7;V)u|3uB3)3X`$RDc?}-K7g?cM8RzQr zW3ke>&TuUa9z}oe-Ob(2(ahQm%rE1NJ7Sg#v6bi; zT(@miUe-(;nJo+QI=zk_g;g$Rf(NDYdbo_=H1`D@H~Sgn#h%W~((1uU=yRf+et zrs%(FUq@Z71eY7~3Rp^bwt1Jd_KsAACfZ_EbRl*Pc{YZ381)H3eJ_9ofwuxmaz@vPwV?{E|W+5CiCeFK-3?f~L=jj6P>?I^f{$KxPgh z)#w`RDU%kLW4KmW)HYCH*EW&Z1xwgX$0YJNERGwSFxTjRA>DT~4wnSY{&^wN-b`D~ z#H{m~IKiWR>MwtgEaA6K^7Cr!cr zq)m!!Y;k;vTKc9a$AYO7H5&*jp0kzZQ$S#2I#|*&SF@)Sas8PS8-G7{5p_k_#>zn#Pshx|SA{5FU~MU{ib8gJzp6$&e&2V|YjU z2N7r)6xtUqAn9oS19DUnKHdyi?R>4if+>IYPf~eu80Pn8I$6YNE77sa8Sk z#qrA4p9Z+yeIZl0B0F%nT_FrUGt_d+;f*=G96udtHXg@~3w1la-voqI&4T4~cU7n+ z8mK33%e!=Hbj;4wSHCm+(dq;fOsb4Gpt{$SVITNS#t?4FML)MGpvrREm>qbP+~gmy z&#~8NGy*uMv#q1L_J9;bD{cy!2!#C1NZ2~Tc0DQdFzZ5Q+63ws;C}R|SNme%Gd-p! z%uBSOm5c@d3G2&2(Q@_r-ElM4l(`@AIXEJzouBlao|4pP=qclYi#?Wyq$y_QeRI?Y*Iu}?pah4^Wbi0Tx-idv_Sr@R9%Gt$x8@R z`f8cG&EMX)cgmZJO?Nay-QQC#N*5qh%LWi^1Y`a`9Ki?6YG-mlNc`H%v_CgNL*-ML}gcQxWFyxw?LqN2ZT;vy8{|yubR>xYi z-&iHzVe=8ssaJ9vO7rP0r*px>mf?^&na& z|FY@JxachE$r`#?W5X{s+y|t z6@E%U_%3hp;{kE_`Sf3~V)aI|6SqaM-Rf-w=<4!$=62oGQ9R{#x#?kt{0O*X#l-sd z6>;j=J!Si$tDxTllLCsfcb)kvF1oYIPg+k}SU`>|>=oAMGL0zU771o9lT>d_--$2} z_i!}$UXQ54Grfw8J77k8X3wu3d`MlQu@_?rlCpFVbY4-9JHRMme9NlZAxaGuTIB$) zS_&S0O?zTd?9Nue7xqS=ef0aJno|w-&WI*`G)Ik}I#6}t>i@1 zeM{6?%S^%rP;iPVJy|G8(&yBQaHkn(W@LHSxYyES-rL_l>A{vkFJQ{7*riMNI%^5C zxJFqQXa%$uR$cV{jE)^HW=Ut>V{*ZDlr3M@98V*k>pj4ZdtF2RBMPlciG$s8)h6_DeTEExpV1L4RuZ5`dc!$x;KMjq5CBm` z;`;Ph6i8s#hM{w`h4kZe5)G`)+n7~a;Vkx54R3f+z1rS$+ZH32%g{UCGAh=@8a;%x zU|7i=r+q znCDRSXH4iaic)d?PXjW5@A=C1<_b!GlNiyYvii z%;s5Lg#?wI(sc$Bsob@4-kiT&J^HA^Ga_*-KMUeJ&3LRb)))p|45FMsr=~5{HXpmq zl8WNESQ$46uO;jk65E`@;P)r0*{2!B>pEhrmO4)C8r9?m?Xy^4=FF@k>EyUGJm~SB z{bZTK1#))dYms}22es$#g1U zD%U#<#^~0!v=`uy2G$O22iqM`>>Gb8W&e}MIbb~X;VcyZ2v>hbRR6xv|JAaptSJ0N zBewy^48*t3=mXsd46S!TzygD}3ao|^$-$Gux#EMF#zRqQJz0wzc`IW})ZD}W;}su0 z*ASxwX;$!=l#-RrcJ%P@KzaMXT!bD{KKaR)=+`s1F3nnv%&+dJx)2mp*lXTnMY}D* zSI(A>natHvuF^@gEUh+<2R=#-a{IFKM^25Ll8c;r2{I+ixKhoKzXI1hQBkBDwxLWmvHMvtm!FqTO@{Iuk6KmWGOA6U zv0yF8xfjK_z`$&imb9x7(j4SGS7Ws`$jTSfzAXYaOJ3lxcwscaPk{9u6U^hg{QlZ; zbzagCOYPdc_K?}MY!RWepd!xXScn!SH@dCnpz0i10U0bz3}MHQ^cF2+q%rDQ#)N_+ zrl=`o5qkF@t&zidmHXUjpW}~`Vx6~|ia+I1HV5ekMb6?99U)@j))><~zF}hahg#3M zxW?b4{;tB%!qJpTpOV5IDkK+{WYbHxmhUOMKBv!HTHU8J3bvW9U>cjT1{NGr z?F{~oYB%Xmq0YZ1&tKY${538gD-Qy#w1Pq)ORXs@UCh#~e>@;|_ZA)>;t7bf>U{nV zeJpBsM9!}cX)W*hFl_!YK#jF2f->X0Ea5;1au4ou7vY9kViVGR6S8O+dp%f(Wnm@| z*#;H$SR7+Q&Oe?!e6rE(NC!AC1aL68-nhBM$OsFfC^w>*69Y1f;+f)dBW2%-#1+w7 zgp%hBuwiV#%&Bi9%C*Q4+-5DCu_R!lLT@D3VgQQx*G4&0CkT1Wb~yEJinU*ynNXcN zAT2Em^ablE&TDfq&^7a~Hk+SH($*Q8PuY%@+n({%VQglb^BjeKm+=z=wkL~bco1YZ zAMLBZ@NAO0Ht<5UrSsj%pZg|i&270faR~AlQP61rse;dg zRM|;Ud??UPfuAD|z(ic+`=z(qEfPr5`&n@v2v;<+b#a=Gan$f}!+gIYq{LwKK_;yr zhR!!eclDa=;+GTirwypCsnhywfyu*9POv*gf;rhS!Ry^_nKprn(Qo{&J)7MLsPyaD zKU(QD?s*2L(r{sKYU7^d$+rc93{wWa_VS^B zCVPjXeitdD!|m0&9zz&q7;VHUQ%Jdm_w%o1IYei&(01N)hmm6OMU?kWnNVy zA2h;+pD<@6>!aWbXU)=mNlcnZA5e{Oo!jQWrZ}%_Z1j7Ux6tfuo~PL!4s2rSt_PWb zT85=iI@_ZNDVrQA$P%+fPB5*FX$QK?+`Iu>J3uOEVg2=&I6x9UIs^$Aj~oAOD8fG( zrTq~H0BHzD#^yHvo3Nv-4TwlV;@Hb$o!VDs5YiQuk*fGTWh^vb-X**evIMuea7yha6vo2 z$?)4sEBu&^r_)9WemplA?A*3PaxVbm#<3(*NZW~>!q~fL?@cb4Mh89UI~#+fhMo02 zKpM(5nFk^J#h1+A91XPbk3H@CCg1fRaj*7b_0=Alo(AB3`_WCX+t+Gb3#!m$ep^)0 zD@`-hg**VJmQi-r_N}%~38ZH}cxCJ^T$dW?V5_P~H4-1{qX_1NHx-M3a~%lTwo1eX=88S=~OZ6HYPYD3X83^@(J$Y27BpK{ldV?S#w%Bw^rJUk}2pwGl@Yy>AAc%^CI=P0d{vOOqZk56L0ekjg z$71p=s5ns0hbhp>V)6zBJiu`sLFD-CR5Q6N72`O)+p}K8vvRaK;mF67001DWt>$V` zSvn@A!X^=f=KEvZuHNLMcW%~WkELS_Txhu#_R;pQRqOc{_XLSSd|f_BRy2t`@Zfa& zE+f@QH;re}A4O>`!nWHgaSWA;zgyrRm)%MO!4h8bW%`NeGKk_TrtUdZqj(oJl5;2H zywl5aMYSEyk0wR1HT;fouPYK~98-k;p?bt&E2MRAexPY3qGgTYEY#3(1vS4-wPcuNHEEScwXBF{ z*evW?i&MkJW;4o!18R6j`|;LDVQ!88cxx>G?OQ|bA2b$!YF*IQ#?jWw+z7Cr_UCtH zM`H&7j|VU=bNrugk9y_*k2Piye5E_^Q#8I9gIPe-m~eC$t=}Sum@&DBbX2{e``O&N ziHlIG=o>g0kkVhupoa@9N(&N!(q&H8`Z|yII3UE~&*S40)ed~G&Wtr?mN`b&33`XS z6&A%F`sz>rZ%Cc4fmM;E<|-dCnkNqco`P1`=A)|aAk0ic&pj?gJ*r7j7n%+ijz-h5 zNBSyiXDqI96^!gD#RWG3ayAvd6m3;9dZq7=KqLfc$#=_`0>ZaQ#(b?zc}Fyd80Ws~ z<{1VHKx$D0aDwL@iA;ihmpAdQ_zFw3+x4O=cEF!lq`|dOxODJj69 ze?DgF4^nmX7eLc&GY|s`-zR`W92v0&;4w;MS+TG3a&bB1Q+B^Q#3)ZQW@urCSdI)a^kj*20T9SDY;3Q zJfWDlL+;5rQF5K+O^YZ0H`xeFmR*&WSw4N7FyxVaU-fA0>(}n;WjHjfY&e3%SHdYJ zWA1fIwK2JVPNsVup^j-yi?h6fAE9qZQg`AxsU&fU?>4`se7>rf(T$!tV;R>A_g+o3d}47q!zGA)!~PQ-_pA6TQ1#0C#Sx+BK-+ zX-A4puf3QuE8Y_;I&#*M<7hN=abZuPy=G35@=biIIJsfsKVfr9ADV;pE*s>@Q3b7t zoUhsDlBTFwOPYsyA`TD>wt_t%xEKS+niy+44FGf)Ge)K%d=oLj<8hh2 zK|Vv5_f6AqI0;^1r!QaEgQnV`jH9FHGQd#Q8l^_w*u2wR^+w)wu2{OzR+99*mn*bbDdOUA$Zm_;M037FknVNp zyJc)w?~R#KSs?$x7~kK|YuCz&f-iZMK#UHf-ndVZ*@b=8Q)4OgFs94uG zOgyS9gGh2lkm2!$lRCi*-J^i1hmSEix~;1mc=>~#SIYW|qo=H_Ea!%=*DL5I1Y7UP zAd@>~wEIY1QxvAxMl%X3^&F_eBhB~u%P6*W1$n_155kpEgk~hl#?%FpEX)}>58E*| z^d4sK(F4~B zD_Z=bljDq2cO_>Yr5~M>k&G3M{tYP!EIJm58(OR%wJ%_~6R4O_IqgNrOr6?tKda4! zBu+vuflWJ!LL6=jLhR>E;EZ!@Zfae9qh!9fkKR(IxPo7)mlFw8$$+%lQ44Kr@qYP3 z%z84YtyCw$b1DeFN~?v~xALnuyBp&{@qsCn{LmI>-F#|BfPOW{+|Xgz zPt)srfoKyMVrxxZd4x@zUgKm)Ygh4>OSax!^ODCe=_l2qq0cE)hCpy=A}ow&hr27o zrI|uBFCF}~&DCZGN7(^kLbcQi#Af|TxM&p21$!FvtGR2A`C6>%7(>Q;q+8(t+`m*{ z{j@>GxK2)Xc{;%oXfS!2_K(BP$)5C?g%Z0|$V8bSA0+bJWd0qdL^ffO8n##T09^8; z9_T22SOf50B;0A$D{xP#9cC?Fo2;Ta?G6_1YluA3wO)3Q)w7>k?FZz~7@8t+?RdKY zcCRL?{cYx!261I_;OhA(vkScH9`pi+eFY*zbn5~1lmBr@Cx%kdQ{G)Efyqi;lgAVIQ~IjM!IhM9vO<8`!`T8*tT?&k>q< zn_uz9Yl(mj?BwM81uYC@v50H)#RwtaAjuXB?(})}c*B=*#EBMBQVf2=oul90uzMF4 znZ8UMbiRSw!Nj1Mq`QbZYEX~WV2@c^Tbw9xV7NwhZG}_ox+#cSRwT`59l&3;d6=z{XcY1o3wfSnT z)ldQd49L@;RIifB-m0b}sNgBSyYRe4RiddXtDs@UnPB5V^kAWy{DT@?FbA{&{$Rj2 zh%2~RdlCI;us&!u=p;@kSg?Qk2M6!iu8O9mSWg|fiCAZRH+(QR66Y^sU7wxUt6c%Z zBXQ7Qg1&3J4r4By&>^j2`_$yiJ;X@?-s4O@#$sSWY8rV8NCyDALPn1ptRb6pcLMpS zPlk&QgoP^LN4~xcxPD|4t5+vnDf3xv(7CnWE?B7_#fmhPDH;Y`JWmL-ik3MEeE{rg zkKQjrJ;6R~>(kMr!+{0B83ruc0*TBf-m_}6ddyTQ2f>A(?b%b|nCwcXn~PR>U7&9f z)2v8+gnl|g7{aX%y#*@xW(nLIrNigz=(VS=vG!G3U3rWnNR!>5Ol^{&_T9`a*`=eF?^YarwZLbBaSpqWk$|p@XyVJP|r?BxJmLQg!S) zcNL8$26nl5*?zOvqRK_)B!Z`T#YoVyEQL^ipR-H-(K4fhouSfe%Rl<%M|Gz<2Bg?c3KHnGu{&i^MFyp34X$yJ}|>Z*AJoumb)B!xvS_Bc6*pJqO}k+dEUnxYyw0UEsoC)&|B7j*9L!hW{a<*Q@;3yS4=%2;5Ep?=u*9 zJalWU-Y>iz;Pg)}Rzy^ya1Tm z1o1loZ|)e zJG~NZ;O4c6{MEIC(CK@50!nX*g8N)X^qE7IA#0se8|)*|2adsrO`zkxX&=+`vvInH z`Rs=otad@Wve9eFm~9Q!XldpLA(1dUz0v3$K1E9ULi*6uFbeV$as_4;*JXN+U@gvBY=R+MGK_U`cm$|y<(3Oh336s1O_$OLd zG;yes@UF6)mF)uo7R{;uWekHB+>!?FJq3^%?AEJiSzLuARmYTk1Dd&n+k|&;`gR## zbNAm_m8|G#XKMgv@U%p8ORuf$B%Z}6T2}P&@_Vi`C*c|S@j}Y;b6wj~vijXdbFqjr zpNLjz8f+OHOp%mwY+0`3)WsU&1v?I$1#a=Dy9*?*VlbatUd|R3dmhJvdycO&30}Rw zhmx9pr?3SX1FT`?{A5y7C9;#UB<-XoDkm@9u_{EIe>GBUwwz4l>H?*5ziIzVGMuoK@Hg4 zN}!ExWAneia$6rE>g-EIv*@3kwQXYgaE4P7Q4cfI^LZL_RYZB_PTV8iQ9k`9g`CRQ z?#ZE;=}%8gPI>*(s2ljuU){RZ$d)u!+9Wu2{`(qjgv&hmUvZyd%{Y_EAYPcsEqo|D zag|c<(Mtg}p=#65R7Y-uum=?t~39dXt@45A)1uj;^4Ir}-`d4wqw>-@k&4;IJU+7X|3++P6W+HeT2fBLr<9E0u5|;Yi>Syftv;A3bW2 zgV}mC8nUBK{#{hjd)A<=ng!TPK{Q{L-u9N@UE}GVRXDVL$36Q&Xqzn;jBLHI$gq-$4k2-}mMRwY(;HXy zU6b^Flj;c~2WUp%=^`u9V!@(*y9gkx^nnEtr1LQd5(qC5_G0A|Pv{85S7W)r#2!eV zBAWs?oi#X3>~lr!gJ1^~GV;J<5M2?7)jX>Qf!9r_ssZkG;$thD&HPil#spg;`tRM) z>*DzSV9=@jz`d_@dUeL2OmiPCG4a|Mae2|u&cf_|CB81UOZ}UOsz{#fiWM2~v7s*M z+$xx3^F>gsEnWU`t+nIab+NY%*Y70>7h%CChfYG42^kU)2-5ES%=!i znE;ZchQ%}I`yf*$u)KoS4BxoNEw@9Y6!3Wm+eG0^1lEk=k#-Vh@VdTU5c1=@&WWKYHm$H!$*yo8<5 zei>E7VDu*5zoZ#5z3KZBHQyP63EE}=P|WiF?QUXVp_#Fo-yK7JSLf>kz%WDn3B390{_=HQ1Gw*B15^C(eht} z)R{5hzDjQ+O9ny4san=b4U&wUw{W_>P}a8%|H<^MHFcHVm7}`#%PK7De0xfJeLA~F z{dC>*OK$osX`cxr&5$!~VR4?Nz=`P`t)m-xV!7wLM*UQA!wqScU2<~)lp}LBX%|`p z?j4MLeJ1gF*mHi!dcj+CtJX*Ja43kPg)|}@yu?c+i8o-ki|UTr@ZdNeTdk|sqis%S zghLTw;!svHmv5;i{e!|~mr_T2G=xyA+ON zRP80bl+nr?!9shaUkYsgJG)YV08X?yEjta5Txnrsr_NF$8HQ7QROVSx0h{I7Zghzv z+ZdNjvgVyHS_o`{$f}g}%)v)~m(zm;tdZ)w=y&owyz}-;yErh`<#~b~aSCMbE2X4z zIokkfPdTx*O;{?`if=Y4xP*IKhF(?HfG7$$zBg1a3;&hTUq2UfvK5Y3o#I4OAX&IR zHMu7CN2scqac1m`gK6=!tzZz!t&V7`LJn~O5hX9qx=;gZQW>LEMFX{YozU7vq_ZN` zITxb@af20WpvTXK@v)B{0mo8;jH4GJW~IV;D>!K@ZK|%xsx_bYD09yDkxbg9P=FIV zUU%$Gc|{3Kfw}eUc)L;`Qfh`S_%K4cN>w_2oZ%HS*AcBWH=iPihm6Q}I#Gl)&ynmM zKF?MxY!hY3Nw1IRw8$~e$9^N8AhlZ!oCnoEFEwmId(sTfDPz|N_prNrl006KZ8p>4 z22sW-z*CV&#GwW5_o&`FdVG-`M<9xT*(vpYOHB=qRno5dj|itJivaTp{h@pH!s-Ki zd}#S1U-+Qm31gc5jjd@gE$^Kj!O! zq6t1pgCycA^x$B9XZl^*hFa~5DxW27e z{HIa=cMwCgMfhj`m7cY2+7r%N{n|q#H0ivIs3ZorvsopG`pb-dzVJLblr?DC@iuc5 zZs?eaI>vw%nX0OOeeETe$Pv7n<&ld+s#Iviq9S@|=4q{S<%vg$1N8m(B}E*x4sxbc zb~~#MLX6gB$7Vb23Gh6#CaLShu4`jGSn^g&-NjrZG7=va;2PTp_}5@$O$@JO2O%F# z?*<)62yB~UvA&@k@~Y<&heUO~Ln_%h$fm#%cO$ytSo#$S#y0CRg=yv4>3o$o@@!9f zA=1ehKP(Qr0R6y(g1JVUs_KN52qzdrqG{)d++S{%!9O&eO7=>QFHHe^H&T+Mw^OUR z%P>*3J3v0d0aWL7H>rG09*UqRI)RK*NoAy+z1QTPNOVC*T*E23vNslo7<+?h)1@{e z{dulI!=#FrR34n5Wjcb3%qOCk1Z=+yNMZNI8raFi7Mv!a>q!R6%UFkx!LJztNsC6df#} zAVMjdBwoEeS`3Ynmo1ytrF23;P>6Q4#A>v7->;;AMHD+ey#i0wWCxqRMV~ zEBhAc7eu$8ga)mp8d9G8T6JZZZ&SD7ww1Nr#9q-j;)J6Q9TUFyf(X?o3F12V{;7;3 ztpmbvfKUeVx0UfvG~qvclOMBQ2kSq(5z2NS!=V4F5=Ber56{_0@T;r~pnEpf2Ym9E z7o}ctMFtQ7%iVrjU0punjr^Nz(;*JO8w?RT4BukDTtIEJA8lszMxa+}VsTCIqUxsG z><@U`a16Q!64PrcX+}+*X-QC^Y-8HxdcL?t8?(XhRaEFB^z^r7SbH96L=I*LJ z_5Gm=7C*atz1@!uwPAI=6GnK?%U_6xZj6cB4D&V{GV#$ba!RMqt%RWLzQoOl+6zkR z!w5nA3IoQld0oC-23%W1@xaUjwY1Xx=-ICcx01&u=vSIV{rcoB5)F{Sbyjh7=%VRn zEX@_kmUh7gg{vA7>`k^nY!u*t-U6|~#T@6@su(vp*G^~Aotv+2{xcviiwKvPm}epG zJS)YdJYC(rj;51(h902doB0frkCVilh~g!fpnio^TA*WcTsnQJOdl1;7=dm=zUCtV zVwdsmP?G330QvLOdw%E)tvy+F`I{pjbgDjjQOy#bTV+mqJsSpi*d}MEd*#-_Vd(~b z$ee$>MMfSsY`?ls)A~r!RCB-s!6a!d;|O?zj4YHAGiZ4$qfKse9|K7}AqVkry|w5k<3Jda?G8bth^JErP<0SPCRx)7|3GgM{FC z2sMww9f1L{QyXYeK7_^opERjB!WuEIR^- zIqz>zm9iYiIPUB-KMC48FSog*sorNMOKD04Z471EY9^#u9Pn_?Ym!!q1#R@deujOC zSpDW_Gh?)eR<8sXOi0z}kN7h4{`vRa$SfFUzz5h1;eUHH4*Cb*6911h>OX{uKk(`A zJ`#4ebNbyciY7)DK%WKMe>n?Gs%**vArxL6R}EL4k8U3a{eTdP$uHoME{LC)ybm0{ zx}ED2G}Fb3E4*zK+t5Jq?B{%jS%_<>->D{@*CbKJOy%YDy#uj5gAK*o9Iu{-TxOhC zz8$`wKcwtp286Pla0Q%k2EbrnRB?_Efx*GLgOR)P8LzRUEO&~rm2KRSrlv*rZb7Ro zRQDTY!)!+E^+kaPG&4-%F61AgxU5DwrlliCI&O&bSfuieTXOG6r&7a%Tu?bjbK;^% zO-Z{1FT&dp&SW_s$HJ0aySvrny66lxObIdtoV{mBqH02JZ1s9WMqPnn1yH|=JOQJV z$$6yppQ@!-+8j_zS*0s~X4eZ^m1{zWLKDEUU{7kbRFPxQo3PrunMQjO5Y3!RNkc^M zDd(RY!jLuvDOd>j08GA`P*`8X(zaj_%qU;#k@G`19}>XopqnLgMBJID4E9FdrL&a1 zH*|=VnJiNFykQsYkOyENx);-WnR%37vbN#CtsEz;c%kz|n~?J}49Oyy3se|dDf%nI zJP?>0OY`UCZ+ust+M2Z7SsUJhgni5dZ;cd11&3_F6baTfw$#t>{S8X(m-5Tokk&cR2Fc(Vmpu3|zOb_sG0p2QelX*myHIugdsq;6GqvLU+Y|?jS{rE9~^I zKVe&)Uq;Nn*jf!%n|RzViERmmc=P{Y&lKM~U5%kq&Fj5KXyqkvq)aP!m(0TBu^eQF`-ykYvVb`)z^15$P6$sBaTK4D0hj?VJ{vtNt zZll|%fuCoE-8?k;3LUuhrW^jiXFLO`BC*gafx{DNohH$c!~r)>O`KLw53Lp66x|jf zyrs|>L?y5>%Wt|4y|9>Ugs@#Vg6X6BgNt*F&xKRYMwrmCh$O&Tx$BuBWh2FDN%DOfE_ zQYLB~kQhtGayWsZDw~HRf*+h53v*UuHJ7CK;oS6BrtK_xocQnc6Kk zNJj`F#9Nho6}{nQ^%Qp|K9=|7V-+VgMe`Usaj`pRmk|y~O$1tJa;}~B6&qVBn`5!G zz<>-RM?f9207vnfESL6SrZg9dC91S$kq&etq^WArCUhfo$T%QX&29>pNUF~mjl2ELyfX+J)&OgK`VFI-9p|g`5ai@Q5+c{h zCVC^C^&vtnzY^v_A>A-5oPhgSHnHXaP6cjBw*e_BhphC#qO-et-1G#IggF^AMt1BZ zmR$El+6+qR9?cr1GpA{lDdZuYXseOTj!*r`5&(h88;eC%GZx;Ox05~w6pb`jw0`M>`|13t_-S4)DyhGvOnVDr~2pNLURu(iVz{!(u=@A zbI&P?AR$j0L}bY~1W~vO%wiU;zz$~D?0gfLMJ-zSEaIge@H6KaGIBPYlK3${;+|C* z>KyTbX0u!AR{$`ePuGfvz(s-W;qj*YftYsgqvxC(?=hDe>%+#E7S-gIDSers7TmRs zd+ep+n@7%A#{)co_Dn0YNyzQ9Ea8~~d$o%tR*rXd)k{>a2X5-9ts4OR-p2r&m=05u2l+#|I?lP5uZfVQj1dY~}0c@Lr!4mw72 z4Y@@mpeHqc-4Qh2{xx5tFyA>XWrx2!7gi|N*kaM#D%U6gOY>cr(SSWsF zb7gT8!nd$iUv%*dL&ZzT&`7kZU}&2BRAYN!u=POf88RJ37`1q-n_*0OH#kugA)(0M z11r@Hzcs2&u*P)EAbeN3r|mO!^9$9ky4kqFAc*>-|2-73+U!1j#oa;803@}(4|K&e zek*E>OD?vm(}y!BeV>n`_x2Ui92LnQmQs3NpyRQ2)twG%G(pw%K+mwmx8SZiHQ}t} zavrxq&bY+4poZth3>rVxbU`eAiQRzdE*Isfc<9l2MNsDxaHQ(cQ{||L;qSf#J?niD zYmMi9csP9r3S}W6uY2oC>4468BnW@^HT91`MQ3MupoN6Ffs=`n3s6UAVd4nX<~SOd znf%Af^snVe#RkZgh4-CurCxV{Mvn(ZI0ZDU$i_+bOO?zwz)L!a*9i1xO##LSdDkV4 zCB(@>yie>Xv$|yX01yB%m$vvAux@EsX-3@5D%GFo^BCu3eNb^8Q9JFT+#y5IP2Dk~S!X}d|gLty%`l#8!!%`$gS5bW0S z;)@Od)&`fsV;18V>YJ}^^DZprFla?>4Bmdyr55D$=BL5T?}ZQj4X9l-M2)qq$XeVf zqA3uHPty=hwd3nv0cYqN4%(xIBB$V;Y(C3KT^nS82`1anuLSLu9Ld^7;we;>gtEEH zJutFN#>U&w=(sp8p9XY}p;i%n`7IbSDb!f=dl{@R0WeB03w*Z{ja7&C$p*>ZSB|62 zk33_n^#-iCht~pzc5B+MI(|L$e8>ft;?=C8Owfz995dTMt-5i+q>vAXdwCoSV|@R< zmuC>(l)FmbZ1JObh-wcSz|9-jYaf5>;qj$nojd0+8+WZ~MVx}0^VUkNpYcKr|3?D< zlg#Da$GDU+C^vGN^_4x{N?;jRg>iHwh(S}q45}f(u!(-$ce;xxtgWY7t3!poPbonm z-=maiFCMA>5~}&SEkB01nMEe5m}3B!XQOiTI(%D;^CTI$d%iytx5VF2(X&=Nco8@+ zgJQC@2{&nOF>mA4KIjvfFznhOtf3X-jt=JoFkk4z_lDi zdrkm$CEo5Y^RW}Yo6+AgT*!wLu&rC?EfGzs63UXQoHV`bXL44ikjfcP6usDG`isVs z2F|WXpG&2cvzA=JhGQC(+%l=cj72?%GdJ&h!XdF*)Ob5e)q=`htO!-Uop5Ts1k@X3 z!z&ZZBbLEN0X^IO7)oG&)N`N6foo(p$rM8S!^Msh%YV9y>h=iHQ2_EW-PIoh4Iwm2U27=|K;`L zt3uYL#8{+Wku29i;Df3ca9p%Elf6DKU-^Ad9})`5YT9lD9j*oCt4X?>;GN;D@xUh% zBKJLqD!gdh=LYzQ+5E&QZLls6fy~ImYSE6A*@dRb9?IsR4^dku3S4^K;Z@s1I0=6| zH6KQDMS03bG|T&@V`aq>GRQP{6l+j3rJdn20u=Rqm1S+l4w-9WSfhR9bQKDnJA?PD ztfsyZT>q(UfzWl__CR3Ar_^QUG=0ai9KSFO(EaktAM`?!OP1}_Oom<*8xfV_~+(#>(dC{_Bcv@y<`*6_eDH&vgeDvj_wtt?b4VyFww_3*nnSA*;7b?nOlBOi>*;&#Xj zs*Z6O-DNrz^l6?oPQ}Bj4r8QDP!~?x1vzkHp1`72b8bj^X+y=J2!46@adE6E!I3<^ zDphmAy`^wb(q%At)b&GCxG zivjkf*gN>gFUYOnn~u-K)w`Y`jfm!lG|Aw#X$013KaPY`FmoD*=eK%ZN6Z5Id;>Bh z!caR4VanQ++f-hmn*Dk^*?tGTL_fx>i~dApiD>eeFrwCrYr@3=rrCmv64~eSUV!a#5IYj2*a9GrN*Ul z=>ifVp$BXpNH-Of4!q4;mJ8NmPvpqe_Y;W7u4CpiZhB%OF<Dj%j1oNT=gEGt+vA+=Z)>W&B*`y4&DB;cQ2K%>Q?mwlkk#m z2=Ba&)y%265SCGV2AwE7gAIG#wswY2nt4pOf0w+mN)9t~QqrK?L$PuH2zDKt*P#f-WN;ND6iYhD zu))aKU!58OuH*&RXXwsp*3v?s9}!xn8)aB?Tjy9OMC)fQNC`jXdY^%Pesr|H7_Nd( zQw^YH%pQ8(S#yiZ7iz|0Z9c6qe_qmzp1hp$Tme7CP6+=Js>Et3(q9kbUJ)UJJXI$o znQL02uVUlx8H?xI^j!X`ZMw!`AQ(hVYx1r}7A9B>E!$63U#=QG3k6ulf71!$?H3^k z=01Pe;Rw*lIr#Ie%fzW41H)99u-)+Gb(`Uy- zbAZW2zUk~e?Jw9b-Qi$==E`#anEQ=gRfh5emNVQ8v|Bhw!oVj%Hn`WUf9DNw@|`gE z6({#jy`CXAp;HL0COfw|Kk?^#j$3|jR$@wR_P0^5T(>QdrAUA;dirM}2;ZV_d9|Q8 zwQjXjGsD-Ga$M_N7ocm<-ngI-jFZ9e@A}K3#T*`_JbcfebzY-w`8%K-BqGM)fkCyO zYVikE!bB*1p>ML0`2yYbBEH}!7d(9$UZidL$*4`;JP-rYYYzZp9=H zlFow2T*9FK<`BnxDUJZ#suU}^V_Am!i#jhe){XkJtvV4x1&uyWh-reQgL<&7x}zs^ zZ8pdm2J^kU?x3x@5rVEB$QhOSxqF4zW(^}kMRmYEHYOSFnJ-&KAVP(m|2++}t#_y7 zW(}O!={-(OSLmSvcXgw!x)@Q1?}w#tvBt{}`#ND}dwjnqd1X+jhyoA;NP_#jRZr|6 zO!B|{(e0g7Y%QGsFORiK<#k0Q0r(3EK}5k0c=$mqLP}uZY}g)2n4x@-pajN9Al*_d zPG6s?+h&&fi<+ee72dB8d}Fs0m(V}*YN_$&=1+iOU3T@q)exe>Obr9(xu$H)V#_SU zuFP`Vi%tLLe9&b8IUgF!Db`w#k}=H&7>)|5f)QrDCSTEs%o?pS>n^x=vfW{L0NH1k zEpo>kO$XuI4B*X!&xHA--NwJQ*H7Om$|_^FF|{NSrdE|@Rhx3SCPS&M zy~c&67P8=L>XFb+@mBrF&DiU@nsi-E1;K!WTQgrTS0?W3ap+AMat$SFin|1 zY>Uu7zhFU>4yjUF$t5^**QChMHd{CM9;-{mnn*>o*&~?L^rz-1nV0E3uc7A0ojbA_ zr%%nSB4-sbuzVx{eNaHwz0Oc6;n2+upM!4G(~6&B;sg_8*&`FQT{k}ji$7hf@*yi= zU+O0jNRfB*sH}?#KEa@q(HOg*CqAg9A30ifOqRYh@D-x*xs4Xj1>iOD34C(yL2~Rz zvQ2C6_}C`Rs&6IPzmRQToLWw5fiD9k`JfbJieC7I5Ph-QDA(tffuK-7=S9OD7ljf`oo0FQCPeFwLHNI0cXF5JNa_4uNODH~Ex_nsEh z5r~-kGxnrMT+9Og2;?{aK`UEB5UT2TMcT*0ar?bE9J~MAtify z!nwCfX;#l)oL`YPJ&%C=kGMblk9B3?hCv=&lU7ihUcCI&U+!E&#-LbH;Wq|r>rR(y(-*& zw!wbBRW;U58>M{=cTa&fdTqpaFLlw+hL|%Il@W_;IOE_+5wHr65iu;JccIE7-G&y? zu{oPCzoAEgwW!D+(}yAQ`sM$VK#l7yqmpN~$pjhQw3@cz{42WUd(IJ~Cr0vnl|zW6 zR;Wcmx>&6~x>e?OZdJt!!YFjVWPUxDgZZnCZG|{o{>=9Ng-?Fcbkbb1mc$_y=XVx+ z;n_k^wO9juI>3@?QbcKdvOz=sPKZpwT5i}@ar}r%h@eaEfdSYuCAneZ*Yhf7n5LU| zGHDxFOam(%LmAcfk^{_3u|hnamR|Xy*va!eq{VSImo6c6*RE!amk~Cqliu-O3y{jG zER3P@&zl43?IoYGh|&cuO;V!`6QUSRF+!~Sl2%bAl(;ety6TI6jaE6A?(Tj(q)P1< z3Msu;*1!l)W{xNJeDFGDPBxT*=!;fv_E^~qcP2EIWQ1WWK&+lOk1RV9HxVk9(CUc2 z+*wRQl%V-B1R03Y<`wsL2y#(Cf{uF3%-{Z#J5Yd7yk&d<9zmC_PbeJ5Q=)+u@c`(^ zOGo27xWa(Jqn@`oE)Zq(^+619&slJty(FQ{_gRHcS7M+mlgjIxj29?dnz; zTkXkTahHgI&7oYYic9TajLtjzEY;D6^oQ-E_G8u9fzF7FU~3mVW8lveu$Pe2Vm@eR z$zS^uQL`XT2j3ddv7*z+3Ad^u@m;cI;e?%uO7Bqt{9%w#NS^ zfBfsy|1AARMJYQZ2Kcwk!`UDbnnIdHHIJb90z|JJbY&=X|;h&%V5|@pnm*3*3Ii);ZUj z2&zv7wL`H@J{IU(%x~i{C33@%>)En~`QE3(3VLYO+{g?Q6fsk9u{OvpApNhjeu;$rOmQ`UN;YGpJfyF0j-X!dAd(3{|d zOb+B53gd9}xPNw1rki={c@eI)UpjVAf{s$`ks|_BFcrg1+0W(g!6+J>(VYiBV_?YY zP#~QD+(0)d(T+g<6klpCnlml4L^3z)07ILQ-!f7w=s~^4Jc{GkT7YpPegC=2H-Z8$ z&KVK@Yz1GZC?Ps-nV8MNCcXoWjlb*k(#%?>o(;)49%nP2lqg&9+)HdDGZrhd)%G>I zoPGEJAqD>j>t&|bf?6W4?i0DhnR5hCmGRD~jO8hS<2uLW%x$GPW+MO^&A8>hgOwe=tOG{D40{ z2H^2Yd9OjA6vB>PilQB;iFkWLSC*$erkuW?ImO%!fA4;k6&?q`<=ZY_oMl^_W}lq| zcqnb7_07XhM|}9+jdja^yk695+n&3+w>i^1FgrxxCcMtp#zs@zY#Mg?mTc$fCpLSO z9~y?l40d%C#z2XS9vWhcB`deR#RGrW%_{PoZZ@zO2eQW_b7p6*a;65 zc~MYymKK$xZOmNrDFkU_$9Fx6J^%B~>mo#Hc3r5bOq*)X@-e6EcAaMofgoPJ`X&?( z2PF)K;u{Yge- zgtY3*JhwWd2i7A4hE^Nkvrg>lzJjYrZlHB*{GvgFR~|LOi6kW&;e*%8#cQtvXP9=u zTF;)PcS>RI@T`tWDUH5OGo^`oXfd}?9n+zSnh=v5KTQ057y1)I}OdGpz7+JdzM(w zwx!P+n)OhXb~*Pnv5U@?DRm8ph??61XI}VfbL}QPnfG;>;!R{W-m+t=&rf&KNH-|o~0H))%V1R2=*w+2@mJ`cQ)t!{@?Z#PGF-JmNy zpaJVRZu%aZRR^uvD9+zChc&&D0q5}7i_JnP=H;swtPok%pa*jNq&4 zaq^TG`mCQQ6!WTHEM(5d}cAQ(Q@5E8xb&fv(@fJ9p=K7AUH$b+$lWW|ee z4{B&?`iJa=+nwNHM5ZrV(PSPS7`u~Q3u0A#@amXSbw}olO1$-%-#<9HhpuC|Zm=V& z(_YCKq2A!qqF&R|GNekzy>PH<-+^bX#o{bN9^C}=U~nE%<5BsXJ6}P*b3aQcItxM)tAoOa zBS*RvyA-Bzvl&;aTG!&JR$dtH*`uI_K;AovpeBu2TDFf$eE(Y5#d#Cv2dp(}>J2H` zV&tG*RPox&urh<;eJ6Inj|udBv!k#x0%@o{>F5&A@4v}9;`2vI@Sng(T?_JA~2h*-B|y-L-BHFVB+QQU%AY<@>$qP}=P z*LeD^<&DX<6Xux|NF1e^GU-?^VOsB0!U^;iwIkyeMe>QBuR*Z#8Ku*D;U;p>c~fr};c-!7K=|DbV&jjiMi zfPqqq_P+&&Dvm%4URx8#|3;t|wg6JujOBsP6cgt^p1l8liTrg!`Y0$JMUG!`Q&sYj z?(7v+xRpGQLgLep-a1N_(U{Smt&OY_WsL*6lfc4*K)f9>jqKG=b;e4^fiE>o^_#_V z-%qkvUvKW#-3Z%6@1k@Ubk?t>=dZP=AtzY!OB2oP)G2cb!Nm5lpRRtJH!t4)0lV$2N{!)6w&N%74MKQC~7g4X%}ylr!HmQvUk5 zOM)|6@_YrRnj=X~ZUEsauEdu=>_?@Q?#jUVmXR0*js&^Va?ynSX$!MjLaNLqu@-r$ zwy?k?(Ksg}O4cQnRO&)8MY~ub6Qo2v!cM$HX^0A!e7C!v#t20MbeW-Lza@ey`~azg zsG7{XG3Iyy%eE0LKUZ8~F;Yr0gHauvD1TS|5M#L!%niQd^IIA8$3XF#1?TN4e4~Dd zq;UL|vX4=VniJ`cJdOIc#oG3X=8$-auh*(18ybG)F;QD&&^O&N(&~GgxyfZw0{}Tm zu`&wL&fuFQV5+N;#%cb3)QhrG-}^0IL}2P`fc*UEK9lw_H=m|<%!6@B=u}QNWX8Jn zk$J8ZAB%5T2#YVbVf-#a#Qq)|9u(rW=mj1GrxWU=1+Cs+xKkljD z&`gYTQ(>~4LtGbS8wzy5ongxIIddExRzvp@-+SA~nSrj8vK_CE6jL0ZqG8`jZFGkZ z^Owy_@_E`Wpx+-c=m>4b#mu3YXoo`St*6ToKzA6rp4(mdGAzzEOpeViDltsJep{;@ z%JoqUvYX6@hhZypyl0|eB%IE9PYM0*gApyG;g@21x&4!6)Z}6J^dbMbUXux)H8zJg zrmV%;P6L3s@n+Z(Ri~dQlh(u|nig0}E-ru!yzO z7Q_*#`jp#ITMN>%IK(n_%b|WNax!(ViwRj(iHc2?hdocof#sv5?sjSXvoOisv18^d z#flVG(n5sY%%pIA_uP-+ZC0&FPxL%R0OTFKs>K+7^qZuKeFbCpA9fJzQA4a3a1bc{ zt-jd&9}I&35$yjDfiW?V1>kC7WFi1m9sh4@wbE~y5%L?jXRZmw0bzt2a;<+IJs->Dbz6K*{Q%{?R^bw&`%aVV%!(&#i2#p@sp@Gj@2 zL2@?Nk9ZKi%%Na`aU!qH5t0WoEPQeQzRvrl{UKv2z}^L;ABM`0ro(WH$@*>Gah#k% z`e0!~-m#F^)!82U8+t2HyGiU;YoX^K)`3x5-hAxQq+V zeL{_5(PH3c>McM+=*g;sA2l^$g_M};rm35k!J6QCG)d=AhWpm<4H1G&x90l^vOj?P zIMOJE;W9SNehkc@Dc!OB15D|qaOVIDU7Rd#{d|DDy~7UFu0GZa}~VF{Nyn$tH)9wCFlZ@(i5<#KxnniS zI6P9C)oJk9-998N(B0F{PDIGz=zThP}fEzbHMh75?rwkGa3%3 zXFv-K{zw6tsHIXOfT@3D=~mB`XYHqwIaYZa``d=Y(bSE)APKrq`-cDz56|Wi005Xc zz4Cke6&ZFp_ZWq{oEfsabQW^f5~Am4iY;}5xxoS&Nakw|t%rHw*?G!rHQYBZG|THu z*;jQH1P5gp^}|%IqHdqoNsl|AsuRtVD?9GxkJ^4|Ccj2qpZOI}1BrR$ShYKABI{ad z%KS=j%uy+WO-2v3(43gOmmGhE`|KWQ_b-`jjGO8X*mT6H#fOFSnCp$k#qi%XFB;Sv;fA*`Cm{E~m{ku1oskjY7QWd?M7YT0C=h(RiXt z0t<6n`Fz{5M4dftcvDGaLO5|~jOa_@vfPAl6_<5UM6!x(rJDg*z2#3U`s7Gn2+HFz z+4*EsA!V6u?wSF`GZewMew4eB!@85wjM}}0V9%{gOkjd66Gw+zlKgXe(~2!CTu?C$ zpYvnSpf4jS*Im#3?8FyGJ7s4TXe!N|_bUfw=hBFIfTiK2vPE%Z6HP~sd|xpI^BjEF z6+_gqfuZt{bhL%yrW}#_2tX5k5QG!qmWmo?Mt#A6J9XzKc%wHyAkF}L>|OS%1KN-> z_GCs}?N}$O{b>+1vaVa~>THLLlRf!$r&!#)f(pR-qY*b(=~bwhpn5*qe5{twoD_2- z>(*w(`^(n)tH%++)l4Q_)_iUt-+b}xN^jN5&)7$N2*QRhFY~B?-HVS8PA`H&;uGM? zICu4{f^TS^PgpbpIw5VCW#4kEgnUqPC__f+1)0b%pltl}*9_H?37H48KY`8?IgcO` zrp$&=aVAvn-XyZR5TF_;wA}nUuLfLKSO_+`N77Vfs2LQ0ZDh%u=A_o@tW}-v9}})& z^}k0>wxK+MPFk;B%2zQTR#YqKgdSsD3h06b#BaT_^*}YE`(Q;mywF|`@G(q;SUmlC z%||_3YR~}J@VNiq*6{yB6a4SVWTmtYG`{^j)Hg)&5pj*!2FinZh`Gc9KRA63vDgCN zUq?FgMB0oovJ)LaL$T0>^jCS&{4zkukKa$3Oso#%#^^L8_Qw3`^pfW>bF;Jkmhb%y zcwAg}r>;?U!75TKPs=__6SydCt!^}voQ}ZmdMPahu}QXU{CdG^MY8P(a2>bchdj3f z45VmZRlzKPKI|VKYy}Jp2OMz*oElqt+);T1V7(`d@(b<=(hWL6+@>Kv?G7k)Eggiv zjL}h5(iGeFz^9%f5$|L+`Fkmj!&1#yX|mvs_v?%|8BN&_@N4S75sQC()RClN2EAZa z^&$Bd0+WfL&W@nGGwepO)T0qV^|}v+o1F&(iUeY$WBXFJ*){2Fb}p0Zv3G0pyx?SW zIqF|{(_xSSQTM`ZkE6sHQ(oA#qI2Xm>c(?$CX^SNEzw>IMoL&H*Fpb?^q#czqwYZ6 zQ$(MhOKEfmkyqLX5)XV5 z)!#x%-?w59>ITPCCR33Tsn!2fa6q@Jc-6|wcJHkf&ypS6cAI8WF>ZlRrZ1d8cL^nJ zy6j27^n}bdpE`&gIJ#hncMx=xcb^`)WQE=gHf7J=vCW#aSYF9AYDyr9}YECW?{A(n^SM{M>nfH8y7+|bv`?X1FWYArZ0)U$mHF` zKCAeX?oESp3&}RNl5~7Z7(;_Fq&L3MpeBBT;4dtf`cJ=yn%#wbOh<8*ntFmJE}Kuf7$oaAI?>PY*qK_W9KZM zXSfY2Q&v30d(bM>WwLkLg&B`K-_^8N)`iW)@JuUu`qL*pS3@M773_8HWQ;}G_POs% z1CI(5tnR$g9MQp;C-N z23>_uSh!oWV&eGQ&;Q@R z#Q*U3e@z<2b=!GIxfWYZLApe(*5BZo?@n|MVOUTiWgOoJ2@E!nKu@arxxZ!&SO)*$c zO+64J(sw)!7dehF0_7YSx4Iy#)**&YbNgMSzebY7ws(h%GPd-bEnu_eolqJrptnz<~Kni4?4c{wEd&?YT#!8jdA z4i7L^VTk9C#4Zgp>Oal=lHl%e&^#j0RhNPBJD*wc`BB^mndadvxJQy=EQmM*bxTQ-hdzUpGP1DRs}Ntg zj${RW)rsA${A0R-c*5>naOeA`?+ts|5UBda=|hc@SWc9 zw-B4+Kd9RON}Kr)O$+hA^Jo4WmR6}GB?pxMzd=9rR*ehsBjb@rwD@yE05?`4!#dMI z^6GpG*YrYzCa=^>fhRRjAXo%6#fTL%x}OL+D8yw>IH@{P(^HxBet*8l@;7rAG;fk7 z3+ty3lfhoG=UZ{1g%hq|6e9ehXrWVs8Dcfn@X#zw$hIfX{>=I~;Vva~g}!cIrv#25 z`Y@0SNtnCddv?LI>SzK$D)Rk&voMU5{1z>aLDIK_!5TE@RUJA}x=OUj+}0_s&OP7C z?bsVrBTFilMZSVm>0{-L-@q!%KDbA=q%l&;cMtS)*{1 zM(0wg&CRkN51I$BzYa_&nR6;k(jo*bAF*1sM9fk`qZ1)-RMiC~y|>|#%Gb`>xP&sQ z^6{Ze=YF;Put;C? zOxsb^|Ju3Zv~^BMVFWqP(0dBX=sXYKSetxMl%3mG?)(-(9xv7ryq;np^9n_ERUWEh zK>f`Z?U9!G{!=~P+Y&Nttsg-o<(>n$6m<%N|JWaEb5*6OJyBp4xBYDuTm6G7{&S2` zvhXxQa3ar$M55k7crLTPne^_S96Pvw8iEg+r_%Xy#VqTHHLK1C4^ zJ=Hu;WqMt1GMSn2`Fg#7?BQ8JHy#$|h6BOPNL|-Yxnf6iLMTTT{}I{M5K|4&TgDJz zQ<^e2R98=t&yFlx1=c&{uXt04nuN*}?oyq&N%FbB*RZQ^?-6ZujUpHiy2LUn7ATMp~k_+XQjIfGngD--b#V@=30I{(B zK4FCMelepPm;aKhi>4xB)ED_S`}kZlzjbDfeHWPqZ{C-Op;mh1qsx(^0I{`%#X&L# zg(gpe4y3Jb(on!>GYTLt1q2qn3jIP$lK@d^;N&3Ty9>|bV%ZmaY zn56wO3%t0`C;WDUPMSX)(hN381lMiStTDeaO{irI+o`^?U6Jonnnt#KwIc2;Y}0J< z6%3iO1~e+gSyPoa3AQ>ueL7ZO4S@<%v`vqJTqjicik`vy6q(!Lz4on1eDp&auOwHP zpFE!O`{~%i8q8qw2^r3__%lZ#OQp#iWN_o$9=JzF;d`nAX*q>%@h0Sy{3qmaxoHil zK^U6jBKZyp64^9`DVnaq)@6%nnux-WVT@BsRWnTKgx|?!cR^~s?>G+-^t3wez|nl% zNH4N+bNX$&Z`09j@nj#u)DFndlpf4H*HeJL&t=+u6Hwt-^pB^?;d-TAv2~6mMf;r; z9#Og1IKNqKuFV|qvcNLG_}eo7Cp6VR9EZOK^}js(|5f0BJtituyneGC_%4YYupT!} zPu!yz^)1FNhgQ%Fkk_JWlbfJqu$CB9H=bBsGFGZCoM|A5N&n(HfPMc;pu6{l_rrET z_17mIy+?#$V#tec8$Y?Kw>ci4HZp+w%j*}yHfcO@X05uivdXhEo7J-NtFrZMv+{JC zC+N_N#niJ>51nZaPNyYnox7EaDy|6^wIBxBc;N>_V!5rlBj%J%Fu0E5d>lE%-?2gG z+li6F+FE8(9#Ka zw&7Ve6LiUV7ct>5D-#|vzpsE-Sm`cNbjQx&U2T=!ZN(GG!`=#btM@M@R59#5W@{VhWISfg!4CV}~rnK9z368lr)du@^B+i20(-uM&5 zH8?)rEUAh0rkU}(5{f!4GTD-A?awLfI=!`bt$mcHoh07{>E;?~+a&2E7QT7LT>X z-Q3`nStV2pL#>9|JM06XId>TCCI>exVpI>BX=v&ex%2aAEnH1I$d$Bn*++F2M4eK9 z%p)M`z(O#~4pGS1I)x^6z~C*M0X*5z?M4#i$q9~+OiopRiDk6ZV++;t-)nvtW6GQJ zLsBuqQZSQm0N-y4=IZLUqt2qa1@K#O6ovAVkZvZNSvO`Ylom;Ohv=Bx zs?U91`l;5fs+-2LIVY6pCQ5gfaMu?@vp(+c?4vK9_N#%=RfX@%5ce56HI}mBoAi`X zL-eFsPezAK5xZpJ*y2#HDHXbkSe(2wx1)!x&+D=+Q-3!20c# z2Owca$@?+T6%|5|Ve%C?rU)Ac-sNiA=u1~f&a;rZ=k~vRSR3gtgCxnyC#zY$j(kqH ztuO)@!+SG8+TwYihRU0J2_1th6%z^mFUsCBs_pFG7cN#DT3iYgm*P;|CAhm2+}*9k zEx5Zo1a~R!uEnjmYYPDXEt+cbr zEJlZYTvQmpq`bp7Q89ZZ?!zA_?0n`nM%U(}*|H_26mGgw^ey9!TUIw_ZUIUnFOuM3 zGu`kvOQbCup@ZGDWG%_*j^Wh1K_{XPzOWN^E_x4Uy1sdB0|J0aCzld*l}lP9Y%_{Xpf-xvft3;F)-RW zJH|s7wGev8%hqkUx|z@I8}z_H-}zI=zWOVA|Akq*e6^E7G~~88c2Bw2)6RCldz1B4 zDfoD>*e>Q0V#lma!(&>YOoxwMV&qZ8U@STs0aO=z@9@wx#cw&DB8~g5=*)AX4uI!*--j*;E&V>rdLS-&M+n!j?wseG; z8heG;HGMl-%Q9k5vUbVXOdL!PYG7VyoOfw z7TkA5X*9M9isoQGDEa_>j&&K(yobwY;qt+B$UX9%L>(o7ABsQ{no>!bnqbtO!5!ZF z&AF?36zz%Rn!e)QbUVMAY_Snsjr_W70W0Qn?FZD1{shfseXc&X`Oil+;`&QXp=XVKjWd3-Tx6og_oSaIgHAB`63bf({?fd3^Zzt7`i7m#SPBf2^}?k&UA z3D@=0K9yVn&(#N>w1;Py`jlUf{WK@kM^LWc)QG&g7Mm>7r-whD^(r@#%(0gxxaw(q zm!6KbWNk1OUucV#=PT$M_n7znNFYypZ>n4CZ+@JuH<+I#G|iwlcfZ)u{*8vaAR+2* zA!oG=fzT48AuS(u#mL2Grg;Ioj*PF?>Z-o+0};2>{y>|p^rkp3wOJO124|%TdlmK^ zHdRB)eBjJ>X3c}C$*XLOk#4`n_0jBOJFbaea}4a!W6({aovsLrUICr@?4$wT$D<5zG7~e5F+{PPqW4NDp0ALiwBTyHt38Hp~ zISnGb>tTp4ff?@3*k0$k;>hx3t5NP@s|voQ;Sc%F;b$uyPqX{L#jnKA2XiKhl)-g} z!>=aDpIfvrXH|q;>7k4y(;-n6{+-k_y*R%mJA8MRU+LiSl`e@0E9S(V?z<(SuoGhk zU+9r#3-B@*xaZAM$<`xEJno?`)>1GR<9eklc&g_Pj)Do`tOwd9Kyvg&1XsWJ40lq} zP1$X^m7H(wdcDLMJ1%};O&V>@l~`@xb4NrGIioA%s7p=?zUaAwp%|O#^rDQmW}mMR z3^<{d)GyYk(a^n#($&D$82jWvnXC=fvxy)AwWoTE z7>XZ)Pt<@U8mB>}D@y2<@=hw+|Ccn$J0g;wFh2|4ak>wokD)$p{cspL_iNv@>ni*M z+w)2@2p6`k3#GGk;hGHJvu)vyXHbkd$^%33^u5`N2VvEs4(YSqjpmODt_bMK`8KQS zaQ@b`Vp%Pk`YF?|r4zH(A;FaIVauOxW4)lTZS8&Ca~_IepJB~j)_^@Y7#`0tuNj5o zy1yC7%H>k1J@KRB`)lvoJQgeIHl!fXf1Hfzj|MeMGy;!lP&#~%-5arpu|){1xYF&X zHx*fpM&B9Vb(5kR6%zMT@sb@WH$Cq-q|idkV@$ro%`%gqOORKoO>Od1=gR*i*cV~X zi-E@*enEj9b~=qh*YzzR!xZ}YZrK($1laEn4Z@&FMO%XH9sK0;o+h*)O-nG&yUO*2HlwP_see-7U34tno(O}SSJ-!;$x2+egD=O$ zMu}IFuwXxOG%9+$&dX;2qS;kGC|~4)rIFG$v-|cTut+elD3h3RypJ4ye~ZQcYC;o_ zxXu>*VAriKPlBbd3{-21U!wITuu&PHHM3cU3$}3RQTDA1n@g;{UjAT5uKjNANh*>sj{$hg2Y_UVkQqE%)sH2y5lp?MjpHkB+uPjo{gWxdy-A z)g7f^aoeM!yUvba%pCp1_A^528xfduTV1^awCszMk?{+~eX?9)&O+U`>Q*y(NU8?S z$r-dZanSY&U!y4WgAn))Ip%|ILW-lBcMI7!p6+2)fu&nh-9}=@KwTDqS+1Y(X?4xz zRg4h{c~`0lYWGc0a;{#0FwLJQM-&bFa|Wanm4oQx{AXmo=)X8Q>Oki|no$)~AVeYO z|LQ`moiQQWZOthr8Fo4rmbpT-Vba>UZ(}2yu<|}*>0o4FK+SlhXBMwgwU3<_Hy|KI zL{A=q{_E}T*b(*Huo~x6;I8w%O@di{aWqd>_D$yZ>y8xug9*qT|0CgBq5^kpo-EEW zsR~6&?cyXCq_Gk4rN;R2S$_Wsd$pEbs<~j1WNzB_?lTl~H$O*py8J>K)pWEy$&5wr z{Y#ndt~-wwAVaEgT1a1CzSP9m{!|h87hnTTBQ5(6_p}(sTI^y)jg9^BJ!h{p17;*7 z+ccbOlW_cjZw;1MZ|y4?t-Fq?a8q}kyc>0;8Eb#m852mE;T4bR5?!)RTCO&jJ8mcb%AoGV<)IJEW3mPq?bP)=<^#Trq0iWea^Y~U*I zhw^Nm1EEb?hB&POrBeIAyTt8lvSuLoVZTc$V<19O16v0Gf%K9ZPF^`ctl1azExBw; zC2m~(Sk~3545ZrYb>9Yy)p)yFa2S;01>fDaeXC8EGSTI9aTm#3>~~Nv@V(Uptyl^w zyWqMWPT9C+q#NiZ5`S>w9J7Vbk;}6U->$K1GKnc=2dVeo^EofCr3VW%=uH-aOI;*K z=P36XQ{A-kUU=fQ6Ph^?3U0Bw3f;Mtk&y;4Re;$95O5s}kBCAaUYyCTEsd8;Fn7U5 z388C8ohnZ_aW8<+AOD;&-Qvpc8|F$;`rA6fm3|6oW-FNzR%fKM)kKAYIrbUhU6hZrLzdc zrOtA3+JZi`%!uY;3Wp97)(Xd`8|-+x%j!;!-HM=q=IC543#A?trTGb5$NDNE99G-B zsvQTlBEP6diwrJZ67SICZE9_c=G*1{kQrwy1LnkQDQqxe|Ai)8n?y|e9 zg&Yf6p&A#BsGmx26oNWXf%w6uD}LQW&I2b7!^Ao^Kx6Qzt zf)5qEk3Qi!Rr2mE@2MxCaSN8l>y?w2c>)JAHN_5G0u9O%4_eP;cv!t=UX`I{+IBqr znqo5Q5WpQr5PU4_|I!AXUtbH-s=fJ{ufK!W$&lJ1mi6_@O)}4W1930zM`5-IvWkoF z3{ml+KXi4T(hM@3KA<3s;(b#K5$kda2J5hqq4FoItZC3xU#qzU%b zYS0~OY5Z60(=&3xx!sso+J|zL=~%Ovw-onJKVm%M@fKkcFSF2}CaXHhH{o=32zBQ) z(L-8@H`eax7L}M5+7fj>phVha1ZkpuHfYvzFvUdo%;HHgHL}9H+xn6s+iK}Ei?J{J45x} zlvmX<9x#{1LDjGJDSS{J^n3ZId-KY)Of(_YA!Iuj?&Aj$VZ%0Vp+15QW)7AcbBG5uCWEARbn(pWd-$ER4LL~Xl zg*52HDo94YfMCgc%Znr)i3h*ewG%((o#96?diNbEMRQ-P9mj42e2W0|(ok$=i1S{$ zqb)k5%mXWsY9U`d`>=uig)RhPmJVXq5D#`HTHN4Tx?U}%#C8x*Hhu+JGk4!%w{(Sk zv-9|p4C#^K9)EYfaPie;*zR(taeu-f4^8C_Qh#H-{;`DmH>RS0PTv1hultvT^dF1< zno+9$0ecjHDJpVpO>CmsQ0j&rE%#s|h1!9$4N6r0I5ThQo-5PN>uQEG_GK2n;HrmY zD~2_Dxk_=YxZ`p3?V-AKfo9klQsx~c^a?9D`GnfG1 z>r~bKVpINuwRj!pkFuAetxo*K4UppV|`Kiquzyw^rjJF0iYEqA6} zSOu+Sk#Q_(ysl=Gf@mV`o|=qpn-px%r+Qbo6RnHgF$wFxec!HY2{S|B)+aKiDVJQ) zm3W(=UCW%;mupG#K?T)qS|Y_}Nqr3VvA&)XX0o>xR?IL!NNmC8)R^VdV`Sif8HGv( zDdwn2OpN3KcBt69$1UltR-D=SD;r6T#uH|c#nMSj#Y$s+#%l_g4SZ-v)vilkOCdTT z^IGe$~<}Za=~lB{Na!C zhQ;;8TNg>l;lOS^P1$au774@rt=3UD&5>lcq8@cLTwHT}#CsF^sfq@r{N7>L-WVty21Z)|M1mF-k zc8Y`D!(>AbTnlhD>ONF|AHIW%v*B9OWdf_>E=hdL4;v3%@~FVoD6Rk?x8ji@zjVKl zKy)L2?e+I8mwwvOK^2-Tp`;lye6#bXhP#z6hS?>g{JQ$b^6TH++Wv8%{x_wu-x%Y+ zRb!2+I=?-<1v0q0#O2>ZHQxeg;cVdPX@ZNn#ESIimyU%VyI_=Z0SL zW{+$ir%9$s25uA7TfZ*$r=j^ypEsLNJ#^Jen19b{{`4#-hJFNB;52uBC|^;;+f?9P zmGbDH7(Gcu&fKyS3cf7Vw{2XsY2QmaYuc77I9dqO!6h2{rkn^|R`Y{EE&V{nl`E5E z-}`wS4*5A{SDkIfFmc~#L>E0^6!79=DL{lQ){(O-JcbP%0gft~ww~Pwwf--%fL8bo|Iej_9jV$5ql3zfDID^^1W3B zoj%V&z39J=WKnR^V4XEd&AlFZ$0XYPBNL*rkv(Ib=wj8$sv=Yl?0W@oJ@7Q^IXtorZ9yeLE3A z!&_1w*~haxHTMLBA-qTT1gdL|DwT|~n>M$6OtkC8mzI9Uu~M{oGN(@;3Z?hzWgy0F zu;@)KTrFh@__?u+aougl(iRR&Ug2>Z#Wi45lTs0B<7k# z01iL6oGv2(VxC}L^X`L+>fCA4>%M)zUb>|~9aN5Ij~c{&_K9aDFrDAAjHmjTt{7>$ z21h-9rBuDM)*6vF@JWv9iFM$vUu$%mEp|ejU8gG#t;5+XDnWB`elH8Q^84DRb-SJn z0nrRIpYaryf&wu@A(2j>_f6!g|N=s=Sl(`R}w&B z2+6B8ki3YALhTpm@yH?WuF$yOc36g6LG`i9ea4WYiO30fd8Gz4J9gaGNPo`SfAs}Q zSMgG(TO2OsmBy=0Sm-WIb+}L?0qr8!;ROYZD+X&JUjOFJ*s;S*>@Bs1LxSx6JLcMh z%az=T8pfNNA8S{=-?A#NKF8voJ3dzU>^Df_j|lOPEf-A3;{aj{G-gF;lJqp z{$ud@JA_0O=<;{QL#OJWH|#JBMMc+YLRW<1Ho{uiKP9ClWie6B0)s?IK;da_p{zCQ zdhR8#e*RSHhk=4(#Gt`Hg*42Y8;UrN1Ak2OvK?%ApQm}7KRpjYxDPm&pSQIJs_?T- z@gaWV{*Bf)A0U3>38Y(*DXwp6j3?@d+rikWc51Js)dTV`ImIUGTQM@S#ohQLG8r9A zm4_oR8e#GJF3~o3LngAyuNpeY>FE6RLms|RWiCCS>?I^D$FC06Jlda7Oi#rgDT9Ey zsHTS%4vj_(ieJXn`(&5O_VKUH+G%R5K@1R*)5VgFaj1sdf3cjTR;gX|Zy<=MTkai5*u;TT$zR+fFo#5xxhhZz*LCoAEA%+Gd9n`_h)O zTP{ct%kL^Ho!2N+3W^9x3a>@53D`zVcti8CiyY~~iFIuv^<<4HL`q8AgVKRIG1of2 z3lI39qhV{5=TQba10J=IS{n$EFepC#XtI5_6;O|cf7i`vnIIGmRD4)NY&whw58|7x z3`pb{cF9Ds?>mqOYpt22>Q?hgFN#UMuCs{@ooE)fRlqS_*e*YxONhYMjZ9XWt8!@X z_Z^}25+w{FRpBve)c=qWkC4Vi?6yS|OzhHhAlO-}8&0a`a^fe>7q2bpHQ*RzP~-U~ z?3D_8Cf>8${j7BT>p=>1}y%OvJgci@;8*C9Itp&jvlM@-RP#(cXnyx4w-lTMBO zsQ>o6wFo1GQgqD=jza@;_TMGPR-_i!?`vBhq;sS2E@#Pnj{w$s8b^Uhj6X@7UJ$N# z$Yh@kzs$BVrT+RcwCMZ(S0^)F^i#vJ5@l>5>!XhBY;3&XA22Ltz>W1FB%u@kqa?oM zzc^D6DZxMHDSy!>{uj?uYaId!ECF%^$tI)AS*p&$^oD#Y8{2ethCx6PLA4^wZ9KXF zIj9AxJ!8Fx`lX^+!CnC(E&NU5?ufUY&_7r@yWh`{(R}i$%X~63ZEsKTcNTX)qAl2q zSeQPuQfp?=aj&3$j7w~qwC!W#+R;*JQD#!F$WX?~EO!`HuXm!zoK4eOzSG$4$Kzi; zmQrmvH9e0Q!h_#H?j+KQ0NbX4e<(Tuf8 zE}oQ|i`ON0h@{QSdhUO9h zdKx&FL?N=iQH;2Q!eGir z(qm1xTZSnLYR6@(Veo0Ds1HTIA$55&K5V2#!AfvS2WP?ho~}l^GNLoUm+)=~*V#!c zVWMe*-SBr^kO#K1G`3@B#LPNzl?xOsd8Bd_Ur#DtFH{>JEMwBvZz!1su9@oDFbX?^ zHvCK4UayJ}YpDS^->OXoHDF1IMpTc;$q8_4J?A{7sSHo(%%#WwB@{pgE; z@0-sTuv?Ok1v#SAlDIBNXHmq{BQMjI4Js~d@0`9Vq$38li*`l1HHDs^y|mp}TqtsU zHiNOa#eF0LMY#bl3OYmG-cvl~ez9TX>Y&bjj_5+8p)iA?i>Y@$TKi3LaM$j2!0+o2 z{E5@|5yilxQX1GR0gGgHo63=^B%q;@>2$1Xw9ip;@3)c)1 zzZx_<@GA(d%D-ALIGIsCZ38W4!_+Ho&Rsef-1EWw^gw>#N5#gyjJo1uNe|CkmjYdBNYjtTPVw}CaXRe8I{Qj-^KSLp153wngy8_I?Gb%B9!ukJcGEPQA2^jJBK1TV*`5(1 zQoyTRu#~E{;BHfaRIIDh^)q-nCY8G7DPMn1L31z7T!*KgUWXYdvew&mxPs(iQf2)j4xlxF_?a7xG|1LgP79e8SI%H{CKn5P>E*R>aqtJL zKQ2_d2fhz>Ns44mY#|G#Vr5e@k4`#J^Fo#gz97J~`86+WcU7fKT0QHM%e0uvRkz+I zl3@FOqA&YGnd*pt&EFubH%>$)Z35DQfR(A_F6K}&d$4L0cBZxZxF&c)5^RT!A^u)R z1jh)%ZYzwqLmUwfaERjiDszZOdgr_Gh3F3Zkf>BW?PBm-gOrdqy(DJ3ePJI|xtJQ- z7S+5SS1pG0;g{p9ga(@SRAfsU)|3U|kI9Is1ih6_qXu3_*O{n#tn158#GfbEvD70J_xEN7PsQOJqcNo7ec zO~?&@Quv`R{zohxxO!h;H4w3Wa;(^#c=1P8{Q=@ZboI*XlOuWj7O&NqYS9uqw!VJ*i*H}$tkv*RrDHna2>!}| zGmPmm4$CWO{Y@8b{9YhlLe{)3UI>t4lo<(zr*f4UtxqfwI2+nC7jefT%hMGhYjtnl zc8MVZ>gq3tlWvo=-+F@m5>zc^?3=(C+_TiTWWBSoOntS*19cm+BleEh`;EYsw_zD?nqeH_jfi(-a%8UM;kZbv z6OnH5Q@`+xLH@E>6M5V?>=~SN3&J>Fi(S2W)|dk9UOs%j@1$r(6x z=nUmDYpHrkJ$9Ot8qV^(FidlZ#eh}cdy)2w!_{6didu}$XcBhT0C;MMp-x!X(T{Fu zD$n#adt5kvD}=sEXUea=?yRBWsX_Bs^T$#JzVd#M`-%9wbs4skN7IA^GL?S}Wa9s# z%z~&l{L#HATAKWCTFp8d5S5*5xLrc&p4ix8PU!?3m~gd~kYW}}(l?A{Q2srXXQGn< zIOH{y;@Ss6UH9l8`8%`tej7O4-Rej|>8S5!H=&5WA)I9Xs5} zo152zyoVNiZ&U@7XBS$n;gA&gY!MBPLo69HN-Cm_A45#-nuFY%Fw%C!fNd5D2-rXi^wTZm7;k`g_^ENm5@*93WeD)Op`Ky+= zQe#(Os>%+gU@RNhRGr>{l>lu-XV&UaI`AtY%Yu)NpW2a@8$S&I2Ty?jN^(U4hk>NG z!&Jw~U+I%$dGQQF)V}3s#@*8EuK~WbOX9a}?w9)~B8x!>yYnDM+>*9><9UsYiCG=c z>+SY&%1wS}$K&~e<3+RN4b(e8;28OkHEY`}l#?S|Fr#S*m10M3la2&vFycfijzF)3 z(DU)LKoDE1$bAKu+X%aYjH@dcqg=zQTt2yotU$&=1+{_nTdgr`TXZ6ZjO%s~?2vbh z$sv`zt&N&HzT9p9T&b8>wB5{*1@gC>^1Bp*wW0MWH&t3ivfzPVd|LRAC0?u~O3S-gaAJ@^r(5mY@|pe+Wx4^+2vs;ESS ztwHsf8V1z>j|RLPAa-n^%twMTYhDH&Z8@cSpOaitoT(htuTE+ec6}2nFm>NjzXIqc zN$uxb%pE;0%Ee7>myPNd_}=IjE??M%{W{4bIvIa;gXy?I`%;l#5gh4nv%Ks$x55J8dY03|#lmiwW65>r=#uCqoW1 zJ-+JK4wf34tU;IkC9RLZg8fANGV2c@?UY)|-_lWX_%*yL*e~+bE<#<~ zmGI_K|6)2rbLi;VWAypUjKtN}d7^o(Jk_QA-F{Xdj~ttl1uc@?vt<3%S5*xg{1fUQ zp@mEU?{?0!=R_<`v(+#UO94Ok%;I9{~&v> zXkrX>5GyYH=mpzWJ%y>1?kef+-)uD=+H!$CTw$^Bajn-Y@vA^bSH84r3Y-O&o0r$V zd7Jl)D5>#dCJWKW)?SD`36ds9?y}^dwhz&wAX(R0FO8?@^(D1W@QELDd}ZtjvUM zdPk^VZ1I=aYvpRT+m9*t<#>aVaN;0Vth+pl0Qah2T&kmj`9XfJwU)aRV|r{0NlLT@ zpQS>8NY=mZ7U`_;y&{3J)9dx2oax+5oGz{?X`kDR<$%c{z{=J{&bo(4+uU}AdZ~un zS*T9Zq9D(7|7g$Ld+`oJ0^U9&`xhJgB_}7<+OQ{V`rHxb)&yAXMo6?JXa3v0v^pZqNbDke7vip!LlraOJx3hZT~w%OXsf( zdO!vt|Ln+V^Di>=UyhuAA0_^wqx9F4|DjXlivq=$*5NU{#@boj5msrDlGV;9ZFpX>wZ~qhd%X=VO z<+DtnI2PXVr*%rvo~3>a6qShtv(=Cv-l!pf8yB{nVXk&QRx-Y8e)F8~Xk=CIz=<4d zlF~Ud9oWZ0LHnudI-zTkQasfy3Oz`V+Di15Qj`-seVSDpwJiQ4tk*4)d~+#pMZY|J z0*CR?i}&)8;4!Q4o(RnvAnsu}wTvrL+*1(^04V#wtRT!q=}FUqbpItpb{Pd5e_=kTz%I^0`=w#c(tKXtD1DXIOojcwgaP* z1}-KP?b#kbZw80YeulWsoh*(G0WKxCe;L)zKfg;*X=5yH8Xl!B44%L|ayG!v&`@@fH;p=1RXRX)A* z@X}7Da~9_B8G-3LNWQ_az!;0no>Rjso?2%qThlvoaAsxp#B|Rw#aNqy%cxY8ZJ!Zu z(0J5hn_ITJspJW^Wha%1U&CV5O+&e;w!P#D11WNg=V0!Xrr$4#K&}N1mE>UWGWvp! zFvmnc2xbZ%0WW%SS_!h%*?wQ2%fP^5y+S}hc-84=rVZKM|NSz9d@{DTWpXevVREo{ zU~)FGX0mW`abN;ESpM;alc}Stsj~|cL}T`kO7uTQ{6C)lVKgi3;^HJ?Z~t5N6k?TW z>ip*>Z&dk9me(epDyZ-lj=^41Nt?n4qRLw)_E|`&Y=zxCvvQSZSr2|yC+QO$gf`rb zz9m6A*p6Lgp~U1+W4@oU#JRgpBKXA@{t~MKuuhe%Ou~DSAKjT!&za~XO{8kfw-+WNwgoU z+nUk3aN;2gW1|9BmMBawh(k!D5G5h%QAJs~e&!`!%JvhKR$i2>4K1|muUEdnEcPMC z{vjjwTApn(sRm5>xW|xF+k%qW7W70t9tR1>5w!{QXP4Q@NrhGanFkGsDX9H+Cs;wiMGI)M5JVV zg2}M{bD6m%Vsj6dCf^q|7sf-SA-T13AY3zkviod*nI>AITA!rdi$2#G0J6syBa3@gvgTP2$#v(#rV16dc%~%I*Nj>k zl8-9QusBkALj_O7tz1%ox`r3H`W#7GMbzBvz?Km1c=W?WevHJ!?4e$%>(}DA9rn*x z=JZ)+OnZk?O-oLUUGfu80k5Tn6Jk$V9HWOd)*d`)<2yBLiQyYq#F6p`|{rq*&(y&{}Dvy^4K^cDq+f4Jn6K>A{uI0bLC zS>O7$z1Grmu-*_Ql3ZXfxo_RSagHdQI8Q1>Fzo(4O1Fc9ym(U~uY;KNyK#^{tL7*Uro6J%UskaffNGKvy#f4X-!{n)FnD~^v4~DehGL$ zPXphMBAiLm{&5tui<|7?Hj&rgP&0<`#lQsp~a)z8q8P!*ajBQ(TH=5hQ5Rsk(GdbRSX-B6r@d9eqR z@InO(QvW#lh9qB%I!)tLP62mUgCE{>{rDVoQ3*`V_Zjct*7~dX7L|-Nmr-@esq+~c zPkDAmVvvO@q!*IpJ}_~p#_-yn%gEz+lL9p@BsDtFsPsmO$sdyQ{lm>!RgqS~AAYv= zHR2FZ9`lQTVgzIYgny!0;)YGlHRslbQ6Rc#ge4yhlTC(|a0(h7@gpLxQEG-Ml- zp+2&{y$(B6)6L+vk8>sCTkZG-RWY)hR@9QrEHA)Qp>kRhq&pO4fb*$&}Jq>&5TD%Fa5=!U5U91OFIU|4otZ6t1P4_3g5(St;N z?kzjwDjv!oP9EbeIq&MMHI-W;LyGKSWgMAbTQ^!K*PYQjDe&cbLT*&}FF#NI#zCw< z1T@a-h68s9A9li6LHFtgYr9O`eY>JKzz%cA9h4Gp`dR6!rO`P**GGME)plhWyDMoc z-nD{K4OErY-Nu7#Tg$aNn~@^nIqXNq_9k-OhxF+{rq*RF6!NZn25Q5vD^w8--|K&V zt%P77qDkY&H0HRXF=J86<~7u`L2*zKbA$|*tSppwa+BU|qy|c)hU$RK7E+&5g!1~6a7#&Us~uO(_fn&m6T4#E2aB5GcLT?B@Z=|df?)!G>}o9xPv9NO}v zd#_I`Wap18-)YXU?1E^^Z$IWL29JzS^zzF73ZEq;sdh3AY-CPJpD>E9Ti-lT%HFgn z_E7e_#UeV0iamj<8sBwmS>V1d4buc(^B1G9kQs)b)%W*O@eXs#Q8SCC2UNbLe=pn^mkM7X1eVb7kAjR!|Dv4wpHu%=Vxsu}ee+iYfS8Lz+JjD*;92Dj zbU0P4x5zXnI<;YBgRoUAij_(z6VpVa-EI&s9}I}}VvohoKNHodGLkJ!xIcQ!H9>O+lO72jQdOs08dYsNl5+y_!Oy?wxf@FH)U1}o1p0?M*x4iTk6UdQZst}UVA`P@gjyrz^4qU5vyJ5=@*fibtj z{kN>H6hU9r248=V8?_r@ZSnxFy4wVV)g=16~_ zbJrVP?Sn!F2!DA0n+c;Z?vZjP8T%+rK1b2i;e;gyT%(=h=sTjsE|arD3o5;Nq5`V6 zK^i3%#0vh{N~UHGyj)>h=J2CRf_GRx44xs_OWRX(v1p&zzGYM;@(PoaR_lOP5;3n$ z=W{Y`*x7d*-#Ib?=>umEmwjSH6VHM9i9@!ZL_I!458}(cW0d(}n`-rjTp0Zjn0Y=& zjv}s(V+$T7-Z!*pwfUfh!F@F5DntK{4{=b78bR}Cy>CXDeXMgGwYpCTEk7@OLeQ7z;T9egYorabReRs-~@dN z`1m#;mn+1VIA`&d6tGizcY1aZ|5Q$!{obfFL_YClIn9bhx zcSD;IIK|z=9MHvDw#^JLjXQSr)~Wke^=J@>&7>}! z?fOK`UuuU|L&x&|Fi>6%$zgxG>*v5CH9%<4KIFa!VhKpIw8ZpK0f-87d_X+3_vpXV zu@GGX7Xjp8LjB{x{5Prv;vNo8rq0fPQboi}9qj*(P^?nZamUcW+6aC6NXMe;T|cAl zPorX8pss8a)K5X_58Ds!%IZdx4N5y2@4?P_3boR(ulU0SRnO1a62lM)%t-Rpd`jSH zb+dWul%q=g37&MR^XQuF%ClfE4s)>}~5&n0;8u z3s`HXw-vq9d;abCl!L>i4~v$EgP3;V3_tYm(?9Lt=b0X+Q@%vbtTQCZfb2RcjT1#c z$>y$#eEUq?1&R_ENPx8T=TelGMV0hf)kflBY2&(qaMkD*%3x2{cQivCH@&kTgRRpU zTUEEuw_1V6AE%WuBF#~L8|kuQDIez@eYij?49||W1!~7m96B*xEcxd8asn<`q{*5`DeXI1 zbJ-f^DlY~OeK|Mq96Sp%L;*6!;*%@w?AV~$AyEG0_IwPUsq?DeFqW^#7$W4hJPw5_ z4p%`sU6XBg1GUmr- z{Rs6#w@f6L&>8W=2Y0UzFm~H_4ADdhm_b3Kye-5^ZIPHYK|W@P^*wR|uzFMnby0;p zif*k+qs_)xa!QFtj!4tKfU+9|z;|k>xdcZ>WkEh1BCR_3J5t{yp#cdN>0%lw+V-DI zEYc-3XHLGD1;JPhExgz$ZQGW*MCQ5~BZuOr3O&JyMX8v#%8uY0Wjlfdd$tJjf_=Rq zn@RK2Q;PQSY-d{I%k=Zk4lm}}LLMyJ1!Z)2qvzX|f~# zBYSo}tYX}7&V}s3z2Tr=&$nD1?e?Z_y6B9tC0oGrPeiT09O1#D0PyCLk$ZjReq(JUps_ge)owPB4hDf9XwAGy~j+J_5#{@@Y#B(DR?= zT7|U>$27lRMRLW#o?@8tUlO6e8`piXgeJ%g*a+%8hIuv=aDlrQeY8+^x!vdl!}&_Nj17rz|@H$$aCYb z9Go<6wTP*Ok;|Y|ZnKcmqRI5fBg}LaHyM zA_51BDH}N#N;YxdnWPVaa1dn1;03#5>Q0xV-t?*aY?HF_AGqWk9i5+6ZwmTBcav3O zd}V2=YL->8ze;8t57AGlE1FB*gJFC+WFfsHn)8`xrPWVQzKtSlwv|bS@$z~KYYkA! z35OwNc9V=L-6)*&@6zKn2?6!J_b+>4MWzcAx_ZYNAqx7un1$o-62(i!Ca9RQ&`SMP z#|>n7#6G8Yq&+F@FO)Z*1#JyMK_iWbHP%Ur8a73kfveC=Rkcj-1 zuz7-2%0=3(%Y^Bsvq)owoaU+vUZ=gv8b~MAK4K_(-70j$=ubKl$UegW^FB8y^Lt_|T4Trgv@GfhR>{UJ zvdw!%5BvNeyttbiz3ZqA(`I_3bxC+{zuVPUF!jrJjp|y#x0(jaM=QYXUC8?@_}^(= zKqaXB0@7t4{UZnA-#`{+E!|AjElo`A<$yLee-l0bv&@EAA8TMrK)g&4J;@meu#ua@ zW34c()RD++X&9Iqdl9LI47+aUVo`vO_3h*GT-Vk8bJ{T^k1&q~US8(zaM$@q$Rw#L zyx%>uy)V|5FAoeZUS8FFwhg%pnd4Y9n{yyqx=d#R!4&BRwinyS?v#@AnW|LJWbRBH2CjQ)MZe?`tp8_EPe{n9YLmu2sXMc{0RztGqN!u`M{Qw>ta&GIM%`JU5~8Z%V?!o+ca$d`VK{4K$C#HrT2{reDP3?C!%nI zZX2blo@5LeuqAse#dR6d3NRED7g{zCQ!D2v7-a$zA?D^g?bM8Lc&lKwY$}$wUn_7l zo}z8o)(***>yj)GrRX)DK!`rVOIrsz%jS4fwx}Xz%)zUcKH-*5R7FC*@vKbRiCR~h zCF(XRb^{?fx)}8+Ik6>nEkt=}nN)p55mtshlUX!_Wu%OV-)OF^ikill`4gD}q4$-C zcdbJ{U`;)h)Bzo1>@Kx6@_fjHYdrB|Sp4Btp%qFGvSZa4Ju`0WT7|#`vSVMj?Pv`Y z$g+e93TVYHV@aLg_SDQHAKFJFCy#FAS(L`xElOz0W9~N357^PX)MQxg6{zNke^MIs z63LCebD``j(HYU(U!7ROr^M-IVEayA>vpe58~!z9u5e>4IqP-vv2J=MpW9t7 z%tza+hPe$))`mhWv$6eha?59#UwQ^R=I$N5@4emw5yo17sk-Tfx=b7mhj`dnWsfJ@ zA|Hh^@X5}tM^8^-`{KLYO#dW5yUp~s<7F+j5YC||SUMceO`G9U{z0UnVEML(Cn~Kw zj2=AGA^gd4Gd~Ty3qa^12`E_3sP@X85h#7_%kheb`yG$eE`!eoA;hD^%&X^_RAI)$ z{PVd+pR2iLN2E7t1D=R+wc{6D!jryzOM2zXIO64p?K*LrM*+dNXPmb=5<*HPdSV4g z&dUS6)tX*`7xKOx`vmBdB8;7M+ularKE(wL9~x$PEH}OV!Okr6k7@GiSE8xMbXpA( z5FuT{(rmv{T8#yh&-cMrE8w2B^)P8Y$H?=r~7atneH(6|aWCbDhd3wd#&x zMOu~&XVN=2fuJ)?sdU(WMCi?P>%?;?DPy&@zmZOsq_ zk1A%8g%D(D|3B8=I;;x4=^8!~(k0#9At}<*-QC^Y4blzL-QC>{(nw2(bV+Tx-;Eyc z=dR=XobP-6%S*Vnf9&;}Su<T9eL z>deWENp}dY9ON0kie=geO%gZ)RehC5<##prg376`VMOOVgnYI&p>_@n9wBvA`cS98QAk<= z6s=hg)U{RB^})URXy~v}^B86jJ-PvWC&g!sbGUS>{h)LeGPhE# z9-3~Bpi}`)CwWJpev+?qTGow_E99KO`mcOm;eR48o}H;#ipB)hY|4^xwqq=u z(q*5LZof$5Os`ax63nh9i@7s^Z~Q1bMX$a(m_KKuH)O7xL6x49c)w4|4yP{=Gl`J< z6vrw-+38-asH$6X5RZ{t`yO&W45o4Lre*J5b_;E>tp$lOeNX32{+x^#S-Pguo`^7a zywTnzcM4hB9wMNa3pH`LC2ShU)GQH#DB#xknnciaHdUmp!{h~CVT zr7y$~OG~89fhD!8_I(U&N0_e@r^(tW82neq`b0WBe*t(nCpc+UxR}1Ew~CTyE<3Pu zDzvp>9G$d#uH&SogP)@U6(>g6Ru~*qXuL!W*<-Dsi4? z?hDwf74=JRc>uh>ggS4imL8zYE9Q>wL6TLWKQ9HJ4YU&l9P6@vw8jrv_&85$B~bcv zz?+aFu(xPK=G$x?RezR3Bl{?k~ev~``{k<-`;KzKB{Qv>35uqt~GOT-^zE@xAr;W9V!GLhKyC1 zmXTAUN;KaixRLHHrvMmdnFwvi9V6Y54_)29I!oSGaPdrI^R8u}tu3jn<%Lz5!MhjR z&x3ewEpUPz8MbW5Klo{)cg)V5-Fz+9HaTWh``84@K-&lVnUvCqutJ0Z;w%uwny-zt z@0xHmK@Ts7?#Fp_#$eK5={6L>7AVYBX=RbaIv;=hqc|c&&?(SLbx@VLYOK@ct}e?d zD5`0;k_npRI>YV12{0G{TW8@e6wgHgxoXChxFvJo|+KF+VRRMc%^!Oz@aXk>yk`yB_^ zte6at;uo;b8GpOO3C13CEX7qO>beBZZh`gmnzyY)nps2sfF3WMk39T9PhI?TV)I$l@;w%ezgqfNKpT zK}p}SJ^lb=MD*nk{&C$N`6+o&ps~re1p`xV-eRd6bfdoYSQl+ywBWA(-f#59 z8D|>t_&a-}+D0?^vS4RB)v_@m9bEsZws)f9Qu6@US<)<$8@tqxann{r1fTe1=-xif z(86egrn-@~I=H78rX+XO(&~A&0!$&j5B{ech_e}5wi@#e;PLRhXJQBD%dtJ4U*BEA ztvCiqpZVjZJqPyxdMV*F)&oDtL=AW=YyG1sSL05u;WOQjY3O-8@qVR9XTF zWof>izYpeTgWaI#m#e_W>)ps8lV0CetcgEN>LbvJt zTvYM^X7~=hZ!H*EzRV-%*AGhyY-Z{KUweAYN~+XU=3&Q}zLUq?$z?z{Te0qwQFL`E zF29m(B4+r+ET-UhAZMAZ%RH-%x7idYh?$59FUzUEc2hRQ)iO(r%K{UQ(zCJJL2jy% zujj&7l1t_6ni>bwCo`WISj@96m9H@V?E@a$_Yu86STO)Rj2Ko9$Zi}v5F=9ufhL2Y z2iuensl-vN#Y5>L4{n8}`aKDtwnQb4+4$L zQZ|mSIC%HTjgQFc?R2}XY--0e{gCxk;iv?A-(G?%HY1Q8C;F}MmcaT6tLBUVf@5&M zzGo5nM)80tXNdd?AvyQD25U3x782IL-JVwP9B%FzQ7DpPSkaL4L`(A!o>hntt}^6T z%6sXyvOtJeJA}>YUG;;4=}w@big<4|-gXXbK`5-g_SiOm&l%=X{FT{ga4FXk*RWZT zIzJX>0@)#bj;MUV!4BIwN5Ob72eBA%^PIG78YV+pUmg>hVll8wveJdphvFuwLzg6< zgn$T(xo8;u2>(I`+tN(|kw7wN``dnt!QUl=iZ&M3y1*UF7P=0m)>i)*NBHav_`>%7L^}jA(LFeZ$zx{FeiXDMlPXsnPZxNC*KZN@uzq1KM1JmJX+_!()0I@b2WK~N;A4yF83m+^0nxE9^6CZm29aDy_pr0&KIa;g zuO+rfD|&zs7%C=oWjI}Gpq)1zK} z)oWE)#QOqv^v;E}7w=gXyD#)UTYshYU3jUTu^llk@A7l$`@kg?jN}Ud6)ZWa+ zyUnQs5S=zS4?Z~e1ZGl|KfLbMvCUWNLMb>O)CnZqOdV!uqkUf6k11jxf3#Ab-U;(; zK?@rp%nf-h& zKU$b+XFW$ugP9&jubuPV1-9l%Z0<*QmEldgVLX!vU-f9EGx#n`zo48!r?gW6*y2F`t&srlcPKY9wJ>}O`lCk){Ix%T zANJ$VU;Apvfj|FCzt@jX14ig^?_*{D_a6&1k^!e0e}p*fDe5F>vfqU`d^O(jq__}N#kK# zIdB?%&rzl@l@p~ExOE)kS@b2<&@n7&92q4x1mQ>}pyH;YLqNWeD~#)t!&AaFUbI(V z(2NYp2$qK;jY5w$LcB}nc9dYgXS3wA^2b+RbVxA-ik_u_NN6F3O?6$cf|UNLIbQF~ z9?yb?!`Ip3>IINBZ)fG^M-{_S&U}pHZ-^m<@V?xnf*Bl2}bzW6W^VY30XI;wmi zq+k-=YW4To*3kTGsmY@fsdtt13=Fp2K(iLoF?B${iNSQ=vik`|L2i(u9sLO5F>A4=wkcl^rY1BdVi=OS} z2Ie)_w_lyPI!3O4@rLN&LD%oLse`n&-gOUy-Byn(YR$!8f?1g{FnMB-l>)(s#Lr93 zgW^Gd%w|o2DVId#MSA?;HGoO2c_XwEP%R>qSK5?c2fYN_?3RnZ{t8bidH|ZAJB@O@ zsuOXg&gNDj@Yay~D>e+bh(GXpAk8{uuaI+|pO~Svt7FVydMot=#I`ya*{k}7{jfap zv^NT8q)f2XmigOf6kO3(XvJRdi02aTsqAz3%k#}id))WWQk=GdoW#E_xKS@1v+5_h3;nh=#irp{&M4!%ljQ)9ExE&6l` zh}Ih;fY?^NZ1d}v_yyxzMeqrTgS6k`K>q&`4uJN(e+7iNv;qUl6ZE-Ge<=Y1sy0+V zcvBWk0>&FqhVF2_*U6r{tGyG+s|}{^P*2pN5)vAxpbxVB_QEpAZ&s@IZpU&9*PNy9 z9tRr5|4?@!JLPuHzYrvBKW9Wkc1?*%95#2&fgAcT$$>43ht{XXupjG8c$Ao{Z=FVU zr~EZ>P70e(N4IP&j(Iq8tJ_Ax)l6UMTOW`1e3?7gl@-4vHmy(dp@>ccw2)5qweYMg z^kQTKc!Rq)@|0@~ITac7Zho|WymU^joa$kWSjvhs4*u(1$~@`i6;AmAJ>OY#OUFgs zg3Acrz}BWYLC|xM2#1o~F5VNR#L>}mr2I{{lI_cgRC~j{tfg*PB`~G?c*&MLpGY^8 zy)P%aD$4qEs0!Bo+rzL56QR}~Wf5H-(&~3I@%+%r$;Z*9d{WkqxCZyY0Kq~f6sn?M z@%ovfdvGQkfvu%iC6guxjrgFi%JVbn5CukRWryCnZ#rgK%@;3HTl}!_sN1@NWYh+6 zm5#{=a0Kq>##^?zObKh2v$$%G_=SEP_MiI(FjlQylYz*9`Ykf-{}wWSC}u*yd}nW? zt8XZ3sSB*<{^WB%aY6Eb{f(b_rCnaq8o2w^b8PONuBo_*4?q!wjfCqP=l~IkLNNs* z@7F1f=-R^qDd(g3qw?WS5Gbe+P@a$Y0T@A$(1Oqq{z@6u#;Z5&nC6`xj~AF-#15E% z&s%LG@>)s0tr!0I?%Fo86kd6ZL*)(ulTv_oW=|uD11HJ@=;%RSIx;}jV7SQjZq_lM z09bz&J8Ge?F`x8J>6roSurY_9u#ds){-p{?zQ9sCa$)-siiVydt(}FK6ylr^@Gh2R-IVvm9S+l8mgN z?D~3boAVt#8hug%YbJ~DiHoHgk#X{y65NjroMzPx`f`~4`fs8m{1tr>EB$m;FsW#@ z6K+)&UGp4u#8L;dJ`v)X&>l&VrNzSIZj?-B%4A0g_^#8X(?ugtJ2go_O*t@Bhf`Ua z+!(M@_6;!sF3Y2u?!26~xoXa?31+LLI`~T&!pdUX0}s(dd2}{cdN$}5QkyP=HaNn< z+~YcV_`jZg^e}1hg%mgO0(}Wc!ka0fvq0FP|JGV8^!H)+7fGpJUQ%2gn3QrwEjG-* zs+6zE>=CutplJ%_DNayjgYn4ah0*Us*j}_J>l$V3b(&=pG`%zqKHuk1Y=mRT?UNQ3^!Ov8z}|q}Kgs1q{_|Vy*Y@ z7>HI~bppFE%*LHev0BO69)zCcuLyei){I8THzepET#AdNAL|k@$TD|>_pS)xu`2Tl z$7G&M8#xgkL~aOHTvJYwC)qBA?6d2kh$!qDDXrM`^I^~xG&zw)g`f-FrfcgUy_}}G0+7&}Ugx%IS(cZpb!L6zKlDTLD1$T{PIvES+gyE*|#cBO6w!#f1j%C0DaX zax}D>ZC~mlB+YewzOo`)flbCfUK7>Uh1?u(gE4JDhAe~JXEJ-18**r&0;9IRNz{Hf zL!^2PS#9K{r8ZJbaQ*X1<1!Be<5$=gwfLeM15}&1TIH@r=|^y7nr2V_srXOx4lANs&Xarftca_EoLEFX2C z+w;Wpbxts-$_5E3romceBGeA8>{%-Do_eFk0)WpxAM3nZl3!rRj0WDB$ZBVv)ThuNOUo#wQb#?N+z>T2#kU@ z%90};l#reU&y9a6{(N$;Wy8Meo6@F!mmulFAr0f!*?H|Co{gP*9(Ze;N2}?t{apQd z(F=VbZfif5ES>B2QIr8uBl=s^{MNDXuLbz8k*j~IlK%}M^1Q&J2=NJRk?)YdF3b1h zq(A@JH@x==pZ*Z)W-j183ixESPgix?(z>uR*VXCk@Bi74rwd;&Ng2xDWc?$KQ%Cx( zk#R?|fw%U<1Go;7HHH#L!$^AEvg&{z=hi&~J6+mNE4$)y>9;bdP}ckhi*i_6+W5zH zIqIz)R929FnS0~(0>@IKBFC0B0|chF_T1$l&`D%ibp-TxJSw&!x@L&tGpirWTF-)8 z4qz|UFTcuewGs(zN3~G$Ag1@~z@higQ{)sJq61P_*|#?t+Uc$YQlf{GpZ++~TFptn zbgz57gv}?lbkH!usGzNT!`bHo4$i4h@!1m>gZn86^RO8b72>2xQ{81ok&Gf&t{+j0 zQNr4Y?4ZJIKg(IJ-maYotD(w>bg1~9g>WA2dVN;-2`~j&o8)#Ft>A7~62)7;JIB2g z-Ic1*4F{MPL-K;R&3R8qOw++La4z2hyUwz( zC5@;kfjBlnc}Z+o6YFv|x5?DT-h6Evf3x7Fgk7m7#gw;LQT3B&AzgOX z&NJO`Weu{uDIaJv4hiTbo_f7?C0C&O)+ubjMVy&!1o)Kz+Dead-tb26qyAh^c% z_Z!ny&5kCF+6-B%i-(1W&HHdG#d^`xP54I{$h_lCGv|8>FEkQ)cLy;5LCw%UAWli8 z{U>ttj4YeDkrfOHg~&GPFgb114eA;%O_rxUuGzJkTK`rH4(-@IJ-;)&OriJ%1NYh* z9)!-`BUW#m)t$S?lF~?s@FOuJWNH)7AK_#$DsHk8h#KkNhLhi}KK_qz@>i(&cjEG^ z0Viqx(sP+6GmY)Qiok!Yq60%Oh7q<=MPepu@P9Lv5`mIzWOc-R@&%SDR_;08_ZPo4 zTOxqYpP<>vus>OjVnY9OQok3}=V=0U%A6KhWgkRyN(_l_M{v@!{j9RD>b%N@Jppui zK9gIkx670(@`R2W>-J(ZJR|AAM%;6w_4uta)s*^9>~~e4LS>WZEfHL5pX<4|50e7& zk~&Yz`dD;(TF#;NtYGh+4y4IN@rsft(omW?<$7ful&H)#<%Z~2^g7Yg3O{k%I$o-5 z>no|cTa}5v1v6SY^n(p+n*0DR=_AI@EUV)TUHR<{2A@*0;VQeG`>Ua0QLgL&>@jrN z#lX8{-`8X*k7-(37Qy)H`|rQlscEt*+h@S;CX zs=<^tK&nD7FF1&^vdWD8D5-S*|C(vx!Fyiq-R4&h0mmhizUQ=7t^6)P6 zh1teSA2G`ryJI^)Q9gybXTGJiI(vMaE~A>o5O=lz{w4Pb`z5kiRn4Af05NjiKH`&(9hwu7XxL1ibM9VvaB_)OTGLhjF{&SE zUi&Uc#B`~_gTJC^RCG2x+DkPI(Vz?E%kbo!jz4pXOQBc~~s1w#!wHbI~E{aXp=1s1?E_{BTWN4@h+jso}_JE*2wK0vDAZ`1tg?Aue)DRfks&c&T=b3%!Tv$E`Zyjr|1N#L6 z!m;e0!uNsCLyl{t>Z;TABuI}2V-dKF*)vDYFzNXa>C*W^r-V-(R{i?*@but4k-)yR z{glK*In0aVDQaazYssoFSsE^C>ZM;=-YanNEp#MNF%a1Zfria2sD8Ik z3u}YB zYrOik7Z8N;)SX2FL6GoU5d6LT@fWe-FGvRv6F&-=_)%h}2C`%f7H*JN-Jb*MZ7`8Y z2*T^w!-p*RC9l8ak+CRBDqbQ!i}50A+`RINb7}o@!#7CwtA1JQ@V^d+%;(QR_!SZz^!haKpbei-vhSgX+WwNDbx043_N_F{-+IZd9 zv*s?q@hSz7b2v?QrFW#=%k_3%TVA;zzk+(Hd;Qfx)O)9dxbzdU z1_HGn)RN=h!E20(U&$p>GRbLCAHOeyU9&HtWf(|$5G=SKi|5WwY=MsHsNX^e|4BKz zt^Ywel*pl)#=vDYQI}}xM1{KNJsvO*@fTEkG#iG-N!;dj+6D?0jo&S-mL0A2X4>5M z=JzgXbZR@ZoPDfT2bR6y=|4O;HP@y6F9nSFZxN&Lx5CC>F^+$(dw->qp9&ACW%f3d z8V{1nrz(m-dYD9vH+>ikaIVE_dMa?~FtDEKKQ$f_pvJTQGLV15pT`ih2ZCll-t2rl zkeoVtjj!GL$|V%lr#%B(q_X~EY^3NOKtc-KeE=9lApsRUu^>q{f0VoC*wPfy%pGdK z4v=S8COlG$Wk+{qLIf$NcHbH6l!?}2$~2IMv3M{({36dH2Xa40?P8gePey;g1Y{cf zL052Jmfy_Z<+4Wn=!jq-K)aT>J?@n$%(mpk=-vfBa=w=)^xQf)5JBZvQgJtGdT!`) zFmF#?N87>kX;#IIo;P|2XlK_MQdt@Zq@93xAwly#b#BZ0XO85j!?G z+n!WzjJurfXZA^UXtR%(=p|RjvG%Ug9Qsu&DpZ?fdwJ~p{Xs0BE(gAR#49wegg>*_E>s+KJ#$`>Uq=#JwID`v#`_HZKfTS~3 zbXOFw7)Uy=?OjV++J8ZzWyFgb2!+S3V?gpSL|GYNQYH2sct3V&I_$KIEI$+zNWOz! zPS;p)-1%^^zF607+=dNdpe-0V^N!|>-6Uvlzmqe(hpxnDdG25CtNr3Q_I5=n z{w%Wk6KnS>Ns0H5!ld7Q&Gkk0EBY-Gr2iHY{x6B;SA-B3&joUf$%e(dVtvo>$W1=P zvRYt>fcJ&Yk&2f~Ki2OoGMy$NF`e{g@ujB^yM1*IY_{K0G5V&q407$RE)NU^Jha}Q zqj$Ydz<^I_=+#WIGsZ{dl4smwQ3yfom?pTdJG_hz>gR72*T z&6E@B!l1HlC{=AF_FX1l9mg|L@$5Ww6TblC_tarjzJrE_%^k;+edd!c^}}x*s=6&H zZwr0U0J2R*;qwHO20s=J4E@~T&^^Li7VGqjvy_r^uIyHlic?KY)JBXzYV!!N%_IuK zAkjdLHU*#cfp4FuXR2W^?>WpAX1VoPph7878T?fP1Kj2WzGnAijnyrCEkJP5Hk!-J z$yO{DOu((jXN6CX(n~1CM-QxwC0|HKPlX)a6)ejq$KqfRKUSa-4t_LDiO+r81!>B> zZVc#$tc?XT&{JtpuQ_*k;Tca$)*dZ{jQ-#?L;8sF6v$rL@-D$BLsI%Xog3<-k8X`k z64zk}s;(ZSqgxT5SVK3sUU)`j|8Qaq5DqQBg~M;p(f&uB`WJBct1?wnJdPK|OUPN- z+4IZdaODBfsorHy^WGGs86nlIO6L_33C1Kt(4N(U@ccZ2~1z|1jcCygEBljHm@=KGGTFhX&m zy`A}RlBIRpa4S__19e-r05*CtGB9^MHyp7)D+#)dd&F_k+4vp5h5sr8<ZOE~9>l!TZ8jt=+EB`_#(HLBp^r21oG? z?Coe6*0k4*5}R6}sH2byQ$CR(sg2K&8Qk^KrggP%%ePxK6kl>j_|4`-rt?BiT znuJq?opZPpjyC#}${%5FlcYsvs8E#5RI*bBC!m>l#|&p1V0tn80tVZ8A8#sn*FlBZ%g_U+BvwjN3L zKk2usvJcmz4t*=AaX*~t#!xEQkh7tc7?viN#|&cM!CZV!^HRKGYV#}#WjBL`X+-Mv zSZD4vJE=_5wHeL}f(>eKH2_eZGOhbLC@1g8BWb&sH_`XMMnY*ON4ZY_k`I$<(&9$x zzzbGSY^dPEFX4W_2^ppWRBH_b#ojAttb3kJ!i$&HD+J0mPu{IQJ*E>ePgv-{W5WV_ zTfW0vDy}S(fR#)^5&3+5WL2%ce!i#xd0%#J;F`eZ!te(f1LS=x#xL2l8Z=Rgm;##m zd50$J?HBWe70{0aLLxK%;}mXuDjkElD80kEpFE{Vftp+?#99>~AdRhVP-sq+vyW;W zt$mTEme&dH@H((l@BG|5Xi34F;jmN|(5@WB)Y&Y7H z2Szz3y$!Qv_HuZ#cuFohnCk-a90)Z>x$HZ4(%h4+*E&7GZ9XQ#;_IaXXhdC%n2uwy zy>R*Z1q)oXO^4Dil3BC>PBCq@@6O2gzcEfLk?d}cUR~J0h3k4zSb@*=z}~1@Q*6rg z!uIZHuPwekz|`VVl7~|a{JPH;n7nKn*f(o!oBk~h6NeF};VCb{+2=X{VQM8m1wqhb zvwXb=16x4G!Bg66X+fgJMtUV)J=>nB2#+$ihgxrO;YcW{cl!0P31eJuJpfj@{JG9y zN(Oh(Ms>8Yt(JpL*B=-*;;MS8yfRX=w+lp~5NVXOak$d0s%=Z*0>**2>XuzDr12sfCe54-!Z z)d4?XQ7{Pz5#rwljlU=5|M#Hri)ao>5d%#jK(pb5g)W8@2?@LpDEBCmKL$|*Bp6Ed zmetg2*p&uDj^NuDtKkkkewQ#|$pR5rFer}3iDGk!R`b?UtM~J(haT8owUNB#eul<= zJN(SESVS6hr8DAqk>k8ZA@?C{TMbe@v;8w4$?#z3Oe;4ar#Nvk#b~8#TP9c?IyOpr ztXh~Vevb}YUkT5$Hc3r?!R;=v0<%)$ojT0e3n;Y$5S_jDSOsIhx zX00h0QZO!buZN=dvz0nT{BQx_fIhlYTT2>YNKsN^W4pyPB#$!fOi-3T(~mR!N_f-$3ocw+mpLv!zJA=- zr_o`+uiyW-U;l5%LH;8`{ACC0KhlPzI1VqOXZihlg+8+vNy_Js-+1js@a+`9R1smZ zQ6t<>(kbV(+*^W5z@0N5Cf%oP}g~U zIjqzq6qWlmQ2bIfpD`vA(;PzjOGGG%gjL8<=jTxN5Ur)|gsxeh+G)c$V=4haVskWq zycXDt^;8g*r8Sd{8&E-j-)ZaYnI|y>7GY`WxU5?c@kPrQv&|$oP}N6`bB_1hH&xcr z&k?Wsrp=1_BEAghlbU3&^nfLRDMgB7J4$ikI;>3`XR4|wm2WbZpl!+-x&b8-)(#~h zorY3c+&I_F2hRe}4YACrj0#_aH8lWkE??G1mYtF_>o?&NFTPXL{sWR%@ffm40Y{99 zB)K|e-Zufw_}?XT0xazkKZ}ntb*xWg7$?lr>72=)OSj!U8JxRUbmFd+Y~t#>)6|Ag z)>-|iJaTWjC13iQ;J-zM&i{+bh>!8JhOuwt2WKQGl5;nsPDB;_2SiVd_J&w4pZ4x? z=so6PVpO8r>8ZiuVQJqND`E~%Q4_{NXfGWcVC7uNpk~sKvEm1)F^TVHG_bFttE{eK z8a925N1-i)uG^@F2dRAhd@@~?Z4yb@a13B zG{wjT&) z(|edom~c?V8SzAhLpl%4FA9D@0um2`Nbo5C<8#&(pYP2?HNb7B#f|Hzz}=_qwM5Xc z;^^71n5c4o<*5{eL%AnFX))NFy#t9iR4 z*xSVYKTt>Auc&$fRwe0J!;v*5*h9OW9^YiOG(&1Yf zG1uaj$RyqD)NlDGX4J^kqpOtE%BIxW?qF)-hTdQtPwz7tc7njH!LlX2-hs?AD)fOy zHFz?Y)gTU*H;Owy%&fkNeuv4Kh4IiP05?a$lc$KWGDD#?Fco)$Y~_(esa5EL+&G4` zmQ1^v<$_MV8+`Hwjfd=EGB{p1y$0X#wV(#y{*O}VG2E2k1_(pb-#P()yF~6k(%Rp2 zy;{Y_`3LZ+aStad6pKIw-E~zfk`{rXfP_MCVKukL&Ky-7Ev}Y4ypWvtr=T~o!3#2> zh$2JT2i@oWOygcm`nNx)nEF9|l#6NeMi}?YVhK6ofM${6v;^Yx*b9_279Rtikqq_J z0An0Dsr)+mB8GP7X2peLO4C<-S?6mo_p@AzK3Y}JL0oSq(zjPHK^@D$LhWfBEd!0P zKuYCJM=_;$=T`$}I|!@J5{c3U*yIRfcqr{$v!;4=A{6@Pi*k&vNl$(V|Dc%__@!-I zE%;Jy*pXi5aE_$!Xvod@y=S%c<*{)a!FD)SczsJ%EV2X5LF$_-{kjg%zh@q*W6P(l zn?|y)z~FiKlBr3Kt`~F-Tbbt2nPmB`j_eOD)VUJWTc+Cj9A!u!^a7vkf3vBn6(O28{jAJ&8igMQ-0`F=S+9^rt_(P|iA#X8ggi(b{*tF0Rttr_aMOJO60w zXYzTRk~W-BdyQ`}h3pz*|A`92)q-Y7gwiEZ1kdDAOZpDQV-z%Z2p{|~{#bjKwcW8y#D`^FDvKE#F`s)KqMRYnsm2{e~r5AN0`y*cb_0RHC zstE&BhM~st)B`1HBqw=xW5)4tt?oGZ0{9d=Z-M@L#Rj0i9(z;5YeXVd-4DdswleHB z8aUSNXA&Rjc6BWl`$nO-sDoyuca0U&N?CqZ5cVplDksWxsg!UMjQrv!Pm#UDSR7jN z?bzB>95Ry>9cRt&K*G2-_w-qC<=RFa5Ij-E7g-!-JZvI2A{8lRdti3VPRD-`p-;IS z;g^(e%ouXC;Fg4cctdUh5D6XCOhJwfeVHW3`pIVunX@#t!&k4ADps&rybNXivr_YK5cwY#L_EEp6m*7! z|EgP%C`PR*9P$kk5kHR6XfSp0eoOLr4idq@4_{URm1 z2zyd5(Aer_nwva10md}EzaOQkYN9`GT0%EwNQF;jjpE!^65eGur@~HQObpmfHuwfy zl5Z~$z7JIRuI+#^Wf?e_(JA&an8C`XW>6-DRrMKMb_Hb#?x(_c3iZRINc-YZG;bPq zNtG@g)6j3#T6*y)_P=-(?H;98zJAv1&r4Y72Vwu|QGDe6WBVnhNd6W$WdDnp@^dTv z-x)pp-xTZrx@-PlIMk0H{aLIlncE{PVt7fVGMi#SqF{mdsUe9#8}M%BPztJ9n1ZJe zk}`R4I!I3kd^v7$pYri0jf9UJy8+JsM2;_Ls>RUs%kpe-8Lus!Yq8!BWOhEmf5YlP zzA+j&QT4G@_rX_*e(YJCX0I~%rqUW&S|;PUrX1a%*3f=@?=)j;vCRXep}iP|Ec=SD z%lp%Q!8QanqujNtbbVqC>RNXg$Xb}fI~^i(I#zJH2mUS)JCO4egw8XKV{xA}-a!7u-G!C1WU6F1xNV&%6v)io4YsHhxpVdvqm+GXm) zmv%H;@u9vU+EBHB;Jtj0@QwelfY?OoXzL`4Da)0lR)klY3K9&6aFJolz05w>8ru7j zU`BDrqR%%w14Sq{k)n+ai%TFd`j7Fpuj)aZ~WL2N>z~xRD_RD17<=&x1SbD7K zwAGFj;$3qcT__BMq#0MVxK}llX;^)2jOPV7=PgBN6Bk!o1{X(e77IVFGNBfv?Kezc z<{byM@!%dkKVQw3!Uy&`ih?#N-YciS^Q5kS^lHkL(5&iW+`XOaLia0XA4lc>a+n+bP;KClcFmq#P#>wUm2qK&w zLYiiqYKEOg=ugccdqgY@S%w4$)Nyw;{)*$`+l^I&&B+`wk`?mz1F5y_&0kU^!{lsafa8L|3C(U^`;(!{~2 z&a-}XBg8@}t(W@Q$V2M!$5rMb_vAZkV9?ly{9ViTe?vz8@x=eHBF{g)_J5&qO_e#epm_E@B!Latyb_v zNzUZn%baFqD3wZQ9%p1s&OLK`zoPdGf{hPcV&t4==A2^!IghU<%r~|fXPl)~$LMfb zLGxiQDQLE^3~4chb`Ds&f*E&eR^9HV&2zzXHR{4xrM-?&b8HvH3l`2BShat| zb)JOCI0Vy^euy@A?HIMOje5W&!Mxx?FSG{Gj(su@f@dk+r$ z{fYKLGE#zFi}iv)d=1z^7)(*GGxj= zL4U|Kkg!~3oH)vpEw3t*kdn3RWQP+x zPHcyi*WBXV0ixvq<}l*ub~F3t<2%~G>PUhpT*{Q5LW&@_a7-NILI3iiGNy3zsC&Zm z_aX9ZXe}tdk76V;Y@4d*a2lg&$Dnwm#5XT}K7G;2O=fj0T zmOKv#p*C0#Im9Xvz!%N7G2alIdYKyiP&Irjn%4;fYLtG9;!?!Peb4tHQBac!fMakU`Es#q)=J9G>8&H#AySu*~q z&j%ro#3s>zn{k5xezN6*G<)5a2%63N*V>WY`~lV1niJW0dlW-w+!MKe*~ld1Hf0>! zGvsOeudfR{LbnX?SBtybQTP8Sg8gMWen?hK{pb6sk_}NH4|7gGpu`V=P0^j@m zZ{PcGH=h1kss7`={}sXfpH|y%AH3enga2cW5b@0{$VQEy*2{yB8;tqXPwBFe_))L9 zulMoey(|h>jL1elz0B#i9}j+-iwW?o-T45a^BMu81gI(0+Vs zjz)d2!({=@XQs5E*}w{T1MqIDN@AV++9EMk@pweAaeIL;R4p#$mA=b)p7lb>;mWp; zi-=bm*Bp;6y7#wcDFQF44{_?rmGo)PqOX82-Yc8S($Cs9P=iCFNL?~0`&0njF_lBI zoz8Q_H0Gn2u<=Ix%$y5Bz;lV=A$D6eW>e%C?m)bT+7@@gZpn#TPhurh`r?L@I(@hR z=Ud-T6kNt^32DX{R0-jnfcaQ{Xm`vQyA@~*Gtk1@(pFJ9J4r&gbqJv2s7~cz&Z4I& zt&d_Tf0>l-cGx`XGdccTVy2-jMX0hR-JC{eAN{QCRy47o{Efo)2Wfi0T-anAv=MXI z%|7ABPp&uvAvlriB&5jlpS5z>ObVKdZ*?;l6U-FCc8XnRN@j!Izicq~;(?UdpD7GF z&KV>TMSB)D#|p$q!;1`k!}*fkqM@yugro8{ib$;YeH3G_*VOr=z}rR6tRt>@hDLgk zH)h^XuMM*%KY$QsLi7}ZtrA`FF%VgckIZJ;Rmw5eULxu_ zF$nmvhlhP`jy^RvbZ)=Po#D2AOwOK%232^*SVue2zo}d^(Yb6sj0O`HxxRt8Jb}Kf zORc`I=Sq>3Wk_%iDG*V&eKdqp6igx2!BXpm>?<-ylfPM9Wz zG#^ifNi4mBa{8`g zc}~nc;ozyNHG9P1t*k=C5Yicsx9v^hiJ7OhkTGP_x_9!RQ*^mXyKRdFm5gexRi z=BP>aL^oiZJx%w0PCF+_Q#+8*_|j&idwbd4nn1C6#ZXb>0l zg-ofl;!hx}-{=%>=oHQd*s<(Rx5ozt4<+ot3gEMfAjeG74#W%3fbPk-isI%ija?2Y>R)8t2OJ$?$tk`GkbHlhn za1hepS6;+k$-~}yoFywqOP7BJe}NXKOm*2EK*@gd+hqSw)~o+L+5cr||1bFHU(&u> zaX}787>S$MR-l&^OQg4pg)od%#{>WXkQ1?Cu0zDXrSiGl!>;mHQ8_fX7mm@m&1Z{M z+akn|2p8KrApJ@Qtd|?^xVpHy*qvCKsJx$9@pypIhFO8-GHcZ6V3zE#;U;DX4|!e8 zE#MqiZZX$?GIh<3X82tv31@pO>`Yy&mPWpQgnJ=YU*OJpqWnVYAkG`YA-m9v)UUN*}WFeCQ4!UV^^!VR@9j1aeHN={87{iJ!VG41S<`Wti4_z|Nm zBcXF9an3?$QsO*sTlnL2SO<|wb6$T^50i-w@%fG5>ibV?AGqZ2T0cUf zC#?3;rExGW6#~?)Z$h{YO<5fvw|ly&zlHRZm}gK~M&3Sf_UzZdI~K*?JELPIwof-U zGqX?5hVbp~c%Ic$HtNyE0@l-NOg9oQ_F|RrT)X-rjs zn~W%#kYmK`X3c0YHyoO)&C~9xMd3AOLQ~QTn_V`z^h?u3OBQa3ES={UuASd&wK!Hj z=9iC?BtmUHPxhA)`{pd1FYGZ!w{syta_|7QE-6U0D;#eWa*Oi?13B`c}VdCGN6hm;yCf!=S;$VbG%}K!pbMxS`4YNkT zhtEm5#hrQ6)}&S(&r*6L<#H3`ENHhsYRlIzg(rKzT% zT<`vEu1o&MkRRwO`G1+*|01ectne%k(p7#oML7$N8Lg5jRO+O98#q+01iB6M_43sw zp!77H!cvcd4AVRsZj{VU}#?GTkSPibZN& z{X89dHK?13?c{Yyoga8e0lH_ixfG9HpXSgwsG9kM&!`<0Y4V7AtU}k`Cl*T0Bb|*J zGpT2ff{R~w2Y{zy>!JvxRg{9hIrs^IQ@Oe@e(-bw0A{XZ*h*_fn?}O`9QV{76{XKO zr;9P;;x~>u{-e6~%-73A;}X*wrs7MZEOi!hwlDuEbQ6& z2e^TLGzH7e{<={}I~$nNgokY_xd^q7BHPYZJ0qQ!AB`Qe?$&^i1?bR*$tJ0R&3-c7TXRnqgxNyX4JaIB&9^Y6Lu@9uftS#@&~kG! zR?=8DPL{J6(`dX)BaD;kMp0y}F#YI@&93B)V|Vm3g{Efe8&!6)S5O7{d#z}hdYd_W zkte6J$K}hE^n=hK%~JfH)Pv^+SG(}Oq$zuB{#gGv0s%S1NI9u{@P62jq2p;^jp0xP z3M!!xyMGek+A>I8NepSI*6xaYPaWfla`6ow5rx+ApN`4xgdj62oxnIWMja<@+Tql? zPVGp%_Bgb8i&!T$arf!#e(YKabCtVK{!@hTQ>($_us7k3Q7X*p5W-ILr+pgh7LzuI z&<8)9$CgO26?RpNb-0SX>_=<1LvGiZ>f1E!9m@rOqzjC1k8*VBw^Y~Q4jw%-By1d<%6u2X+72%C!d7R5(bkk;rmEYJzK3}*SWRdw9 zOjZF~T}w`_5GLg@-jZDp0(}L|`7+;?4wC837i~)Js<*KFs`Y}!Zw>P>=I3K0mDb>9 z%G3II4K!64fr9TD@!tTuL1CiD3S(N40iHzpEEY+9Ry^KSg?V1 z2AR|hysKG9MpKG}&F^t_wk_odFm@W6smo+aa=)OT!l1+5V5Z9@inv{{>uZ=LXBE^e z6kn}ZovEO+3F1!7K#3jS;(AVmkXK7UiG`ROfu;A) zEXb^vB9ZUyO)~^RQ^w-MsME+A*F<=X`}_PdLV;ZrlbS{UJ)?zkyxt5YBdanmL1!nK zI*$1#*|52S@d)`EzdD>#`@wi&Gx(qDF7agk)J~gqrIgb~PlFt;@~w)lYJv#2MiSbw zxUgBvfN>*$Y4^oj?Btu0az~S3X|6q|d3(iyumke2hUy<>Me6!X#}wY1wb>IgQaZC(+u*!{;n3`i@fPl!AKbj%yA!IEQ~zqn9{?;k010n*mXIiIns5VU7L1A$HOgk*)|U>RIpj_-Z}+dRH81*Z&>k? zbK}YbR3#;tc>%y#7G_;FLT-Qh{EyITxQJ?9LPeFLwdiytbSwZowRyDyrVTR`y6}wm|Tbn zXiaFn4r!odmBAquUvv>Wu~^H}&Gox+%rzjnQwg*(_@%~GgyaJK(s(TVw(*Kw7ruDlV6k%Vy6kd)_4qh~?*Ud9iVyNzE~?SrZ_rn(+1`Vi zPm8JPHWOI*sLF5CDUG`(R-Cghe%IDeMk~w$uc4A`Kd|l`%4xmC8tBdV(1Zf3TzTNX zh&Dh1HC?&pNA9Sxz@%ZtQEnlhM9rw~A-vA^O^=H$b)AQI6CNg6A)J!PukR#cO6N-u zOP9=E1=0w}^+ba*W#=%iX2bzOePFWANHt2_yA$?t=KTPAnCqwI4*#Yp!nCY!i}ROk z8)BOKRah0&R0PFcLpe(EVLB}0pKR4~IHc{G;P-?k^e|67YSfSESxgfAQUI9!lC0xw z!KSbsY&}S^E`9?tSdJLS^RH3m3Mlmi*yu=mEqPdR(e1OWs6B&G$>!*+`dBq*V@#^# zN=ryj%1cYD>lUlu_nS7sWtobNp@KS(L-}s2M6vDI@`eG1NNRtl94km=`GoddJqZb( zdtm>MynU$8Jp-kVc_=h@b~FV{PW`F3Xt zF5mj)dpa5|@-YUEWHN@xatV)Umv?D24B2RGoyDN?Z#{C?vYE>hsuQwmtc`+Myfb0h ziMG!g8&|5=0GVAgBne>~Lhl(7u-55>_!ZDnD)pyY;P%MEw6SlnKSh8Z)fQ-7nIRTgQkZ83#8HwCu4Nm+a zjK8d7c5>m7%$G@NJb*ZpN$Y!edHv!!{tz-lHRuj)JJ8C`su>{mofg~A#I&}v{Z#K8 zl@JE4MqWPP@I=X*^9_0M+v+?qtelK*rf}q=B#KAs_V1&dJf54cb$G{c(YaR%A{y(T z?e6!8J} z#y$+WT6@4r@et*QNUq9pBkgAViakDMHQ=eQQfKns|P=Ps0ql+ zZgNKV!?)xqBba-^#pg23WM(J(iH!k#0^AeRX(81?X-*}VDn~qluUDd4@D1~EHEVB{ zgS=!u-?0~;OJ^?-4^I|saDr6bD^&OYi>|N|2x%TdJGOwspC_lh8y2K1M983Ay!0_p zwdA5vNliFxC3{$KhaZ_7LO;(%&A9%YOV6^t`0DDB2>tFMj`~s)$qD@YwNz4zk_Ot? zz$vmmSS|#tXvu;LINX$e91sg%x7-Ku1UWWvQaBwjeOV$}aOAk;OfOm(0Q4lDWOQrJ zy>QotOVQy<1ac_o+KK}dU~gh5Yikxb!3SRG3g}Ztu6{|ajNRwPL^B##l@{c0#9|n* z+Cv>uufd0zA60h!%Y#&zqVUS~3*GY4Ky-yPc${hkC~Ar9_&2_V-w*M(5{e7p*?}ej zjgh83u6C2%U+G%xj9}~31wHSRbW*oQiaKUU)!SHss4^+t5K42IGJ9@hsUN%bCA2cj z11+$FXKHRXz0*o@rR`E?oi+=Sq2LDkx29jKVP$D6H{fEiM`3gNCG4@aG_0KC}qeu)nEwBFq zII|N5QRp9}{sC~FQ`1{rfB?=qN!24}**3eNwPxo|8mq-3I9WVB!m%~Vg2`_ew#KeMva}(NYU8Fm)_}ZHKddKgabT{)nIRBh% zrKLUlL#-tG@J&I{gC{lbpeFY8pi9={`W^R!*vDfJkH^=m*es9*lBFiM#c^9MEoe2GDvhf5aTjKVW}rc1lAasQ zxNzFI*hQ0C{X5eIP+qaI;(OX%7`dAC9Sat;XS09clX04dvfm!qb@`=r#hO}Y=5c){ zcE=)XL6HIk9bP26cMRVtG)!#zK)f6Qa2;7i1YvfyP}L5L57^3oXjDimQ0&!Q0^p7x z!pPiF9k=7AtsXjjvtr`8Q^@y&h~rU?gZoT^cA=zL8GWn8R^)Z91yXp~s(+rsa|;7iI-GRLI_&?fZ=8naSqufDj< z+ZPFsm&RZ>IlH?$yPa4%T_}YZ4??5+rBnbmHG;PdO4x!Jvv!s_m9Q3ji8|J#_{eXW zU!Mygu$}_&u=H{nJ%KC(@y_w0wAJ5dvqhX8pco-Pac57vrtXJ}{4i<_FZt+~tz&8oq4urGXP^o@i#9x$7C>9^C07k@rJD}q z#iDl40geTA?)Leh^`PWT+PBsF^^VXv?pEfxN%=X|N=wfrTdf@^@u_GYLz74JEi|0H z`|<1C90~6fd|wxUE1k$6uwkSwwOWNWw~o{?Ti3ex9G-?2oHXGtkg$BS+w*uqJB!c+ zKe>VupYpdha{q}o{XY}`f8s6tb>L9if64hLmU2K3BPO^gTucsS)hrkd#mqDzEs32- zUFSQfkqcoDnz3%=NK!>rgVo}U|4MqbFQBAP*gX+2P~N#pEj;jedOWvyHFLtJ4O}=@ z`Ntx&+2GLl*CG@5Ws&K=TOgwLc0sfJnniKdzhP^(-vgztrHa*M{k;$01;dnL2jWqm z$kGn?n5KlXD;zVdE4|$Do5Ma6@sFNx_|QoLLaU4S6L~z*_n=MYH>3n{#7e2PBqdzk znY#~@HfD#tpiQPzPjy<~Ve_8=!{KLCbNjz;<=Ix8}C+>tSH@Qp38!T?HCxZZW> zjnPIa5*hq2C5T4IU~p#HYE&VZ!L5DPTbZIW*4Z;PNgTFKEOylCmf#QluUBE&mt%6+Ei>CO(}r@27KLZOH~34gQjv~1~pCbN}6@%6xvmI zo?NC#=br`%E>ktv1v)8eb}J;xhuw2qjP#a11vyjUG0T@`HHkXe(+4tvpN2za`qrrR zmuC&lVFtr5lsh3~$WK2~f%jmJBok`b13SsmeikYW>Oo(IS3mw6orwdY<_R81? zuxT8D*;j9``RNVIVLi_l1|( z0RkE3UU-SM*$YuGyhPwHULr`wK^~1Pr7vgVD(lFv>6we`HU6bM+X6m{13ApP{jG=H z!bQpGMdMlxQ*|4ccin;$4SXI#gpWHLEFo*3?}BJq?Jj<9KSzB6ohLGg@5 z5$G2|t%t`8tD?q$Nqc!@)JEOa+u9>{YFiwzy zs5ccZUu>Dr@w*;h75jI>^{3#xt4E`zkA9rraTLEdVJxssZ`iE=+HT1CrP@1!^8L+k z^ZmE(@Ba=m{111ce|g~l!aY_6>yncZ4buAz;vP?-n2MSi`Na(WtQD|HqB|H`ibi;# zwz9Rf?Z#gXw{{)YHxjKt@?Yy{**S1=S>7jmez@ORc~!CjS!M@kB$GZZuLwjm7Pf1T89`*l`=~BwBZy8=P-Gc7`&V>4- z=fLwjM*omj-&ztGHzLF=zV1~xnk=X~Asqqg_||H$x0e!XE==Q8uG<{b@9OVAoNcI4!NZFkiez+uNxc#uLdEPRR!@R9*(P>eY|a>AvX#uVCwDyJ*3Mne0I~HZ=%P z`bo8yQQ&LSH#H?;g?Pn!aM2 zwR|q13}PRPc1#o$@;kG$w-2tR@X<**xJYZaEQ){1oD3PuZ^rxQ6o`4QpoAZ`;C(>n%0L;Pt*X+`aoc!O(zIU z1jy8JaX@~5U#Xi-n0tU^HM7p0NF6?pIeKoPk^bI%J96VJMSX?$sE_oZIq7npb~mP;$3CI{$2 zlE+<;M|3^{fbx7dZVALc_HBCp!13z%c!8A{6H%EgaMk`cRn-hz+3>d6QaQ0*JJN3W zjNA(!O5Q%r;g+StCP|u*sInD~S2fG-7ysCPmo)6h>I?rk*o{n#t?k@}=NJDtaIW*l zSQo@UzKj2pe~kKze@x8nUD-is@Z8#7c52uQmxUo`Ngvkp=yM?_5o+|2ap)l^TW4V~ zz|8jomM3?bz|@Y*6wRc3m}5!xhRCWM?|gP1qdd}zVa0$1Vek<9`91U^udO+oRumrl zk2E%mlSAr75ot56Hr7mLOX? z_Ih9PeB&k0U*7d~o4sFoPU8Lfy$vYOPk#$0{wJ4n|9sc~mo4TW_b&gE@gTy2HO^-c zVPRkYOFd;xn|c(czhG2gTxa0B2u7>-;0Q`ZLGPP$y64NAhK(KOaO+W8f@Bthpm@H9 ze`9lLtD*A+heTYMSeVF_c90%9I`(+D!}*HlN_k?}bBL8@gq^mJ<$2rAHagFoWq@@b zR}8P^Hlggvl9W?#hMQjlq^cz}yH7M|95)ryvS5#M$9CBwfM{95!ztf&M%2q_`IhEb z8tTCH8P~DoU0&c~xtd!uo#o@(dK(cqg_XR#`An`TaAw?@vHr2fQZ7=Nd4ys=+SHP< z@s=%HQB8abk><(n7Wk?&tt-}bPdh`Zk}qxF7vo1Mc*ptlGW zKtJW7Lp#Bvn@E&kyjQHr(64NtmsQa%?!h*B%{1`+?hq#SZ6b-JW=z0>h?jBH}JodV=AbNUZI$B8&F#LIQQ0U}~~!-w2! zQh#h0WQs=`86H+(cxSft;KEFt*@rCU(yH?WN+SP<4{|DNj%h;BMF_8jcD7=G2FEgX zw%qSGIaO#G)-|N+;v-hD;H$4{Gf~7HcSqi46IjNHny0mt+HA=hX496PR2>@@_Gm&* zrxmk=S&&bNS~Td}PA!F1EsWQaaN7$Y%c+Jrj~^dW@|H`~7L^d&t>l`A;jKKMmM7y6 zhWL`zFH%1jO8LE|tXgbYkqu9Hhwj9K^+fKt)&aKKFkFjOGT{mfHYKx09(ZPBj-?Jc zBXMbv;vz}vdmqy^8*pCNYUeG@Qh`b#UYGFIf@C#+e9=K*G#~jV&DI0v&xPnrxEMG` z1GcR}`Z^|fJjq*>t#!=h?7k-P80AwP@M6-@i)$6U?i}GVV1KwsJodMbWE0D+-n|CV zI=tOOB!bBn`ACWybV~(KUl(}SmiM9YyOYANqf|1lVD>_;P7=tgT*b_YIl4#h(Q|c3 z*Y3PHO>Sr??NZ}LiPbcokZYy8iS+yMD)m6eqk;AP@9M;9!#I3}$C4i3y|nRXk_0=J zpmhK7+jPhM-DXh7+T?FJqy6^i>E)MM|3jw#Z~fNaa;X0DTS2@E0aFV*JvpGhojHhN zVFS9n16TvifabQsz<+uK{BZ!)tf28C{LZa*_i10T>IPCZveW+?%>62Hw_tK!g5QU! zi|Q{&xc%cU4i@&;C^yOp2?;l=FJg(gsItTah;I=&4fIC_hZF1j9-lV$SznEmQ;mk2 zk)4x7)(>S%cU!ais28YW z${ZWtbWPX!JNc(7Blvo$f+o(tibAa~dbO<6_L${;%h*ys!S?4BonOkp+9%@Kz zu9oHfJ5JK7S)mE>#WoF)QA0rw>)V=Z%jfj<5fz?0i&LU=>YguXT>7RJ${Wn#9K7nf ziI?dwac<5NG2R8b$AkK<1)%N!DbD{HnxG&OGBq+Vv=sp9^y=yWO#b*A;FtaFKM#HX z&mZ|mn92PiRbU=X^95aX{tbl|N`Sz^YaWnR0aYXw7RKWU=8N*mN=J zOly`1E{XxS@4_3i%H8majLp44gm9d@_&Y?(x4D(JJfg;>%_ znw~SyGWK3!t>3%2JV_=$e|E)}nyR^bE#J<_SAmW?g8)O7g%8gySmNTssNpRx z$7W{FZEk*a<8*PO?`FA*%qE$!e`fgmUAe1lA1STGnp)F3_%glTs@CmpB!e#6oF7ki zW+CzTA{wrK2sb|?8P!}B=em-IM6pUZVti^rgX#2PgLb%tiG>=@urpx$j%|6H7$mQ@ zz?oit7s)CA#?-xa$6=?41!SLVlL%9iasT!u zgnar1&ND$FO3(4^$)bKO;y$#~c7O710GnkDcki)uI0~K>Bc6J%1s7 zUru3*jF$2_K8_!ULet z;%QJm`I7UR)0m$vx8X)?r}ZOUlJ%XhJG6v_J60i{Cc5&A>o2R zTOA|Qe|eeykUjZtKmPS$8EXqmptY^jUww6($#xLNh~@(^u`HZvs+{)B{owOD_>$b3DV zI%mPl;|hKPjfnLv?&z%d+9`|J{6WB7+pP0*R$Tz16OCk+0I}23b)o0cZL;dUzJO|` zm!y$H*lza434v<39SPvRASYz0qC)KzfWl5t>x9q8tYzt-H;z`@OXqY%aXKYHXG6K0rgtSJVQGQp-FfO6iC-h)|(%y-$Azbe=1xgbfY3W zAx+WJG=9S1ZzJEk&LuF7N6~>a^K|_ZRl zIgTqK*q=GUDxVcopTh1~?*pC~Of^Uew_uHbi^P_5u8uJw%3n;*+*ijv7ejR__AO9> zIYQb)18ay%ZK}ogx>SwGFhB*Sf7YgzK}|l>b!?vn==wf!eyX{SG@WwCQB8+p! z@(r8hb1xjBs**?!m>qmhdY*PI|ifm+qK#E*sAQ6?(N2=ZlFFc4f?r&^g zwv$xd!r?58BHP^f>0#E1w);xPcJz9i$Us;z@w!9Zoqo{`@!CgqX=M5k3=guVL@G^e z`X_!zYDHIrrW@)t>%Bzfp5PzvMxeg1a}n&9ka&ZW$v(imM7e)5m?1w%NHF5JPpHV> zj&fx)8)<7jptU^E9MqHj#d`8jV_Ghex+ZWp849Gp&)S|CH2GAq83o1PP(;w;dIR4k zEShM|wLm`=h=6n@+d$5=isT=@WflMY_GK`I{rpO#5Z5m?Gi{IQ;d9zV{jb%X_M zN}pzCNs13KafU@qjx4)k5LUgV?J-S>aOMhgj#!u`fX!1*b>z`eZq$q%jXMV2u06rI zwc(>aqkWEacUV_CIw{Q!Ps=ud~f1pmY zB1ufp?1tiJl_BM6J&pZU_6RSA+$;u!U%c`jg1Xnh_XuxxaP|e1Sz%f3Tqr+W3fB6i z!Md99v;MhYn+)jhpE13XDa)hAexBiXMk{eLAiQI=LDsSzJg_KxEpIf>2@wR{B9*k? zDzT^W>EqAh=Orzuexu=gh;8G@s&5_p?EylqtWqloHO%pvQ?`muG68tci+CDg@IBFXTk%@p*5M49Yej>m1fQXly~1k0I$?H zp_6O>%@V(iR~Q*La4&Te2(9Pr2CAE=Z+_P|{#Nb(-{;rA^o`QC09^|UkkR-5Xl_?5 zrv`faF}b4`SgZgh^wZAtn}nBbPCo&`GG1ON3!`yOBS&EiqV@)HiK6*0&JeCYLGx?i zin)BTO0W2r?UZAl9h|G3QvCQ=_T@vCn8_&^qU~_txMPJ~pX2H{`v@42y*LLFSCopuC^xU8(l+g zAevr5lB1~lk&?hy(khQ%oK6>7i|9&FG4=RuOZi(E_P0SJ@M};7k+}7Ztj+!moj(dD zXx8}U0RG|+VN^~8{j=TYv(6fgimt>asbE#oo22eTvz1W{*oQ z)Gh69L&g~g3Y*4+{AF{o{pAvS}GtCOk$wxlv%0XuB9N4rAxmDs)?+k2ViDfK|zVn1vrddae9L|Pm zXyN{B4@3x+rIYG&**XmZIl}Y4IKtO;FQWjgh{E|pD6R&s*tI~;Au7wao?8|Y+hxNn z4G8Nn*daKsRLYT53%M%wiVwJjTE{fzCy(2TN?7!ma87UswBMY6^h6P9ar_x7ck!2S*{;JRSH{KEi0(+^(u1o5pks>ZNQ0Ox z2{E(^nN=&eV_-3ONr!+Q;sG=7Iz+dR)jmrMPG>o+q>^$&QAk;l-B9^zU)T+2CVGV* zA}SyQheRa4Ym{HU_d_%0!g#N4gt4%?qd|W1&pfNpa($ZVkI?q@pBp(mIS++d6{gT_ zP&IWv2v|md@91T?XhQ>+7jbfPm5|ry)RRHj)LA?$A#b{HeNR#KDtOia zB5NY-elb(6%^;@vDpPm= znwCD&M-~+5#hwKU<9qfu-J_nV97hR!!h{2ife1yj3wF34DA z==7rEoukqEfpv+WGL}p*VdBpe3P_w+xN{^3=NHKqt5z^4zy-}Y($>6TIDxoboYURz$zJ1q z2)^DECwsQnoeS2+5`9Y0CGdm{Gs*zccR=Se$z16r86i#Wt&z)geFD!zkGATNsMdKc zWb_0^L92nVl&eqLnYYOg;wJCp^yRfHozl>8p>Cya`HmbDdRz7onqHhEyIs6&PVX|LR8#px$I#g?e)M$S#FTd~2}PiXINN`jeiBN*eRcNZ7}q2) zdio&@3$(Y|L^dj$KMV>LEAsZXHj!~3u`kSTO$kee+7$vjn*&!_AfvD=g)o}ahV$F z>DU5aKJt&kF24YB6GP%oZLZ%poDP-Ucng7#f_C556F@-R->=ILe^1rS94mP|Y>T+W zO&E;7R+yei0L}AaD5g^BC)xD%&Dp43j+EkMet~|A+w&P(EAb+F0x3)U=cN92^zmHz zdVGG6rC7GL{BAGCv}4qQ5w<~%L^|Y;EjeqqN&}4&ubOR0-_-9_jlr`p)@@w}a}v2! zGFvqS5Do9_GW2o=Rm?-lVtmkz!LOgCk8~7i7}y4oRSjXe*oNMN5A-osa#D+E11-6f zS0J#X7f@#(vgJA8t))Sc$uP1hNGktp@xfpr)}rUJFz2P7U}d+#2P9ot;?BGx8{A3) z8JeyI@|n2-FxQCUIP<bFpr!7`)}JmX@IT!9Db27xReXmwvz=FINAs*s z9fwGrka6Me|GBHn$R)#FL#Z{6Gb;!b*s59&S?WJAfv?I`2J#R&blPezjFVodD@#qX z`l+W-9`|h^m`vSjA%)NkIfgc$hfD=>(OL2--~b!D2|-Xb&Na`*xbTxoyIswgGzxbS z!}97xQNlcDO?>&C@F}_a|hG8h>qBdyZfh$wh=8A#n1N7+Y(ax!+kzYO+4JMTk%X8+2Ae%k}1}OaE`ta z;yYT@F+{;}Zlb4-^%GhMk7c6~+S}?1G%=NiN;4CqrW-9o=$6)C_@I^TwJ*>Dynq`K! zFyosPFW=~tF>MlPeMMEkGSwjIA3(Oxj&8<8yZps`)-6I%R4YX*vl z?@nKyzx^=k%CQ|0z{d<_WYj_1XY+HNSR=|Bc(E5T(`QjDq2e)Q5E?U=Dy-6!O9Hu% zI&e%v^U2rJTgki|m4dFLzjhlcZ|QMfJ-d#*u)pOO05dj0-D?l}&TD?__VHWkxPPA+ zJ{y_aTNnX=vUWggrx!~~IiLY(VG6YVRYLyy#aAl~NWIvoe=N=MM@L14OwS8$gRHg; zWR#r@zye|pbz%bKY_&2H(h5Me0pjVGk}b%o6xig=#ZNK@S()cD?8b|Jc|LQE{|awC zt<~8Ws-ln|w?W)CSVEG!^=ZY44{Pw0H<&4sdbFe=3H=7Bqw&Og(&e z^I@5gs1sa1*9`o)XX*n#5rb70qg~I1fQ!1MGK7*8T5dBz?IeYcMZ|zc>{atWUbS87 zY0hEv&2}Dx8GkBzr_OF-Gh0U*88g~Tl)-iDcOTV}^L%j+Az6l9Adk4~CD%4J@zumP zIOV;J)I((3>^yJHjlA$=q+Oa5C!#kNPLiq>lTT@w&5{e6a#NJvpPG|E+@ z9*vH>nuy1b!*R<+eFXFtZ}+>LscdR~d?JJ(uGMeqnIb!ScsMI&=Hh^w9bC4=0? zI_Rb&*Jc*ihfiFxj=h2F9{O55dW#GFN$e>IC;d5*Yv8HNJCEati7q23pcRXcQ z>Lc`$@y6lZG6C5{-T3u3r@Q6ST}qeD*qlSmN5D>ZH^Q}g)~FX!0)GBGQaGUh*{!yq zlc|o7_T_akUKWvOss~}CZ%%9XiZMn)zAItb?0x1lgR_(cjOnF2x{!fvivmb`I~mnF z>&)tp1?t$zDOS(@a_r^?b%}XO-Zvu8Z2^F!YiH{8^gR~ch8UFHAk5@Oxei!v^YfW; zQ5k#I4Uy!JrW$vvCwS1al($yU+W!goJyB)_f|P6hLCox&xJoie0v6x z0r@(jf;1auCao_@#GEXeZo4H5ov4r)*Ke0ioc?7)v?fYVJh^3x@i6a$*+k}*r+Tt$ zn%|Y#G_()jMxP&TvKfW+N&;eqKcv!A;b|^lN*UaRKF`jG;5!k6^A4lkb=8DxsAnN~ zAtLsKXarP29@}pAnM#+&pLC5o@5i`GtooDW!U4C~ZJN@v&p5c#5PmoVsn8nc3+jR4^)_w+Bp2a&OG?wR8u#6ea`v? z=&DDv8Cu2~wD<8PDEJe7pkAy-evfGQ{q0)wf72F&Vh6N~5(JupteCC;ZI@asukiwV za8F39P4iRd-S|?FWdxqL5_fmT7#d>}@;Q=DEM-bGa#kiLvYhBYd`|k45p*1<3YVY_ zJ$KOT!aJPiGIH?raQO)J)s72rgPG)$E88g_ZH;kx8+lEMk-y%4RUb?DabC0q_w&#! z{5Q$t8dDN8aeVA#=+Y2(^2gyiGoW0un3Q!)1jl?#IkuR~xYBTKlSIEZybU)aDi?ag zKrIJ1)*aIs$Y>(`68J{nP-}+_7=t-oT87XeVcLM2H(E_JU-Ss_;u>3e>lex#-47T+ z^gSQPBWFAgEISU_<~P|87C5~|wNQ%|+n0vccpv0QfaL`<B`Xh68AE4~mj+R|d)RGztdJvo;5?W-C*q(|2Kj$D)2ODcTmP>p@Dl{BU5 z@&)T7JJMFQ_@ENYYtzd87e2pubfjApUT7VCm{1FX^S2+&|9-}Onz zzYB8IQX$O)&@*QlsTn!-GYu;^47K{57595(WLH-Wsj!jb#swDgJ!^*1C1JpeqYg!k z9JQ{Ifz<7Sec3m6J%{}d0900IA+D#ltb-m{&DM#gmPwu9=FuMf4wM6^HhRaaN02AV zi}$XSby8P6cn_~1ep;V^Po;-71gQ|F)20ewvC7>3VuHxPFauwKnykRzzK?%@l>1v) zg1m{{pId&=AOGjYf0z6V_>cNTHk2J$7+9{kS3IpGNo32{6(2-E87DS6DxwLDO3jHj zwU0}k8(mMALxT7PE}Tl#Oo@4cA-m2VtGApFvD^6l;eir<8nISa+QW6`hPNAlpt@Qf=qP zD6#@RDQtE6mg#MrgyqL%1u;wDepRiaf6>;ib;V;|DLlZ}zVm`|z|QnbrAFHvQ}ukW zwnszzJwYr^&hs<1LTbVohoI>$84nIW@%1!0<2KwPuAf)hP%3QI)>6zpT4jJ1wFB~6 z_ZSawVST@DsI3cM6%(cqX**xj)tekUrIXlf?U<>2APY&Dz52k3oa+hYxmM&gQ^h{;JF5|K!boc6>k@3p#L7hP8*sic`H| zrA}Agh8SHx|ADS}^*c!OQos+tiSeSg#W6~fq2$vq_aW#IJdN1dvF9$=2~Kss0GRpU`5yXJcCB{?N#7qTQf0;+yc!{34J=R>6r9jq zBDK3s57L-(DTY=`0dC}QFg~-31>h<2BBha(3Zz(0*K0Uv6v8H4pn(;sK#EtLG z5m6@Q$JWO}x?;~E(V_i#f2*eC$6)x33vSNU+E_H8>7om>ie><7(q4wpt5O-WQbp-^ zI6-!pP~l5*r*>k-6r0fbMI46JD5M_u8V8$18f}gAjMliLHn0_2BQE*ao_8xWruyN4 zEmdgR0`$nNj!5LIQOY@D#T@-KNn1ExTB6YAUPKqAP~KG=n+Dn)%#8Lg&YU0AuOK7g z#X_k9R`f{sq(`|8JiC5jPF$+Nx+G$fuj%`<<~PBO~()z-W*B zf}q2DH=t;O4?@(PYWc|D`TRHz4GsXPYiRF=2z3*gFY;xh3k3^gto>q08j{CNy zeD3Oe0}1r07TL%-Z1XnK_TGT@wmLaNAOXvPYE*dW9M{IaH~4-nKSImvKSQfJNaNM^ zii@VpV5gHH3r@mZFNsuos#I0kRdK?iT9lvFJ!_~lCJ7HF`_`_Cs{#>@0TM(wSoH*P zIdI{Q(PLlLDQwik&67a@=a&{9d?7YJbywO#^q8w4FoC7Ea8PO5KJ*gk

_m2L6-X zNwh24B^qJ4?4#bwc3){Cl~#_^SHj5h@;xVQN*VgPN%HuVbcz?XoizIPaWs2)!_%x( zx5gi&j!J0_L%G)+X-@c?A5RK}9p>P^hz@8Ev`j>IhWRTzs;ffb;3W5Yw-x`C@aMIg z+xiLbU9p7Ty32_>55Tmaz?^_}ofti}`T)zgp9fvJu^Syufa>Y^oYutHn!t+|j_zq@ z(Wq*IP#ZrYiZ#0BXJY+OuM(!3-Kc?k-7EaQRXndsJj!+2h}yv&&#^2eE_C?wPg1}% zF;cJc;mbB=f(|bF7G@j_yu<^Vvo$kroL>|#Y2);qOh^s3CnlG!wKbr}bLE(#{NsZR zeJT{1lNXCY9qI105i6qs1#{z%>(G;00={}%MBT@$@Ip0#nl-OpuCh9@7Wo5 z2q+Y66_#=0z`G^b7-A(QmT^+%@=PbhAQp@dgh5W~U*5sUm11L|q^q$M7ljakFQJO^ z=0Z%YwKy`rK;|%NNq*^Xn0jpd0m5Aa^Y60Oi8ic`&<#u5Wd| z%rU!^toOL+Do%PP&Ul7B5!>Av95Q=%g0|~uAVtYF$w)giku-$3gf-ldmN*2uq&Yk^ zGGrFyF3#h{kl`EIO!CD$pI%5k*dLcQ{txfr;$c-WDBw|K`&+jEKd0#YJ(V6fKK#YB z|DRd*{px>?5&-~n6nZSsi{JuGC5e6?Pzr?1%mOLcDzjETdhoWotVQi$p`Lq7b{3Y4 zo?j#9+*Jm2V|g#)`$;yoec$z#rk9(iK}C@C5DKuy!gVn?s4FsIT-7t9+Vp;M=~ZzUCw=4@O9mIs3y3&j`N?cOa~DhC z@Dtw^HJvBtYB5rdn7<@64w=KlC7wcwZ)B3^fKrLq-WSaDEgbc`3xHq!g1#MTR!6^5 zX3V~F7-BepV&aZt)g)-oX5H-ok<9~K5y;jl$-wmVi#}7|eb76M`+mA)su0=v&M8}- z4RMx0NCPZO_(E#5RYP=XH>8Mj6-G%ZVs`_V{6OhlgamG%KW}lS(2T)n@6lcHQ2^DD z+swzLF-T)FYdfyBOn~JDE*7D77KY7nj_QTz$D-W(ppE;K94wUsaj+af83K6aw+1k? z4c?%bHB3-YCxd$he zwWNl%V$mjbVJh25sLNE+BEAD7?1peB3F$h}=67-y-r(uBsRy~vR$_FihL%{kahuI4KMgBPedY_ZCBwv!=Q>a%YG?+K`8Zg+MqEU_-!gg9Oz zPIArJKyGgU(Czg_g@?Okieg zO{5FPjGD@0No@~5=}5B3%33`-U7LKRgA_UM`6VRC?o&dsSEu$`;Hh)5a33G-B_s%V zf!ctbgVd=Z7@?OovtT<+O27|~mrk)RTan_u%;3m1qmph^?cjnxb9Rn!)EBLkErVOi zJmoI|Bbj{Ob|J{>P|7u^ePi?aSogNMIQV2!071E5eARO}`{|P;x{ig>@=}CGo)e^b zkmQ>xNj$x%4WxQd!;BZDP__u-QZ#Z4P4$B;883`;9#FEvtgzb|CAo%M7E@!aL2Y=^ zv27>8i0|xXT`--!%V|+}eNr#IKGt@fzOvUG4RXH?cQ75xF@1~*Czg*rU{7OZN* zQBUK?LLnO}MEF>2|5q;2P+4{KYTD|hG5JZ;pVn0#s^0#!s)Sw5=4f;3j>}pAfnUR$ zoH7(G2U{`6%L~R9ucF(vJ;q{tfsXeKrr+%WzmV8{1Myeh-$?9OQ*=z)1HF%)v8deL z#4X}4q%4)tzo$X*7=6+R?*(Ry*MWI$S2b7M#?EnT&awY<&Fw{1Ki%khmU+sD&o$!) zVH1#Q51U{kU;TgYFcgz#PLfKFu!e zRhSoH#>So85)e>%}-+i&?W^K_NABD80A`#9Hhw`42S<#Kr-blUMb5>q#z z+RAhZ@9euJD}fi&I*Qo6C_KsyGAQ32Ymg?Y;!BcLXQzVfClm>VtDl%{S#tyQ$Q& z=$4sVwnxV}ywKHrHUr5zhMy0bjfRpg^t{eZ!PQpIaBP8zX>M%p2j|3`I<9@E%=EmL zKMMpLTn?7?73Ok2JP%Fhap=}t-Fac=2)HFwxkvOab?DGJw+=?-1&2GoKbY8}4+jc;vU*dGD`L?mc+E8~35{>yr6p3k{ z*}4ENN@eKIPGB`)wUkpah=)re_NxU)t5TQZ|CY!j*j=uR$cLo?H%N%Xgo| zW1YxsPmD%MG164Fm23J5CBnen=U}0fn9@$>mJz#G5Yfu< zzUo-w`&mb>sctLhGsGIhoE+1xJGJV;tC3)7xYv%*!J8AP@e8@jBlL2m(C~h7T}+4; z&H!Fc>>?Tiy{uEL7rU-is(sQD0V60%b%;E>-?E1#L?#rLjXf-kSsqLG1q|4mT>=3s zayG_WjiqL~$qSficF}0diHQhRY%>nrWhBps<3=)vSVou}fR2^wqd2PVCH%DL!g*{w zs8uJ)eZKJCQf@ANzc6kW+8NzN?&%*Yn2O0Jr$$yKy$x&eS#HfCt=YJ72yRnqmkGI# z_wtsdB>r)Uv+1`4v+2^#-2iUrE7ptC<^enp&T|_ZS-Uc2Y}E@~Tg9)dJZ4;3u{n42 zylr-h&sj-cohI3qPb+=#wWhMR#T#xI?SekF>qF?%ynb5r%*EG9O;oD>LxK}!o&4Ia z5A2Lc7mQdH360d#YQWY;bSgT)2wM#E1PpXdN20t^9aEn(Rv?klOF2TvE&Iny1{>;n z4SlO;W=JJWqaa+WsU7}ByIj1SFh)vLonq|00g0epja+7-$?(js)#|KdxW6J(9Te0{ z=_EErqCmtKnp18D?=f<1{Or-*E)E@u{_C&=mdh`CGRK+?F}N!+YmxJdQ(OJv*!JBm zrCLO$kSo@>(eaE8tu5KxNRRG})rB{OJ`036s>VaZS*2N7=PUK9EAO|RtawR2T48XV`(~v7gU&q=<2RsgKpmNW5k>a8t$Qe zzi`oaPT@#E4NnzRx2C0k&ugma2)}>okUXg&mdb>e6?5ONPSXuxoi%KzJQ?J%dkdRw z37tsGEx{V(=>{JPyq&X_MVpx=Uaz`(f-1*h(#L;#UYq)>SV~<3OUco|JEVSm`z?{k zn5ife)9Y4E|Je~9Ei5tK3PQE+;h~$LZQXjq&;xN+baPG9viu=65>Z`d;(P_ULs2d! zmXy`ypO=IML{qB76RMwkZDjWR@pX0A?gm!#>IvS@J=8SVNk;PR`k*-|C`N|ws4IRQ zDC#b0IV&QV+?wHMq~OYIKB$snTxIx3q234guoK-<| zk*~mDbm9;<_&hE|={!X<5$=V7sHdt6P^Br@6lF}3E1_h>+@G;q#~GZB+bT^Bz&uGG z7?VgXoNAmIuhIBib0Dg9?h=oE`rRthCo#9^#BSC^RQE_#6 zHTviBjzu<_J<)#aob(gLzHB8-F(<}UMt&2l?xo!e6{_kZ#gcZW6N^-wF}&CM`z=(l zc70N$YBT&b2fTti&)y2Aod%nsuajAx&$+eAR>2w*{dlns4wZ~pP1vi)$L0>>2x+?Y zgZb|`sUI2rs)8)0@7#(C8J$1peDghGkK;CWy0a5<6*)=6j9Qb5n45ur{MgBk*>RH! zIQS55(6=7(RIP5|&?I(#ZZtCZ_>QF3M1yvL(v0Lhv5Kul2{Sm&kI zc^}PjbtmQBNB>ry&yk0L+p9MSn`19tQ{7qvuYUUg7$&3W>;ZeAIU&R}|E zIQ%slgTeA>edMbwIsu+G!#DU@4Qg+3y24H!pT69L70p>3z(8ij4eHn3D8nfy__-@3 z*VNh0f**QW(~lIvv<n8?dc2{ zfANm&aKA0~WQeW;wDdZmJ=nZTo0cjo;!LVJ+ZxbRo@7}x@uS6kH*Sl1#jsjUSJFbq z?&~?L*iubbRv-Lfky$BA@e&D_3Eu1oe|7Q{jGXaR-Y8Ag20?XKs5(p=`2p_b89T#o zhg$lmK~dp6iB0F_TKbfr7_pbxzIY`bZlrJM_B-5bg!7t-0a3N^1S2GsWvBsB&M_XT z=fk6WJh|!%v_T$N{kf!{p)0cr4;6}X3*v(a6+Ap*r&ZZ|2s`+jT1Rej3dZo2g*=Me zicZk&jjjAv%t(*X?aeoexQ7cWRb4sBN-mMfy=A6234>>NCIrl7WTsm1bH`Awlhu+7 zuDoDaSDMyv5da5Z4j)2GR2&fR5+}yN|cLQQ%pP9aBi>m(Wa+q zO=i1v7?*OCW~5mfe?jn)dqk}%I$%BBr+iVDgZSF(R1-qC^zG)Z#z@7LB5Q&+qj1Oz zBdbZfzKV0CKzi!Ou{-0$W+!cI(E;wK9Y3cN`cLTkBYV-!s(uuJq66N_3sk`$k2dCs z1$Ya)A^bIuCJ03b5{-rfsx?*A$>^(n8Lh#~M@)z0;#_Qpw1V#*=^*0^bg^HlBW4W0 z#G$VaGtOW7o-(NlL^+rqLyap2q>!q(@@;cnI3F`%@kY6`-b?3By!@b*n#wu;U_0$B z{Y<^oum1|~nDvrysqBiy=6*?9otN*;Ddsy!^zHZ=-t3P z5_Ex4f;XtDIbap!ly^G#_(AC!!CNijnj!jjo}?oY_$Bt>E4kqiRQ@}3f$`o8cE#!* zDRye_V1cgQUOugSJamEn>@#OXD72xx1MA|B?(WC;tkmAAI6_+@XAEiZQMsn)B}xJ> z>4NDLcq`rg1RmlS9wH1=P%9`fxxq*rtaURZ2WP52?e(!Pa~}4dNI#KAn+drVcT7fZ zGuzJV--g}$>%*^yyX=nB=b8;J?mo&E3w(W(+?@3V`0dt*UnzE8+hCu=`7dc>yu_Ck z_}E#_A%aomg%D#~qD~RNirOcccSNd?&2EA5M?f-HTjzXY@X^*E3Ck6 zawCkuA1dm$Ai|&Kz|J5h$ynyVw5ULjK(1wC??AalOs>JPeWJ7G2 z!E!@(mzk4!=`{4V8S(4G@j-6Huoml|FhiKOj*_UJY;<$eLvnx_so^?fbxY8svw&#B zVnfF#fglMR*gUU-_*w)1yOh8>kZcCfeUJr>)ZIHZ zzILnu7r?vREY0W;vT}XAr)k z@=A~o00>{~Zgtdi6cA0>Zb?u*GLBakka?Nz29V06@>arb1k`gU5H6YSSP+Lql}lI< zF4-7Gux4>ELC6ga*n9TCW%3O+5QntD39tnkP!Eu1RWLzlqqNz$3GilFlNHE~(^?*1 z#fDxiqjt^m%V?0(q(COnW<#(}_zh5N@-DCq5t`O2u)yvz$WFu!t4DaZj4Y%%HCw{73)=&X?`yC> zO?-ekB~k2zVKl?roSZ@M#QIbh>`vO)j_LUW^rMHTdeWN}CDV4l=?fg-t>_Jv^ggL2 z(e&cMGT~X1t>xY40JNbu=A`+Js{ry^^Nb;Zys`N3(M)T~yC6>4OnQx+41Sm;{Dc)F z%Fhrwh1l*%8NRqyV{>{z{1bA5;Po0cyY6f};7h&heyg8hryZ zvY}5nrl;!>*^|U35mAS#xRSU++^eMo`{dT(mhi+c!Pva;tRkfOqTE6=d=1(QpK(+0 zX%Mv|S`y!h@ae=DC1m(Yqy1eyT3;wa`p{hCWbbXhnoNl$JGAt;^SU=mp4F0b7db zPZctuYzlF2km?+eTf?i5`?zy7y7MB^WBS{E>w`gKRlca8#l?sjse~Zu%j2-wXH? zLR|T}`37IV`NQV7uy()X&d>E?n&M}^6%FI9E z72wB@2`QJJu}WcG4?MDG1MdVsGo4c9uz3;knm=JfO2^Hhs+=}omUJO2PTF5YS-!HP zTJIN|VN_F1kzlZqE6mvY@creh_C^me7x?^CDGiy-%sZI*y8O5e&e$c^?RUF{`GR&( zMxQX>Jqofl5y`E(;&a86Pd{xS-B%92oD(n1Af<<)O8&IsB12xr@o!&mMy<_D1B=ZZ zOqo0i<)3(Ils+a#w8u6*6Fj&e*T=_@kiFrV$7y`oa%iIl8=#nIo;uXRHwsmLA7T#8 z)3g&xAa2ZIBZmpkW?(%Kr3u&49$$3Ib3r>!nK~jq=e+LmqA)Ld*?O@0U0gwa=NSG{ zIz}1&jNzGkK4m2P+Dn9Qk75~51Rh62Pndw{#_sco!kjGCsSX1_I`VZJt6V!CV)kSE zk&Z|}S##Rcf!hv_!ttE=X`ti2C#tpQbe4%OuKJ=l+eFA^LyBlyp5-y|`z_8&3tl5{N+G&{F`ejhUtwIxU1Xjt3lfp_>`f!IUs z6HcQ)bxOV-;|Z4-sxHX1m5Q8J->{Azo27hOi}rx<@pFv2DGxDD>0!^SO4R{kZn%}I z>4p=bp@&CLAN*L9Mxr$Sr@8WwX#<`x4$o-IYPhN?2spKIL%*TAzOo&Tx`pVomNN7_ zh9sG62F%zf-YotZBtA;Ne3!lg<%bMTMR>x*%qbNVf@tX?n4cCF_*}rcFyxe7a^vV2QAQTO=+H%cQfBz^V;X%)AVUK)3by|J7B+`c;f8+j zQC2rvtSP%}L7M6NK=)5r4aKmqWZI^)a&_YEBz11`$Q%+3tjh-VS_MfrF;o0Fq!u6~ z%V;R3^}=9eTS>8?G027Dmn-QP4<;|%v;)e=L-Q;WCDSI#2;^20YVrkoF{$6j?=N~# zH%;o*2=mBwSJ)_l&qmndhV2B*7ftF_NawfPAf|0uY*HQ^gYP3#w7w0eu~VAFXw2ZE zcxTZAm=b6uY|UvrhE?2SX)wt2i@PMhTLRH0i6e?_{~>IARod{+;walB)Z!4ahv)aWEm z60f58l{JRZ3oD!-+_ZH#QE4TX%_^IAcb>Xdb|G9C#g&%{^?D9VyR0qZ~!boPC zl2cXqr4U$ZOf*2o2_QcV;FpY$ui?+))dHimam)y8pdkd@O7^gw>L-(=n zzeH)gM+ix-ASTKeh)@|?|Asi#4|fST+&MF5QcbLqqIv`Iq0k2q8|EmyqRgqCX3J8& zLD)l~t2cbO7O5!dEwDpl zu{z{%N65HJHPI3HnUFq(m!n)INpImDVGiQ6W|t?2I{~JLFQ{t-!vm`+neVgUe41*X zeP)J!RNv8f_!H;QyB><{jw6*Mg>?%QwAT(!4~5qZ=YB zPU7nEFXF$-cXh@)Hl}!(ajm_7`9L3)sbHA!JgjtPTPSQJi#AaJ)U=&o{9S$2 z`6mpE-|F(;lO{PwOKS&JSD-xTuQAhqD+O%;x}>2gBj@PC0nBL_3beX}lt5F|QItjC z!6?(Cq@)eAmRDtc4&6QKe3pf`;->rh`hM|phCSV}Xj5a4LIhp+#aE6pW>?4 zBdu}`SeH1m8&5NfPkAd(vlu$clE1iU{#>y=%stm1ybbHL&uk-1yM6j}jyR$qwuI52 zvcU7LJt`Zs}|`z<4LkJ_o<{xnFZ{Wl@>~P{W^MZ)#qyd0A3yfo}db5 zz?)knma>pHj+xJl3o%&&aIghdIE_d<+*m4OILA=4q)QjWs+)k2_2pB9y-XEPG0g1` zmS*+c+@0nQymTX!B8EoZlh*T3tkEx9uihBW7$w^{TMh8TR#}Yr|_d%0i`{<{b z5f^k9ECXFVp@g`f!WaYKcqWV+sHHUzXrEF2#f&XbZgDN96kp}IgeVi`7s|9QPt2Ur zZWZXgC^PJO#s?D5D3bISp4cOFUv{8}%-pV#M=faS_~jOVJH;Je3`z|FXSW#8e|Mm?|M7wP%jQec+1NzH#Nn4#52&X3Z#^3t zRDSazUW=OmZYb1h{dfiZ_59pOf+liOXb45L`3rZ8t4tt6LB71xldedmJ&oZ`6JdpJJ2wiH^cG;7rZFV=hL93>zQX~Y zNJmIf6b-adP9&BV^voh$Cg)mE0$J$e`af=DOwt74#hM?3tKoPD%p6#24_CjPl|ouE z(`Wm@H!P4BX+U>LpIS4iT6z^6c4sR>91m2@nP|`NblJep0Ru-QfSa@!KW!HkUM>C#aSwH z=d2W9uK6zUjaDSGP=%QuAvx8t*o*vxe;PNlEOu8`op&>LZu*vOGuw5cNSou)lI|Ks znwg*Y4C?SQ6p;dF%ax}lk`~8xkeo;*D#@bgXxVV`mEE>Qgq8oD35IPE(UkQlDM2E^ zN~_v4j)$OuZo9ZMfkzc}XMmqm+GQ4-8bO?Nnye6TH#G>)ABXfrtaX;!%Z()Zv@60lv*Fe^zH4{ zMdpc57?eK|kSNs2;`vhRz5+hjK4>WO-GCUusNXU~)4A1lyG^)oyP)J?*hn@IXL!$Y z&=LjtG2rW<%aBbA?ds6xwhTXDjAkkObKp8Loo0$jZFAy_Ajf*kGr?*eV1TXGxnQ7G zcAH_UFpCodJRlpdH)DSGqmJRuXPuNV^YdX{VaqXZW`pW~2oW}nM!scs1zSg-4t*E@ zZsTg|C9E-#>devF`WrGlbSR`61}q>owFR@iq8PUD155W>T=lM1A7zXrg+j#8BpYMurHvp&(DY--nGVuC4;MR$?*?|W@!xEE69&A% zK`{s7xN;Fa}YD+R9B zjUHvw&2cJlcs6PEdfh1O=+0yEa)OQscB(#HxsZC{oY0T<$2(Fa%}=g{^Rbv^%B{Wk z!8#@R$?nCHp=YJ=#*<6fcl%2Hkchf8SkoaSPubOfZxi{mhX>^6QWz_4eAtGgMPBEC z<1d0~Jmm4(BrscV|82H5`QM%_^$)+a(f^jF|NU_N=NJA24Akru(OHmlzx8xfgI!W? z@Bw+I>K8A_DXOU7KZeebu?)yMHUahQtMbd@_nN>=WMZ)&{@^8Jl;ut^jb3+kdOnV38b;RgSvEsrmCDaHR9hdC%Bg zq%_l}WC#3f{%5w>M+}p$y*?3*FgKS`eD4Yo@2S|qNTr#ovqF^N9i58OoGxnq{4^LK zp;Uu`8{G0;e2@zStGBMv-QDinL+<%kjgTX(96Y?74EbiZcb7`v#jxbIot8rH)5#<+ zb-i^bk-(K7W6HXgP@b(`8h0?WL-Qj)tRizRCF(Mp&?=)71w|#S1hcSB*tZka#m;Ck zJ0zZ=9t^Hld^*LH!#w~E`ZzW@Q!w;J^keJD=NEr#Zi9hRX0==UJ&g=>ATA*p-Yu-{ z=__D2*J5{qPU}x?-$`1~t#iZAD9flCMb{kJ!FsRweJg4SG)NNrW)s&hH5d&hPi8Pk z1VSlxyPFw|42W4k3?zDIiyHBNWC`jvL;Zm3e6T_HUiW?EmduBfj3>B#p~4x+Xe)*~ zSgiAGkhqJZSPzLQg&u(E4%3GRRa)TT!D!AD&IR5d@^V6KVR!HjcR1>=KIS+UC(Tc- z$?#u^@_M12jPtON}S(;^GEWhW}O$1J4f7GUl)5N5#$B%F)5{uLJdGT~Za1)fGX0)kw11 zsw=bpqJEUWL2|o6$o~;A87@PXAFAdYZ@_sLJCvEWI(XV?^rjA(KPeU<9H4f{-w-}6 znx7YubC$K3k>dz;`|JJya%?QSLEea#LGf|aj?#}cwGf%LjFlk;PgYW}ZXoHHa!A*{ zSYvSZRUqPSLvcT?I?kxcTIlkm-kTBnTP$YgqQcAZ>j)O^_!5N`^2mo zY@Y|$(5;-AxY0%0;Owdj&}ZfiJSb%SandWkWEk3cKS?dusjNwY*3?c(giXMt>j=nF z^WFM+sRrQrQqevu5upk69?J0#HRlH^^;(5#V(PK(JtJnSV*n&!iD3p|m#Y zqnjVQy_vW~6icf*2#c;C-A(y@%goVIe;h1m{hCH?#cY3rndMuWeDY-__CPE1t8R%t zRKil2%4!m*9(BOBBIkspqwU_o%X#P^pz_@N(*zuky60_Z8= zhD>M0>~LPDCthwxw0S|)pQiQlJh26}?r311auHJ#-_*TES}yckUamQn^->6IV*cL1 z;(zaB1`G;wXZL?kw*NUuDpW>*Hh#d-plv2IfWkiTlF=-ow)Vj~Sox16_Q4yw*9WFZz~3rl>NVxoWKM=lwOGN`Wr_w|m$Pid+`_0m^;x#Pe_H zD-^2!TYf#_`OVd;4gk6s_e5Yzyzsjv9w5y{1SGjLMvVC0t-y3+b5fZwdQ!R$3w@$u zy#+0YU&RnGNLGh;tO`>Kgz8;t8B~gv7qy{#lspmk$&hKAs3y|Srco4lBhOB|WuLeY z_2w&VnOySR#K<@sBGOWoIucTK^JA>VxvAV^G`BKL|FBarO(TL^m8|i~VeIWwh>W*j zmmjYCe&jRtAai8p9fp+|up2f!UO7C`uW^f{)R9;F5OIKVD<-TB^r?k@6?*DC7A->YLFO5-7n2HeY3wl_1bFn zkZ$IQ*@xLEEtEf_^`4iUui3Bc9`Dp&TYH6~CB#P)T}VrRrSSO_Onp#wdUqNFLQCul z=~w2dvYxXX1O`&Y-*&^P|0MJL?uP#&HvUhR?&QCTv#JjN9TEM{m;O@J0p)b|K>3oR z!yh)ge?9&qUyc2tsuN85@)5WeXwIiWlXnwV|$Wc~7qc#Z*^wrC`%5faG-&?+8G6da#OgC-4;O@R0YUOLKF9``{s&)$5np3l_^Xatws+uKPm0&=> z(DbB8!`@X?0?h>jJESF_8=W83rn~7$3|4s!R~Lg8J~Kd{I7EWl zK2LQw(}@y?{=Vy{{ZT#9CS{2Ho9mn~%BobM**Y4s(Mu(%#_ z$Cvq$DrU@l9~+nkdMpy94SWV+z36k{)|3&Uts>XCFP1!7ba%_trUguu^wtl&n33MO zQTLFBB=W_l_UOI^v`MS=KZEE$HCZrKILb9Ghv3fIDg|P+`o8~}dop#2GhQT1$Zo_* zwrWycD;6<=?K3UITkXY)Z6jX>5F0K23XXCUnh?x?%PMkp0r*zIep-m5`?HOg15_|= zao~tLtQZ5h<!#=>Un1AW9?#A)R?<3}ztA0RFYe*j z12DBs)LH-E#y(6g4L9$Ag>>+5dAk1yf%~hF{*pBP<+$-jA^j^U{u>VWXY2W25d(C> z^j{`Y;a0(z6k*qXt$d6#r{i`O7I@FUThHHH3MNuD{zMG;(#}>a{-~b({b=Dy-_7{r zOmnlc+dM}VJ0@DbV_>qK6>zJ7Y|5!U?L8?#tSnmVx(-EDs zo3Vc;u6;=_`yln+)RG-b2alY{>h^m&4nf(_4(E2&;l0?;)FTbovCc zt7>kc{Tihr#aHMT@37~d!ft7kz;|bvQ<(hqQ7TmV92ZYBq>8|SX>vfC20PVTW~51+ zGueI5njq_&#AOO??5{L=r}`T-FyMF$pu3*RGx8LkL-+;+4R)E?XLh?u%Znz(lYFH} z6u!e8@%;h~7=D2U9zf6_H12@CI2UmU(LrD4HHMF+Ybr_13%-!sKdI8Icq0?Nb^!Zh` zr%gn^))s_|2hq!+Wr!z?PRq5HQr&e-6b;v_HBvFO&~tp+u|TirvnH$nSnp^I(GgT7 ztn-Frg=g_~v{&R9-X+^z5Amwlm5IRABdQq=X=PNdEC}RH&MRT2zqzEAKuR0k7^>-s zsc#G!CNnVS#yhtFLSqc2$xzen-dZIFb?sY6z(!8$Zl?0ne1^ShBc$n()D~RI5{A=f z>8iY*GAFV)$G$(_jS?Py;ohIDU>jNs3$c?=Q!c%8gZe4=koo{T{f%XLUGs9`?kl#KY9vix<&BX4kCIx^#=c zyul>yMD!fZ3Mf#xGD|zI0jx>8;7!x%;|IH$ey{8s=5bEn*28$UFrV{9fmzvC4RNah zi=cyNj{ud2YF>!$=7vV^$JZWbBiDX6M;0e!`bg#|qh*AHkHZr3K3cSzOr(gnF#;lK%`{g1sE$dVl(9NuzJa>%x&XYkdV21O8Ki~&^RkauCHmxT(7 zt(+0)y>miT$Nkvhd;CaZ{s(AYsriBtEj&9osgx0HJA-)ekk)cWKZ7JMY_?@W!R^g8 zGjYZ2MeV$dA0$zca)JHC*H?Ks$-e#UQR`9u*qOi0Cb*$&6Dq%G!1P_va1GIMwJ03WMft( zo~ZD#bnE5ZPKfoX#i!BKi7139nwkEu=w7H$@EF6GLrhaTpQ=S66OCG{WgvNvUGwF@ zwVzkazNl^O;5>|ubJ_Xk8-enf<&4M!*S=h~)z=P<^Dg={3qig{jZLuiw3!i21B!d% zEJL<$?fF}vp6xh2KmVLas)RR)XHrfU0~PO^&?XLo>-v3!R+tG^Y#$Nm3o zKgEolfpSR;$A9fRe><5AjPHqlyA`ELbEbnN)FD3ycSI-22g*>T3ZZrzoZVMvhblX2 zI{?05Tb9D2qFX^o8@BggMw|!$6*3GG!pUK_TpkyG!N$9zyI+2h-S**43DRDegZykb z9vA6nUZ0&3Xc&*vbq`q!b9Pp_9VjW|K6^Krn_4dqKcs&8DhIfo0IcU?u4Uv22)xS@ zMJrFUR$XWYc#KswLk(1Oqdo;wi6TAB8IhA2igkZDQ(RtWI)Kj!peqlj?d|Q-98ij- z{=ot-d$JDZvqmehVzyvMv|h!3?yCv3dltz&Plz1&YiKZoh3-)?RCMDQslSLN&4^Xu+JQ1tVmpD&<0ok@*4@|m5Jc^sa_oLs z{9|@tZsKC@;sU(m{MW?`4XS@!wiT|3jb%t6WxO=2rL;F7M@Y$G%BiE2tcdMsNvKRq zvw*j4pYlshViJ;?4e)#FKIt+UGJ~w@=DU?UfzHG(|EFijZh^0`{Df_KnAWuKG{46y z>^Q`Psf8sBD;CY?f8exQRGe|x8@^5@hD?5vlq&=Xj571zO zS$TZwYxA)&ggqV&Sv^TYtg#ebiQ;w4W30Z6DC)jyIdjOPiO-IiL|{A3!JRD z2AS~Xqvk;lWo|w_WVX4e9FweH3XL>+-%^eu_gjzz=xCQf$o6F0ti0FX(FezYba`%DYv)e1AW5e@d&7M=Ud>1Io4?wmTgos z9T0!o+=2)VYq8a7Yh*MFViOg&wkqTZs{dfSdKsK|1j*gP3AvSzkQC`ALvzBbe@Jja z!AjU7b-2=6`ff${V1R5FT8w9hgSH@l7z)=^w0zbx@~|n}YO?T*b(5-WQu^XH1#g-V327+jsXF|*>v!Sl0#w68B8ZJ;*4XF?Di%6fI{JX&_O%`yH#IXRQiLd`SN2n3O~>? zS46L$Lx*T4X;R5k;g;7Sn=D|UB2H}R>^tL@JEE5t_e1<~j^3_M?~vePir(&z%^l3e zrW|C}$)CN?sdZl+9~h>s_&N3_!7%dXFs6a%syy))E$u;(O9Xg%q#1Bq@VS+CX6 zac~2aj=ToUtX}K(zLYZaKV`vUr}`oi;)dVMO(^pM>-2)@g6+#vZnl>{ZFZV_YM(Fp zw;DEJM;bdpcj2)^^vfh{B2qs$%99kw=8BeT$qb_+eYm-hjhjmme=%iVhVCsqe_`PS zQmgldS4PW{`XS#LzHaWV#Vpgri`ehZR~|2RH98tjNvtCr?38{Qiw#OEWBU%9a~bVK zoz!Qz%%6Te*D?T7~Rn?=PYjBk?TNlGT7LB+>HWWI)QLF zg8>VBtHt+i=AD|4E$^V)&-_NkzcyEcI{>0%-4mO>ePC1R=zOyhv%W*Mp2%M7GAZfC zwlRfnkZWhmULk#Rydm!$&H-P~j!ZD(ZiTk5s^d0Ad_~bSO2-*gdOTXVF4+_NSjIN% z2%lDx8-Ow{>%$v!|M37ZdrHsBzWqFEg&<0Iu5bF0?dN#h`{ejOo8orU=?j7qzFQsN z&7A4sF3a?<6^-Eh;w_>0#W>ELRrtLFe*B-3)qMUBac>!x=ejhB;_mJQcbDK0+$Fd} zaDqc{_n^ToxVtB~ySux)dywcQ^9K_?xf z0CFxdIb$zlYr1K9U{&dNu86Im!_sjUdwA67c*#izktqxn=pqhjc%k~jnkAXQ-U%He zNl5Za?fSxrcXKlu3!*)T8F_s=QHj+WOsX!0Z3RUWb-8=1 zPq(D?d@O8|guzFlG567`q@#}DjIG&T1g;moQfRtbhl(!Lh^4n>6t1AU`ClJp;0n$A zLI6JQf6I0M5jprK&->Rx?af-{zvOuQ*NOPwS0|PWK-=1T#K&1W6|{naQQu&Ii&zI% zl5F#2jgO*^3kTi;kbDu>vXPu7&_Xl{X$44Dck6G{K9AlK>b3$q2j&AZ2mVD4_C)?o z4)**-4t8=7XkQ6a;7FB%owQn zrJ8y(pb_}~<(n2@fim&BK#`UxZbCki|WgoMpOC-+u`6ON~BV;APE0ic#x2$m+{~w z(kZk31F?s7i%Wi^efJ4bvMHNFyCt#2+|O+oTrUAkDSx$|VHB50eS3M+a%Rqtvf+yN z7qio2)V0;N$1PulxlmM~1>vOHD<)JmT4<^&YeK~j`_R~<%K_0akQ!2pQUUf8`k}_t zd#$BoVx;Y7-c7hUgQ#4whQX8DUCc#>V`KnkkP5&$mz{ck_%+$IO%lDXj&wNp?kQ2$ zfMEaI(b`Pz#%SH;`ND=}bV{9@$obP@Xk+YZa`u6{Br6^CD~<;!G^otD3_9`+QRBZ3g1eE78{LF^kwNh5?3U7@<4 zT4v$ul;^fr2HlSvESLQbiU2?xN|s<_qOxWLLn3PHs(M_1`7$l-b^ox>0>tCn2(n^W z_APg&${`odl^pS_Bwz@MOP7eubYRa|8t3ZQ&P`XGyTS1=2Z6WTsT7c6h;rQhdW+*Y zn$|m9C@QH&if3Ox9%5sPs0Hco{j7vfl|;iGwYW)TJmn(-jQCvh(5XSMcer{p<@3Y4 z*K0Y^JNJmS%Ijm6_x4rIcqZBRj8(LXq_k!Zf*2lopD{wr`tL;+7~kUtG{i#StaU3} zH?_Z}$*L`LeRSzIxgAw;v zLDG|8Zs4JZlO!|~wwa!`jSaZCF^)`etq+W4O$1E$J6p| zGpA=mMLBGIl%$zg^&U<)ap7ywOqQG-ItYZ?rUo)UetTaowsnP5RHcrsx0H0SYnz2? zQgoPa<(C%{Etk<0@Vb8XX99mzevmpCn$}?cwri(W^xLG?Wy9Jv1cUN= zV@P^|TijO^MjkE?4FFJh@mm!Bk)QAXzPA1I2L3aknojt{3czkx3LFskgD|LJ5Pirg z3P2Mf3Yp`=&bMVYh_sMHe}*9?CB<+T;4eBzWtCA<_)4D~aLRf6z!y=zbs5U<1>Dq4 z6F4e_dPxfB@(JangNo2C-6o2X{wP*+9|gdIq%t0_{n~hxRq^l5qwAO=9lS`-(yX_AuDH^4Jxj>wPP1DE^hp3*{NB=6^^dEQ>VL~vkp9o~#cOIez$mggz^D}q9TQ1j z0a-~Pm)i3(v*J^gv4S34OX9Z^X>FM5REb3*fPR+fZ#S`(qeXIQ2@AhtP z3rT+&{;5-co%nu>#rjVqii23gymo9dAPmYbhBx%lwV}?0{9J zPawW+j4+-^4_^$*PzfZ9ZF??d3@TDIi4&y#>y-Pwt_I`JV5t!{y7pW6r>>fH^VXel z{GB6nU4WyQbz*zf75vC-ETN4NUv`5@qzlmrb!e%D%lQvG!Ntr?JzTJdL9yP}qhACj zC?YPIKOOv{wz)Be~!ypS1yxJ z3s01l7N;iLa{tH%JaH)qQ!Sq1W@kR>TWmvzNQFi6jd>A7vqtU(jTp0N$%6GnP~Yxg z%d(=)mxXiBSJOG@n2_iFjs{NJJTZp)K;rfa6cQOEX5j#eaE9x z@J@-F4-=Wo6+c~u1KTmQ{H2heY$vuPJ3qmSqOM`9{1j1UMx~}@sX~?{F?UxqRX7KD ziw$>J=0?ZC7_I8BkOMr$Ha*awzSF?=uLjn_s9uMeS03@Z)441n#&zn37JwF$lBtSB zn$dz9)Xk$k%S>`?^y`1`RLA@t;DYA{eCsWj9(bA971PlVtp^0m6QiOB<+JYC1_j~_ zRN7_)Cb|f$3gk67j^116jno~rHplV=U*;8#tJ7slCV>?Mji=kS7{aW8_bp$4gA^pBO}>2;S(uZ49>AZ)FG!2gJ4lz{mI}Ny>ytNIerQuF>q)@GJNR3z;~!1D|MBYo_s5Wb zsU}|k?Y~Qq5i>J(_)nI)R9RDTQUHx_k%n%a7!w_E1(KT~+|3>QDN5r=K9H-4nMi$L zf<2|*3hPmoYcq@mkP3FE5MdJYBWH5RACkb1eb*f@@D6W1uBNvFRe+#_W zARNCR2DOUTj0V=fZSSkC`JPN?+2M32s`&sdDKxD%{Y(`xYJrx~vw9yArB(wJ$UWC? zJf+=eJXjA6=5?&4#Nm`SS;ayO5pT>x6cOo{Q4N`=E=FA6#RmOFt%v@-#e&m@rOdL& zh@-2*@heK75By_3*un!38uJ|(fuB_Bw8aJl)&@#OKG!Q#Fk;x1NF>~s)&D5AgIaM4 z!#Ixpq8Ajaosd*>n=EsJ&%ST|o|6J#qgli`b)-Y;F0x55qkWLWcT^0CIdAOY=L-QM zjy;*RPNfJTxB5-pfIa3AEE+bz1OBA_i6=)dLO_y$<-^*Ml#aJ~QSmrR)FXJ~7Y1 zkp^oEm5)D;x>=bbD1w+>4JU!1adr!&P+}GzR0>gqjoaML>Qn~Ul9WPen-~zb4@~1OdezsPJ|$B zRS841t;Ll*U80t}YWVL5|i*weeFNAU-S8|F@x`h=f=lM=m((2|=kg%Rd( z<&sEW*(f{hVDX)kFdVTRy`-q+KnbA;bGV0DJf&?{Uav5hyCQb<`>=R1AuXIw8!GIoSR$ z4X;+o4<{5SFYk-4gKPPHN6+ql@%yDXytoe(ZGh`5tiY)M zly7~rN+wpQcB%k$O-a9HlKx0u`5)E&tx8)N*cn+GSvmY$DgUdX9!_|>4e1@F3eYIY zauz`oR)B>m&RPP`q|Ab6k6klhaez#$N}V5)#k~VsAzH+CZfF+hVQk=ED@MD{L_TtFsb3fMXr?QGfogb{XT4cOd zMi$)L1<}0vO}h&_Ty#7vWS7a9^{g>VLnVk|z{I3Khm#aeI4 zpbUvS^Ak-k8pyN3XGcJ)m~Q$1^Nf?l=bPz*wo>-=%>TmZd>wnZWidADz&sp(2g z;Hm-gN>JYVc*wYgFL&0^wYi8iY{wp7%)2IN8RZa*0c3U-_hS|_A*=!}o}n17?waOn z#?Pyh5>F;P9pTCn;uSX@W{{%I$RZu-1!M*|{pJELVK% z2zxh0%DsbPgXwxe1apg&Wh~(gl>{0u(_JeM&TZu{?TEMYi6R5GVH3&cgMVI9G;3Dh zu0O>NKHrb}jvBP_*s8*Yo|*v`lL)hR)2@=$cdR)9Ta&pPOrFSZ2Z+Qd>9iwv-eI`OAj zk`H{4B8oWkit1&ibJIGL#HQ&wDb<(W&-km_!yl-~$SEbBd`w|h$os@iEDLU$N~VvD zCJtUZxYJ^Kd z&ez1v(1+sx&{E7lo-MKU8qFG{h_n}!bXHi-eCQX^v5~KfbODsPQ^bhI{PJN)1n6u3 zZw@<6c?{aibr2CJ=rKtfR6b?o`6o9E`jm=|wNyT?Xn8I7+bwmrPu| zF^ohoXc=nWa6^4|A}~qk^0>UFWgt(C@9HnB_UOuvR>W~R%_~4m^u#Al_0BaN=Jmlv z1=nh4R)JkCZWG?qi361s z(Pmfk>1V8F12I@sqo2&<&NKORHXV}=+L%ITOM)d-_IV~^CmDx%McnVam^?eBrCDsb zPqD;)b$Y*n3Q;nE=^&nV__83#KBm1A_#0Ctuz()ETyx!k+<68faET)YV=&N6Eh?6% z9w{`I2+-jy^mj2mS_xZVpL5bRVh~h`HZm~sm^3#|aRe{a8Y6!tz-?Fkyfx!B_kfyYJDMR+S#(^}-8B_oXCiHPZ~9#<$f0zPPIRA+@yVgJiet8lX-Zm54?3JfcD)BtLD1Qx zrl1FP+4JeJe*KJXo}l><0R2?hZ~Lh~V$u}>_XdD)I~jd53n5b@gU_l)W+tX@OT2&D zssGBP|E-I#TG@|{tpOe=MuQ<$pF*Jx{q`>FBT+z6VaGxe2Py@s+m>zCzsVv}Su?`{ zOuF9suQT4=7TTA$;Gf+BCcIz9UD;L%V&ogPPJO>dM6`rM02zlWJyGM8TS3cKQVU-% zwteLFvl*V&#R`2}7H4_wS%oY|!||{>4+Nya5CahIf<^=$=!4LNp30ezNworegB7CQ*kIWVBLe}XL!ht3^C8)}i)s84_^G%r0~ z=Nb^nsT8H1Rb>)tyys7ggmLq6upYrsDx9HLj|u__0jJgX(|3_glx=A7P9Hwd2cJc` z;|;`Xzs>Vw$V-bn$@HHFYwWJDWu1`?H`MGdLLE@`QjvufPrp&M!qN4&d^=bm#*&oD z-Trl6KyrMPH^*#nILI5vvC=X#!7hm0%iM!8EjgJl9+g+vb{5=ZG|_+liF8>01rwA8 zEyI`rLNfLnnYE~0ir{xvlGH-4&Ie59__M?uC)ckqR^L1YDY%;pzcqc;#O%|x{dF0) z#nsPU=LUWMJiUbnUZ8J`ux0k_#Q~^?AyA`Cm5YPDh8Q;ZLam8l?1I= z00!4p8YWCB?yZsu)H1K+w_IqW`)O!4nqBNRrvP^_@x2@3XIgt9@<)vqpQ02o;`EQFuItQ!CrQx1R;W{vbFP)lw$qV~D>z{){kIWt>O^ZE0ZU`< zaW5XeVOZw-LY7CHq|)$ZQ)pH%e(JhYyfZnVo^dx6jzm+1zd$6zg>lIvO#da#w=$3 zmOl^w|Fbc9+d>N)*;v0-#lJ@d#Z%cS0i<-1wYqE=f_KEvnCS8azFBs`#87G91vo$m z`&YhjVz@5mEmQOOoTIx#WqZA4SRpKdEhsjQe(eQ$--mrw%e08GgTFX#q zRd11WA2_+{=Lk?7x)6>M2(uzXWsg*YGC!Xm-_ejjQn|0_*et23ckIl9;*4Nqk+JS) z(<7<5d?G1wa^MdtKgoYI-}>gO0wUF$q6@PCMN4214My-{%?e^BwO<|44P^*>eM>7D z87dheP&THKI7KgA zLN$~>AE04s$)a+wanx9~0WA#)uq+Xe(f+KLTkDiC1KzPzO8j0NX??pkHV(|*<~?a< z>f6Y{8|Agayk=p_j@wbt&Xhp|)`J5y%>(KxxJJYd=L65{4sjJY(+jrnd4^G1*K~Bc zIkdz3c`W2krQbY$?34%b>JmO}RO3^LV^?TNBGD;mKIQ`s5c{-+Y<9m0~e$-aXq%2ft zBlc0{XHgxfo#BP4+oZ^4^A2E0dAd#oV36{&nTTENM=tk0;WZ1qZz35q2z#O#6bKwa z0@iqd)Rh*FH4u;|+cps}8%FsZWK&<7ApEi{WQujlO9(^x_HNO893oUe4#eQu`?@C) zNKIige^D%dA|BYgT573FhS*Merw;SF99zV|I1Q65ep-OH*Mc*zN*=$ zFaJtbZB~@BMrA@G$ak@97!#wEU&#fJ2Dt`2Fdro(m1}&9gaPw&nMA6^k-9$!-Qt)y;2KF7{6lNX;G-A??V$)61aTdD7 zEkA!FD6qwN;q1-^X@cPLmxjbZj#41D&$|86X&3cIB{p%ROt55&;5w z8`4k|dvj?qGN4}uwkajkyZLC=-y&JTTAbioi0hf#h=Tek3 z8}Ai8v=XHTOLB}f3<9(Y^3L4AFq}}$w#{MbxQJFco-GPwS~5YnGxFUreyG!85o^pK zC7%0lF+_g|>fMYPpo#0^^CCa$S&onH4gY2~%totU&hzZ+a^=j@HXGb%cI8-)GolYt zZo|$L`n8_6hljjKJq%X94XBl6L0MYi3d}?Q8dmGs{{zBF_LoT^HGi5t!ZqrJm?hjA z)%6AJ3zNEYTjG1Vg%leaKX*6gd;Ep%p%EwYnAPm&l=*u0q(|UOM6m*plFXlWyBT0c zHlA)QYj0S6WwHK^ydwSY{`jxIy{b?D?SSd8=c`$H84%!! zluk!Sw|)1FbcQMdF09gRjg(CqohN$5Vt z;ihVeORp3574dyFckBJ|(1`THXe*yPh&P$Dw1A3{pX(19-hBn5+5Lza0;9Byp>oA^ z8o7p$Nts0*dqcf)DYN1%dDqm#QgRMd6P_RFtk$sy?c+><<-{8OqREuLRk)SK=|$0q zAg0egKbbl!8i?FW^AfECs@h#jGV~Qpz%9HgQxGZ^)sF*)y5!lqR%yNZIUQX7u`4#k zFzi0- zKc>izVSffLJ&)yoWRXSp(U~99d$dP33@^9kF2kh_#eM`Ra$9i~|_g0pBVKhRiU>cDZv+gGy8ZV{fYzF z91-;DNYpq$U`6$&Y%pw{`>2w3G#Lr7twqZzYa#U7g~674DsiC}t=pAiZwY+*OM#wn znrLI^9PeT_!MliZW^;yzW&5e^2Zk`=cy+LS7+xJvpl}wKtTiskuEYPto@0`Q;-o-=5v-MB*51>CdqC-h%7XYo!F2<7Lg`V+f*3%B^#bQ3B?g0% zBPWIoGJ$jQtXXBb2P28d$eZk}cGmxN7H?;kq+#xGsq=OPZ#@~iK;CB6;`!hS$zqMt zuPd(;NW-)>Z+M{^YhStbxqr)=5_8QJE{Qy*HM87qM3_*Ynwwj2g3Twb&vR~Tj>+?|@zD3mv_`=|Sy9oRvPgH>L!oWz;`iq@`k+O}2 zwZ5Ueg+Aa=+SvM^DdZpBg$zJ@h{l^O!FpahqqLYu7%GS~(Xf_EYwQ zB~!Yg9Bj>V{^40N;M&pim_+NTL)1~vq^is4SE4{fkHTmL-#p8~pXjf>S16275Xv;328jDMqS6DDEjOS8B zu2EhQ!8T>w8w(gEes3@(^(Qq~3BZboINR6(Zbbe9hl`cLe}duFk^u)`$$$_EloTJx zH^F+G^${Z{)H#YwITvF*LEayz(#d$Ki*YXA66sNyTDfRSgzp`p@-;$k26fb2#VZ#w zsx^Fks{0;jixknS6LEYq z;AnR6kseFvX+;6wfFFv1A5~X%7c1g@7!Q6(p&rL-NXzE+0kP12y4X~yX@2vvGJIf< z7s)p5nRN%`zVT)(q6p8$tMmq%m@-SZ|CGZZ7uNoOURs2UNWc51Wbs)9kt#p7u(Nj% z`j&!GUl7eUHlL*!hviaZtiDHz)sx{O#aDUJ+%S9|BaS0k2YCZdc^&PXi>CvGD~bC& z3Gol5mY<>!{1ttvACmM7e#FJ^#+(N@42tKPkkiK#D(?vE*2I@3!JOvyeqM;n_ew>c zFz*1pxPhw1bTRy-=BQXTO4SXGt-n4j$MYa-2pMFU-TL7uTlCIX#}=6?#v_cvDcNgn z{<>!eXFC!@8N7*fXzMsyRq!716$gnPa^{f$9Ay7?q%`>x9Q?-;=?^3Vf4{bhGM@p8 zKaW~~W8KVn7Z!h(D7kUcHs1Mv?E472pVvX9tFak3*I)I) zs`yC#Y>{5kYVb&1wJ)R8C9~ticFr&9)Sn3i8H4;nK13_oqmnnRfK@n=#NttNKIjXx zzTHXohy`+k|GN53sEtpBow;JiMEaxu+%sJNs6)}D`W&gn^MouucqN60{7FGyw{V`K zb@;cQxiKXS2K80jA4>F1n@1y=Lo_-Wv$SU_?{OUnKWBHMb}VUl#je3%xS4KJXW}E& zP~_~k5=F)z72Ei_0Hp8fUF706RHCqh{@cp~VA=&yH?H4{^I6!FLT}oPhgLVn@|X!F z^2x-S3c>X~3&LHM(G9jE=$dDL*cG~#eI}b{7Onq4->gbdyi`2wmG)}&VmU+4th2*% zTG@tBMCiAT?+7jW>8Ql3V*;|JrlN!SUcZY?%cN;Ae^KqEy2&S{mCUQF^wvw}r20h% zb$VTJ4O=4^DLW`RE3r4M_03yUOV>xg9)PCm-?CiVe~hMoHE934PVR3EDg6)MI$||? zkPUDVa3w%IWPLDv^lLn14+Zma#9*7F6AO#fm~JkBZ9sem@`^n_vXVk(Kk@VV%eZc& z`PboXWI7Ndr&S)J_&W<%mX-;#Ul6#Ur5^|9EyRiRQa@@0HB{|{;~7FXJ-&!@ z?)4OX>_oZxJDhJNgeQ)X!v#tjus2^(t);r@naqgN+eBC< zn9~zX9@bq(h_WYgyrZuugB5u$2NhQi#5N<7p>+en{4_GVS5H;(;SV|?Dl z3G8EXchG)`_xyl%l?_Z`H^Jx)VZk@BYr5yXzUd8HfG1(c84_4Ynt(aZnATMXcJ~Fr z3D*euuT03H*G$L&Kqh35WF5pTAQN%`hV3;Ivgb7u@|rBJ$=ePl54G>-Wd9)LX`A+I zCZxlKWOa4uT|+|Rv!4TnQLO#feSS%b@=W*dSodaJfC(vqSP8SKt=ju19@e*@vvlJ% z_i+B#%KRkJ65bBz+2(%Rv;EO}U))IF(Z$5t+R$E5-{AA#Z}mUwkpKErFIoXe<5Wv~ zGnC1|8t{Q;`FB(aA{$IlUzJ3_1E?kCb&A8A>#Xp~Yjwo--);av3ERYoWWW2fhvc5M z`I#8+erMrkIn-_SdL+$Ky^0;LEQR24z#}O7CMKJnj)Q84?5efLH_Hs8j3lvQ_nm|) zaJTHE>=csYiwzn`7=r)lt&N4;SC>y=MTKmd)E2?w1Vk-*<;$webb=v z$iVA2t>zrD)di#XBE;I4)HYGF*0B3UyJSHNQ)&}Iq9h3mIs+Y{D-|pp z=A4?(JTsW0C%^qZ*Dvz9f8Ahf?bSar;(HSe@Dd4YTKEA?x}uRvVz5M4jYv2;g-)Y7fGwB%@`jjsJ1 zZ8PBebcL0V@`%$SC@cb$Xoy?~0wlu#atJhFCXiGGb(T>f2W0CEk-q#QtEr1zB9A_k zOlp==);@c-9W4!f!?mo2BTG#F}SD zGbIRcUgAx#ZnbY&24n>hKldb~8*_ z)NPDZ>h=?mvU}KIX`$kMdoh{YcWLj_Bt~O=JZVsZM^LQW}8= zXy-qEnhW#(`uSNkauJ3BU>!y#>IdWm`G+^icHA)v0RtfG_gl#Rkwx=c zm#b=N{|3Q-SCs#Uyj)n{LI3YTI0j&O{sAp;)kiRwRu`TB3>VOo^h5&8Z{ib8afoU< zj988$jPx3-lafSS*8?!031y_En_fHHFcYUrmAN_C&F-`$mQfdOlhx{{w`E-9*|*H~ zLxe~_?_RDQ_PO20k#4Q75ZLO`@S4hqk}cd1@~~e}ES!!SpmWUnDCc;5VW0YwZL;8c z7@H{&zz{{Ib`H7SCY+4mScYDXgH%33cUF5@7ltVutU2q#Df+-o`>-xcpA+j9%y`|- z+lY!BD+f-ydcj_doxktkGDF}dT19~a7h0S758dxSa?C5? zOZHsmY*$%aRffd6buc#7)c~C5MwI0{TmqvPmE+gHJn_53Z;98^Eic&anqVf#x}NI8 z#WBIH!wg3%U3)h2NblJ21uZ_QxFn9OcQ7R`Y-J{QE*idT*BB*6tmafVPF$4Enkt|( znwF(Zzaf{NiM_B@I$Xe9k7tyW7h!?FQl3^O)g?>CH;a&^hEK)Pjv}bCuS7UYk(R;D!}lW1Tzk8!w#DW+>tvcAd;n# zO3`@st(U98?tl?t;O_$08VdQ=?@itt@xrG;5%}V$?r`VkO&X%FF+hbz%$C?X>F3$tlOHJ2Dl+~15rMaR7Vde(IOM7 z{8o)cQ%Fr0rzJHL8PwI@uuWsjSCyajI}=STP1_Zw4iSrDQMPSsvX z9Hab;WoKCz=?eNY!&-Vd+{(5!VhXu2Wal~%g?G?j(iEXU7X4P)bvRAL=RJI$_#v`m zC@H9gFDP=O?4K?Ea)VH~yn){hT2bEGgjD$%8CO^@wOjv#s|87Ibs5*F&bOFKV-Cr* zJ85U-S@5|0!iGnSE7$pI(!<*6l<=9wA%@mh_~u8W z4$YO&W?+l5V)mV55K4%)&v`zAr=&Yq2jWM}M-rFmhn};Sk5o-;)`cH>edXWm>3s<~ zy}VB)D-LfA+qWA6OBj1Xcx^K?D#B`V0V7+$|F;Cd-%1)$Bcs0z6aRb2(FiR|HPPRBAqj{B>s0D~diS_`$ar+kg zc)(-bD+g457WToPeBBJ~d@5&2gv9g6V?d;+u7boWR|;^cOen0t!md7bVYMnc@#D+t zoG{?6cH2iZG1JsG>!pr8&9RVRP+GcSF7#z8f$vs3Q`-YxJ%u;gE2d;_x@)asuxAw7 zr7l!a&^M*s7?gL)w+g%-!M={~cdcA9nrm(ok>xoB7~7|kG7*N@Y`sYs@-6Qns}M^h za<9{&wFyEwvL~df`O+UQzSmMjdo4INE4vD`tuYA5*;ALtsXW6A*}CmgwtXp?Rp@{Z zjOJH~AZnTjr+cguHh;Z=U+TbFsu7I7ynL5V$Q!h|cv&)wFEzsgBh%_CVp=*n28eP z56Wi)rfg245JHRwo}6YD#$ejua})k-7$VL9>wq>P0}9{Rh3K@gtGM zo?-wkjZ7IpatyvO3ZSKBpXBvxa;?L6LTM=k0km{a#k-0LK$yMI^rTL2;e&H4vZvOo zX|RIzB3~}AT{6dJ1tSOxfR^^;3yW(EpF*%Wc`z5ll)dW4+SZ_QDd$!S{7{_Du6bZNy z$#}n9JUGaQHe@ttyr^#+ddORD^ONo2z027rKa2o}p*iB5TL9}KVR+yYN(H-MMD0^R z{;H(C%k>kaH+&Pu-2P&e^rl)KdmJCZzz3+p93?3`q5W97(sN12jk~@mb~?#ug6p7D z{A&d37$Yd39l~7)iv}Sb4?Vu(5m?q|cIzj9a?-Q?m-lWgsC3Y@OD@vOyiZGM*&}&v zI}DdotbOGG3`{Bz%hio)lJsNYQkv!w&I2$&jVW8-$dPF{q#5_4W_-O=prw8x{0s=O zm@p!jU5#!qKE1TDv z@b6aRe`l-wt3v#1aiz{yOQ@oa))1`C0h=J12_LH=2wj*{O#I#@J0fWaj^$GLMHx0g z5cBD6bM+ZMS8$&=w0?Jq`?ke?r=zjy;T*LMfgKzn(2CY0P3p8M>|Q)AXN$~*jw;Mh zew-UO?r6s)6;V{G=emGQ5Ia1Mp9l}-Ou$YrhOfetePQ{ zOx|}JX>4~vp8%Ir9qmIqs{WB*Dq9X_tf~0~7wSAF04@a*=a7{x;6;6^2MXIuEyFHW zT1v%0D+I7WGd>g7D^;D#=`AYHCcwIWu#$RQlU&@kD44euV)lSZuG`Fj1CheFoDTZL zBftJ*;%*Nn-m7?!bn&N3z>iEUc5G#{(oCDmi;h{k%>4NYKt;U!n~G3-aS;}FK%|0Y#>7dI=7PxY1C)Ka96t(0v&Y5< z(QZn+EM8es>K3p<9cV~thQ9i6e66#)+BDkBa%r~-&BDIe$LIK-4>Igf#TZ1(J9hr9 zS%wT?&NsUH;u|2Btx6vSj}TKAEVXqyrY+7g?_|iZIRJfTq6IK2x#OMxT=xulHayu* zSm5b271zsr@30RS!Vxs_W<%vLU#s(~1P=Ud(_{00jNAX!+1BsO%>OER-AePXj`__e z@wuJxRi{!uKWIB!a%0H^QljZu<-bCr)uYBVq&gEX`mK>5wSoXrO%VY`8vz^u=FC#q zS>Wv3=U-{|?&YV=F{k`3o+MettevLau*p`%I!>A&2HCEao#q$f2Q??QU8kozYCw$q zxpm7E9^aMlR~gIB29${#3=T|YQN^aBIcCb>MT{3ob~1Ni9c!&y*B#nV+w8`x_?xgy z4eoWMuXr&~JWk(Pn3u86$N`sCunNk!WR%QYkhv^Wf4D@j=fO0fY}j9mspwro2yrvdQLqE*)51 zF?q&ZLG5~_lvu@EX=9SB;XHL)Pvo=C+pX|2wjlQwp{Qlp%9oq5fV4_U*Vyhd?QUR; zO&n3vk0nhaxQ`!^sDmLkLHo|l^t7nWD6p<0!sxjiLIN+R#PYGP=Z(JN+`pXlJ7-QJ z-JCD%9b;q5VDkmxEyQONa0SgefSt!US+D(s?9J3x3f`lq27XX7v14CZNx~0uoJ^FLUe7x@n1ldGmK4BRFT|^9t}r^=-zAhMlq`V1Q$GR@ExMk zs@FOwGZkp;th5b~dG1J4f!Wr=s>cs>g>(b$O~6%?WP>$AVkUtHZbM7=brVQ7hf4M% z0EcN$LTEOUp28!5}(3;@d8vVuJ{6!7aJZ)%SjPpu8=GJ^}a8$+!PVnZnB zQRh@&WJ4(USw2&7I<*??oDrj-OUN^|U1G`7+vlthMmxX+c!F}Ef2Yh;{^QU2e@iX? z-KHonegs4a9k*3=(r3SWFVd7*;4Rs-DxgFkuU7o7_)Of$WCJBpCNCN;z$;f-MSa_k za7|3z(YUU(ahnecaWVCZGe71;cKG?>X_EqI$!`}d9z;3Y7HdMSd&*zap>rXzN=-iR zXTc7+%7je=UZ8!HWJhhX`UKIe5q)Qzw$0U952#>SVJlYZN)k3!Nc>VQ zw!fu8^E9IbeMRsop%kMkWJ@rld=`($I$Cnz$|fpc$y_#|>A6J2%q8w~tP_{i^>-PvRT zS=yklBB%XuW{d~ssj_9{yK1ANz@iun@C|rsznVRF65A9ayyAYKv!I(8+_!MY8p`@v z*{{xe==_xA270j$2gmvFbQBHiMslIg0ZM?3r6G}n&elR5Rv`Si{fyf6(N6tlB^pMp zW}rr|?`{pw=Op^uqxQ#Qn`T_9c;zh6XUV$oR!Xv2dt{bCT&(tLySx2??A{(=ABws| zK`#`qWe7jZvJc?`3?OqMqIy6+?Z$0pU==5#YqTJp!`}AZy8O4y<9s5)SrmKRGsMJJ@=d0Kv@Wq>5kM4O+faFuj0~!Xm)!?fR+Ju@&VJPEZ}X2i6(aw znhbdBD1W=dwEB~e<87Gxy{-3OZN0p{y}gl@iIJV4we{!M9g+S2;Fy|K2JLV~(3-R7 zJ|2ao+k&(s5D@`$3qU|w2YJ&`eE4bsE0y@ZC_c~fCmTy?vRS=h3rtZ#RtPwu06HuN zt(svJ`0I}fJ>c$rGcxR6?Ic=C4Ex62G&fh-Rld>*#25ElUS#b&2D}Bc!Lh@Kmf1LM zhI8(fh>zNlUjlkJA}}v=XtMp?*jBB(q=l8|PnLq!Kl9$WG%*Q`uBPf8ffw~e`-?5| z=)_kke*IziQGtgxYIAIhe$hauEz8onxpr`|NLUPy>vn9K!7M^(`$fR?YX|~wv__Dq z2C)h^jkIl0Uh(ahS!LR+W04??Vs(+G@+P`?N`l+Ywnd|3Sz?k%ktii;Xld(>W{g4l z$Z5X0PB+>;{r&MP78(90*+M$EsE}KHoJ~zl)5y6^(e}IM+YkGUh)Gam3hU+l=n-_J zf?pZx5o73a!-24$EGEt2MD z3dqWnEKatNSAjE<0#nnc{FJHl@xZS@3;|!pWEgCc$)S9O#YAa5`D{hnwKR_kSsY)& znNXX#823vr3k-GC1_yUA2Ro9U17>-!ctP>nD1$|VgHIZEE|DvS-Bg4)-a_fKZc7lW zQ%dpnFRSDvU5+D)1W{85f0!!}$Iyo=TVJV7@+aa3zpL63I;~{JH6sUQzXcR}nWU}H zduY*dkdNyVHSMci?eJ%=5UEUi=u6&c)4WdmIsGl5PDG6l8B}?Q7F4wXQjwEX!&E78 zDvJDdte;gH5TxEULfF@_n%JRNUw_#|OOQ=*n6_w+zYdWyfvbzChEUt}NEk_;f&lm! zlNcnSLS8Mig-h-3nGMf5>`g(i6AQLbp^U@aO*DtXR>Q^Rra!~r04cKT!L-%Db0FyTKzs+XnSkJd019%!at3KD31@=U8-W-C=CA}!1GDLY-~nGN zfgc<0y2pnY$ySVLxdOYtB_wvnuo%Uh9!E`I#usgrqA$<^}rFi0UEH6EGE8tv*t{AMeBG*(dHzmFTid_Fn5ZJ&|(vaQr8^S^spzo=GsyFi_nmcWlY|C65 zmxg|(0`hvEZ@iw11XWDjbs^Vyhs)l&!&D|y`md`ypi{BNlHt--FHbZF4sOuLXijc# zORIjNf@XSdYr{`L97&#Cb7ok%*F9g-nAolptyT4Qx5#xcA=&AJ3#)+c#2;4nvsbka zmp{qFB~oy+BBKa6G=jzAfir(e(la5=bQor$*0h?6!Na3RDPYK5M&LxDYeSbmF{kn} zJA!k%0}ung1F8udXEScW)={Vf}jc0ZZAC6~(wz>hvJ0Cs&{U%XNs;)N~fGgx$&6ogHT7k_dZIBzzB^eC09 z9sK>g;|1ET4q`c@t3aoq90CMNESHHNIOX#jTv7V44~GwIh0cFV*!ljGR`~xIuJ}Kv z22}pFvpi`bn!-a74WMYb_(t>p z5X+bSE?y|l0^oMQ8(Q2~e|h6zWNfpy1PtY~1{kI!2er6%p4Lq?4d3>bTgOew+{mKR z!$!8z*R7USSCZD5SW&exe~CYyiY*^8yAXelWC@CdwWQkD&@Ot1(f9o26I2$|+P+4I zUxcSGV_)Cv@m(`MQ~i{JfG<{GJ`=QFi4e*PGu+qHE_dg4rPi*Vn#-woyTe!9TkZAv z%v)d|;WK}m$UfgwKeIgGSTLIX^3Yd76pWJy&N-+pFBMCHVLO4^U&q8|8b>*^X1%eH z0n#v-0&Z3v*!sAz@QO9VvX@Ulfdtp0TjuGcm`n$qmjh!}VZ+Tf7_6K~eiTv_!?@gK zI+3}+IPM-0jL8gNPxCDsB;Bf^`4a=BN<$0oQ=#W=&5 zoh7Y_9^_G_muA&hjQMd2`(SR$rVS`&M20~7XaKZGXjG0Vx&0?%VeAQqAw@E`tc5_s zy$YWDC<&b*jdcQS-1oJCV}UMa^Wmayg10bLxI{jEfMkV{>|t%*SkEg*fXQfeM0r`W zh^i?SK{v$r*Eb4=@udp!5Qw62{4E;s&vfASdjC$r0B5oPn9=v=yaa9}TPX0MycD?= ztE>)+RL%#*2>s0acECtzdNG3}9!l~gb~Ynz&*YGr8hBrg0^TF^mfhIGKq?BmX2`Jr zH2KsP;^FjbAE}!`8^#l3CG1~_``FhH@}=^Bk{cU<$&G`TEeb33N^x-CZGRBSSPOR; zb%GO2H#;aU7M&*+PmM3mv->@A6GaP~7lBW*=2drUYoU<8UZu36o;tI(m61$8+7M3! zJePUmvt<+8_gAiCl}6O^K}=jH{Hpp!(Q=X52FsKvsit}v$;#1=I?R&x3kva~CY;L| z9I(aj;U|;+aT2?!OHOs8XwlUAk@zEJiE>R487O2&DYQGk*Xa#@u1h)R1=;Q@t1(1F z6i!(|b%wI0T^6QaW)!ODP!METrXc8F=pCeTI(R$I=?Fz@erzpRL1ak93O+ zUQI>R3x9@q75(an(YN*VZNPr|Z^ZrYW#IovAOq~5f4?B|U#$}4|DxnPV`>tri-Nqx zL_a}6dLG1<$pPS1UH6v;x;NTFXYQpc znXxGp8BCsBR+v7mmkK~tM0^j5(_~B#3HV5o8|CJAD}Z&HsOZ=C%BGIP;urKJnzI)G z6NIiB?Gw4o;1|4e3vs)>QFzEW%(M&EGA2eULW${NQNTE8k34ZkFr;PTV86xmtsI?_ zN<7vDNX}{NdKa%n*94LQgCVG8q4(1oWVS_IJr-=>D6Wm48k|>rmg)JyCf@H&BQ0^! zN=_pmSyV$}dfm66eWQY8-4$BUPcNx>D-(Gvzg<=AM@7l^JI1MdYrc3+n1VP4!#IYc z9)KnNN*EvZp5fVuDRy;3YMC851fo$g{kERpJ0r?2)wO`cOm@q<$g?=r0jzCUo(8j` z0cRYUSA3nVl2^4Q^brfJH+2w}|^cGAR3tma#W7 zwQ+JVk_D<#6%6#Og?|CO*^H3uFUTJd|c#6yjP79Fr&qNo{=cvSxHg-8;n&BO1R zfg-rMjPXy#dkK#!zoBy=&=FS7B1Hl77{hbYv9SKl=3B_a{B)ae|VT66S4mWI7PCHr?^ZHBS_Nn5s39ES*3%ms|X5>}fZZo`?@&J8@ zYz7we?zI{az}-*{zCPiw(qO<(eYNyOOZTu|W^*Fd(K3gk#?>T9TT0+YOl7PNAGYdRE%kHdXn*e4j=eNmmLau;It>30* zy^t3Wo``hq7yhos8Ze^qY25=^8|SMwlgrC^Asd}w-3mG2JoSpAL>tAi;U$-xjzcS< zb)vFGoQe*}6lR~-E`EvU==;p4Ih{IaC9aBxjKh%V*tabQOx$^ph5u4VssMfo_W(Yw^lNX(fx;uwfWwLsOi< z_{GY%Z1os5%lk5GlEgG}_I|i`&0Xc)Pqd$FY*{;^=~AV9ZSzL_9l{M`{So7sudOYe z9pcPtDnNpMYtsRo)cqp=#*Kd7YyP>`T+5w)&4`PTz73OzaR**ckZE)32@mxysfwKU zLBDLk|NWdl!Ouvh5=G>=>H)p@W9>p&m0Igd^j;EeCGje%cR-LVMWB-TWy9?HGxi5^ z1J>Ym?kqn$%S{v$?D(Y=tbTHR1NRRG?-?;RalW+q(u8N_Oi_CVS!6Sa_7JL9YXqt_ zN4+rcsHup(3VMK9XA$`Lt!4+u`Q&zhxj@F8!;`%Vd-&u40=9N|P4N&EY2nH6^k2pN zN4t^So6b;nbWs34Z)%3Uj4~o|;MAY`w^RQ=vVHlVJ&69gl>SGF3)Tui2_f+_IKqt| z5mcBke<3)^JD85NHRv~qOW3B4Tq)9TiOVlJ)Nct$1TmW+kW(H^S<(Bk&->@Vfb4}D z;u`GLtnoNOW7c?{!%=CdRK?V!Q72$KRofP0jo*p+@nxvK*irpl_6Ikq*9tUekrkr# zw?TYx^JrGfm6NZ4>%<3o4@KP@wMgFVQa_~6?tGPF0+=Lzm#?@AE+QI{ix|zcHQv<> znUKrMJTaW-g#gI`Et^Qi!KEC3hE za+JYim)93&C}-FuVEdH@v(|5%XU4QeDk4~I4AfUTkgYHTYjXdN#wN>B+I+>waAV%4 z_CSt!2;;J6Al#r^W$*m$h2HEQbciP@Oh3i?h~BTEh>3omU`=S$$mDvLb5F*j$)l#Z z`!tYVLCC|n2N+z!7J0z>eLmj4s^g^q&&R(vy#D_+QSR-yRMa#1&!^+WU)y;dI`LW} z$XB_8)g`W?;HLp>ME(`zRAZ!ued``3qf+OS*Klhc1pbiKKeOdNfWK{5sWOQ%*ZGCI z#^jc_KF%LksSJ2Nz3fu?hBOmh(2mNd4%Lo-(`v{?rt2 ziN$+mJvM0Aw(<}aMqOz53=7~C33HLCw~_9P%85Iopy|_M;fMl*@(Ze6QDKxbCT0|Y>;A>-^}@%8e(*~}?j06r^ow@tmx+=DaJ06rotut%<9dpkWo|VZ9M=bNc9~mz zsU1}z>fmOW^p{&*hMqsn= z1Dd(&rvG!6Gw6BS>%@J_imqU%3ah!BmqDY_pTGzbKXz%HPn0?jGn zCj%VFXfcac9|cVCui7i2Vii*^_z>-@C6guxUd`9Fyc-io*p}%J7azW=>URy6%Vm65XdF{bCGhFpMKp=qsOj*ZR~TNLB<(VKR!&tic_0^3`Jjt1 zf%m&aJvvph_JAd7@V6~o`=7M%e}xpkfolITsraqd{x$FY*K2{|pA19k_#$Wtjak@) zr@}AtIeUb-vhScNW5VU-u}}zbKLG7T)~ws9Ry7)YApXTmr$`~2CWvnNaTywOIZRHD z*CxK1vtNMRVXi;Or4R9SZ<7OM^V^(%$>xV5>+K3EcQp7e_z!=HJ^-W$C$@^9`mC1a z7sM2p{Fqm@cI@ef0~p57!o7L~ay8l)ek68|8TjknWOp^D0Wf(YEJOifq5@Kk-(MV} zxr#7~p0F7tZ;;^BcwvSolwQs2b2BZ)z75tWbMr)T**?dMYJ92}=%jk)#x|p^kIJwO z?^SVJXOyFkxahUtM1Cfe#nSZ#(~E!jX=RRKTqZuYDAqd3+8o#xGy6ql;l(bG$fYTDGp9|luDpsR<=4s$>d z+ad5Kv#9j!n?;9VR3$maA+bZ-=fKyki&rD|z(s!#G+sNr5(RMAC7Z4C0UBm@LJX7b zyr3TTOaVl7MvB2PHj$*fxsPiIlp<6)`Bu0<6pkkjv{d7d4VzW6h3D^n3`D|#@CO(; z3J4Sw6iA1+@ozENzdimr-0|Pw#DBpZ3KBAJaK|;@7-~H^3{Q8UklhxwroLq0Jt2H) z;i2~dj_$$f_{6v-=$nHGI?#VD;S$U((6o1tcJiU~ipL?2{pr^+N;h@|lqW_@*!Y~{ z9&IuK&R773L#aJcBA!IGz?tQAU2+jvb;K`qQ=eI9yM&rM2GyV#Tm zQ#)+S3P6X0dQY#CsD$pEgkQ?lP_@JQU`~F^t2}J@I^S@^yf`tV`rIvA;04mb!$C}`IibQ64en_$+Jvi18d{p)UYL=d44|I z8N6vcC9XyA%6eV2pZb$7xErZg7<+fw$2uVEdhuHhmXAM3p_>Nnv#(v*z{i4=G@Ef< zW;OCVc5aB-C6$V?%Lt`32+!avo2eW{vZ7QKbm0A6&Vy_*~e z(w&xBI$pIKq@Zti%MdBJ#UR%3Siil)yv0jMNcL+ALY&pQRq&QJ`#0-thGi#{3db#M zqkTF-j-0`!kU5rZxmx3=YI7+UHr=g`SxQgcl!_B(!g0OMz)xrx_POO;eaXd|AU92G zv3ePcc8Qt$+FpT#;zE+TVR|=?IRQsw!GN;F(P)>aqQspt(p-cw7J)G+P~tTk;gXhq-Yg9eui?+<`JL2Ucq*%ftH2)}A0* z<_-}giN3D}JMFzpUMLyq7H!!T(>XFN(m+t91C^G3eSABTP{?efBKcil_~LvbR0pH` zhO1H=m+ROOr~$dxYK?xJ6EJ7-;q*j0I7o*@n+u($$M!lzeSd|~9&YVCLi1@$dF++J zHdXII!N6_HO$w+B6e8N&C#>Lni{gsC-Qw)0S|FZ%lqj2Q6#PN#)`D7?sAF_MJ)r`2 zomcG(_lU{(BFP@y0i+ZiJfsV4&JUZJUwMzAV?+p|5hCa%KQT9`z^f@qXZG8l8jxML zj|Yc|iqu;2e^dcV{1~I;`=)i2)z8?l$!0r+U_y$_fB|muNR}2fr^3|0#I|qDR06Ml zA7@Q_8T7dW51~KFGf=P5E!+JzVyADj4e`Ua=b-0fb%odeAk-_y(UL5hb@Cy&3uQz9 z`f=zd;hIc`p%H^r%IGoSLgX{k??DNqM<*usf1Ks@fX&6g#){6?(2&m7#+J^((1Om? z(b1Mp&(@6Y{}{LX=6UdEIp%+JJ^0_={&R{9sCjsPQbOecv$|?^W3kF@hqW?;b#&`e zhp}2IqA-g$o`VcxlyoLbe@l;Cz9s-5eL(pjD2O7csHlj7A}A}XsCW?;{%;SM`!)7& z=_7k98a}+puPNy*`)wO7`&mzq&VYL=L>@`OAt<@^MX zVy?Tr*PglU%hZzo;2i9n8;k|V@v{pbV@J|4!mBf}!ARM>WF&{%+-!Q9Sdc}3pS?mk zVDD5;A;2CPL**{?6tWT3kA=A}N8siZ4lAWQbhfW>Cb1!!&!K(-4lAqMm6cs>^|%J$ zwz@IGcWN^I%xz&YP3)V&1hAcejmXlf+UK1X+J+ z+ClS}gTv>UEFKqTv|Q^6slfWwx?)I?G_)|*r6(UFRJ zsC;*eBr>klI@U%d__hhu7 zb{PX0U&-nyRGiY`WLzB+CqF2{LZXT*F#9as?1oaJi+MBhhkIzqX9-{;TiVHTZM9qc zgx;r7I7X?+=$M(xm%27j+VRNWj&hYAl->@c(qm^GaAFFDcaomgUZ1>?)>Xc}WhPTS z-DO~6sX-95k&>SF>nmQ`UNxhlQ^Cy1sMlrPVyx@YgRrsn2Pe$PS;Qr8Q7hL`#(wu0 z#-Xbzj%v-csoR{e*|cY;?}BLAnE6BZVJVxys)$Y3I=W)_%FTU!O!cAuG+MVJQ%(Ez z%GseesXF2yG;-Lu+w$a_YuExhwMnIcmDA%V!RT=I9o0SBAvif3a$V>py=X)rf5QTf zr*zECYw>g$H1k1e^iJTb3e24L$kYXB%u^dYDO0HB-hr}B1@q3bjdcA_5`5j-U*YLR zC21Ge?k#a`_p5SjG0|tHwA*NPQAk``Q$&P$fd1JwE}Rfq3%R zy=+wc)meBps3PT^`Ny{RPrghf8?FrJY2$rd1Zep<@>Fc3HsQviML*Kw*wQ8rXY~>E zd5}gdL(^}P782+~5=p(GeQcK!qVv;ozE33^(X9V0x5v`X|0KpE#EVzSWd*PL0MPKZ8~HUE(f$aKjqll#k+u zUcDXtF+;z5546$W6TR(yCd=@7_$(Tvn5FQ1!UOA*#2$iKYU6jiOxsjG4?5LmvFX$6 zGxs$9a|ToK&j;N-jbWdR9Lra>!fQFa_WXmw4OFK29Bpw}XIweG!q2Tv)3w6-G6E%~kvZAaQf%*jUr^wH`=GuNo-G%QlhHWyR4!^4-;@XU5$`wP%c=ma`a)$$_6aQsaU1oF&hsQt7u$KBjQJrx6k%P=hNsR!OBU0oVyxL!>mLJWL zWB-6t@_<~zkZ%n09=DjI^9j7+3ho(yMjIE+U)k=dnB8bwuq+2bdRfMewT#yeg_Ko8 zsZMcPokKzR3btZjkQtTlNLu={kr<^ZPG$1tGe@k7b~rbeUDs~daYRE&j`rl;`2+QV zWVjrkm!!L2hf`8eNsbiUv(S+iv?u|kDXhlppu!xx@K>0X(F5MmNy=_^xb|_*5~f@} zh)is~_ldP~?qBlE9E1|$dl$qQ7r;)pmQN`+4GaO24R#l1$;-jXNO5atWR3V3>hH{8_l}HN zOD@=-R(A(V+O$<11Ew|RsxD<}>e`i?{6PQg5hIF{n-Ua4YjpaO3+J!^6vYv$FB4d3To0^-9 z_RyN+;93n9vLknT+t0yRTx3VEwu3#b4Ri@cKDN4!)j)}W58i4LnMlGq%LWp7%})wF3rf9vfi>Hy=rJd=tfDd|n!bGmBJoA^A+ z(;dx-jgW=3UVwvpeKwm~Cy`7z&r8_KkKJb0s(bI%Xqu~`k%-rewKEu@zSpt+~3=X_H4GdG$WBV*|2R&Vi%W>d+P*xbqhW+hR$Ayuy3fOYz`XzRGth zBLuE{;Ev=VQ1h4FTp+S}s!3`f9y9(&?_u>c3-oc{ZHl7WqWBJ!;md0Nf* z&uHD3lqzH(pXDGjz&Cf+BKJ`+2p$HRjLxJLS~TBpIx0DufT&i1DubA+z&n!oDp3xa zgW!bKEGn`c1bzgygZ(AioC_P|y3Ah`>_CBm6?CZplof0#4|Ec=MhPMV ze)AJ*4SaVCWjDBO7EBGub-6E`uO(rsvs1u342Lo}I8a+fWHxYJRfwH;D2i2@AX${H zguYiwaCjiZL#{dCx`MmroW3|^CC;Erh5GI9yCEny8$f6kg`7V6epT|)1l^QJz2E>z zF4fdR*n~mdz5%HMen#S3j>Pm3eDvNX@X}mKXAz`X8KND!+o`Ox3e2_x#+AtzTd`^# zbW<4hLK%duRI>xVdm`+zy`!~k%7%C z{d!h>w@%c?_Ffi-br$EEhma`b&MejlZS-yqaxnJ15OKYd2s=6F`Gc1#-%DtgC;Mph z?3$^P)Jsa1C#uN;hT!S;DAd^;XUqFtvV2lt| zJmvU4(lVW>yZecHyk%q?QGl=FfaIGUPFbF!jPvS)5f{?Er}AqSA@Gf9&KB5Rw!|$T z37JmF-KIn}A9N1sShDfNYe)Ls-U}Ig1gp zA$w*D^&?lg3jkwOXSNz;XaCxe8u>BOzSF0ejMop~X7uwVhm1E25IvgpT0q7d1eg*B ze02xRk-wG^ziP>Nzu%P*2k_qPn8>|Ih2O4WFFhB|BPmN0 za)oEKVrn5Cn{QQS`Rbj!J(VdW79_=R$iWB`UwS^=6Fs*ZtEofca#l4N9@NU#Xcqd> zh{G3+0%E*UvMI1ra-&8CcL4u%lycOAD)$5Vbd*Az%yfM8yHi1lYGGFKLx_uIN z07VXslCei>794|3MirM_((%aHHnI_hv@-cnr~J7gs%d$`4gz-zay`pvZS{QoqMvh7 zT)VW)I>?H<(Gs^iKzN#!e8i0VfqMEeLC-s*Sg*auwGC?ooG0qaW(zl0dD_jmGghTE&o>tSwYK29+-bV#&)et zNn`%2N*MyTHH>E=WoeL9Nj-h`qEi#C)pogKxh-bl-`(KsXdyKCkv*qFGMAUxP4>or z{P+VO!zcwKZ@{@OSzk>Da+%*flsXWg=l<-yZAp|fbtHa}Yg>zPF7R~2SFFkBf!?6V zM~qa+yxN8~cW@s8+6Y|ti(Y&=pnY9B65B9}H7xn1R9KlZcCm#QK1SFVlP(PBW>#6- zRwQ*d|5&)-b!w=xVikP)IDZQmzl;jas5c4ly$jrke)AF#{1Mqzd_SBftL`FwaxDrj zP?m{(#~#`WS4d@rHA%TfqFII ztM-bQ9gXFob-1oYTcTO2{f!XO4Fw>oo2h3ejv>>^8jwAHq=(6-e-9Q+-E%h>FqM=Q zb(R~Nh|$(lws!LlFq-V1_%lhv%(Fu&H`*dn~HI|Q815B zKibO-_%&5G)VKMC5@PBF05hqIMdONrF&qhbB!J6H!hU_xS5Kf4lh~O@uE3xA#n_OI zVqk;`aJa%&;gu@^IyLN$9!)kM8gno z>yl-M?CS^}#jAdVcs@Umwh^e>PR#3@%qh9jxbZy@{{8zD4)cF|7t9yO@OGR?!m3WmaA&UK87Yv2?LHxu^X~FGD6CLS> z@#$-0XY1215SK&bQ2uX}+UGk~s4x`N0_*UKAhUzH_2C@`iiI}E^5 z|BoO8o@<^xLS@Y*hNjs8;9_WW-vzyVK(0@+sE4`9P~5cqww>3S99WhLnw!iPr{x{}}@e$XR@ z3yglDt-X|dxS8MSD;g7$Y~saaRxq!&nnbFd0K3TXOJ8uy6g3J<8|oo{XB>0ovhExx z=m&mBtwTJl4@Bi6Y!`c`tSsxpilxq^Ssrry?YH{!fd1oG!hmILrDlxk5O=SYdQgNK znFk*B4h!BhCL+%ZgR2E8CF&FN>h5Jkjc^;GI5|#3TLV)j$nW_50z=NgqDv{2-WBA0;m6wjSXiV;6l_#=<@ z&J!!*U=8yJgC4Kkr}kxR(d2fs;7XsWmc$*VlkD@7sX$aGDiOCGjI`Gl72ITug_rdh zJv-L!m`ifuuNIQ5=o-6M?@=om+p`_4*l3NZ=5frmGtEd5X*STs{Q6?2AbW9y{r32e zyJ5-??&D69p!v;CJ{p+}^+uBj%pi4FL)4NMQAKVf=T}vpNC-^-Xq+8Aqc0dstO`KY zq#+DYQjg%4{n*#$U@S$n^JLGTm8)1a?gI&lfCeMFMcN1Yj?;%;o!f89*1je}KF%&V zx2E_}eQ9Z$abY!~K)9})aQCD z8ZxGXpHac#mqp(lus4U6+YyrruQZfZ;=^ahpIBA#-l8_vKbJ{bqOb$gq<97^qfJPg zispC-k6F($(l#;fCTVAL@3)~TzcL;oWdg`^LU*K5LM^u5)PFSPWUY9>voq;$3-%wK zoo@p6|7&m8fBWLU?{N(%j@cuNpmbPS9`{@@4sroNddJ@P68mwTreJ&w46TVYN-r#{ zG}~zuVajV8f;d)u!T(BKH%tipgRi7WGT@ImEK+E1>`sj7MyXJ$$PT-9*14axYSJom zJk_P$L7JC-of5kU!)d*E^}~9}siEoA8f(tUO{G=Ss!jaB8pCvp)K#K?Rto@CR9$+zWYW^K&(`(Y>S z^72#!LCM(qV&gpMwv)s}*^sa)>K2ACJ_AT$)@h zG(!Bw0`QrCh)Uw=c2x9M$?mZ)8F2oH2G6%|6^l1W=I2zFy~03^S5wee7cctS9&i+< z#fT+5A}G4N@Lp^n*YJ}3r(f(Idww69=ZcIZDYR#uET_IKo6&K?#CaLrD1yybmR$ic zMk`_GD!gFvO<7EwjlwcCj2SeTIt1~xlbnLm?X-BJ(k8{$uJ<%7*J9V2Mv9x_JG!sW|- zqhQG=d&&upYm^fMzXG6}Xiju8kEXXdv)!PYBVutmW6b{K6Lf7ERsZ^JAmwLfi_ z7IDnmGjMa{VQg{N2D|G8>L{D1_J#nR3vlWIh+0}E1E{GvcNr6)lkd8nh-kqua$)-*&|}*Z8WwjA{T3tdp<=$q>V0Z^ zTuj|D=Xrqm=~b3%p7Jck z^I&u|s#I~5y3v`kv4gm2AvTXuX%K;@?#(`16)Q@Er*JUMRR63@s!#gN+Mm*QPsAblmz@3wxS5Tti9dpfXOT`0A?3& zFL+y}pF&mh#JqBP1m`}`d2M_OGw88(cM;c-BDAq><10i>z+8WE!R*r&FQY19q?Q@Q zUy&+s;v%WUhQsz5mnZWBMj0n?iXnRwKML5uqYp0O`;)pv|7`r0YQF`mlpG}#7yonq zGQeG*t0;LoWBp4|R-3n?n*ugYBZe{7gms`u$)apOmjJ^j^QjLTTlr$kqq->4D}b7r zjFl`R!DbzycM@5zJQx_-4I$!t0bXvwK^%85OwSy+P6-({> z43+8Lm{p}UNqx6B zNV&y!t2YQ1omR8?_diJ+nVj6ILwYMgw4bFm&g~{Uyv|#$PB*fB!~|6ih$6=$G?=-@ z7`YaiK&fnYdZ(Err&uLH z&fKp8i?0B~-$eeLU|WI86rUUzSSaTMI3q@qCa>$&nKh+Q(@6OY6Y0eS738BxjR7eO zS!IwCwH>@m8R67!^H4?he1Y&CC&W0Hm>DZFt_aLf>YOhHA%@M0=u*`{h|_yy#3m`+ zqj#~Sx~M|&z<~53)9{(URGbr4t-55~XTqsccaAzQ{Kb?yGcmxd*jtf->aj=IT2UIu zW2}j(=Ag8c;V_Bnlj*caxEjtn8m1l|jL$s6`DVW2vbPaeW+|lk1HdBkA{^k4z!rWX zgkUAIhi8@KHldp@P5OyfTTOa}`5Vq%W8Wlo1@NmwBpAYN8mC7_W4+MO z%xU2lj`RJLOtZ#lRe|9IBIH23lM~DV78(K^Znyauf#s zcVTFa#*k3q%4E<576IRK$l6uL^v;4VPJqYm6f&)rz`O+QXwqSVGVX}=2r8-KN)JK*D ziX3`6S^#^x?`AQ<1=OW8saR@OB6DV{MqPzTA=|{%nZk*4thX?I;VX&KCW))C2N*Q2 zvv&OKo&AfX9&yqNqo+!ptn*EdY0Au+YAtuWN>H-YJA{K)?m4vNHK;cCRlfB& zwN}6(+MWBSm2qElXer@WO~#(aA+HG4T0q`v^HHn#6yS?Im066er8zPg>n&beAxGd~ zPP4`}5-C=Vin@%_JYd?*CDFO}+SL%i8h;4&og`4<^tMFU3}X_<>Ii7^xJ>YI|56OH zdB6h34dTw8gZPElgv4Q!oCVAT1kOR32t=5D0K@lNhW@8+@ZuD3`T>d^7)gilD-h$) z0}vqJKH2j6vLmEG)^xu^1Zf_AhX|^=0|M4fV(o+nYMZK{`OY>G40mvGdWXdSo)#ZW z27W3kXzJin=0XO$Bc!C9&)q-i!V}MjY&W#g-!(GJ63Itg#^)2&3+N@Lx^aK`axWnbojgMB!8PVvk zeyX|y((U&$g2|{|sB|x|GbS=h7*y8rJ4opd&h5=$m!YU#ICM!Wr;tXDBzP>=T4`k+t$pCi$lXMQ~z4M$c@-&EUd4u)y7BXHkr)0%6wgZb2Ir^ zDc74*Pei56lHF8RXa4X|r}Vwmytb?+g;FE@N$K$6hxqOl=0Ko{MDeq5?T@HYheT_0 z^k{@l7L||@degjqgp^&zYTeTv@gF^>Ief4_H{Y;y;V84b#VPileo)yq&=|2Fo=WhR zx{*lsy(f_-P*0h}yp|z=$2w+a8aAw=;w26rziPIaF7W!%Qc%p!Wr%ie@ihBw^NV>AM3fCdaYBWCAulMmWA_g%Hq&}s%HvN1;T&ZcE}zt{Vnixv zE~=D!sX*94zfyBDVmirrrL|=|aBUk5TYb=2c(?5*rp#hlhb2tJXsXmcYpb_VNNo{b zYp#;6Zf&97oJ8XZ-;^z_X|-a~K#Z*c#XB#~lperHg%u_o`(@35F?tl=5PKdvv@g9E z*?lahr*M}$zG~)%JjirCCx#YAm+3XvKj#&qY8wZZrKA3bL7^n088bhaBenqq=}aTE z0#4{2ZHi--{<}?t_u#&3EiknRl3tjSX?cerdV0rxOYG}l@y1wXA;XAeXA4bkT)$r) z%7b{!igL`GcZoSfo@8M%rwfD2ZF%&fvnLN}Oo2)hwdHLxXeqeD=LU{n>7Ez%{opPF z4{##IH_fNvdZ|(#v72vy_>nk?d9LfIvXIcH^A#VPDQv4O5Ig0GIl5QiJ`XX#pd#=b zqTu5N!}Fk5nlI?~v9ct;AB7VY?H7hQ3A>LllJ6Xm!{4=f&Thic?z<1Pire>Fb$soK-ki!{phW$XM0tAHU}7=^$* zl=eobJ?w|K1#zSVa@I%S{aWU4i_xW4J2#X0R2#cH{$8Gbywoh z_&fjgKV&Rdh_ zIMBjM8-`chj3+aguClgkxnGXYd0)V5LZAH2iOk(=&pqr=Ji@w;x$S9h6)m}pT)4~Q zKf@rOTHSlIhst;TjC)#Gbf)ww^vcbPp7Td?DUKkVS>3-t)v~%h+D>HTQU+5Hf(d^)p4sPc4?$ z0d=iO)<$aq%thc-bWOp!=dYtBzHIk6^j~~)60;X7K0^k1OVImR-f22jrCGV;TxI4v z@|@G&Q|M%d@P?d2SHXWGy=UiLYr4%)3JJn8%)VVOUsa$F6>6N&dbR)s}*1 z62uzPIG3n^Nt*i{u`$&&TkC$%Jmtc8pKQx_#>`s#9b|?1l3af&qsY9wJ2j%uYAm_h zGU*yC&eYL}R%wg1DHTGcyMZHy2@AcltM)l@f@Gh^B8Kj#ECcD3;r*4Ov`MP3)FdyU z$y6~LT~@5K?>IdDB!BSRG3?tgv&uV+MeG zAZ3@DjIoJ7kNdXsv;(=r4iErz)z+ zqUNwsJ#GrOZc#Ey))}x zxR?u}reTdL=LQR|M<-Q=h{q?9=P!XFZ{C#Ju0lh}hBm74IXBgzT0BT{;-w0iX#zr_)JoR89l~e!ko;BoZtp0Bjx9D z@22J1h}fr0{NPmtZ@CoIfi54dCdN%*DZXP~vi?+X;@&zRUy5#hP6!%!TSL4Lf96L{ zjW_aWfOJeR!fM&Z_khoWaB2rQ@~Dv@I@jE-n^fUFyNv!B17EiWhhDJTmQyznBrOjWBZLvhlwEZ4 zW4{>F>~2f6?F|l2>*mLioWnq|X5mK$FYeUh=d2y4<{ADMkfwEKVjmK>HX64wrU&ei zHmi}j%#jVT^$ z15q*3cK{+oK*sIA4dDP19sl|b{3-heg}=fHIz^Y_W)a07XlY{XyCI{5L_d6i5tL;i z(flyH?4&@3{X3lC_AT7V53f6#A84%(P7(wA$$4x_388}xfvvIl9Dd4qUi8^a;7{e&5s()_i#>pj;mouwHzuI%J~ z4Aj^Czw=+TUdra;bLj|%YA)}>?--H#;(cX-IX%atj z6?G*`W9}WifRU?rbuizh-|Q$aaacp8v+tE^1%5P1a67N8;+fW!4-YN{m2;s_td&Vi zBTGv*h>_xGN*~rCsi6h)-l)yNOwPMKJK6vpBPggBM`kDABe6_uIE%K@TXX!?(Nbw@ zykDBMi4%)b#NUz`b3<2wyjy6;IK5)J_*n8`4$I^6OQv$SWaVZ&~rLD{-aa zZ-&yxBL3paP?YK%!g%6r!o;-N-89?Z-wz24#Ta#UZov?s8mRGFdYH%<8~2$sCcU~^ zyu$;zKr#M+Hd<#68D#*;Skth*vN{OP3L7|)U_n&{c4%Q;%`w?dCSW2aE<$J97ueK4 zvEsK1Dmc85X{PkvLGsGw`z!KV6#e}<=8%hOBtf%Du60SLo5E*JT861@bDQOhGKfql zqKN^*duU1xmp=b#Qgu`A&0Q}$vp~(cEhrC~+5O;h@%Ngk9Rl$Xn1Lg&BZ5%s`HupT zR1=tL)Ca;CoI;?z$`;J((*e^y`WXBqeB6*vQJH9(0vMm!5%kFTgle4xYO(H&BjwP3 ze8I4$L?N*BqYV+Um=HUJ>8c}yFK%7qPx)+x=5Ly+4tqw(jGB4^9a%Y49sd$cR&UK; z=W?YHoopbZh#&{EjmP!VkpK3ytf`LFGA-NTJ`h0s)_tTi~ck4TDwl zN~QZP0#%#(BkPryS<1)nUNYN#uj0!%EPFu(b#zHOjz1y7QLV#|Od&HBdeM!sa=Fu2 z$9>_EwPO5-peVl4lpK6Dsq6D3_D>hSp)qy{Lt_NXr%wuIb>-t&;NJ+P?2xJ_ck{e0 zaj#$g-tH(WEyI_T+BA}&i&FcM1!@gq>ngEE{pV5lYy+);(%x4>EW;$P>~gngU>5iF zoH~U&6=7@=X=mPy+fRWXq+!t(=q2GL(j_CqXp8s>i8k5o z|6=Ve!{S=Atx+_1aCdhI?ht~zySuwP1Pc<}-6goY1a}SY?(Tkz?Cw6@r@Qxe_q`uK zsCrga@$h5TT<;un2%-&=4e}Yn8R8i-#5eyQy-i34i4p!sw)ZxzxSnZ{0r*yM!Ti}d z<}Xbl|EhrkIDQzL*<1ZEqm-OH|dN-W&%tX=DV4KtSuR> zV*@k{nq&$*k^V@Cjr$`ZRyzhK@6Zv6lSoR0D8o4%k2>*YhkZ`WhhGEK!1V2^H>2t- zFflmq&A5W`IL^cEPBIPVL(7P{PTXNp-+3!owCWZkO~Wt0L^Hiiy|>7`OQQ3tbN=Qq znjI6Az3;nUERY3d^YEfq9Qwr3dF32$H1jy(U(Hw7KWQ6c_gy&(unn_0sz}YQQj~RR z1kK#u5_DNHV;8M|6d;w1Ghx?0L@4S>EM$yRmp8T1c>^K(HCbc;4v)$D*z}Pq7IbHZ zBL1wrK-!?#QSu8*eRGg7H-a>jej3Wx>;)xtyuAg{=D@;>$!)p>h##MF;MFDO!~*Z8 z48rV{_Jf(eh)Xp}&q{S|3gR{Fe?|2mY~oh|h@q5qe0o>t^Geql22D=|VeTL^CyGb8 zonr1T)+^Q}xF4U_*3njM##EKKNoj^Oh>t!TcKpWd$u*AADgl^%@}G85vA@zq|2t~* zN12oX#Ms?Hx2PXH^lwtiSDkSytX|_1AYA|aMH@vcdO|^R>lP$Q!4`JI{fZ`CnMBF<$r|WH1z-8hCHa(w; zb?Z$M11d*60ZOAs*+ngbsSMsv<$FeWS-s~v$*}&1!O#edBP-zy*Ci;>2n-{d?t&+% zDSP{UTtw!zsO~K0aUXwCUpeck4?8XFHZ1=qn)-KHUvXJ?YMkFXPT(;dlLs1w1!YFuJs&RHaps z|4jC+SDWmKZ-|#inOyv{&O89gJ)J<9SN*KZtb>AkM{hJn>sPkMc`!`@uk>v(Q`*6; zbV}@R=0UPvQXcDC*KGWABH<=x_V8owC2H(o94{)Ae};%p2f4K6yv4nezbql_g2Qsnsva0 zu(;FuahZK79DUJ_1XALq?4=ggxSDAQ*dcPS7^PW+>3v#9Zv_SrnAoq83`FlQ)z~7a)|87wS7!lqz z+dQCF**lc#Li~1mn>m%XXmku@Qvq4ZQ@YcYZ6_^L*%eImOw%9UP)SHg=44wzX^5hsE1V5LteIIcHXd z2@^H2S0_W(N1&yw1*0*)@~TD8N4ycKW+B4k8>5+ z#=y^3+ZdyOK(xlGkv_nS%L>ErqS}a6vWtBt6h?hQZJ|<8mxW4T8^2gr9Kf0FA)Djp z7SuXVP8(vDM+KzAyixFW$Hw}g&F#ECFqeco{rs}})itb0`}e^;F4Yqy5l|I>Zl2=v zm)pkQfztmAP|F`}W>f>l6<4WFJGT9DUTP{29J(lr0^IMjMn+j6>j7~RE1?(+qmx6p6j2xL&J01gF^R8-nc09oep)0rC6UQ?sS z@JoBoS*qjh<6Os`xqzKNXLS_^LRXR|`?U z`iv%jsYAo9yUdTfjn>u2OVx34{sD!3LAD2GpBU|=Bi=B~`Ry(lO{z+Pl0BiOD8Ixt zaG+6Bm;j5=BV^W}||1 z@?{$7_)gC|V~{u%@N3A#dbuniZZOB!NcaxNyD{3l$Z=c?8#^k6xQ^V!@=~y$*`lc^ zN(=|pz=9ar@EZ?UX@Re*p(mfq?Hm$P8-Q+E%;AyfdO{rcySMXj9Sd$L*^xiw48!a- zqp5aDk=};P7^5527%ZgaSW45RYQ$|g=}*B4vjq5XDhzyj0U60D7Nciceh01qxe>WeV982K9jRavp;tR>#ebb5F#O$_i0ON|imy2cC2119#1 z3gy{V-oB_+bevV+{mx$EN?F%e-GdMiV(KRqnV*i?!?u!gQ;GtK{5ZIn3)MkU(LGk#<1|Gnsn4^D3@T@kqTps+ zYdU?e#=IHAs>xB7y%F*SD0e5<fXN|5`G*oZqS)bge=BfI&7Gnq*+N0C)J9yBt)+|W`)s@libdY;)ToX3uP@Z5|5}PcBeSRJ^+pUS3|#od8(Zc4PjK%5K-Qr6F#uoOlD z2hHG<=l&%XCPZq|K&b{#hzIMjH8X4=^F7hV@UsOPctk4osZ_S3FbVBKM(85yPLxn; z|9D=TNE6!FO8D0cTZ!CBl-V!sv!na*YWN+8sH+HU_j#LKVh~l|q^abnc~ga?eDpM> znEPV{vpY@8WH-%qh4b|l(RzsQsgG?}q0N&kS2Up=WN3}3{&$=@0cNGD+?lYTI#35nraeX(Ow=M`dKeiL6W z($ZeH!RY>+sLm)u4h?p3@QK;losJWUwuY(Labu#+YQr)P1KRJ4^H}&81a%j6fRptQ z$MUURz_ifz$BP9*1t8=j=>48fjo`B*!xtGhYl zJJ}Itw3=H*`Xj>}Tsf}EyrsZ4SuQ5G_EbB6a5Sl;x+N;1jvSr2X~D|?xK#}+@ zj!A_UK;#t1kJBb6%3fi4rYb2)A}rSsTGA-BH_9dZTd-{*Z4v@XD*Q}C?&0+QC?{eb zW~&;_Q?_4)E=Z$t+M2pMvLC@G=(IrMH88b6DO02zn6EOE{G-&|@1~IyLL2x(Z}VT6 zH+&rB@}N9xrsQWmTpM!sKXXFRhSqR;&akLL{jK~3}DWi@aQ*wlqK%LT*SkYCS z%$ZOrp`3!H*F>oc&aP6As!~^X-^(#&@Mm(RS`53R4Nb7OS^5bcG-RVO7NoPa+b$$W zj{Bo*C7P)+{Y(+XsR|i?v(+@RLJNh~q@NFmL%Y>k?$>BqBoPyklcIJr1t-l2tOZ(q z6;j|7qmmr{ktYtmahZa1M~*3Jt_NW@i@H-?&c5yJd@!62&RQV_XG~e@@T}5`Dg`H% zq=1Fb*jLgGxWF8P`89t>y;HCYFW(#kwI^hp;QZcHAR#f<4Fqi<35io+6pl3S6U)`9 z`;VU|2_kDq4l7(CvIdNbV&`tFL$QH`y2D*iFD|1ZDtT6LYR7(r>O}Wf9qcHc(Ue`G z;`Xmp7!GrWv9#yl2#8d&rQ7*cP>grV%_j;Fl%JuN8Ej)jm}rVpW9_&u;?$PMAgND6 zS!##U?o%agXPFmz1!Zq80qB1}%m#BPMIdwLF8B`b7nC(2Vohedd+>9 zTx74g;w0(vmfLgHVKJQ$s#YJB4&@KUUoN3^d$yVb#S6$vR-vp6H%QXE8DGo__o+Uf z&duko>KhgAo0Dk`>iDf*#z;-p!P*!*xR+3K3eD9F)p0wtkvgU1U}HRS23I!Z1SvQo zZ?Ro`J*A}`MOhhHr)?#2r#@m8YN+nAx)|uSmzuOXzD#eGxDAR=%;8G9pdHIwZRAyO zBnQ3g3yMRr4m~wKZ)tV)C^2Uhx;r<87c5X#HV-{D3Jh+1Yo7vs>jD{tUdf!a?t4zKnjMTt-8E3@zFc2Mac5Wj zHM_^f)j;nh*6v8va>h^zh7eyKzL|v2Pe8C-wy)eZiN}>VO8MOnH58uS(25KGGJMjI z99o=$HQURZ;G58#LbWRw?$H+`(y$zpq$>zOrck50+%?Yhs-dotW*LQh2Byz$kE)s+ z;A!+l$0e_wp<+ITd&rIt{gB!lYC=ah^1POMA%%N9KaRJ_EfFoh>dvlaS{^!@_s3bj z@!KZLfr)4Ly(;j$;v6w+f5~ zxKi=Z91|$+ex{Qg*ikH;4rn-^K^bU20fPtVV{FbcOqLADBXDV)uM*J5L|HVUZWbS79jcEit;)hruTT7_vaz#}*J$Xhl@XlysN1)Cu=2-+F6_8mVj09h1UqrKW zSRk2DL9|Xgc@kOk9+9pe0a-`+VgoOe0Ivbr)_^U8tSdv^lld-@@L5CH2KO|AcBUiQqWiXx zu4@3DM)%#b`g)MAa{-;k`ksL_>ZClK0lQ`yl6B}5pA!VYi_N|Ob#^12L;8x4t}_5d zO3d;A0~zVEoEreih=*qaxr&2$L+gey-=hJ^NQ7qsy9(=b!>n_JTsQ!YON65XwNe0g z0G-ExwZg8WLfw=4s*tX;csA0!aG_*D`7TaOQN=oUglTsujq82qrJzKcvN>=;km`Ec zmfhSuJ3IJJb$N2F(~va4f_;7$N%YV$x?OW|Cv$D$_l(ZuM*RA!g!5p<^x*mY!u29R z&|yHP^R448$0b{dzkWcnJx)alPW@g-st$Zs(1BdVms^ZPh9Q>CUz0lKXmtDNvo*q? z!ss?Ozja)}h&gMl4X|5E9F1~GvM1NTw9qB1@#PAE4Rs37v}8N__DLBo*d@fs_7neW z7W<{N@ufe(8O`G}BGUt6lnbKBYf|zv*g%VT$?)Q+q&L#`iqIvV@g-W+9m=4U@nsFc z8EuS7>L9%@w+QTfyYb~P!5R4}1w_(dg%DThYey#@#n>IU19^o%w@$6DU-GlCAwMlA zhbrv)7YA~iudSlXYMdk64WG4X9@~FOdSh=J5k1HW+1QN|=<59+GULNn;{7+(rT z!6P%3k4w%f%+RN_4M_$qb83>{n~|~kKT}3~)+Te~Zp(yi2PC)R4)lj|v@c4oG7MdC zI>w;no+fcEKy3pv^aqb@YkhVWS_>XE#KA7BO)|q|a)XcJp{9=VVsf*Ia?tO*G``e~ znhWKvV2gzZa#Kt@+Zx?|nDm^>jYaP1OgBBPQK^Qbi8RQ|zB>ixV!_m)j^W-V#M@d8a0kSh@Ldq|MgjkVVaIH zRza>HJEw*YjkfXE@*u)MVhGHRJrf7qCFWHBw%&Zd8gECfMaD(StJ614>i}WsD75telO8%eO1f#N=@IrDhGB2RtUsoBA88 z=x5ybCr+87?Q4?4ZB||~*AGv|m-z&I6fr)!WJjD&deP5C$)!if{XK2RP)urb3w$Up zarmi&Y{FcjyoEfJ!Y`B#&40h7B6L|XVyI>FrVcxQ^!|zub;Pp=;Eylad?QY+cq7|)e~R23*gfii0{rDz z_DhZTH@y+Xycv@nxjzB^Yj~yymZ&$%m^Y*M|4}PM)1aLz?fk=ev3eNU40FuuL5p93 zEbh#foNK|RS=V%UA-D{62BvHM&l=o}WLM|T8sZH2%?E^x^b1dnaXMFC@yCwLirh%K zl{b)g$dGaetH2h(V4VecIR1BoN5{Vc4*kdd)xTPn{-59SH{eV29aWK^PunxO$q9~O4%_&T~DMQ%@DuLRD_FE8L+Tx8N$B4RaaIqjT!@nDLGY<_j`(W7o1*w*244ikwg2}+TiP5Ue|dA@Xhe4F(55*Sy&H4 zg*o@D0B*Q64lXA9;;c>4EnkwOFVz{goUp-W?X3=!6uu8;s!SQo-G9AxN;MoWBjsbJ z0)uYsui<>gh7raabxp4c3qKhGQD?|$q~8Q z4;%8`A}fELea4$xrL$@u-fKWBrL$%#fJug;%X&k7uOd>yL9BP++51nE4pjb175yvl z{KpbhR_`AMfB(y}piKTZQQ)Rp+MzI$=hXf5D5O=^pRuF<%W1gRPHoc;k?CfI9 z#6)^t@lJ&Pz2eHC6=I0G4z%3W>~I)!F}|HU!{-BT?NJCC|Hp=FFaY08$5sx&#|qFm zfX+?dej(wg{Bn>nP#yh^oF^APe)MV6(dXj=FB{0GpqVOmG;UhsbQS)PP^=*OBWPw~X=5iF$0!?8+Ig-V|wxwLh(SS3Za%_^tv-{!RI`lCJj+wX|Ngn>J@BGR^=) zaPAd{nME}JY;^Y2(WP9KTM)U7jH*!p7V0T`yWcvm(yN<5Td{)iyY8_uVOtPI%wZKjL?+3q(CsHdhsttYR) zQcwTF4*W0Lrhl;g{z)_Uk8A&d4p^qJBn{ZC^1!u}cG^Oqo>5St=i^`h1k)!$fDP&l zB5ehv>V3d6ZXsXcf%M4_2?>Gs_Qf|UUBFEkwysV(|D>d~_v_%t;pxNg7_+lZ%=Vyy zzF3OQ5V6Lvh==SuDD;rcF1)|_OyUSpSBd2+oz+{CoHVbp)swX{KGs|>xh*=zwt%r# zg(iwI0q9Y%_#wzY4YJ|yXIGo-rTur3Kdm_r?vV>$EZs4&E#7&;f6(M1Gmbg3+M zu>nR4^HB5c0QiaanHX!FQGTX>be|0Dhegi&QHx{c`%}1&Dd;CR@fuU7t-t#ug<6w$3bKlL zMy83cT)0v79Bk~8;+L82a{JInHEUi-d30q-MIS9Pl#B98aoIj;t*YTIwo*oq?oW8OX~k_$4zPhB4(Kd8U_NHxQ!#$u~lxpe00N!3mVI z9`?}Mthvw55fp%oYx=R5o|m)Q{Vwi>EMR>k_<@e>3UYzaSVR0xxv+bP49_D9Z<$*& zjSEGS3yA9RrO-mIu*8A(o)Xs0(2KqspneN(O1?YX*r_N5eKpoEEcfL$5mhfHN@U0fn%Fh56h(6hti>`#K%z(s}yf>q9MoVd@izi|`8jNe) z+ehaVJ8@VW>pjF`Ht<2#vxXN=ftSn}dlXlhdx8}Ti3h}dw|6=K7$Qn>=Abo)K|Tz5 zoEA6QK@^q_zRX+*c`xThqk8}L4(F+R*Hry)gWWQ#T4L_5FW}(Z#uNeVm#{i#_MpGk z0m&r=Zg?t7jb|$&6uI(!uo;Y{c(6{g$(Ga=&Bf2IZMN!S*?LHam5a=^EA_VG2wNg_ z7-%Wt!#3Te)GIv-57t3+30zccIXq?g7I|GB2UWs#(AUM7gz;pWgccc}_@es-pevuH zM9byBAv1Pu?#j?)L^JyDk>pk(E72gfXDKva#);8w4f+i3xjMUB*vD_uSEvfL5{)dS z5+4B%{o%v>opFAw9MCPp|8(v9*L9#OdT#n=mX`n23`t}S4gdYBl#QX2rO`jd#n%0i zh}R~4Wg0^$HGN4@Q7=nC2~V$zMktFwK`~JjSQ(y%8OxbGPrNi;fQ0{ULH|c0UNTfZ zsekon8c&_QjHbE%l;4yA-(cHJAcvWx4;dn$sIpt%_xwYeEPZ>afhPj- zBY$hw2EGJi-8~W2mFu;r;|8g_Ju|v1L$j|G&@J?GN9L`%=3xRDM$H!r>_&vg#EBKt z)PQs+Cb`r?H`ezLjNvl!ZG(jl#$|Le3?E(f5^@HyOzx z$Y(!wvy~;y>`92^j%s(Hd8tJ zu4acz@ue6NvoREIe)T~C9fC@%n^T+7{GK!zbOx-EKkI8JrZlaeHKOVgOg^f?Dys0c z*X#9mvTUGbj#gQj=B`UJ8Z6hUU{I&LhUhCN&RtW6viK9#FFGH(oE|f=L8obxK3mXK zcIq%6B{ZH@2*~B1rQy7s5q=Jkic`L%U_Z<{8A0lpb;0d1*28kjhy^E+ubWQjZ7+~N zV47w*#Sm$JWw~B*y|mk*T^zPG3VOyY_ezuaIH4^=YBNHvQJY%4oq9EhT&q#My>vB* zkI;ebva^o&C^`d+qKg>H_j@soeX{Y17|`V4|Fp?@{N=m+A6&Wrx|aUCy!qe70sr(t zMY=fH)I)=EtPXW?a3a1+nn>!D7AwGzNV=;#sO2We97 zaUrYmct&!qUTW=XbYhi}EoXp@c8#G-cNo@n-@|%flyoVh#J#F*WX@oYj$JR#Wf-`^ zj!k`i(w@^&QyKm$iIlq6Puv9OF?eb7KKND@(whFPs3N&G>dPz#EvKx%}w7nL6 zH4%gkeWwmIcP7LnOA!~H#!M1+Ewz|3baWX?-huNhIs#gDgn)lgigJ_-vGxWq8K&j8 zZuz8-CpJYY5G;!2qr1HR#l9JCvw!WPOYQg+?!IID1vkIj`rlbs>1Nkll>cR^jTLYq>xual;( z#dpRS6e0(pm#MSztJ)(Ms(fv%?*si6o%1W6I1!{!6JPBze~!%fedJ_qOY@#61z_zua+vC*eAX1fW_l4Ioo0_)HZUL%u zfJRkPCGxmov){xXw^i`N52c?k;zSDt6>PogktRh(nlE%hz}D3Rnbu36(TZ#gZH||u z8c1)ZmKZUD=L;Pt)qboHss2ce**WAsX_R)H&BBdUC<(_a5OFU`H--bm{otHaH(cl2 zPMo)TM(i^K;CAHIva8;mnz#hYcKu5{-HmdatC z#4n-?;)_KsKm1JCj8QgnBwr!zQ~xd&V{B9_BdtFiPtTkZKba)hSmK2#t{y+xNRrz4 zOyHI}8IaaNR;XrKOPl**UrC?XM3I^>83((?{6Vm>*a{Oj?%19xns#_U3RWjJW~ZRQ z$WZ(?#jv*^!pKpznynWbMzWT=o8A%0Q)IPN-(r}Nlg#DCYq?4}4R;u-_)Rq9NL(U} zk(2VE(4LQur8#yoTu^5n3%a(94KqEOxSiG15wn-S?l53XJ$`)FXRy-h#36&Wxn(`R z?C=LFJDPAQq(2V@J6)oM7%`6!{l_8CRm6|OEp+g^Ka?>pqfYtDou5rGdy&%xK6t@Y zpvzq75#9i2vDEvg1GOmXBIt^;%vk&Cp<)2f=YliDxe9t20> z2ZL(EWG6myZKI)15V2oo9}xDxPM!XL`x7Q#k4U zR}h|@u>+*@B4*yH_iXOR=wdG7BrI0df|@=3)v*o~yOFKVVbzMr(5eV^jC4TyKI_s>E*s9?j+fk8?Mh#FaJ_ zy*3BE{d#N4p=&c?GC$i3kAJ{lZ`M@eQ!)9JqG$TQ2vWXE(xX+615PP7`f?{K;umc0 z7eeRwv2wWA$QheE6T%#aIj3*Gn?JW?l#?Q$@q7HKeA@CaH~;@ECm{LHmlZ6W{#EJH z`!@#*w$9Ga!750^eInWjkSS=$o_>>%AIOuzx)3%!ERE@y5)TeeuiK34=WTwQp6A4@5&<@8E+z?E;M#7b*T9@{^Ifvi);Y^@<6uSHl zN`(uu0du3Cm3n~{2daaem4Bilo6{%GtGjmk01{zsk4??x?e=Xn=9M@-<~N_?MJb+e zvbWyZ@cN}#TD(Nhxvlm^>-HjE;lx*%*y!nkA|CBfffEzvi^x&Tbn!Z)U&Pxv#I&hQ zoG~`H7GrX)T`!mb1b3F^A%Ss@wz#oFsbLhZL@~D9Ks{oMN&<>oyW71`Uf0D+-5F?2 zjWEo*TBdJTT1bfjpB8&ps}SU=yS@mPTYDiy*f&p z>&(^%=q6Mg;cnUtm?8A&GwpRDHJDH&w3qBE?ECymoF>NHY{>7-(a{va;R$#*S0{L4 zJ2Ku8+rmi{l|+SSSix~`wF65u zw;b77d9yk2VX+E`)i?#evBNxhGA?$vl;&=*?z8jYrL>0#LrZCpuVh7Ic*2+fbz*;~ zWZM@EZ^adiHGJ8WvmVcWH3 ztRz}xd`1189?G3Z0|B*P-Y@d@D9vG*n|ppG#;8KQy;8Rg2^vSyZR0$3KKdzSH_S^9 z|GMdV;iu3q_vh=rZd;`QB}V&*?iY@wm>3DpK=i4QwQc@ohF?AVbjn_h_`Ob&QwBhv zx}N;DfP@`8k%6T5eaV4!rSCw;f!K>dyY@d(J^9rD2|Ia&gJ4Vp8vubFOpy zifM^ufcu*HUIXJ0IaK_-l9jH*Xsw*ng&qoP4xk54ngwT)5^(Jd29^h5v@>aRNq>vb zexOW6r(ay(Q2GvZKowmcZPtaZxc@5HjV~qF2zl3YfAso+-?FdSni>WAx?FiJI zh;caBhKQQmZw~S#PJc$YEJ$dLlYYg!M5DDBpg!2fC$O<_Xpfcl278D|c-H285E;0u z+lHSWe#M-csyCrbe}*wkW-q;s0enU$7ICHL#}B9K=+o_nosLRL;n?a)w4D*vJ}<-!}$>K+t$X~!RX(hS1p_APbfU6DzgBtR9WXe-f=c4 z6yG^}KmZkC5VYh9#kjOSV?zY;!Wi=_s;H5WHQ+1(BF*H2N|iMDEP%r%-ldrGj-nwfz>!npg}EbsQ#S88M;^L|2b|M}+WH z{9@#8<@YTDAOqEmZ=gTxK2iGMOBo)6{=&?7UXzn4F%H@=nu3|oS7jf=z_QDT(!hKr zZMJHa%wN%;=VVdGbAJ^BM6T!+JOl_gF5Bu!o(8I*v}b$v?*`VsGC8rq2hbfHyYI>e zo$?_&w<(d4iXJsF4s{Sn`Z(a|Lk;6H+kQ8F@Y=!P)&6lCTbMn_PxYcp);71sE#mo& zmDB2%t-mVLtyR9>4T@tqQ4dkM^1u?TMedYq{9u(m)zszA;7U|N-(=(Ir^rA&m=Z9; zTdM9#W<}w4>Kf5SxBQyaMAn1~#rS}wK2ffTE{=mr=^Cu-v)O&(7~MvR1=PzKXk04B zo`d5)qC=Dk+SoP`jWhr#=J|}fQc**E77G^{s```a0issDMm*9Ier}xEr+bthoz*5v ztGmo0cF zUUSY2TBuABjlkmcYT08v{o)Q^rvupaYcT8<#kebCf9n8@^%f?dWBGcHtY#7>+Z0+; zeau<^g&(3gyiiIIQA!&#ktb?I9<2hKx^KM<9DKN*6IBG5OrZ4rk}VbSUiR3h`&8k` z68WGuACXakFuj9c2Bv~;lIFDcQuZob$)YvgmB?whG?BPI^rf-8>=F-gALcb3vYk!? z6bw(JJ8Uk$VBPusNEIQXEq39lffBeI38-QcCkHd*QBrR*2{?c!<5jL)9^%;ju-W#y{&mKycG4_22)ie`vZ4fT_RW{h`MfH;1oe`&yRYb%w2^&I zDYU}F^W5kJ+4oqx6@o}XPDEj-FF1-{^+;va+bL^gQ-t!E#w3sj(SO)KYnA0=7Idkb zRS5x#YW#0SwTe15b3yxFRG#{nPK^5zVyn3*X)2%yXVs9khSW08tWeQm$ zuSIWdUoo8*%{(Jn>ac7pSMD*Wnc!&ouC_fr%h{j%c&#dI%_^a^L-x#T=exb0tnw#%j`Ra zf2fwZcK%Q;6To^zi*?2?TWfira znSBOk72GrMWOc|7!bZZCC3UrJqU_|j+7qQjUg*N2xlk&D?w^y|I`yJKXj(oEvOvEZ z*)2W?#nb1FY(NdJM5aJddzL`3jEKfar_>h&bcN&=q|_pi5> zneJ{+a$k2VD%t@isoM;kr2#DD_FCl7#N>7|X~g+NB7zyjo5WC^bWj@V%)ltR`P^%r0_nF?Sra||k^UqKwL>dX* zOrr{0yge>isE-%j<0mf5c!iUlI5BO;f0E6~sW~Dgwq|6ma>eE%?S7N0?C=uE;|sP$x0Gx=fPMIL>0Up}Ts|AG@eW zou|s-YG=#{%S$pFZ;}{~jo538Qe260V%N;Kbf`G3>AQaGs5`fN`5N4IKg(2JdeGA7+bS z+!PVRn?*vuMV3v@W&cpb)}hoI>6Bm7DPMo;J-0z}2{ zTg-=FYUdzL3Kj9uCTJ(ou;oJv)zyU2%| zP)l-5c>6Q#;x~Q-+f^fdNH84dWDH;iV`4|8t$Lg-0y0Yuvd@x>-^36U>Sd(-lIjts z35+d!V85wpG}RF7T845UT(Roo^?d!V3RGn}Tm`8=C`{w0T8}uqk2YOFGy%S&Ylz`t z<0&@B*H0pVG%!lWBOa;8-BVG~bOm(JUZ#oU!_USmf$9U}*+u0|rS*(!J4)rvsrAfr zj_E#2f#zVKG-N*ZArDw5bSFrnHB~5Acqu{p1@WXuK@W;^+Sw5}&n~oA7r>sN^n&~dt>?g=6n4^BOQz7M*Izzz z)iAAj)-ct0w0pf>qIME5BfGAM=_dzeOU5cTSJK0`%H)gJDb~}|HZe0qY)fOz<`^Q( zwk_2YE(AGy4?EKI8a^{!wrq9IATBZ%>H&^ZHz*AQADx0TkY)y{agEv;13JIRz{Q8h z9Sof~M{>4@w|4sT(QfDoqno}i^$k%#S-xtyfGD{fqp4b^F{{gbIQhm3#)=i|G@YIJ zG~`wtY)9hpW7;JodMK%fy29-#?F2V9&+vuX7(JK@%l0t&f`k6ftjqkzeS?9d)ca%A0)SD0HtotLMbuDH_~&M7rK9PQwEqS*-nxeH{ts3(*qs3NTc z0iB)#*ybNMSr@7b7sWp$z|15gT4D;+qfzb+=mm~bosTDPMTP}-($*WRno!#&8TneI zd_arZgVRABUV;^y{pxh_YC_|Mldq|ViNj%sn5eq8p)|zZ+dxCVHH7kjT<*;t`y8>u zqRAKNd1ZO&(RUV+6RK*I&XO*GxhMPZ8-$bCo+^9=+&+ubB<*XEw&f}%a}^vWgHJ}xPR$^1v|X#_X>&Ykg-59)kI6CfC#4T;K_SvCu`Rge zuoDuGRA{dsaBvX2^0PLJ<$N{kqDt=~P$1#*U*N-g>%6LY<1I&cv$v&=Q~?l28AAKy zT0guuH+t~=hxg=G)IY6`zm!GuukgZeIq^RXF8(9B@NaVK-q`(9WW^c~cQau5;uIq+i!rx;c+qVRK>i$pRZ~ZM3>jbg9DK@J|HagWFe?SXiq5x>2uImwhq8EuU z!LIGgs?j`ql34{bhoba%`-jW9nF*@z({?NKBt-ZC`vSrb@w%!Z@d;nkp29g2BKmp&skAa&wqt>H2Ke9Vg98x3D`U7de=>7TO!%GhM+{zPZ5O$J3D7PDm7M?My> z85at}v<1)+nt(ELMfgK#c6bmN7a8 z`Gx8Hc9=)rp0IJlhk~BfTj_|#z`RLBs2b)yygVmeFm=puEVRcpY|y_3bCkz1#>AWd zv3^3+REvEBrKy5~_mdFi_ovS@qk#jvj?O#{lmd5}!NewU(jims1-16$A=7J^fvP{v zA>ft?)U0!8x+xy<&%S*3S8V2IajWQX7(6Ci+^?1ErbQB4X7diX;VUW>2vF^F8gCu0 zv}2!>-m%Xs#WK0WDEcQe= zwV)j(K%Ny3qdlC-daD=44*~1;3N1%`L{)cX$UE5VV?5lRAdU6Yg4?2FX30vtdh0(aV4UxwKO-%JZYeogop%q?_+_`WWON4 zw<>r6_M>-j;m@n;FS+UeORIWEtoZeLGNx8y;hA?U7s5 z4|8Wn*g*JIG?hy=$s@6XyR3=42gB0{_F_#5+mBO}nHpR1$0UP(#8&EY1q?TjI=Hte?DT4Lka~GUO0!_i?8-8?g?R)HlEbju!ae7)Af_Yg74qyfFw2p} z9&F&Y;ekZ1z7)9Itx7nTeAoDNzn)=_`-cZns1Vut}VOl+Niawa*A6mlDqmj_mgs;NV@MC%w1F zW~AlR-#N6_)iFNEn}(KC)>ya`qQ=%oUqb`O*>b736&^aJV52N!d2@q| z`w{2Dyb7y@c>GNjD)c@ID`=8TYSU}VY`D=w-Xc)!cnB`uIxT3HQ5!yhVM;f`K7L;T zFDHH%D5$>{JDcT&;{!TmR>U}n0hp|bi60aQSy)~HWD;FWb2uZ%wd?>d;kW6bsT{Np zy;~R#P*?HUL3lg3xf(uvL*^*DZn$M`f!ENcaj(H)Lz^vW;0J4;ONr_`+YaB>iOg1U z=c>x%;Fm!QLwwYP(Wh88NS_QLxDD{K11-3$uX>6;znzh5qZ}Od0KBTjKjl?@{mYgA z2R-UPM~eXNu*Oc-hX47+e|znJX3$<`DS(qQhBuqk@qBXagDFMeR03-pNgUk{w!FAP zaJ}@(FZQ3F24t%tOoQ%oi?||X0rz5%2vqX$Jhtl-pb#JbAJ*P6unu+0A8u^hww=aK zW81ckCXLnDb{gBZ)u?G~+iCRfw&&crcV_OHIrIMWA=!IpXXnd$*0b;fE~ouQw;zF@ zyXlatHIJd7(AI|AUFQDBwdhnc4v&YS7YLCXU@-WPstD<}W7jLHi;hNiQ>zN4yH`oh z9`*ZT#I`|#v@5myXwTKBD*dk97pgo6AGG6YTIrPwQCQ#HHV{>n^HRx%a!YhNr*yI* z;O_4hDvQf#@f^)Bvz6O(O5iJA+*pjMwx+b;Wu5(Gvnj8NQ6iy?^-b=$ zJ!~Si(;tUAP7vg?HZm3|kOzW}SZ$@V7m5yrL|Dyg~Ao8})Y6I+c zPte~@w69xbRR_twZoFhf$b*6&@WuP0+atNxvIWSFeL^m(FN z?>qcseY)+v&uvuCx>0E}vU_o`1+6F3xj_Te`7k?s771BS=E|oZ>Tf*`-@G|)**F5J zosD^$s?Cwu^Ko~bScMq25xKtZeTstbcXJ*&V8r{nS+%W-*tvv4o^KI<0H-ZZkQdLC z##T<_j`Hcy)f9Y&qSlyIJo=zoMcWVl*fQZOQ(spU%!f}=Vi0CWr3qghJf%a{1C`@0 zvShI`8K+y{XJ~~U+K`)oi@T}X}jtisvQ zmXTWs)2ONkA-GF^9DXWq>eBJ=auN&#Sc+^uW4)_mA5?fZJ;2Bav5^vaN%@XaAJZMT z8w%$F^izBz_Lp}VjSXdT8=os4G~QjaZ&1D4x9*;Ohi=_X{D}PMJGwL>--kN26+ zY$s$^yJLqtUe$J*G*t!h=Y6_`{z1>GT#rB}Y*xEChdbx`5%s1-$ulGCeQULGc3^Itc0Rf43m#4`ZKTrKFM%`P8JSrqK(i_Im(#SIzn!@LA5PPL z(LqE^?CqR??wr&N98Hv541YfSR~*rV@)&>_g31eat)CP71;IPN_>&NwwxKj?o*>1i z&whzaY_njf&T0)R^N?MJ&yX_G(%KI|J_(nua@X?YSO6QGn~#}JM++6DH@~zQ-61D0 za!vkRJ~a=ywaYbsK*ey4);dH6P?D?+nlV#ZwXbaFgJ%{Jug6+VOlTW?>0dkrGe*A# zp9P}H)88^r&XT2KYMPH(L(||`u)st^sxSs`>eMi}lislF*_@3gRplicoY~#8WRGB} zzMdwiC}Zlr_9`a&UD|#haHRAF)-53$=T`QyLXZSC`*J<50&Pp@BfhA3u2(u zt0RwHAc$*iXUJ1#R<47$Lu)t~%R@s_a=1}$3T~o4R~t*^q5#!+rbb($@f~JN5k8N) z_FjhjSl^moeD%R%mw@F)cFG!*GaBZFa+6qiP?Iuo(156ZgL|Loa^u7oCYMeBqfvSY;*9=$Yy{yIP5kdrDjE5 zmW||b=OOA4Q!0XdoMF0Nq@Ji8x!*k#>quEmv$DWJX(?}Jow3Ab#Ee?X-=v~Y=X0Rb zj6s}d;(?nyv0R;>L2xb56+j9a7Fj?k11uN{^RNJuOuszd5Z46yKq4lSEHvJ1XRJ=o z;gAK4w^@$e9D~VkY=>Z4ZG?LFi*eP)5!NM!_S>AwbMOh=$_ZiTybkT~+S%fxtXmDK zSCi5H;hCZ6gZ3n~QI@ys3U6^9LWADV&gQGQm5>yruZyb1b$=WJN!}Y6Rh9Mn^g-22a&xqnj=gMg}gKiFq!RVb{RbV_O(`d zf+j5cS;A>^orNAbyq8|uNlrW|uKr0?n$d)rsP}%G+~Ww5@GTBz!;_heSO({g%wP5? z0>UM(*5DzP=_gJ&N#=55!;d131bW0erz$d&08(NjsY2GTLGryFq%kG)ZTRJVVpz5E zWHBy7z#1J3iJe^37vL)$EsKT?s@Zko0AV-!9^@6G>I~#KIBV%m3hs*yuJZm1I&HjO z?nC6Fwl7u}`f$`t&q#g~t_2yG*Ok?I43A~LasekNE&Y;GPtvZbNU%uaHAK}j$l<=B zgCA|lId-F>>>=z#Gu$C09cB~8HEj)W%uFu3MstP`K!Br}w8RJqrh3_EHz>x@Rck&O zn!#8t#`K?u+(9K#diwJGj3S*_N7fY~H~>a<9C!#i=xW@mtXUKLG&#LE8J*bp5*rn^5`HgYkhB7Mdisg}R|8Mle&aMNl^SivkBCyOYkI z$%8l6rLStx^F8fFGroezNPl4c3PB)!(*yAqeR*Ol1!JuUNBU50W;%KQk!64U{jAU1 z%O%S@*ghEGbdS0ZbUI&>EEL4`@@XVB5;Xjoy&{)ZYNQYCxyp{I`kZg;9Zjt>m$6!` zmqd#KsVJJ$Xuf*7Ra5UrO=TCfm{8lHfe7W8Bv!CkGHT?ow5VjMF%?rVKDd2>^DqRi zilz<_HN7rRzb;bhRlpjEUEYMqgnw^0f~fbgPv^4v=Q2*;S|%RKE+M z$AQMRDek0))3b;>c-5Itt0d_;NlTI2D|BQ90_O3)eWS4kyg8Dc^${oA6CTd(B-!~>%vnLO^O2Q_99o+0&Or!52+30 zrvd~!zi(r|pDV?$o`}oGG|-BPN!LP#q{H$df2A9@(@62~QrTrzyaaBF-)&RiBjF-0 zkk1D_disIE+6?hh4!FmAO-Upf{x%O!l?crQ?QKLlAZR6u7GD@$q^pXl( zi^5D+PB=53iTqJ0!B{T0LKXUW@cm8yAp(+V-hD~3aBo3QVzY~yOtT=ca5GUs=G~=c zrGjVO2_6>o6gte>eck{(elpT**NFGF$vk%VV2^KX?!;EDu36DA4El5=WKBxoPPk_R z2x~H+Z@t(K{pjz2skGTP-Eq52Av6)q;XsxU%@IJj5D#EMWC^Fyz%xX0xM4W~GAFn; z*nV7`ZOQiVnd+M_qxhlQpajHAW{?WFP*HFo%l3~QUEeu1>Fj&an!~q2eH5lpJc1e# ze%y!gcW<<%ZQ0a+6B-b17|5QUk-wZ++F~%b3ktXUhVCosMWO6n)%bw3^pv|5(lEe3 zO>O|H;WdyCcqr9ziK`a9De(bR&dTlz=JNBDAS`+NOd$2)Q7PG_L>&rP9+Yu z6i1e`8pnlg#$ZJumQ5Wdfg>ms8r-Hasvk=u@1{V-l9HN0qzzi5m`y=PedM_P?l<3V z!7dTE@vb(j$LplV_95}~QEwFz7%3PB5-Qd~EuVX_KcMR4qJSMHb+4FCxo6Hax_WZt zVti5StxZVRkPaHwD2TH$Y1sN)(OW&7%kHdgVy|dt#*6cnMh8@I46}AZbq83wQ$C$^DZdG{tW$jYpSJ~B!BCXA6+GSP@`brsL^=fR;@n*HzKLm?>xXm|JS zDiQIH0jDb3+`_Mc#{~4G4AmWe>H9HudeT1K4?_H9{-SpS(`0k@Q2G47gttpP2*IKL z$JNOg%f}&Zi_64`5MgPOp}P-kX2SZ9U+^S z%tpSXuNaVs+WS)d*;zkzbsQG%BMqP#__bo+?n1SOB3-#LeBHi(`7-hP_;k$iiKCb) z<6$#YyaPYFH*|R|Ci^{x0}>Vecnpq3zP#2*dWWu7aSmS?rSY=ZL#<2h%dAExGe@mH ztQLp^y*r_Ew(lW)!FlZmX61!B&QJ~5TO2IP2v}j;Gp3zFrrh_?UdDDDm3!O^vUi2= zjXABg?Pw{Ye9;ypSg^pn37>P}*f2ChWI09mD6Z1UKNmP)^vh;P=u0;^&GKd2Wam0p z$c$kXJ_U{~)tt|EM<{ti_6b1CJdSG>CVCCUlrM1M+vY0^Krh2mxfO-ZTd$nl=OyXt zwf>lQ8J%AWe{vtrj}ZrMgT-;`b)Lusd$v|UNN+~#BVa;>TuZa-Q2*H36hho+_<-Mc zcBszH7Kdk|!Vz=+mYuO!GKM4-IgKGGj!6djH403)CbymkE4p=NoH$68lfCn~*l>t@ zK{G91K%Iu}u2?PH$B)!P6Bc%AWSJ0;e~K7CSXEutTG2lkAeL7`7{QM@0$s>yA;#75 zhQhr*@?ir^;+#2@`7Ficf)94q`v@Uu1|hPIG=1`MN3|FSlc{aexJXz(A1+CP@4|0Iy{$96(- zOwtITP*5SkdO2B)<>HJV0n~HQtJ|y$3KuFF^O@_rnj`np-rAXzoA^x?DmW+xK%sza z;TA0z%RXMiIa6u=mQ&~ErSBB)6Pq{2;_0HYsRJ!bx&*=fjs;|DfwYt(?_t7J`K2WL z_QPTGK1XciI@k^c7tm*R3JpHxcU2*r!laAWdK?bM~ywvWN zfPjSl^Ssf~+JS=6!R!Lq!rMV9z5huZ!l+I`7!SZvBa+m}IwvRftZv&Sspr6mB`UKvWjR40m5lzcx3L>)?yct}byR$+8<>L%tKm z5{p=ir_dTrGyzXpcb6XHmHFV*i3}qk@`ndPz3Z&^A0+{LDO;m(MU|eL|u{mj0Smu+@v@_G&KC>4%F`N zM8hxG#eYw7`ZwICUvCEFEn^cwXJ^OX;WD5sWrxCq2(Uybz|ovRr?fNoE8zLuUjs=+ znn$hKprW;l{l3li$k?dL+RpqJm>>56XypL~m-7Mzu};EWBnoWZ*lt)c2~gfyH02coA=h$l`o5PnAr#lWl%4I18UQKsMeMdk5syfVd(<&L z2-a`u?L%hJd*J9dHh#aZJn3!&pJ<8bbnIgi%aND)BO42kh+`Sx^t1EC3lyp7lp5`9 zXOJaR-62XqAw0@VGwmI=&s!l>X+!Y!5FdtEHs^vwrH^38G0iAYuf>d+ic}pF$zqr& zzC{4{G9X3*xMk5g#V^x?x}bUrl2mH96$E3$5MR+gOkflrCeTH;>K$pv^j0G?dt0KS z$LI~NeNIdOs5XJ&U{gVKN}WX;$bK&7b*qd%zDG-b7I!tzj#o(ckq>Fb!Bs0`9@fR^ z6q@i}N$HhCNqFUzy1bbtW4i+;O!+KY+_}gq`8N`|R{_zbZ3Yo<`^LhZR%}M2Wb>1pto_h@AGW{*HF^<6W#qqbto0n>up-Ng z9l~bXV^!v?bu*xNA!p0$23etOG}&+8N?({IaMTn_Tr62%U?dzXv8-ppy@p>t1!!5g ze`*a?MR$w|anE>fEq})SGoUa0DTY}Am#YZ)U)71aepOa)l9fR$26o7(IfsVw_X!Kl+N zV8A*S1mGAHl(L%eX)aV(fM)7pB7Gk#`u;ayq(?Z|EjIOvHOj+M@oWoNqhhPUgDKUAu~>d$;}cV_hfD^>Y9K0A6R&J4Bqu`Nv$% zMh}UvmOODGJHFMEI_`5gEt;q-t_l=xq3KzWGg99bY(_s=DS$ulXa>8x;KSd~RS8zC zACS8x4zRg6f36bGQw_+yS=GxoZ@gnbAQ1r(1R+~7RL?zGdnP7QH54#so1`MRHmNS5K zIsBLD();g3*Z*%dpr0G8f9*CZl(dupj1@jD&s;L?ojhV=Z*L&*O#! z3Jo_1t83Uv0{K~G>ZpX%pS`$ANWYLqcnS3=cM$A0t+5c_>IalrROx$o6hY=A^ffo0 zJw-WhL6<${I&VpRLdg26kXXl_3PXJu5~i|oi<|=ff;6$GIztY~&tjo2o2fu->v@tw z4;>ZX>va}7QCd#ii)7ofzw5vHiK=mpv=EVb7oRD1Tq7dTLtodNIdb3TZnXL)+0fg6 zDCQ3=VCj?dJ{;Y`;;bzzG74t{{&+pW3ufDM3S6)W?^n;s{N8Ub$hQBH1N(__F((gK zBQ)&Ma9olyCPWBdQ9j|tg3357U*|?Y4H~wmdWSDY$JS}Ld9ZD`B8=J|N{s9U$+b-; znM6gO2Q*8h);hBOsc=Catr=FWU_*3=?7b2gd0%q%ngOU~Y$`P)nxU0}NrQbBv~i!}VoEqjB?%)Q#EO7EIsIz7pusB(0r2DBz^({G~6i>)$!8|E+YvelM??I@A-X4R4D3L zp#lIq7H)1U4)qN#^FP4y5GwpVE^3Gm1Ozqe>ub-yr!KFan8p!}B>bpC1`WK<>d_z%HBA8p(y_I&{MClV>rlN-XITv!UD;z+ z7{++>DP~h>j0Q_n_9yWz^mdg@D4gwOz3M?J{1DZ%ON_|izU{VMehyF3SJ@bG)X8cz z^xG7b&B~#;u!qVMKu*icK?G$F>9T2e1V{?D0k`?Wicu)wmmrR0D~nA&)b(hTl)EU1 zPAqd|oO`LoM-!;8@~ReX(s%4H9X$x?yLg!;Y(iHS9q7yCpnOU5dV*=_8t=QbKMdU3 zl)Dc&&GdbknigLgf(8fH0=Ss8=EcH$S|98(%$A?+R2rw_2&+-DDC*Lfw%Y}CFUf0p zE-M>d?I+$$vvub1u9APZvKrYJ3lacAXjTh(Gwm6!z_N36O|8+<5a9l7&JeRr#~1h6 zzvk%yW`Y0G6if@ZjzCnq4}9B3w?ovV+X3a<8?x_UWb_-_`u;UHj4Fm3*6ctE6n*X+ z-p@GV+5URW10yRXBLiE}pDU0*>xlon@c2C| zeg*f;H36f=7~l>c6~$7vaVP3rbz+S^S(J0X7~cJX)=W zHt|2+A$U!uzTZzjALpPr{Y4{l_eTqM>$JTp*4>YdYOWx-`nXR_pZ5vIX*jYzR#o*% zvZGVh51{6AcDy(met}TdDUUNMQMXE;E)&25!0h;OBJ-e@_N>nVy7((hWA*2*{3K+? zz9%P(Xm4Ca?)Sl08pu0L{fsjsy^IOAjHm@nOXbI01KYbwAK4ERf?3O8%kbbvjE4B3 zrBH_^Vh9kw%!k7i)}zqp*heg&<&#*fPzaeti(t-vA3&eVS|`S~q|^NlE_}!^S<2#P zSzaV_$`(HbaLDk1nlf`jiaE_87O;k(A8shDv9%+NSdO? z6Y&ZXIim6dFuE5AQhdOc@uP^HJHJ7_%gc|PYk`i_J&{l;5unr~%UnqsMK*9Qu zD}qO&r#UQ{#Gv9TxtRbUYb`fJe`M!~vwqZC)M>)l-Gr?jtjCjH4(%7Ao_9$jo)qcL z!N)rUUz4p)NtHS5>tLSIShAn|lSkGDGx0atUV3PZ&o_M#F1&p&lxktrPk?+D3EIUT zhbl^GU$j208NBmAl^0C!?l)Hnt-xd`Y+4oh`*C6|D~|`e=uJCuXWB( z4`dVtR6dL!IVSFq#h*g+ia+%hQ}TrqqL+}tkUyrJ1N`F z&EXN@syIojI9ZiSwe(rb&b#yte@iu^h0%3|J4%wK4{tnEj9AJO7!Wh(Jj+MphK3=^ zrYetd$7B0{@n$mMU zUI(_I#zk4(e_|OWP&t=Iw~BFu5(#s3rsd+IHfxpfz0`DB+Pt^_n7Z?u&Yrv)kEpAo zT$xvbz!w4&DTLmF7qzd1(?|ysdky9)P&W+)3P_cQ6md{8g@X2av$RW;`eU{p z2yGgsYp$7lX{nrk5*x)^@*RhvPY6LC>c+XTW=(G^T*K_AG|$MuAE@Ko_as!H<@93H zIBb+?5zVtxR+KkrKbsH%?L(6GM~y)7FuY*2McN#eDk_+N59|yZS$7lkgEeNE21lt? z%k}swpTjM$mo#Bhyqf?H{|E_DBEWzfzemm9Vn9z(BH;T@+irwBW5+;llNOB=o`Te% zav&bJ5IDf^3pc1IB4yKOMZe8==?LMJ5Jt-Sr1A`-q6K-x5GCE_^4~##g>e?qXYI&^`GM`X4$5eifoHVR8#hkoCgvR3eA`2Ccd#v zQiU*mPVDaD#X|9d15LV|5Bu_r3a^4_!HS;EW#g*q1`Bmj)c!KQfZ5G0*%2WFx4{icyfjuiK#=HAn5o>b^ z`M||97>%4O$cn~Q^~dw)WCW)|Ud_8-i6?v`9;v(BnWD7oo`AfnaKFMxXd)q5kEHMw zO^qO3kD%}sZb6jjB#?WJa-?!pessS==qGqom7v_B;;4k1nFdPzwU)>AuyqCo+)TQE zS>=5A+ei1;ROaWo{V#Op4&~o&pYc^L+m;QgR>x-61d2%eJwu`TBny%;(~{v2h(+Hm zxF^oWnOU@sx)c#XfAtraw&h3;HKBtcE&FRu{CndcQ>OIze1I?BmBAj9#9z@yd6+Vv zZ87m*@NE+-X)iK0&6tRBk32c7$VlVcVWPBUIr<3ysE9XyH#kk7Im_|A)&2_Wk-xMI zwqkvv&6hF?G~m(8q|9U|Vflu66@Pzy6`*wMO_#;Ia^`^IXAKBau*qC#XT=m(l|drYdbL3%Q$|Uki>B1thR(w)MDev z9Ve%PB$BQvwJZYwf8>g~%^x%w1Uj>A%7jlM>lUz_+lL{SFEW4EO4thgT=F=Mr1K>Hic29cC7hM>e_3?-OJL+;XYGB1&=0hte80G09FWFn<$lN5-Cgk z;g@Q%*upBrPtZEsUqU+^{%bQS@)dfT|Y8CU)Wg4n1JT@*l9wjz1i~C(YvN z>kD@Cy%T2?8*nfDjF6BeMNv@&=Y=X0;{lG}Yqz6!Vy8hMU624rKltZ&KB$Jcd5Y$u z?+J}P2D3c2?@d*oZkP8N-r;Wp^%dJ8XALk-Ne}AqY=x|uX&Z;baBr!$ju*&YWpdhD z#t+dM88*>%$hVTcoUwMe`ZSjrT4)McSwt`Ek^{g>kGYsIm7-i5Ri47%?^RH-RNtg8 zC{dZL-(YG0SfzzGStj9K0gLZZ5^nonE}|qLv|zO|XFYdf_aS;cETWMoLh|?>$#;om zA~AHoUV^QVYTk0>Wi7>Ii-`JI#nr9d;U#rSISjIp5;J-_xpjLUM z5_T}E!`Xz!c1fu2mcI%aWg^XddoT!S^t+k*l5c5k{mNGk$u?(2sUK#Ll(QNyi{T3- z=M`y>|?CVamzlCZkw&-eZRHkmY|oJ zGpbHPkVc;qjy2c$3o`r_p*Q*j5Q;>9xt{=N#J@ALvth6|HfFH5vuAKJwqh`McD83Q zu(x0^aI|7@{6iv!0iYB5FZ>BPXCp&9JF7pd>_0oPF-Z_WC-${*iA%HM{F{)yf=)`1 zl<4$Ud|sjC{h{>Sq6IT)$$=gfq(2OQcQo?(19jd;Q3Sv%@@d>eS2sHgsN5*lfP>ZM zPcQkcRkv!NFS^}%6`Mm;?-suV6Z*(!DIWe1(2uGUB|16=YMG;!&HUh z$NmDltt-0SY4+nGCoKaq6J7A@l_W_wqZssX&T!0S@+i~Ey%?trZfi`ZSGuQ1;WrAX z7;&O#K56Fh1@5J?Mr+D1X*Daaogg0-iwubs@B(26TGNh{DmtDEBb#jwM5#OZ>m^?G-Wtt)({PT0EZ~UO4&)e1}g%nG^T0FXGvGrZMenv=8 zKI#4XdneoV_jT*O-Y?)ANM|e}fLZPz_ubD~u0t%n2lrU$)a%9xYMnqT~-oo8uZ>|Jak6BLkmdG6#6-)y)D+}(DpF>@RD(IIdvLB(8 zn6~jQVbz?u!h*q^nJ(q|($J@wJ9v&i6+b>+fKA9<$F-664Ujcf%eW`Y+W5>8fA5`V z8Oe5d*$x_cB6YLh&e+kyplBND;)pKY!Z%=Yh5}lUfBQAo4R;m5UIB#MPsH!PCm)Ob zosj#LbA$kz#fm0Ic82G;L%QwWe0LII>3TU{CE`j|!mkNSE635^Y~F+xy5LIEIA ziA0;-$&|T?e*EvUDzDIh3k}`-9YIhti;Q_bs7X)n{?dJxlO9W#&)Wmk1{FS2JLE(R zg+f0{ygdfoL(OlocKGH*dZs0bwWvH0ngrWY&a>g^#bOrt#BR(Zr@DHX8C2QM!Y459 zq3V}&YdP8e5`9W3tH_Tg#3R)Uk{@}{Tc_477@lU>F|jMg$aYirvjeYZvfzw-hL9017U~cK+-E6e@#w(H6X$wT;yf`Nd=(i^=1S?2^}2wokp>Fe zc2gRsQ>5ftEdR+f3r;)toeKw!dTt=?3whu@RsRTcZP3tq&0QkBl)C_C26s&qTrI*O zDvMm|1()r3XqUnDn9wEqCf!OFNoSjSyHs<~>HDqBfi2$Nj?XF&zwWeiXsz3ycN)o_4R+5pR+tt)3T3k1$ZFS*kYd9Hjpr{dj7Q};O1cQJZ2{6 zRbO_O@Trxu3_?0Hsi{;_`flRX%=e7>^vSZOu`@$&XB+#VBaM~2* z`$&#H5q|#nSlQ}liz(7+I^2p9dhheqFMaYr_u9y3?IN6uR~-s2C(&&S^isl5Y)n&K zGetbAcvV}<#t~>kwPo6c&zUc&P1d%tQ4Af8j@qOp@(5M&U%MmiSS6dq@$kTELeu-7 z5{?WC1V6%5C{3(8JRP@8z>G5xsH#*8Sr7hK&e_7$~m0DW$0)`O1L_Ui|bjLEZ=0DA6T6$uEUuvJjZLn!4)y zzPw(dbkp#dE=EkmER$|7sGr3HormbRRENWGY{+_A)hD;7l4_M4-3sdzScvxr*q|u8 zX`jQa#`i8cpOA)SQu)Gv&UHPTmoZw0W>}AXP39e|&Z_H=0CAwin~GIY

6L7@31Iqv=XaD-L_;rbj^xRhZk*4Dw;yMOkf?Fq+lixVWd?8pqOBk1x&k)H$wJH z&dU1^&#g0#Ilv_DYZyR^ADJ&tDb0P9^n7bAb;r)#-rE2m#ZQBxic}V;;pJq!D)9JA zIM4H4^3cy1g8$2o&gSo2X}?m=e<9HQQ}O{+P5+*G_d7F9D4)s#VEY|E5zi`=IiDUP zB^9uc&>BF6vB}6pq1c{nidGG<7AI{@O`*v70xu<4iI^@!5H^Id&d(YR`Gwe+4x-mG zTkbR3%qBBWo6hw*fxC%mQS2>sGk-M7e4P5SwDzTK@FC&RpSeK}?OP`W+n4l49s7>% zwJmPHdNmsynpVvBlazLRUPvZB2O-hMHoXE}Ybs2VdYf5!hL#*{ z`mhlae8yIr7#rS8#benv(KwBsZ-29;aq>#;)W~v?YTHnLz_J zq6cQ5vGwA$UhA{>LH=tZqe^g_rO?lnw&gUACEPy-VmgK4sf zb)+yWIHA-Oc)L-a$?~NaFS%9(lxZFzZGBE8bS-h8sm=gfS$Ht-38Bc^@7Q+G$6$K6=hrgh5!`}9fC4iy$ z9mHRig&u$V4E;$0`$-i5(D}>z}6#c@J{5u+flCzy7poKBD`=fCMpg93BDc;Ej ziDX@&mISZdgn|zbenZ5h3DC-@UrS4fFF(cn9FO35nQ*H-(!|8XxNm?wQ1+jY!_h^~ z@!a&VY`-_-$=Y81eb*zW!&VxB^S}$^r>C@4Per#!w}hf$G)`4G*L;<|>R>DvH^sE| zYO)fxaJ$K^0ohFadS0+jFuOppn7Tvy?PhS4l+vGx_O`!fBX(M+bNOr}ih+3S!n;w7 zA`BRA1SI8#S%Knxhh#9h-Y%t^o)X*ec~YtgcXF|H_*QB^jFerMFUW%3N(Ba5swr zrLzyQiB2aq- z34H5-q(!Rcfh(T&qxImem4o`Z*m>SVSa}u`1jjKBP(W_7Pk(073?hwRCvOYq#t84) zUi&5$!5`NV4WSfHpriX7cCs|LMUjjF(_2PG6OH{SG71}>0$7awEFJJQG9h6BAv^z< zr32aj9I_5BCQi-_Ain_1fOo$GeCDsOf8QScFN9Kle<)xg^SgSrarzCNGO-2pN56hY zs`g)B`yJ>V$xmLmDp*77hjgpPGxcyHRAh8y!8V$84HcpiI7E%Hs)}NDt-nujf^8ZHsiYWI$RSyg$mE}n4VK1IW2rJFYN(@oh;UfebAYo^YMCckiAruS zl-leKG&h(xeMOIyeXYu@|Ee14x$QM`piMJKOc2y3d^mkjyGV__x)P3CB%+&A)>DK+~|df6gm!MU0#EN0p`JTt#t_LNA{kl-V3TWTdMstEYI7)H2&4=a+k8i!{04vuiN7i!M_+4Mg~dClX@Mtsc>TPpnVX6ZE-a zGJBjlt)xt3MDWQCfbmOEFRq+VaD8i8AU}ufLzykgsD!8A;psw!U8M!wr5H=pgV-TW zTU3y)!(^rLH#u{G*fdxJT$W!MoZZ#;XG&^y8miq|g`Z4Tu0#|#)g4!>;#vG9m!XT& zlcO6{bs7XZB$x9@#i@P2A3qVbPsa0rv`i1x7Z-qVG`BYf`;^c0)vykM zLjQ-3t%C@bHEq6$8E<>#EHm9|ty3lKE{|{6YPDY@=}55X7;YwcnYOt^v;ntRcBbnh zl7s&Bl?rcNLL8E^Mnqs#6KR#pBoFK7&b9|S8lotMRDFnY^ooMy)(eFxU8E%Mx3WsJ zWTtXp^!sLu)U|3cocJd*XHU3}#!U9F?<3hgq{y)+>W$wy0_kj;VDAqOjNC$mNFNv; zNlb%N2V#Gi{bqpyv*@`@G#)IY_hprqUR>nxkn6Tq9X^Jw?wbVz44Or6FE<{WSLU4q zn3`tOMePKBl@h^N8K#U5e0rPgi?-3ky(I&VdaJBN)cP3?EW78#tP8gOuB@zUf$1R^ zp7AEVEwg5mb0)ZkhmyN@r+sJ;$CF(d$4FG=tO5M`d0T3-g?p>4xP~WVVBBQkEED?L zq)ky@)LOi(LEFk%DEKb%tdd@Cv|889U=1(+ zswwI#V{jUtsUP3eY8Pdm=v>eIjNN7Jh%zxuzP=sQ*|^!x zmAQ-clG{Ew(gem{K8p*Hji9^HN^#6OH994~TK65sKw{*jw9G}%nMPMznvh?Oa0LyqvWs5xWmm@b< zbwgq+bh^GWF8gbl27VCNHOdLhD2trC`sd!f(J*PXF__^%65fgVjR8MWQ%5(CBrdZoi8Jq8J45bWTf$=H1>gbr*CzwR4Y?Pr>grW?7T zp`vF-G+q+;9`c&n0H0eu{$9cR4N4KZ3)_bSfk&o=;^pk^vt4F@GYi(k3k;vu^Dts3 z1|;S_AUX z5}v^+XcTJLf_tWEn;|Z>aKo`L#oN zC!`gDIv{2QCtBH}<_QdL16;_6n@TjQB8UUrAHoi= zp3yf!^w6I0w8K3X31kCPMUTBN(I5ylf)iI~(Vrl`61-jU<&1J+X1;gQpCGwHVmmf+ zD366a##MhW!dGefkvYnRt5@@#lpJvXCaINTjTM^2ikRD6YZm&5PyaR6u z)e(rUV1Dej9`CW-JW(7KV>H`ZA_%{==~=P7fOK&#ltdzTQ%sW!W)p>i<*={jt0FkNUsiw~7-V2whNZk|K1t zntVU-XtDbcq6`VrEF@6>km-S}fj)QL*<{?6)HBWxeUW@I6q&jHE@PhM)gVRo+n$H% z)c5Ng``pRzSF-_VU*Jzz&Eh%Q3T&3?M*^ol7Av4UGnyPHcdRoo6{;&P*i%F~h{DeuDvT>t4%DfNz5W%GnByRD@73B@`#UW+6CNr|e z5@XCx?jhDx{Bx)P*N&g+*QO?vhKF0cWv+0p#O-xp-` z!FVf_kF?f7gde$u)9_uGH!c(8gTW;P>bLX{3M*mRb30m?K9M2t%|T^IpX`xkH+^t? zb@+sIw>+^Y11Fu_+xqs&zpQn)fSl*PgX?%vlCP?Yzk6Q`A#nvC8|z+ieOk{h*_xS4`Jzb7Ei{oQD5CsdS0&}S_CB?j$(p`7=RqxG*-&wt2!{v1;M z(Qy3HT&Q_Dp{StpFRRT|^ZWpXhD-pqfYAXGtZ#q@D`<#bO!yQYY~vVjn|@N%#zA)* zl;`j7zhxz6<}7A*qvzlq>H7fmOzQ(aw7%MAGdmH-tcgqRHFfPa$-BSeHJ0uB_6h-L zDdf-Bo%0E z9Mjb&!zA3)Q(H6WgMzsMCnBRMn(PrgH_TGq84SC2)Cnr>tU+0Dl4-|F2lQ#z)HG44 zLh*6u-5g8B)FCw5w@OL8%dG-b*fcDwMf(Rrv&WP(&hc^PHf78_#H)5+uONEf10G>i zg<>-KhQ_bw3Ng2#KG7ZDSe6@4fM_OAEwRx*&N{ZH&V$QL>VJMb&|z{sVgAP4+L!wA zefDfoY^YIcnr#~Tw-z8rNbm7R=MI}T}+X3VuHHaar_2U#U4_+9x|Eg)>%BQUok=olj?~`DGxjb%1``E3G^Isd z(`5n$zyqUP(gAmZiiiRn+r@RvP6>uFUm;7pas?CKsE}M1QEyDur1w!Wc`Aak*!QWXjxZ znpKSqKIoA02xeJ{>zhfRW$>0!z5y5gZcWA{OHw4r_gY}%M@;qvDB-yf;^uuT+I)E{ zXU1WrLLX0NA-QQKMln*X4m`Ajk!J1_4cyeMgcYM`T9*`XM#c+7yKcyBCG^oYi0@$N z_TM2}&a?+eMdb3|)zmx$3bm;XC|Se=A05*22GoUlqw7`q;mSh5kA(ZT2o+Qpog0S^ z%0q`-I>FZ&wN~sSH8E*AVvF4f*_jbbPf*+B1$&kfTg%Yh${(bx=X$G4k{ZR&(hhhH zAW|H7gN9=C)@u}^TcTYs1X`3yYLQ+mrZkq!kz?^nb1N^=V>vrCNg{le?J@4F7cX>8 zU3X5oE1e@s^-j4ftC#zM+B;XMsQiP|fGbC_X>NSe8?F76K&K_OGd%s0bc@mM22C*O z@aBqU4jV3IYZ7#FBro&HzFuVPGAPk}R(&MCM(}EEN(2OyX?<+^WOP*5zo__)3K2;Y zcdw_S-JgSgB)M{#EUeu?G^N%GJ{htfCBp6d!et(n?MC1xX8e0s!$T7=-H$87X`dPg zUWm%(IjuLJ$(@&{4S0$8@&`)xST~uB=dN-FH$2!4bCow+e8|23|9E?=;5f4` z3D6cZGcz-*#LUcWF*7qWGgvGOtHjJKSZ6KJ&TB246xOz1J}MPlrg?T}S3g1|iCdbkTKiVXt5lg)jV zJ$wsKVN@@|O^lR5Z_46wCho6@9V8b>-}!|VNN%t{^l%r=*U@R)b_SG2UUz)DJ^;#+ z5*80?3-#4br^CFU`V6@Wp7LsO6aDBv(KR>*BwUw#tVyiC@*&z8tz0Q^nR0X+xYp1A zF5#yHH6+mNqffZA;5OoVd8=<5@Wr^-Q6bwAY6lfBd}+L{era&p%b*)_)l!8U_7=O1 z4#e!~&OOo@Q0&?}>q=4p?X8l+93n6K9qp@(Oqnp7jD@hG%=`yl@-YHwwG^zcIx_1d z?G&*jCnDSKjhNZ3(FTMOaTP(Vx#8vUp(Mvirg$-@lLX@& zO4y$YLLy;jAbo~`eUZXm;f4=*v&hj=dMitB?0I@bn%N3ls$A~dlq4on`djB&vGhq@ zP;?*8O(+?>9T`jwAeZ%$^kGM2H3!!B2RooZ=Sf|tahy7^z^O=gaBXf1wqU~50n%uA@sa@u(k!YDMla9ZKZ3VwNkXI%$h(cDx3GEr#m0s^lDQ) z3%$8{4qjw&J%6zMLdx19r;gT*SB!2>5bR%v5=5vW`aNU{G}#JrCtv#grwELQ1(jy} z{%V86_&eli@eh#W|NZNY;yn`VFHz=eD=^DmMd#IU_$*v#3jg*2Y)#V7LIgTzLSuC&SQ6-_MG-RY4~yelvwbg z4nhv*dZT9)Y}7cIxNdgMT)-4;1bnP*+g#T#O593&%URQ4?J}Fra|_GyTGM|id3^&T zPn!2Lt4#}Pv&nGIw`We=98U5s1d@SOq@9DwqpFGR77y_aGm>bQz{@Jjb%h>qWzMa_1&jI>l0vEVP(nVk8JG64BE zCq==oNafMK>&K+&S=T)-+arurZ;*$*?{4kAmni$qX-^`R$yg@7?j%}8?h@LwvBa{N zaA+AzoigrxLp@e(Oc2@~hx9x&M#?|hrA2w#;DcBo6lY4)k4}C^I3W! ztF)?z{DS0%{S{YxM((VhhX_u!3?&y?t%SVE)S}L+h!eychj#w?=Rp^A(v=(XEiB-? z%S0_LrQ1^TGm1rp5$)>_s?(wx@HeDWx6nhF?h;a3^p@HtrhDUXkv@o*k~~x0g4F0_ z@szU{N2hbSofF9F7j4*9m!th=W@1A;mpYI|2kQXowRkrezVXEZcHcN^RE3Y z*9&@ket!tcyb0-x%)htV<>5&BxHL_=#Z6VnfRa`zR`vWN$yV%hf|{rKX_x6+jnmf3 zrrl`1ODgR#}kiJXD?*|lBrCEcmX@g4;qR*5cDpOh`qIx#JszXlNkx?;j{x0Y3`fNw zrKW-`#H>O)Mi4~F^=%lVlohiznNvW<+O#3xhRio%?7TFd2Nq!vG^#Gi|{YH!EY8#rb?ACHh$VZ(=2M1 zPQq77uP(->(+)rTn-nME7sC1zc62&*aE{e2u-HbF8I23p7ltO?*o#N1^*}tL)MP9qWL8VA-C+F>DYATY_gS zs{$fxP~K~u7)nk)!eu%<;WPNXns$z!zSmh}GxGy(pr1?lx3@rl_)5lt^K&QJeNP0R+C3ky%^~lDXVNT2iCMyJIGoCHXOPx(lJ%$?G2Jz%T#V_z{2+eu)*2< ze&eZ^lZ>;h#7iRx5gG{a8m=Fk?`3z%?Ue1}h_y_J;0AaxR;fFM827yInKhxGLqV1! zEl0b94|+;zC59MBEPe!I;RnQB+zn9dz3zEL?7af-a9WUDq=1pZQX^KH(%-uCtnE4PDX*4oMx# z%W^)DRsqf&jo4NvDXJe1Oe0J=Znq0F!Zw>YB4X2&H~iOKi|?mBom5!FI8Pd0G$N7{ zZcVa=^&vcOXa}ReZ+Gs1`nwl))dz`QBxQ|X3mr4y*wlOI55cu~0!&kvKXp-Qq<0iC zIrDL9o{k>jY!42@_|#3J_-6Mz0kdb<(V2A`&h?5Z)C>cUZ*2Zk4euWhtjX5A{8px2qq!W8u1)6MZReunZq>8APHgbH!@8M;ARrg~)9h#97M&w96FSHCu)uelG=ozH;J)q72|k=J zajZxbn8AY=Xy|!YbsyU-Q0!OsOyKEtO)u8acMIUqCz@q<{t56LZ-C0q4=Tf^p)QkPDW*4^u5@pe&uj`l$uj@;`4tj%r5rlv zsnBZM-reZ4W=3olxE!+n&tGvJVaA6jqTJu}RKBL57a)wRSm zs`pLS$43xmGZgdI-ghNuKcRwFsv@TKlG#cKWHmRAYU*Z_dF{G!w4GqEv5u*bS7I8+ z^y?&?dn!Ou2qD2^G^s>Iva|$sY|dE{zBUB0gcuq-72tSvOPDNf9yhlS?8iIh;}%zg zQuXpGL6`C^K|(8Of43^&dAdHg|BBSpt1oB6xgja!0jxNR@6HWsPe6SKS%0T zSTe3`OZbWHG`63-oTGXDc1{Od`*URmaST}n&TOVuCWr&Q_m*^-H3<8|mvChXK_X0IP zC+j3g&PJ$+P0O1w#%-tPFH%a5#<1gK8598_@yecX5znd7&|U+AcEV?P@!)@{xc@bwge=NGWy7n^j( z7VRgm9gfUc=H_ahyzNW8KXK%w%3aQvOefq2L4bkeCk?B*LRtI$NY4c6vxfONV zSu{rWj@c-FMm-a;2$u=WyF4SXFa1typ7NKquL@TVPL#YJpzMUXv8wwa*~RsN%jnX& zZ&FpXSfx7Jm^0{A7vEVhNJH4dK-A;L;z+0^beg6(GsSuEXZ!@{Itko+K`y?8j)Na7 z?*U8$!B1!I`XQ!l=Lr)|^5(o{w281bSg(;zYdE+g$!kIt&-hegO(EN|aU5ceIJQL z4CI?kA@K8(0PQipFWRwvx*`^cqvsI)W7NsM-ttk$`HY6+x|Xh#Ck!M(~=LX>Lj*3;2% zyB@&>2F_?UssI(-T(Z60bWTSk!S&u^_p>*4ZC2#d^NuFPY@jsB$IovGnCYf$CMkV~ zMz*(v3R*f}+ShLdI{IxstB}y9vdzlF69^8!gusc`+%s8Nwq|3yf?WnEV-g|3rH4)! z&C7n}j2o9eCeK7%0gvu}(+z9x39e!cQP0f8|Kgnd*)I8f|k3}snnBvLF_s7@r)*;pir?{sDQaY)zefzB%d9DfAX&1TrFX?)4$ zlhaS?Uz-8n!Q{(8dwqy)+0byUF!zijs_+H1QPS!Hg55?=UXBJtkz@~{!8 z6J?~c8mK8V!vUCDN=ZLeQGj@Xs@(J0=_x?mLeQfFXv_NE zNTW^>khk4T|4a8FZCnciH{cPMiOB4U>eR3Wm-2)Y;612AYF5oC{%TC3aIQ*UJyZ<- z4rW-%G8dX_n&#;^tS$?enaBpubdNN3hoP#uD;}_tlijN8HFZm&sy!~rcy3h7| z28Kq(n6JRUKb@=Scm;J=65zYgI0lRnWJq8AncTb%#kM~5K8sZS?Xd6p|I@2m?R_)N z+~r?QB7eQHyWgvv|2Syj1{nqxy(r2*B~h`JtDXrFV0B97P&Pm8yLy%h8+%w-b@u(D z_h-R-H$GGS!dKu>Ik}Ja!7_Yt|+@taQ*l@Lw7Yu$01ag7id^9}ex%;&9l=B4=s!YNP9^Jp-uaOuR)XwPtlz4+J%kz;G^r4N|w&jIr#iwmNzG zWWFdUk{m=#3Cr<+nK{UTEfDUd#vt0aK_JJyis>63N<(@Ao9ti)D>{L_*Q8n@zzH*b zC(DxdxFIz`SigTv?Ax=&oZHwfIUQAKmCZ67Hq3%k!yd}lbT@%}!xxYyNj!^O1c5`w z=2NqLnr$IO!e9)T+iz~+MoME4G=|raC?TNHvqMu@EMg4nQ#NNiqaEcF7<32U0ab<* z3vIF^usNj*i^ySBxHD;qg`#Ki_!(_1xWZcU2=D14S?mIW=ghmhtZq1q#J5i1g?xuN z^f~X_tlMVIf8nKu7>`up!eC%a^kwG61M(e`H)U7Tm;z}g2fPU&^fmpJY4iaaLrXf?2C6kp-OO0Z?Hw~JKJy7^UGYxTa zzi5jS5G{hdIWSjG64&RP>o~f?`W2c$sn5#yj^E-5$HC?mGZ(NbU^4gUfUZLxr^s|H zSo}yWu1Ia0cUhKxJ^LD`YlOm^3F2H<0L~UYU^e%Vx{&JFc74{o)naU-SBPuROlfBF zT%dEeDpjVBm!{OQt@^ClE(RoSZite97hV-^pe&4jR>DS|E$}&O;$4k2KpY@=Xg>a# zlZ0$WQ$PED=)V0e0U-Ym4&8rq-2Qta=$}m6Uni+r!(I(v149s=RA=Bj7D-c2lSw+1 zRpatHHYAWE9Skx>6mPw%H1iM*D`o5Q3US~xZhDp2jBsZJ`E`r<=y`LKG0cqmjOQ(> zbH>|un)fN+_im;)@Rx+R)>*bByhOQ8M`_9#pyn*|ams*HKeat$tjmAlV8&(>+oDE& z+;_5p9i+NuG5i*1daZ59IhwGXE)~ZSZ$n>X#yi?Q<<|p4;58G@mv8o9F#71d(KK%U zxD1lSHe$7pBg0ehxS;GFMaq&)E>_#eiw8;1fmk~2nASov+auE&%K^KQ1DnP@yW7Ui zCRf3Wo_48gE#z5sA2LZ#_(zZOc|_f2J^~l}2$_94b!vyYOH(AHBgF9s8ZX%R5xwkq z=glWVl$s_Xj9fWlWa`Yp-L>A>%uXod1NI4}{73Jh!l25wcdbfki9TVv^7h{mlqRTUY%+RVg%_Vk#>+dlhh-k8x;p!cYVOG) zTb40EhL}^9&7&|!>5Zpfad9&1ulx0Cez>sPP30leV=Y;+O!Dm}L#=&$xF(daH)vdx z`)UZ*J^y+atpsQ#n7Q@UmSZk?rqI@{J5#V29}lr8Kl6!J%~(*;<#5qrDV@gn)_rRo zC%Ag&WIuSOo8V3xlNX&fy@3i8(>}hrRvDtm8fx<8Nfp~a0o5UH_SDB!_&kZjs$s*o zi^k$;ce_lUAkNe68+Sz_f=r-RxkxBfS{-O1NkmLmdx_R~whqk&5Rb=E9EO;e0u@jD zaX6pVN*^}SNoTXL*0vm&YpZ8om|VO5NzD_7{l1`5NOny9tGFWOVwnXVQF^^Pef#}+ z_|DcYV>DRpxD*AF69H|uOZ;^tbNS)(RMN5Npq#Tux5b23@u!z%kMJ4dUjNnLC^|s> z{;ncMmL;p#;SpJ9lUY1PCwtW!17kZ4{mcrnqstP_JGK1!GO6As)Psr zZgdDEq>xVZ>tBl)>sx3(@aN%4vrl}H7IljA!^bJ)fwM=)yUQuq^<`q;17>-z>6Yp5 zjZt!tM9GB~rjA#oyvjk=>LcI(<1O&_9P6z)F(v<#lljZ+=$>NX9 zF=NYrvyx0{7`*qNVRWZ5uUJ^0Qz$wGWr)%!zSc7yZIE*CP~hmqFF`!9=6F$0Q=I3S zdve(ivG2zd2ZuqRNmq+Y#J;y1GQX){T6!qt*tHx73mzIv*)keu8OcLAFo*F$%1y4+W5@BNY=LCerXRAG5*dv&`!liz2PoT3BQod z`rZ(2A30FqU>G&KHJ9Pc&3qRtltrhh15@Bo%tV{kJY$$~Q zo2CqRv@=mDt0`c@3axA^&P7{Y_K=AbViiPK87z?+J&Y;ot=+Ugsi&?uYYXc`&lD=5 z2K$N>vOvcR6{DR!)*-lX7V~LqSRi`l6Vt?r*Vr6%oZ`12-@P)J<+Og>JfW=WLtEXc z)xl!k*E(ShQKK}+eU=7#UA8p*8tv8I%&&$48Xo*LB_9Ym)zuPMunn8rH}-=M>kQe! zOVkk0qVZKc!ILSz4jDHJ{5D#+o`>X(&~hsquBfXjE@aI30=r)2n-62dge-q=Rx@#C=70hx-rC4G4vz!= zIRX0u$%O)rcNu2mrx*yMJ>|xa;7Kcu&D*Et8uHd}Fx3S?>Q+#;B}@Dj?)_GXf)W#p zp>xzfsJXsAlRk7R_pSg}(XwLKP>rszooO*|XJ)&Qho+Z1)|G78N*_MxA_sS6S3hV9 zRlCTZb6dS39bVd1d;YLiC~f)`wrnK4UGkLJv=07ydKK8RzO$QY3N(JjXly6sb#n}! zY~@HSoBnH+;A&c&p!}VEScLmK_CfpqEns^$0{>N6{2#igtE;(#rMb(WQs=+GTbiRM zx&+3^by|z{Lg^5OP341<{csZvu(%K+7KO2FsEMkGhUVPN)2cXKXz6L(k zNBiw3dm_TMycH?+|NL8Q;y5;UxATvG0iG|3b-%*BH1eK zTmf}nbeGip8Du`|=j)L?q)6bOp+#ug?^!qd{g~l?kfqGj`F_jtgbqa!ynO)v=6n9UvvVmX5YdQF87Gm;(C+a_bmKA2OGy6X6XQbc8=qJPySEnjd%2q1{ zUtcRH+;8`60HbvlgV_hSde-YbDx@zv3N;7*2ri4FU)lCWeu|4%E1$(N#YcjArOgL% zu`U-v`M1iiaSZGbz|NkAdWe5q*0lM%+|7BWrq7~(V@K=g>YO1jFqM!KxFNO;Ao&(* zh+l3?xq|?mOyApdYs=Usx2)&^4zrbV_RB>IE#oT+qR}qdFjn3mNl* zl$j;b-LcFHm&a=vGh}<{ht=D$8HU!Iuo*@MBk|gIL7FbPJ#Vlq%Z~ui1{PaC z%t+PQb>VKSeeP8|(?Xy+jie}zmd0<2eoA~+pdR1xGAw(F_}p6OBkKJ*Gq8ldWGhye z@Jf^1fM|G(KGC3r)`Kv{-oig?I7g}8AxIzyu;eW-n`z;GeMj0(^ja<1i{KB!?G$}4M4k7`6^4t$f7<& z4FsjFKx34x!tpzB2jB z72BL)(%kP-#8Kh>jqSI{&hPJmnc0MWfw`a@GU|S|IM;XX_BYrcPzRzF85Qy!>YV)T zRrF7mcK?Jre=RNj&(z3&n;)As?f+QX72GJ3$zdvGlV zFOIrz@ABE9bIriR5pEbaZ|;xJ8~y$>*B?@Hf5GANW;eWbN*)B^+pKSauVKFHRlB9q z>!?xho1*y1X|kl8M!9iYbIu;1W^bh>UV&6Uw7smq%YN|S>GLMGWWA9BOXF3W%$%fA17Qw*-rzI7ityuRPB zP0&tz1Pkc!Bf*|!!$a5vjA>8*o*>iL1bbVIZ_>sko+`u%(`W?vY}_}ei3IFq3QSSA zq6ABxzFg1IGYwfehGcj=%<{Ydh{g>R&#O~mLVflM)mb)CC<%kWR3jS&lBUFqKcb|C zSwdlq2^-uNCANbS>SWr}C#8Z0(KLU4NF;Mtx|pIyX$mJ6iBC#l2w}cMR>agIJa8?u zkD0(jw6GWl2uRJ8TSX<1*Q|0B%{-kK1D-gv{g|#;S6S=@`fSh>6nP6)#6driGTK+&Ze|yxnHxeF$tirh5@kY| ziou3Otu;!}{a@UCLbnOZ#~@IfGshQqBy_G8_7f*OWxx|Z3UlVCQT8C z^1fEoDH!XHu(?`Vj?3W9(Ta>2;}rr=r@D#o3{KrnuQCKu241mhV|3PrSI#8i;LV#d`jV{T=)o}K?cgmo~LOFUQ?gdDMl{t4N?%!SlM^RKWUDU(5;|4IPvXDi3O)MRH(i{D?!8M2nDHoBbTp7$Cizdv)Ga};NP|J)cTFw z8+i6Oq;NB>Ciw*Doml-Tni#nUp8} zqe$@8m1dj>D^Y1y5SYPEbygS|AtpKEa1qV0F-=*q2|@6_m3o}%SD92HZf$`IgbTdK zq6_Bx0n?z5-|N50Ms;*W8SF9>Nvmp?pOwzO$e;4_+>SpH)`S|=Xw~P(Ipv*QcSLc@ zl>^ig-efKL@;cRe!XKKW+G?K?^#*+MnZjz?XE`6ir`%shI{X|>{bQL1s{}6i-Ui=& zP@fvX*S$N?RDVVQX5TG`>y&KCIZ;8E z3O#%+#DlNvK+MZUy8>;(Wz6gLqO#yr7f7gqbz818G?=Ik!AR@QWw;&ug=i}Mdbrfn z$$R%Z>6&;8s(!ekz70lGn@8Wnhm>lonsh_`148}8z6V%}4KoSn>W6(*@bcjY+BU(^ zFQ^8!8{KX5gb%L-`bNSgQm$KP!|oNK=WB7q@>Y=1i=?DAMmqAx=nt2Pkd-0igURa@Joo`yXP~f2Z10|D@U@ zlrrBwWv($pUv0T`zH5pB3r&gbdq^P zPL>zzW%iSO0k43--NDH_&&~p$2vaA__0t09RblPkz3uuMZ{glL^@sZ9kC<*pR{Nhz zEFg&n%pTiQOiZ@sY4Nt>u6mrQ2zka>`*xg&80)-`qJ>RT$Q8sY^#`?fm-T&Sg^_*I z*pE$HBD-t7$63J~!M(C+!fd<8QNn?56dUd(ZL5`N70XJN14!|`3eCpf>QG;NIaXIx zpVeWkEB0`D2A(u1Kg(y6Z{`6CRbo-4BPW%KP)`xtCEY%;*wK0SNd$S!e?<-vrb=Qo z#wbe(7=Yx4hw!08|4ej0*iJxU+*h-Cly$54*1JiXPg0Uy**w9n&8tWJSs%+qN4ie} zOh^AmvA;6%cg1ee!kMbk^2fs6d(`q;qRhU~;swVxW`|D#{4~7wxx&*Hdoc$hYh&oz zqT~i-5KwgJ&MVx@I@ErSy8_J!iR+mUSfL1;q{=KYaNSdj5lw*L+l3SNExq`c2x!60 zseX=4a+ab7OZ7&G}pfxPkT%S150mOl9NY>X~^icL*q|89k`9|wjv%u^C2 zNjptbq>{isJ{$Xyiy`4@?z=M;PdQa@-!3%*+RX>4nP?V>6X$$eV(9d+QvIO4gDLnn zfN}R&<&4vr*;A5QqUXj}%mEjdWw}XVI@Z|nBd>S23CIuH7D?x>LO<3r-oq3Vpq-ek zA#voxZwtZ)uJ-E+FRQ6Lj5Ip9o2CP_XOcCoSra(9&t!{L5f_1|~;^ zxcY7HPd0$6H+AupIF@yd4ZVK`Cm7PMO7y%F>tFwtSXcT7$LhZm>sH3^W7&V&n*PtQ zQKlKXrWHEPHCad!)>sToaWy84BdtBUOcaUqDn;vA%h*+eubS>3My8vmsDq7Xk=`FA z1O=U*)~Qp916FUdohSL3C;TUyu8yxOJH5X}#IddAiu|@5&J|0F_*zPQ(-;d83wgP(bTYXSMjAjH@^q8 z%dPl0ilHY9X6B!hsXGZb_hU}J&5W$XcS@L+PwuJxYt@X=0=n_=P@ zikp<_laZT!WV;{y+yTBM5d6Yy%Yd;B@%R`YuCxO!z0Fov!OP~RVtt_0W`KH`gGa9g zGX}oMMg-5^S0Q}6t^;1#N;Jg1ZEYS~ArX8WsWKw}ci>r-5VEgG)i<~Ln2p*P4Nn`{ zkO2>L4!e$T3Jxql<4*I&c!$g6&vZ|o^}GvgFZ_5(*)>-8RC&_#Jl)~02S6&9t*!3w z%CZgbBM0X$3+8%3b^-vHJPw&Y9rS+ka5iZid3SkRl<63N9E=ac8U0#z*az-~&}Nnm zR6o+30g1~m%zQJs?K3_gd<0Lv*?1|ar` z9`7f#LI$=B{08^kF!OG3daqeqt=c5sU%zYM2jZ& zf_|x-&12Zuf~GBpA$H36WJr!Ra%QcVFVSye=}I|r(msdCTF1}3xGI%~;$4=5o46X4 z4&o7}WI)pqE}ceg@~fV;Nsb;K!#c#HFS=J|9&HL|1WRt7`4@d-v8xa|5lUCfj%v@X z`C4||k>3HH9pJQ=8MJe`8y+iSh^Djw5q7k_!k7murM+;5OUW}cgXPII{Ly4wv|=dE$xZfFO9gx^W( ze$GqMr0{&VOVR{X(ZCS7dB?0EW47_65K=;O>A|4bu%!s&u(AOp=pud$OmCbBa+Qb@ z7J^td0%#$LpW4RmpXP5hZU_rr(iMB|7la0@WGK58%5U6nvF|uV19P@vLuR1+ODY?M z!bGKhh}N1+iHA)iAa_SU5Om|0@jv2s6C+)fcLhC|h;Pdc-eJ`lmLZ4E+Mxg*$^Fq1 z2+v~~P4mi?_Le?BuHQ5vhw|Qh@Xd4iI8?A24|6`*z8IffaJtOg^x>9ih?15`j6wF6 zJ&KYxgH-d&Gw)EO>QAtJQ`!L7dbrzCB}tUeDbZjiqCT>m$_E=?!bgHAqzj55mZ`HE z=*SB8zv1uz@m@8d-=G*#OQ4(3FqTBr33b;NysgA*RwvsF&X%Wt%0SiIL)Gu1#rVnW zSnOA<6dDUB^y%V-QC?pnY2s^RaZFi(_DMivD9h}h+GjzMrs+_|rDEEIpX`NAi&c3c zh8;k%&qE#cL!tBjCZg<1p*@iIwIOP#I?E-vLIgw4%2Br~eLtacG&z?E*oJO@F|Sjw2@Nt)IKY0=+M zp^6C$iy^y+eJ;aqO;v9hCs3n%i%t>@0sreG7R*ox@@@&rinF*J9_D+NXuj`Bu5aRX zZhi0X=U2o&|4nnN*0>q)m7`!-ufs>L(evV+# z8XVjLNKGhxOkb$ohcnH7Sm_g*uwR&Ff{jZBV@q-3qO90Y522e1$1qyL~X!F_f~tGdbNyqbdiBY`)uDZ_XQU4??2 zVRnuE9vH7iG1KSt*~5~CDiNKOwVWe{233VfA}zTzOb|sEDDE5+XX5d~UM8f<7D1_- zhcU!EsjOc{ok?;5S>2e0&rz%Lpgq7?>o*Wya@CGO=tivr@Gn-A=Xpfad5lSVnbXZw zT%bd=?xw2d4$~*9c7Ncg{+_g~H}50$l~Z5Hcov%>;JHNPI@;(=%iOt~d4guf6fC^p z4;tre(NI?79jWlVKl1qG;Bi-br;y)cmKENcX+^Dlj7|SYIr}Sj@;@H?|8Bv~ zJk#4;#vL{?HbwX3bE|+DpoLPw0yXbq`G+pPk zNV+GNtAyf0h1JgGM}O~-5%Xv$!HZW^*JRKHGo8B!->b&>K0>*m``uuag>V#6 zUZ=?U;|hDe9)@9E%yRRDMGpl>l~G-7F5Hj8xrB#1_JLN8jyX0$xx?~q9nzI=AQpdb zz0h>@<@vZsky$H83F`wzl7<0rf6JGQ_9Ze0TZHh~f$8Jf_HL|J7%b|5xaRn84s})K zLatjxh5>Ly29dG6og`A?AQ<=sV2wvidNH-%@1{<+V~aFGxNovX_X9<-Q2u&Mcwh5c z4l?<9<&xE~j+cHqOu$p)A3CWD_p6;+m+)slDy!k8wwL!Yh}FM@s&ucj;vqUDp&P1q z7!DP4HrfiT8FFZ?DB0V}APzkipF_{3q?AK0M32ySO*HD8n(GD<#qC- z!bo9tv=pAd_1%MUqBdt<%Jb+`+l?YA+B8uvvDYqKa;yvMorOv2h33XHW^ex_9SFL( zk#MRqIoL_7+J0%s6=-VBw>jnTiNPvgX{lCJ80U#C$dMJhvdqg#_ckoC$TFQgUapkb za!sr<2bq*}mu6Kn#jZ(lPf#taYUAg8wVtok_-I+rwW5y+4rs27cnW4@WJ14KOhkuk zAa0$lZpbYleI7qjw-A4P#Z*H@Ye;*$N7oq_)9#=-0*xc&Ayw4-iN_zUxdfdq)-cE^ z46Gqq7pq0OV6WiSNX07VjW^V@e#!%W#mz&if*qe=Bn!ElYjUSu(n!SHNfHLQ)33y~ z8xx$RsXEA@QV-b8S4vgV%jO}3%9a~yteIAwj=9*JEtZ3*>&3ndi)&v2CNWcuT^f+) z>>IKy7c;UA6FKr;HG1>4O!?H39RaxGzNmAUKEPzb!uw1z0a?L3Bp_2S-kA!*H#hM! z#|o7kTFc@D?zLGT-%v_$)pAnvZfp(B{?O@0FnNO zYr5=Nv+|O)IBu_Gz+f8dVd4v0(1v z9P#YJhlwd8jO|=sQiP|P@l{pkt&&N0w^#JH_TXRAfys_ml=ncAWBVP$ud!<9%qr4{ z)!(GdX5Ni0FWw7{3Y)Cdy)0?yE#zgg;gI|Ww20QNhdTSYjLi4Wqo~{3+xPx^rpzn5 z(BT8*`?(yiP+IXk+tMyNVxVMaLwk;XtK&Ee9LC%^FmPG}`-{-I@n);=xshh8(BMK4 zmqT#yY8BVxAWxrw*ke~7`?|54ljOTTI(-`EoJ9Xb62~-s8ZtM9yTziKn;bGXh%3P2 z(_ZCceD5qtjPOOW*%?Ms=qWA$2g(wM1&YV?!-(UK}|K6t5}D2#O^_KhHR> zlrh0UoGD8LuPM$5jAdLO&$RmuPev$}(d5k=w>DG)UP5#C?=rqG%3^_|tu^8R8PEM^ zWWSd1@yq9)SVf6=rTr_svxi52In$$M1=)Dr3HD|!%5o8(b*!qT7E#{8#%ap>91{?r zu0^cMWeU2$evd(OW`34kCp(z*F3=i5;rm~JPoua5$ze>~b?N4F%Vm8tOL@(h1 zfw&+n8dpDqI~h=mwn6o$W|4Mjp(E`l>UwpO44ohSDKgI=1isb>RPx5Ex{fc z2XswREC;W8xre5QH1svH$$%blfXE;*Wr&$^s(OG4132g-4R5|XZS)eZDPjmGgn6_P zdN{>$|7s2nlr2QeU}KC7s0POt1B9+jbfgo22IL#*KnHaeLh#%2MyJQrkMse+kJx5( z6-*w6v^_)JiN-Mlh=`R;9!8FDiR!2d`THAdsOn!$K-P5@h5Qmqt{}@)?QfnPld_?l z&_}!hU53&o52GXJWZG=@0sV~u*+Xn5An3jn>pS}V2NyJ3k`W&qkW^vUK;oON3}~>v zzO`>$*gMa%J9`L#W@_F)F5(?)*_}Fs7gwLrH!kL#Y1v&cgcnnHkr|IHd&u=8e3 z;rq3Xz?SfX(4SOrBm^+}@?*e{WUz z3*i2RUEe#KwKgPC@*z#}$?;f%xw=cO*N3>`)8%9qvQk_SQ9=zivYPyN86LsFbW}^- z@rZn1BXjZ%U0!F2XNi{<94Vdat3wxZQ=w}uEG>JkKhJ@FzVG|JDTqIv`bwrpY|ZCc zsCn8+J>^Kf2B#%V6N;T&C11r5uMed9w7>T-FwSfrkG>NVH9D$ohjx1!s06`rl8Y9jh@Q0Ev)0_nY|e`DbY@0v9|&MY zJ@5kLMLUw}tV8=+Js7fXbq3iE2}=6qTWaPY3>4>36xd?Mzz0p$&!1WhO$`efnwiZE z+VYF&+H=PwIb90_sAaB;;D(r-$81NDs-mj3g4hzJ9xt_tpKI>%!aH;G&HC;ZIfrwfyO}MK>gzR( zPMCL>m!#~A-pV1uZWT>^m_fbC=IIUp^GsfNCnKWL(WyMCn%Y{t1cEZsI*5pEe%g|y zV<&HxPvC^VbW3b536gWG@m>Qi%2ft$Ng96lB$cCVPR~uoJ|iV<*@~aXJ8oky49^mP zYsqYeAn+~Ltx}Gbinw{Qz)zftz1w=tXSO)qmD}i&{-oxII+cluMzLsZp8g$udJAQI zMg@L;y=~0P0x~jO45aW`alCW2>&k9aMWsYE7eoD;!zCQ|J%U!ef9ymH{ErGx{q0?9 z|0*>SCS#g2k>h5==$$WBTTs_A#&8`G*aBg{M{x3Scm{|mJjlI}Qf;UwKXTG_LznRM zt=<#G?S0~>BS$1D6Rg(;^330wc_AJB`cjF_0#y;A0iS!%)g5|*72v#+I^Yw&jhN~f zJ{EfR6nG{}cp=jr{16(o2z*m3uMY_0a+gWy{_=TitUJZgbV~f@`1Nl3Q(oE3z@lFk z-jDPvkCPD}7h;ocsRHt<)W?9pbt&~H)0U4vAO&DZ10GMnmD|tmGuwA6ZlDE1UN|Si z`}D)w39{%}w2XUhU@_LzlL%61ZR7KUuFfh^j&vfMkEDRX`U8gygN7p4?`aUgqB=)Z zjW6+a%&s>y7hVppo^-iW%6&LO=5djO-A6OY0AH{SGXBqV+VI%M)&|;?pVIeeUu=<= zze{NMV*&=Nz<^LQ+;bh8%maAW^Ua8$^16^|#CgwO?7#kugF;X@+-7)JmXYEA?#4>` z2P4V9PvCzBF8?)t|1Vs8??xPJCu{TflmIg`7jswFzizrIbv?EBdJjQb#!_=%G2z<; zGA!l&H#QP-wJvpfb(-hgD<~K{Zd)$MS8Rg7I6)r3pJg!#)LRKG=GDlryJD%S*L*K2 zcSml24(J~o2F1Xx?bZr=4wQ{vIh;JsT9yUPdkW<*Rfl)DybG`v)7_1N*sLG+ua8mqprL0G^Z#k=$i=Ch7WFIbc^j%KB_C^jQ7!V zg*c{@s+~aQ*fI+~{#Lj*PiS!sHD5A$_r*f@(=*tL2Bm+E8@wm=W7ftYL`sXDkM17n z8`6q=8w3;q>Mm)^$gGx&k{1`%Nb}|si>;xTC^O0_y`sG~3k3B%N~H0iBYfBGkMZ9N z@Y)t^yB&*#nnXM=4qq)t--8Q@jHw~sKRDYrAfOMTSh|cq6{fmtY#CGunt9k zx{9EE_kMne`W&J^>NG&zy%yEH~|6d1y%AcOb=!arRDL-&?AFHs^0SNm4s zByj^Wx!27TA{1O92edfnc7}ZyS$k!cg8kWpTP39HYxc#nFeRy6`gTNU^-@u}@ymc6 zIr@dt2b^Xs)OM6=&TTpRjnd{YT_u!ujB3s~Ir^2-2ZHADDE;X7H&p+E2z0}G5*KzB9=o$xJ=5Uotnlxx_%gwTy)}+ZuK*SVx zNJOUW%3cMU*3V#;aH0;-J3cEEq{}eUFo|9-KuLOiuO7gXlJZ4B8(lg=aE9MIdgVHf zo+fj?kx@`9kp5KP*4)ZbulUMYh@sUNi;~dA)=MhKsgkEuePzYM9Y-%pFt`8t?19m% zajgx#g6!U*@T@xWS*-9TSFe|Y7J!P6@tx;NEp0-p-j`XbnHElY$4JhvJ0))pb%>Ht zNSMU?*(X>`x(noO%V}DPkK@=iK2`UXvx=ner)c1?Qc}Kj!f(AmG9{Mk#$^3()+ z9H1jryOHDp6XxzX1Rdvc`fHZj{T8EaI{n_iS*js(1F1VPjCs{Fh+>XB9 zv(a>K+2J{`*G8+v6c34PKvX}qOugS&&A5<7}rMOIH$WZ;F z?)m|05Z*nUrX=Q-U2U*EK!2>AfLSw-BX|=gcyqI;&Hp19;VERh_oti0DR+=C2IKU6 zM;E2IUxAFh!?$s1%oAZ33`pQH4B+H1G)|3dRmJ<&*wTEhTrcTkv*d zTSct#otz^Q+6@7wl8Vtt3l!OhFY%~xBK`^(I0P8C2P^)YFv{q3ajPt3gk zBbn=e$Hf2dspH>Uwf}!IS5va?2ODFAow$7 zccxteG~A!+1|8;u#UG^S@$k@(xEpr&v0D4}jLG~_h<^32)mk3z`L9o@yN0j+Ct~Ep(nNd(Ms$ zY+NC2s289|xnVLr1lhJ+p?Od=Ls%D%F<2Z9@-@&x1yyy8Lsvwy=rUV8>Km>c>IAv{ z?#Qz|XQrr-wN@BD4!DNMH_0V-2cUHBwuu8Ft1#MwYMl+2E){BbJNGomH5eXrCfs!8 zR|5;$g8Ue7e9*(u%}S;ov^+&(sG=-1 z)`nVLy2i37EPHGywL(|Ys9P;0=XXWPvF-I9q-Y5!L+NCZ9=&xt0#^JnZiuhYw>~i} z(f#^xesN`I5!<#<&$I5>1w@~aA>v-uQ*66FOf(~_jPp@w!&MX&sisy%C(-eZMjuXm zKNoMoyeW?+$J1|8zI<|6t-N3j;WA6NK^0oFj&$-~FlqEdS~Z{Kbm&u- z5@U03vN^0YY^O8l?MERVv3`*^qZAxs`Wxm8i;o+HMA) zc3_Lx%SNT4 zOPLNDo{HzZ;i?(uZh{rIx`+R&5-xTlW}6^LehR-&`#u>LYLNF@jqNmCYBvmz zY21#*ZfN2<%n=Qp%?M(wWG>T}wv1)pn>JUJ5x`i%Y}c2zfMwsGwu04SNOKx3iYd)y z3_V;=ccsnX#AOVzVKJHsH>0e9z74ruwzPA4MQ`yC7gSOvqBZa-AM*DL(GfY%4#4|z z3sV!MK zhG`8`X-ScLs<|Oqd4_3?Ua76%_Hd#hVKg;3?TBBwp}@D&@FPK^fpHmGV?rU)YuOLk znr>JN#2RfpAm@=Nf|bB{3&I+H9FX&=yz0x1$&qE6kp9{g7Pt@SnfQf6im*)^*8;K!SBEKS`6)sO>HDT$c2Bzr2o1mYElKNeTYc-0k`l-z2NH) z2}$#8!z5~nEUC-E=rYh>dJ)_<$!vv|e;9$+7fJ!MZa92{ic4A+2t56HROEY-!H1h; zvwt*xQ)_U3?oMA@TLSj{_7N3fx6lVnWh^aTc>VV!u5{joD)Tp%ES&L@Z!m;5 z%&T{&qly7|psP(XG3mvmX|sfOM*1!^ncVxBbHp?0bD%#Q7Hlb!xCRuEW9`^>ksGqO z+}X}yhIlRI!_vSF_e5%p8djP~1Dz9#O}=`EmPV0i*_o44r$13Lcb*0QLqH~$l1wk8&u;4$Hsa}eGGrwQ z&m7sxmXkY`LzY5Cj^7%PN|K}!f16RuDO1VLdA3pR`mGB7VCQz$yvUT!i>F`oP=`;W zQb~WpPfd3j{WPt9Saf8h&4;jXrl)ci7d&vL{1r!+=NC)s>*4sAE$D{Q&1V;eoK8^W zn|`|qRIfyJ7xfx!pXY~LA%(#iwkA`{!o6sx~3EK>P#{$)l zvFq3@Kfql>U@=d&4iNWbpbBJMoj(4?ma zZ1+8-tH&;q)OAZ=L-eT!?d~lO<+cljc?;DTccCJ4adSMdEhAc1b03Wou{w0r|!0izM(GzV)U1 zc~Xcf^*Q9~x7frN^{>@0`zv3rpZB>2W%WA|9XBxCzoHX%KUkQ;F!Pzj1t#GuKua#l zEhJ{>N-%XrrRnAq9iM>^xig-VwhNhN%?N7&q~hH0woNTwt7!#^IrGy)^v~?P`+bg2 zDVyQ2hP`;~vGz0W{Wsasb+1-_8BF zosVVyr8*58X80e3m*cfo<$PSo@Rq8AahJwSVBhh>dGBFUE1-W12mR{s?XhyMssAS+(&tmg5 zqc}|_0#Q?NS_%v=rE6B6+}Y@;G0bAULgr`ccC@FA!=9bcq?1^mA5uaO#*G;=%(B$$ z5Ue7-V~jk)KSZd0X9~$ThmbK+fGenQhq7tTxX2_sO)IGSf&*6dnNsz0r1}~YqUVtD z!iH-Y`!*l3PH~h5$D(#|f^xLRJbb_=?$er3l~!L34yi6W>sf6_OkjhVZ|)e@_fSGu z!%s8YvEOiXR}Y#%xKg7iN z`{J{g-o$LHmx&X(rX;QD3G;}N@|;+5TszUIQ4B*yl}h0T8|0deOo=N;M%P758FE+` zBa@?QbBKUgR3!(R163N&pMjk9dU;I9Gh7Ris^PVIL_jnu^8-ycYBk1wub4{q(ySg4Hc_g^zgmFk8Pj`){LBq4TmeUl*iwl6m1DI%3I2WbYd zhyJ)WpEV*yAL1}p^6&=xt=xIJ^C$I($~LJGKX`5`ROW6g2D*Vdl&Mn8yu7~CXJ=>e zzki?1^n{<{+cIm}dh0H<&@4RpFxMhX`4;&k{%RgO0#FW3rC<@?UIFo^lAP3(!C(=!Zqi|U5k#lv-@!f?aO{^h+0^HQxGO{`@{kx^Ds?A|;( z&!_i0M?qskCoLO|*fZ@VBi@zUWN||CMu1)sz4NV9x;Kx4Q1?04F^D|@WRA7d$|I^e z+oWtI&is9d%7}nGzGDeFrm0XoMl)Kvc)w+Pbbb6Yk$<*Uv#z!(mMm%{ZP4`GGp_7B zgqUQLJyf*S0TsvZ@i_TvVioDpPi0K)Iux;7j`^xiC^M^7YcPY7MfS-t;2adM!>eD$rU8k z8dZwtGj{=b?zCLb7y#4RDe7hlkt)>u+P4MSmNu#JYFrp`_KWsSZ0 zZ67gv8h`gYIf1$pye2xxX18}OW`Lt^p3PEJc1)7icG;K~(Y&Vt z5Ol2^%SB0N5*vvlYHhj=HR!pkkFF-#uH&Uv|>SC!OF z(pdnGHEXos3EsEnO1{FA+z7INDHzd^HJnbUW}FP}9@&er9PjHzL>acPGc__xBbV-3 z7+N7b;u0fvQp%w-^b547da$@L&4}o8H@Xq|JuVM68$o#L8m%raQ1d-(+VIt%4_Ais z8EOj?9I?a)_FxLBJvVlR*620bZe-R8PWHEqJ7nD$VPz~G@yek8#nx^8)2St91IRjk zT_gp#8uX;P6zp@2RL|_b{lgbCh+~+^6~g4=?3jKdEnC$yoG_+B8d`U_AJF{M zcqjqB=%Sv1E2^p?@|w_?&<82lp80*tR1v8%lp>YQX!(A*IdAILI4Yi|IUQi?Y*p*zYtSk!!_ucAN2qk`tRDe$UmqDe;r=_Gwc07lY<`bTA(lp!q@cV2 z03=n(T9eH`qN-F~)(R_^n_3^onh>#63?I`FqbVs<4yf7UIbb@ivdm{#(tmCD(UUdl z)g7A`u_c#xwSlB;^bnC3vYMRWvdi?c!ZwTqA~)gXQqhUs4d{NDc;YkWrw)m9ZPliS zGnn7%(&8o8XqK}g%A*qCEEl7#$?NyZS-zZ7d9@Aqi)Oor3QtA88tAMHyMSjf>G+G#e<|J1Xl~ob|q2zDagBy>wQ` zV#>)|>!y~Tzfe>Y*%*x}iY(};+3>QJtQ~mNVZoZwiP5SfOj;L*u+u4u*5u4z@tNt_94urQ>JqW7dPC#>~<(NsrqS+ zhmMH1jJx2kgrSu4nx;ucWWY)|jdTGdu=4PmwcTRHOGvDs5h94t+QVPUOH=7WnVD`c zrdC~BrrefzBWztWr@KwC1^D*{?SSZ0IgB@fD}b+txlVGW#!JX_AnU=rVd5ji$W@vN z@_;E870J|j206HM%`E01=%xNBYpT=u0ugAO-#}E@S+$eKwGD^;{_--i_zK2RWm6ko zqz@LWHy4>nxf+Fl6KV2ntFw+X5^^>Wo`Mg>Gh=Q{lh*91_P#BKti0DFM5YObQf1(@ zCZ$Xdz?B2kO2v<#Y9DVC;d7n^Vi0*-WMO|4W*lVPFLE8mCzDeB*cZ0Upiy^Bib!SoWvG=EBP&pqCa^ zJw#Ufx8ri=o6QmuGtR82Mjp>lnbLaIQT12f&*a6W4H-S$?OyJK-p?!RidAE9u$YT& z=TWe$`k?7Xdg>v09FHXP&A+N1Xi8SP`jcMNqvKc^mZFF*4$OXyv!uw}srcZ_}s1_&=E z$YHjNAnC5=4|YFluy+V_*-vzpIA_T0jT`W^ z+;XX&#uJf7?uK{(+8Zhv?sk{;urr8}6VchwGbcGh+dvi2H}P!U7~^bv zClBu3Y}{=K55%x1&?``$9uZ#DKLRb`hnJ05&7M({1KyD ztwP=op-=Okjo%?H_}6{>s|$lr3xt#MOB@VxiaX92c%{Vid?B-aQeufd(&-Pne6c1G z0Sm87KLiKP%T6!6!id_edn+nO)in1I+D@`7dTr?U1{tfx(fkk-r>SJ?IqI=O*BW{V$@ZS#IQ)I2)5K|olG9}#Ud z{ME_$)%1OjXe_^mbng9hZ1JmW`X1p~paykd{d6jLb^cgAEf6Bx>~0UVfO~&&i=00z z3-mTEe2@C(?X1He2qd@2LI1Fgjx1g6yUjHz+*`oYiFO~eKy;RuH#>VJ_PxRj)l7Fv} zsXg0oilF-0EmSrzN+!l7;ae)t8z;`EISESvWVIzEGf1JOIWf#vBsVYCwKp=^vO=0S zpL|n(b!!dE3Vt{uK9j@=fI@#f0>6RY#*C~DaC3Z4CRqNx?S0?vJ~?^s_q_6p0BP>l zMIb*XDOuI|tTCg(sXQ@9VMLd`#EMgR=>mFb+5OOUMD^h8p|%Rk?0d>sv_)Bj;MUxw zq;Fg%F^Qzf6Lk8%nqAQGsX5rMij_zVbYU*e373a&v16B8z;;rtXL@6?QmOnOH&pG- z)`=M+L16&GiT#X&)8jNd?yl;b7zL61cBgC+#i`~PN#BCwb7a;Zb*ENh%p;40D{PaD zDl59nl)kAIu~xAa8y)pnuH1oKDP>m0mTeir~TdK0`I+Sm6n9EG>@~V#<6D;Xx zk#w;4`6MPZeYGbDh>Ei+lr)@uwC7 ztOtg#h#QyLGNdK4k64-m^mzzIOamr8p%g|4G8lOR66jH-w*ySdiz7LN`}HKvS`=%- zk|?!o*QZ@)_)~IE`L?p8nG4qKTnR#Kt{PyWCNLjZ2jEqqT`}#(H66z5Wcdnq@m{rX zrZFCLNNf?SVutXD;jb-6Fx@Q|4z19veB<^^fr-v7KBi^Dc8~^SYZERAEF)UEcs8D7 z;}eI8*Lh*b)TyXMOJ+GXwfeb*nvMf>wkkYLXl^x~VBFNnS`r~`1rHws3yu6D z<~zzo@i$f%1lu860lo#{2J)c9NMWUA3i$|BHoTNJT!7$1@7&gXUaWO2wCt1*VVYdL)&uM$woByE2NZ{LzrB6U&qV2y_>TmQ6wxrl+_>ZSb=RysjZ1D(elZI=s(i>Ow)5tl$J2_;WPy73!MPbeC5*@k8Qg}c+bZC~ zJQodZV_*q~i(xQGQ^C$Kut4{0>}8NQ;eZK!CK>?6M301v`gc>NVWJ5DOaTX+87A`! zf?(J4Y%o0Of(+Y6Ye7SkiG<-o5#j+TkZ^5M16Chx8J`N9xUPrDgAXw=vL*N_Yuf$v zXOJE#{cf29X|@3Q{u`0sQcmcZe14+u$x`?I#jr9WxQ@ActK7b4Mz8DTWVQOPCs!40 zvCbo%EgYA6aVO4ZTDN> zTAQD;Ez-_SgnTsR%a5k4&43qvH6+-LnDcb7&g-xI{?+Y~a9sdVnV(l^<5W><&e&w$ zFC%}%lAaf2nB348CUw`6OJHUeN}#i)#{XHaePU0oLjw1bR%-b-&|97w0@ny zji#j3+#7`aO4Q;C-I;Wt^&Cv6#viC^afRd@6YR(e-iqK4{L1o_ZwyMu8yzLTN3@c; z>jj(fYsfPu%#ju9?q5yWKh2sb+FH*a_@$LE_*jrJ6>FH4zxR=`l`r6!kZ~oJp*jSl zTE6cQiv=;NZIhvT`P0hD?h9y!_@EB=Kr1>_Yd7f1$}CT$cK?V{XA{KEHzX}}kT>ex>!^t&%;86^w_;5zIfj<@#T;(_cAZwOP&`<-_12j?({k5H|@ z2R(PWxiaZX?F z7A}9b8vaWa`@r@5A%^*p$=-{hepWaVwFXEfj8}h7lCnaJl#r4pE(4xeGRYQiT~s$D zYW+@j0O$1iSKiB-uGXCsoY#5S^k$oP?yt?3^oN-qy?2mZ$YsoP+8%SL%VxZv0eH<% z7uCxFQ(%_PP3F|M&iWrb!Nv_)zz#gkgp*Mh&-P6?2b>Q*YGRsk#ky3?-Z?judAwO^r?l8I-OdRdKdyGfF{1D&lSv|& ztF_3b?X`gz{TdPipy#!Jo=@63vhH1f*nrh?zsBtNOsGvBKp z5W;4fUP?6#GRf3(NY@7@APXEram%_`OgvoOs}W7JNb5*ch5ne+Db&E?kJ{Z8yR|6g zg;y`hx#FB=$RXJL)OM^b4;IPXwY=$*HSnyloK(?_XyB#qeEC~}Qn8KjayZuVR;RBfWr;tl!8LQ;w;%ro@qvtg){ z@M-mqS*y@oOw~?2(hwJSA4wDwT3+4ShwCx(v?iPi{jPM^IaC>SCKK3reiw)BWtL|U zpCIJn68*#$MPG^xnB`X*!q&OPpGz5MwAPni+1?eb+CNmF$oEI_EOdwh{A3F>bi`!f zqPDkWYjGEqUYY#7GprQA<0smHM{?K#sZ0A_P$6QBpPML5IQuEAIB%@WZTx*;sG0-r zB=>=r*1JC*@S%8Z4QR`>6{^3n$(mSh**mW6NjcT8GDStGd+j^+w9u;LkFlGM9JJR+ zY~x?P-uA382RVL>WJH=&?nwa^vIrd9|YIkV&%uzRACt;)gxBqMV_BYJuiZ z`Q8A(xLAQ(2@u2v=%vAR2>?ZPun{=lU{b^S3J7QBy-eY*OASp#2`6m4u9?(8Usz zArjGK!tNAc8(Xe!DgHfDf3B*&`SX8VRcQkPAU*xVraAAknRh-OYrlWr-(&cjdyFeo zLCNB`(;)`MiC@v}u#p`Sspy>QRv(pUh=r=_JSE>ffvTob*DXRx_urS-1Bi$p>)nc~ z$s$nbLy!0ops%2N`cm25O}02r4byn3=dyUGYaM@YHTgny!AYM;UFUrV^b|k} zuV0M@=M!Ryjf>~gyoj+C(lI8DXX}po4zvUpZQFbKh%dSq^q%xTfe}X&J;7g6bA2vi zgL2_&An#0T{blpP`b*alf2V%$_Az`>Jlj4QS2xQ6lyEfVjC>YzmN;P2U9qVM2e^SO zl~tlhDqEg$s$CG3+LC^k)+}_$9-fnH9zRr+xY35=>_;qlsPhQmTJsBKumNrtFs2(U zSsbxribW~oU6NDi+V6W%H`>o{8W(gf->i%}GK?`8G~N`@mRSc3VUck^N_4j?rDA)c zGA0iQ%P>c)8}F1B>!`=CKO9C4xQpFO(}UBM@#r9&_iJNlL64WNg&5XW`aHAQ*(p7O zk5xg|RZpyp+ucQV(?151=SzsSO1sN15Xd2FV#8zN&sFDMe0qZ<232-rBL{iQ z7T{;NKk5PX&HH(vrUofLija8nRr=uvp}8gMTF;+DYqZu)wb#emve@5JS(5(2q4od0 zvEV=Gypk@aw*NuioKl*QLls2jg@6M)xQR>M2h$G+BU$bz4GoT-i%#za7t>jh!4MX7 zSJl>yxj`A0p9`65b*RzLi=cZ&I;gse_=4pMfW>gN-*Vn5IUi{GAR}$|F%2{{M|j|Z z^RO|>2l{pcbtXkCTWf!9j+2+k;M#)=va(p-Xy7)fVDiP;F+WYR2cs!sObcPFS+<~$ z?9H|NtjAbsA&tW0NN6u`ALlSjPK}ikuK&s><~^K(qYh+@zK#Iv69#bm6f}`JDQL zOJnwGN;!2<8G7iw_xOE^;YpHEpVG`Md&rx*W{jR^cyWjYNX!A(elH|1fd5=Yihfy* zQdvvKHBT$2`H^q^+njAQHvD<9jG^EiNjI{!pW(c6b}Y70_P{YTB=Pe8d&hi%IM#|o zS8zpZA47+vcDaOIg~&(ZP8*;0(94z`1uq` zTkUQ2ZHkq~lxFNml6dGQU;zfy7@s^2rd@(-Xe0j-cnY^vcFjFU!Y^E;*Tw{j z2DzWpheGt4=-#T;x>p>lW>kQ%gsF_~R%PsI-)={Wx)Z)JMo}41Qcs-f4Sosj`Kv>` z8#wY9e7qqVe@g=p`=@V+xV^oJ^B<<;|7X7WS3jsy`{lf-g34zp&E6rq(}+ruq?BYE zFQ$S&uLXdRs{0<2a`#1Ne#<43Ei;%T3N`LY7zD)eulV&3aFL4`1R8GEE#l30r&l|> z3%3SGU@8B@amUGR_DI*0&A0c1HG7cezOI)s`!G_Q?@vngxf& z9_Z2Jj~fzD+t)A}b}3R;CN2IbLqBa=hJh0(8O z@`88gn(8@fxav(aX0D!Ul2e?;gw&yi?U5BA_`Q6FnJHEs_cwZOVsp+^;hKeoz%VJR zaMD0(z^as59)-dDek+Uy>wNS8QmLV$&_Q*TC#B>jiKSzvMJO6axd{^a@m}Gct;iG> zGp;C)2C+d0AcS@^H+XQigmvC|es`!eu z+I}S_8n$22)+e6|;K=Y0r7e1R`2nU&U62J2&5{_u3dg~hU|)QjBkUIGn9_cbct%Bd zO4Bwv@JgE2m|5863LM=|OGe}roESGovk|eniwXC%HSITP$U(*g~1p&E9#K zuW}~K+96po$D%fSqpI>K(u4;Gms}(#h}g$z-y@SW|r+BT({8CoMT(ZFQ{q+8x9{VXvw>}LanIS;2yQZOLi5eMK)3et956|Z)YZpEdb*TVWYMO zuW2TgA$s5%my3>(|Gd~uk}J~j0rT&$_%uV7nEMH=eSh}>8+QE=I$r4gTP_0efZ;Rx}C&(HO>; ztqb(r1wo@e&nrb#W)TPoQ?0ZJ%;%&ThM~~vFI5w&qmrq^j$E$AtWv0iR;~=mr=|JH zMX^4B3Iv>fE?D=M0{_tv{>Y}n)D7A_(VnC9iX?!w)koz>=&FR#?S89%CTXO>J_p-< zZ?@Cc3HTM}Z|xZmgsyZ72c{J1qE*uG^{fbtqxH;I2%hXGmDF9qMQn7qY;soCDCS1MA!l68QatLFX2%6q>Nh(Qo=d;$qIKG^c>d=L>7ToAX6BM0qW;y zMZnU+6B|~0lt#G&u!v*28>}UD1bnofP}`+bfq}glH^;mr&=p-0BrnM_tkZT{m&$d^a>*6xr)F^*KdNNZVtAh&}r;@H&9c4krQI%wB7xM~8zHneHe z)O{;N2VRgBWr=P08b&+XJNGw%oZFb)H=3J zwn5fm_*Cp4J3Sixn|J>wHvg&nJH^P(mhRo^1xd8q>mQ8X$o1<-974`RP0zOvqZ!?- zIt;CPW$5yvYn3G{tN6~Gl@JT-G7F2@wFTR^&HdQfyLP?WbVIs2udYcdZgyKWJ-QEj zv?>Npj(ieoNKR#F|54Sk>hX=~X!ny)t1)@aLZeI=qT~hV6#X={%MUaZaZ4G%1NCC! znpuYoAk2FycR_k`5k4Eb+hnEwIOWI$!d`^3d{(7Y5)hP}rw52o9h0_(E~u`;jukj_ z6JTv@d5>?{xPHzdc`ci5P9tu8YgAlm4mj2*9+p`^mcjg@UOTg)mbkHxl|SOH*)@cg zVWX~5zS@+qx76CxapfuvC{#DhPXEaGSq;^M7#6Xwv~;bg&h+ZDxN+;*oK>BGmvIAa zD@zRqva8j(NS03UTEplau@Q;k$f*KKO@W)!A4|UTB$0Bj``sABl+i zZt(FC11y6?{tFGF$#Sze(AXu32833S*tPZM%s4ztBxH%w05Q@wPyf~G32nrft zE`zRF$u#yfm4BF+GPmFtaLVV_FxQ!`wWccbe$8gXyHFOR4C-zR%id6;NS+QAEq|cP zmX8y=?!!v&ydYQnCN}!Qgx1q5gN9~ibrgNMj9Cx`(-r#ZxqGFxRP*$bG7k1qZvUl8{Ftj+{zYMG0oKn@HEUZ z9i>rY$0}CeQ(v}4Ta9!cj;X@dRF2vN^%Z=@SYsME1XhWqZ*+$~>L2mGQ_4Ro^)cKe z>dU=X6r|GHK+HUR`x&3)iIS-{QGJ6GdRSv7o48@O&?-#sSTk~KuK}muDOo9dAtq5Y z^7D!~i{bYVZkJC|om4iUp(Jn~hHs&im^bS$@RXRv19`=UY0%8Lp?eZ(dlYaZ{ct0K zYVkdm8n$UHK4?B8Cw@ij`mLl~8mjV=C8sRipx=pUP_W9+*De+Kx#>*;=md{Wlyd-0R_gV#H*^%F>an~f&m`aw(!X*}{`1gpU> zI7b}Ns2*0*b+XfhZjgGKfp|;qMm*2uPUq=+Mc)1l>kH|Kw%<;E{B`?o5I!72z7zg7 zmV7(JV+Vyl>}M|ufshaQZHTlOvb1M}kCBp*3P{ryn`IfLa6;jX0xnQ^vmTj~GiS&fz#vF&eWFF_x1&{l? zIroT?MqA}k-mZ>&!s{gE$^2H&3911^1|`oPXG4nl&UcAP{){;JrTbtT~Z= z|NZo5OOu9I^;B%i_EdIZG1E@@X-d{N`@YzYg?8(P&GkF46=N=tbU~+aD@D@*m@-q9 zq3>cdVQ6}sHlai+8Y!e5qS2VJ(P{Mag6vemn^3Rra@oE;cE;;hGS_|TF&fuxmY;Hx zztg*o6V7l7AZ|S82F*Q@6Q&3@uxKMxd1Yer!ws@I?Oq6C>N|DAd7r~#<2z7l`%+zi z6MNtkr2W-?Pw#G%?EWWPWmq#@#}F!Zs9~}+dl{?QO$yXiX%~v_wu*((_g{fH94l^U z<>)L4@B_^uR#IO;sE@qJ?#KOA!OG8raPQN`Y^fvcIWpG4vfVijM7#s@$Vf}9B-D1DqrD|?kJ`4ZDwzh@3FT~EH)zeN2s9`Q=riWSG^PI$rR^~pR z>an&GRwTEo(rv3zQa_V!>{?fcog%vUHv&12p245(Q7O3M7Ij6|)P%F?d{mU}{uk0i zcacIPFCT1Fgf4Cw4CqmmaPyNUy7kcSdUCER)CNL~@BJx4k=x>UKEu~PCt=OtnSz=hA z-vLqw*p~&2j(y;=RxE_{1Z6BmidyAWrAc!Z{CHndzpHW;&IwXJt9-ChWhW+llVh!1 zMD+0YZ&?ONW?Vx%XPFPHm1~W67pPq&CO%>lvX>Mi|gmQ zNNqv^&8T+NhWeYD%8A`+Nz;!>W5b;Y0SO361=P@!$)k`kDA1W)U7Jp=O9p5YEo!!I zp6=}qPY12X^hZVPN5TOThPqkR(WUXU)bpuu+Sn=h8-Dy z^?2dC)Lb-oVt3fBMaLQ@gx=T(q*3rdE1e?Q75qdjK&(WvYsy=uPD~Cvg_u*gxwC$WFn}3BI9VwF} zJHMmq#{D+t&m4Hq(S?qkix2~~VE>BBhe~EJFp!%cP_wEuRa@?FQStxe0`b3Q@qYz>{7+2lDz!Iz6jR*y?d7JHtJUFQ$OBc8 zBAj)UFCy$E4B(L7l-88tMr}WG+*+F4kFL1bz`=(^P-I!={(9^T{Y3wEgLq?qYtP`9 z<2~KfrKe@|d9Upnc=GGcC)fUIh5y^Dq=@)gfJg&GMZTJ=Zk3km(wzE|=}J|(){+9N zw`$W`47RflYY`Ajn|TteN@vRl%_67t#Nv}Sw>1l8|3Kyu5z=gX>$k2bq;Hljxq9(M|4)i z*Z9C9VTR2w*2^xM5o-+B)f}X0X<86uj^MhDu4Xgm$dm?7=qFB)t9%<3=G#nbp&~)> z2F@v|%|vicXog4_Hf9CmY}wA$Babh_y#<55>rqJVR?l8O4Dh!t{<5rv?4wIll*21& zW!i4TyG;+!WG7xaF5?XF?%0oH!ym(S0r~!-@Gr%-4jT?+-BT8x?|e-bqMd`AGz}lI z1tJ^B2Zk-1$-FcRf``x>3mFv=VxrR}7#JoQU+z>ioug88<1GrI3;lexwSyU@_V2m~ zHE5(*GScAhRZcy*aLJQndoklh9^Nbj=8quAVEsZQ9i7JlOBIWaTVXhEZgb7A>O;B- z1e^eu6*z=TzIZZ556I{8w8hL4g~T~Ri7ZRf^b6FO5Qq0W1KE_;2v^RnW%@Z^D0Mud zafrmopB0#%5(X}k%&gIZ@ub2_Syw13?zLQDGF!N5%}qqdxYMI)TD|*LLk8tQ!Fclf&vAlHc+wi4W~N^ z7fOYQL3e4>-6$G$(~eBm%VyII?wBssEK&{9WW3SViPKDZs>}6%*Bu)bucIGG|IEkx z%mP9UYMXJJdMJ^C=j<6XG3H?UB<9*WYp zH5}h;lMzvp@9}z!eQ@qFaEFcRWBk=F!B#`TSeiAFzNB&w^O=det!-{@G`!T>V!Hn$ zGNu{OM>K%AO*3Eu+a#5<)?LVMnV>Xy^!#$j2y}D74RF#kp;CW zx>{zj^f|vtRm9&prvn)BVI*E72MScT`q1(L0DDymg@-WD2Vur9#hCs^3^H|SFgyur zLu?dc{ejUiO-piqqsBeNAQV3aRHjpWmeYEqH>dK|VxrH0h|Tg>;_z3vFZ>Dq&o zk%YJe@35YAi23E8<=GbwsgFEUbwO4f*OqXFv7YMA9OE09pEe@i zvbWOt*vsN#d-?90bN!;${lp37Bp4UMYaEra6Tx^LYCcXti$?(XjH?yikXfZ!I~A-KD1aChkr?gY2s1h{N@ zPyOF}&)HS`-nvy?{oz+#{h_PpT63*A#xvem`a_EeHe$?-hYUB{(DBiiS4$232Dm6K z00b*3x|wxfW7JP?aF9)5Gg1y|+CjObmUS$gJG$mcQ&3<5_{GP3u#C3PHqu^ehlBY> zhxY#35}b2W_64tn-%k+fLF>c%Ye9peHz-x19@?f#i}mLpPXx)i`hRu&K&lk_3IaFw z{}4$SmtqsnfztbgqD?Ha^To`-F`NUZ_X$TkPk3j?Qnaq7WdMz@Htv?DPB6rrq3a&B zViF7C^Tt!x^LfwGD;BhB;()yPKvCBdY%V}hIg4aR|M`}qt|!QxjG*!dlAYFv6Fp;p z=&@>N`a(ir?g!v~@6*R*FNO7+p8MEW_&@GvzKmf?r@ik9PXE}+{~L?d|D34(7Y+Nb zfkC&XgBH3JMgWv3Cv3f~dWD0(h=YRYlqNFfD)$$(zpw>=wy0?nE zo3on`p>IMJrJkI0>DaJXS9|8?r#bKVpNvjVtNXmbw}6jZoVm>O?AfX3cwy(fHRt$z zPpQc@(*|lkH{#AC^H%!Pe3qHvQWrRheyw-d=$zE_6_>eVaWF%9dK>39>~8$*@e==q zBEW^yrgYdDcNPs|@zDJB%R3A|+WDez1x1nLi?I*jm;QbNYpRNf^5OPh?ojuOkdqllXjHG*NdY zYRLurl_CQ)VMko?Wbuv1THmEaH4}U#+n7~TQij$i1tD%#bOD&*z_ds{d zly6gpU@aCkjWH)MB1OrIj#$C&IY;*nE}94_;m<(sPlOIl0^o242*c37sMQ8zlC%

UF0Ilql-1UbH$^1wlnz=0kHm!qR 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

NSEj$0z&7#TP;UYl?q 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ϙQ9`H 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%0DpR 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

1?)>_YpKT13d0)e#Z+hND`t%IF)vt5 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%0A74&&OtmH#SZ#T6Rcl%ETJ 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
5BAk?UHMr-|<|Pjdml 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�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

i~U=V!%r{dlS2zln*#fnPN3N=xX>Pe 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

%&Y^KivcsqwTD@Rm%p?K_* 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

7$@X20>` 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

&i(qO^2)46}hx@>Mg14FyyV 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

pdzNG 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 z

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

)nzzhF^c+2dHUpI|+X&%?~#0dF}PzIL(b> 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

Wh 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 z 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