diff --git a/LOG_FILE_IS_UNDEFINED b/LOG_FILE_IS_UNDEFINED new file mode 100644 index 0000000..425bac2 --- /dev/null +++ b/LOG_FILE_IS_UNDEFINED @@ -0,0 +1,259 @@ +2023-11-13 20:07:50.675 |  INFO 5059 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5059 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:07:50.680 |  INFO 5059 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:07:50.946 |  WARN 5059 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:07:51.229 | ERROR 5059 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + +2023-11-13 20:12:43.437 |  INFO 5144 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5144 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:12:43.442 |  INFO 5144 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:12:43.715 |  WARN 5144 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:12:44.226 | ERROR 5144 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + +2023-11-13 20:14:25.579 |  INFO 5167 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5167 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:14:25.584 |  INFO 5167 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:14:25.938 |  WARN 5167 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:14:26.281 | ERROR 5167 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + +2023-11-13 20:24:42.667 |  INFO 5274 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5274 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:24:42.673 |  INFO 5274 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:24:42.987 |  WARN 5274 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:24:43.341 | ERROR 5274 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + +2023-11-13 20:25:44.327 |  INFO 5317 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5317 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:25:44.334 |  INFO 5317 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:25:44.645 |  WARN 5317 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:25:45.029 | ERROR 5317 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + +2023-11-13 20:26:38.089 |  INFO 5322 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5322 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:26:38.093 |  INFO 5322 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:26:38.352 |  WARN 5322 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:26:38.689 | ERROR 5322 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + +2023-11-13 20:36:43.401 |  INFO 5454 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | Starting YshopServerApplication using Java 1.8.0_371 on macs-MacBook-Pro.local with PID 5454 (/Users/zkthink/IdeaProjects/yixiang/yshop-pro/yshop-server/target/classes started by mac in /Users/zkthink/IdeaProjects/yixiang/yshop-pro) +2023-11-13 20:36:43.405 |  INFO 5454 | main [TID: N/A] c.y.yshop.server.YshopServerApplication  | No active profile set, falling back to 1 default profile: "default" +2023-11-13 20:36:43.649 |  WARN 5454 | main [TID: N/A] ConfigServletWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" +2023-11-13 20:36:44.039 | ERROR 5454 | main [TID: N/A] o.s.boot.SpringApplication  | Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [co.yixiang.yshop.server.YshopServerApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at co.yixiang.yshop.server.YshopServerApplication.main(YshopServerApplication.java:16) +Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yshop.info.base-package' in value "${yshop.info.base-package}.server" + at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) + at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) + at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) + at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) + at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:630) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage(ClassPathScanningCandidateComponentProvider.java:478) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:420) + at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 13 common frames omitted + diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/sql/yshop-pro.sql b/sql/yshop-pro.sql index bc64160..a198458 100644 --- a/sql/yshop-pro.sql +++ b/sql/yshop-pro.sql @@ -780,7 +780,7 @@ INSERT INTO `infra_codegen_column` VALUES (2154, 160, 'tenant_id', 'BIGINT', ' INSERT INTO `infra_codegen_column` VALUES (2155, 161, 'id', 'BIGINT', 'id', b'0', b'1', '1', 1, 'Long', 'id', '', '24658', b'0', b'1', b'0', '=', b'1', 'input', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); INSERT INTO `infra_codegen_column` VALUES (2156, 161, 'uid', 'BIGINT', '用户ID', b'0', b'0', '0', 2, 'Long', 'uid', '', '17942', b'1', b'1', b'1', '=', b'1', 'input', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); INSERT INTO `infra_codegen_column` VALUES (2157, 161, 'product_id', 'BIGINT', '商品ID', b'0', b'0', '0', 3, 'Long', 'productId', '', '8816', b'1', b'1', b'1', '=', b'1', 'input', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); -INSERT INTO `infra_codegen_column` VALUES (2158, 161, 'type', 'VARCHAR', '类型(收藏(collect)、点赞(like))', b'1', b'0', '0', 4, 'String', 'type', '', '2', b'1', b'1', b'1', '=', b'1', 'select', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); +INSERT INTO `infra_codegen_column` VALUES (2158, 161, 'type', 'VARCHAR', '类型(收藏(collect)、足迹(foot))', b'1', b'0', '0', 4, 'String', 'type', '', '2', b'1', b'1', b'1', '=', b'1', 'select', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); INSERT INTO `infra_codegen_column` VALUES (2159, 161, 'category', 'VARCHAR', '某种类型的商品(普通商品、秒杀商品)', b'1', b'0', '0', 5, 'String', 'category', '', NULL, b'1', b'1', b'1', '=', b'1', 'input', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); INSERT INTO `infra_codegen_column` VALUES (2160, 161, 'creator', 'VARCHAR', '创建者', b'1', b'0', '0', 6, 'String', 'creator', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); INSERT INTO `infra_codegen_column` VALUES (2161, 161, 'create_time', 'TIMESTAMP', '添加时间', b'0', b'0', '0', 7, 'LocalDateTime', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '1', '2023-06-09 19:07:42', '1', '2023-06-13 09:39:36', b'0'); @@ -6826,6 +6826,7 @@ CREATE TABLE `yshop_store_order` ( `create_time` datetime NOT NULL COMMENT '添加时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `updater` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新者', + `pay_info` varchar(1024) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `order_id_2` (`order_id`,`uid`) USING BTREE, UNIQUE KEY `unique` (`unique`) USING BTREE, @@ -6843,41 +6844,7 @@ CREATE TABLE `yshop_store_order` ( -- Records of yshop_store_order -- ---------------------------- BEGIN; -INSERT INTO `yshop_store_order` VALUES (4, '1673967434274439168', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '151', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, '2023-07-15 18:59:50', 'yue', 3, 0, NULL, '我就是想退款', '2023-06-28 17:26:09', '七天无理由', NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'commodo reprehenderit', '43207f1820b74d29b2404962ec1cfc12', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-06-28 16:11:52', '2023-07-15 18:59:50', '2'); -INSERT INTO `yshop_store_order` VALUES (5, '1674264266607165440', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '150', 0.00, 5, 495.00, 0.00, 495.00, 0.00, 0.00, 0, 0.00, 0, '2023-06-29 11:56:54', 'yue', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'in officia', 'ba78b4df312548b4834cb889c7eb822a', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-06-29 11:51:22', '2023-06-29 11:56:54', '2'); -INSERT INTO `yshop_store_order` VALUES (6, '1675076031473516544', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '152', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 1, '2023-07-01 23:00:05', 'yue', -1, 1, NULL, 'Lorem dolor', '2023-09-10 18:43:15', 'ipsum fugiat et enim velit', NULL, 0.00, 'YTO', '圆通速递', 'normal', 'send', 'YT7204685961109', 0.00, 0.00, 0.00, 0.00, 'ullamco laboris', 'bec3e825553a4c80a2b3bd83d7e6e957', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-01 17:37:02', '2023-07-03 10:50:17', '1'); -INSERT INTO `yshop_store_order` VALUES (7, '1675346979909009408', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '153', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 1, '2023-07-03 10:49:04', '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 1.00, 0.00, 0.00, 0.00, 'ullamco laboris', 'cc96c32433a4480e9679b3723770d0a2', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-02 11:33:41', '2023-07-03 10:47:33', '1'); -INSERT INTO `yshop_store_order` VALUES (8, '1683752888607703040', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '154', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 1, '2023-07-25 16:33:39', 'yue', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '6cd509c7b192467aafc1eccf5ffcac72', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-25 16:15:46', '2023-07-25 16:33:39', '2'); -INSERT INTO `yshop_store_order` VALUES (9, '1684147918426079232', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '155', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '1849d3cd27034cb08f6f58dfd44964c2', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-26 18:25:28', '2023-07-26 18:25:28', '2'); -INSERT INTO `yshop_store_order` VALUES (10, '1684150535873101824', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '156', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '68b77cda41c44dceb9fde938a47dea5d', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-26 18:35:52', '2023-07-26 18:35:52', '2'); -INSERT INTO `yshop_store_order` VALUES (11, '1684151659514560512', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '157', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '4a905f1c1f9a4bd0bd83b9eb9ee0983c', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-26 18:40:20', '2023-07-26 18:40:20', '2'); -INSERT INTO `yshop_store_order` VALUES (12, '1684152535528505344', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '158', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '3822aec4653e4af7945b15180f591f55', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-26 18:43:49', '2023-07-26 18:43:49', '2'); -INSERT INTO `yshop_store_order` VALUES (13, '1684156500248887296', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '159', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', 'd136481405104cbebb8895c29951515c', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-26 18:59:34', '2023-07-26 18:59:34', '2'); -INSERT INTO `yshop_store_order` VALUES (14, '1684159287636525056', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '160', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '2ab5a0b3dd714c1da0135956a20a7bfb', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-26 19:10:39', '2023-07-26 19:10:39', '2'); -INSERT INTO `yshop_store_order` VALUES (15, '1684395247158689792', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '161', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '289b4d3c8fd0469ba3de03a2e5221478', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-27 10:48:16', '2023-07-27 10:48:16', '2'); -INSERT INTO `yshop_store_order` VALUES (16, '1684409607071465472', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '162', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', '9ef7bae392c047cab42a6439058c2eca', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-27 11:45:20', '2023-07-27 11:45:20', '2'); -INSERT INTO `yshop_store_order` VALUES (17, '1684410832919724032', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '163', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'Excepteur ullamco commodo dolor mollit', 'acd8f36301114038a24c8b6765127a4c', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-07-27 11:50:12', '2023-07-27 11:50:12', '2'); -INSERT INTO `yshop_store_order` VALUES (18, '1690637305565413376', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '166', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 1, '2023-08-13 16:14:31', 'yue', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'et incididunt ut', 'b9b8e3b52276481f9e75aa14c1bf04c5', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-08-13 16:11:59', '2023-08-13 16:14:31', '2'); -INSERT INTO `yshop_store_order` VALUES (19, '1696190124418662400', NULL, 4, '1', '15601064107', '北京市 北京市 详细地址', '169,164', 0.00, 9, 386.00, 10.00, 396.00, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 50.00, 0.00, 0.00, 0.00, '', '1ba28a72ba234aa09e178461f8b90a63', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '4', '2023-08-28 23:56:54', '2023-08-28 23:56:54', '4'); -INSERT INTO `yshop_store_order` VALUES (20, '1696192138053681152', NULL, 4, '1', '15601064107', '北京市 北京市 详细地址', '170', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '64b2ccb97fbf4e769163ef5bd5d70f35', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '4', '2023-08-29 00:04:54', '2023-08-29 00:04:54', '4'); -INSERT INTO `yshop_store_order` VALUES (21, '1700401122218344448', NULL, 4, '1', '15601064107', '北京市 北京市 详细地址', '171', 0.00, 4, 8.00, 0.00, 8.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 40.00, 0.00, 0.00, 0.00, '', '1d5fa63da0a0450fa41c9d704ca2017d', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '4', '2023-09-09 14:49:54', '2023-09-09 14:49:54', '4'); -INSERT INTO `yshop_store_order` VALUES (22, '1700405721721470976', NULL, 4, '1', '15601064107', '北京市 北京市 详细地址', '172', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'a38169c3c97e4441a77b383ff0dfcec2', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '4', '2023-09-09 15:08:11', '2023-09-09 15:08:11', '4'); -INSERT INTO `yshop_store_order` VALUES (23, '1700408690378539008', NULL, 4, '1', '15601064107', '北京市 北京市 详细地址', '173', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '17d0fb18cf9848528b40943ec4e28534', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '4', '2023-09-09 15:19:59', '2023-09-09 15:19:59', '4'); -INSERT INTO `yshop_store_order` VALUES (24, '1700447478219800576', NULL, 4, '1', '156****4107', '北京市 北京市 详细地址', '174', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 1, '2023-09-09 17:54:20', '', 3, 0, NULL, NULL, NULL, NULL, NULL, 0.00, 'ZTO', '中通快递', 'normal', 'send', '78718067343706', 10.00, 0.00, 0.00, 0.00, '', '1f9b7f56e482492e9f0143c08ee93146', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '4', '2023-09-09 17:54:06', '2023-09-09 21:45:55', '4'); -INSERT INTO `yshop_store_order` VALUES (25, '1704134770763497472', NULL, 6, '我的名字', '15601064107', ' 212', '176', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '8b14393cf459471788003ba27549f2f7', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-19 22:06:05', '2023-09-19 22:06:05', '6'); -INSERT INTO `yshop_store_order` VALUES (26, '1704145999464759296', NULL, 6, '我的名字', '156****4107', ' 212', '177', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 1, '2023-09-19 23:11:38', 'weixin', 2, 0, NULL, NULL, NULL, NULL, NULL, 0.00, 'STO', '申通快递', 'normal', 'send', '770010649545205', 10.00, 0.00, 0.00, 0.00, '', '1efee74ba85443d6ba7e0c6399c126be', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-19 22:50:42', '2023-09-26 22:29:12', '6'); -INSERT INTO `yshop_store_order` VALUES (27, '1705619660445057024', NULL, 6, '我的名字', '15601064107', ' 212', '178', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '925278f961284a43b3ba5feff204ffba', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'1', NULL, '6', '2023-09-24 00:26:31', '2023-09-24 00:26:31', '6'); -INSERT INTO `yshop_store_order` VALUES (28, '1705945250112995328', NULL, 6, '我的名字', '15601064107', ' 212', '180', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'eeb4333cf5b44f1a8f4d3836fe4158e0', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'1', NULL, '6', '2023-09-24 22:00:17', '2023-09-24 22:00:17', '6'); -INSERT INTO `yshop_store_order` VALUES (29, '1705948319500468224', NULL, 6, '我的名字', '15601064107', ' 212', '181', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '6b52689ee2214c4da54454d1b8c175a7', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'1', NULL, '6', '2023-09-24 22:12:29', '2023-09-24 22:12:29', '6'); -INSERT INTO `yshop_store_order` VALUES (30, '1705965010984894464', NULL, 6, '我的名字', '15601064107', ' 212', '179', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'cc89b8174ef24d7198c9ec940c9a765a', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-24 23:18:49', '2023-09-24 23:18:49', '6'); -INSERT INTO `yshop_store_order` VALUES (31, '1705967023684583424', NULL, 6, '我的名字', '15601064107', ' 212', '182', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '6347f9a6a7a84155a0851476fcb32cc4', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-24 23:26:48', '2023-09-24 23:26:48', '6'); -INSERT INTO `yshop_store_order` VALUES (32, '1705968438192635904', NULL, 6, '我的名字', '15601064107', ' 212', '183', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'd63952c900eb47c9bccdac80f416ab9a', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-24 23:32:26', '2023-09-24 23:32:26', '6'); -INSERT INTO `yshop_store_order` VALUES (33, '1706600681042870272', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '185', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'd7cd865fda6548a8b27f861541fde6cf', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-09-26 17:24:44', '2023-09-26 17:24:44', '2'); -INSERT INTO `yshop_store_order` VALUES (34, '1706602082166898688', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '186', 0.00, 1, 0.01, 10.00, 10.01, 10.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, '', '99b084559ad64a7fa79f91d74a0cdd4d', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-09-26 17:30:18', '2023-09-26 17:30:18', '2'); -INSERT INTO `yshop_store_order` VALUES (35, '1706674768796712960', NULL, 6, '我的名字', '15601064107', ' 212', '187', 0.00, 1, 2.00, 0.00, 2.00, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'a276b590f3d24cd6b9412bf9047e9451', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-26 22:19:08', '2023-09-26 22:19:08', '6'); -INSERT INTO `yshop_store_order` VALUES (36, '1706677275765768192', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '189', 0.00, 1, 0.01, 0.00, 0.01, 0.00, 0.00, 0, 0.00, 1, '2023-09-26 22:29:26', 'weixin', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', '40340520a5b74db0b2bc063d661a6844', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-09-26 22:29:06', '2023-09-26 22:29:26', NULL); -INSERT INTO `yshop_store_order` VALUES (37, '1706678320889856000', NULL, 6, '我的名字', '15601064107', ' 212', '190,188', 0.00, 4, 0.04, 0.00, 0.04, 0.00, 0.00, 0, 0.00, 1, '2023-09-26 22:34:17', 'weixin', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 20.00, 0.00, 0.00, 0.00, '', '22b071a75f7946e084509e16b0ace516', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-09-26 22:33:15', '2023-09-26 22:34:17', NULL); -INSERT INTO `yshop_store_order` VALUES (38, '1711799183742074880', NULL, 6, '我的名字', '15601064107', ' 212', '192', 0.00, 1, 0.01, 0.00, 0.01, 0.00, 0.00, 0, 0.00, 0, NULL, '', 0, 0, NULL, NULL, NULL, NULL, NULL, 0.00, '', NULL, 'normal', 'send', NULL, 10.00, 0.00, 0.00, 0.00, '', 'ecd2b6f9271d45bbb1274c78474091b6', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '6', '2023-10-11 01:41:44', '2023-10-11 01:41:44', '6'); +INSERT INTO `yshop_store_order` VALUES (4, '1673967434274439168', NULL, 2, '处龙难较八', '18118747768', '北京 北京市 东城区 777号', '151', 0.00, 1, 94.00, 10.00, 104.00, 10.00, 0.00, 0, 0.00, 0, '2023-07-15 18:59:50', 'yue', 3, 0, NULL, '我就是想退款', '2023-06-28 17:26:09', '七天无理由', NULL, 0.00, '', NULL, 'normal', 'send', NULL, 0.00, 0.00, 0.00, 0.00, 'commodo reprehenderit', '43207f1820b74d29b2404962ec1cfc12', NULL, 0, 0, 0, 0.00, 0, 0, '', 0, 1, 0, 0, b'0', NULL, '2', '2023-06-28 16:11:52', '2023-07-15 18:59:50', '2',null); COMMIT; -- ---------------------------- @@ -7339,7 +7306,6 @@ CREATE TABLE `yshop_store_product_relation` ( `deleted` bit(1) DEFAULT b'0' COMMENT '删除', `tenant_id` bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uid` (`uid`,`product_id`,`type`,`category`) USING BTREE, KEY `type` (`type`) USING BTREE, KEY `category` (`category`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='商品点赞和收藏表'; diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java index 56dc93c..c616e45 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java @@ -27,7 +27,7 @@ public interface ShopConstants { /** * redis订单收货key */ - String REDIS_ORDER_OUTTIME_UNCONFIRM = "order:unconfirm:"; + String REDIS_ORDER_OUTTIME_UNCONFIRM = "order-unconfirm-queue"; /** * redis拼团key diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DeletedEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DeletedEnum.java new file mode 100644 index 0000000..0217952 --- /dev/null +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DeletedEnum.java @@ -0,0 +1,32 @@ +package co.yixiang.yshop.framework.common.enums; + +import co.yixiang.yshop.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 逻辑删除枚举 + * + * @author yshop + */ +@Getter +@AllArgsConstructor +public enum DeletedEnum { + + NO(false, "默认"), + YES(true, "已逻辑删除"); + + + /** + * 状态值 + */ + private final Boolean status; + /** + * 状态名 + */ + private final String name; + + +} diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java index e9363e0..d92f486 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java @@ -18,48 +18,51 @@ import java.util.stream.Stream; @AllArgsConstructor public enum OrderInfoEnum { - STATUS_NE1(-1,"申请退款"), - STATUS_NE2(-2,"退款成功"), - STATUS_0(0,"默认"), - STATUS_1(1,"待收货"), - STATUS_2(2,"已收货"), - STATUS_3(3,"已完成"), + STATUS_APPLY_REFUND(-1,"申请退款"), + STATUS_REFUND_SUCCESS(-2,"退款成功"), + STATUS_DEFAULT(0,"默认"), + STATUS_WAIT_RECEIVED(1,"待收货"), + STATUS_RECEIVED(2,"已收货"), + STATUS_FINISHED(3,"已完成"), - PAY_STATUS_0(0,"未支付"), - PAY_STATUS_1(1,"已支付"), + PAY_STATUS_UNPAID(0,"未支付"), + PAY_STATUS_HAVE_PAID(1,"已支付"), - REFUND_STATUS_0(0,"正常"), - REFUND_STATUS_1(1,"退款中"), - REFUND_STATUS_2(2,"已退款"), + REFUND_STATUS_NORMAL(0,"正常"), + REFUND_STATUS_BEING_REFUNDED(1,"退款中"), + REFUND_STATUS_HAVE_REFUNDED(2,"已退款"), - BARGAIN_STATUS_1(1,"参与中"), - BARGAIN_STATUS_2(2,"参与失败"), - BARGAIN_STATUS_3(3,"参与成功"), + BARGAIN_STATUS_ONGOING(1,"参与中"), + BARGAIN_STATUS_FAIL(2,"参与失败"), + BARGAIN_STATUS_SUCCESS(3,"参与成功"), - PINK_STATUS_1(1,"进行中"), - PINK_STATUS_2(2,"已完成"), - PINK_STATUS_3(3,"未完成"), + PINK_STATUS_ONGOING(1,"进行中"), + PINK_STATUS_FINISHED(2,"已完成"), + PINK_STATUS_UNFINISHED(3,"未完成"), - PINK_REFUND_STATUS_0(0,"拼团正常"), - PINK_REFUND_STATUS_1(1,"拼团已退款"), + PINK_REFUND_STATUS_NORMAL(0,"拼团正常"), + PINK_REFUND_STATUS_REFUNDED(1,"拼团已退款"), - CANCEL_STATUS_0(0,"正常"), - CANCEL_STATUS_1(1,"已取消"), + CANCEL_STATUS_NORMAL(0,"正常"), + CANCEL_STATUS_CANCELED(1,"已取消"), - CONFIRM_STATUS_0(0,"正常"), - CONFIRM_STATUS_1(1,"确认"), + CONFIRM_STATUS_NORMAL(0,"正常"), + CONFIRM_STATUS_CONFIRM(1,"确认"), - PAY_CHANNEL_0(0,"公众号/H5支付渠道"), - PAY_CHANNEL_1(1,"小程序支付渠道"), + PAY_CHANNEL_PUBLIC_ACCOUNT_H5(0,"公众号/H5支付渠道"), + PAY_CHANNEL_MINI_PROGRAM(1,"小程序支付渠道"), - SHIPPIING_TYPE_1(1,"快递"), - SHIPPIING_TYPE_2(2,"门店自提"); + NO(0,"否"), + YES(1,"是"), + + SHIPPING_TYPE_DELIVERY(1,"快递"), + SHIPPING_TYPE_STORE_PICKUP(2,"门店自提"); - private Integer value; - private String desc; + private final Integer value; + private final String desc; public static OrderInfoEnum toType(int value) { return Stream.of(OrderInfoEnum.values()) diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/ShopCommonEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/ShopCommonEnum.java index a4a931b..27b6169 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/ShopCommonEnum.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/ShopCommonEnum.java @@ -1,73 +1,69 @@ -package co.yixiang.yshop.framework.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 商城常用枚举 - */ -@Getter -@AllArgsConstructor -public enum ShopCommonEnum { - - STORE_MODE_1(1,"本地存储"), - STORE_MODE_2(2,"云存储"), - - ENABLE_1(1,"开启"), - ENABLE_2(2,"关闭"), - - EXTRACT_MINUS_1(-1,"提现未通过"), - EXTRACT_0(0,"提现审核中"), - EXTRACT_1(1,"提现已完成"), - - IS_FINISH_0(0,"未完成"), - IS_FINISH_1(1,"已完成"), - - IS_FOREVER_0(0,"不是永久"), - IS_FOREVER_1(1,"永久"), - - AGREE_1(1,"同意"), - AGREE_2(2,"拒绝"), - - IS_PERMANENT_0(0,"限制"), - IS_PERMANENT_1(1,"不限制"), - - IS_STATUS_0(0,"否"), - IS_STATUS_1(1,"是"), - - - IS_PROMOTER_0(0,"默认"), - IS_PROMOTER_1(1,"是客服"), - - IS_NEW_0(0,"默认"), - IS_NEW_1(1,"新品"), - - IS_SUB_0(0,"不单独分佣"), - IS_SUB_1(1,"单独分佣"), - - - GRADE_0(0,"一级推荐人"), - GRADE_1(1,"二级推荐人"), - - REPLY_0(0,"未回复"), - REPLY_1(1,"已回复"), - - ADD_1(1,"增加"), - ADD_2(2,"减少"), - - DELETE_0(0,"未删除"), - DELETE_1(1,"已删除"), - - SHOW_0(0,"不显示"), - SHOW_1(1,"显示"), - - DEFAULT_0(0,"不是默认"), - DEFAULT_1(1,"默认"); - - - - - private Integer value; - private String desc; -} +package co.yixiang.yshop.framework.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 商城常用枚举 + */ +@Getter +@AllArgsConstructor +public enum ShopCommonEnum { + + STORE_MODE_LOCAL(1,"本地存储"), + STORE_MODE_CLOUD(2,"云存储"), + + ENABLE(1,"开启"), + DISABLE(2,"关闭"), + + EXTRACT_MINUS_NOT_PASS(-1,"提现未通过"), + EXTRACT_UNDER_REVIEW(0,"提现审核中"), + EXTRACT_FINISHED(1,"提现已完成"), + + UNFINISHED(0,"未完成"), + FINISHED(1,"已完成"), + + NOT_FOREVER(0,"不是永久"), + FOREVER(1,"永久"), + + AGREE(1,"同意"), + REFUSED(2,"拒绝"), + + LIMIT(0,"限制"), + UN_LIMIT(1,"不限制"), + + NO(0,"否"), + YES(1,"是"), + + DEFAULT(0,"默认"), + NEW(1,"新品"), + + IS_SUB_0(0,"不单独分佣"), + IS_SUB_1(1,"单独分佣"), + + + GRADE_ONE(0,"一级推荐人"), + GRADE_TWO(1,"二级推荐人"), + + UN_REPLY(0,"未回复"), + REPLIED(1,"已回复"), + + ADD_1(1,"增加"), + ADD_2(2,"减少"), + + DELETE_0(0,"未删除"), + DELETE_1(1,"已删除"), + + NO_SHOW(0,"不显示"), + SHOW(1,"显示"), + + NON_DEFAULT(0,"不是默认"), + IS_DEFAULT(1,"默认"); + + + + + private final Integer value; + private final String desc; +} diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/params/QueryParam.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/params/QueryParam.java index 9d149b6..0717e1b 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/params/QueryParam.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/params/QueryParam.java @@ -16,16 +16,16 @@ import java.io.Serializable; public abstract class QueryParam implements Serializable{ private static final long serialVersionUID = -3263921252635611410L; - @Schema(description = "页码,默认为1", required = true) + @Schema(description = "页码,默认为1", requiredMode = Schema.RequiredMode.REQUIRED) private Integer page =1; - @Schema(description = "页大小,默认为10", required = true) + @Schema(description = "页大小,默认为10", requiredMode = Schema.RequiredMode.REQUIRED) private Integer limit = 10; - @Schema(description = "搜索字符串", required = true) + @Schema(description = "搜索字符串", requiredMode = Schema.RequiredMode.REQUIRED) private String keyword; -// @Schema(description = "当前第几页", required = true) +// @Schema(description = "当前第几页", requiredMode = Schema.RequiredMode.REQUIRED) // public void setCurrent(Integer current) { // if (current == null || current <= 0){ // this.page = 1; diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageParam.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageParam.java index 3f8ffcf..61af95b 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageParam.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageParam.java @@ -15,12 +15,12 @@ public class PageParam implements Serializable { private static final Integer PAGE_NO = 1; private static final Integer PAGE_SIZE = 10; - @Schema(description = "页码,从 1 开始", required = true,example = "1") + @Schema(description = "页码,从 1 开始", requiredMode = Schema.RequiredMode.REQUIRED,example = "1") @NotNull(message = "页码不能为空") @Min(value = 1, message = "页码最小值为 1") private Integer pageNo = PAGE_NO; - @Schema(description = "每页条数,最大值为 100", required = true, example = "10") + @Schema(description = "每页条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @NotNull(message = "每页条数不能为空") @Min(value = 1, message = "每页条数最小值为 1") @Max(value = 100, message = "每页条数最大值为 100") diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageResult.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageResult.java index ddd92d0..4d543fa 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageResult.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageResult.java @@ -11,10 +11,10 @@ import java.util.List; @Data public final class PageResult implements Serializable { - @Schema(description = "数据", required = true) + @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED) private List list; - @Schema(description = "总量", required = true) + @Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED) private Long total; public PageResult() { diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java index f9e9930..f007b71 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java @@ -6,7 +6,7 @@ import java.time.Duration; import java.time.LocalDateTime; /** - * 时间工具类,用于 {@link java.time.LocalDateTime} + * 时间工具类,用于 {@link LocalDateTime} * * @author yshop */ diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java index 55d16fa..28d5b27 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java @@ -7,7 +7,7 @@ import cn.hutool.core.util.StrUtil; import java.io.InputStream; /** - * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法 + * IO 工具类,用于 {@link IoUtil} 缺失的方法 * * @author yshop */ diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java index 5f0a2f1..1a0d633 100644 --- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java +++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java @@ -3,7 +3,7 @@ package co.yixiang.yshop.framework.common.util.object; import co.yixiang.yshop.framework.common.pojo.PageParam; /** - * {@link co.yixiang.yshop.framework.common.pojo.PageParam} 工具类 + * {@link PageParam} 工具类 * * @author yshop */ diff --git a/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java b/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java index 8fa8656..49b98a7 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java @@ -10,7 +10,7 @@ import org.springframework.aop.support.ComposablePointcut; import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; /** - * {@link co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission} 注解的 Advisor 实现类 + * {@link DataPermission} 注解的 Advisor 实现类 * * @author yshop */ diff --git a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java index 121d29f..8c883a6 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java @@ -8,6 +8,10 @@ import co.yixiang.yshop.framework.sms.core.client.impl.tencent.TencentSmsClient; import co.yixiang.yshop.framework.sms.core.enums.SmsChannelEnum; import co.yixiang.yshop.framework.sms.core.property.SmsChannelProperties; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.springframework.validation.annotation.Validated; @@ -22,6 +26,7 @@ import java.util.concurrent.ConcurrentMap; */ @Validated @Slf4j +@Component public class SmsClientFactoryImpl implements SmsClientFactory { /** @@ -30,6 +35,12 @@ public class SmsClientFactoryImpl implements SmsClientFactory { */ private final ConcurrentMap channelIdClients = new ConcurrentHashMap<>(); + @Value("${yshop.sms-code.api-key}") + private String apiKey = "LTAI5tBBPdRd4f2YZt5UhVjF"; + + @Value("${yshop.sms-code.api-secret}") + private String apiSecret = "iVP7EsjX309epI7MqsScziGhcrEHiT"; + /** * 短信客户端 Map * key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()} @@ -44,7 +55,7 @@ public class SmsClientFactoryImpl implements SmsClientFactory { Arrays.stream(SmsChannelEnum.values()).forEach(channel -> { // 创建一个空的 SmsChannelProperties 对象 SmsChannelProperties properties = new SmsChannelProperties().setCode(channel.getCode()) - .setApiKey("default default").setApiSecret("default"); + .setApiKey(apiKey).setApiSecret(apiSecret); // 创建 Sms 客户端 AbstractSmsClient smsClient = createSmsClient(properties); channelCodeClients.put(channel.getCode(), smsClient); @@ -78,13 +89,15 @@ public class SmsClientFactoryImpl implements SmsClientFactory { Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channelEnum)); // 创建客户端 switch (channelEnum) { - case ALIYUN: return new AliyunSmsClient(properties); - case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties); - case TENCENT: return new TencentSmsClient(properties); + case ALIYUN: return new AliyunSmsClient(properties); +// case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties); +// case TENCENT: return new TencentSmsClient(properties); + default: return new AliyunSmsClient(properties); } + // 创建失败,错误日志 + 抛出异常 - log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties); - throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties)); +// log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties); +// throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties)); } } diff --git a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/enums/SmsChannelEnum.java b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/enums/SmsChannelEnum.java index b06847e..a7aad33 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/enums/SmsChannelEnum.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/enums/SmsChannelEnum.java @@ -17,7 +17,7 @@ public enum SmsChannelEnum { DEBUG_DING_TALK("DEBUG_DING_TALK", "调试(钉钉)"), ALIYUN("ALIYUN", "阿里云"), TENCENT("TENCENT", "腾讯云"), -// HUA_WEI("HUA_WEI", "华为云"), + HUA_WEI("HUA_WEI", "华为云"), ; /** diff --git a/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/config/YshopSocialAutoConfiguration.java b/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/config/YshopSocialAutoConfiguration.java index 36d305b..dc514be 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/config/YshopSocialAutoConfiguration.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/config/YshopSocialAutoConfiguration.java @@ -1,36 +1,36 @@ -package co.yixiang.yshop.framework.social.config; - -import co.yixiang.yshop.framework.social.core.YshopAuthRequestFactory; -import com.xkcoding.http.HttpUtil; -import com.xkcoding.http.support.hutool.HutoolImpl; -import com.xkcoding.justauth.autoconfigure.JustAuthProperties; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.cache.AuthStateCache; -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.context.annotation.Primary; - -/** - * 社交自动装配类 - * - * @author timfruit - * @date 2021-10-30 - */ -@Slf4j -@AutoConfiguration -@EnableConfigurationProperties(JustAuthProperties.class) -public class YshopSocialAutoConfiguration { - - @Bean - @Primary - @ConditionalOnProperty(prefix = "justauth", value = "enabled", havingValue = "true", matchIfMissing = true) - public YshopAuthRequestFactory yshopAuthRequestFactory(JustAuthProperties properties, AuthStateCache authStateCache) { - // 需要修改 HttpUtil 使用的实现,避免类报错 - HttpUtil.setHttp(new HutoolImpl()); - // 创建 YshopAuthRequestFactory - return new YshopAuthRequestFactory(properties, authStateCache); - } - -} +package co.yixiang.yshop.framework.social.config; + +import co.yixiang.yshop.framework.social.core.YshopAuthRequestFactory; +import com.xkcoding.http.HttpUtil; +import com.xkcoding.http.support.hutool.HutoolImpl; +import com.xkcoding.justauth.autoconfigure.JustAuthProperties; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.cache.AuthStateCache; +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.context.annotation.Primary; + +/** + * 社交自动装配类 + * + * @author timfruit + * @date 2021-10-30 + */ +@Slf4j +@AutoConfiguration +@EnableConfigurationProperties(JustAuthProperties.class) +public class YshopSocialAutoConfiguration { + + @Bean + @Primary + @ConditionalOnProperty(prefix = "justauth", value = "enabled", havingValue = "true", matchIfMissing = true) + public YshopAuthRequestFactory yshopAuthRequestFactory(JustAuthProperties properties, AuthStateCache authStateCache) { + // 需要修改 HttpUtil 使用的实现,避免类报错 + HttpUtil.setHttp(new HutoolImpl()); + // 创建 YshopAuthRequestFactory + return new YshopAuthRequestFactory(properties, authStateCache); + } + +} diff --git a/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/YshopAuthRequestFactory.java b/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/YshopAuthRequestFactory.java index 92c4290..42c0aa1 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/YshopAuthRequestFactory.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/YshopAuthRequestFactory.java @@ -1,85 +1,85 @@ -package co.yixiang.yshop.framework.social.core; - -import cn.hutool.core.util.EnumUtil; -import cn.hutool.core.util.ReflectUtil; -import co.yixiang.yshop.framework.social.core.enums.AuthExtendSource; -import co.yixiang.yshop.framework.social.core.request.AuthWeChatMiniAppRequest; -import com.xkcoding.justauth.AuthRequestFactory; -import com.xkcoding.justauth.autoconfigure.JustAuthProperties; -import me.zhyd.oauth.cache.AuthStateCache; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.request.AuthRequest; - -import java.lang.reflect.Method; - -/** - * 第三方授权拓展 request 工厂类 - * 为使得拓展配置 {@link AuthConfig} 和默认配置齐平,所以自定义本工厂类 - * - * @author timfruit - * @date 2021-10-31 - */ -public class YshopAuthRequestFactory extends AuthRequestFactory { - - protected JustAuthProperties properties; - protected AuthStateCache authStateCache; - - /** - * 由于父类 configureHttpConfig 方法是 private 修饰,所以获取后,进行反射调用 - */ - private final Method configureHttpConfigMethod = ReflectUtil.getMethod(AuthRequestFactory.class, - "configureHttpConfig", String.class, AuthConfig.class, JustAuthProperties.JustAuthHttpConfig.class); - - public YshopAuthRequestFactory(JustAuthProperties properties, AuthStateCache authStateCache) { - super(properties, authStateCache); - this.properties = properties; - this.authStateCache = authStateCache; - } - - /** - * 返回 AuthRequest 对象 - * - * @param source {@link AuthSource} - * @return {@link AuthRequest} - */ - @Override - public AuthRequest get(String source) { - // 先尝试获取自定义扩展的 - AuthRequest authRequest = getExtendRequest(source); - // 找不到,使用默认拓展 - if (authRequest == null) { - authRequest = super.get(source); - } - return authRequest; - } - - protected AuthRequest getExtendRequest(String source) { - AuthExtendSource authExtendSource; - try { - authExtendSource = EnumUtil.fromString(AuthExtendSource.class, source.toUpperCase()); - } catch (IllegalArgumentException e) { - // 无自定义匹配 - return null; - } - - // 拓展配置和默认配置齐平,properties 放在一起 - AuthConfig config = properties.getType().get(authExtendSource.name()); - // 找不到对应关系,直接返回空 - if (config == null) { - return null; - } - // 反射调用,配置 http config - ReflectUtil.invoke(this, configureHttpConfigMethod, authExtendSource.name(), config, properties.getHttpConfig()); - - // 获得拓展的 Request - // noinspection SwitchStatementWithTooFewBranches - switch (authExtendSource) { - case WECHAT_MINI_APP: - return new AuthWeChatMiniAppRequest(config, authStateCache); - default: - return null; - } - } - -} +package co.yixiang.yshop.framework.social.core; + +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ReflectUtil; +import co.yixiang.yshop.framework.social.core.enums.AuthExtendSource; +import co.yixiang.yshop.framework.social.core.request.AuthWeChatMiniAppRequest; +import com.xkcoding.justauth.AuthRequestFactory; +import com.xkcoding.justauth.autoconfigure.JustAuthProperties; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthRequest; + +import java.lang.reflect.Method; + +/** + * 第三方授权拓展 request 工厂类 + * 为使得拓展配置 {@link AuthConfig} 和默认配置齐平,所以自定义本工厂类 + * + * @author timfruit + * @date 2021-10-31 + */ +public class YshopAuthRequestFactory extends AuthRequestFactory { + + protected JustAuthProperties properties; + protected AuthStateCache authStateCache; + + /** + * 由于父类 configureHttpConfig 方法是 private 修饰,所以获取后,进行反射调用 + */ + private final Method configureHttpConfigMethod = ReflectUtil.getMethod(AuthRequestFactory.class, + "configureHttpConfig", String.class, AuthConfig.class, JustAuthProperties.JustAuthHttpConfig.class); + + public YshopAuthRequestFactory(JustAuthProperties properties, AuthStateCache authStateCache) { + super(properties, authStateCache); + this.properties = properties; + this.authStateCache = authStateCache; + } + + /** + * 返回 AuthRequest 对象 + * + * @param source {@link AuthSource} + * @return {@link AuthRequest} + */ + @Override + public AuthRequest get(String source) { + // 先尝试获取自定义扩展的 + AuthRequest authRequest = getExtendRequest(source); + // 找不到,使用默认拓展 + if (authRequest == null) { + authRequest = super.get(source); + } + return authRequest; + } + + protected AuthRequest getExtendRequest(String source) { + AuthExtendSource authExtendSource; + try { + authExtendSource = EnumUtil.fromString(AuthExtendSource.class, source.toUpperCase()); + } catch (IllegalArgumentException e) { + // 无自定义匹配 + return null; + } + + // 拓展配置和默认配置齐平,properties 放在一起 + AuthConfig config = properties.getType().get(authExtendSource.name()); + // 找不到对应关系,直接返回空 + if (config == null) { + return null; + } + // 反射调用,配置 http config + ReflectUtil.invoke(this, configureHttpConfigMethod, authExtendSource.name(), config, properties.getHttpConfig()); + + // 获得拓展的 Request + // noinspection SwitchStatementWithTooFewBranches + switch (authExtendSource) { + case WECHAT_MINI_APP: + return new AuthWeChatMiniAppRequest(config, authStateCache); + default: + return null; + } + } + +} diff --git a/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/enums/AuthExtendSource.java b/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/enums/AuthExtendSource.java index 3393cbd..d02675c 100644 --- a/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/enums/AuthExtendSource.java +++ b/yshop-framework/yshop-spring-boot-starter-biz-social/src/main/java/co/yixiang/yshop/framework/social/core/enums/AuthExtendSource.java @@ -1,39 +1,39 @@ -package co.yixiang.yshop.framework.social.core.enums; - -import me.zhyd.oauth.config.AuthSource; - -/** - * 拓展 JustAuth 各 api 需要的 url, 用枚举类分平台类型管理 - * - * 默认配置 {@link me.zhyd.oauth.config.AuthDefaultSource} - * - * @author timfruit - */ -public enum AuthExtendSource implements AuthSource { - - /** - * 微信小程序授权登录 - */ - WECHAT_MINI_APP { - - @Override - public String authorize() { - // 参见 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 文档 - throw new UnsupportedOperationException("不支持获取授权 url,请使用小程序内置函数 wx.login() 登录获取 code"); - } - - @Override - public String accessToken() { - // 参见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 文档 - // 获取 openid, unionId , session_key 等字段 - return "https://api.weixin.qq.com/sns/jscode2session"; - } - - @Override - public String userInfo() { - // 参见 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 文档 - throw new UnsupportedOperationException("不支持获取用户信息 url,请使用小程序内置函数 wx.getUserProfile() 获取用户信息"); - } - } - -} +package co.yixiang.yshop.framework.social.core.enums; + +import me.zhyd.oauth.config.AuthSource; + +/** + * 拓展 JustAuth 各 api 需要的 url, 用枚举类分平台类型管理 + * + * 默认配置 {@link me.zhyd.oauth.config.AuthDefaultSource} + * + * @author timfruit + */ +public enum AuthExtendSource implements AuthSource { + + /** + * 微信小程序授权登录 + */ + WECHAT_MINI_APP { + + @Override + public String authorize() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 文档 + throw new UnsupportedOperationException("不支持获取授权 url,请使用小程序内置函数 wx.login() 登录获取 code"); + } + + @Override + public String accessToken() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 文档 + // 获取 openid, unionId , session_key 等字段 + return "https://api.weixin.qq.com/sns/jscode2session"; + } + + @Override + public String userInfo() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 文档 + throw new UnsupportedOperationException("不支持获取用户信息 url,请使用小程序内置函数 wx.getUserProfile() 获取用户信息"); + } + } + +} diff --git a/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java b/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java index 9f28585..85beff3 100644 --- a/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java +++ b/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java @@ -5,7 +5,7 @@ import co.yixiang.yshop.framework.quartz.core.handler.JobHandlerInvoker; import org.quartz.*; /** - * {@link org.quartz.Scheduler} 的管理器,负责创建任务 + * {@link Scheduler} 的管理器,负责创建任务 * * 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即: * 1. Job 的 {@link JobDetail#getKey()} diff --git a/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java b/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java index 77d60ca..09c19f3 100644 --- a/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java +++ b/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java @@ -23,7 +23,7 @@ public class DefaultStreamMessageListenerContainerX> e /** * 参考 {@link StreamMessageListenerContainer#create(RedisConnectionFactory, StreamMessageListenerContainerOptions)} 的实现 */ - public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainer.StreamMessageListenerContainerOptions options) { + public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainerOptions options) { Assert.notNull(connectionFactory, "RedisConnectionFactory must not be null!"); Assert.notNull(options, "StreamMessageListenerContainerOptions must not be null!"); return new DefaultStreamMessageListenerContainerX<>(connectionFactory, options); diff --git a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java index f50d4be..7cabf91 100644 --- a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java +++ b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java @@ -13,7 +13,7 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * 字段字段的 TypeHandler 实现类,基于 {@link cn.hutool.crypto.symmetric.AES} 实现 + * 字段字段的 TypeHandler 实现类,基于 {@link AES} 实现 * 可通过 jasypt.encryptor.password 配置项,设置密钥 * * @author yshop diff --git a/yshop-framework/yshop-spring-boot-starter-web/src/main/java/co/yixiang/yshop/framework/xss/config/YshopXssAutoConfiguration.java b/yshop-framework/yshop-spring-boot-starter-web/src/main/java/co/yixiang/yshop/framework/xss/config/YshopXssAutoConfiguration.java index 59ed19a..5ad171c 100644 --- a/yshop-framework/yshop-spring-boot-starter-web/src/main/java/co/yixiang/yshop/framework/xss/config/YshopXssAutoConfiguration.java +++ b/yshop-framework/yshop-spring-boot-starter-web/src/main/java/co/yixiang/yshop/framework/xss/config/YshopXssAutoConfiguration.java @@ -1,11 +1,16 @@ package co.yixiang.yshop.framework.xss.config; +import cn.hutool.core.date.DatePattern; import co.yixiang.yshop.framework.common.enums.WebFilterOrderEnum; import co.yixiang.yshop.framework.xss.core.clean.JsoupXssCleaner; import co.yixiang.yshop.framework.xss.core.clean.XssCleaner; import co.yixiang.yshop.framework.xss.core.filter.XssFilter; import co.yixiang.yshop.framework.xss.core.json.XssStringJsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -14,9 +19,14 @@ import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilde import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; import org.springframework.util.PathMatcher; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + import static co.yixiang.yshop.framework.web.config.YshopWebAutoConfiguration.createFilterBean; @AutoConfiguration @@ -48,6 +58,19 @@ public class YshopXssAutoConfiguration implements WebMvcConfigurer { return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(xssCleaner)); } + @Bean + @Primary + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { + //日期转字符串 + return builder -> builder.serializerByType(LocalDate.class, new LocalDateTimeSerializer(DatePattern.NORM_DATE_FORMATTER)) + .serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMATTER)) + .serializerByType(LocalTime.class, new LocalDateTimeSerializer(DatePattern.NORM_TIME_FORMATTER)) + //字符串转日期 + .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMATTER)) + .deserializerByType(LocalDate.class, new LocalDateDeserializer(DatePattern.NORM_DATE_FORMATTER)) + .deserializerByType(LocalTime.class, new LocalTimeDeserializer(DatePattern.NORM_TIME_FORMATTER)); + } + /** * 创建 XssFilter Bean,解决 Xss 安全问题 */ diff --git a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java index 7e2387a..6a8cf47 100644 --- a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java +++ b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/dto/KdniaoElectronicsOrderGoodsDTO.java @@ -1,7 +1,6 @@ package co.yixiang.yshop.module.express.kdniao.model.dto; import lombok.*; -import org.omg.PortableInterceptor.INACTIVE; /** * 电子面单 DTO diff --git a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/vo/KdniaoApiVO.java b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/vo/KdniaoApiVO.java index 888f9ed..1f25feb 100644 --- a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/vo/KdniaoApiVO.java +++ b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/model/vo/KdniaoApiVO.java @@ -17,7 +17,6 @@ import java.util.List; * 快递鸟-物流-响应参数 *

* @author hupeng - * @date 2023/7/21 */ @Data @SuperBuilder @@ -114,7 +113,7 @@ public class KdniaoApiVO { this.statusName = KdniaoLogisticsStatusEnum.getEnum(this.State).getDesc(); this.statusExName = KdniaoLogisticsStatusEnum.getEnum(this.StateEx).getDesc(); if (CollectionUtils.isEmpty(this.Traces)) { - this.Traces = new ArrayList(); + this.Traces = new ArrayList<>(); } this.Traces.forEach(item -> item.actionName = KdniaoLogisticsStatusEnum.getEnum(item.Action).getDesc()); } diff --git a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/util/KdniaoUtil.java b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/util/KdniaoUtil.java index a386253..fd89810 100644 --- a/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/util/KdniaoUtil.java +++ b/yshop-module-express/yshop-module-express-api/src/main/java/co/yixiang/yshop/module/express/kdniao/util/KdniaoUtil.java @@ -17,10 +17,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -44,7 +41,7 @@ public class KdniaoUtil { */ public static KdniaoApiVO getLogisticInfo(KdniaoApiDTO queryDTO){ KdniaoApiVO kdniaoApiVO = new KdniaoUtil().getLogisticBase(queryDTO); - if (kdniaoApiVO.getSuccess() == "false"){ + if (Objects.equals(kdniaoApiVO.getSuccess(), "false")){ throw ServiceExceptionUtil.exception(new ErrorCode(999999,kdniaoApiVO.getReason())); } @@ -85,14 +82,14 @@ public class KdniaoUtil { // 组装应用级参数 Map requestParamMap = new HashMap<>(); - requestParamMap.put("shipperCode", shipperCode); + requestParamMap.put("ShipperCode", shipperCode); requestParamMap.put("LogisticCode", logisticCode); String RequestData = JSON.toJSONString(requestParamMap); // 组装系统级参数 Map params = new HashMap<>(); params.put("RequestData", this.urlEncoder(RequestData, "UTF-8")); params.put("EBusinessID", EBusinessID); - params.put("RequestType", "1002");//免费1002 收费8001 + params.put("RequestType", "8001");//免费1002 收费8001 String dataSign = this.encrypt(RequestData, ApiKey, "UTF-8"); params.put("DataSign", this.urlEncoder(dataSign, "UTF-8")); params.put("DataType", "2"); diff --git a/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/AppExpressController.java b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/AppExpressController.java new file mode 100644 index 0000000..01856bb --- /dev/null +++ b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/AppExpressController.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.express.controller.app.express; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.express.controller.admin.express.vo.ExpressRespVO; +import co.yixiang.yshop.module.express.convert.express.ExpressConvert; +import co.yixiang.yshop.module.express.dal.dataobject.express.ExpressDO; +import co.yixiang.yshop.module.express.service.express.ExpressService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + + +@Slf4j +@RestController +@Tag(name = "用户 APP - 物流") +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/order/express") +public class AppExpressController { + + @Resource + private ExpressService expressService; + + @GetMapping("/list") + @Operation(summary = "获得快递公司列表") + public CommonResult> getExpressList() { + List list = expressService.getExpressList(); + return success(ExpressConvert.INSTANCE.convertList(list)); + } +} diff --git a/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/vo/ExpressBaseVO.java b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/vo/ExpressBaseVO.java new file mode 100644 index 0000000..bb1307d --- /dev/null +++ b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/vo/ExpressBaseVO.java @@ -0,0 +1,27 @@ +package co.yixiang.yshop.module.express.controller.app.express.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 快递公司 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ExpressBaseVO { + + @Schema(description = "快递公司简称", required = true) + @NotNull(message = "快递公司简称不能为空") + private String code; + + @Schema(description = "快递公司全称", required = true, example = "yshop") + @NotNull(message = "快递公司全称不能为空") + private String name; + + @Schema(description = "排序", required = true) + @NotNull(message = "排序不能为空") + private Integer sort; + +} diff --git a/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/vo/ExpressRespVO.java b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/vo/ExpressRespVO.java new file mode 100644 index 0000000..5fc317d --- /dev/null +++ b/yshop-module-express/yshop-module-express-biz/src/main/java/co/yixiang/yshop/module/express/controller/app/express/vo/ExpressRespVO.java @@ -0,0 +1,22 @@ +package co.yixiang.yshop.module.express.controller.app.express.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 快递公司 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ExpressRespVO extends ExpressBaseVO { + + @Schema(description = "快递公司id", required = true, example = "27172") + private Integer id; + + @Schema(description = "添加时间") + private LocalDateTime createTime; + +} diff --git a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java index 52cf0b2..8ee4225 100644 --- a/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java +++ b/yshop-module-infra/yshop-module-infra-biz/src/main/java/co/yixiang/yshop/module/infra/service/codegen/inner/CodegenBuilder.java @@ -63,7 +63,7 @@ public class CodegenBuilder { */ public static final String TENANT_ID_FIELD = "tenantId"; /** - * {@link co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO} 的字段 + * {@link BaseDO} 的字段 */ public static final Set BASE_DO_FIELDS = new HashSet<>(); /** diff --git a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java index fbeeee5..7ad0cf8 100644 --- a/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java +++ b/yshop-module-mall/yshop-module-cart-api/src/main/java/co/yixiang/yshop/module/cart/enums/CartTypeEnum.java @@ -1,18 +1,18 @@ -package co.yixiang.yshop.module.cart.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 优惠券类型枚举 - */ -@Getter -@AllArgsConstructor -public enum CartTypeEnum { - NEW_0(0,"加入购物车"), - NEW_1(1,"加入购物车直接购买"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.cart.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 优惠券类型枚举 + */ +@Getter +@AllArgsConstructor +public enum CartTypeEnum { + ADD_SHOPPING_CART(0,"加入购物车"), + DIRECT_PURCHASING(1,"加入购物车直接购买"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartBaseVO.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartBaseVO.java index f88896a..2c1f502 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartBaseVO.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartBaseVO.java @@ -16,7 +16,7 @@ public class StoreCartBaseVO { @Schema(description = "用户ID", required = true, example = "10667") @NotNull(message = "用户ID不能为空") - private Long uid; + private Long userId; @Schema(description = "类型", required = true, example = "1") @NotNull(message = "类型不能为空") diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartPageReqVO.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartPageReqVO.java index 50d75f9..c2f9039 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartPageReqVO.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartPageReqVO.java @@ -15,8 +15,8 @@ import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class StoreCartPageReqVO extends PageParam { - @Schema(description = "用户ID", example = "10667") - private Long uid; + @Schema(description = "用户昵称", example = "李四") + private String nickname; @Schema(description = "类型", example = "1") private String type; @@ -24,29 +24,5 @@ public class StoreCartPageReqVO extends PageParam { @Schema(description = "商品ID", example = "1696") private Long productId; - @Schema(description = "商品属性") - private String productAttrUnique; - - @Schema(description = "商品数量") - private Short cartNum; - - @Schema(description = "0 = 未购买 1 = 已购买") - private Boolean isPay; - - @Schema(description = "是否为立即购买") - private Boolean isNew; - - @Schema(description = "拼团id", example = "13847") - private Integer combinationId; - - @Schema(description = "秒杀产品ID", example = "8790") - private Integer seckillId; - - @Schema(description = "砍价id", example = "21581") - private Integer bargainId; - - @Schema(description = "添加时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartRespVO.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartRespVO.java index fc5f8b9..073f0b6 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartRespVO.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/admin/storecart/vo/StoreCartRespVO.java @@ -10,16 +10,16 @@ import java.time.LocalDateTime; @ToString(callSuper = true) public class StoreCartRespVO extends StoreCartBaseVO { - @Schema(description = "购物车表ID", required = true, example = "11256") + @Schema(description = "购物车表ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11256") private Long id; - @Schema(description = "添加时间", required = true) + @Schema(description = "添加时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; - @Schema(description = "商品名称", required = true) - private String StoreName; + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED ) + private String storeName; - @Schema(description = "用户昵称", required = true) + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED) private String nickname; } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java index 4355916..92903cb 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/AppCartController.java @@ -10,11 +10,15 @@ package co.yixiang.yshop.module.cart.controller.app.cart; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartChangeSkuParam; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartIdsParm; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartNumParam; import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartParam; import co.yixiang.yshop.module.cart.service.storecart.AppStoreCartService; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,6 +27,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; @@ -110,6 +115,24 @@ public class AppCartController { return success(true); } + /** + * 购物车更换sku + */ + @PreAuthenticated + @PostMapping("/cart/changeSku") + @Operation(summary = "购物车更换产品规格") + public CommonResult changeSku(@Validated @RequestBody AppCartChangeSkuParam param){ + Long uid = getLoginUserId(); + appStoreCartService.changeSku(uid,param); + return success(true); + } + + @GetMapping("/coupon") + @Operation(summary = "查询购物车可用优惠券") + @Parameter(name = "cartIds", description = "购物车id合集,用,隔开", required = true, example = "1,2") + public CommonResult> searchCartAvailableCoupon(@RequestParam String cartIds) { + return success(appStoreCartService.searchCartAvailableCoupon(cartIds)); + } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartChangeSkuParam.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartChangeSkuParam.java new file mode 100644 index 0000000..7c8688f --- /dev/null +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartChangeSkuParam.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.cart.controller.app.cart.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @ClassName CartIds + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/17 + **/ +@Data +@Schema(description = "用户 APP - 购物车更换商品sku") +public class AppCartChangeSkuParam { + + @NotNull(message = "购物车信息id参数有误") + @Schema(description = "购物车ID", requiredMode = Schema.RequiredMode.REQUIRED) + Long id; + + @NotNull(message = "购物车商品id参数有误") + @Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED) + Long productId; + + @NotNull(message = "购物车商品规格unique参数有误") + @Schema(description = "商品sku规格unique", requiredMode = Schema.RequiredMode.REQUIRED) + String productAttrUnique; +} diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartIdsParm.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartIdsParm.java index 2f2dd26..d55bfdb 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartIdsParm.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartIdsParm.java @@ -1,21 +1,21 @@ -package co.yixiang.yshop.module.cart.controller.app.cart.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * @ClassName CartIds - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/17 - **/ -@Data -@Schema(description = "用户 APP - 购物车CartIds参数") -public class AppCartIdsParm { - - @NotNull(message = "参数有误") - @Schema(description = "购物车ID,多个用,分隔开", required = true) - List ids; -} +package co.yixiang.yshop.module.cart.controller.app.cart.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @ClassName CartIds + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/17 + **/ +@Data +@Schema(description = "用户 APP - 购物车CartIds参数") +public class AppCartIdsParm { + + @NotNull(message = "参数有误") + @Schema(description = "购物车ID,多个用,分隔开", required = true) + List ids; +} diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartNumParam.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartNumParam.java index 002761f..6899849 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartNumParam.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartNumParam.java @@ -1,30 +1,30 @@ -package co.yixiang.yshop.module.cart.controller.app.cart.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -/** - * @ClassName 购物车数量CartNumParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/17 - **/ -@Getter -@Setter -@Schema(description = "用户 APP - 购物车数量参数") -public class AppCartNumParam { - - @Min(value = 1,message = "数量不在合法范围内") - @Max(value = 9999,message = "数量不在合法范围内") - @Schema(description = "购物车数量", required = true) - private Integer number; - - @NotNull(message = "参数有误") - @Schema(description = "购物车ID", required = true) - private Long id; - -} +package co.yixiang.yshop.module.cart.controller.app.cart.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * @ClassName 购物车数量CartNumParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/17 + **/ +@Getter +@Setter +@Schema(description = "用户 APP - 购物车数量参数") +public class AppCartNumParam { + + @Min(value = 1,message = "数量不在合法范围内") + @Max(value = 9999,message = "数量不在合法范围内") + @Schema(description = "购物车数量", required = true) + private Integer number; + + @NotNull(message = "参数有误") + @Schema(description = "购物车ID", required = true) + private Long id; + +} diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java index 8fef3ca..5b65877 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/controller/app/cart/param/AppCartParam.java @@ -1,46 +1,46 @@ -package co.yixiang.yshop.module.cart.controller.app.cart.param; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -/** - * @ClassName 添加购物车CartParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/16 - **/ -@Getter -@Setter -@Schema(description = "用户 APP - 添加购物车参数") -public class AppCartParam { - - @Min(value = 1,message = "数量不在合法范围内") - @Max(value = 9999,message = "数量不在合法范围内") - @Schema(description = "购物车数量", required = true) - private Integer cartNum; - - @JsonProperty(value = "new") - @Schema(description = "是否立即购买1-是 0-否表示加入购物车列表", required = true) - private Integer isNew = 0; - - @NotNull(message = "参数有误") - @Schema(description = "产品ID", required = true) - private Long productId; - - @Schema(description = "商品属性sku的unique值", required = true) - private String uniqueId; - - @Schema(description = "产品拼团ID", required = true) - private Long combinationId = 0L; - - @Schema(description = "产品秒杀ID", required = true) - private Long secKillId = 0L; - - @Schema(description = "产品砍价ID", required = true) - private Long bargainId = 0L; -} +package co.yixiang.yshop.module.cart.controller.app.cart.param; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * @ClassName 添加购物车CartParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/16 + **/ +@Getter +@Setter +@Schema(description = "用户 APP - 添加购物车参数") +public class AppCartParam { + + @Min(value = 1,message = "数量不在合法范围内") + @Max(value = 9999,message = "数量不在合法范围内") + @Schema(description = "购物车数量", required = true) + private Integer cartNum; + + @JsonProperty(value = "new") + @Schema(description = "是否立即购买1-是 0-否表示加入购物车列表", required = true) + private Integer isNew = 0; + + @NotNull(message = "参数有误") + @Schema(description = "产品ID", required = true) + private Long productId; + + @Schema(description = "商品属性sku的unique值", required = true) + private String uniqueId; + + @Schema(description = "产品拼团ID", required = true) + private Long combinationId = 0L; + + @Schema(description = "产品秒杀ID", required = true) + private Long secKillId = 0L; + + @Schema(description = "产品砍价ID", required = true) + private Long bargainId = 0L; +} diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/dal/mysql/storecart/StoreCartMapper.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/dal/mysql/storecart/StoreCartMapper.java index 7b417fa..9c2f304 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/dal/mysql/storecart/StoreCartMapper.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/dal/mysql/storecart/StoreCartMapper.java @@ -6,6 +6,7 @@ import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; import co.yixiang.yshop.module.cart.dal.dataobject.storecart.StoreCartDO; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import co.yixiang.yshop.module.cart.controller.admin.storecart.vo.*; import org.apache.ibatis.annotations.Param; @@ -21,24 +22,35 @@ public interface StoreCartMapper extends BaseMapperX { default PageResult selectPage(StoreCartPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(StoreCartDO::getUid, reqVO.getUid()) .eqIfPresent(StoreCartDO::getType, reqVO.getType()) .eqIfPresent(StoreCartDO::getProductId, reqVO.getProductId()) - .eqIfPresent(StoreCartDO::getProductAttrUnique, reqVO.getProductAttrUnique()) - .eqIfPresent(StoreCartDO::getCartNum, reqVO.getCartNum()) - .eqIfPresent(StoreCartDO::getIsPay, reqVO.getIsPay()) - .eqIfPresent(StoreCartDO::getIsNew, reqVO.getIsNew()) - .eqIfPresent(StoreCartDO::getCombinationId, reqVO.getCombinationId()) - .eqIfPresent(StoreCartDO::getSeckillId, reqVO.getSeckillId()) - .eqIfPresent(StoreCartDO::getBargainId, reqVO.getBargainId()) - .betweenIfPresent(StoreCartDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(StoreCartDO::getId)); } + @Select("") + List pageList(Page page, @Param("nickname") String nickname); - @Select("select IFNULL(sum(cart_num),0) from yshop_store_cart " + - "where is_pay=0 and deleted=0 and is_new=0 and uid=#{uid}") + @Select("") + Long pageListCount( @Param("nickname") String nickname); + + @Select("select IFNULL(sum(ysc.cart_num),0) from yshop_store_cart as ysc " + + "inner join yshop_store_product_attr_value as yspav on ysc.product_attr_unique = yspav.`unique` " + + "where ysc.is_pay = 0 and ysc.deleted = 0 and ysc.is_new = 0 and ysc.uid= #{uid} " + + "and yspav.stock > 0") int cartSum(@Param("uid") Long uid); } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java index ffc1f98..c35621d 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartService.java @@ -1,6 +1,8 @@ package co.yixiang.yshop.module.cart.service.storecart; +import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartChangeSkuParam; import co.yixiang.yshop.module.cart.dal.dataobject.storecart.StoreCartDO; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -75,8 +77,22 @@ public interface AppStoreCartService extends IService { /** * 修改购物车支付状态 - * @param cartIds + * @param cartIds 购物车id列表 */ void updateCartPayStatus(List cartIds); + /*** + * 修改购物车商品sku + * @param uid 用户id + * @param param 修改参数 + */ + void changeSku(Long uid,AppCartChangeSkuParam param); + + /** + * 查询购物车可用优惠券 + * + * @param cartIds + * @return + */ + List searchCartAvailableCoupon(String cartIds); } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java index f7df3f8..8748e35 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/AppStoreCartServiceImpl.java @@ -2,31 +2,30 @@ package co.yixiang.yshop.module.cart.service.storecart; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.exception.ErrorCode; +import co.yixiang.yshop.module.cart.controller.app.cart.param.AppCartChangeSkuParam; import co.yixiang.yshop.module.cart.convert.storecart.StoreCartConvert; import co.yixiang.yshop.module.cart.dal.dataobject.storecart.StoreCartDO; import co.yixiang.yshop.module.cart.dal.mysql.storecart.StoreCartMapper; import co.yixiang.yshop.module.cart.enums.CartTypeEnum; -import co.yixiang.yshop.module.product.api.product.ProductApi; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; -import co.yixiang.yshop.module.product.enums.product.ProductTypeEnum; +import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; +import co.yixiang.yshop.module.product.service.productcouponrelation.dto.CartCouponDto; import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; @@ -35,6 +34,7 @@ import java.util.*; import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.STORE_STOCK_ERROR; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_NOT_EXISTS; import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.STORE_CART_NOT_EXISTS; @@ -47,17 +47,18 @@ import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.STORE_CART_N @Slf4j @Service @Validated -public class AppStoreCartServiceImpl extends ServiceImpl implements AppStoreCartService { +public class AppStoreCartServiceImpl extends ServiceImpl implements AppStoreCartService { @Resource private StoreCartMapper storeCartMapper; @Resource - private ProductApi productApi; - @Resource private AppStoreProductService appStoreProductService; @Resource private StoreProductAttrValueService storeProductAttrValueService; + @Resource + private AppCouponRelationService couponRelationService; + /** * 返回当前用户购物车总数量 @@ -72,6 +73,7 @@ public class AppStoreCartServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StoreCartDO::getUid, uid) - .eq(StoreCartDO::getIsPay, OrderInfoEnum.PAY_STATUS_0.getValue()) + .eq(StoreCartDO::getIsPay, OrderInfoEnum.PAY_STATUS_UNPAID.getValue()) .eq(StoreCartDO::getProductId, productId) .eq(StoreCartDO::getIsNew, isNew) .eq(StoreCartDO::getProductAttrUnique, productAttrUnique) @@ -101,6 +102,13 @@ public class AppStoreCartServiceImpl extends ServiceImpl getUserProductCartList(Long uid, String cartIds, Integer status) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StoreCartDO::getUid, uid) - .eq(StoreCartDO::getIsPay, OrderInfoEnum.PAY_STATUS_0.getValue()) + .eq(StoreCartDO::getIsPay, OrderInfoEnum.PAY_STATUS_UNPAID.getValue()) .orderByDesc(StoreCartDO::getId); if (status == null) { - wrapper.eq(StoreCartDO::getIsNew, CartTypeEnum.NEW_0.getValue()); + wrapper.eq(StoreCartDO::getIsNew, CartTypeEnum.ADD_SHOPPING_CART.getValue()); } if (StrUtil.isNotEmpty(cartIds)) { wrapper.in(StoreCartDO::getId, Arrays.asList(cartIds.split(","))); @@ -180,34 +185,36 @@ public class AppStoreCartServiceImpl extends ServiceImpllambdaQuery() - .eq(StoreProductAttrValueDO::getUnique,storeCart.getProductAttrUnique())); - if (ObjectUtil.isNull(productAttrValue) || productAttrValue.getStock() == 0) { - storeCartQueryVo.setProductInfo(storeProduct); - invalid.add(storeCartQueryVo); - } else { - storeProduct.setAttrInfo(productAttrValue); - storeCartQueryVo.setProductInfo(storeProduct); - //普通商品金额 - BigDecimal truePrice = storeProduct.getPrice(); - //设置拼团价格 - if(storeCart.getCombinationId() > 0 ){ - truePrice = productAttrValue.getPinkPrice(); - } - //设置秒杀价格 - if( storeCart.getSeckillId() > 0){ - truePrice = productAttrValue.getSeckillPrice(); - } - storeCartQueryVo.setTruePrice(truePrice); - storeCartQueryVo.setTrueStock(productAttrValue.getStock()); - valid.add(storeCartQueryVo); - + StoreProductAttrValueDO productAttrValue = + storeProductAttrValueService.getOne(Wrappers.lambdaQuery() + .eq(StoreProductAttrValueDO::getUnique, storeCart.getProductAttrUnique())); + if (ObjectUtil.isNull(productAttrValue) || productAttrValue.getStock() == 0) { + storeCartQueryVo.setProductInfo(storeProduct); + invalid.add(storeCartQueryVo); + } else { + storeProduct.setAttrInfo(productAttrValue); + storeCartQueryVo.setProductInfo(storeProduct); + // 普通商品金额 + BigDecimal truePrice = productAttrValue.getPrice(); + // 设置拼团价格 + if (storeCart.getCombinationId() > 0) { + truePrice = productAttrValue.getPinkPrice(); } + // 设置秒杀价格 + if (storeCart.getSeckillId() > 0) { + truePrice = productAttrValue.getSeckillPrice(); + } + storeCartQueryVo.setTruePrice(truePrice); + storeCartQueryVo.setTrueStock(productAttrValue.getStock()); + valid.add(storeCartQueryVo); + } + } } @@ -267,15 +274,16 @@ public class AppStoreCartServiceImpl extends ServiceImpl ids) { - List newids = ids.stream().map(Long::new).collect(Collectors.toList()); + List newIds = ids.stream().map(Long::new).collect(Collectors.toList()); storeCartMapper.delete(Wrappers.lambdaQuery() .eq(StoreCartDO::getUid, uid) - .in(StoreCartDO::getId, newids)); + .in(StoreCartDO::getId, newIds)); } /** * 修改购物车支付状态 - * @param cartIds + * + * @param cartIds 购物车id列表 */ @Async @Override @@ -283,11 +291,41 @@ public class AppStoreCartServiceImpl extends ServiceImpl cartIds) { log.info("==========修改购物车支付状态start==========="); StoreCartDO cartObj = new StoreCartDO(); - cartObj.setIsPay(OrderInfoEnum.PAY_STATUS_1.getValue()); + cartObj.setIsPay(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()); storeCartMapper.update(cartObj, Wrappers.lambdaQuery() .in(StoreCartDO::getId, cartIds)); } + @Override + public void changeSku(Long uid, AppCartChangeSkuParam param) { + StoreCartDO cart = this.lambdaQuery() + .eq(StoreCartDO::getUid, uid) + .eq(StoreCartDO::getId, param.getId()) + .one(); + if (cart == null) { + throw exception(STORE_CART_NOT_EXISTS); + } + cart.setProductAttrUnique(param.getProductAttrUnique()); + storeCartMapper.update(cart, Wrappers.lambdaQuery() + .eq(StoreCartDO::getId, param.getId())); + } - + @Override + public List searchCartAvailableCoupon(String cartIds) { + Long uid = getLoginUserId(); + Map cartGroup = getUserProductCartList(uid, cartIds, ShopConstants.YSHOP_ONE_NUM); + List cartInfo = (List) cartGroup.get("valid"); + List cartCouponDtoList = new ArrayList<>(); + Map> cartInfoMap = + cartInfo.stream().collect(Collectors.groupingBy(AppStoreCartQueryVo::getProductId)); + for (List queryVos : cartInfoMap.values()) { + BigDecimal amount = BigDecimal.ZERO; + for (AppStoreCartQueryVo appStoreCartQueryVo : queryVos){ + amount = amount.add(appStoreCartQueryVo.getTruePrice() + .multiply(BigDecimal.valueOf(appStoreCartQueryVo.getCartNum()))); + } + cartCouponDtoList.add(CartCouponDto.builder().productId(queryVos.get(0).getProductId()).price(amount).build()); + } + return couponRelationService.searchCartCoupon(cartCouponDtoList, null); + } } diff --git a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/StoreCartServiceImpl.java b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/StoreCartServiceImpl.java index f4c01f9..749c7ae 100644 --- a/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/StoreCartServiceImpl.java +++ b/yshop-module-mall/yshop-module-cart-biz/src/main/java/co/yixiang/yshop/module/cart/service/storecart/StoreCartServiceImpl.java @@ -1,24 +1,18 @@ package co.yixiang.yshop.module.cart.service.storecart; -import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; -import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; -import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.cart.controller.admin.storecart.vo.StoreCartPageReqVO; +import co.yixiang.yshop.module.cart.controller.admin.storecart.vo.StoreCartRespVO; +import co.yixiang.yshop.module.cart.dal.mysql.storecart.StoreCartMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import java.lang.reflect.Member; -import java.util.*; -import co.yixiang.yshop.module.cart.controller.admin.storecart.vo.*; -import co.yixiang.yshop.module.cart.dal.dataobject.storecart.StoreCartDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; - -import co.yixiang.yshop.module.cart.convert.storecart.StoreCartConvert; -import co.yixiang.yshop.module.cart.dal.mysql.storecart.StoreCartMapper; +import javax.annotation.Resource; +import java.util.List; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.cart.enums.ErrorCodeConstants.STORE_CART_NOT_EXISTS; /** * 购物车 Service 实现类 @@ -31,10 +25,6 @@ public class StoreCartServiceImpl implements StoreCartService { @Resource private StoreCartMapper storeCartMapper; - @Resource - private StoreProductMapper storeProductMapper; - @Resource - private MemberUserMapper memberUserMapper; @Override @@ -54,17 +44,10 @@ public class StoreCartServiceImpl implements StoreCartService { @Override public PageResult getStoreCartPage(StoreCartPageReqVO pageReqVO) { - PageResult pageResult = storeCartMapper.selectPage(pageReqVO); - PageResult storeCartRespVO = StoreCartConvert.INSTANCE.convertPage(pageResult); - for (StoreCartRespVO storeCartRespVO1 : storeCartRespVO.getList()) { - StoreProductDO storeProductDO = storeProductMapper.selectById(storeCartRespVO1.getProductId()); - MemberUserDO memberUserDO = memberUserMapper.selectById(storeCartRespVO1.getUid()); - storeCartRespVO1.setNickname(memberUserDO.getNickname()); - storeCartRespVO1.setStoreName(storeProductDO.getStoreName()); - } - return storeCartRespVO; + List list = storeCartMapper.pageList(new Page<>(pageReqVO.getPageNo(),pageReqVO.getPageSize()), + pageReqVO.getNickname()); + + return new PageResult<>(list, storeCartMapper.pageListCount(pageReqVO.getNickname())); } - - } diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AdminAfterOrderStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AdminAfterOrderStatusEnum.java index 97cb59f..bef7adc 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AdminAfterOrderStatusEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AdminAfterOrderStatusEnum.java @@ -18,8 +18,8 @@ import java.util.stream.Stream; @AllArgsConstructor public enum AdminAfterOrderStatusEnum { - STATUS_1(1,"售后中"), - STATUS_2(2,"已完成"); + AFTER_SALES(1,"售后中"), + COMPLETED(2,"已完成"); diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterChangeTypeEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterChangeTypeEnum.java index cfd6f0a..0841811 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterChangeTypeEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterChangeTypeEnum.java @@ -1,23 +1,23 @@ -package co.yixiang.yshop.module.order.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 售后状态枚举 - */ -@Getter -@AllArgsConstructor -public enum AfterChangeTypeEnum { - STATE_0(0,"售后订单生成"), - STATE_1(1,"后台审核成功"), - STATE_2(2,"用户发货"), - STATE_3(3,"打款"), - STATE_4(4,"审核失败"), - STATE_5(5,"用户撤销"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.order.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 售后状态枚举 + */ +@Getter +@AllArgsConstructor +public enum AfterChangeTypeEnum { + CREATE_AFTER_SALES(0,"售后订单生成"), + AUDIT_SUCCESS(1,"后台审核成功"), + USER_SHIPMENT(2,"用户发货"), + PAYMENT(3,"打款"), + AUDIT_FAILED(4,"审核失败"), + USER_REVOCATION(5,"用户撤销"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterSalesStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterSalesStatusEnum.java index 8b24aa0..bb4fc6b 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterSalesStatusEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterSalesStatusEnum.java @@ -20,10 +20,12 @@ import java.util.stream.Stream; @AllArgsConstructor public enum AfterSalesStatusEnum { - STATUS_0(0,"已提交等待平台审核"), - STATUS_1(1,"平台已审核,等待用户发货/退款"), - STATUS_2(2,"用户已发货"), - STATUS_3(3,"已完成"); + PENDING_REVIEW(0,"已提交等待平台审核"), + AUDITED(1,"平台已审核,等待用户发货/退款"), + USER_SHIPPED(2,"用户已发货"), + REFUND_SUCCESS(3,"用户退款成功"), + USER_CANCELLED(4,"用户取消"), + MERCHANT_REJECTION(5,"商家拒绝"); private Integer value; private String desc; diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterStatusEnum.java index 2db5724..2a07d81 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterStatusEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterStatusEnum.java @@ -1,20 +1,20 @@ -package co.yixiang.yshop.module.order.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 售后状态枚举 - */ -@Getter -@AllArgsConstructor -public enum AfterStatusEnum { - STATE_0(0,"正常"), - STATE_1(1,"用户取消"), - STATE_2(2,"商家拒绝"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.order.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 售后状态枚举 + */ +@Getter +@AllArgsConstructor +public enum AfterStatusEnum { + STATE_0(0,"正常"), + STATE_1(1,"用户取消"), + STATE_2(2,"商家拒绝"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterTypeEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterTypeEnum.java index e95ef82..42c96d9 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterTypeEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/AfterTypeEnum.java @@ -1,21 +1,21 @@ -package co.yixiang.yshop.module.order.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 售后类型枚举 - */ -@Getter -@AllArgsConstructor -public enum AfterTypeEnum { - TYPE_1(1,"同意"), - TYPE_2(2,"拒绝"), - SERVICE_TYPE_0(0,"仅退款"), - SERVICE_TYPE_1(1,"退货退款"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.order.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 售后类型枚举 + */ +@Getter +@AllArgsConstructor +public enum AfterTypeEnum { + AGREE(1,"同意"), + REFUSE(2,"拒绝"), + REFUND_ONLY(0,"仅退款"), + RETURNS_REFUNDS(1,"退货退款"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java index e2904f4..0e41594 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ErrorCodeConstants.java @@ -27,11 +27,17 @@ public interface ErrorCodeConstants { ErrorCode ORDER_NOT_REVOKE = new ErrorCode(1008007016, "订单不能撤销"); ErrorCode ORDER_NOT_CANCEL = new ErrorCode(1008007018, "订单不能取消"); ErrorCode ORDER_ADDRESS_REQUERED = new ErrorCode(1008007019, "请输入商家收货人信息"); + + ErrorCode ORDER_PAYINFO_ERROR = new ErrorCode(1008007020, "获取订单支付信息异常"); // ========== 订单电子面单记录 ========== ErrorCode STORE_ORDER_ELECTRONICS_NOT_EXISTS = new ErrorCode(1008010000, "订单电子面单记录不存在"); + // ==============支付 ====== + ErrorCode STORE_ORDER_PAY_FEE_ERROR = new ErrorCode(1008011000, "订单金额与支付不一致!"); + ErrorCode STORE_ORDER_REFUND_TRANSACTION_NULL_ERROR = new ErrorCode(1008011001, "订单支付信息有误!退款失败!"); + ErrorCode STORE_ORDER_REFUND_ERROR = new ErrorCode(1008011002, "退款失败!"); } diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderLogEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderLogEnum.java index 5ae53cd..519f6e2 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderLogEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderLogEnum.java @@ -28,7 +28,8 @@ public enum OrderLogEnum { NONE_ORDER("NONE","订单OK"), DELIVERY_GOODS("delivery_goods", "订单发货"), OFFLINE_PAY("offline_pay", "线下支付"), - EXTEND_ORDER("EXTEND_ORDER","订单已生成"); + EXTEND_ORDER("EXTEND_ORDER","订单已生成"), + APPLY_AFTER_SALES("apply_after_sales","用户申请售后"); private String value; diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java index 9a406eb..a90f1d7 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/OrderStatusEnum.java @@ -18,15 +18,15 @@ import java.util.stream.Stream; @AllArgsConstructor public enum OrderStatusEnum { - STATUS__1(-1,"全部订单"), - STATUS_0(0,"未支付"), - STATUS_1(1,"待发货"), - STATUS_2(2,"待收货"), - STATUS_3(3,"待评价"), - STATUS_4(4,"已完成"), - STATUS_MINUS_1(-1,"退款中"), - STATUS_MINUS_2(-2,"已退款"), - STATUS_MINUS_3(-3,"退款"); + STATUS_ALL(-1,"全部订单"), + STATUS_WAIT_PAY(0,"未支付"), + STATUS_WAIT_SEND(1,"待发货"), + STATUS_WAIT_RECEIVED(2,"待收货"), + STATUS_WAIT_EVALUATE(3,"待评价"), + STATUS_FINISH(4,"已完成"), + STATUS_MINUS_BEING_REFUND(-1,"退款中"), + STATUS_MINUS_REFUNDED(-2,"已退款"), + STATUS_MINUS_REFUND(-3,"退款"); diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/PayTypeEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/PayTypeEnum.java index d68f4aa..b524d79 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/PayTypeEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/PayTypeEnum.java @@ -20,6 +20,9 @@ public enum PayTypeEnum { ALI("alipay","支付宝支付"), WEIXIN("weixin","微信支付"), + WEIXIN_H5("weixin_h5","微信H5支付"), + WEIXIN_APPLET("weixin_applet","微信小程序支付"), + WEIXIN_APP("weixin_app","微信app支付"), YUE("yue","余额支付"), INTEGRAL("integral","积分兑换"); diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTempEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTempEnum.java index a4b7928..1a3a210 100644 --- a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTempEnum.java +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/ShippingTempEnum.java @@ -1,20 +1,20 @@ -package co.yixiang.yshop.module.order.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 运费模板类型枚举 - */ -@Getter -@AllArgsConstructor -public enum ShippingTempEnum { - TYPE_1(1,"按件数"), - TYPE_2(2,"按重量"), - TYPE_3(3,"按体积"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.order.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 运费模板类型枚举 + */ +@Getter +@AllArgsConstructor +public enum ShippingTempEnum { + BY_PIECE(1,"按件数"), + BY_WEIGHT(2,"按重量"), + BY_VOLUME(3,"按体积"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/WxOrderResultEnum.java b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/WxOrderResultEnum.java new file mode 100644 index 0000000..a02e5a0 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-api/src/main/java/co/yixiang/yshop/module/order/enums/WxOrderResultEnum.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; +import java.util.stream.Stream; + +/** + * @author hupeng + * 订单相关枚举 + */ +@Getter +@AllArgsConstructor +public enum WxOrderResultEnum { + + NOT_PAY("NOTPAY","未支付"), + TRANSACTION_ID("transaction_id","微信支付订单id"), + OUT_TRADE_NO("out_trade_no","商家订单号"), + OUT_REFUND_NO("out_refund_no","商家退款单号"), + TRADE_STATE("trade_state","订单交易装态"), + REFUND_ID("refund_id","微信退款单id"); + + + + + + + private String value; + private String desc; + + public static WxOrderResultEnum toType(String value) { + return Stream.of(WxOrderResultEnum.values()) + .filter(p -> Objects.equals(p.value, value)) + .findAny() + .orElse(null); + } + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/StoreAfterSalesController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/StoreAfterSalesController.java index f45f618..4a34520 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/StoreAfterSalesController.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/StoreAfterSalesController.java @@ -33,7 +33,7 @@ public class StoreAfterSalesController { @PutMapping("/update") @Operation(summary = "更新售后记录") @PreAuthorize("@ss.hasPermission('order:store-after-sales:update')") - public CommonResult updateStoreAfterSales(@Valid @RequestBody StoreAfterSalesUpdateReqVO updateReqVO) { + public CommonResult updateStoreAfterSales(@Valid @RequestBody StoreAfterSalesUpdateReqVO updateReqVO) throws Exception { storeAfterSalesService.updateStoreAfterSales(updateReqVO); return success(true); } @@ -43,7 +43,7 @@ public class StoreAfterSalesController { @Operation(summary = "立即退款") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('order:store-after-sales:delete')") - public CommonResult deleteStoreAfterSales(@RequestParam("id") Long id) { + public CommonResult deleteStoreAfterSales(@RequestParam("id") Long id) throws Exception{ storeAfterSalesService.payStoreAfterSales(id); return success(true); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java index a8d112c..c536ab7 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesBaseVO.java @@ -60,4 +60,7 @@ public class StoreAfterSalesBaseVO { @Schema(description = "商家地址") private String address; + @Schema(description = "收货状态:0、未收到,1、已收到", required = true, example = "0") + private Integer receivingStatus; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesRespVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesRespVO.java index a9de74a..abf9357 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesRespVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeaftersales/vo/StoreAfterSalesRespVO.java @@ -26,4 +26,7 @@ public class StoreAfterSalesRespVO extends StoreAfterSalesBaseVO { @Schema(description = "商品信息", required = true) private List storeOrderCartInfoDOList; + @Schema(description = "退货凭证", required = true) + private String returnVoucher; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/ShoperOrderTimeDataVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/ShoperOrderTimeDataVo.java index 4d64262..81ddf1f 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/ShoperOrderTimeDataVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/ShoperOrderTimeDataVo.java @@ -1,38 +1,38 @@ -package co.yixiang.yshop.module.order.controller.admin.storeorder.vo; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName OrderTimeDataDTO - * @Author hupeng <610796224@qq.com> - * @Date 2023/7/26 - **/ -@Data -public class ShoperOrderTimeDataVo implements Serializable { - - /**今日成交额*/ - private Double todayPrice; - - /**今日订单数*/ - private Long todayCount; - - /**昨日成交额*/ - private Double proPrice; - - /**昨日订单数*/ - private Long proCount; - - /**本月成交额*/ - private Double monthPrice; - - /**本月订单数*/ - private Long monthCount; - - /**上周订单数*/ - private Long lastWeekCount; - - /**上周成交额*/ - private Double lastWeekPrice; -} +package co.yixiang.yshop.module.order.controller.admin.storeorder.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName OrderTimeDataDTO + * @Author hupeng <610796224@qq.com> + * @Date 2023/7/26 + **/ +@Data +public class ShoperOrderTimeDataVo implements Serializable { + + /**今日成交额*/ + private Double todayPrice; + + /**今日订单数*/ + private Long todayCount; + + /**昨日成交额*/ + private Double proPrice; + + /**昨日订单数*/ + private Long proCount; + + /**本月成交额*/ + private Double monthPrice; + + /**本月订单数*/ + private Long monthCount; + + /**上周订单数*/ + private Long lastWeekCount; + + /**上周成交额*/ + private Double lastWeekPrice; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java index fd28ce8..9c7a3d8 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderBaseVO.java @@ -76,7 +76,7 @@ public class StoreOrderBaseVO { @Schema(description = "优惠券id", required = true, example = "3299") @NotNull(message = "优惠券id不能为空") - private Integer couponId; + private Long couponId; @Schema(description = "优惠券金额", required = true, example = "22157") @NotNull(message = "优惠券金额不能为空") diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExcelVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExcelVO.java index 1cf5572..c4cdd03 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExcelVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExcelVO.java @@ -77,7 +77,7 @@ public class StoreOrderExcelVO { private BigDecimal deductionPrice; @ExcelProperty("优惠券id") - private Integer couponId; + private Long couponId; @ExcelProperty("优惠券金额") private BigDecimal couponPrice; diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExportReqVO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExportReqVO.java index c37b377..348efa6 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExportReqVO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/admin/storeorder/vo/StoreOrderExportReqVO.java @@ -58,7 +58,7 @@ public class StoreOrderExportReqVO { private BigDecimal deductionPrice; @Schema(description = "优惠券id", example = "3299") - private Integer couponId; + private Long couponId; @Schema(description = "优惠券金额", example = "22157") private BigDecimal couponPrice; diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java index 8e2cfaa..c04646a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/AppOrderAfterSalesController.java @@ -2,8 +2,10 @@ package co.yixiang.yshop.module.order.controller.app.afterorder; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; +import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppReturnLogisticsParam; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppStoreAfterSalesParam; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreAfterSalesVo; +import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderAfterSalesDetailVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderCartInfoVo; import co.yixiang.yshop.module.order.service.storeaftersales.AppStoreAfterSalesService; import io.swagger.v3.oas.annotations.Operation; @@ -36,20 +38,27 @@ public class AppOrderAfterSalesController { @PreAuthenticated @PostMapping("/applyForAfterSales") @Operation(summary = "申请售后") - public CommonResult applyForAfterSales(@Valid @RequestBody AppStoreAfterSalesParam storeAfterSalesParam) { + public CommonResult applyForAfterSales(@Valid @RequestBody AppStoreAfterSalesParam storeAfterSalesParam) { Long uid = getLoginUserId(); - appStoreAfterSalesService.applyForAfterSales(uid, storeAfterSalesParam); - return success(true); + return success(appStoreAfterSalesService.applyForAfterSales(uid, storeAfterSalesParam)); } @PreAuthenticated @GetMapping("/applyForAfterSales/{key}") @Operation(summary = "查询订单详情") - @Parameter(name = "key", description = "唯一的uni值或者订单号", required = true, example = "10 ") + @Parameter(name = "key", description = "唯一的uni值或者订单号", required = true, example = "10") public CommonResult> checkOrderDetails(@PathVariable String key) { return success(appStoreAfterSalesService.checkOrderDetails(key)); } + @PreAuthenticated + @GetMapping("/checkForAfterSales/{key}") + @Operation(summary = "查询售后订单详情") + @Parameter(name = "key", description = "唯一的uni值或者售后单号", required = true, example = "10") + public CommonResult checkAfterSalesDetails(@PathVariable String key) { + return success(appStoreAfterSalesService.checkAfterSalesDetails(key)); + } + @PreAuthenticated @GetMapping("/storeAfterSales/list") @@ -60,7 +69,7 @@ public class AppOrderAfterSalesController { @Parameter(name = "page", description = "页码,默认为1", required = true, example = "1"), @Parameter(name = "limit", description = "页大小,默认为10", - required = true, example = "10 ") + required = true, example = "10") }) public CommonResult> salesList(@RequestParam(value = "type", defaultValue = "0") int type, @RequestParam(value = "page", defaultValue = "1") int page, @@ -106,18 +115,9 @@ public class AppOrderAfterSalesController { @PreAuthenticated @PostMapping("/addLogisticsInformation") - @Parameters({ - @Parameter(name = "code", description = "快递公司编码", required = true), - @Parameter(name = "name", description = "快递公司名称", required = true), - @Parameter(name = "postalCode", description = "快递编号", required = true), - @Parameter(name = "orderCode", description = "订单编号", required = true), - @Parameter(name = "id", description = "售后订单id", required = true, example = "1") - }) @Operation(summary = "添加物流信息") - public CommonResult addLogisticsInformation(@RequestParam String code, @RequestParam String name, - @RequestParam String postalCode, @RequestParam String orderCode, - @RequestParam Long id) { - Boolean result = appStoreAfterSalesService.addLogisticsInformation(code, name, postalCode, orderCode, id); + public CommonResult addLogisticsInformation(@RequestBody AppReturnLogisticsParam param) { + Boolean result = appStoreAfterSalesService.addLogisticsInformation(param); return success(result); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppReturnLogisticsParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppReturnLogisticsParam.java new file mode 100644 index 0000000..17f1429 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppReturnLogisticsParam.java @@ -0,0 +1,57 @@ +package co.yixiang.yshop.module.order.controller.app.afterorder.param; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 退款物流参数 + * + * @author moxiangrong + */ +@Data +public class AppReturnLogisticsParam { + + /** + * 快递公司编码 + */ + @NotBlank(message="快递公司编码不能为空") + private String code; + + /** + * 快递公司名称 + */ + @NotBlank(message="快递公司名称不能为空") + private String name; + + /** + * 快递编号 + */ + @NotBlank(message="快递编号不能为空") + private String postalCode; + + /** + * 订单编号 + */ + @NotBlank(message="订单编号不能为空") + private String orderCode; + + /** + * 售后订单id + */ + @NotNull(message="售后订单id不能为空") + private Long id; + + /** + * 退货说明 + */ + private String returnPolicy; + + /** + * 退货凭证 + */ + private String returnVoucher; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppStoreAfterSalesParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppStoreAfterSalesParam.java index 9ad67f9..06f81b3 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppStoreAfterSalesParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/param/AppStoreAfterSalesParam.java @@ -1,5 +1,6 @@ package co.yixiang.yshop.module.order.controller.app.afterorder.param; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import javax.validation.constraints.NotBlank; @@ -15,8 +16,8 @@ public class AppStoreAfterSalesParam { /** * 订单号 */ - @NotBlank - private String orderCode; + @NotBlank(message="订单号不能为空") + private String orderId; /** * 服务类型 0仅退款1退货退款 @@ -27,7 +28,7 @@ public class AppStoreAfterSalesParam { /** * 申请原因 */ - @NotBlank + @NotBlank(message="申请原因不能为空") private String reasonForApplication; /** @@ -40,6 +41,9 @@ public class AppStoreAfterSalesParam { */ private String applicationDescriptionPicture; + @Schema(description = "收货状态:0、未收到,1、已收到", required = true, example = "0") + private Integer receivingStatus; + /** * 商品数据 */ diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreAfterSalesVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreAfterSalesVo.java index c165125..cac126e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreAfterSalesVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreAfterSalesVo.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.order.controller.app.afterorder.vo; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -19,6 +20,9 @@ public class AppStoreAfterSalesVo { /** id */ private Long id; + /** 订单id */ + private Long orderId; + /** 订单号 */ private String orderCode; @@ -120,4 +124,8 @@ public class AppStoreAfterSalesVo { */ private LocalDateTime closeAfterSaleTime; + + @Schema(description = "收货状态:0、未收到,1、已收到", required = true, example = "0") + private Integer receivingStatus; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java new file mode 100644 index 0000000..8d1b897 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderAfterSalesDetailVo.java @@ -0,0 +1,105 @@ +package co.yixiang.yshop.module.order.controller.app.afterorder.vo; + + +import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * + * 退款详情 + * + * @author moxiangrong + * @date 2023-11-2 + */ +@Data +@Builder +public class AppStoreOrderAfterSalesDetailVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "订单ID" ) + private Long id; + + @Schema(description = "订单号" ) + private String orderId; + + @Schema(description = "用户id" ) + private Long uid; + + @Schema(description = "用户姓名" ) + private String realName; + + @Schema(description = "用户电话" ) + private String userPhone; + + @Schema(description = "详细地址" ) + private String userAddress; + + @Schema(description = "购物车信息" ) + private List cartInfo; + + @Schema(description = "支付时间" ) + private LocalDateTime payTime; + + @Schema(description = "实际支付金额" ) + private BigDecimal payPrice; + + @Schema(description = "订单总价" ) + private BigDecimal totalPrice; + + @Schema(description = "运费" ) + private BigDecimal totalPostage; + + @Schema(description = "抵扣金额" ) + private BigDecimal deductionPrice; + + @Schema(description = "优惠金额" ) + private BigDecimal couponPrice; + + @Schema(description = "创建时间" ) + private LocalDateTime createTime; + + @Schema(description = "发货时间" ) + private LocalDateTime deliveryTime; + + @Schema(description = "物流名称" ) + private String deliveryName; + + @Schema(description = "快递单号" ) + private String deliverySn; + + + /** 服务类型 0仅退款 1退货退款 */ + private Integer serviceType; + + @Schema(description = "退款金额" ) + private BigDecimal refundAmount; + + /** 申请原因 */ + private String reasons; + + /** 说明 */ + private String explains; + + /** 说明图片->多个用逗号分割 */ + private String explainImg; + + /** 状态 0已提交等待平台审核 1平台已审核 等待用户发货/退款 2 用户已发货 3退款成功 */ + private Integer state; + + /** 售后状态-0正常1用户取消2商家拒绝 */ + private Integer salesState; + + @Schema(description = "收货状态:0、未收到,1、已收到", required = true, example = "0") + private Integer receivingStatus; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java index 1f54388..c3d8950 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/afterorder/vo/AppStoreOrderCartInfoVo.java @@ -17,6 +17,8 @@ public class AppStoreOrderCartInfoVo { /** 订单id */ private Long oid; + /** 订单id */ + private String orderId; /** 购物车id */ private Long cartId; @@ -42,4 +44,10 @@ public class AppStoreOrderCartInfoVo { /** 申请原因 */ private String reasons; + /** 状态 0已提交等待平台审核 1平台已审核 等待用户发货/退款 2 用户已发货 3退款成功 */ + private Integer state; + + /** 售后状态-0正常1用户取消2商家拒绝 */ + private Integer salesState; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java index 7c708e1..01ec99f 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/AppOrderController.java @@ -36,7 +36,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.List; import java.util.Map; @@ -72,12 +74,14 @@ public class AppOrderController { + + @PreAuthenticated @PostMapping("/confirm") @Operation(summary = "订单确认") public CommonResult confirm(@Validated @RequestBody AppConfirmOrderParam param) { Long uid = getLoginUserId(); - return success(appStoreOrderService.confirmOrder(uid, param.getCartId())); + return success(appStoreOrderService.confirmOrder(uid, param)); } @@ -108,22 +112,48 @@ public class AppOrderController { } + /** + * 支付查单 + */ + @PreAuthenticated + @PostMapping(value = "/pay/orderQuery") + @Operation(summary = "订单支付查询") + public CommonResult orderQuery(@Valid @RequestBody AppPayParam param) throws Exception { + Long uid = getLoginUserId(); + return success(appStoreOrderService.orderQuery(uid,param)); + } + + /** * 订单支付 */ @PreAuthenticated @PostMapping(value = "/pay") @Operation(summary = "订单支付") - public CommonResult> pay(@Valid @RequestBody AppPayParam param) { + public CommonResult> pay(@Valid @RequestBody AppPayParam param) throws Exception { Long uid = getLoginUserId(); return success(appStoreOrderService.pay(uid,param)); } + /** - * 支付回调地址 + * 微信支付回调 + * @param request + * @param response + * @throws Exception + */ + @RequestMapping("pay/wxPayNotify") + @Operation(summary = "微信支付回调") + @PermitAll + public void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { + appStoreOrderService.wxPayNotify(request,response); + } + + /** + * egzon支付回调地址 支付宝使用egzon形式 回调处理在AlipayMessageHandler * * @param request 请求 - * @param detailsId 列表id + * @param detailsId 列表id 商户表id * @return 支付是否成功 */ @RequestMapping(value = "payBack{detailsId}.json") @@ -197,7 +227,7 @@ public class AppOrderController { @Operation(summary = "订单评价") public CommonResult comments(@Valid @RequestBody List param) { Long uid = getLoginUserId(); - if (param.size() > 0) { + if (!param.isEmpty()) { for (AppProductReplyParam productReplyParam : param) { appStoreOrderService.orderComment(uid, productReplyParam.getUnique(), productReplyParam.getComment(), diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java index b8f042f..6578ef0 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppComputeOrderParam.java @@ -1,39 +1,39 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -/** - * @ClassName ComputeOrderParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/19 - **/ -@Getter -@Setter -@ToString -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AppComputeOrderParam { - - @Schema(description = "地址ID", required = true) - private String addressId; - - @Schema(description = "优惠券ID", required = true) - private String couponId; - - @Schema(description = "支付方式", required = true) - private String payType; - - @Schema(description = "使用积分 1-表示使用", required = true) - private String useIntegral; - - @Schema(description = "配送方式 1=快递 ,2=门店自提", required = true) - private String shippingType; - - @Schema(description = "拼团ID", required = true) - private String pinkId; - - @Schema(description = "拼团产品ID", required = true) - private String combinationId; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +/** + * @ClassName ComputeOrderParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/19 + **/ +@Getter +@Setter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AppComputeOrderParam { + + @Schema(description = "地址ID", required = true) + private String addressId; + + @Schema(description = "优惠券ID", required = true) + private Long couponId; + + @Schema(description = "支付方式", required = true) + private String payType; + + @Schema(description = "使用积分 1-表示使用", required = true) + private String useIntegral; + + @Schema(description = "配送方式 1=快递 ,2=门店自提", required = true) + private Integer shippingType; + + @Schema(description = "拼团ID", required = true) + private String pinkId; + + @Schema(description = "拼团产品ID", required = true) + private String combinationId; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java index 2f943bf..89b02a4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppConfirmOrderParam.java @@ -1,21 +1,29 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; - -/** - * @ClassName 确认订单ConfirmOrderDTO - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/18 - **/ -@Getter -@Setter -public class AppConfirmOrderParam { - - @NotBlank(message = "请提交购买的商品") - @Schema(description = "购物车ID", required = true) - private String cartId; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @ClassName 确认订单ConfirmOrderDTO + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/18 + **/ +@Getter +@Setter +public class AppConfirmOrderParam { + + @NotBlank(message = "请提交购买的商品") + @Schema(description = "购物车ID", required = true) + private String cartId; + + @Schema(description = "地址ID", required = true) + private Long addressId; + + @Schema(description = "优惠券ID", required = true) + private Long couponId; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppDoOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppDoOrderParam.java index 2fc44a9..5887515 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppDoOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppDoOrderParam.java @@ -1,20 +1,20 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; - -/** - * @ClassName HandleOrderParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/21 - **/ -@Getter -@Setter -public class AppDoOrderParam { - @NotBlank(message = "参数有误") - @Schema(description = "订单ID", required = true) - private String uni; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * @ClassName HandleOrderParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/21 + **/ +@Getter +@Setter +public class AppDoOrderParam { + @NotBlank(message = "参数有误") + @Schema(description = "订单ID", required = true) + private String uni; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppExpressParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppExpressParam.java index c3cce0c..7f8a835 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppExpressParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppExpressParam.java @@ -1,24 +1,24 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName ExpressParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/7/26 - **/ -@Data -public class AppExpressParam implements Serializable { - - @Schema(description = "订单编号", required = true) - private String orderCode; - - @Schema(description = "快递公司编码", required = true) - private String shipperCode; - - @Schema(description = "物流单号", required = true) - private String logisticCode; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName ExpressParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/7/26 + **/ +@Data +public class AppExpressParam implements Serializable { + + @Schema(description = "订单编号", required = true) + private String orderCode; + + @Schema(description = "快递公司编码", required = true) + private String shipperCode; + + @Schema(description = "物流单号", required = true) + private String logisticCode; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppHandleOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppHandleOrderParam.java index 9e2b998..6cbc6e4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppHandleOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppHandleOrderParam.java @@ -1,21 +1,21 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; - -/** - * @ClassName HandleOrderParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/23 - **/ -@Getter -@Setter -public class AppHandleOrderParam { - - @NotBlank(message = "参数有误") - @Schema(description = "订单ID", required = true) - private String id; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * @ClassName HandleOrderParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/23 + **/ +@Getter +@Setter +public class AppHandleOrderParam { + + @NotBlank(message = "参数有误") + @Schema(description = "订单ID", required = true) + private String id; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java index ea9c48d..8468df8 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppOrderParam.java @@ -1,53 +1,56 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.Size; -import java.io.Serializable; - -/** - * @ClassName OrderParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/20 - **/ -@Data -public class AppOrderParam implements Serializable { - - @Schema(description = "地址ID", required = true) - private String addressId; - - @Schema(description = "砍价产品ID", required = true) - private String bargainId; - - @Schema(description = "拼团ID", required = true) - private String combinationId; - - @Schema(description = "优惠券ID", required = true) - private String couponId; - - @Schema(description = "来源 AppFromEnum", required = true) - private String from; - - @Size(max = 200,message = "长度超过了限制") - @Schema(description = "备注", required = true) - private String mark; - - - @Schema(description = "拼团id 0没有拼团", required = true) - private String pinkId; - - @Schema(description = "秒杀产品ID", required = true) - private String seckillId; - - @Schema(description = "配送方式 1=快递 ,2=门店自提", required = true) - private String shippingType; - - @Schema(description = "使用积分 1-表示使用", required = true) - private String useIntegral; - - @Schema(description = "支付渠道(0微信公众号1微信小程序)", required = true) - private String isChannel; - - -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * @ClassName OrderParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/20 + **/ +@Data +public class AppOrderParam implements Serializable { + + @Schema(description = "地址ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String addressId; + + @Schema(description = "砍价产品ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String bargainId; + + @Schema(description = "拼团ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String combinationId; + + @Schema(description = "优惠券ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long couponId; + + @Schema(description = "来源 AppFromEnum", requiredMode = Schema.RequiredMode.REQUIRED) + private String from; + + @Size(max = 200,message = "长度超过了限制") + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String mark; + + + @Schema(description = "拼团id 0没有拼团", requiredMode = Schema.RequiredMode.REQUIRED) + private String pinkId; + + @Schema(description = "秒杀产品ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String seckillId; + + @Schema(description = "配送方式 1=快递 ,2=门店自提", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer shippingType; + + @Schema(description = "使用积分 1-表示使用", requiredMode = Schema.RequiredMode.REQUIRED) + private String useIntegral; + + @Schema(description = "支付渠道(0微信公众号1微信小程序)", requiredMode = Schema.RequiredMode.REQUIRED) + private String isChannel; + + @Schema(description = "支付类型 weixin|alipay|yue|integral", requiredMode = Schema.RequiredMode.REQUIRED) + private String payType; + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java index c54e66a..e135364 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppPayParam.java @@ -1,30 +1,30 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @ClassName PayDto - * @Author hupeng <610796224@qq.com> - * @Date 2013/6/20 - **/ -@Data -public class AppPayParam implements Serializable { - - @Schema(description = "来源", required = true) - private String from; - - @NotBlank(message = "选择支付类型 PayTypeEnum类型(alipay weixin yue)") - @Schema(description = "支付类型", required = true) - private String paytype; - - @NotBlank(message = "参数错误") - @Schema(description = "订单ID", required = true) - private String uni; - -// @Schema(description = "服务商id 当不是余额支付必填1-阿里支付 3-微信支付 这里当编号与数据库id对应", required = true) -// private String detailsId; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @ClassName PayDto + * @Author hupeng <610796224@qq.com> + * @Date 2013/6/20 + **/ +@Data +public class AppPayParam implements Serializable { + + @Schema(description = "来源", requiredMode = Schema.RequiredMode.REQUIRED) + private String from; + + @NotBlank(message = "选择支付类型 PayTypeEnum类型(alipay weixin yue)") + @Schema(description = "支付类型", requiredMode = Schema.RequiredMode.REQUIRED) + private String paytype; + + @NotBlank(message = "参数错误") + @Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String uni; + +// @Schema(description = "服务商id 当不是余额支付必填1-阿里支付 3-微信支付 这里当编号与数据库id对应", required = true) +// private String detailsId; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppProductReplyParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppProductReplyParam.java index 4b3b072..27e6daa 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppProductReplyParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppProductReplyParam.java @@ -1,38 +1,38 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; - -/** - * @ClassName ProductReplyParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/20 - **/ -@Getter -@Setter -public class AppProductReplyParam { - - @NotBlank(message = "评论不能为空") - @Size(min = 1, max = 200,message = "长度超过了限制") - @Schema(description = "商品评论内容", required = true) - private String comment; - - @Schema(description = "商品评论图片地址", required = true) - private String pics; - - @NotBlank(message = "请为商品评分") - @Schema(description = "商品评分", required = true) - private String productScore; - - @NotBlank(message = "请为商品评分") - @Schema(description = "服务评分", required = true) - private String serviceScore; - - @NotBlank(message = "参数有误") - @Schema(description = "参数有误", required = true) - private String unique; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * @ClassName ProductReplyParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/20 + **/ +@Getter +@Setter +public class AppProductReplyParam { + + @NotBlank(message = "评论不能为空") + @Size(min = 1, max = 200,message = "长度超过了限制") + @Schema(description = "商品评论内容", required = true) + private String comment; + + @Schema(description = "商品评论图片地址", required = true) + private String pics; + + @NotBlank(message = "请为商品评分") + @Schema(description = "商品评分", required = true) + private String productScore; + + @NotBlank(message = "请为商品评分") + @Schema(description = "服务评分", required = true) + private String serviceScore; + + @NotBlank(message = "商品唯一标识") + @Schema(description = "商品唯一标识 订单详情cateInfo-->unique", required = true) + private String unique; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppRefundParam.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppRefundParam.java index 96c0ad8..9aa9cad 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppRefundParam.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/param/AppRefundParam.java @@ -1,30 +1,30 @@ -package co.yixiang.yshop.module.order.controller.app.order.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @ClassName RefundParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/23 - **/ -@Data -public class AppRefundParam implements Serializable { - - @Schema(description = "退款备注", required = true) - private String refundReasonWapExplain; - - @Schema(description = "退款图片", required = true) - private String refundReasonWapImg; - - @NotBlank(message = "请填写退款原因") - @Schema(description = "退款原因", required = true) - private String text; - - @NotBlank(message = "参数错误") - @Schema(description = "订单号", required = true) - private String uni; -} +package co.yixiang.yshop.module.order.controller.app.order.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @ClassName RefundParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/23 + **/ +@Data +public class AppRefundParam implements Serializable { + + @Schema(description = "退款备注", required = true) + private String refundReasonWapExplain; + + @Schema(description = "退款图片", required = true) + private String refundReasonWapImg; + + @NotBlank(message = "请填写退款原因") + @Schema(description = "退款原因", required = true) + private String text; + + @NotBlank(message = "参数错误") + @Schema(description = "订单号", required = true) + private String uni; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java index e5d634c..513835c 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppComputeVo.java @@ -1,44 +1,44 @@ -package co.yixiang.yshop.module.order.controller.app.order.vo; - - -import co.yixiang.yshop.framework.common.serializer.BigDecimalSerializer; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * @ClassName ComputeVo - * @Author hupeng <610796224@qq.com> - * @Date 2019/10/27 - **/ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AppComputeVo implements Serializable { - - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal couponPrice; - - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal deductionPrice; - - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal payPostage; - - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal payPrice; - - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal totalPrice; - - private Double usedIntegral; //使用了多少积分 - - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal payIntegral; -} +package co.yixiang.yshop.module.order.controller.app.order.vo; + + +import co.yixiang.yshop.framework.common.serializer.BigDecimalSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @ClassName ComputeVo + * @Author hupeng <610796224@qq.com> + * @Date 2019/10/27 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AppComputeVo implements Serializable { + + @JsonSerialize(using = BigDecimalSerializer.class) + private BigDecimal couponPrice; + + @JsonSerialize(using = BigDecimalSerializer.class) + private BigDecimal deductionPrice; + + @JsonSerialize(using = BigDecimalSerializer.class) + private BigDecimal payPostage; + + @JsonSerialize(using = BigDecimalSerializer.class) + private BigDecimal payPrice; + + @JsonSerialize(using = BigDecimalSerializer.class) + private BigDecimal totalPrice; + + private Double usedIntegral; //使用了多少积分 + + @JsonSerialize(using = BigDecimalSerializer.class) + private BigDecimal payIntegral; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java index c8b2fcb..4117fe9 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppConfirmOrderVo.java @@ -1,64 +1,64 @@ -package co.yixiang.yshop.module.order.controller.app.order.vo; - - -import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; -import co.yixiang.yshop.module.member.dal.dataobject.useraddress.UserAddressDO; -import co.yixiang.yshop.module.order.service.storeorder.dto.PriceGroupDto; -import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.List; - -/** - * @ClassName ConfirmOrderVo - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/18 - **/ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Schema(description = "用户 APP - 订单确认参数参数") -public class AppConfirmOrderVo implements Serializable { - //地址信息 - private UserAddressDO addressInfo; - - //砍价id - private Integer bargainId; - - private List cartInfo; - - private Integer combinationId; - - //优惠券减 - private Boolean deduction; - - private Boolean enableIntegral; - - private Double enableIntegralNum; - - //积分抵扣 - private Integer integralRatio; - - private String orderKey; - - private PriceGroupDto priceGroup; - - private Integer seckillId; - - //店铺自提 - private Integer storeSelfMention; - - - // private StoreCouponUserVo usableCoupon; - - private AppUserQueryVo userInfo; - - - -} +package co.yixiang.yshop.module.order.controller.app.order.vo; + + +import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; +import co.yixiang.yshop.module.member.dal.dataobject.useraddress.UserAddressDO; +import co.yixiang.yshop.module.order.service.storeorder.dto.PriceGroupDto; +import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * @ClassName ConfirmOrderVo + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/18 + **/ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(description = "用户 APP - 订单确认参数参数") +public class AppConfirmOrderVo implements Serializable { + //地址信息 + private UserAddressDO addressInfo; + + //砍价id + private Integer bargainId; + + private List cartInfo; + + private Integer combinationId; + + //优惠券减 + private Boolean deduction; + + private Boolean enableIntegral; + + private Double enableIntegralNum; + + //积分抵扣 + private Integer integralRatio; + + private String orderKey; + + private PriceGroupDto priceGroup; + + private Integer seckillId; + + //店铺自提 + private Integer storeSelfMention; + + + // private StoreCouponUserVo usableCoupon; + + private AppUserQueryVo userInfo; + + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java index 0252031..aa9510d 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/AppStoreOrderQueryVo.java @@ -6,12 +6,16 @@ import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryV import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + /** *

* 订单表 查询结果对象 @@ -25,147 +29,160 @@ import java.util.List; public class AppStoreOrderQueryVo implements Serializable { private static final long serialVersionUID = 1L; - @Schema(description = "订单ID", required = true) + @Schema(description = "订单ID" ) private Long id; - @Schema(description = "订单号", required = true) + @Schema(description = "订单号" ) private String orderId; private String extendOrderId; - @Schema(description = "用户id", required = true) + @Schema(description = "用户id" ) private Long uid; - @Schema(description = "用户姓名", required = true) + @Schema(description = "用户姓名" ) private String realName; - @Schema(description = "用户电话", required = true) + @Schema(description = "用户电话" ) private String userPhone; - @Schema(description = "详细地址", required = true) + @Schema(description = "详细地址" ) private String userAddress; - @Schema(description = "购物车id", required = true) + @Schema(description = "购物车id" ) private String cartId; - @Schema(description = "购物车信息", required = true) + @Schema(description = "购物车信息" ) private List cartInfo; - @Schema(description = "订单信息合集", required = true) + @Schema(description = "订单信息合集" ) private StatusDto _status; - @Schema(description = "运费金额", required = true) + @Schema(description = "运费金额" ) private BigDecimal freightPrice; - @Schema(description = "订单商品总数", required = true) + @Schema(description = "订单商品总数" ) private Integer totalNum; - @Schema(description = "订单总价", required = true) + @Schema(description = "订单总价" ) private BigDecimal totalPrice; - @Schema(description = "邮费", required = true) + @Schema(description = "邮费" ) private BigDecimal totalPostage; - @Schema(description = "实际支付金额", required = true) + @Schema(description = "实际支付金额" ) private BigDecimal payPrice; - @Schema(description = "实际支付积分", required = true) + @Schema(description = "实际支付积分" ) private BigDecimal payIntegral; - @Schema(description = "支付邮费", required = true) + @Schema(description = "支付邮费" ) private BigDecimal payPostage; - @Schema(description = "抵扣金额", required = true) + @Schema(description = "抵扣金额" ) private BigDecimal deductionPrice; - @Schema(description = "优惠券id", required = true) - private Integer couponId; + @Schema(description = "优惠券id" ) + private Long couponId; - @Schema(description = "优惠券金额", required = true) + @Schema(description = "优惠券金额" ) private BigDecimal couponPrice; - @Schema(description = "支付状态", required = true) + @Schema(description = "支付状态" ) private Integer paid; - @Schema(description = "支付时间", required = true) - private Date payTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND,timezone="GMT+8") + @Schema(description = "支付时间" ) + private LocalDateTime payTime; - @Schema(description = "支付方式", required = true) + @Schema(description = "支付方式" ) private String payType; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") - @Schema(description = "创建时间", required = true) - private Date createTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime createTime; - @Schema(description = "订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货;3:待评价;-1:已退款", required = true) + @Schema(description = "订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货;3:待评价;-1:已退款" ) private Integer status; - @Schema(description = "0 未退款 1 申请中 2 已退款", required = true) + @Schema(description = "0 未退款 1 申请中 2 已退款" ) private Integer refundStatus; - @Schema(description = "退款图片", required = true) + @Schema(description = "退款图片" ) private String refundReasonWapImg; - @Schema(description = "退款用户说明", required = true) + @Schema(description = "退款用户说明" ) private String refundReasonWapExplain; - @Schema(description = "退款时间", required = true) - private Date refundReasonTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND,timezone="GMT+8") + @Schema(description = "退款时间" ) + private LocalDateTime refundReasonTime; - @Schema(description = "前台退款原因", required = true) + @Schema(description = "前台退款原因" ) private String refundReasonWap; - @Schema(description = "不退款的理由", required = true) + @Schema(description = "不退款的理由" ) private String refundReason; - @Schema(description = "退款金额", required = true) + @Schema(description = "退款金额" ) private BigDecimal refundPrice; - @Schema(description = "快递名称/送货人姓名", required = true) + @Schema(description = "快递名称/送货人姓名" ) private String deliveryName; - @Schema(description = "快递公司编号", required = true) + @Schema(description = "快递公司编号" ) private String deliverySn; - @Schema(description = "发货类型", required = true) + @Schema(description = "发货类型" ) private String deliveryType; - @Schema(description = "快递单号/手机号", required = true) + @Schema(description = "快递单号/手机号" ) private String deliveryId; - @Schema(description = "消费赚取积分", required = true) + @Schema(description = "消费赚取积分" ) private BigDecimal gainIntegral; - @Schema(description = "使用积分", required = true) + @Schema(description = "使用积分" ) private BigDecimal useIntegral; - @Schema(description = "给用户退了多少积分", required = true) + @Schema(description = "给用户退了多少积分" ) private BigDecimal backIntegral; - @Schema(description = "备注", required = true) + @Schema(description = "备注" ) private String mark; - @Schema(description = "确认订单返回的key", required = true) + @Schema(description = "确认订单返回的key" ) private String unique; - @Schema(description = "管理员备注", required = true) + @Schema(description = "管理员备注" ) private String remark; - @Schema(description = "拼团产品id0一般产品", required = true) + @Schema(description = "拼团产品id0一般产品" ) private Long combinationId; - @Schema(description = "拼团id 0没有拼团", required = true) + @Schema(description = "拼团id 0没有拼团" ) private Long pinkId; - @Schema(description = "成本价", required = true) + @Schema(description = "成本价" ) private BigDecimal cost; - @Schema(description = "秒杀产品ID", required = true) + @Schema(description = "秒杀产品ID" ) private Long seckillId; - @Schema(description = "配送方式 1=快递 ,2=门店自提\"", required = true) + @Schema(description = "配送方式 1=快递 ,2=门店自提\"" ) private Integer shippingType; + @Schema(description = "发货时间" ) + private LocalDateTime deliveryTime; + + /** + * 支付信息 + */ + private String payInfo; + + + + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/PayInfo.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/PayInfo.java new file mode 100644 index 0000000..2524935 --- /dev/null +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/controller/app/order/vo/PayInfo.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.order.controller.app.order.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "支付信息参数") +public class PayInfo { + + + /** + * 商户订单号 + */ + String orderId; + /** + * 微信交易商户单号 + */ + String out_trade_no; + + /** + * 微信交易单号 + */ + String transaction_id; + + /** + * 商户退款单号 + */ + String out_refund_no; + + /** + * 微信退款单号 + */ + String refund_id; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorder/StoreOrderConvert.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorder/StoreOrderConvert.java index 932d77c..9304082 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorder/StoreOrderConvert.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/convert/storeorder/StoreOrderConvert.java @@ -26,7 +26,7 @@ public interface StoreOrderConvert { StoreOrderRespVO convert(StoreOrderDO bean); - AppStoreOrderQueryVo convert1(StoreOrderDO bean); + AppStoreOrderQueryVo convert01(StoreOrderDO bean); List convertList(List list); diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java index 3fbe1c2..d56b535 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeaftersales/StoreAfterSalesDO.java @@ -89,4 +89,20 @@ public class StoreAfterSalesDO extends BaseDO { */ private String address; + + /** + * 退货说明 + */ + private String returnPolicy; + + /** + * 退货凭证 + */ + private String returnVoucher; + + /** + * 收货状态:0、未收到,1、已收到 + */ + private Integer receivingStatus; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java index c0d2a60..380efa4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/dataobject/storeorder/StoreOrderDO.java @@ -1,26 +1,14 @@ package co.yixiang.yshop.module.order.dal.dataobject.storeorder; -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; /** * 订单 DO @@ -101,7 +89,7 @@ public class StoreOrderDO extends BaseDO { /** * 优惠券id */ - private Integer couponId; + private Long couponId; /** * 优惠券金额 */ @@ -245,4 +233,9 @@ public class StoreOrderDO extends BaseDO { */ private Integer isSystemDel; + /** + * 支付信息 + */ + private String payInfo; + } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeaftersales/StoreAfterSalesMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeaftersales/StoreAfterSalesMapper.java index 814916c..66ab55e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeaftersales/StoreAfterSalesMapper.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeaftersales/StoreAfterSalesMapper.java @@ -21,15 +21,15 @@ public interface StoreAfterSalesMapper extends BaseMapperX { LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX(); wrapper.eqIfPresent(StoreAfterSalesDO::getOrderCode, reqVO.getOrderCode()) .orderByDesc(StoreAfterSalesDO::getId); - if(reqVO.getType() != null){ + if (reqVO.getType() != null && reqVO.getType() != -1) { switch (AdminAfterOrderStatusEnum.toType(reqVO.getType())) { //售后中 - case STATUS_1: - wrapper.ne(StoreAfterSalesDO::getState, AfterSalesStatusEnum.STATUS_3.getValue()); + case AFTER_SALES: + wrapper.ne(StoreAfterSalesDO::getState, AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); break; //已完成 - case STATUS_2: - wrapper.eq(StoreAfterSalesDO::getState, AfterSalesStatusEnum.STATUS_3.getValue()); + case COMPLETED: + wrapper.eq(StoreAfterSalesDO::getState, AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); break; default: @@ -39,5 +39,4 @@ public interface StoreAfterSalesMapper extends BaseMapperX { } - } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java index 6c10cde..75b418b 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/mysql/storeorder/StoreOrderMapper.java @@ -10,7 +10,6 @@ import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.enums.AdminOrderStatusEnum; -import co.yixiang.yshop.module.order.enums.OrderStatusEnum; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Mapper; @@ -38,38 +37,38 @@ public interface StoreOrderMapper extends BaseMapperX { switch (AdminOrderStatusEnum.toType(reqVO.getOrderStatus())) { //未支付 case STATUS_0: - wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_0.getValue()) - .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_0.getValue()) - .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_0.getValue()); + wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_UNPAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_DEFAULT.getValue()); break; //待发货 case STATUS_1: - wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_1.getValue()) - .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_0.getValue()) - .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_0.getValue()); + wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_DEFAULT.getValue()); break; //待收货 case STATUS_2: - wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_1.getValue()) - .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_0.getValue()) - .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_1.getValue()); + wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_WAIT_RECEIVED.getValue()); break; //待评价 case STATUS_3: - wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_1.getValue()) - .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_0.getValue()) - .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_2.getValue()); + wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_RECEIVED.getValue()); break; //已完成 case STATUS_4: - wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_1.getValue()) - .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_0.getValue()) - .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_3.getValue()); + wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_FINISHED.getValue()); break; //已退款 case STATUS_5: - wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_0.getValue()) - .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_2.getValue()); + wrapper.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_UNPAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_HAVE_REFUNDED.getValue()); break; //已删除 case STATUS_6: diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/order/AsyncCountRedisDAO.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/order/AsyncCountRedisDAO.java index ce7e592..e607b8e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/order/AsyncCountRedisDAO.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/dal/redis/order/AsyncCountRedisDAO.java @@ -32,7 +32,7 @@ public class AsyncCountRedisDAO { stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(orderTimeDataDto)); } - public void delete(Long uid) { + public void delete() { String redisKey = YSHOP_ADMIN_ORDER_COUNT_CACHE_KEY.getKeyTemplate(); stringRedisTemplate.delete(redisKey); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java index 07de673..795c7ba 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/handle/RedisDelayHandle.java @@ -18,6 +18,7 @@ import java.util.concurrent.ThreadFactory; /** * 延时队列消费 + * * @author hupeng * @date 2023.7.27 */ @@ -29,6 +30,7 @@ public class RedisDelayHandle { @Resource private AppStoreOrderService appStoreOrderService; + @PostConstruct public void startJobTimer() { ThreadFactory threadFactory = new ThreadFactoryBuilder().setNamePrefix("delay-job-service").build(); @@ -40,31 +42,49 @@ public class RedisDelayHandle { .setThreadFactory(threadFactory) .build(); - executorService.execute(new ExecutorTask()); + executorService.execute(new ExecutorTaskUnPay()); + executorService.execute(new ExecutorTaskUnConfirm()); } - class ExecutorTask implements Runnable { + class ExecutorTaskUnPay implements Runnable { @SneakyThrows @Override public void run() { - RBlockingDeque blockingDeque = redissonClient + RBlockingDeque blockingUnPayDeque = redissonClient .getBlockingDeque(ShopConstants.REDIS_ORDER_OUTTIME_UNPAY_QUEUE); - RBlockingDeque blockingDeque2 = redissonClient + while (true) { + try { + log.info("======延时取消订单循环任务====="); + String unPayOrderId = blockingUnPayDeque.take(); + log.info("获取到未付款订单id:{}", unPayOrderId); + if (StrUtil.isNotEmpty(unPayOrderId)) { + appStoreOrderService.cancelOrder(unPayOrderId, null); + } + } catch (Exception e) { + log.error("延时取消订单消费失败,"+e.getMessage()); + } + + } + } + } + + class ExecutorTaskUnConfirm implements Runnable { + @SneakyThrows + @Override + public void run() { + RBlockingDeque blockingUnConfirmDeque = redissonClient .getBlockingDeque(ShopConstants.REDIS_ORDER_OUTTIME_UNCONFIRM); while (true) { - String orderId = ""; - String orderId2 = ""; + log.info("======延时确认收货循环任务====="); + String unConfirmOrderId = ""; try { - orderId = blockingDeque.take(); - orderId2 = blockingDeque2.take(); + unConfirmOrderId = blockingUnConfirmDeque.take(); + log.info("获取到待确认收货订单id:{}", unConfirmOrderId); } catch (Exception e) { - log.error(e.getMessage()); + log.error("延时确认收货失败,"+e.getMessage()); } - if(StrUtil.isNotEmpty(orderId)) { - appStoreOrderService.cancelOrder(orderId,null); - } - if(StrUtil.isNotEmpty(orderId2)) { - appStoreOrderService.takeOrder(orderId,null); + if (StrUtil.isNotEmpty(unConfirmOrderId)) { + appStoreOrderService.takeOrder(unConfirmOrderId, null); } } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayNoticeConsumer.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayNoticeConsumer.java index fe6663a..38cf16a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayNoticeConsumer.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/mq/consumer/PayNoticeConsumer.java @@ -20,8 +20,8 @@ public class PayNoticeConsumer extends AbstractStreamMessageListener { * @param userId 用户id * @param storeAfterSalesParam / */ - void applyForAfterSales(Long userId, AppStoreAfterSalesParam storeAfterSalesParam); + Long applyForAfterSales(Long userId, AppStoreAfterSalesParam storeAfterSalesParam); /** * 查询订单详情 @@ -31,16 +33,23 @@ public interface AppStoreAfterSalesService extends IService { */ List checkOrderDetails(String key); + /** + * 查询订单详情 + * @param key 售后单号 + * @return + */ + AppStoreOrderAfterSalesDetailVo checkAfterSalesDetails(String key); + /** * 查询列表 * @param uid 用户id - * @param status 状态 + * @param type 状态 * @param page 页 * @param orderCode * @param limit 数量 * @return */ - List salesList(Long uid, Integer status, Integer page, String orderCode, Integer limit); + List salesList(Long uid, Integer type, Integer page, String orderCode, Integer limit); /** * 查询详情 @@ -69,14 +78,10 @@ public interface AppStoreAfterSalesService extends IService { /** * 添加快递信息 * - * @param code 物流公司编码 - * @param name 物流公司名称 - * @param postalCode - * @param orderCode - * @param id + * @param param 退货物流参数 * @return */ - Boolean addLogisticsInformation(String code, String name, String postalCode ,String orderCode, Long id); + Boolean addLogisticsInformation(AppReturnLogisticsParam param); /** diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java index e8e7c21..643bc3e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersales/AppStoreAfterSalesServiceImpl.java @@ -1,16 +1,16 @@ package co.yixiang.yshop.module.order.service.storeaftersales; +import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; -import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.module.member.service.user.MemberUserService; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppProsuctParam; +import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppReturnLogisticsParam; import co.yixiang.yshop.module.order.controller.app.afterorder.param.AppStoreAfterSalesParam; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreAfterSalesVo; +import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderAfterSalesDetailVo; import co.yixiang.yshop.module.order.controller.app.afterorder.vo.AppStoreOrderCartInfoVo; import co.yixiang.yshop.module.order.convert.storeaftersales.StoreAfterSalesConvert; import co.yixiang.yshop.module.order.dal.dataobject.storeaftersales.StoreAfterSalesDO; @@ -18,19 +18,24 @@ import co.yixiang.yshop.module.order.dal.dataobject.storeaftersalesitem.StoreAft import co.yixiang.yshop.module.order.dal.dataobject.storeaftersalesstatus.StoreAfterSalesStatusDO; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderstatus.StoreOrderStatusDO; import co.yixiang.yshop.module.order.dal.mysql.storeaftersales.StoreAfterSalesMapper; import co.yixiang.yshop.module.order.dal.mysql.storeaftersalesitem.StoreAfterSalesItemMapper; import co.yixiang.yshop.module.order.dal.mysql.storeaftersalesstatus.StoreAfterSalesStatusMapper; import co.yixiang.yshop.module.order.dal.mysql.storeorder.StoreOrderMapper; import co.yixiang.yshop.module.order.dal.mysql.storeordercartinfo.StoreOrderCartInfoMapper; +import co.yixiang.yshop.module.order.dal.mysql.storeorderstatus.StoreOrderStatusMapper; import co.yixiang.yshop.module.order.dal.redis.ofterorder.AfterOrderRedisDAO; import co.yixiang.yshop.module.order.enums.AfterChangeTypeEnum; import co.yixiang.yshop.module.order.enums.AfterSalesStatusEnum; import co.yixiang.yshop.module.order.enums.AfterStatusEnum; +import co.yixiang.yshop.module.order.enums.OrderLogEnum; import co.yixiang.yshop.module.order.service.storeaftersalesstatus.StoreAfterSalesStatusService; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -42,13 +47,16 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; -import java.sql.Timestamp; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.order.enums.AfterSalesStatusEnum.USER_CANCELLED; import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.order.enums.OrderLogEnum.APPLY_AFTER_SALES; /** * 售后记录 Service 实现类 @@ -58,9 +66,6 @@ import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; @Service @Validated public class AppStoreAfterSalesServiceImpl extends ServiceImpl implements AppStoreAfterSalesService { - - @Resource - private StoreAfterSalesMapper storeAfterSalesMapper; @Resource private StoreOrderMapper storeOrderMapper; @Resource @@ -72,9 +77,9 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery() - .eq(StoreOrderDO::getOrderId, storeAfterSalesParam.getOrderCode()) - .eq(StoreOrderDO::getUid, userId)); - System.out.println("storeAfterSalesParam:"+storeAfterSalesParam); - afterOrderRedisDAO.set(userId,storeAfterSalesParam.getOrderCode(),yxStoreOrder.getStatus().toString()); + StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery().eq(StoreOrderDO::getOrderId, storeAfterSalesParam.getOrderId()).eq(StoreOrderDO::getUid, userId)); + System.out.println("storeAfterSalesParam:" + storeAfterSalesParam); + afterOrderRedisDAO.set(userId, storeAfterSalesParam.getOrderId(), yxStoreOrder.getStatus().toString()); checkOrder(yxStoreOrder); //商品除去优惠后的总价格 BigDecimal totalPrice = BigDecimal.ZERO; //拿到所有的商品 - List yxStoreOrderCartInfos = storeOrderCartInfoMapper - .selectList(Wrappers.lambdaQuery() - .eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); + List yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery().eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); for (StoreOrderCartInfoDO yxStoreOrderCartInfo : yxStoreOrderCartInfos) { AppStoreCartQueryVo cartInfo = JSONObject.parseObject(yxStoreOrderCartInfo.getCartInfo(), AppStoreCartQueryVo.class); - AppProsuctParam prosuctParam = storeAfterSalesParam.getProductParamList().stream() - .filter(item -> item.getProductId().equals(yxStoreOrderCartInfo.getProductId())) - .findFirst().orElse(new AppProsuctParam()); - if (prosuctParam.getProductId() != null) { + AppProsuctParam productParam = storeAfterSalesParam.getProductParamList().stream().filter(item -> item.getProductId().equals(yxStoreOrderCartInfo.getProductId())).findFirst().orElse(new AppProsuctParam()); + if (productParam.getProductId() != null) { //商品优惠前总金额 BigDecimal totalAmountOfGoods = NumberUtil.mul(cartInfo.getTruePrice(), cartInfo.getCartNum()); //商品优惠总金额 BigDecimal commodityDiscountAmount = NumberUtil.mul(NumberUtil.div(totalAmountOfGoods, NumberUtil.sub(yxStoreOrder.getTotalPrice(), yxStoreOrder.getPayPostage())), yxStoreOrder.getCouponPrice()); //商品优惠后总金额 totalPrice = NumberUtil.add(totalPrice, NumberUtil.sub(totalAmountOfGoods, commodityDiscountAmount)); - // todo 根据自己的业务逻辑修改,是否退运费,默认退运费 - totalPrice = NumberUtil.add(totalPrice, yxStoreOrder.getPayPostage()); + // todo 根据自己的业务逻辑修改,是否退运费,默认不退运费 + // 未收货退运费 + if (OrderInfoEnum.STATUS_DEFAULT.getValue().equals(yxStoreOrder.getStatus())) { + totalPrice = NumberUtil.add(totalPrice, yxStoreOrder.getPayPostage()); + } yxStoreOrderCartInfo.setIsAfterSales(0); storeOrderCartInfoMapper.updateById(yxStoreOrderCartInfo); } } //更新订单状态 - yxStoreOrder.setStatus(OrderInfoEnum.STATUS_NE1.getValue()); - yxStoreOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_1.getValue()); + yxStoreOrder.setStatus(OrderInfoEnum.STATUS_APPLY_REFUND.getValue()); + yxStoreOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_BEING_REFUNDED.getValue()); yxStoreOrder.setRefundReasonWap(storeAfterSalesParam.getReasonForApplication()); yxStoreOrder.setRefundReasonWapExplain(storeAfterSalesParam.getApplicationInstructions()); yxStoreOrder.setRefundReasonTime(LocalDateTime.now()); storeOrderMapper.updateById(yxStoreOrder); //生成售后订单 StoreAfterSalesDO storeAfterSales = new StoreAfterSalesDO(); - storeAfterSales.setOrderCode(storeAfterSalesParam.getOrderCode()); + storeAfterSales.setOrderCode(storeAfterSalesParam.getOrderId()); storeAfterSales.setRefundAmount(totalPrice); storeAfterSales.setServiceType(storeAfterSalesParam.getServiceType()); storeAfterSales.setReasons(storeAfterSalesParam.getReasonForApplication()); storeAfterSales.setExplains(storeAfterSalesParam.getApplicationInstructions()); storeAfterSales.setExplainImg(storeAfterSalesParam.getApplicationDescriptionPicture()); - storeAfterSales.setState(AfterSalesStatusEnum.STATUS_0.getValue()); - storeAfterSales.setSalesState(AfterStatusEnum.STATE_0.getValue()); + storeAfterSales.setState(AfterSalesStatusEnum.PENDING_REVIEW.getValue()); + // storeAfterSales.setSalesState(AfterStatusEnum.STATE_0.getValue()); + storeAfterSales.setReceivingStatus(storeAfterSalesParam.getReceivingStatus()); storeAfterSales.setCreateTime(LocalDateTime.now()); storeAfterSales.setUserId(userId); this.baseMapper.insert(storeAfterSales); //售后商品详情 - for (AppProsuctParam prosuctParam : storeAfterSalesParam.getProductParamList()) { - StoreOrderCartInfoDO yxStoreOrderCartInfo = yxStoreOrderCartInfos.stream() - .filter(item -> item.getProductId().equals(prosuctParam.getProductId())) - .findFirst().orElse(new StoreOrderCartInfoDO()); + for (AppProsuctParam productParam : storeAfterSalesParam.getProductParamList()) { + StoreOrderCartInfoDO yxStoreOrderCartInfo = yxStoreOrderCartInfos.stream().filter(item -> item.getProductId().equals(productParam.getProductId())).findFirst().orElse(new StoreOrderCartInfoDO()); StoreAfterSalesItemDO storeAfterSalesItem = new StoreAfterSalesItemDO(); storeAfterSalesItem.setStoreAfterSalesId(storeAfterSales.getId()); storeAfterSalesItem.setProductId(yxStoreOrderCartInfo.getProductId()); storeAfterSalesItem.setCartInfo(yxStoreOrderCartInfo.getCartInfo()); storeAfterSalesItemMapper.insert(storeAfterSalesItem); } - + StoreOrderStatusDO orderStatusDO = StoreOrderStatusDO.builder() + .oid(yxStoreOrder.getId()).changeType(APPLY_AFTER_SALES.getValue()) + .changeMessage(APPLY_AFTER_SALES.getDesc()).changeTime(LocalDateTime.now()).build(); + // 记录订单操作 + storeOrderStatusMapper.insert(orderStatusDO); //操作记录 - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_0.getValue(),AfterChangeTypeEnum.STATE_0.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId(), + AfterChangeTypeEnum.CREATE_AFTER_SALES.getValue(), AfterChangeTypeEnum.CREATE_AFTER_SALES.getDesc()); + return storeAfterSales.getId(); + } + /** + * 查询售后订单详情 + * + * @param key 售后单号 + * @return 订单详情列表 + */ + @Override + public AppStoreOrderAfterSalesDetailVo checkAfterSalesDetails(String key) { + // 查询售后信息 + StoreAfterSalesDO afterSales = this.getById(Integer.parseInt(key)); + // 查询订单信息 + StoreOrderDO storeOrderDO = storeOrderMapper.selectOne(Wrappers.lambdaQuery() + .eq(StoreOrderDO::getOrderId, afterSales.getOrderCode())); + + // 查询售后信息子项 + + List afterSalesItemDOS = + storeAfterSalesItemMapper.selectList(new LambdaUpdateWrapper() + .eq(StoreAfterSalesItemDO::getStoreAfterSalesId, afterSales.getId())); + + List cartInfo = + afterSalesItemDOS.stream().map(cart -> JSON.parseObject(cart.getCartInfo(), AppStoreCartQueryVo.class)) + .collect(Collectors.toList()); + + // 查询是否发货 + StoreOrderStatusDO orderStatusDO = + storeOrderStatusMapper.selectOne(new LambdaQueryWrapper() + .eq(StoreOrderStatusDO::getOid, storeOrderDO.getId()) + .eq(StoreOrderStatusDO::getChangeType, OrderLogEnum.DELIVERY_GOODS.getValue())); + + // 数据整合 + AppStoreOrderAfterSalesDetailVo result = + AppStoreOrderAfterSalesDetailVo.builder() + // 售后信息 + .refundAmount(afterSales.getRefundAmount()).reasons(afterSales.getReasons()) + .explains(afterSales.getExplains()).explainImg(afterSales.getExplainImg()) + .state(afterSales.getState()).salesState(afterSales.getSalesState()) + .realName(afterSales.getConsignee()) + .userPhone(afterSales.getPhoneNumber()) + .userAddress(afterSales.getAddress()) + .receivingStatus(afterSales.getReceivingStatus()) + .serviceType(afterSales.getServiceType()) + // 订单信息 + .id(storeOrderDO.getId()).orderId(storeOrderDO.getOrderId()).uid(storeOrderDO.getUid()) + .createTime(storeOrderDO.getCreateTime()) + .payPrice(storeOrderDO.getPayPrice()).totalPrice(storeOrderDO.getTotalPrice()) + .totalPostage(storeOrderDO.getTotalPostage()).deductionPrice(storeOrderDO.getDeductionPrice()) + .deliveryTime(orderStatusDO == null ? null : orderStatusDO.getChangeTime()) + .payTime(storeOrderDO.getPayTime()) + .couponPrice(storeOrderDO.getCouponPrice()) + // 商品数据 + .cartInfo(cartInfo) + // 物流数据 + .deliverySn(afterSales.getDeliverySn()).deliveryName(afterSales.getDeliveryName()) + .build(); + return result; } /** * 查询订单详情 + * * @param key 订单号 - * @return + * @return 订单详情列表 */ @Override public List checkOrderDetails(String key) { - List yxStoreOrderCartInfos = storeOrderCartInfoMapper - .selectList(Wrappers.lambdaQuery().eq(StoreOrderCartInfoDO::getOrderId, key)); - if(yxStoreOrderCartInfos == null || yxStoreOrderCartInfos.isEmpty()){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.and(i -> i.eq(StoreOrderCartInfoDO::getOrderId, key) + .or().eq(StoreOrderCartInfoDO::getUnique, key).or() + .eq(StoreOrderCartInfoDO::getOid, key)); + List yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(wrapper); + if (yxStoreOrderCartInfos == null || yxStoreOrderCartInfos.isEmpty()) { throw exception(STORE_ORDER_NOT_EXISTS); } - StoreOrderDO yxStoreOrder = storeOrderMapper.selectById(yxStoreOrderCartInfos.get(0).getId()); + StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery().eq(StoreOrderDO::getOrderId, yxStoreOrderCartInfos.get(0).getOrderId())); //查询 售后信息 - StoreAfterSalesDO storeAfterSales = this.baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(StoreAfterSalesDO::getOrderCode, yxStoreOrder.getOrderId())); +// StoreAfterSalesDO storeAfterSales = this.baseMapper.selectOne(Wrappers.lambdaQuery() +// .eq(StoreAfterSalesDO::getOrderCode, yxStoreOrder.getOrderId())); List yxStoreOrderCartInfoVos = new ArrayList<>(); for (StoreOrderCartInfoDO yxStoreOrderCartInfo : yxStoreOrderCartInfos) { - AppStoreOrderCartInfoVo yxStoreOrderCartInfoVo = new AppStoreOrderCartInfoVo(); yxStoreOrderCartInfoVo.setId(yxStoreOrderCartInfo.getId()); yxStoreOrderCartInfoVo.setOid(yxStoreOrderCartInfo.getOid()); + yxStoreOrderCartInfoVo.setOrderId(yxStoreOrderCartInfo.getOrderId()); yxStoreOrderCartInfoVo.setCartId(yxStoreOrderCartInfo.getCartId()); yxStoreOrderCartInfoVo.setProductId(yxStoreOrderCartInfo.getProductId()); AppStoreCartQueryVo cartInfo = JSONObject.parseObject(yxStoreOrderCartInfo.getCartInfo(), AppStoreCartQueryVo.class); @@ -188,10 +254,9 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl */ @Override - public List salesList(Long uid, Integer status, Integer page, String orderCode, Integer limit) { + public List salesList(Long uid, Integer type, Integer page, String orderCode, Integer limit) { Page storeAfterSalesPage = new Page<>(page, limit); - List integers = new ArrayList<>(); - if (status == 1) { - integers.add(AfterSalesStatusEnum.STATUS_0.getValue()); - integers.add(AfterSalesStatusEnum.STATUS_1.getValue()); - integers.add(AfterSalesStatusEnum.STATUS_2.getValue()); - }else if (status == 2) { - integers.add(AfterSalesStatusEnum.STATUS_3.getValue()); - }else { - integers.add(AfterSalesStatusEnum.STATUS_0.getValue()); - integers.add(AfterSalesStatusEnum.STATUS_1.getValue()); - integers.add(AfterSalesStatusEnum.STATUS_2.getValue()); - integers.add(AfterSalesStatusEnum.STATUS_3.getValue()); - } - baseMapper.selectPage(storeAfterSalesPage, Wrappers.lambdaQuery() - .eq(uid != null, StoreAfterSalesDO::getUserId, uid).in(status.equals(AfterSalesStatusEnum.STATUS_1.getValue()), StoreAfterSalesDO::getState, integers) - .in(!status.equals(AfterSalesStatusEnum.STATUS_0.getValue()), StoreAfterSalesDO::getState, integers) - .eq(StringUtils.isNotBlank(orderCode), StoreAfterSalesDO::getOrderCode, orderCode) - .orderByDesc(StoreAfterSalesDO::getCreateTime)); + List afterSalesStatusList = getAfterSalesStatus(type); + LambdaQueryWrapper wrappers = new LambdaQueryWrapper<>(); + wrappers.eq(uid != null, StoreAfterSalesDO::getUserId, uid) + .in(!type.equals(AfterSalesStatusEnum.PENDING_REVIEW.getValue()), StoreAfterSalesDO::getState, afterSalesStatusList) + .eq(StringUtils.isNotBlank(orderCode), StoreAfterSalesDO::getOrderCode, orderCode); + baseMapper.selectPage(storeAfterSalesPage, wrappers. + orderByDesc(StoreAfterSalesDO::getCreateTime)); - List storeAfterSalesVos = StoreAfterSalesConvert.INSTANCE.convertList1(storeAfterSalesPage.getRecords()); + List storeAfterSalesVos = + StoreAfterSalesConvert.INSTANCE.convertList1(storeAfterSalesPage.getRecords()); return storeAfterSalesVos.stream().map(this::handleSales).collect(Collectors.toList()); } + private static List getAfterSalesStatus(Integer status) { + List afterSalesStatusList = new ArrayList<>(); + if (status == 1) { + afterSalesStatusList.add(AfterSalesStatusEnum.PENDING_REVIEW.getValue()); + afterSalesStatusList.add(AfterSalesStatusEnum.AUDITED.getValue()); + afterSalesStatusList.add(AfterSalesStatusEnum.USER_SHIPPED.getValue()); + afterSalesStatusList.add(AfterSalesStatusEnum.MERCHANT_REJECTION.getValue()); + } else if (status == 2) { + afterSalesStatusList.add(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); + afterSalesStatusList.add(AfterSalesStatusEnum.USER_CANCELLED.getValue()); + } else { + afterSalesStatusList.addAll(Arrays.stream(AfterSalesStatusEnum.values()) + .map(AfterSalesStatusEnum::getValue).collect(Collectors.toList())); + } + return afterSalesStatusList; + } + /** * 查询详情 + * * @param key 订单号 - * @param id 售后单id + * @param id 售后单id * @param uid 用户id */ @Override @@ -253,7 +326,8 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery() .eq(id != null, StoreAfterSalesDO::getId, id) - .eq(StoreAfterSalesDO::getUserId, uid).eq(StoreAfterSalesDO::getOrderCode, key)); + .eq(StoreAfterSalesDO::getUserId, uid) + .eq(StoreAfterSalesDO::getOrderCode, key)); AppStoreAfterSalesVo salesVo = StoreAfterSalesConvert.INSTANCE.convert1(storeAfterSales); return this.handleSales(salesVo); @@ -261,6 +335,7 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl storeAfterSales = baseMapper.selectList(Wrappers.lambdaQuery().eq(StoreAfterSalesDO::getUserId, uid).eq(StoreAfterSalesDO::getOrderCode, key)); + List storeAfterSales = baseMapper.selectList(Wrappers.lambdaQuery() + .eq(StoreAfterSalesDO::getUserId, uid) + .eq(StoreAfterSalesDO::getOrderCode, key)); if (ObjectUtil.isNull(storeAfterSales)) { throw exception(STORE_AFTER_SALES_NOT_EXISTS); } List list = StoreAfterSalesConvert.INSTANCE.convertList1(storeAfterSales); - list.forEach(item -> - this.handleSales(item) - ); + list.forEach(this::handleSales); return list; } /** * 撤销申请 + * * @param key 订单号 * @param uid 用户id - * @param id Long + * @param id Long * @return Boolean */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public Boolean revoke(String key, Long uid, Long id) { - StoreAfterSalesDO storeAfterSales = this.baseMapper.selectOne(Wrappers.lambdaQuery(). - eq(StoreAfterSalesDO::getUserId, uid).eq(StoreAfterSalesDO::getId, id) + StoreAfterSalesDO storeAfterSales = this.baseMapper.selectOne(Wrappers.lambdaQuery() + .eq(StoreAfterSalesDO::getUserId, uid) + .eq(StoreAfterSalesDO::getId, id) .eq(StoreAfterSalesDO::getOrderCode, key)); if (StrUtil.isEmpty(key)) { throw exception(PARAM_ERROR); @@ -300,72 +377,66 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery().eq(StoreOrderDO::getOrderId, key)); - String o = afterOrderRedisDAO.get(key,uid); + String o = afterOrderRedisDAO.get(key, uid); yxStoreOrder.setStatus(o == null ? 0 : Integer.parseInt(o)); - yxStoreOrder.setRefundStatus(OrderInfoEnum.STATUS_0.getValue()); + yxStoreOrder.setRefundStatus(OrderInfoEnum.STATUS_DEFAULT.getValue()); storeOrderMapper.updateById(yxStoreOrder); List yxStoreOrderCartInfos = storeOrderCartInfoMapper.selectList(Wrappers.lambdaQuery() .eq(StoreOrderCartInfoDO::getOid, yxStoreOrder.getId())); for (StoreOrderCartInfoDO yxStoreOrderCartInfo : yxStoreOrderCartInfos) { - yxStoreOrderCartInfo.setIsAfterSales(ShopCommonEnum.IS_STATUS_1.getValue()); + yxStoreOrderCartInfo.setIsAfterSales(ShopCommonEnum.YES.getValue()); storeOrderCartInfoMapper.updateById(yxStoreOrderCartInfo); } //操作记录 - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_5.getValue(),AfterChangeTypeEnum.STATE_5.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId(), + AfterChangeTypeEnum.USER_REVOCATION.getValue(), AfterChangeTypeEnum.USER_REVOCATION.getDesc()); - afterOrderRedisDAO.delete(key,uid); + afterOrderRedisDAO.delete(key, uid); return baseMapper.updateById(storeAfterSales) > 0; } /** * 添加快递信息 * - * @param code 物流公司编码 - * @param name 物流公司名称 - * @param postalCode - * @param orderCode - * @param id - * @return + * @param param 退货物流参数 */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public Boolean addLogisticsInformation(String code, String name, String postalCode, String orderCode, Long id) { - if (StrUtil.isEmpty(code) || StrUtil.isEmpty(name) || StrUtil.isEmpty(postalCode)) { - throw exception(PARAM_ERROR); - } + public Boolean addLogisticsInformation(AppReturnLogisticsParam param) { StoreAfterSalesDO storeAfterSales = this.baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(StoreAfterSalesDO::getId, id) - .eq(StoreAfterSalesDO::getOrderCode, orderCode) - ); - if (!storeAfterSales.getState().equals(AfterSalesStatusEnum.STATUS_1.getValue())) { + .eq(StoreAfterSalesDO::getId, param.getId()) + .eq(StoreAfterSalesDO::getOrderCode, param.getOrderCode())); + if (!storeAfterSales.getState().equals(AfterSalesStatusEnum.AUDITED.getValue())) { throw exception(ORDER_STATUS_NOT_EXPRESS_); } - storeAfterSales.setShipperCode(code); - storeAfterSales.setDeliverySn(postalCode); - storeAfterSales.setDeliveryName(name); - storeAfterSales.setState(AfterSalesStatusEnum.STATUS_2.getValue()); + storeAfterSales.setShipperCode(param.getCode()); + storeAfterSales.setDeliverySn(param.getPostalCode()); + storeAfterSales.setDeliveryName(param.getName()); + storeAfterSales.setReturnPolicy(param.getReturnPolicy()); + storeAfterSales.setReturnVoucher(param.getReturnVoucher()); + storeAfterSales.setState(AfterSalesStatusEnum.USER_SHIPPED.getValue()); //操作记录 - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_2.getValue(),AfterChangeTypeEnum.STATE_2.getDesc()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(), storeAfterSales.getId(), + AfterChangeTypeEnum.USER_SHIPMENT.getValue(), AfterChangeTypeEnum.USER_SHIPMENT.getDesc()); return baseMapper.updateById(storeAfterSales) > 0; } /** * 删除售后订单 + * * @param orderCode / - * @param id + * @param id 售后订单id * @return / */ @Override @@ -373,7 +444,9 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery().eq(StoreAfterSalesDO::getId, id).eq(StoreAfterSalesDO::getOrderCode, orderCode)); + StoreAfterSalesDO storeAfterSales = this.baseMapper.selectOne(Wrappers.lambdaQuery() + .eq(StoreAfterSalesDO::getId, id) + .eq(StoreAfterSalesDO::getOrderCode, orderCode)); return baseMapper.deleteById(storeAfterSales.getId()) > 0; } @@ -384,22 +457,22 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpl storeAfterSalesItems = storeAfterSalesItemMapper - .selectList(Wrappers.lambdaQuery() - .eq(StoreAfterSalesItemDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); - List cartInfo = storeAfterSalesItems.stream() - .map(cart -> JSON.parseObject(cart.getCartInfo(), AppStoreCartQueryVo.class)) - .collect(Collectors.toList()); + List storeAfterSalesItems = storeAfterSalesItemMapper.selectList(Wrappers.lambdaQuery().eq(StoreAfterSalesItemDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); + List cartInfo = storeAfterSalesItems.stream().map(cart -> JSON.parseObject(cart.getCartInfo(), AppStoreCartQueryVo.class)).collect(Collectors.toList()); storeAfterSalesVo.setCartInfo(cartInfo); - List storeAfterSalesStatuses = storeAfterSalesStatusMapper - .selectList(Wrappers.lambdaQuery() - .eq(StoreAfterSalesStatusDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); + List storeAfterSalesStatuses = storeAfterSalesStatusMapper.selectList(Wrappers.lambdaQuery().eq(StoreAfterSalesStatusDO::getStoreAfterSalesId, storeAfterSalesVo.getId())); - storeAfterSalesVo.setCompleteTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 3).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); - storeAfterSalesVo.setDeliveryTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 2).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); - storeAfterSalesVo.setAuditFailedTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 4).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); - storeAfterSalesVo.setReviewTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 1).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); - storeAfterSalesVo.setRevocationTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 5).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); + StoreOrderDO storeOrderDO = + storeOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(StoreOrderDO::getOrderId, storeAfterSalesVo.getOrderCode())); + if(storeOrderDO!= null ) { + storeAfterSalesVo.setOrderId(storeOrderDO.getId()); + storeAfterSalesVo.setCompleteTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 3).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); + storeAfterSalesVo.setDeliveryTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 2).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); + storeAfterSalesVo.setAuditFailedTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 4).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); + storeAfterSalesVo.setReviewTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 1).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); + storeAfterSalesVo.setRevocationTime(storeAfterSalesStatuses.stream().filter(item -> item.getChangeType() == 5).findFirst().orElse(new StoreAfterSalesStatusDO()).getChangeTime()); + } return storeAfterSalesVo; } @@ -413,9 +486,7 @@ public class AppStoreAfterSalesServiceImpl extends ServiceImpllambdaQuery() .eq(StoreAfterSalesDO::getOrderCode, orderCode).eq(StoreAfterSalesDO::getId, salesId)); //审核成功 - if (AfterTypeEnum.TYPE_1.getValue().equals(approvalStatus)) { - storeAfterSales.setState(AfterSalesStatusEnum.STATUS_1.getValue()); + if (AfterTypeEnum.AGREE.getValue().equals(approvalStatus)) { //退货退款 - if(AfterTypeEnum.SERVICE_TYPE_1.getValue().equals(storeAfterSales.getServiceType())) { - if (StringUtils.isEmpty(consignee) || StringUtils.isEmpty(phoneNumber) || StringUtils.isEmpty(address)) { - throw exception(ORDER_ADDRESS_REQUERED); - } - storeAfterSales.setConsignee(consignee); - storeAfterSales.setPhoneNumber(phoneNumber); - storeAfterSales.setAddress(address); + if(AfterTypeEnum.RETURNS_REFUNDS.getValue().equals(storeAfterSales.getServiceType())) { + if(Objects.equals(AfterSalesStatusEnum.USER_SHIPPED.getValue(), storeAfterSales.getState())){ + //退款金额大于0才生成退款单 + appStoreOrderService.orderRefund(storeAfterSales.getOrderCode(), storeAfterSales.getRefundAmount()); + storeAfterSales.setState(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() + ,AfterChangeTypeEnum.PAYMENT.getValue(),AfterChangeTypeEnum.PAYMENT.getDesc()); + }else { + if (StringUtils.isEmpty(consignee) || StringUtils.isEmpty(phoneNumber) || StringUtils.isEmpty(address)) { + throw exception(ORDER_ADDRESS_REQUERED); + } + storeAfterSales.setConsignee(consignee); + storeAfterSales.setPhoneNumber(phoneNumber); + storeAfterSales.setAddress(address); + storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() + ,AfterChangeTypeEnum.AUDIT_SUCCESS.getValue(),AfterChangeTypeEnum.AUDIT_SUCCESS.getDesc()); - storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_1.getValue(),AfterChangeTypeEnum.STATE_1.getDesc()); + storeAfterSales.setState(AfterSalesStatusEnum.AUDITED.getValue()); + } //退款退货得后面一步同意退款才退 }else { //仅仅退款直接退款 appStoreOrderService.orderRefund(storeAfterSales.getOrderCode(),storeAfterSales.getRefundAmount()); - storeAfterSales.setState(AfterSalesStatusEnum.STATUS_3.getValue()); + storeAfterSales.setState(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_3.getValue(),AfterChangeTypeEnum.STATE_3.getDesc()); + ,AfterChangeTypeEnum.PAYMENT.getValue(),AfterChangeTypeEnum.PAYMENT.getDesc()); } } else {//拒绝 - storeAfterSales.setState(AfterSalesStatusEnum.STATUS_3.getValue()); - storeAfterSales.setSalesState(AfterTypeEnum.TYPE_2.getValue()); + storeAfterSales.setState(AfterSalesStatusEnum.MERCHANT_REJECTION.getValue()); + // storeAfterSales.setSalesState(AfterTypeEnum.REFUSE.getValue()); //操作记录 storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_4.getValue(),AfterChangeTypeEnum.STATE_4.getDesc()); + ,AfterChangeTypeEnum.AUDIT_FAILED.getValue(),AfterChangeTypeEnum.AUDIT_FAILED.getDesc()); StoreOrderDO yxStoreOrder = storeOrderMapper.selectOne(Wrappers.lambdaQuery().eq(StoreOrderDO::getOrderId, storeAfterSales.getOrderCode())); String o = afterOrderRedisDAO.get(storeAfterSales.getOrderCode(),storeAfterSales.getUserId()); yxStoreOrder.setStatus(o == null ? 0 : Integer.parseInt(o)); - yxStoreOrder.setRefundStatus(OrderInfoEnum.STATUS_0.getValue()); + yxStoreOrder.setRefundStatus(OrderInfoEnum.STATUS_DEFAULT.getValue()); storeOrderMapper.updateById(yxStoreOrder); afterOrderRedisDAO.delete(storeAfterSales.getOrderCode(),storeAfterSales.getUserId()); @@ -132,14 +139,14 @@ public class StoreAfterSalesServiceImpl implements StoreAfterSalesService { * @param id 编号 */ @Override - public void payStoreAfterSales(Long id){ + public void payStoreAfterSales(Long id) throws Exception{ StoreAfterSalesDO storeAfterSales = storeAfterSalesMapper.selectOne(Wrappers.lambdaQuery() .eq(StoreAfterSalesDO::getId, id)); appStoreOrderService.orderRefund(storeAfterSales.getOrderCode(),storeAfterSales.getRefundAmount()); - storeAfterSales.setState(AfterSalesStatusEnum.STATUS_3.getValue()); + storeAfterSales.setState(AfterSalesStatusEnum.REFUND_SUCCESS.getValue()); storeAfterSalesStatusService.create(storeAfterSales.getUserId(),storeAfterSales.getId() - ,AfterChangeTypeEnum.STATE_3.getValue(),AfterChangeTypeEnum.STATE_3.getDesc()); + ,AfterChangeTypeEnum.PAYMENT.getValue(),AfterChangeTypeEnum.PAYMENT.getDesc()); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusService.java index 1f2721e..d00e414 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusService.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusService.java @@ -11,9 +11,9 @@ public interface StoreAfterSalesStatusService { /** * 添加订单操作记录 * @param oid 售后id - * @param changetype 操作状态 + * @param changeType 操作状态 * @param changeMessage 操作内容 */ - void create(Long uid,Long oid,Integer changetype,String changeMessage); + void create(Long uid,Long oid,Integer changeType,String changeMessage); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusServiceImpl.java index 26950bc..3554eb3 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeaftersalesstatus/StoreAfterSalesStatusServiceImpl.java @@ -9,6 +9,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.Objects; import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -28,23 +29,20 @@ public class StoreAfterSalesStatusServiceImpl implements StoreAfterSalesStatusSe /** * 添加订单操作记录 * @param oid 售后id - * @param changetype 操作状态 + * @param changeType 操作状态 * @param changeMessage 操作内容 */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public void create(Long uid,Long oid, Integer changetype, String changeMessage) { + public void create(Long uid,Long oid, Integer changeType, String changeMessage) { StoreAfterSalesStatusDO storeAfterSalesStatus = new StoreAfterSalesStatusDO(); storeAfterSalesStatus.setStoreAfterSalesId(oid); - storeAfterSalesStatus.setChangeType(changetype); + storeAfterSalesStatus.setChangeType(changeType); storeAfterSalesStatus.setChangeMessage(changeMessage); storeAfterSalesStatus.setChangeTime(LocalDateTime.now()); - storeAfterSalesStatus.setOperator(getLoginUserId().toString()); + storeAfterSalesStatus.setOperator(Objects.requireNonNull(getLoginUserId()).toString()); storeAfterSalesStatusMapper.insert(storeAfterSalesStatus); - - - } } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java index 18bb00c..644a56a 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderService.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.order.service.storeorder; import co.yixiang.yshop.module.order.controller.app.order.param.AppComputeOrderParam; +import co.yixiang.yshop.module.order.controller.app.order.param.AppConfirmOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppPayParam; import co.yixiang.yshop.module.order.controller.app.order.vo.AppConfirmOrderVo; @@ -8,7 +9,10 @@ import co.yixiang.yshop.module.order.controller.app.order.vo.AppStoreOrderQueryV import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import com.baomidou.mybatisplus.extension.service.IService; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; +import java.text.ParseException; import java.util.List; import java.util.Map; @@ -21,10 +25,10 @@ public interface AppStoreOrderService extends IService { /** * 返回订单确认数据 * @param uid 用户ID - * @param cartIds 购物车id + * @param param * @return ConfirmOrderVO */ - AppConfirmOrderVo confirmOrder(Long uid, String cartIds); + AppConfirmOrderVo confirmOrder(Long uid, AppConfirmOrderParam param); /** @@ -54,12 +58,25 @@ public interface AppStoreOrderService extends IService { Map createOrder(Long uid, String key, AppOrderParam param); + /** + * 第三方支付查单 + * @param param 订单 + * @param uid 用户id + */ + Boolean orderQuery(Long uid, AppPayParam param) throws Exception; + + /** * 第三方支付 * @param param 订单 * @param uid 用户id */ - Map pay(Long uid, AppPayParam param); + Map pay(Long uid, AppPayParam param) throws Exception; + + /** + * 微信支付回调 + */ + void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception; /** @@ -133,7 +150,7 @@ public interface AppStoreOrderService extends IService { * @param orderId 单号 * @param price 金额 */ - void orderRefund(String orderId, BigDecimal price); + void orderRefund(String orderId, BigDecimal price) throws Exception; diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java index 415807e..ba5056c 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java @@ -1,6 +1,5 @@ package co.yixiang.yshop.module.order.service.storeorder; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; @@ -9,6 +8,8 @@ import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.framework.common.exception.ErrorCode; +import co.yixiang.yshop.framework.common.util.json.JsonUtils; +import co.yixiang.yshop.framework.common.util.servlet.ServletUtils; import co.yixiang.yshop.module.cart.service.storecart.AppStoreCartService; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; @@ -20,29 +21,44 @@ import co.yixiang.yshop.module.member.service.userbill.UserBillService; import co.yixiang.yshop.module.message.enums.WechatTempateEnum; import co.yixiang.yshop.module.message.mq.producer.WeixinNoticeProducer; import co.yixiang.yshop.module.order.controller.app.order.param.AppComputeOrderParam; +import co.yixiang.yshop.module.order.controller.app.order.param.AppConfirmOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppOrderParam; import co.yixiang.yshop.module.order.controller.app.order.param.AppPayParam; import co.yixiang.yshop.module.order.controller.app.order.vo.AppComputeVo; import co.yixiang.yshop.module.order.controller.app.order.vo.AppConfirmOrderVo; import co.yixiang.yshop.module.order.controller.app.order.vo.AppStoreOrderQueryVo; +import co.yixiang.yshop.module.order.controller.app.order.vo.PayInfo; import co.yixiang.yshop.module.order.convert.storeorder.StoreOrderConvert; import co.yixiang.yshop.module.order.dal.dataobject.storeorder.StoreOrderDO; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; +import co.yixiang.yshop.module.order.dal.dataobject.storeorderstatus.StoreOrderStatusDO; import co.yixiang.yshop.module.order.dal.mysql.storeorder.StoreOrderMapper; +import co.yixiang.yshop.module.order.dal.mysql.storeorderstatus.StoreOrderStatusMapper; import co.yixiang.yshop.module.order.dal.redis.order.OrderRedisDAO; import co.yixiang.yshop.module.order.enums.*; import co.yixiang.yshop.module.order.service.storeorder.dto.*; import co.yixiang.yshop.module.order.service.storeordercartinfo.StoreOrderCartInfoService; import co.yixiang.yshop.module.order.service.storeorderstatus.StoreOrderStatusService; +import co.yixiang.yshop.module.pay.PayContext; +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; -import co.yixiang.yshop.module.pay.mq.producer.PayNoticeProducer; import co.yixiang.yshop.module.pay.service.merchantdetails.MerchantDetailsService; +import co.yixiang.yshop.module.pay.strategy.PayEnum; +import co.yixiang.yshop.module.pay.strategy.weixin.service.WxPayService; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.HttpKit; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentApi; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentKit; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.RandomStringUtil; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplates.ShippingTemplatesDO; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplatesfree.ShippingTemplatesFreeDO; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplatesregion.ShippingTemplatesRegionDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductreply.StoreProductReplyDO; +import co.yixiang.yshop.module.product.service.productcoupon.ProductCouponService; +import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; +import co.yixiang.yshop.module.product.service.productcouponrelation.dto.CartCouponDto; import co.yixiang.yshop.module.product.service.shippingtemplates.ShippingTemplatesService; import co.yixiang.yshop.module.product.service.shippingtemplatesfree.ShippingTemplatesFreeService; import co.yixiang.yshop.module.product.service.shippingtemplatesregion.ShippingTemplatesRegionService; @@ -52,35 +68,36 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.egzosn.pay.common.bean.RefundOrder; -import com.egzosn.pay.common.bean.RefundResult; -import com.egzosn.pay.spring.boot.core.PayServiceManager; -import com.egzosn.pay.spring.boot.core.bean.MerchantPayOrder; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.redisson.api.RBlockingDeque; import org.redisson.api.RDelayedQueue; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.io.UnsupportedEncodingException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; -import java.net.URLEncoder; import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_ADDRESS_NOT_EXISTS; import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; @@ -92,7 +109,7 @@ import static co.yixiang.yshop.module.order.enums.ErrorCodeConstants.*; @Slf4j @Service @Validated -public class AppStoreOrderServiceImpl extends ServiceImpl implements AppStoreOrderService { +public class AppStoreOrderServiceImpl extends ServiceImpl implements AppStoreOrderService { @Resource private StoreOrderMapper storeOrderMapper; @@ -107,7 +124,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartGroup = appStoreCartService.getUserProductCartList(uid, - cartIds, ShopConstants.YSHOP_ONE_NUM); + param.getCartId(), ShopConstants.YSHOP_ONE_NUM); if (ObjectUtil.isNotEmpty(cartGroup.get("invalid"))) { throw exception(INVALID_PRODUCT); } @@ -158,21 +186,23 @@ public class AppStoreOrderServiceImpl extends ServiceImpllambdaQuery() .eq(UserAddressDO::getUid, uid) - .eq(UserAddressDO::getIsDefault, ShopCommonEnum.DEFAULT_1.getValue()), false); + .eq(param.getAddressId() != null, UserAddressDO::getId, param.getAddressId()) + .eq(param.getAddressId() == null, UserAddressDO::getIsDefault, ShopCommonEnum.IS_DEFAULT.getValue())); List cartInfo = (List) cartGroup.get("valid"); - PriceGroupDto priceGroup = this.getOrderPriceGroup(cartInfo, userAddress); + PriceGroupDto priceGroup = this.getOrderPriceGroup(cartInfo, userAddress, param.getCouponId()); //缓存订单 CacheDto cacheDTO = new CacheDto(); cacheDTO.setCartInfo(cartInfo); cacheDTO.setPriceGroup(priceGroup); - String cacheKey = orderRedisDAO.set(cacheDTO,uid); + //订单信息redis缓存一个小时 + String cacheKey = orderRedisDAO.set(cacheDTO, uid); //获取用户信息 - AppUserQueryVo appUserQueryVo = userService.getAppUser(uid); + AppUserQueryVo appUserQueryVo = memberUserService.getAppUser(uid); return AppConfirmOrderVo.builder() .addressInfo(userAddress) @@ -203,24 +233,22 @@ public class AppStoreOrderServiceImpl extends ServiceImpl computedOrder(Long uid, String key, AppComputeOrderParam param) { //检查订单 - Map map = this.check(uid,key,param); + Map map = this.check(uid, key, param); if (OrderLogEnum.EXTEND_ORDER.getValue().equals(map.get("status"))) { return map; } @@ -228,22 +256,22 @@ public class AppStoreOrderServiceImpl extends ServiceImpl map = this.computedOrder(uid, key, appComputeOrderParam); + Map map = this.computedOrder(uid, key, appComputeOrderParam); - if(!OrderLogEnum.NONE_ORDER.getValue().equals(map.get("status"))) { + if (!OrderLogEnum.NONE_ORDER.getValue().equals(map.get("status"))) { return map; } - AppComputeVo computeVo = (AppComputeVo)map.get("result"); + AppComputeVo computeVo = (AppComputeVo) map.get("result"); if (StrUtil.isEmpty(param.getAddressId())) { throw exception(SELECT_ADDRESS); } @@ -308,7 +336,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl blockingDeque = redissonClient.getBlockingDeque(ShopConstants.REDIS_ORDER_OUTTIME_UNPAY_QUEUE); RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); - delayedQueue.offer(orderSn, ShopConstants.ORDER_OUTTIME_UNPAY, TimeUnit.MINUTES); + delayedQueue.offer(orderId, ShopConstants.ORDER_OUTTIME_UNPAY, TimeUnit.MINUTES); String s = TimeUnit.SECONDS.toSeconds(ShopConstants.ORDER_OUTTIME_UNPAY) + "分钟"; - log.info("添加延时队列成功 ,延迟时间:" + s); + log.info("添加延时队列成功 ,延迟时间:" + s + "订单id: " + orderId); } catch (Exception e) { log.error(e.getMessage()); } @@ -406,85 +440,157 @@ public class AppStoreOrderServiceImpl extends ServiceImpl pay(Long uid, AppPayParam param) { + public Boolean orderQuery(Long uid, AppPayParam param) { AppStoreOrderQueryVo orderInfo = getOrderInfo(param.getUni(), uid); if (ObjectUtil.isNull(orderInfo)) { throw exception(STORE_ORDER_NOT_EXISTS); } - if(orderInfo.getPaid().equals(OrderInfoEnum.PAY_STATUS_1.getValue())) { + if (orderInfo.getPaid().equals(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue())) { throw exception(ORDER_PAY_FINISH); } - - MemberUserDO memberUserDO = userService.getUser(uid); - Map map = new LinkedHashMap<>(); - switch (PayTypeEnum.toType(param.getPaytype())){ - case WEIXIN: - if(AppFromEnum.H5.getValue().equals(param.getFrom())){ - MerchantPayOrder payOrder = new MerchantPayOrder("4", "MWEB", "h5商品购买", - "h5商品购买", orderInfo.getPayPrice(), param.getUni()); - - Map payOrderInfo = manager.getOrderInfo(payOrder); - MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); - //System.out.println("merchantDetailsDO:"+merchantDetailsDO); - String url = merchantDetailsDO.getReturnUrl(); - - String newUrl = ""; - try { - newUrl = String.format("%s%s", payOrderInfo.get("mweb_url"), "&redirect_url=" + URLEncoder.encode(url,"UTF-8")); - } catch (UnsupportedEncodingException e) { - log.error(e.getMessage()); - // e.printStackTrace(); - } - map.put("data",newUrl); - } else if(AppFromEnum.ROUNTINE.getValue().equals(param.getFrom())){ - MerchantPayOrder payOrder = new MerchantPayOrder("3", "JSAPI", "小程序商品购买", - "小程序商品购买", orderInfo.getPayPrice(), param.getUni()); - - //System.out.println(manager.getOrderInfo(payOrder)); - payOrder.setOpenid(memberUserDO.getRoutineOpenid()); - // System.out.println("payOrder:"+manager.getOrderInfo(payOrder)); - //log.error(); - map.put("data",manager.getOrderInfo(payOrder)); - - }else if(AppFromEnum.APP.getValue().equals(param.getFrom())){ - //app支付 - MerchantPayOrder payOrder = new MerchantPayOrder("5", "APP", "APP商品购买", - "APP5商品购买", orderInfo.getPayPrice(), param.getUni()); - map.put("data",manager.app(payOrder)); - - }else{//公众号 - //detailId 是后台数据库添加当服务商id - MerchantPayOrder payOrder = new MerchantPayOrder("3", "JSAPI", "公众号商品购买", - "公众号商品购买", orderInfo.getPayPrice(), param.getUni()); - payOrder.setOpenid(memberUserDO.getOpenid()); - map.put("data",manager.getOrderInfo(payOrder)); - } - break; - case YUE: - this.yuePay(param.getUni(), uid); - map.put("status","ok"); - break; - case ALI: - //h5支付 - if(AppFromEnum.H5.getValue().equals(param.getFrom())){ - MerchantPayOrder payOrder = new MerchantPayOrder("1", "WAP", "支付宝H5商品购买", - "h5商品购买", orderInfo.getPayPrice(), param.getUni()); - map.put("data",manager.toPay(payOrder)); - }else if(AppFromEnum.APP.getValue().equals(param.getFrom())){ - MerchantPayOrder payOrder = new MerchantPayOrder("1", "APP", "支付宝APP商品购买", - "支付宝APP5商品购买", orderInfo.getPayPrice(), param.getUni()); - map.put("data",manager.app(payOrder)); - } - - default: + if (orderInfo.getPayInfo() == null) { + return false; } - return map; + if (PayTypeEnum.WEIXIN.getValue().equals(param.getPaytype())) { + //微信查单 + MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); + + PayInfo payInfo = JsonUtils.parseObject(orderInfo.getPayInfo(), PayInfo.class); + if (payInfo == null) return false; + if (payInfo.getTransaction_id() == null) return false; + Map map = PaymentApi.queryByTransactionId(merchantDetailsDO.getAppid(), merchantDetailsDO.getMchId(), merchantDetailsDO.getKeyPrivate(), payInfo.getTransaction_id()); + log.info("查询到微信订单信息:" + map.toString()); + return map.get("return_code").equals("SUCCESS") && map.get("result_code").equals("SUCCESS") && map.get("trade_state").equals("SUCCESS"); + } else { + //其他支付查单 + return false; + } + } + + /** + * 第三方支付 + * + * @param uid 用户id + * @param param 订单参数 + * @return 支付结果 + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Map pay(Long uid, AppPayParam param) throws Exception { + AppStoreOrderQueryVo orderInfo = getOrderInfo(param.getUni(), uid); + if (ObjectUtil.isNull(orderInfo)) { + throw exception(STORE_ORDER_NOT_EXISTS); + } + if (orderInfo.getPaid().equals(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue())) { + throw exception(ORDER_PAY_FINISH); + } + //微信h5支付商户配置 + MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); + // paySuccess(orderInfo.getOrderId(), PayTypeEnum.WEIXIN.getValue()); +// Map packageParams = new HashMap(); +// packageParams.put("mwebUrl",URLEncoder.encode(merchantDetailsDO.getReturnUrl(), "GBK")); + + PayContext payContext = new PayContext(); + Map packageParams = payContext.selectPayWay(PayEnum.WEIXIN.getCode(), + new PayParam(orderInfo.getOrderId(), orderInfo.getPayPrice(), "", ServletUtils.getClientIP(), + param.getPaytype(), "Yshop商城", merchantDetailsDO)); + PayInfo payInfo = new PayInfo(); + payInfo.setOrderId(orderInfo.getOrderId()); + payInfo.setOut_trade_no(packageParams.get("out_trade_no")); + payInfo.setTransaction_id(packageParams.get("transaction_id")); + //更新订单支付信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StoreOrderDO::getOrderId, orderInfo.getOrderId()); + StoreOrderDO storeOrder = new StoreOrderDO(); + storeOrder.setPayInfo(JsonUtils.toJsonString(payInfo)); + this.update(storeOrder, wrapper); + // 异步统计 + asyncStoreOrderService.orderData(uid); + return packageParams; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void wxPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { + log.info("进入微信支付回调"); + String xmlMsg = HttpKit.readData(request); + log.info("微信回调通知信息" + xmlMsg); + if (StringUtils.isEmpty(xmlMsg)) { + log.info("回调接口内容为空!"); + return; + } + Map resultMap = PaymentKit.xmlToMap(xmlMsg); + //验签 + MerchantDetailsDO merchantDetailsDO = merchantDetailsService.getMerchantDetails("4"); + boolean validSignResult = PaymentKit.verifyNotify(resultMap, merchantDetailsDO.getKeyPrivate()); + log.info("验签结果{}", validSignResult); + if (!MapUtils.isEmpty(resultMap)) { + if (resultMap.get("return_code").equals("SUCCESS")) { + String orderNo = resultMap.get("out_trade_no"); + log.info("回调out_trade_no=" + orderNo); + log.info("回调transaction_id=" + resultMap.get("transaction_id")); + //截取订单编号 + String[] split = orderNo.split("-"); + if (split.length > 0) { + String orderFormId = split[0]; + if (!StringUtils.isEmpty(orderFormId)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.and( + i -> i.eq(StoreOrderDO::getOrderId, orderFormId).or().eq(StoreOrderDO::getUnique, orderFormId).or() + .eq(StoreOrderDO::getExtendOrderId, orderFormId)); + StoreOrderDO orderInfo = storeOrderMapper.selectOne(wrapper); + if (orderInfo == null) { + log.info("订单已经取消或删除"); + String result = ""; + response.getWriter().write(result); + } + //判断订单装态,如果已支付说明为重复回调,丢弃 + assert orderInfo != null; + if (OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue().equals(orderInfo.getPaid())) { + log.info("订单【{}】已经支付完成", orderInfo.getOrderId()); + String result = ""; + response.getWriter().write(result); + } + //判断金额是否一致 + BigDecimal totalFee = new BigDecimal(resultMap.get("total_fee")); + PayInfo payInfo = JsonUtils.parseObject(orderInfo.getPayInfo(), PayInfo.class); + log.info(totalFee + ":" + orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))); + if (!(totalFee.compareTo(orderInfo.getPayPrice().multiply(BigDecimal.valueOf(100))) == 0)) { + log.info("支付金额与订单金额不一致,请查询相关订单信息与客户确认!"); +// throw exception(STORE_ORDER_PAY_FEE_ERROR); + //最简单做法 不一致退还支付金额,订单装态不变 + assert payInfo != null; + Map map = wxPayService.refund(resultMap.get("transaction_id"), payInfo.getOut_refund_no(), orderInfo.getTotalPrice(), totalFee, merchantDetailsDO); + log.info("退款详情:" + map); + String result = ""; + response.getWriter().write(result); + } + //更新订单状态,与支付单据信息 + + assert payInfo != null; + payInfo.setTransaction_id(resultMap.get("transaction_id")); + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.eq(StoreOrderDO::getOrderId, orderFormId); + StoreOrderDO storeOrder = new StoreOrderDO(); + storeOrder.setPayInfo(JsonUtils.toJsonString(payInfo)); + this.update(storeOrder, updateWrapper); + //支付完成回调的逻辑 修改订单装态等 + this.paySuccess(orderFormId, PayTypeEnum.WEIXIN.getValue()); + } + } + } + } else { + log.info("map为null"); + } + log.info("微信小程序支付回调成功"); + String result = ""; + response.getWriter().write(result); } /** @@ -501,17 +607,17 @@ public class AppStoreOrderServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StoreOrderDO::getOrderId, orderId); StoreOrderDO storeOrder = new StoreOrderDO(); - storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue()); + storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()); storeOrder.setPayType(payType); storeOrder.setPayTime(LocalDateTime.now()); this.update(storeOrder, wrapper); //增加用户购买次数 - userService.incPayCount(orderInfo.getUid()); + memberUserService.incPayCount(orderInfo.getUid()); //增加状态 - storeOrderStatusService.create(orderInfo.getUid(),orderInfo.getId(), OrderLogEnum.PAY_ORDER_SUCCESS.getValue(), + storeOrderStatusService.create(orderInfo.getUid(), orderInfo.getId(), OrderLogEnum.PAY_ORDER_SUCCESS.getValue(), OrderLogEnum.PAY_ORDER_SUCCESS.getDesc()); - MemberUserDO userInfo = userService.getUser(orderInfo.getUid()); + MemberUserDO userInfo = memberUserService.getUser(orderInfo.getUid()); //增加流水 String payTypeMsg = PayTypeEnum.WEIXIN.getDesc(); if (PayTypeEnum.YUE.getValue().equals(payType)) { payTypeMsg = PayTypeEnum.YUE.getDesc(); - }else if (PayTypeEnum.ALI.getValue().equals(payType)) { + } else if (PayTypeEnum.ALI.getValue().equals(payType)) { payTypeMsg = PayTypeEnum.ALI.getDesc(); } billService.expend(userInfo.getId(), "购买商品", @@ -560,14 +664,14 @@ public class AppStoreOrderServiceImpl extends ServiceImpl pageModel = new Page<>(page, limit); IPage pageList = storeOrderMapper.selectPage(pageModel, wrapper); List list = StoreOrderConvert.INSTANCE.convertList01(pageList.getRecords()); - return list.stream().map(this::handleOrder).collect(Collectors.toList()); - } @@ -701,45 +803,47 @@ public class AppStoreOrderServiceImpl extends ServiceImpl 0) { - } else { + if (order.getPinkId() <= 0) { statusDTO.set_class("state-nfh"); statusDTO.set_msg("商家未发货,请耐心等待"); statusDTO.set_type("1"); statusDTO.set_title("未发货"); } - } else if (OrderInfoEnum.STATUS_1.getValue().equals(order.getStatus())) { + } else if (OrderInfoEnum.STATUS_WAIT_RECEIVED.getValue().equals(order.getStatus())) { statusDTO.set_class("state-ysh"); statusDTO.set_msg("服务商已发货"); statusDTO.set_type("2"); statusDTO.set_title("待收货"); - } else if (OrderInfoEnum.STATUS_2.getValue().equals(order.getStatus())) { + } else if (OrderInfoEnum.STATUS_RECEIVED.getValue().equals(order.getStatus())) { statusDTO.set_class("state-ypj"); statusDTO.set_msg("已收货,快去评价一下吧"); statusDTO.set_type("3"); statusDTO.set_title("待评价"); - } else if (OrderInfoEnum.STATUS_3.getValue().equals(order.getStatus())) { + } else if (OrderInfoEnum.STATUS_FINISHED.getValue().equals(order.getStatus())) { statusDTO.set_class("state-ytk"); statusDTO.set_msg("交易完成,感谢您的支持"); statusDTO.set_type("4"); @@ -747,15 +851,24 @@ public class AppStoreOrderServiceImpl extends ServiceImpl() + .eq(StoreOrderStatusDO::getOid, order.getId()) + .eq(StoreOrderStatusDO::getChangeType, OrderLogEnum.DELIVERY_GOODS.getValue())); + if (orderStatusDO != null) { + order.setDeliveryTime(orderStatusDO.getChangeTime()); + } + return order; } @@ -774,17 +887,17 @@ public class AppStoreOrderServiceImpl extends ServiceImpllambdaQuery() - .eq(StoreOrderCartInfoDO::getUnique,unique)); - + .eq(StoreOrderCartInfoDO::getUnique, unique)); + if (ObjectUtil.isEmpty(orderCartInfo)) { throw exception(COMMENT_PRODUCT_NOT_EXISTS); } - Long count = appStoreProductReplyService.count(Wrappers.lambdaQuery() + long count = appStoreProductReplyService.count(Wrappers.lambdaQuery() .eq(StoreProductReplyDO::getOid, orderCartInfo.getOid()) .eq(StoreProductReplyDO::getProductId, orderCartInfo.getProductId())); if (count > 0) { @@ -837,18 +950,18 @@ public class AppStoreOrderServiceImpl extends ServiceImpl().eq(StoreProductReplyDO::getOid, orderCartInfo.getOid())); + long replyCount = appStoreProductReplyService.count(new LambdaQueryWrapper().eq(StoreProductReplyDO::getOid, orderCartInfo.getOid())); //购买商品数量 - Long cartCount = storeOrderCartInfoService.count(new LambdaQueryWrapper().eq(StoreOrderCartInfoDO::getOid, orderCartInfo.getOid())); + long cartCount = storeOrderCartInfoService.count(new LambdaQueryWrapper().eq(StoreOrderCartInfoDO::getOid, orderCartInfo.getOid())); - if (NumberUtil.equals(replyCount,cartCount)) { + if (NumberUtil.equals(replyCount, cartCount)) { StoreOrderDO storeOrder = new StoreOrderDO(); - storeOrder.setStatus(OrderInfoEnum.STATUS_3.getValue()); + storeOrder.setStatus(OrderInfoEnum.STATUS_FINISHED.getValue()); storeOrder.setId(orderCartInfo.getOid()); this.updateById(storeOrder); } //增加状态 - storeOrderStatusService.create(uid,orderCartInfo.getOid(), + storeOrderStatusService.create(uid, orderCartInfo.getOid(), OrderLogEnum.EVAL_ORDER.getValue(), OrderLogEnum.EVAL_ORDER.getDesc()); } @@ -861,19 +974,19 @@ public class AppStoreOrderServiceImpl extends ServiceImpl map = PaymentApi.queryByOutTradeNo(merchantDetailsDO.getAppid(), merchantDetailsDO.getMchId(), merchantDetailsDO.getKeyPrivate(), payInfo.getOut_trade_no()); + log.info("查询微信订单状态:{}", map); + //支付方也需要调用关闭订单接口 + if (Objects.equals(map.get(WxOrderResultEnum.TRADE_STATE.getValue()), WxOrderResultEnum.NOT_PAY.getValue())) { + Map closeOrderMap = PaymentApi.closeOrder(merchantDetailsDO.getAppid(), merchantDetailsDO.getMchId(), merchantDetailsDO.getKeyPrivate(), payInfo.getOut_trade_no()); + log.info("微信关闭订单:{}", closeOrderMap); + } this.regressionIntegral(order, 0); @@ -903,6 +1028,9 @@ public class AppStoreOrderServiceImpl extends ServiceImpl packageParams = new HashMap<>(); //根据支付类型不同退款不同 if (PayTypeEnum.YUE.getValue().equals(orderQueryVo.getPayType())) { - storeOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_2.getValue()); + storeOrder.setRefundStatus(OrderInfoEnum.REFUND_STATUS_HAVE_REFUNDED.getValue()); storeOrder.setRefundPrice(price); this.baseMapper.updateById(storeOrder); //退款到余额 - userService.incMoney(orderQueryVo.getUid(), price); - MemberUserDO memberUserDO = userService.getById(orderQueryVo.getUid()); + memberUserService.incMoney(orderQueryVo.getUid(), price); + MemberUserDO memberUserDO = memberUserService.getById(orderQueryVo.getUid()); //增加流水 billService.income(orderQueryVo.getUid(), "商品退款", BillDetailEnum.CATEGORY_1.getValue(), @@ -938,46 +1073,29 @@ public class AppStoreOrderServiceImpl extends ServiceImpl 0) { return; } - MemberUserDO yxUser = userService.getById(order.getUid()); + MemberUserDO yxUser = memberUserService.getById(order.getUid()); //增加积分 BigDecimal newIntegral = NumberUtil.add(order.getUseIntegral(), yxUser.getIntegral()); yxUser.setIntegral(newIntegral); - userService.updateById(yxUser); + memberUserService.updateById(yxUser); //增加流水 billService.income(yxUser.getId(), "积分回退", BillDetailEnum.CATEGORY_2.getValue(), @@ -1048,13 +1166,13 @@ public class AppStoreOrderServiceImpl extends ServiceImpl 0) { - MemberUserDO user = userService.getUser(order.getUid()); + MemberUserDO user = memberUserService.getUser(order.getUid()); BigDecimal newIntegral = NumberUtil.add(user.getIntegral(), order.getGainIntegral()); user.setIntegral(newIntegral); user.setId(order.getUid()); - userService.updateById(user); + memberUserService.updateById(user); //增加流水 billService.income(user.getId(), "购买商品赠送积分", BillDetailEnum.CATEGORY_2.getValue(), @@ -1096,7 +1214,6 @@ public class AppStoreOrderServiceImpl extends ServiceImpl check(Long uid,String key, AppComputeOrderParam param){ - Map map = Maps.newHashMap(); - if(StrUtil.isBlank(key)) { + private Map check(Long uid, String key, AppComputeOrderParam param) { + Map map = Maps.newHashMap(); + if (StrUtil.isBlank(key)) { throw exception(PARAM_ERROR); } - AppStoreOrderQueryVo storeOrder = this.getOrderInfo(key,uid); - if(ObjectUtil.isNotNull(storeOrder)){ + AppStoreOrderQueryVo storeOrder = this.getOrderInfo(key, uid); + if (ObjectUtil.isNotNull(storeOrder)) { OrderExtendDto orderExtendDTO = OrderExtendDto.builder() .key(key) @@ -1142,7 +1259,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartInfo, UserAddressDO userAddress) { - - BigDecimal storePostage = BigDecimal.ZERO; + private PriceGroupDto getOrderPriceGroup(List cartInfo, UserAddressDO userAddress, Long couponId) { + BigDecimal storePostage; BigDecimal storeFreePostage = BigDecimal.ZERO; + BigDecimal costPrice = this.getOrderSumPrice(cartInfo, "truePrice");//获取订单成本价 + BigDecimal payIntegral = BigDecimal.ZERO; + BigDecimal couponPrice = BigDecimal.ZERO; - BigDecimal totalPrice = this.getOrderSumPrice(cartInfo, "truePrice");//获取订单总金额 - BigDecimal costPrice = this.getOrderSumPrice(cartInfo, "costPrice");//获取订单成本价 - BigDecimal payIntegral = this.getOrderSumPrice(cartInfo, "payIntegral");//获取订单需要的积分 + if (couponId == null || couponId != -1l) { + Map> cartInfoMap = + cartInfo.stream().collect(Collectors.groupingBy(AppStoreCartQueryVo::getProductId)); + List cartCouponDtoList = new ArrayList<>(); + for (List queryVos : cartInfoMap.values()) { + BigDecimal amount = BigDecimal.ZERO; + for (AppStoreCartQueryVo appStoreCartQueryVo : queryVos) { + amount = amount.add(appStoreCartQueryVo.getTruePrice() + .multiply(BigDecimal.valueOf(appStoreCartQueryVo.getCartNum()))); + } + cartCouponDtoList.add(CartCouponDto.builder().productId(queryVos.get(0).getProductId()).price(amount).build()); + } + List cartCouponVOList = appCouponRelationService.searchCartCoupon(cartCouponDtoList, couponId); + // 默认优惠券 + if (CollectionUtils.isNotEmpty(cartCouponVOList)) { + CartCouponVO defaultCoupon = cartCouponVOList.get(0); + couponPrice = defaultCoupon.getDiscountAmount(); + couponId = defaultCoupon.getDetailId(); + } + } + + + // this.getOrderSumPrice(cartInfo, "payIntegral");//获取订单需要的积分 //运费模板 storePostage = this.handlePostage(cartInfo, userAddress); + BigDecimal totalPrice = costPrice.add(storePostage).subtract(couponPrice);//获取订单总金额 + PriceGroupDto priceGroupDTO = new PriceGroupDto(); priceGroupDTO.setStorePostage(storePostage); priceGroupDTO.setStoreFreePostage(storeFreePostage); priceGroupDTO.setTotalPrice(totalPrice); priceGroupDTO.setCostPrice(costPrice); priceGroupDTO.setPayIntegral(payIntegral); + priceGroupDTO.setCouponPrice(couponPrice); + priceGroupDTO.setCouponId(couponId); return priceGroupDTO; } @@ -1195,8 +1337,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl citys = new ArrayList<>(); - citys.add(cityId); - citys.add(0); + List cityIdList = new ArrayList<>(); + cityIdList.add(cityId); + cityIdList.add(0); List storeProductVOList = cartInfo .stream() @@ -1249,7 +1390,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl shippingTemplatesRegionList = shippingTemplatesRegionService .list(Wrappers.lambdaQuery() .in(ShippingTemplatesRegionDO::getTempId, tempIdS) - .in(ShippingTemplatesRegionDO::getCityId, citys) + .in(ShippingTemplatesRegionDO::getCityId, cityIdList) .orderByAsc(ShippingTemplatesRegionDO::getCityId)); //提取运费模板类型 Map shippingTemplatesMap = shippingTemplatesList @@ -1275,12 +1416,12 @@ public class AppStoreOrderServiceImpl extends ServiceImpl entry : templateDTOMap.entrySet()) { + for (Map.Entry entry : templateDTOMap.entrySet()) { Integer mapKey = entry.getKey(); TemplateDto mapValue = entry.getValue(); - Long count = shippingTemplatesFreeService.count(Wrappers.lambdaQuery() + long count = shippingTemplatesFreeService.count(Wrappers.lambdaQuery() .eq(ShippingTemplatesFreeDO::getTempId, mapValue.getTempId()) .eq(ShippingTemplatesFreeDO::getCityId, mapValue.getCityId()) .le(ShippingTemplatesFreeDO::getNumber, mapValue.getNumber()) @@ -1322,7 +1463,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl 0) { templateDTOMap.remove(mapKey); - break jj; + break; } } @@ -1342,7 +1483,7 @@ public class AppStoreOrderServiceImpl extends ServiceImpl0 取用户 否则取所有 + */ + @Override + @Async + public void orderData(Long uid) { + log.info("========获取某个用户的订单统计数据========="); + //订单支付没有退款 数量 + LambdaQueryWrapper wrapperOne = new LambdaQueryWrapper<>(); + if (uid != null) { + wrapperOne.eq(StoreOrderDO::getUid, uid); + } + wrapperOne.eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()); + Long orderCount = storeOrderMapper.selectCount(wrapperOne); + + //订单支付没有退款 支付总金额 + double sumPrice = storeOrderMapper.sumPrice(uid); + + + + //订单待发货 数量 + LambdaQueryWrapper wrapperThree = new LambdaQueryWrapper<>(); + if (uid != null) { + wrapperThree.eq(StoreOrderDO::getUid, uid); + } + wrapperThree.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_DEFAULT.getValue()); + Long unshippedCount = storeOrderMapper.selectCount(wrapperThree); + + //订单待收货 数量 + LambdaQueryWrapper wrapperFour = new LambdaQueryWrapper<>(); + if (uid != null) { + wrapperFour.eq(StoreOrderDO::getUid, uid); + } + wrapperFour.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_WAIT_RECEIVED.getValue()); + Long receivedCount = storeOrderMapper.selectCount(wrapperFour); + + //订单待评价 数量 + LambdaQueryWrapper wrapperFive = new LambdaQueryWrapper<>(); + if (uid != null) { + wrapperFive.eq(StoreOrderDO::getUid, uid); + } + wrapperFive.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_RECEIVED.getValue()); + //是否单独计算商品 + Long evaluatedCount = storeOrderMapper.selectCount(wrapperFive); + + //订单已完成 数量 + LambdaQueryWrapper wrapperSix = new LambdaQueryWrapper<>(); + if (uid != null) { + wrapperSix.eq(StoreOrderDO::getUid, uid); + } + wrapperSix.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_FINISHED.getValue()); + Long completeCount = storeOrderMapper.selectCount(wrapperSix); + + //售后退款 + Long salesCount = appStoreAfterSalesService.lambdaQuery() + .eq(Objects.nonNull(uid), StoreAfterSalesDO::getUserId, uid) + .count(); + + //订单待支付 数量 + LambdaQueryWrapper wrapperTwo = new LambdaQueryWrapper<>(); + if (uid != null) { + wrapperTwo.eq(StoreOrderDO::getUid, uid); + } + wrapperTwo.eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_UNPAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()) + .eq(StoreOrderDO::getStatus, OrderInfoEnum.STATUS_DEFAULT.getValue()); + Long unpaidCount = storeOrderMapper.selectCount(wrapperTwo); + AppUserOrderCountVo appUserOrderCountVo = AppUserOrderCountVo.builder() + .orderCount(orderCount) + .sumPrice(sumPrice) + .unpaidCount(unpaidCount) + .unshippedCount(unshippedCount) + .receivedCount(receivedCount) + .evaluatedCount(evaluatedCount) + .completeCount(completeCount) + .refundCount(salesCount) + .build(); + + //先删除再存redis + asyncOrderRedisDAO.delete(uid); + asyncOrderRedisDAO.set(appUserOrderCountVo,uid); + + this.getOrderTimeData(); + } + + + /** + * 首页订单/用户等统计 + * + */ + @Async + @Override + public void getOrderTimeData() { + OrderTimeDataDto orderTimeDataDto = new OrderTimeDataDto(); + + ShoperOrderTimeDataVo shoperOrderTimeData = this.getShoperOrderTimeData(); + + BeanUtil.copyProperties(shoperOrderTimeData, orderTimeDataDto); + + + orderTimeDataDto.setUserCount(userService.count()); + orderTimeDataDto.setOrderCount(storeOrderMapper.selectCount()); + orderTimeDataDto.setPriceCount(storeOrderMapper.sumTotalPrice()); + orderTimeDataDto.setGoodsCount(productService.count()); + asyncCountRedisDAO.delete(); + asyncCountRedisDAO.set(orderTimeDataDto); + } + + /** + * 异步后台统计 + */ + public ShoperOrderTimeDataVo getShoperOrderTimeData() { + + Date today = DateUtil.beginOfDay(new Date()); + Date yesterday = DateUtil.beginOfDay(DateUtil.yesterday()); + Date nowMonth = DateUtil.beginOfMonth(new Date()); + Date lastWeek = DateUtil.beginOfDay(DateUtil.lastWeek()); + + ShoperOrderTimeDataVo orderTimeDataVo = new ShoperOrderTimeDataVo(); + + //今日成交额 + LambdaQueryWrapper wrapperOne = new LambdaQueryWrapper<>(); + wrapperOne + .ge(StoreOrderDO::getPayTime, today) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()); + orderTimeDataVo.setTodayPrice(storeOrderMapper.todayPrice(wrapperOne)); + //今日订单数 + orderTimeDataVo.setTodayCount(storeOrderMapper.selectCount(wrapperOne)); + + //昨日成交额 + LambdaQueryWrapper wrapperTwo = new LambdaQueryWrapper<>(); + wrapperTwo + .lt(StoreOrderDO::getPayTime, today) + .ge(StoreOrderDO::getPayTime, yesterday) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()); + orderTimeDataVo.setProPrice(storeOrderMapper.todayPrice(wrapperTwo)); + //昨日订单数 + orderTimeDataVo.setProCount(storeOrderMapper.selectCount(wrapperTwo)); + + //本月成交额 + LambdaQueryWrapper wrapperThree = new LambdaQueryWrapper<>(); + wrapperThree + .ge(StoreOrderDO::getPayTime, nowMonth) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()); + orderTimeDataVo.setMonthPrice(storeOrderMapper.todayPrice(wrapperThree)); + //本月订单数 + orderTimeDataVo.setMonthCount(storeOrderMapper.selectCount(wrapperThree)); + + //上周成交额 + LambdaQueryWrapper wrapperLastWeek = new LambdaQueryWrapper<>(); + wrapperLastWeek + .lt(StoreOrderDO::getPayTime, today) + .ge(StoreOrderDO::getPayTime, lastWeek) + .eq(StoreOrderDO::getPaid, OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()) + .eq(StoreOrderDO::getRefundStatus, OrderInfoEnum.REFUND_STATUS_NORMAL.getValue()); + orderTimeDataVo.setLastWeekPrice(storeOrderMapper.todayPrice(wrapperLastWeek)); + //上周订单数 + orderTimeDataVo.setLastWeekCount(storeOrderMapper.selectCount(wrapperLastWeek)); + + + return orderTimeDataVo; + + } + + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java index 96b8be0..6b4c561 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/StoreOrderServiceImpl.java @@ -5,12 +5,9 @@ import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; -import co.yixiang.yshop.framework.common.exception.ErrorCode; -import co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.express.dal.dataobject.electronicsorder.ElectronicsOrderDO; import co.yixiang.yshop.module.express.dal.dataobject.express.ExpressDO; -import co.yixiang.yshop.module.express.dal.mysql.electronicsorder.ElectronicsOrderMapper; import co.yixiang.yshop.module.express.dal.redis.express.ExpressRedisDAO; import co.yixiang.yshop.module.express.kdniao.model.dto.KdniaoApiBaseDTO; import co.yixiang.yshop.module.express.kdniao.model.dto.KdniaoElectronicsOrderDTO; @@ -111,7 +108,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { StoreOrderDO updateObj = StoreOrderConvert.INSTANCE.convert(updateReqVO); //发货 if(UpdateOrderEnum.ORDER_SEND.getValue().equals(updateReqVO.getUpdateType())){ - updateObj.setStatus(OrderInfoEnum.STATUS_1.getValue()); + updateObj.setStatus(OrderInfoEnum.STATUS_WAIT_RECEIVED.getValue()); } storeOrderMapper.updateById(updateObj); @@ -139,7 +136,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { RBlockingDeque blockingDeque = redissonClient.getBlockingDeque(ShopConstants.REDIS_ORDER_OUTTIME_UNCONFIRM); RDelayedQueue delayedQueue = redissonClient.getDelayedQueue(blockingDeque); delayedQueue.offer(updateReqVO.getOrderId(), ShopConstants.ORDER_OUTTIME_UNCONFIRM, TimeUnit.DAYS); - String s = TimeUnit.SECONDS.toSeconds(ShopConstants.ORDER_OUTTIME_UNCONFIRM) + "天"; + String s = ShopConstants.ORDER_OUTTIME_UNCONFIRM + "天"; log.info("添加延时队列成功 ,延迟时间:" + s); } catch (Exception e) { log.error(e.getMessage()); @@ -166,7 +163,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { // 校验存在 validateStoreOrderExists(id); StoreOrderDO storeOrderDO = storeOrderMapper.selectById(id); - storeOrderDO.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue()); + storeOrderDO.setPaid(OrderInfoEnum.PAY_STATUS_HAVE_PAID.getValue()); storeOrderDO.setPayTime(LocalDateTime.now()); storeOrderMapper.updateById(storeOrderDO); @@ -316,7 +313,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { storeOrderDO.setDeliveryId(kdniaoOrderVO.getOrder().getLogisticCode()); storeOrderDO.setDeliveryName(expressDO.getName()); storeOrderDO.setDeliverySn(kdniaoOrderVO.getOrder().getShipperCode()); - storeOrderDO.setStatus(OrderInfoEnum.STATUS_1.getValue()); + storeOrderDO.setStatus(OrderInfoEnum.STATUS_WAIT_RECEIVED.getValue()); storeOrderMapper.updateById(storeOrderDO); //增加状态 diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CacheDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CacheDto.java index 4ecdbd1..f46a53f 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CacheDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CacheDto.java @@ -1,19 +1,19 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @ClassName CacheDto - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/19 - **/ -@Data -public class CacheDto implements Serializable { - private List cartInfo; - private PriceGroupDto priceGroup; - private OtherDto other; -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @ClassName CacheDto + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/19 + **/ +@Data +public class CacheDto implements Serializable { + private List cartInfo; + private PriceGroupDto priceGroup; + private OtherDto other; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CountDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CountDto.java index c706c5d..86bfafd 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CountDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/CountDto.java @@ -1,14 +1,14 @@ -/** - * Copyright (C) 2018-2022 - * All rights reserved, Designed By www.yixiang.co - - */ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import lombok.Data; - -@Data -public class CountDto { - - private String catename; -} +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import lombok.Data; + +@Data +public class CountDto { + + private String catename; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderCountDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderCountDto.java index e487206..01f94f4 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderCountDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderCountDto.java @@ -1,26 +1,26 @@ -/** - * Copyright (C) 2018-2022 - * All rights reserved, Designed By www.yixiang.co - - */ -package co.yixiang.yshop.module.order.service.storeorder.dto; - - -import lombok.Data; - -import java.util.List; - -@Data -public class OrderCountDto { - - private List column; - - private List orderCountDatas; - - @Data - public static class OrderCountData{ - private String name; - - private Integer value; - } -} +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.order.service.storeorder.dto; + + +import lombok.Data; + +import java.util.List; + +@Data +public class OrderCountDto { + + private List column; + + private List orderCountDatas; + + @Data + public static class OrderCountData{ + private String name; + + private Integer value; + } +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderExtendDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderExtendDto.java index 3a85002..dd21e07 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderExtendDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OrderExtendDto.java @@ -1,31 +1,31 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.Map; - -/** - * @ClassName OrderExtendDto - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/19 - **/ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class OrderExtendDto implements Serializable { - - @Schema(description = "唯一的key", required = true) - private String key; - - @Schema(description = "订单ID", required = true) - private String orderId; - - @Schema(description = "微信相关配置", required = true) - private Map jsConfig; -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Map; + +/** + * @ClassName OrderExtendDto + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/19 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OrderExtendDto implements Serializable { + + @Schema(description = "唯一的key", required = true) + private String key; + + @Schema(description = "订单ID", required = true) + private String orderId; + + @Schema(description = "微信相关配置", required = true) + private Map jsConfig; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OtherDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OtherDto.java index cfac961..3fdd02b 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OtherDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/OtherDto.java @@ -1,25 +1,25 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName OtherDto - * @Author hupeng <610796224@qq.com> - * @Date 2019/10/27 - **/ -@Data -public class OtherDto implements Serializable { - //线下包邮 - private String offlinePostage; - //积分抵扣 - private String integralRatio; - - //最大 - private String integralMax; - - //满多少 - private String integralFull; - -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName OtherDto + * @Author hupeng <610796224@qq.com> + * @Date 2019/10/27 + **/ +@Data +public class OtherDto implements Serializable { + //线下包邮 + private String offlinePostage; + //积分抵扣 + private String integralRatio; + + //最大 + private String integralMax; + + //满多少 + private String integralFull; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java index 112c861..fa4aa0d 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/PriceGroupDto.java @@ -1,27 +1,39 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import lombok.Data; - -import java.math.BigDecimal; - -/** - * @ClassName PriceGroup - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/18 - **/ -@Data -public class PriceGroupDto { - - private BigDecimal costPrice; - - private BigDecimal storeFreePostage; - - private BigDecimal storePostage; - - private BigDecimal totalPrice; - - private BigDecimal vipPrice; - - private BigDecimal payIntegral; -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @ClassName PriceGroup + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/18 + **/ +@Data +public class PriceGroupDto { + + @Schema(description = "商品总价", required = true) + private BigDecimal costPrice; + + private BigDecimal storeFreePostage; + + @Schema(description = "运费", required = true) + private BigDecimal storePostage; + + @Schema(description = "总计", required = true) + private BigDecimal totalPrice; + + @Schema(description = "VIP价", required = true) + private BigDecimal vipPrice; + + @Schema(description = "积分", required = true) + private BigDecimal payIntegral; + + @Schema(description = "优惠金额", required = true) + private BigDecimal couponPrice; + + @Schema(description = "优惠券id", required = true) + private Long couponId; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductAttrDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductAttrDto.java index 124c4eb..acf644b 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductAttrDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductAttrDto.java @@ -1,22 +1,22 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName ProductAttrDto - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/27 - **/ -@Data -public class ProductAttrDto implements Serializable { - - private Long productId; - - private String sku; - - private Double price; - - private String image; -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName ProductAttrDto + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/27 + **/ +@Data +public class ProductAttrDto implements Serializable { + + private Long productId; + + private String sku; + + private Double price; + + private String image; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductDto.java index 710ece8..742c83e 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/ProductDto.java @@ -1,23 +1,23 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName ProductVo - * @Author hupeng <610796224@qq.com> - * @Date 20123/6/27 - **/ -@Data -public class ProductDto implements Serializable { - - private String image; - - private Double price; - - private String storeName; - - private ProductAttrDto attrInfo; - -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName ProductVo + * @Author hupeng <610796224@qq.com> + * @Date 20123/6/27 + **/ +@Data +public class ProductDto implements Serializable { + + private String image; + + private Double price; + + private String storeName; + + private ProductAttrDto attrInfo; + +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java index b1fe5c3..66c1f36 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/StatusDto.java @@ -1,19 +1,20 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName StatusDto - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/19 - **/ -@Data -public class StatusDto implements Serializable { - private String _class; - private String _msg; - private String _payType; - private String _title; - private String _type; -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName StatusDto + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/19 + **/ +@Data +public class StatusDto implements Serializable { + private String _class; + private String _msg; + private String _payType; + private String _title; + private String _type; + private String _payRemainTime; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/TemplateDto.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/TemplateDto.java index 6ac81c0..067c662 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/TemplateDto.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/dto/TemplateDto.java @@ -1,26 +1,26 @@ -package co.yixiang.yshop.module.order.service.storeorder.dto; - -import lombok.*; - -import java.math.BigDecimal; - -/** - * @ClassName TemplateDTO - * @Author hupeng <610796224@qq.com> - * @Date 2020/5/28 - **/ -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class TemplateDto { - private Double number; - private BigDecimal price; - private Double first; - private BigDecimal firstPrice; - private Double _continue; - private BigDecimal continuePrice; - private Integer tempId; - private Integer cityId; -} +package co.yixiang.yshop.module.order.service.storeorder.dto; + +import lombok.*; + +import java.math.BigDecimal; + +/** + * @ClassName TemplateDTO + * @Author hupeng <610796224@qq.com> + * @Date 2020/5/28 + **/ +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TemplateDto { + private Double number; + private BigDecimal price; + private Double first; + private BigDecimal firstPrice; + private Double _continue; + private BigDecimal continuePrice; + private Integer tempId; + private Integer cityId; +} diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java index d90b27d..901fb7b 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeordercartinfo/StoreOrderCartInfoServiceImpl.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.order.service.storeordercartinfo; import cn.hutool.core.util.IdUtil; +import co.yixiang.yshop.framework.common.enums.OrderInfoEnum; import co.yixiang.yshop.module.order.dal.dataobject.storeordercartinfo.StoreOrderCartInfoDO; import co.yixiang.yshop.module.order.dal.mysql.storeordercartinfo.StoreOrderCartInfoMapper; import co.yixiang.yshop.module.product.controller.app.cart.vo.AppStoreCartQueryVo; @@ -9,8 +10,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; @@ -29,7 +28,7 @@ public class StoreOrderCartInfoServiceImpl extends ServiceImpl { /** * 添加订单操作记录 * @param oid 订单id - * @param changetype 操作状态 + * @param changeType 操作状态 * @param changeMessage 操作内容 */ - void create(Long uid,Long oid,String changetype,String changeMessage); + void create(Long uid,Long oid,String changeType,String changeMessage); } diff --git a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderstatus/StoreOrderStatusServiceImpl.java b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderstatus/StoreOrderStatusServiceImpl.java index 95d16fd..d686efc 100644 --- a/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderstatus/StoreOrderStatusServiceImpl.java +++ b/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorderstatus/StoreOrderStatusServiceImpl.java @@ -27,15 +27,15 @@ public class StoreOrderStatusServiceImpl extends ServiceImpl p.value == value) + .findAny() + .orElse(null); + } + +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/DefaultEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/DefaultEnum.java index 8a3dedd..d43c834 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/DefaultEnum.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/DefaultEnum.java @@ -1,18 +1,18 @@ -package co.yixiang.yshop.module.product.enums.product; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 产品相关规格类型枚举 - */ -@Getter -@AllArgsConstructor -public enum DefaultEnum { - DEFAULT_0(0,"默认值0"), - DEFAULT_1(1,"默认值1"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.product.enums.product; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 产品相关规格类型枚举 + */ +@Getter +@AllArgsConstructor +public enum DefaultEnum { + DEFAULT_0(0,"默认值0"), + DEFAULT_1(1,"默认值1"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationCateEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationCateEnum.java index 3315db2..a223e55 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationCateEnum.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationCateEnum.java @@ -1,20 +1,20 @@ -package co.yixiang.yshop.module.product.enums.product; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 产品收藏类型枚举 - */ -@Getter -@AllArgsConstructor -public enum RelationCateEnum { - COMMON("common","普通商品"), - SECKILL("seckill","秒杀商品"), - BARGAIN("bargain","砍价商品"), - PINK("pink","拼团商品"); - - private String value; - private String desc; -} +package co.yixiang.yshop.module.product.enums.product; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 产品收藏类型枚举 + */ +@Getter +@AllArgsConstructor +public enum RelationCateEnum { + COMMON("common","普通商品"), + SECKILL("seckill","秒杀商品"), + BARGAIN("bargain","砍价商品"), + PINK("pink","拼团商品"); + + private String value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationEnum.java index e8b0b08..1dd3a0f 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationEnum.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/RelationEnum.java @@ -1,18 +1,18 @@ -package co.yixiang.yshop.module.product.enums.product; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 产品收藏类型枚举 - */ -@Getter -@AllArgsConstructor -public enum RelationEnum { - COLLECT("collect","收藏"), - FOOT("foot","足迹"); - - private String value; - private String desc; -} +package co.yixiang.yshop.module.product.enums.product; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 产品收藏类型枚举 + */ +@Getter +@AllArgsConstructor +public enum RelationEnum { + COLLECT("collect","收藏"), + FOOT("foot","足迹"); + + private String value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/ScoreEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/ScoreEnum.java index 3e2f2fc..7d51fa4 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/ScoreEnum.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/ScoreEnum.java @@ -1,22 +1,22 @@ -package co.yixiang.yshop.module.product.enums.product; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 产品相关规格类型枚举 - */ -@Getter -@AllArgsConstructor -public enum ScoreEnum { - DEFAULT_0(0,"0分数"), - DEFAULT_1(1,"1分数"), - DEFAULT_2(2,"2分数"), - DEFAULT_3(3,"3分数"), - DEFAULT_4(4,"4分数"), - DEFAULT_5(5,"5分数"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.product.enums.product; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 产品相关规格类型枚举 + */ +@Getter +@AllArgsConstructor +public enum ScoreEnum { + DEFAULT_0(0,"0分数"), + DEFAULT_1(1,"1分数"), + DEFAULT_2(2,"2分数"), + DEFAULT_3(3,"3分数"), + DEFAULT_4(4,"4分数"), + DEFAULT_5(5,"5分数"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/SpecTypeEnum.java b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/SpecTypeEnum.java index fbb69ef..7850be8 100644 --- a/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/SpecTypeEnum.java +++ b/yshop-module-mall/yshop-module-product-api/src/main/java/co/yixiang/yshop/module/product/enums/product/SpecTypeEnum.java @@ -1,18 +1,18 @@ -package co.yixiang.yshop.module.product.enums.product; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author hupeng - * 产品相关规格类型枚举 - */ -@Getter -@AllArgsConstructor -public enum SpecTypeEnum { - TYPE_0(0,"单规格"), - TYPE_1(1,"多规格"); - - private Integer value; - private String desc; -} +package co.yixiang.yshop.module.product.enums.product; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hupeng + * 产品相关规格类型枚举 + */ +@Getter +@AllArgsConstructor +public enum SpecTypeEnum { + SINGLE_SPECS(0,"单规格"), + MULTIPLE_SPECS(1,"多规格"); + + private Integer value; + private String desc; +} diff --git a/yshop-module-mall/yshop-module-product-biz/pom.xml b/yshop-module-mall/yshop-module-product-biz/pom.xml index f909786..a31f383 100644 --- a/yshop-module-mall/yshop-module-product-biz/pom.xml +++ b/yshop-module-mall/yshop-module-product-biz/pom.xml @@ -57,6 +57,10 @@ co.yixiang.boot yshop-spring-boot-starter-excel + + co.yixiang.boot + yshop-spring-boot-starter-redis + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java new file mode 100644 index 0000000..4f967a3 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/ProductCouponController.java @@ -0,0 +1,61 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.service.productcoupon.ProductCouponService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 商品优惠券") +@RestController +@RequestMapping("/product/coupon") +@Validated +public class ProductCouponController { + + @Resource + private ProductCouponService couponService; + + + @PostMapping("/create") + @Operation(summary = "创建优惠券") + public CommonResult createCoupon(@Validated @RequestBody ProductCouponCreateReqVO vo) { + return success(couponService.createCoupon(vo)); + } + + @PostMapping("/update") + @Operation(summary = "修改优惠券") + public CommonResult updateCoupon(@Validated @RequestBody ProductCouponUpdateReqVO vo) { + couponService.updateCoupon(vo); + return success(true); + } + + @GetMapping("/detail/{id}") + @Operation(summary = "优惠券详情") + public CommonResult getCouponDetail(@PathVariable Long id) { + return success(couponService.getCouponDetail(id)); + } + + @GetMapping("/page") + @Operation(summary = "优惠券分页") + public CommonResult> getStoreProductPage(@Valid StoreProductCouponPageReqVO pageVO) { + return success(couponService.getStoreProductPage(pageVO)); + } + + @GetMapping("/delete/{id}") + @Operation(summary = "删除优惠券") + public CommonResult deleteCoupon(@PathVariable Long id) { + return success(couponService.deleteCoupon(id)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponBaseVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponBaseVO.java new file mode 100644 index 0000000..7792f8a --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponBaseVO.java @@ -0,0 +1,68 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** +* 商品优惠券 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ProductCouponBaseVO extends BaseDO { + + @Schema(description = "优惠券id", required = true, example = "1") + private Long id; + + @Schema(description = "优惠券名称", required = true, example = "1") + private String couponName; + + @Schema(description = "优惠券面值", required = true, example = "1") + private BigDecimal couponValue; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "满减门槛", required = true, example = "1") + private BigDecimal threshold; + + @Schema(description = "折扣", required = true, example = "1") + private BigDecimal discount; + + @Schema(description = "优惠券范围:1、所有商品,2、选中商品", required = true, example = "1") + private Integer couponScope; + + @Schema(description = "范围值", required = true, example = "1") + private String scopeValues; + + @Schema(description = "优惠券数量", required = true, example = "1") + private Long number; + + @Schema(description = "领取限制类型 1 无限制 2限制次数", required = true, example = "1") + private Integer receiveType; + + @Schema(description = "限制每人领取数量", required = true, example = "1") + private Long limitNumber; + + @Schema(description = "过期类型:1、按时间,2、按天数", required = true, example = "1") + private Integer expirationType; + + @Schema(description = "生效时间", required = true, example = "1") + private LocalDateTime takingEffectTime; + + @Schema(description = "过期时间", required = true, example = "1") + private LocalDateTime expirationTime; + + @Schema(description = "过期天数", required = true, example = "1") + private Long expirationDay; + + @Schema(description = "备注", required = true, example = "1") + private String remark; + + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponCreateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponCreateReqVO.java new file mode 100644 index 0000000..26d9db6 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponCreateReqVO.java @@ -0,0 +1,73 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 商品优惠券创建 Request VO") +@Data +@ToString(callSuper = true) +public class ProductCouponCreateReqVO{ + + @Schema(description = "优惠券名称", required = true, example = "1") + @NotBlank(message = "优惠券名称不能为空") + private String couponName; + + @Schema(description = "优惠券面值", required = true, example = "1") + private BigDecimal couponValue; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + @NotNull(message = "优惠券类型不能为空") + private Integer couponType; + + @Schema(description = "满减门槛", required = true, example = "1") + private BigDecimal threshold; + + @Schema(description = "折扣", required = true, example = "1") + private BigDecimal discount; + + @Schema(description = "优惠券范围类型:1、所有商品,2、选中商品", required = true, example = "1") + @NotNull(message = "优惠券范围类型不能为空") + private Integer couponScope; + + @Schema(description = "范围值", required = true, example = "1") + private String[] ids; + + @Schema(description = "优惠券数量", required = true, example = "1") + @NotNull(message = "优惠券数量不能为空") + private Long number; + + @Schema(description = "领取限制类型 1 无限制 2限制次数", required = true, example = "1") + @NotNull(message = "领取限制类型不能为空") + private Integer receiveType; + + @Schema(description = "限制每人领取数量", required = true, example = "1") + private Long limitNumber; + + @Schema(description = "过期类型:1、按时间,2、按天数", required = true, example = "1") + @NotNull(message = "过期类型不能为空") + private Integer expirationType; + + @Schema(description = "生效时间", required = true, example = "1") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime takingEffectTime; + + @Schema(description = "过期时间", required = true, example = "1") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationTime; + + @Schema(description = "过期天数", required = true, example = "1") + private Long expirationDay; + + @Schema(description = "备注", required = true, example = "1") + private String remark; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponDetailRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponDetailRespVO.java new file mode 100644 index 0000000..a0d651e --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponDetailRespVO.java @@ -0,0 +1,18 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +@Schema(description = "管理后台 - 商品优惠券明细") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ProductCouponDetailRespVO extends ProductCouponBaseVO { + + @Schema(description = "优惠券状态:1、进行中,2、已结束,3、未开始", required = true, example = "进行中") + private String status; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponUpdateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponUpdateReqVO.java new file mode 100644 index 0000000..8e116f5 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/ProductCouponUpdateReqVO.java @@ -0,0 +1,69 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 商品优惠券创建 Request VO") +@Data +@ToString(callSuper = true) +public class ProductCouponUpdateReqVO { + + @Schema(description = "优惠券id", required = true, example = "1") + @NotNull(message = "优惠券id不能为空") + private Long id; + + @Schema(description = "优惠券名称", required = true, example = "1") + private String couponName; + + @Schema(description = "优惠券面值", required = true, example = "1") + private BigDecimal couponValue; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "满减门槛", required = true, example = "1") + private BigDecimal threshold; + + @Schema(description = "折扣", required = true, example = "1") + private BigDecimal discount; + + @Schema(description = "优惠券范围类型:1、所有商品,2、选中商品", required = true, example = "1") + private Integer couponScope; + + @Schema(description = "范围值", required = true, example = "1") + private String[] ids; + + @Schema(description = "优惠券数量", required = true, example = "1") + private Long number; + + @Schema(description = "领取限制类型 1 无限制 2限制次数", required = true, example = "1") + private Integer receiveType; + + @Schema(description = "限制每人领取数量", required = true, example = "1") + private Long limitNumber; + + @Schema(description = "过期类型:1、按时间,2、按天数", required = true, example = "1") + private Integer expirationType; + + @Schema(description = "生效时间", required = true, example = "1") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime takingEffectTime; + + @Schema(description = "过期时间", required = true, example = "1") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationTime; + + @Schema(description = "过期天数", required = true, example = "1") + private Long expirationDay; + + @Schema(description = "备注", required = true, example = "1") + private String remark; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/StoreProductCouponPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/StoreProductCouponPageReqVO.java new file mode 100644 index 0000000..1ad4ed8 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/productcoupon/vo/StoreProductCouponPageReqVO.java @@ -0,0 +1,30 @@ +package co.yixiang.yshop.module.product.controller.admin.productcoupon.vo; + +import co.yixiang.yshop.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 商品优惠券分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StoreProductCouponPageReqVO extends PageParam { + + @Schema(description = "优惠券名称", example = "1") + private String couponName; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "优惠券范围:1、所有商品,2、选中商品", required = true, example = "1") + private Integer couponScope; + + @Schema(description = "过期类型:1、按时间,2、按天数", required = true, example = "1") + private Integer expirationType; + + @Schema(description = "领取限制类型 1 无限制 2限制次数", required = true, example = "1") + private Integer receiveType; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java index 6b6c0ff..89e8f5c 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/StoreProductController.java @@ -40,7 +40,7 @@ public class StoreProductController { @PostMapping("/create") @Operation(summary = "创建商品") @PreAuthorize("@ss.hasPermission('shop:store-product:create')") - public CommonResult createStoreProduct(@Validated @RequestBody StoreProductDto storeProductDto) { + public CommonResult createStoreProduct(@Valid @RequestBody StoreProductDto storeProductDto) { storeProductService.insertAndEditYxStoreProduct(storeProductDto); return success(true); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductCreateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductCreateReqVO.java index 7350221..ebbdc65 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductCreateReqVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductCreateReqVO.java @@ -31,7 +31,7 @@ public class StoreProductCreateReqVO extends StoreProductBaseVO { @Schema(description = "分类id", required = true, example = "4928") @NotNull(message = "分类id不能为空") - private String cateId; + private Long cateId; @Schema(description = "会员价格", example = "18248") private BigDecimal vipPrice; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java index 7657cc0..fc68851 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductPageReqVO.java @@ -27,7 +27,7 @@ public class StoreProductPageReqVO extends PageParam { private String stock; @Schema(description = "库存售罄", example = "0") - private String cateId; + private Long cateId; private List catIds; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductReplyQueryVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductReplyQueryVo.java new file mode 100644 index 0000000..00986b1 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductReplyQueryVo.java @@ -0,0 +1,76 @@ +package co.yixiang.yshop.module.product.controller.admin.storeproduct.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 评论表 查询结果对象 + *

+ * + * @author hupeng + * @date 2023-6-12 + */ +@Data +@Schema(description = "后台 - 评论表vo") +public class StoreProductReplyQueryVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "评论ID", required = true) + private Long id; + + @Schema(description = "产品id", required = true) + private Long productId; + + @Schema(description = "产品名称", required = true) + private Long productName; + + @Schema(description = "某种商品类型(普通商品、秒杀商品)", required = true) + private String replyType; + + @Schema(description = "商品分数", required = true) + private Integer productScore; + + @Schema(description = "服务分数", required = true) + private Integer serviceScore; + + @Schema(description = "评论内容", required = true) + private String comment; + + @Schema(description = "评论图片", required = true) + private String []pics; + + @Schema(description = "评论图片,字符串", required = true) + private String pictures; + + @Schema(description = "管理员回复内容", required = true) + private String merchantReplyContent; + + @Schema(description = "管理员回复时间", required = true) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date merchantReplyTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + @Schema(description = "发布时间", required = true) + private Date createTime; + + @Schema(description = "评价星星数", required = true) + private String star; + + @Schema(description = "用户昵称", required = true) + private String nickname; + + @Schema(description = "用户头像", required = true) + private String avatar; + + @Schema(description = "商品sku", required = true) + private String sku; + + private String cartInfo; + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java index 40518a7..b03164e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproduct/vo/StoreProductUpdateReqVO.java @@ -35,7 +35,7 @@ public class StoreProductUpdateReqVO extends StoreProductBaseVO { @Schema(description = "分类id", required = true, example = "4928") @NotNull(message = "分类id不能为空") - private String cateId; + private Long cateId; @Schema(description = "会员价格", example = "18248") private BigDecimal vipPrice; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/StoreProductRelationController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/StoreProductRelationController.java index aef5906..3fbf2f9 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/StoreProductRelationController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/StoreProductRelationController.java @@ -4,9 +4,6 @@ import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationPageReqVO; import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationRespVO; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductReplyQueryVo; -import co.yixiang.yshop.module.product.convert.storeproductrelation.StoreProductRelationConvert; -import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; import co.yixiang.yshop.module.product.service.storeproductrelation.StoreProductRelationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -17,8 +14,6 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; -import java.util.Collection; -import java.util.List; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; @@ -46,11 +41,9 @@ public class StoreProductRelationController { @GetMapping("/page") @Operation(summary = "获得商品点赞和收藏分页") @PreAuthorize("@ss.hasPermission('product:store-product-relation:query')") - public CommonResult> getStoreProductRelationPage(@Valid StoreProductRelationPageReqVO pageVO) { - PageResult pageResult = storeProductRelationService.getStoreProductRelationPage(pageVO); + public CommonResult> getStoreProductRelationPage(@Valid StoreProductRelationPageReqVO pageVO) { + PageResult pageResult = storeProductRelationService.getStoreProductRelationPage(pageVO); return success(pageResult); } - - } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationPageReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationPageReqVO.java index 41750e5..3d0511b 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationPageReqVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationPageReqVO.java @@ -21,8 +21,8 @@ public class StoreProductRelationPageReqVO extends PageParam { @Schema(description = "商品ID", example = "8816") private Long productId; - @Schema(description = "类型(收藏(collect)、点赞(like))", example = "2") - private String type; + @Schema(description = "类型(收藏(collect)、点赞(like))", example = "collect") + private String type = "collect"; @Schema(description = "某种类型的商品(普通商品、秒杀商品)") private String category; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationRespVO.java index da17c29..a241ab0 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationRespVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrelation/vo/StoreProductRelationRespVO.java @@ -3,6 +3,7 @@ package co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; +import java.util.Date; @Schema(description = "管理后台 - 商品点赞和收藏 Response VO") @Data @@ -13,7 +14,17 @@ public class StoreProductRelationRespVO extends StoreProductRelationBaseVO { @Schema(description = "id", required = true, example = "24658") private Long id; + @Schema(description = "添加时间", required = true) - private LocalDateTime createTime; + private Date createTime; + + @Schema(description = "商品名称", required = true) + private String storeName; + + @Schema(description = "用户昵称", required = true) + private String nickname; + + @Schema(description = "用户头像", required = true) + private String avatar; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/StoreProductReplyController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/StoreProductReplyController.java index 201e9ff..d8a526e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/StoreProductReplyController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/StoreProductReplyController.java @@ -65,6 +65,13 @@ public class StoreProductReplyController { return success(StoreProductReplyConvert.INSTANCE.convert(storeProductReply)); } + @PostMapping("/merchantReply") + @Operation(summary = "回复") + @PreAuthorize("@ss.hasPermission('product:store-product-reply:update')") + public CommonResult merchantReply(@Valid @RequestBody StoreProductMerchantReplyReqVO reqVO) { + return success( storeProductReplyService.merchantReply(reqVO)); + } + @GetMapping("/page") @Operation(summary = "获得评论分页") diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/vo/StoreProductMerchantReplyReqVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/vo/StoreProductMerchantReplyReqVO.java new file mode 100644 index 0000000..ff1fff6 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductreply/vo/StoreProductMerchantReplyReqVO.java @@ -0,0 +1,29 @@ +package co.yixiang.yshop.module.product.controller.admin.storeproductreply.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 管理员回复 Request VO") +@Data +@ToString(callSuper = true) +public class StoreProductMerchantReplyReqVO { + + @Schema(description = "评论ID", required = true, example = "7419") + @NotNull(message = "评论ID不能为空") + private Long id; + + @NotNull(message = "回复内容不能为空") + @Size(max = 250,message = "回复字数不能超过250个字符") + @Schema(description = "管理员回复内容") + private String merchantReplyContent; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/StoreProductRuleController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/StoreProductRuleController.java index 1e0434f..7447f0f 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/StoreProductRuleController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/StoreProductRuleController.java @@ -1,7 +1,9 @@ package co.yixiang.yshop.module.product.controller.admin.storeproductrule; import org.springframework.web.bind.annotation.*; + import javax.annotation.Resource; + import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import io.swagger.v3.oas.annotations.tags.Tag; @@ -15,11 +17,13 @@ import java.io.IOException; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.common.pojo.CommonResult; + import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; import co.yixiang.yshop.framework.excel.core.util.ExcelUtils; import co.yixiang.yshop.framework.operatelog.core.annotations.OperateLog; + import static co.yixiang.yshop.framework.operatelog.core.enums.OperateTypeEnum.*; import co.yixiang.yshop.module.product.controller.admin.storeproductrule.vo.*; @@ -40,16 +44,16 @@ public class StoreProductRuleController { @PostMapping("/save/{id}") @Operation(summary = "创建与更新商品规则值(规格)") @PreAuthorize("@ss.hasPermission('shop:store-product-rule:create')") - public CommonResult createStoreProductRule(@Valid @RequestBody StoreProductRuleCreateReqVO createReqVO,@PathVariable Integer id) { - if(id != null && id > 0){ + public CommonResult createStoreProductRule(@Valid @RequestBody StoreProductRuleCreateReqVO createReqVO, @PathVariable Integer id) { + if (id != null && id > 0) { StoreProductRuleUpdateReqVO updateReqVO = new StoreProductRuleUpdateReqVO(); updateReqVO.setId(id); updateReqVO.setRuleName(createReqVO.getRuleName()); updateReqVO.setRuleValue(createReqVO.getRuleValue()); storeProductRuleService.updateStoreProductRule(updateReqVO); return success(1); - }else{ - return success(storeProductRuleService.createStoreProductRule(createReqVO)); + } else { + return success(storeProductRuleService.createStoreProductRule(createReqVO)); } } @@ -86,7 +90,7 @@ public class StoreProductRuleController { @PreAuthorize("@ss.hasPermission('shop:store-product-rule:query')") public CommonResult> getStoreProductRulePage(@Valid StoreProductRulePageReqVO pageVO) { PageResult pageResult = storeProductRuleService.getStoreProductRulePage(pageVO); - System.out.println("aa:"+pageResult); + System.out.println("aa:" + pageResult); return success(StoreProductRuleConvert.INSTANCE.convertPage(pageResult)); } @@ -95,10 +99,20 @@ public class StoreProductRuleController { @PreAuthorize("@ss.hasPermission('shop:store-product-rule:export')") @OperateLog(type = EXPORT) public void exportStoreProductRuleExcel(@Valid StoreProductRuleExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { List list = storeProductRuleService.getStoreProductRuleList(exportReqVO); - // 导出 Excel - List datas = StoreProductRuleConvert.INSTANCE.convertList02(list); + // 导出 Excel转换list数据 + List datas = new ArrayList<>(); + + list.forEach(sprDO -> { + StoreProductRuleExcelVO storeProductRuleExcelVO = new StoreProductRuleExcelVO(); + storeProductRuleExcelVO.setId(sprDO.getId()); + storeProductRuleExcelVO.setRuleName(sprDO.getRuleName()); + storeProductRuleExcelVO.setRuleValue(sprDO.getRuleValue().toJSONString()); + storeProductRuleExcelVO.setCreateTime(sprDO.getCreateTime()); + datas.add(storeProductRuleExcelVO); + } + ); ExcelUtils.write(response, "商品规则值(规格).xls", "数据", StoreProductRuleExcelVO.class, datas); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/vo/StoreProductRuleExcelVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/vo/StoreProductRuleExcelVO.java index cbd6ee1..406531c 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/vo/StoreProductRuleExcelVO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/admin/storeproductrule/vo/StoreProductRuleExcelVO.java @@ -15,14 +15,14 @@ import com.alibaba.excel.annotation.ExcelProperty; @Data public class StoreProductRuleExcelVO { - @ExcelProperty("id") + @ExcelProperty("规格id") private Integer id; @ExcelProperty("规格名称") private String ruleName; @ExcelProperty("规格值") - private JSONArray ruleValue; + private String ruleValue; @ExcelProperty("创建时间") private LocalDateTime createTime; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java new file mode 100644 index 0000000..05c1449 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/AppCouponController.java @@ -0,0 +1,35 @@ +package co.yixiang.yshop.module.product.controller.app.coupon; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; +import co.yixiang.yshop.module.product.service.productcoupon.AppCouponService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 APP - 商品优惠券") +@RestController +@RequestMapping("/product/coupon") +@Validated +public class AppCouponController { + + @Resource + private AppCouponService appCouponService; + + + @GetMapping("/receive-list/{productId}") + @Operation(summary = "查询商品可领优惠券") + @Parameter(name = "productId", description = "商品id", required = true, example = "1") + public CommonResult> receiveList(@PathVariable Long productId) { + return success(appCouponService.receiveList(productId)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/vo/AppCouponBaseVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/vo/AppCouponBaseVO.java new file mode 100644 index 0000000..f828ef4 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/vo/AppCouponBaseVO.java @@ -0,0 +1,67 @@ +package co.yixiang.yshop.module.product.controller.app.coupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** +* App优惠券 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class AppCouponBaseVO { + + @Schema(description = "优惠券id", required = true, example = "1") + private Long id; + + @Schema(description = "优惠券名称", required = true, example = "1") + private String couponName; + + @Schema(description = "优惠券面值", required = true, example = "1") + private BigDecimal couponValue; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "满减门槛", required = true, example = "1") + private BigDecimal threshold; + + @Schema(description = "折扣", required = true, example = "1") + private BigDecimal discount; + + @Schema(description = "优惠券范围:1、所有商品,2、选中商品", required = true, example = "1") + private Integer couponScope; + + @Schema(description = "范围值", required = true, example = "1") + private String scopeValues; + + @Schema(description = "优惠券数量", required = true, example = "1") + private Long number; + + @Schema(description = "生效时间", required = true, example = "1") + private LocalDateTime takingEffectTime; + + @Schema(description = "过期时间", required = true, example = "1") + private LocalDateTime expirationTime; + + @Schema(description = "领取限制类型 1 无限制 2限制次数", required = true, example = "1") + private Integer receiveType; + + @Schema(description = "限制每人领取数量", required = true, example = "1") + private Long limitNumber; + + @Schema(description = "过期类型:1、按时间,2、按天数", required = true, example = "1") + private Integer expirationType; + + @Schema(description = "过期天数", required = true, example = "1") + private Long expirationDay; + + @Schema(description = "备注", required = true, example = "1") + private String remark; + + + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/vo/AppCouponDetailRespVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/vo/AppCouponDetailRespVO.java new file mode 100644 index 0000000..2d60fda --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/coupon/vo/AppCouponDetailRespVO.java @@ -0,0 +1,15 @@ +package co.yixiang.yshop.module.product.controller.app.coupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +@Schema(description = "用户 APP - 优惠券明细") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppCouponDetailRespVO extends AppCouponBaseVO { + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java new file mode 100644 index 0000000..4952b43 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/AppCouponRelationController.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.product.controller.app.couponrelation; + +import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; +import co.yixiang.yshop.module.product.service.productcouponrelation.AppCouponRelationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +import java.util.List; + +import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 APP - 商品优惠券关联") +@RestController +@RequestMapping("/product/coupon/relation") +@Validated +public class AppCouponRelationController { + + @Resource + private AppCouponRelationService appCouponRecordService; + + + @GetMapping("/receive/{id}") + @Operation(summary = "领取优惠券") + @Parameter(name = "id", description = "优惠券id", required = true, example = "1") + public CommonResult receiveCoupon(@PathVariable Long id) { + appCouponRecordService.receiveCoupon(id); + return success(true); + } + + @GetMapping("/searchUserCoupon/{type}") + @Operation(summary = "查询优惠券") + @Parameter(name = "type", description = "查询类型:1、可使用,2、已使用,3、已失效", required = true, example = "1") + public CommonResult> searchUserCoupon(@PathVariable Integer type) { + return success(appCouponRecordService.searchUserCoupon(type, null)); + } + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/vo/CartCouponVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/vo/CartCouponVO.java new file mode 100644 index 0000000..f44f238 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/vo/CartCouponVO.java @@ -0,0 +1,60 @@ +package co.yixiang.yshop.module.product.controller.app.couponrelation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** +* 购物车优惠券VO +*/ +@Data +public class CartCouponVO { + + @Schema(description = "优惠券明细id", required = true, example = "1") + private Long detailId; + + @Schema(description = "优惠券id", required = true, example = "1") + private Long id; + + @Schema(description = "优惠券名称", required = true, example = "1") + private String couponName; + + @Schema(description = "优惠券面值", required = true, example = "1") + private BigDecimal couponValue; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "满减门槛", required = true, example = "1") + private BigDecimal threshold; + + @Schema(description = "折扣", required = true, example = "1") + private BigDecimal discount; + + @Schema(description = "优惠券范围:1、所有商品,2、选中类型,3、选中商品", required = true, example = "1") + private Integer couponScope; + + + @Schema(description = "范围值", required = true, example = "1") + private String scopeValues; + + @Schema(description = "生效时间", required = true, example = "1") + private LocalDateTime takingEffectTime; + + @Schema(description = "过期时间", required = true, example = "1") + private LocalDateTime expirationTime; + + @Schema(description = "备注", required = true, example = "1") + private String remark; + + @Schema(description = "领取时间", required = true, example = "1") + private LocalDateTime receiveTime; + + @Schema(description = "优惠金额", required = true, example = "1") + private BigDecimal discountAmount; + + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/vo/UserCouponVO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/vo/UserCouponVO.java new file mode 100644 index 0000000..dbc6e6d --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/couponrelation/vo/UserCouponVO.java @@ -0,0 +1,71 @@ +package co.yixiang.yshop.module.product.controller.app.couponrelation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** +* 用户优惠券VO +*/ +@Data +public class UserCouponVO { + + @Schema(description = "优惠券明细id", required = true, example = "1") + private Long detailId; + + @Schema(description = "优惠券id", required = true, example = "1") + private Long id; + + @Schema(description = "优惠券名称", required = true, example = "1") + private String couponName; + + @Schema(description = "优惠券面值", required = true, example = "1") + private BigDecimal couponValue; + + @Schema(description = "优惠券类型:1、满减券,2、折扣券", required = true, example = "1") + private Integer couponType; + + @Schema(description = "满减门槛", required = true, example = "1") + private BigDecimal threshold; + + @Schema(description = "折扣", required = true, example = "1") + private BigDecimal discount; + + @Schema(description = "优惠券范围:1、所有商品,2、选中类型,3、选中商品", required = true, example = "1") + private Integer couponScope; + + @Schema(description = "范围值", required = true, example = "1") + private String scopeValues; + + @Schema(description = "优惠券数量", required = true, example = "1") + private Long number; + + @Schema(description = "领取限制类型 1 无限制 2限制次数", required = true, example = "1") + private Integer receiveType; + + @Schema(description = "限制每人领取数量", required = true, example = "1") + private Long limitNumber; + + @Schema(description = "过期类型:1、按时间,2、按天数", required = true, example = "1") + private Integer expirationType; + + @Schema(description = "生效时间", required = true, example = "1") + private LocalDateTime takingEffectTime; + + @Schema(description = "过期时间", required = true, example = "1") + private LocalDateTime expirationTime; + + @Schema(description = "过期天数", required = true, example = "1") + private Long expirationDay; + + @Schema(description = "备注", required = true, example = "1") + private String remark; + + @Schema(description = "领取时间", required = true, example = "1") + private LocalDateTime receiveTime; + + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java index 66193fe..41a3cdc 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/AppStoreProductController.java @@ -16,6 +16,7 @@ import co.yixiang.yshop.module.product.controller.app.product.vo.*; import co.yixiang.yshop.module.product.enums.product.ProductEnum; import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; import co.yixiang.yshop.module.product.service.storeproductreply.AppStoreProductReplyService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; @@ -26,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Set; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -54,53 +56,49 @@ public class AppStoreProductController { */ @GetMapping("/shop/index") @Operation(summary = "获取首页信息") - public CommonResult index(){ + public CommonResult index() { AppIndexVo indexVo = AppIndexVo.builder() - .firstList(storeProductService.getList(1,3, ProductEnum.TYPE_3.getValue())) - .likeInfo(storeProductService.getList(1,3,ProductEnum.TYPE_2.getValue())) + .firstList(storeProductService.getList(1, 3, ProductEnum.TYPE_3.getValue())) + .likeInfo(storeProductService.getList(1, 3, ProductEnum.TYPE_2.getValue())) .build(); return success(indexVo); } - - /** * 获取产品列表 */ @GetMapping("/products") @Operation(summary = "商品列表") - public CommonResult> goodsList(AppStoreProductQueryParam productQueryParam){ + public CommonResult> goodsList(AppStoreProductQueryParam productQueryParam) { return success(storeProductService.getGoodsList(productQueryParam)); } - /** * 为你推荐 */ @GetMapping("/hot") @Operation(summary = "为你推荐") - public CommonResult> productRecommend(){ + public CommonResult> productRecommend() { return success(storeProductService.getList(1, 4, ProductEnum.TYPE_2.getValue())); } - /** * 普通商品详情 */ @GetMapping("/detail/{id}") @Operation(summary = "普通商品详情") @Parameter(name = "id", description = "商品ID", required = true, example = "1024") - public CommonResult detail(@PathVariable long id){ + public CommonResult detail(@PathVariable long id) { long uid = 0; - System.out.println("uid:"+getLoginUserId()); - if(ObjectUtil.isNotNull(getLoginUserId())) { + System.out.println("uid:" + getLoginUserId()); + if (ObjectUtil.isNotNull(getLoginUserId())) { uid = getLoginUserId(); } - AppProductVo productVo = storeProductService.goodsDetail(id,uid); + AppProductVo productVo = storeProductService.goodsDetail(id, uid); return success(productVo); } @@ -112,19 +110,19 @@ public class AppStoreProductController { @Parameters({ @Parameter(name = "id", description = "商品ID", required = true, example = "1"), - @Parameter(name = "type", description = "评论分数类型 0-全部 1-好评 2-中评 3-差评", + @Parameter(name = "type", description = "评论分数类型 0-全部 1-好评 2-中评 3-差评 4-有图", required = true, example = "1"), @Parameter(name = "page", description = "页码,默认为1", required = true, example = "1"), @Parameter(name = "limit", description = "页大小,默认为10", - required = true, example = "10 ") + required = true, example = "10") }) @Operation(summary = "获取产品评论") - public CommonResult> replyList(@PathVariable Long id, - @RequestParam(value = "type",defaultValue = "0") int type, - @RequestParam(value = "page",defaultValue = "1") int page, - @RequestParam(value = "limit",defaultValue = "10") int limit){ - return success(appStoreProductReplyService.getReplyList(id,type, page,limit)); + public CommonResult> replyList(@PathVariable Long id, + @RequestParam(value = "type", defaultValue = "0") int type, + @RequestParam(value = "page", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "10") int limit) { + return success(appStoreProductReplyService.getReplyList(id, type, page, limit)); } /** @@ -133,11 +131,46 @@ public class AppStoreProductController { @GetMapping("/reply/config/{id}") @Parameter(name = "id", description = "商品ID", required = true, example = "1") @Operation(summary = "获取产品评论数据") - public CommonResult replyCount(@PathVariable Integer id){ + public CommonResult replyCount(@PathVariable Integer id) { return success(appStoreProductReplyService.getReplyCount(id)); } + /** + * 商品历史搜索记录 + */ + @GetMapping("/search/history") + @Operation(summary = "商品历史搜索记录") + public CommonResult> searchHistory() { + long uid = 0; + if (ObjectUtil.isNotNull(getLoginUserId())) { + uid = getLoginUserId(); + } + return success(storeProductService.listRecentSearch(uid)); + } + + /** + * 清除商品历史搜索记录 + */ + @PostMapping("/search/history/del") + @Operation(summary = "清除商品历史搜索记录") + public CommonResult delSearchHistory() { + long uid = 0; + if (ObjectUtil.isNotNull(getLoginUserId())) { + uid = getLoginUserId(); + } + storeProductService.removeSearchHistoryAll(uid); + return success(true); + } + + /** + * 热门搜索 + */ + @GetMapping("/search/popular/{start}/{end}") + @Operation(summary = "热门搜索") + public CommonResult> searchPopular(@PathVariable Long start,@PathVariable Long end) { + return success(storeProductService.searchPopular(start, end)); + } } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java index 7171849..1bf8ebf 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppProductVo.java @@ -56,4 +56,6 @@ public class AppProductVo { @Schema(description = "模版名称", required = true) private String tempName; + @Schema(description = "优惠信息", required = true) + private String couponSplicing; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppReplyCountVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppReplyCountVo.java index 6cf84f0..30b6ebe 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppReplyCountVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppReplyCountVo.java @@ -1,38 +1,38 @@ -package co.yixiang.yshop.module.product.controller.app.product.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -import java.io.Serializable; - -/** - * @ClassName ReplyCount - * @Author hupeng <610796224@qq.com> - * @Date 2023/7/9 - **/ -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class AppReplyCountVo implements Serializable { - - @Schema(description = "总的评论数", required = true) - private Long sumCount; - - @Schema(description = "好评数", required = true) - private Long goodCount; - - @Schema(description = "中评数", required = true) - private Long inCount; - - @Schema(description = "差评数", required = true) - private Long poorCount; - - @Schema(description = "好评率", required = true) - private String replyChance; - - @Schema(description = "好评星星数", required = true) - private String replySstar; - -} +package co.yixiang.yshop.module.product.controller.app.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.io.Serializable; + +/** + * @ClassName ReplyCount + * @Author hupeng <610796224@qq.com> + * @Date 2023/7/9 + **/ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AppReplyCountVo implements Serializable { + + @Schema(description = "总的评论数", required = true) + private Long sumCount; + + @Schema(description = "好评数", required = true) + private Long goodCount; + + @Schema(description = "中评数", required = true) + private Long inCount; + + @Schema(description = "差评数", required = true) + private Long poorCount; + + @Schema(description = "好评率", required = true) + private String replyChance; + + @Schema(description = "好评星星数", required = true) + private String replySstar; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductReplyQueryVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductReplyQueryVo.java index 69b8f39..406409f 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductReplyQueryVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductReplyQueryVo.java @@ -1,7 +1,6 @@ package co.yixiang.yshop.module.product.controller.app.product.vo; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -21,53 +20,53 @@ import java.util.Date; public class AppStoreProductReplyQueryVo implements Serializable { private static final long serialVersionUID = 1L; - @Schema(description = "评论ID", required = true) + @Schema(description = "评论ID", requiredMode = Schema.RequiredMode.REQUIRED) private Long id; - @Schema(description = "产品id", required = true) + @Schema(description = "产品id", requiredMode = Schema.RequiredMode.REQUIRED) private Long productId; - @Schema(description = "某种商品类型(普通商品、秒杀商品)", required = true) + @Schema(description = "某种商品类型(普通商品、秒杀商品)", requiredMode = Schema.RequiredMode.REQUIRED) private String replyType; - @Schema(description = "商品分数", required = true) + @Schema(description = "商品分数", requiredMode = Schema.RequiredMode.REQUIRED) private Integer productScore; - @Schema(description = "服务分数", required = true) + @Schema(description = "服务分数", requiredMode = Schema.RequiredMode.REQUIRED) private Integer serviceScore; - @Schema(description = "评论内容", required = true) + @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED) private String comment; - @Schema(description = "评论图片", required = true) - private String[] pics; + @Schema(description = "评论图片", requiredMode = Schema.RequiredMode.REQUIRED) + private String []pics; - @Schema(description = "评论图片,字符串", required = true) + @Schema(description = "评论图片,字符串", requiredMode = Schema.RequiredMode.REQUIRED) private String pictures; - @Schema(description = "管理员回复内容", required = true) + @Schema(description = "管理员回复内容", requiredMode = Schema.RequiredMode.REQUIRED) private String merchantReplyContent; - @Schema(description = "管理员回复时间", required = true) + @Schema(description = "管理员回复时间", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date merchantReplyTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") - @Schema(description = "发布时间", required = true) + @Schema(description = "发布时间", requiredMode = Schema.RequiredMode.REQUIRED) private Date createTime; - @Schema(description = "评价星星数", required = true) + @Schema(description = "评价星星数", requiredMode = Schema.RequiredMode.REQUIRED) private String star; - @Schema(description = "用户昵称", required = true) + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED) private String nickname; - @Schema(description = "用户头像", required = true) + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED) private String avatar; - @Schema(description = "商品sku", required = true) + @Schema(description = "商品sku", requiredMode = Schema.RequiredMode.REQUIRED) private String sku; - @JsonIgnore private String cartInfo; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java index d9d3167..9daac24 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/product/vo/AppStoreProductRespVo.java @@ -85,4 +85,8 @@ public class AppStoreProductRespVo implements Serializable { @Schema(description = "运费模板id", required = true) private Integer tempId; + @Schema(description = "新品(0:默认,1:新品)",required = true) + private Integer isNew; + + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/AppStoreProductRelationController.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/AppStoreProductRelationController.java index 8743120..6a4b303 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/AppStoreProductRelationController.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/AppStoreProductRelationController.java @@ -10,17 +10,12 @@ package co.yixiang.yshop.module.product.controller.app.relation; import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; import co.yixiang.yshop.framework.common.pojo.CommonResult; +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; import co.yixiang.yshop.framework.security.core.annotations.PreAuthenticated; -import co.yixiang.yshop.module.product.controller.app.product.param.AppStoreProductQueryParam; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppIndexVo; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppProductVo; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductRespVo; import co.yixiang.yshop.module.product.controller.app.relation.param.AppStoreProductRelationQueryParam; +import co.yixiang.yshop.module.product.controller.app.relation.param.BatchDelAppStoreProductRelationQueryParam; import co.yixiang.yshop.module.product.controller.app.relation.vo.AppStoreProductRelationQueryVo; -import co.yixiang.yshop.module.product.enums.product.ProductEnum; -import co.yixiang.yshop.module.product.service.storeproduct.AppStoreProductService; import co.yixiang.yshop.module.product.service.storeproductrelation.AppStoreProductRelationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -35,9 +30,8 @@ import java.util.List; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; -import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static co.yixiang.yshop.framework.web.core.util.WebFrameworkUtils.getLoginUserId; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.PARAM_ERROR; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_RELATION_EXISTS; /** *

@@ -63,43 +57,54 @@ public class AppStoreProductRelationController { @PostMapping("/collect/add") @Operation(summary = "添加收藏") @PreAuthenticated - public CommonResult collectAdd(@Validated @RequestBody AppStoreProductRelationQueryParam param){ - long uid = getLoginUserId(); - if(!NumberUtil.isNumber(param.getId())) { + public CommonResult collectAdd(@Validated @RequestBody AppStoreProductRelationQueryParam param) { + if (!NumberUtil.isNumber(param.getProductId())) { throw exception(PARAM_ERROR); } - appStoreProductRelationService.addRroductRelation(Long.valueOf(param.getId()),uid,param.getCategory()); + appStoreProductRelationService.addProductRelation(Long.parseLong(param.getProductId()), getLoginUserId(), param.getCategory()); return success(true); } /** - * 取消收藏 + * 取消收藏/删除足迹 */ @PreAuthenticated @PostMapping("/collect/del") @Operation(summary = "取消收藏") - public CommonResult collectDel(@Validated @RequestBody AppStoreProductRelationQueryParam param){ - long uid = getLoginUserId(); - if(!NumberUtil.isNumber(param.getId())) { + public CommonResult collectDel(@Validated @RequestBody AppStoreProductRelationQueryParam param) { + if (!NumberUtil.isNumber(param.getProductId())) { throw exception(PARAM_ERROR); } - appStoreProductRelationService.delRroductRelation(Long.valueOf(param.getId()), - uid,param.getCategory()); + appStoreProductRelationService.delProductRelation(Long.parseLong(param.getProductId()), + getLoginUserId(), param.getCategory(),param.getType()); return success(true); } /** - * 获取收藏产品 + * 批量取消收藏 + */ + @PreAuthenticated + @PostMapping("/collect/batchDel") + @Operation(summary = "批量取消收藏/足迹") + public CommonResult batchDelCollect(@Validated @RequestBody BatchDelAppStoreProductRelationQueryParam param) { + if (CollectionUtils.isAnyEmpty(param.getProductIdList())) { + throw exception(PARAM_ERROR); + } + appStoreProductRelationService.batchDelProductRelation(param.getProductIdList(), getLoginUserId(), param.getCategory(),param.getType()); + return success(true); + } + + /** + * 获取收藏产品,足迹 */ @PreAuthenticated @GetMapping("/collect/user") @Operation(summary = "获取收藏产品,或足迹") - @Parameter(name = "type", description = "类型 collect 收藏 root足迹", required = true) - public CommonResult> collectUser(@RequestParam(value = "page",defaultValue = "1") int page, - @RequestParam(value = "limit",defaultValue = "10") int limit, - @RequestParam(value = "type") String type){ - long uid = getLoginUserId(); - return success(appStoreProductRelationService.userCollectProduct(page,limit,uid,type)); + @Parameter(name = "type", description = "类型 collect 收藏 foot足迹", required = true) + public CommonResult> collectRootUser(@RequestParam(value = "page", defaultValue = "1") Integer page, + @RequestParam(value = "limit", defaultValue = "10") Integer limit, + @RequestParam(value = "type") String type) { + return success(appStoreProductRelationService.userCollectRootProductList(page, limit, getLoginUserId(), type)); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/AppStoreProductRelationQueryParam.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/AppStoreProductRelationQueryParam.java index 42af128..42b6671 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/AppStoreProductRelationQueryParam.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/AppStoreProductRelationQueryParam.java @@ -22,9 +22,12 @@ import javax.validation.constraints.NotBlank; public class AppStoreProductRelationQueryParam { @NotBlank(message = "参数有误") - @Schema(description = "商品id", required = true) - private String id; + @Schema(description = "商品id", requiredMode = Schema.RequiredMode.REQUIRED) + private String productId; - @Schema(description = "商品类型,参见RelationCateEnum", required = true) - private String category; + @Schema(description = "类型,collect|foot|like") + private String type = "collect"; + + @Schema(description = "商品类型,参见RelationCateEnum,默认值common") + private String category = "common"; } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/BatchDelAppStoreProductRelationQueryParam.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/BatchDelAppStoreProductRelationQueryParam.java new file mode 100644 index 0000000..104efc7 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/controller/app/relation/param/BatchDelAppStoreProductRelationQueryParam.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.product.controller.app.relation.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + *

+ * 商品点赞和收藏表 查询参数对象 + *

+ * + * @author hupeng + * @date 2019-10-23 + */ +@Data +@Schema(description = "用户 APP - 批量删除收藏/足迹查询参数") +public class BatchDelAppStoreProductRelationQueryParam { + + @Schema(description = "商品id", requiredMode = Schema.RequiredMode.REQUIRED) + private List productIdList; + + @Schema(description = "商品类型,参见RelationCateEnum,默认值common",defaultValue = "common") + private String category = "common"; + + @Schema(description = "collect/foot",defaultValue = "collect") + private String type = "collect"; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java new file mode 100644 index 0000000..6e4efbb --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcoupon/StoreProductCouponConvert.java @@ -0,0 +1,36 @@ +package co.yixiang.yshop.module.product.convert.storeproductcoupon; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.StoreProductRespVO; +import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + + +/** + * 商品优惠券 Convert + * + * @author moxiangrong + */ +@Mapper +public interface StoreProductCouponConvert { + + StoreProductCouponConvert INSTANCE = Mappers.getMapper(StoreProductCouponConvert.class); + + ProductCouponDO convert(ProductCouponCreateReqVO vo); + + ProductCouponDO convert(ProductCouponUpdateReqVO vo); + + ProductCouponDetailRespVO convert(ProductCouponDO couponDO); + + PageResult convertPage(PageResult page); + + List convertList(List page); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcouponrelation/StoreProductCouponRelationConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcouponrelation/StoreProductCouponRelationConvert.java new file mode 100644 index 0000000..9b1246c --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductcouponrelation/StoreProductCouponRelationConvert.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.product.convert.storeproductcouponrelation; + +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + + +/** + * 商品优惠券 Convert + * + * @author moxiangrong + */ +@Mapper +public interface StoreProductCouponRelationConvert { + + StoreProductCouponRelationConvert INSTANCE = Mappers.getMapper(StoreProductCouponRelationConvert.class); + + List convert(List userCouponVOList); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductrule/StoreProductRuleConvert.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductrule/StoreProductRuleConvert.java index 1e28082..d7ba517 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductrule/StoreProductRuleConvert.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/convert/storeproductrule/StoreProductRuleConvert.java @@ -29,6 +29,4 @@ public interface StoreProductRuleConvert { PageResult convertPage(PageResult page); - List convertList02(List list); - } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/productcoupon/ProductCouponDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/productcoupon/ProductCouponDO.java new file mode 100644 index 0000000..ae449b9 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/productcoupon/ProductCouponDO.java @@ -0,0 +1,91 @@ +package co.yixiang.yshop.module.product.dal.dataobject.productcoupon; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 商品优惠券 DO + * + * + * @author moxiangrong + */ +@TableName("yshop_store_product_coupon") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProductCouponDO extends BaseDO { + + /** + * 优惠券id + */ + @TableId + private Long id; + /** + * 优惠券名称 + */ + private String couponName; + /** + * 优惠券面值 + */ + private BigDecimal couponValue; + /** + * 优惠券类型:1、满减券,2、折扣券 + */ + private Integer couponType; + /** + * 满减门槛 + */ + private BigDecimal threshold; + /** + * 折扣 + */ + private BigDecimal discount; + /** + * 优惠券范围:1、所有商品,2、选中类型,3、选中商品 + */ + private Integer couponScope; + /** + * 范围值 + */ + private String scopeValues; + /** + * 优惠券数量 + */ + private Long number; + /** + * 领取限制类型 1 无限制 2限制次数 + */ + private Integer receiveType; + /** + * 限制每人领取数量 + */ + private Long limitNumber; + /** + * 过期类型:1、按时间,2、按天数 + */ + private Integer expirationType; + /** + * 生效时间 + */ + private LocalDateTime takingEffectTime; + /** + * 过期时间 + */ + private LocalDateTime expirationTime; + /** + * 过期天数 + */ + private Long expirationDay; + /** + * 备注 + */ + private String remark; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/productcouponrelation/ProductCouponRelationDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/productcouponrelation/ProductCouponRelationDO.java new file mode 100644 index 0000000..911c967 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/productcouponrelation/ProductCouponRelationDO.java @@ -0,0 +1,50 @@ +package co.yixiang.yshop.module.product.dal.dataobject.productcouponrelation; + +import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 商品优惠券关联 DO + * + * + * @author moxiangrong + */ +@TableName("yshop_store_product_coupon_relation") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProductCouponRelationDO extends BaseDO { + + /** + * 优惠券关联id + */ + @TableId + private Long id; + /** + * 优惠券id + */ + private Long couponId; + /** + * 用户id + */ + private Long uid; + /** + * 是否使用 + */ + private Integer isUsed; + /** + * 领取时间 + */ + private LocalDateTime receiveTime; + /** + * 使用时间 + */ + private LocalDateTime usageTime; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java index 65176d6..541bb6f 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/dataobject/storeproduct/StoreProductDO.java @@ -60,7 +60,7 @@ public class StoreProductDO extends BaseDO { /** * 分类id */ - private String cateId; + private Long cateId; //品牌id private Long brandId; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java new file mode 100644 index 0000000..68c839f --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcoupon/ProductCouponMapper.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.product.dal.mysql.productcoupon; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 商品优惠券 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface ProductCouponMapper extends BaseMapperX { + + + default PageResult selectPage(StoreProductCouponPageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + + wrapper.likeIfPresent(ProductCouponDO::getCouponName, reqVO.getCouponName()) + .eqIfPresent(ProductCouponDO::getCouponType, reqVO.getCouponType()) + .eqIfPresent(ProductCouponDO::getCouponScope, reqVO.getCouponScope()) + .eqIfPresent(ProductCouponDO::getExpirationType, reqVO.getExpirationType()) + .eqIfPresent(ProductCouponDO::getReceiveType, reqVO.getReceiveType()) + .orderByDesc(ProductCouponDO::getId); + + return selectPage(reqVO, wrapper); + + } + + List receiveList(@Param("productId") Long productId); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java new file mode 100644 index 0000000..7622d77 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/productcouponrelation/ProductCouponRelationMapper.java @@ -0,0 +1,21 @@ +package co.yixiang.yshop.module.product.dal.mysql.productcouponrelation; + +import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; +import co.yixiang.yshop.module.product.dal.dataobject.productcouponrelation.ProductCouponRelationDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品优惠券记录 Mapper + * + * @author moxiangrong + */ +@Mapper +public interface ProductCouponRelationMapper extends BaseMapperX { + + List searchUserCoupon(@Param("type") Integer type, @Param("uid") Long uid, @Param("id") Long id); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductrelation/StoreProductRelationMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductrelation/StoreProductRelationMapper.java index f1c880c..e06265e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductrelation/StoreProductRelationMapper.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductrelation/StoreProductRelationMapper.java @@ -1,19 +1,19 @@ package co.yixiang.yshop.module.product.dal.mysql.storeproductrelation; -import java.util.*; - import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; import co.yixiang.yshop.framework.mybatis.core.mapper.BaseMapperX; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductReplyQueryVo; +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationRespVO; import co.yixiang.yshop.module.product.controller.app.relation.vo.AppStoreProductRelationQueryVo; import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; -import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.*; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import java.util.List; + /** * 商品点赞和收藏 Mapper * @@ -33,30 +33,33 @@ public interface StoreProductRelationMapper extends BaseMapperX selectRelationList(Page page, @Param("uid") Long uid, @Param("type") String type); + "on A.product_id = B.id left join yshop_user C on A.uid = C.id" + + " where A.type=#{type} and A.uid=#{uid} and A.deleted = 0 and B.deleted = 0 group by productId order by A.create_time desc") + List userCollectRootProductList(Page page, @Param("uid") Long uid, @Param("type") String type); - @Select("") - List allRelationList(Page page, @Param("nickname") String nickname); + List allRelationList(Page page, @Param("nickname") String nickname,@Param("type") String type); @Select("") - Long allRelationListCount(@Param("nickname") String nickname); + Long allRelationListCount(@Param("nickname") String nickname,@Param("type") String type); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductreply/StoreProductReplyMapper.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductreply/StoreProductReplyMapper.java index c7d19b1..4b72a1a 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductreply/StoreProductReplyMapper.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/mysql/storeproductreply/StoreProductReplyMapper.java @@ -41,7 +41,7 @@ public interface StoreProductReplyMapper extends BaseMapperXand A.product_score = 5" + "and A.product_score < 5 and A.product_score > 2" + "and A.product_score < 2"+ + "and A.pics is not null and pics != ''"+ " order by A.create_Time DESC") List selectReplyList(Page page, @Param("productId") long productId, @Param("type") int type); @@ -71,7 +72,7 @@ public interface StoreProductReplyMapper extends BaseMapperXand B.nickname = #{nickname}" + + "and B.nickname LIKE CONCAT('%',#{nickname},'%')" + " order by A.create_Time DESC") List allReplyList(Page page, @Param("nickname") String nickname); @@ -79,7 +80,7 @@ public interface StoreProductReplyMapper extends BaseMapperXand B.nickname = #{nickname}" + + "and B.nickname LIKE CONCAT('%',#{nickname},'%')" + " order by A.create_Time DESC") Long allReplyListCount(@Param("nickname") String nickname); diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/redis/RedisKeyConstants.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000..f98036b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/dal/redis/RedisKeyConstants.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.product.dal.redis; + +import co.yixiang.yshop.framework.redis.core.RedisKeyDefine; + +import static co.yixiang.yshop.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; +import static co.yixiang.yshop.framework.redis.core.RedisKeyDefine.KeyTypeEnum.ZSET; + + +/** + * System Redis Key 枚举类 + * + * @author yshop + */ +public interface RedisKeyConstants { + + + RedisKeyDefine YSHOP_USER_SEARCH_HISTORY_KEY = new RedisKeyDefine("用户历史搜索", + "yshop_user_search_history:%d", // + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + RedisKeyDefine YSHOP_POPULAR_SEARCH_RECORDS_KEY = new RedisKeyDefine("热门搜索记录", + "yshop_popular_search_records", // + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java new file mode 100644 index 0000000..b45ad24 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponService.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.product.service.productcoupon; + + +import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + + +/** + * App优惠券 Service 接口 + * + * @author moxiangrong + */ +public interface AppCouponService extends IService { + + /** + * 获取商品可领优惠券列表 + * @param productId 商品id + * @return + */ + List receiveList(Long productId); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java new file mode 100644 index 0000000..2170f03 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/AppCouponServiceImpl.java @@ -0,0 +1,43 @@ +package co.yixiang.yshop.module.product.service.productcoupon; + +import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; +import co.yixiang.yshop.module.product.convert.storeproductcoupon.StoreProductCouponConvert; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import co.yixiang.yshop.module.product.dal.mysql.productcoupon.ProductCouponMapper; +import co.yixiang.yshop.module.product.service.storeproduct.StoreProductService; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * App优惠券 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +public class AppCouponServiceImpl extends ServiceImpl implements AppCouponService { + + @Resource + private StoreProductService productService; + + + @Override + public List receiveList(Long productId) { + List couponDOS = this.baseMapper.receiveList(productId); + if(CollectionUtils.isEmpty(couponDOS)) return null; + List couponDetailList = StoreProductCouponConvert.INSTANCE.convertList(couponDOS); + couponDetailList = couponDetailList.stream() + .sorted(Comparator.comparing(AppCouponDetailRespVO::getCouponType, Comparator.reverseOrder()) + /*.thenComparing(AppCouponDetailRespVO::getDiscount, Comparator.naturalOrder()) + .thenComparing(AppCouponDetailRespVO::getCouponValue, Comparator.reverseOrder())*/ + ).collect(Collectors.toList()); + return couponDetailList; + } +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java new file mode 100644 index 0000000..584a48d --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponService.java @@ -0,0 +1,60 @@ +package co.yixiang.yshop.module.product.service.productcoupon; + + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import com.baomidou.mybatisplus.extension.service.IService; + + +/** + * 商品优惠券 Service 接口 + * + * @author moxiangrong + */ +public interface ProductCouponService extends IService { + + + /** + * 创建优惠券 + * + * @return 优惠券id + */ + Long createCoupon(ProductCouponCreateReqVO vo); + + /** + * 修改优惠券 + * + * @return 优惠券id + */ + Boolean updateCoupon(ProductCouponUpdateReqVO vo); + + /** + * 优惠券明细 + * + * @return 优惠券明细 + */ + ProductCouponDetailRespVO getCouponDetail(Long id); + + + /** + * 获得优惠券分页 + * + * @param pageReqVO 分页查询 + * @return 优惠券分页 + */ + PageResult getStoreProductPage(StoreProductCouponPageReqVO pageReqVO); + + + /** + * 删除优惠券 + * + * @param id 优惠券id + * @return + */ + Boolean deleteCoupon(Long id); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java new file mode 100644 index 0000000..2c4be8e --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcoupon/ProductCouponServiceImpl.java @@ -0,0 +1,95 @@ +package co.yixiang.yshop.module.product.service.productcoupon; + +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponCreateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponDetailRespVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.ProductCouponUpdateReqVO; +import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.StoreProductCouponPageReqVO; +import co.yixiang.yshop.module.product.convert.storeproductcoupon.StoreProductCouponConvert; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import co.yixiang.yshop.module.product.dal.mysql.productcoupon.ProductCouponMapper; +import co.yixiang.yshop.module.product.enums.coupon.CouponExpirationEnum; +import co.yixiang.yshop.module.product.enums.coupon.CouponStatusEnum; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jodd.util.StringUtil; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; + + +/** + * 商品优惠券 Service 实现类 + * + * @author moxiangrong + */ +@Service +@Validated +public class ProductCouponServiceImpl extends ServiceImpl implements ProductCouponService { + + + @Override + public Long createCoupon(ProductCouponCreateReqVO vo) { + ProductCouponDO couponDO = StoreProductCouponConvert.INSTANCE.convert(vo); + if (vo.getIds() != null && vo.getIds().length > 0) { + couponDO.setScopeValues(convertString(vo.getIds())); + } + save(couponDO); + return couponDO.getId(); + } + + @Override + public Boolean updateCoupon(ProductCouponUpdateReqVO vo) { + ProductCouponDO couponDO = StoreProductCouponConvert.INSTANCE.convert(vo); + if (vo.getIds() != null && vo.getIds().length > 0) { + couponDO.setScopeValues(convertString(vo.getIds())); + } + return updateById(couponDO); + } + + @Override + public ProductCouponDetailRespVO getCouponDetail(Long id) { + ProductCouponDO couponDO = getById(id); + if (StringUtil.isNotBlank(couponDO.getScopeValues())) { + couponDO.setScopeValues(convertArr(couponDO.getScopeValues())); + } + ProductCouponDetailRespVO detailRespVO = StoreProductCouponConvert.INSTANCE.convert(couponDO); + return detailRespVO; + } + + @Override + public PageResult getStoreProductPage(StoreProductCouponPageReqVO pageReqVO) { + PageResult pageResult = + StoreProductCouponConvert.INSTANCE.convertPage(this.baseMapper.selectPage(pageReqVO)); + pageResult.getList().forEach(res -> { + if(CouponExpirationEnum.BY_DAY.getValue().equals(res.getExpirationType())){ + res.setStatus(CouponStatusEnum.IN_PROGRESS.getDesc()); + }else { + LocalDateTime now =LocalDateTime.now(); + if (now.isBefore(res.getTakingEffectTime())) { + res.setStatus(CouponStatusEnum.NOT_STARTED.getDesc()); + } else if (now.isAfter(res.getTakingEffectTime()) && now.isBefore(res.getExpirationTime())) { + res.setStatus(CouponStatusEnum.IN_PROGRESS.getDesc()); + } else { + res.setStatus(CouponStatusEnum.ENDED.getDesc()); + } + } + }); + return pageResult; + } + + @Override + public Boolean deleteCoupon(Long id) { + return removeById(id); + } + + private String convertString(String[] arr) { + return String.join(",", arr); + } + + private String convertArr(String value) { + return "[" + value + "]"; + } + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java new file mode 100644 index 0000000..61350eb --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationService.java @@ -0,0 +1,53 @@ +package co.yixiang.yshop.module.product.service.productcouponrelation; + + +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; +import co.yixiang.yshop.module.product.dal.dataobject.productcouponrelation.ProductCouponRelationDO; +import co.yixiang.yshop.module.product.service.productcouponrelation.dto.CartCouponDto; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + + +/** + * App优惠券记录 Service 接口 + * + * @author moxiangrong + */ +public interface AppCouponRelationService extends IService { + + /** + * 领取优惠券 + * + * @param id 优惠券id + * @return + */ + void receiveCoupon(Long id); + + /** + * 核销优惠券 + * + * @param id 优惠券id + * @return + */ + void verificationCoupon(Long id); + + /** + * 查询用户已有优惠券 + * + * @param type 查询类型 + * @param id 优惠券id + * @return + */ + List searchUserCoupon(Integer type, Long id); + + /** + * 查询购物车可用优惠券 + * + * @param cartCouponDtoList 购物车信息 + * @return + */ + List searchCartCoupon(List cartCouponDtoList, Long id); + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java new file mode 100644 index 0000000..5578f4d --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/AppCouponRelationServiceImpl.java @@ -0,0 +1,167 @@ +package co.yixiang.yshop.module.product.service.productcouponrelation; + + +import co.yixiang.yshop.framework.mybatis.core.query.LambdaQueryWrapperX; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.CartCouponVO; +import co.yixiang.yshop.module.product.controller.app.couponrelation.vo.UserCouponVO; +import co.yixiang.yshop.module.product.convert.storeproductcouponrelation.StoreProductCouponRelationConvert; +import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO; +import co.yixiang.yshop.module.product.dal.dataobject.productcouponrelation.ProductCouponRelationDO; +import co.yixiang.yshop.module.product.dal.mysql.productcoupon.ProductCouponMapper; +import co.yixiang.yshop.module.product.dal.mysql.productcouponrelation.ProductCouponRelationMapper; +import co.yixiang.yshop.module.product.enums.coupon.CouponExpirationEnum; +import co.yixiang.yshop.module.product.enums.coupon.CouponReceiveTypeEnum; +import co.yixiang.yshop.module.product.enums.coupon.CouponScopeEnum; +import co.yixiang.yshop.module.product.enums.coupon.CouponTypeEnum; +import co.yixiang.yshop.module.product.enums.couponrelation.CouponIsUsedEnum; +import co.yixiang.yshop.module.product.enums.couponrelation.CouponSearchTypeEnum; +import co.yixiang.yshop.module.product.service.productcouponrelation.dto.CartCouponDto; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; + +/** + * App优惠券记录 Service 接口 + * + * @author moxiangrong + */ +@Service +@Validated +public class AppCouponRelationServiceImpl extends ServiceImpl implements AppCouponRelationService { + + @Resource + private ProductCouponMapper couponMapper; + + @Override + public void receiveCoupon(Long id) { + Long uid = getLoginUserId(); + // 查询优惠券 + ProductCouponDO couponDO = couponMapper.selectById(id); + if (couponDO == null) { + throw exception(PRODUCT_COUPON_NOT_EXISTS); + } + long count = count(new LambdaQueryWrapperX() + .eq(ProductCouponRelationDO::getCouponId, id).eq(ProductCouponRelationDO::getUid, uid)); + if (CouponReceiveTypeEnum.UNLIMITED.getValue().equals(couponDO.getReceiveType()) || count < couponDO.getLimitNumber()) { + ProductCouponRelationDO relationDO = ProductCouponRelationDO.builder().couponId(id).uid(uid).build(); + relationDO.setReceiveTime(LocalDateTime.now()); + save(relationDO); + } else { + throw exception(PRODUCT_COUPON_RECEIVE_ERROR); + } + } + + @Override + public void verificationCoupon(Long id) { + ProductCouponRelationDO productCouponDO = getById(id); + if (productCouponDO == null) { + throw exception(PRODUCT_COUPON_NOT_EXISTS); + } + + // 使用优惠券 + productCouponDO.setIsUsed(CouponIsUsedEnum.USED.getValue()); + productCouponDO.setUsageTime(LocalDateTime.now()); + updateById(productCouponDO); + } + + @Override + public List searchUserCoupon(Integer type, Long id) { + List userCouponVOS = this.baseMapper.searchUserCoupon(type, getLoginUserId(), id); + for (UserCouponVO userCouponVO : userCouponVOS) { + if (CouponExpirationEnum.BY_DAY.getValue().equals(userCouponVO.getExpirationType())) { + // 计算失效时间 + LocalDateTime expirationTime = + userCouponVO.getReceiveTime().plus(userCouponVO.getExpirationDay(), ChronoUnit.DAYS); + userCouponVO.setTakingEffectTime(userCouponVO.getReceiveTime()); + userCouponVO.setExpirationTime(expirationTime); + } + } + return userCouponVOS; + } + + @Override + public List searchCartCoupon(List cartCouponDtoList, Long id) { + List cartCouponVOList = new ArrayList<>(); + // 获取购物车中商品id集合 + Set productIds = + cartCouponDtoList.stream().map(CartCouponDto::getProductId).collect(Collectors.toSet()); + Map priceMap = + cartCouponDtoList.stream().collect(Collectors.toMap(CartCouponDto::getProductId, CartCouponDto::getPrice)); + // 查询所有可使用的优惠券 + List userCouponVOList = searchUserCoupon(CouponSearchTypeEnum.CAN_USE.getValue(), id); + if (CollectionUtils.isEmpty(userCouponVOList)) { + return cartCouponVOList; + } + cartCouponVOList = StoreProductCouponRelationConvert.INSTANCE.convert(userCouponVOList); + // 过滤出可以使用的优惠券并计算优惠金额 + cartCouponVOList = cartCouponVOList.stream().filter(vo -> filter(productIds, vo, priceMap)).collect(Collectors.toList()); + // 优惠金额降序 + cartCouponVOList = cartCouponVOList.stream() + .sorted(Comparator.comparing(CartCouponVO::getDiscountAmount).reversed()).collect(Collectors.toList()); + return cartCouponVOList; + } + + + /** + * 过滤出可以使用的优惠券 + * + * @param productIds 商品id集合 + * @param cartCouponVO 优惠券信息 + * @param priceMap 金额 + * @return + */ + private Boolean filter(Set productIds, CartCouponVO cartCouponVO, Map priceMap) { + if (CouponScopeEnum.PRODUCT.getValue().equals(cartCouponVO.getCouponScope())) { + Set ids = new HashSet<>(); + for (String s : cartCouponVO.getScopeValues().split(",")) ids.add(Long.parseLong(s)); + // 取交集 + ids.retainAll(productIds); + if (CollectionUtils.isEmpty(ids)) return false; + return compute(ids, cartCouponVO, priceMap); + } else { + return compute(productIds, cartCouponVO, priceMap); + } + } + + /** + * 计算优惠金额 + * + * @param productIds 商品id集合 + * @param cartCouponVO 优惠券信息 + * @param priceMap 金额 + * @return + */ + private Boolean compute(Set productIds, CartCouponVO cartCouponVO, Map priceMap) { + // 累计金额 + BigDecimal amount = BigDecimal.ZERO; + for (Long id : productIds) amount = amount.add(priceMap.get(id)); + // 是否满足门槛 + if (amount.compareTo(cartCouponVO.getThreshold()) < 0) return Boolean.FALSE; + // 计算优惠金额 + if (CouponTypeEnum.FULL_REDUCTION.getValue().equals(cartCouponVO.getCouponType())) { + // 优惠金额不可超出商品总价 + if (amount.compareTo(cartCouponVO.getCouponValue()) < 0) { + cartCouponVO.setDiscountAmount(amount); + } else { + cartCouponVO.setDiscountAmount(cartCouponVO.getCouponValue()); + } + } else { + cartCouponVO.setDiscountAmount(amount.subtract(amount.multiply(cartCouponVO.getDiscount()).divide(BigDecimal.TEN))); + } + return Boolean.TRUE; + } + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/dto/CartCouponDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/dto/CartCouponDto.java new file mode 100644 index 0000000..85e1ca5 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/productcouponrelation/dto/CartCouponDto.java @@ -0,0 +1,26 @@ +package co.yixiang.yshop.module.product.service.productcouponrelation.dto; + +import lombok.Builder; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @Author moxiangrong + * @Date 2023/11/13 + **/ +@Data +@Builder +public class CartCouponDto implements Serializable { + + /** + * 商品ID + */ + private Long productId; + + /** + * 商品价格 + */ + private BigDecimal price; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/ShippingTemplatesServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/ShippingTemplatesServiceImpl.java index b3c3220..2701d21 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/ShippingTemplatesServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/ShippingTemplatesServiceImpl.java @@ -5,8 +5,6 @@ import cn.hutool.core.util.IdUtil; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplatesfree.ShippingTemplatesFreeDO; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplatesregion.ShippingTemplatesRegionDO; -import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; -import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; import co.yixiang.yshop.module.product.service.shippingtemplates.dto.*; import co.yixiang.yshop.module.product.service.shippingtemplatesfree.ShippingTemplatesFreeService; import co.yixiang.yshop.module.product.service.shippingtemplatesregion.ShippingTemplatesRegionService; @@ -104,7 +102,7 @@ public class ShippingTemplatesServiceImpl extends ServiceImpl - * @Date 2020/5/26 - **/ -@Getter -@Setter -public class AppointInfoDto { - - /** 包邮件数 */ - private String a_num; - - /** 包邮费用 */ - private String a_price; - - /** 包邮地区 */ - private List place; - - private String placeName; - -} +package co.yixiang.yshop.module.product.service.shippingtemplates.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @ClassName AppointInfoDto + * @Author hupeng <610796224@qq.com> + * @Date 2020/5/26 + **/ +@Getter +@Setter +public class AppointInfoDto { + + /** 包邮件数 */ + private String a_num; + + /** 包邮费用 */ + private String a_price; + + /** 包邮地区 */ + private List place; + + private String placeName; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionChildrenDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionChildrenDto.java index c81632c..490e65a 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionChildrenDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionChildrenDto.java @@ -1,16 +1,16 @@ -package co.yixiang.yshop.module.product.service.shippingtemplates.dto; - -import lombok.Getter; -import lombok.Setter; - -/** - * @ClassName RegionChildrenDto - * @Author hupeng <610796224@qq.com> - * @Date 2020/5/25 - **/ -@Getter -@Setter -public class RegionChildrenDto { - - private String city_id; -} +package co.yixiang.yshop.module.product.service.shippingtemplates.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @ClassName RegionChildrenDto + * @Author hupeng <610796224@qq.com> + * @Date 2020/5/25 + **/ +@Getter +@Setter +public class RegionChildrenDto { + + private String city_id; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionDto.java index 0dea629..0edefc9 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionDto.java @@ -1,23 +1,23 @@ -package co.yixiang.yshop.module.product.service.shippingtemplates.dto; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -/** - * @ClassName RegionDto - * @Author hupeng <610796224@qq.com> - * @Date 2020/5/25 - **/ -@Getter -@Setter -public class RegionDto { - - private String name; - - private String city_id; - - List children; - -} +package co.yixiang.yshop.module.product.service.shippingtemplates.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @ClassName RegionDto + * @Author hupeng <610796224@qq.com> + * @Date 2020/5/25 + **/ +@Getter +@Setter +public class RegionDto { + + private String name; + + private String city_id; + + List children; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionInfoDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionInfoDto.java index 9651829..d907f13 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionInfoDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/RegionInfoDto.java @@ -1,38 +1,38 @@ -package co.yixiang.yshop.module.product.service.shippingtemplates.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -import javax.validation.constraints.NotBlank; -import java.util.List; - -/** - * @ClassName RegionInfoDto - * @Author hupeng <610796224@qq.com> - * @Date 2020/5/25 - **/ -@Getter -@Setter -@ToString -public class RegionInfoDto { - - @NotBlank(message = "请填写可配送区域") - private String regionName; - - @NotBlank(message = "请填写首件") - private String first; - - @NotBlank(message = "请填写首件价格") - private String price; - - @NotBlank(message = "请填写续件") - @JsonProperty("_continue") - private String _continue; - - @NotBlank(message = "请填写续件价格") - private String continue_price; - - private List region; -} +package co.yixiang.yshop.module.product.service.shippingtemplates.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @ClassName RegionInfoDto + * @Author hupeng <610796224@qq.com> + * @Date 2020/5/25 + **/ +@Getter +@Setter +@ToString +public class RegionInfoDto { + + @NotBlank(message = "请填写可配送区域") + private String regionName; + + @NotBlank(message = "请填写首件") + private String first; + + @NotBlank(message = "请填写首件价格") + private String price; + + @NotBlank(message = "请填写续件") + @JsonProperty("_continue") + private String _continue; + + @NotBlank(message = "请填写续件价格") + private String continue_price; + + private List region; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/ShippingTemplatesDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/ShippingTemplatesDto.java index 0c9044f..cd61da1 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/ShippingTemplatesDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/shippingtemplates/dto/ShippingTemplatesDto.java @@ -1,51 +1,51 @@ -package co.yixiang.yshop.module.product.service.shippingtemplates.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Getter; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.util.List; - -/** - * 运费模板对象 yx_shipping_templates - * - * @author hupeng - * @date 2020-05-23 - */ -@Getter -@Setter -public class ShippingTemplatesDto implements Serializable -{ - private static final long serialVersionUID = 1L; - - /** 模板ID */ - private Integer id; - - /** 模板名称 */ - @NotBlank(message = "模板名称不能为空") - private String name; - - /** 计费方式 */ - private Integer type; - - /** 地域以及费用 */ - @NotNull(message = "请设置地域") - @JsonProperty(value = "region_info") - private List regionInfo; - - /** 指定包邮开关 */ - private Integer appoint; - - /** 指定包邮内容 */ - @JsonProperty(value = "appoint_info") - private List appointInfo; - - /** 排序 */ - private Long sort; - - - -} +package co.yixiang.yshop.module.product.service.shippingtemplates.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 运费模板对象 yx_shipping_templates + * + * @author hupeng + * @date 2020-05-23 + */ +@Getter +@Setter +public class ShippingTemplatesDto implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 模板ID */ + private Integer id; + + /** 模板名称 */ + @NotBlank(message = "模板名称不能为空") + private String name; + + /** 计费方式 */ + private Integer type; + + /** 地域以及费用 */ + @NotNull(message = "请设置地域") + @JsonProperty(value = "region_info") + private List regionInfo; + + /** 指定包邮开关 */ + private Integer appoint; + + /** 指定包邮内容 */ + @JsonProperty(value = "appoint_info") + private List appointInfo; + + /** 排序 */ + private Long sort; + + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductService.java index 2b23e14..947fe6b 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductService.java @@ -7,6 +7,7 @@ import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductD import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Set; /** * 商品 AppService 接口 @@ -71,4 +72,22 @@ public interface AppStoreProductService extends IService { void incProductStock(Integer num, Long productId, String unique,Long activityId, String type); + /*** + * 用户最近历史搜索 + * @param userId 用户id + * @return 最近搜索关键字 + */ + Set listRecentSearch(Long userId); + + /*** + * 删除用户最近历史搜索 + * @param userId 用户id + */ + void removeSearchHistoryAll(Long userId); + + /*** + * 热门搜索 + * @return 热门搜索关键字 + */ + Set searchPopular(Long start, Long end); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java index 89b32a7..ee75f96 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/AppStoreProductServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.constant.ShopConstants; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; +import co.yixiang.yshop.module.product.controller.app.coupon.vo.AppCouponDetailRespVO; import co.yixiang.yshop.module.product.controller.app.product.param.AppStoreProductQueryParam; import co.yixiang.yshop.module.product.controller.app.product.vo.AppProductVo; import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductAttrQueryVo; @@ -13,12 +14,18 @@ import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; import co.yixiang.yshop.module.product.dal.dataobject.shippingtemplates.ShippingTemplatesDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproductattrvalue.StoreProductAttrValueMapper; +import co.yixiang.yshop.module.product.dal.mysql.storeproductrelation.StoreProductRelationMapper; +import co.yixiang.yshop.module.product.dal.redis.RedisKeyConstants; import co.yixiang.yshop.module.product.enums.ProductConstants; +import co.yixiang.yshop.module.product.enums.coupon.CouponTypeEnum; import co.yixiang.yshop.module.product.enums.product.ProductEnum; import co.yixiang.yshop.module.product.enums.product.ProductTypeEnum; import co.yixiang.yshop.module.product.enums.product.RelationCateEnum; +import co.yixiang.yshop.module.product.enums.product.RelationEnum; +import co.yixiang.yshop.module.product.service.productcoupon.AppCouponService; import co.yixiang.yshop.module.product.service.shippingtemplates.ShippingTemplatesService; import co.yixiang.yshop.module.product.service.storeproductattr.AppStoreProductAttrService; import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; @@ -26,19 +33,25 @@ import co.yixiang.yshop.module.product.service.storeproductrelation.AppStoreProd import co.yixiang.yshop.module.product.service.storeproductreply.AppStoreProductReplyService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.List; -import java.util.Map; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.PRODUCT_STOCK_LESS; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_NOT_EXISTS; @@ -49,7 +62,7 @@ import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRO */ @Service @Validated -public class AppStoreProductServiceImpl extends ServiceImpl implements AppStoreProductService { +public class AppStoreProductServiceImpl extends ServiceImpl implements AppStoreProductService { @Resource private AppStoreProductAttrService appStoreProductAttrService; @@ -64,6 +77,20 @@ public class AppStoreProductServiceImpl extends ServiceImpl getList(int page, int limit, int order) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW_1.getValue()) + wrapper.eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW.getValue()) //.eq(YxStoreProduct::getIsDel,ShopCommonEnum.DELETE_0.getValue()) .orderByDesc(StoreProductDO::getSort); - wrapper.eq(StoreProductDO::getIsIntegral,0); + wrapper.eq(StoreProductDO::getIsIntegral, 0); // order switch (ProductEnum.toType(order)) { //精品推荐 case TYPE_1: wrapper.eq(StoreProductDO::getIsBest, - ShopCommonEnum.IS_STATUS_1.getValue()); + ShopCommonEnum.YES.getValue()); break; //首发新品 case TYPE_3: wrapper.eq(StoreProductDO::getIsNew, - ShopCommonEnum.IS_STATUS_1.getValue()); + ShopCommonEnum.YES.getValue()); break; // 猜你喜欢 case TYPE_4: wrapper.eq(StoreProductDO::getIsBenefit, - ShopCommonEnum.IS_STATUS_1.getValue()); + ShopCommonEnum.YES.getValue()); break; // 热门榜单 case TYPE_2: wrapper.eq(StoreProductDO::getIsHot, - ShopCommonEnum.IS_STATUS_1.getValue()); + ShopCommonEnum.YES.getValue()); break; default: } @@ -121,9 +148,9 @@ public class AppStoreProductServiceImpl extends ServiceImpl getGoodsList(AppStoreProductQueryParam productQueryParam) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW_1.getValue()); + wrapper.eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW.getValue()); - if(productQueryParam.getIsIntegral()!=null){ + if (productQueryParam.getIsIntegral() != null) { wrapper.eq(StoreProductDO::getIsIntegral, productQueryParam.getIsIntegral()); } //多字段模糊查询分类搜索 @@ -141,11 +168,16 @@ public class AppStoreProductServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW_1.getValue()) + wrapper.eq(StoreProductDO::getIsShow, ShopCommonEnum.SHOW.getValue()) .eq(StoreProductDO::getId, id); StoreProductDO storeProduct = this.baseMapper.selectOne(wrapper); if (ObjectUtil.isNull(storeProduct)) { @@ -190,9 +222,9 @@ public class AppStoreProductServiceImpl extends ServiceImpl 0) { + if (uid > 0) { //设置VIP价格 - //todo + //todo //收藏 boolean isCollect = appStoreProductRelationService.isProductRelation(id, uid, RelationCateEnum.COMMON.getValue()); @@ -230,7 +262,31 @@ public class AppStoreProductServiceImpl extends ServiceImpl) returnMap.get("productAttr")); productVo.setProductValue((Map) returnMap.get("productValue")); + //添加足迹,先删除之前的,更新时间 + LambdaQueryWrapper productDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); + storeProductRelationMapper.delete( + productDOLambdaQueryWrapper.eq(StoreProductRelationDO::getProductId, id) + .eq(StoreProductRelationDO::getUid, uid) + .eq(StoreProductRelationDO::getType, RelationEnum.FOOT.getValue())); + StoreProductRelationDO storeProductRelationDO = StoreProductRelationDO.builder() + .productId(id) + .uid(uid) + .category("common") + .type(RelationEnum.FOOT.getValue()) + .build(); + storeProductRelationMapper.insert(storeProductRelationDO); + // 设置优惠券信息 + List couponDetailList = appCouponService.receiveList(id); + if(CollectionUtils.isNotEmpty(couponDetailList)){ + AppCouponDetailRespVO couponDetail = couponDetailList.get(0); + if(CouponTypeEnum.FULL_REDUCTION.getValue().equals(couponDetail.getCouponType())){ + productVo.setCouponSplicing("满" + couponDetail.getThreshold() + "元减" + couponDetail.getCouponValue()); + } else { + productVo.setCouponSplicing("满" + couponDetail.getThreshold() + "元" + couponDetail.getDiscount() + "折"); + } + + } return productVo; } @@ -269,7 +325,7 @@ public class AppStoreProductServiceImpl extends ServiceImpl zSet = stringRedisTemplate.opsForZSet(); + //由于zset 的集合特性当插入已经存在的 v 值 (搜索记录) 时只会更新score 值, + zSet.add(key, keyWord, Instant.now().getEpochSecond()); + + //只得到当前用户的最近搜索记录,注意这里必须保证set集合的顺序 + Set userRecentSearches = listRecentSearch(userId); + + if (userRecentSearches.size() > CURRENT_SEARCH_SIZE) { + //获取到最开始浏览的第一条 + String firstSearch = userRecentSearches.stream().reduce((first, second) -> second).orElse(null); + //删除最开始浏览的第一条 + zSet.remove(key, firstSearch); + } + } + + + /** + * 历史最近搜索列表 + * + * @return 历史搜索列表 + */ + @Override + public Set listRecentSearch(Long userId) { + String key = RedisKeyConstants.YSHOP_USER_SEARCH_HISTORY_KEY.formatKey(userId); + Set> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeWithScores(key, 0, -1); + return Optional.ofNullable(typedTuples) + .map(tuples -> tuples.stream() + .map(ZSetOperations.TypedTuple::getValue) + .filter(Objects::nonNull) + .limit(20) + .collect(Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), LinkedHashSet::new))) + .orElseGet(LinkedHashSet::new); + } + + + @Override + public void removeSearchHistoryAll(Long userId) { + stringRedisTemplate.delete(RedisKeyConstants.YSHOP_USER_SEARCH_HISTORY_KEY.formatKey(userId)); + } + + @Override + public Set searchPopular(Long start, Long end) { + String key = RedisKeyConstants.YSHOP_POPULAR_SEARCH_RECORDS_KEY.formatKey(); + return stringRedisTemplate.opsForZSet().reverseRange(key, start, end); + } + + /** + * 缓存搜索记录 + * @param keyWord 搜索关键字 + */ + private void addSearchPopular(String keyWord) { + String key = RedisKeyConstants.YSHOP_POPULAR_SEARCH_RECORDS_KEY.formatKey(); + stringRedisTemplate.opsForZSet().incrementScore(key, keyWord, 1); + } } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java index 8765cc8..13d292a 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/StoreProductServiceImpl.java @@ -8,11 +8,19 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.StoreProductCreateReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.StoreProductExportReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.StoreProductPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.StoreProductUpdateReqVO; +import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; import co.yixiang.yshop.module.product.convert.storeproductrule.StoreProductRuleConvert; import co.yixiang.yshop.module.product.dal.dataobject.category.ProductCategoryDO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrresult.StoreProductAttrResultDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductrule.StoreProductRuleDO; +import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; import co.yixiang.yshop.module.product.enums.product.SpecTypeEnum; import co.yixiang.yshop.module.product.service.category.ProductCategoryService; import co.yixiang.yshop.module.product.service.shippingtemplates.ShippingTemplatesService; @@ -28,22 +36,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import javax.annotation.Resource; - import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; -import co.yixiang.yshop.module.product.controller.admin.storeproduct.vo.*; -import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; - -import co.yixiang.yshop.module.product.convert.storeproduct.StoreProductConvert; -import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; - import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; @@ -54,7 +54,7 @@ import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; */ @Service @Validated -public class StoreProductServiceImpl extends ServiceImpl implements StoreProductService { +public class StoreProductServiceImpl extends ServiceImpl implements StoreProductService { @Resource private StoreProductMapper storeProductMapper; @@ -115,13 +115,13 @@ public class StoreProductServiceImpl extends ServiceImpl getStoreProductPage(StoreProductPageReqVO pageReqVO) { - if(StrUtil.isNotEmpty(pageReqVO.getCateId())) { + if (pageReqVO.getCateId() != null) { ProductCategoryDO productCategoryDO = productCategoryService.getCategory(Convert.toLong(pageReqVO.getCateId())); - if(productCategoryDO != null) { + if (productCategoryDO != null) { List catIds = new ArrayList<>(); if (Objects.equals(productCategoryDO.getParentId(), ProductCategoryDO.PARENT_ID_NULL)) { catIds = productCategoryService.list((Wrappers.lambdaQuery() - .eq(ProductCategoryDO::getParentId, productCategoryDO.getId()))) + .eq(ProductCategoryDO::getParentId, productCategoryDO.getId()))) .stream().map(ProductCategoryDO::getId).collect(Collectors.toList()); } else { catIds.add(Convert.toLong(pageReqVO.getCateId())); @@ -156,12 +156,10 @@ public class StoreProductServiceImpl extends ServiceImpl fromatDetailDTOList = JSON.parseArray(jsonObject.get("attrs").toString(), - FromatDetailDto.class); - - //fromatDetailDTOList - DetailDto detailDto = this.attrFormat(fromatDetailDTOList); + List formatDetailDTOList = JSON.parseArray(jsonObject.get("attrs").toString(), + FormatDetailDto.class); + //formatDetailDTOList + DetailDto detailDto = this.attrFormat(formatDetailDTOList); List> headerMapList = null; List> valueMapList = new ArrayList<>(); @@ -176,11 +174,7 @@ public class StoreProductServiceImpl extends ServiceImpl valueMap = new LinkedHashMap<>(); - List detailKeys = - detail.entrySet() - .stream() - .map(Map.Entry::getKey) - .collect(Collectors.toList()); + List detailKeys = new ArrayList<>(detail.keySet()); int i = 0; headerMapList = new ArrayList<>(); @@ -231,7 +225,7 @@ public class StoreProductServiceImpl extends ServiceImpl fromatDetailDTOList) { + private DetailDto attrFormat(List formatDetailDTOList) { List data = new ArrayList<>(); List>> res = new ArrayList<>(); - fromatDetailDTOList.stream() - .map(FromatDetailDto::getDetail) + formatDetailDTOList.stream() + .map(FormatDetailDto::getDetail) .forEach(i -> { if (i == null || i.isEmpty()) { throw exception(STORE_PRODUCT_RULE_NEED); @@ -384,39 +378,28 @@ public class StoreProductServiceImpl extends ServiceImpl 1) { - for (int i = 0; i < fromatDetailDTOList.size() - 1; i++) { + if (formatDetailDTOList.size() > 1) { + for (int i = 0; i < formatDetailDTOList.size() - 1; i++) { if (i == 0) { - data = fromatDetailDTOList.get(i).getDetail(); + data = formatDetailDTOList.get(i).getDetail(); } List tmp = new LinkedList<>(); - for (String v : data) { - for (String g : fromatDetailDTOList.get(i + 1).getDetail()) { + for (String valueStr : data) { + for (String g : formatDetailDTOList.get(i + 1).getDetail()) { String rep2 = ""; if (i == 0) { - rep2 = fromatDetailDTOList.get(i).getValue() + "_" + v + "-" - + fromatDetailDTOList.get(i + 1).getValue() + "_" + g; + rep2 = formatDetailDTOList.get(i).getValue() + "_" + valueStr + "-" + + formatDetailDTOList.get(i + 1).getValue() + "_" + g; } else { - rep2 = v + "-" - + fromatDetailDTOList.get(i + 1).getValue() + "_" + g; + rep2 = valueStr + "-" + + formatDetailDTOList.get(i + 1).getValue() + "_" + g; } tmp.add(rep2); - if (i == fromatDetailDTOList.size() - 2) { - Map> rep4 = new LinkedHashMap<>(); - Map reptemp = new LinkedHashMap<>(); - for (String h : Arrays.asList(rep2.split("-"))) { - List rep3 = Arrays.asList(h.split("_")); - if (rep3.size() > 1) { - reptemp.put(rep3.get(0), rep3.get(1)); - } else { - reptemp.put(rep3.get(0), ""); - } - } - rep4.put("detail", reptemp); - - res.add(rep4); + if (i == formatDetailDTOList.size() - 2) { + Map> repMap = getMap(rep2); + res.add(repMap); } } @@ -428,14 +411,14 @@ public class StoreProductServiceImpl extends ServiceImpl dataArr = new ArrayList<>(); - for (FromatDetailDto fromatDetailDTO : fromatDetailDTOList) { - for (String str : fromatDetailDTO.getDetail()) { - Map> map2 = new LinkedHashMap<>(); - dataArr.add(fromatDetailDTO.getValue() + "_" + str); + for (FormatDetailDto formatDetailDTO : formatDetailDTOList) { + for (String str : formatDetailDTO.getDetail()) { + Map> detailMap = new LinkedHashMap<>(); + dataArr.add(formatDetailDTO.getValue() + "_" + str); Map map1 = new LinkedHashMap<>(); - map1.put(fromatDetailDTO.getValue(), str); - map2.put("detail", map1); - res.add(map2); + map1.put(formatDetailDTO.getValue(), str); + detailMap.put("detail", map1); + res.add(detailMap); } } String s = StrUtil.join("-", dataArr); @@ -449,6 +432,30 @@ public class StoreProductServiceImpl extends ServiceImpl> getMap(String rep2) { + Map> repMap = new LinkedHashMap<>(); + Map repTempMap = new LinkedHashMap<>(); + for (String h : rep2.split("-")) { + List splitList = Arrays.asList(h.split("_")); + if (splitList.size() > 1) { + StringBuilder tempStr = new StringBuilder(); + //前面用_分割导致名称中带多个_被去掉,所以重组的时候需要拼上 + for (int j = 1; j < splitList.size(); j++) { + if (j == splitList.size() - 1) { + tempStr.append(splitList.get(j)); + } else { + tempStr.append(splitList.get(j)).append("_"); + } + } + repTempMap.put(splitList.get(0), tempStr.toString()); + } else { + repTempMap.put(splitList.get(0), ""); + } + } + repMap.put("detail", repTempMap); + return repMap; + } + /** * 新增/保存商品 * @@ -457,7 +464,6 @@ public class StoreProductServiceImpl extends ServiceImpl map = new HashMap<>(); map.put("规格", "默认"); productFormatDto.setDetail(map); - storeProductAttrService.insertYxStoreProductAttr(ListUtil.toList(fromatDetailDto), + storeProductAttrService.insertYxStoreProductAttr(ListUtil.toList(formatDetailDTO), ListUtil.toList(productFormatDto), yxStoreProduct.getId()); } else { storeProductAttrService.insertYxStoreProductAttr(storeProductDto.getItems(), @@ -509,51 +515,47 @@ public class StoreProductServiceImpl extends ServiceImpl getProductInfo(Long id) { - Map map = new LinkedHashMap<>(3); - - ArrayUtil.newArray(String.class, 3); + Map map = new LinkedHashMap<>(3); //运费模板 - //todo - //shippingTemplatesService.list() map.put("tempList", shippingTemplatesService.list()); //商品规格 List list = storeProductRuleService.getStoreProductRuleList(CollUtil.newArrayList()); map.put("ruleList", StoreProductRuleConvert.INSTANCE.convertList(list)); - if (id == 0 ) { + if (id == 0) { return map; } //处理商品详情 StoreProductDO storeProduct = storeProductMapper.selectById(id); ProductDto productDto = new ProductDto(); - BeanUtil.copyProperties(storeProduct,productDto,"sliderImage"); + BeanUtil.copyProperties(storeProduct, productDto, "sliderImage"); productDto.setSliderImage(Arrays.asList(storeProduct.getSliderImage().split(","))); StoreProductAttrResultDO storeProductAttrResult = storeProductAttrResultService .getOne(Wrappers.lambdaQuery() - .eq(StoreProductAttrResultDO::getProductId,id).last("limit 1")); - if(storeProductAttrResult == null) { - map.put("productInfo",productDto); + .eq(StoreProductAttrResultDO::getProductId, id).last("limit 1")); + if (storeProductAttrResult == null) { + map.put("productInfo", productDto); return map; } JSONObject result = JSON.parseObject(storeProductAttrResult.getResult()); List attrValues = storeProductAttrValueService.list(new LambdaQueryWrapper().eq(StoreProductAttrValueDO::getProductId, id)); - List productFormatDtos =attrValues.stream().map(i ->{ + List productFormatDtoList = attrValues.stream().map(i -> { ProductFormatDto productFormatDto = new ProductFormatDto(); - BeanUtils.copyProperties(i,productFormatDto); + BeanUtils.copyProperties(i, productFormatDto); productFormatDto.setPic(i.getImage()); return productFormatDto; }).collect(Collectors.toList()); - if(SpecTypeEnum.TYPE_1.getValue().equals(storeProduct.getSpecType())){ + if (SpecTypeEnum.MULTIPLE_SPECS.getValue().equals(storeProduct.getSpecType())) { productDto.setAttr(new ProductFormatDto()); - productDto.setAttrs(productFormatDtos); - productDto.setItems(result.getObject("attr",ArrayList.class)); - }else{ - this.productFromat(productDto, result); + productDto.setAttrs(productFormatDtoList); + productDto.setItems(result.getObject("attr", ArrayList.class)); + } else { + this.productFormat(productDto, result); } - map.put("productInfo",productDto); + map.put("productInfo", productDto); return map; @@ -567,10 +569,10 @@ public class StoreProductServiceImpl extends ServiceImpl mapAttr = (Map) result.getObject("value",ArrayList.class).get(0); + private void productFormat(ProductDto productDto, JSONObject result) { + Map mapAttr = (Map) result.getObject("value", ArrayList.class).get(0); ProductFormatDto productFormatDto = ProductFormatDto.builder() .pic(mapAttr.get("pic").toString()) .price(Double.valueOf(mapAttr.get("price").toString())) @@ -593,7 +596,7 @@ public class StoreProductServiceImpl extends ServiceImpl - * @Date 2019/10/23 - **/ -@Data -public class AttrValueDto { - - private String attr; - - private Boolean check = false; -} +package co.yixiang.yshop.module.product.service.storeproduct.dto; + +import lombok.Data; + +/** + * @ClassName AttrValueDTO + * @Author hupeng <610796224@qq.com> + * @Date 2019/10/23 + **/ +@Data +public class AttrValueDto { + + private String attr; + + private Boolean check = false; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java new file mode 100644 index 0000000..25763db --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/FormatDetailDto.java @@ -0,0 +1,32 @@ +/** + * Copyright (C) 2018-2022 + * All rights reserved, Designed By www.yixiang.co + + */ +package co.yixiang.yshop.module.product.service.storeproduct.dto; + +import lombok.*; + +import java.util.List; + +/** + * @ClassName FromatDetailDTO + * @Author hupeng <610796224@qq.com> + * @Date 2019/10/12 + **/ + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class FormatDetailDto { + private String attrHidden; + + private String detailValue; + + private List detail; + + private String value; + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java index 6928b02..50ef345 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductDto.java @@ -1,149 +1,149 @@ -package co.yixiang.yshop.module.product.service.storeproduct.dto; - - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; - -/** - * 商品对象VO - * - * @author hupeng - * @date 2020-04-25 - */ -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Setter -public class ProductDto -{ - - /** 商品id */ - private Long id; - - - /** 商品图片 */ - private String image; - - /** 轮播图 */ - @JsonProperty("slider_image") - private List sliderImage; - - /** 商品名称 */ - @JsonProperty("store_name") - private String storeName; - - /** 商品简介 */ - @JsonProperty("store_info") - private String storeInfo; - - /** 关键字 */ - private String keyword; - - /** 商品条码(一维码) */ - @JsonProperty("bar_code") - private String barCode; - - /** 分类id */ - @JsonProperty("cate_id") - private String cateId; - - /** 商品价格 */ - private Double price; - - - /** 市场价 */ - @JsonProperty("ot_price") - private Double otPrice; - - /** 邮费 */ - private Double postage; - - /** 单位名 */ - @JsonProperty("unit_name") - private String unitName; - - /** 排序 */ - private Long sort; - - /** 销量 */ - private Long sales; - - /** 库存 */ - private Long stock; - - /** 状态(0:未上架,1:上架) */ - @JsonProperty("is_show") - private Integer isShow; - - /** 是否热卖 */ - @JsonProperty("is_hot") - private Integer isHot; - - /** 是否优惠 */ - @JsonProperty("is_benefit") - private Integer isBenefit; - - /** 是否精品 */ - @JsonProperty("is_best") - private Integer isBest; - - /** 是否新品 */ - @JsonProperty("is_new") - private Integer isNew; - - /** 商品描述 */ - private String description; - - - /** 是否包邮 */ - @JsonProperty("is_postage") - private Integer isPostage; - - - /** 获得积分 */ - @JsonProperty("give_integral") - private Double giveIntegral; - - /** 成本价 */ - private Double cost; - - - /** 是否优品推荐 */ - @JsonProperty("is_good") - private Integer isGood; - - /** 是否单独分佣 */ - @JsonProperty("is_sub") - private Integer isSub; - - /** 是否开启啊积分兑换 */ - @JsonProperty("is_integral") - private Integer isIntegral; - - /** 虚拟销量 */ - private Long ficti; - - - /** 运费模板ID */ - @JsonProperty("temp_id") - private Long tempId; - - /** 规格 0单 1多 */ - @JsonProperty("spec_type") - private Integer specType; - - private ProductFormatDto attr; - - private List items; - - private List attrs; - - - - -} +package co.yixiang.yshop.module.product.service.storeproduct.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +/** + * 商品对象VO + * + * @author hupeng + * @date 2020-04-25 + */ +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class ProductDto +{ + + /** 商品id */ + private Long id; + + + /** 商品图片 */ + private String image; + + /** 轮播图 */ + @JsonProperty("slider_image") + private List sliderImage; + + /** 商品名称 */ + @JsonProperty("store_name") + private String storeName; + + /** 商品简介 */ + @JsonProperty("store_info") + private String storeInfo; + + /** 关键字 */ + private String keyword; + + /** 商品条码(一维码) */ + @JsonProperty("bar_code") + private String barCode; + + /** 分类id */ + @JsonProperty("cate_id") + private Long cateId; + + /** 商品价格 */ + private Double price; + + + /** 市场价 */ + @JsonProperty("ot_price") + private Double otPrice; + + /** 邮费 */ + private Double postage; + + /** 单位名 */ + @JsonProperty("unit_name") + private String unitName; + + /** 排序 */ + private Long sort; + + /** 销量 */ + private Long sales; + + /** 库存 */ + private Long stock; + + /** 状态(0:未上架,1:上架) */ + @JsonProperty("is_show") + private Integer isShow; + + /** 是否热卖 */ + @JsonProperty("is_hot") + private Integer isHot; + + /** 是否优惠 */ + @JsonProperty("is_benefit") + private Integer isBenefit; + + /** 是否精品 */ + @JsonProperty("is_best") + private Integer isBest; + + /** 是否新品 */ + @JsonProperty("is_new") + private Integer isNew; + + /** 商品描述 */ + private String description; + + + /** 是否包邮 */ + @JsonProperty("is_postage") + private Integer isPostage; + + + /** 获得积分 */ + @JsonProperty("give_integral") + private Double giveIntegral; + + /** 成本价 */ + private Double cost; + + + /** 是否优品推荐 */ + @JsonProperty("is_good") + private Integer isGood; + + /** 是否单独分佣 */ + @JsonProperty("is_sub") + private Integer isSub; + + /** 是否开启啊积分兑换 */ + @JsonProperty("is_integral") + private Integer isIntegral; + + /** 虚拟销量 */ + private Long ficti; + + + /** 运费模板ID */ + @JsonProperty("temp_id") + private Long tempId; + + /** 规格 0单 1多 */ + @JsonProperty("spec_type") + private Integer specType; + + private ProductFormatDto attr; + + private List items; + + private List attrs; + + + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java index f3e0aaa..1147efe 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/ProductResultDto.java @@ -1,25 +1,25 @@ -package co.yixiang.yshop.module.product.service.storeproduct.dto; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -/** - * @ClassName 产品结果DTO - * @Author hupeng <610796224@qq.com> - * @Date 2020/4/24 - **/ -@Getter -@Setter -@Builder -public class ProductResultDto { - private Double minPrice; - - private Double minOtPrice; - - private Double minCost; - - private Integer stock; - - private Integer minIntegral; -} +package co.yixiang.yshop.module.product.service.storeproduct.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * @ClassName 产品结果DTO + * @Author hupeng <610796224@qq.com> + * @Date 2020/4/24 + **/ +@Getter +@Setter +@Builder +public class ProductResultDto { + private Double minPrice; + + private Double minOtPrice; + + private Double minCost; + + private Integer stock; + + private Integer minIntegral; +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java index 6abb925..8c08b9e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/StoreProductDto.java @@ -1,149 +1,210 @@ -package co.yixiang.yshop.module.product.service.storeproduct.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.util.List; - - -/** - * 商品对象DTO - * - * @author hupeng - * @date 2020-04-23 - */ -@Getter -@Setter -@ToString -public class StoreProductDto -{ - - /** 商品id */ - private Long id; - - - /** 商品图片 */ - @NotBlank(message = "商品图片必传") - private String image; - - /** 轮播图 */ - @NotNull(message = "轮播图不为空") - @JsonProperty("slider_image") - private List sliderImage; - - /** 商品名称 */ - @NotBlank(message = "商品名称不能为空") - @JsonProperty("store_name") - private String storeName; - - /** 商品简介 */ - @JsonProperty("store_info") - private String storeInfo; - - /** 关键字 */ - @NotBlank(message = "关键字不能为空") - private String keyword; - - /** 商品条码(一维码) */ - @JsonProperty("bar_code") - private String barCode; - - /** 分类id */ - @NotNull(message = "分类id不能为空") - @JsonProperty("cate_id") - private String cateId; - - /** 商品价格 */ - private Double price; - - /** 市场价 */ - private Double otPrice; - - /** 邮费 */ - private Double postage; - - /** 单位名 */ - @JsonProperty("unit_name") - private String unitName; - - /** 排序 */ - private Long sort; - - /** 销量 */ - private Long sales; - - /** 库存 */ - private Long stock; - - /** 状态(0:未上架,1:上架) */ - @JsonProperty("is_show") - private Integer isShow; - - /** 是否热卖 */ - @JsonProperty("is_hot") - private Integer isHot; - - /** 是否优惠 */ - @JsonProperty("is_benefit") - private Integer isBenefit; - - /** 是否精品 */ - @JsonProperty("is_best") - private Integer isBest; - - /** 是否新品 */ - @JsonProperty("is_new") - private Integer isNew; - - /** 商品描述 */ - @NotBlank(message = "商品详情不能为空") - private String description; - - - /** 是否包邮 */ - @JsonProperty("is_postage") - private Integer isPostage; - - /** 获得积分 */ - @JsonProperty("give_integral") - private Double giveIntegral; - - /** 成本价 */ - private Double cost; - - - /** 是否优品推荐 */ - @JsonProperty("is_good") - private Integer isGood; - - /** 是否单独分佣 */ - @JsonProperty("is_sub") - private Integer isSub; - - /** 是否开启啊积分兑换 */ - @JsonProperty("is_integral") - private Integer isIntegral; - - /** 虚拟销量 */ - private Long ficti; - - /** 运费模板ID */ - @JsonProperty("temp_id") - private Long tempId; - - /** 规格 0单 1多 */ - @JsonProperty("spec_type") - private Integer specType; - - //属性项目 - private List items; - - //sku结果集 - private List attrs; - - -} +package co.yixiang.yshop.module.product.service.storeproduct.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + + +/** + * 商品对象DTO + * + * @author hupeng + * @date 2020-04-23 + */ +@Getter +@Setter +@ToString +public class StoreProductDto { + + /** + * 商品id + */ + private Long id; + + + /** + * 商品图片 + */ + @NotBlank(message = "商品图片必传") + private String image; + + /** + * 轮播图 + */ + @NotNull(message = "轮播图不为空") + @JsonProperty("slider_image") + private List sliderImage; + + /** + * 商品名称 + */ + @NotBlank(message = "商品名称不能为空") + @JsonProperty("store_name") + private String storeName; + + /** + * 商品简介 + */ + @JsonProperty("store_info") + @Size(max = 200, message = "商品简介不能超过200字符") + private String storeInfo; + + /** + * 关键字 + */ + @NotBlank(message = "关键字不能为空") + private String keyword; + + /** + * 商品条码(一维码) + */ + @JsonProperty("bar_code") + private String barCode; + + /** + * 分类id + */ + @NotNull(message = "分类id不能为空") + @JsonProperty("cate_id") + private Long cateId; + + /** + * 商品价格 + */ + private Double price; + + /** + * 市场价 + */ + private Double otPrice; + + /** + * 邮费 + */ + private Double postage; + + /** + * 单位名 + */ + @JsonProperty("unit_name") + private String unitName; + + /** + * 排序 + */ + private Long sort; + + /** + * 销量 + */ + private Long sales; + + /** + * 库存 + */ + private Long stock; + + /** + * 状态(0:未上架,1:上架) + */ + @JsonProperty("is_show") + private Integer isShow; + + /** + * 是否热卖 + */ + @JsonProperty("is_hot") + private Integer isHot; + + /** + * 是否优惠 + */ + @JsonProperty("is_benefit") + private Integer isBenefit; + + /** + * 是否精品 + */ + @JsonProperty("is_best") + private Integer isBest; + + /** + * 是否新品 + */ + @JsonProperty("is_new") + private Integer isNew; + + /** + * 商品描述 + */ + @NotBlank(message = "商品详情不能为空") + private String description; + + + /** + * 是否包邮 + */ + @JsonProperty("is_postage") + private Integer isPostage; + + /** + * 获得积分 + */ + @JsonProperty("give_integral") + private Double giveIntegral; + + /** + * 成本价 + */ + private Double cost; + + + /** + * 是否优品推荐 + */ + @JsonProperty("is_good") + private Integer isGood; + + /** + * 是否单独分佣 + */ + @JsonProperty("is_sub") + private Integer isSub; + + /** + * 是否开启啊积分兑换 + */ + @JsonProperty("is_integral") + private Integer isIntegral; + + /** + * 虚拟销量 + */ + private Long ficti; + + /** + * 运费模板ID + */ + @JsonProperty("temp_id") + private Long tempId; + + /** + * 规格 0单 1多 + */ + @JsonProperty("spec_type") + private Integer specType; + + //属性项目 + private List items; + + //sku结果集 + private List attrs; + + +} diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java index 968e8c7..c9e5eaa 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductDto.java @@ -42,7 +42,7 @@ public class YxStoreProductDto implements Serializable { private String barCode; /** 分类id */ - private String cateId; + private Long cateId; /** 商品价格 */ private BigDecimal price; diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java index d8e3bf9..b7a2862 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductRelationDto.java @@ -1,4 +1,4 @@ -///** +package co.yixiang.yshop.module.product.service.storeproduct.dto;///** // * Copyright (C) 2018-2022 // * All rights reserved, Designed By www.yixiang.co // * 注意: diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java index eb1f6e0..9220e98 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproduct/dto/YxStoreProductReplyDto.java @@ -1,4 +1,4 @@ -///** +package co.yixiang.yshop.module.product.service.storeproduct.dto;///** // * Copyright (C) 2018-2022 // * All rights reserved, Designed By www.yixiang.co // diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrService.java index 7cb6fd5..88c5fce 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/AppStoreProductAttrService.java @@ -1,12 +1,8 @@ package co.yixiang.yshop.module.product.service.storeproductattr; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattr.StoreProductAttrDO; -import co.yixiang.yshop.module.product.service.storeproduct.dto.FromatDetailDto; -import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDto; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.Collection; -import java.util.List; import java.util.Map; /** diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java index 59a500d..f28f2c4 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrService.java @@ -1,7 +1,7 @@ package co.yixiang.yshop.module.product.service.storeproductattr; import co.yixiang.yshop.module.product.dal.dataobject.storeproductattr.StoreProductAttrDO; -import co.yixiang.yshop.module.product.service.storeproduct.dto.FromatDetailDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.FormatDetailDto; import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDto; import com.baomidou.mybatisplus.extension.service.IService; @@ -45,7 +45,7 @@ public interface StoreProductAttrService extends IService { * @param attrs value * @param productId 商品id */ - void insertYxStoreProductAttr(List items, List attrs, + void insertYxStoreProductAttr(List items, List attrs, Long productId); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java index 7a9f224..e82c7f6 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductattr/StoreProductAttrServiceImpl.java @@ -7,7 +7,7 @@ import co.yixiang.yshop.module.product.dal.dataobject.storeproductattr.StoreProd import co.yixiang.yshop.module.product.dal.dataobject.storeproductattrvalue.StoreProductAttrValueDO; import co.yixiang.yshop.module.product.dal.mysql.storeproductattr.StoreProductAttrMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproductattrvalue.StoreProductAttrValueMapper; -import co.yixiang.yshop.module.product.service.storeproduct.dto.FromatDetailDto; +import co.yixiang.yshop.module.product.service.storeproduct.dto.FormatDetailDto; import co.yixiang.yshop.module.product.service.storeproduct.dto.ProductFormatDto; import co.yixiang.yshop.module.product.service.storeproductattrresult.StoreProductAttrResultService; import co.yixiang.yshop.module.product.service.storeproductattrvalue.StoreProductAttrValueService; @@ -77,11 +77,11 @@ public class StoreProductAttrServiceImpl extends ServiceImpl items, List attrs, + public void insertYxStoreProductAttr(List items, List attrs, Long productId) { List attrGroup = new ArrayList<>(); - for (FromatDetailDto fromatDetailDto : items) { + for (FormatDetailDto fromatDetailDto : items) { StoreProductAttrDO storeProductAttr = StoreProductAttrDO.builder() .productId(productId) .attrName(fromatDetailDto.getValue()) diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationService.java index db2d26b..a303841 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationService.java @@ -19,31 +19,36 @@ public interface AppStoreProductRelationService extends IService idList,Long uid,String category,String type); + /** + * 获取用户收藏/足迹 * @param page page * @param limit limit * @param uid 用户id * @return list */ - List userCollectProduct(int page, int limit, Long uid, String type); - + List userCollectRootProductList(Integer page, Integer limit, Long uid, String type); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationServiceImpl.java index 849831e..f39c90e 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/AppStoreProductRelationServiceImpl.java @@ -1,21 +1,26 @@ package co.yixiang.yshop.module.product.service.storeproductrelation; +import co.yixiang.yshop.framework.common.enums.DeletedEnum; +import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; import co.yixiang.yshop.module.product.controller.app.relation.vo.AppStoreProductRelationQueryVo; +import co.yixiang.yshop.module.product.dal.dataobject.storeproduct.StoreProductDO; import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; +import co.yixiang.yshop.module.product.dal.mysql.storeproduct.StoreProductMapper; import co.yixiang.yshop.module.product.dal.mysql.storeproductrelation.StoreProductRelationMapper; import co.yixiang.yshop.module.product.enums.product.RelationEnum; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_RELATION_EXISTS; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_RELATION_NOT_EXISTS; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; /** * 商品点赞和收藏 Service 实现类 @@ -29,6 +34,9 @@ public class AppStoreProductRelationServiceImpl extends ServiceImpllambdaQuery() .eq(StoreProductRelationDO::getUid,uid) .eq(StoreProductRelationDO::getCategory,category) .eq(StoreProductRelationDO::getType, RelationEnum.COLLECT.getValue()) - .eq(StoreProductRelationDO::getProductId,productId)); - if(count > 0) { - return true; - } - - return false; + .eq(StoreProductRelationDO::getProductId,productId) + .eq(StoreProductRelationDO::getDeleted, DeletedEnum.NO.getStatus())); + return count > 0; } /** @@ -56,18 +61,22 @@ public class AppStoreProductRelationServiceImpl extends ServiceImpl idList,Long uid,String category,String type) { + List productRelationList = this.lambdaQuery() + .in(StoreProductRelationDO::getProductId,idList) + .eq(StoreProductRelationDO::getUid,uid) + .eq(StoreProductRelationDO::getType,type) + .eq(StoreProductRelationDO::getCategory,category) + .eq(StoreProductRelationDO::getDeleted,DeletedEnum.NO.getStatus()) + .list(); + if(CollectionUtils.isAnyEmpty(productRelationList) && RelationEnum.COLLECT.getValue().equals(type)) { + throw exception(STORE_PRODUCT_RELATION_NOT_EXISTS); + } else if (CollectionUtils.isAnyEmpty(productRelationList) && RelationEnum.FOOT.getValue().equals(type)){ + throw exception(STORE_PRODUCT_FOOT_NOT_EXISTS); + } + storeProductRelationMapper.deleteBatchIds(productRelationList.stream().map(StoreProductRelationDO::getId).collect(Collectors.toList())); + } + + /** + * 获取用户收藏/足迹列表 * @param page page * @param limit limit * @param uid 用户id * @return list */ @Override - public List userCollectProduct(int page, int limit, Long uid, String type) { + public List userCollectRootProductList(Integer page, Integer limit, Long uid, String type) { Page pageModel = new Page<>(page, limit); - List list = storeProductRelationMapper.selectRelationList(pageModel,uid,type); - return list; + return storeProductRelationMapper.userCollectRootProductList(pageModel,uid,type); } } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationService.java index 09183df..05ec755 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationService.java @@ -2,7 +2,7 @@ package co.yixiang.yshop.module.product.service.storeproductrelation; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationPageReqVO; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductReplyQueryVo; +import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationRespVO; /** * 商品点赞和收藏 Service 接口 @@ -27,7 +27,7 @@ public interface StoreProductRelationService { * @param pageReqVO 分页查询 * @return 商品点赞和收藏分页 */ - PageResult getStoreProductRelationPage(StoreProductRelationPageReqVO pageReqVO); + PageResult getStoreProductRelationPage(StoreProductRelationPageReqVO pageReqVO); diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationServiceImpl.java index f3d5deb..9348bc1 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductrelation/StoreProductRelationServiceImpl.java @@ -1,22 +1,19 @@ package co.yixiang.yshop.module.product.service.storeproductrelation; -import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductReplyQueryVo; -import co.yixiang.yshop.module.product.dal.dataobject.storeproductreply.StoreProductReplyDO; +import co.yixiang.yshop.framework.common.pojo.PageResult; +import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationPageReqVO; +import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.StoreProductRelationRespVO; +import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; +import co.yixiang.yshop.module.product.dal.mysql.storeproductrelation.StoreProductRelationMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import java.util.*; -import co.yixiang.yshop.module.product.controller.admin.storeproductrelation.vo.*; -import co.yixiang.yshop.module.product.dal.dataobject.storeproductrelation.StoreProductRelationDO; -import co.yixiang.yshop.framework.common.pojo.PageResult; - -import co.yixiang.yshop.module.product.convert.storeproductrelation.StoreProductRelationConvert; -import co.yixiang.yshop.module.product.dal.mysql.storeproductrelation.StoreProductRelationMapper; +import javax.annotation.Resource; +import java.util.List; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.*; +import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.STORE_PRODUCT_RELATION_NOT_EXISTS; /** * 商品点赞和收藏 Service 实现类 @@ -47,12 +44,12 @@ public class StoreProductRelationServiceImpl implements StoreProductRelationServ @Override - public PageResult getStoreProductRelationPage(StoreProductRelationPageReqVO pageReqVO) { + public PageResult getStoreProductRelationPage(StoreProductRelationPageReqVO pageReqVO) { Page pageModel = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); - List list = storeProductRelationMapper - .allRelationList(pageModel,pageReqVO.getNickname()); - return new PageResult<>(list, storeProductRelationMapper.allRelationListCount(pageReqVO.getNickname())); + List list = storeProductRelationMapper + .allRelationList(pageModel,pageReqVO.getNickname(),pageReqVO.getType()); + return new PageResult<>(list, storeProductRelationMapper.allRelationListCount(pageReqVO.getNickname(),pageReqVO.getType())); } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyService.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyService.java index fd8974d..0799aba 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyService.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyService.java @@ -4,8 +4,7 @@ import co.yixiang.yshop.module.product.controller.app.product.vo.AppReplyCountVo import co.yixiang.yshop.module.product.controller.app.product.vo.AppStoreProductReplyQueryVo; import co.yixiang.yshop.module.product.dal.dataobject.storeproductreply.StoreProductReplyDO; import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; /** * 评论 Service 接口 @@ -45,12 +44,12 @@ public interface AppStoreProductReplyService extends IService getReplyList(long productId, int type, int page, int limit); + Page getReplyList(long productId, int type, int page, int limit); /** * 评价数据 diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyServiceImpl.java b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyServiceImpl.java index d719cdd..d9f8da9 100644 --- a/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyServiceImpl.java +++ b/yshop-module-mall/yshop-module-product-biz/src/main/java/co/yixiang/yshop/module/product/service/storeproductreply/AppStoreProductReplyServiceImpl.java @@ -40,6 +40,7 @@ public class AppStoreProductReplyServiceImpl extends ServiceImpllambdaQuery() - .eq(StoreProductReplyDO::getProductId,productId)); + .eq(StoreProductReplyDO::getProductId, productId)); } /** * 获取单条评价 + * * @param productId 商品di * @return YxStoreProductReplyQueryVo */ @Override public AppStoreProductReplyQueryVo getReply(long productId) { AppStoreProductReplyQueryVo vo = this.baseMapper.getReply(productId); - if(ObjectUtil.isNotNull(vo)){ + if (ObjectUtil.isNotNull(vo)) { return handleReply(vo); } return null; @@ -67,18 +69,19 @@ public class AppStoreProductReplyServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreProductReplyDO::getProductId,productId) + wrapper.eq(StoreProductReplyDO::getProductId, productId) .eq(StoreProductReplyDO::getProductScore, ScoreEnum.DEFAULT_5.getValue()); Long productScoreCount = this.baseMapper.selectCount(wrapper); Long count = productReplyCount(productId); - if(count > 0){ - return ""+NumberUtil.round(NumberUtil.mul(NumberUtil.div(productScoreCount,count),100),2); + if (count > 0) { + return "" + NumberUtil.round(NumberUtil.mul(NumberUtil.div(productScoreCount, count), 100), 2); } return ShopConstants.YSHOP_ZERO; @@ -87,47 +90,57 @@ public class AppStoreProductReplyServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreProductReplyDO::getUnique,unique); + wrapper.eq(StoreProductReplyDO::getUnique, unique); return this.baseMapper.selectCount(wrapper); } /** * 获取评价列表 + * * @param productId 商品id - * @param type 0-全部 1-好评 2-中评 3-差评 - * @param page page - * @param limit limit + * @param type 0-全部 1-好评 2-中评 3-差评 4-有图 + * @param page page + * @param limit limit * @return list */ @Override - public List getReplyList(long productId, int type, int page, int limit) { + public Page getReplyList(long productId, int type, int page, int limit) { List newList = new ArrayList<>(); Page pageModel = new Page<>(page, limit); - List list = this.baseMapper - .selectReplyList(pageModel,productId,type); - List list1 = list.stream().map(i ->{ + List list = this.baseMapper.selectReplyList(pageModel, productId, type); + List list1 = list.stream().map(i -> { AppStoreProductReplyQueryVo vo = new AppStoreProductReplyQueryVo(); - BeanUtils.copyProperties(i,vo); - if(i.getPictures().contains(",")){ + BeanUtils.copyProperties(i, vo); + if (i.getPictures().contains(",")) { vo.setPics(i.getPictures().split(",")); + } else { + vo.setPics(new String[]{i.getPictures()}); } return vo; }).collect(Collectors.toList()); for (AppStoreProductReplyQueryVo queryVo : list1) { newList.add(handleReply(queryVo)); } - return newList; + Page result = new Page<>(); + result.setRecords(newList); + result.setSize(limit); + result.setPages(page); + result.setCurrent(pageModel.getCurrent()); + result.setTotal(pageModel.getTotal()); + return result; } /** * 评价数据 + * * @param productId 商品id * @return ReplyCountVO */ @@ -135,29 +148,29 @@ public class AppStoreProductReplyServiceImpl extends ServiceImpllambdaQuery() - .eq(StoreProductReplyDO::getProductId,productId) - .eq(StoreProductReplyDO::getProductScore,ScoreEnum.DEFAULT_5.getValue())); + .eq(StoreProductReplyDO::getProductId, productId) + .eq(StoreProductReplyDO::getProductScore, ScoreEnum.DEFAULT_5.getValue())); //中评 Long inCount = this.baseMapper.selectCount(Wrappers.lambdaQuery() - .eq(StoreProductReplyDO::getProductId,productId) - .lt(StoreProductReplyDO::getProductScore,ScoreEnum.DEFAULT_5.getValue()) - .gt(StoreProductReplyDO::getProductScore,ScoreEnum.DEFAULT_2.getValue())); + .eq(StoreProductReplyDO::getProductId, productId) + .lt(StoreProductReplyDO::getProductScore, ScoreEnum.DEFAULT_5.getValue()) + .gt(StoreProductReplyDO::getProductScore, ScoreEnum.DEFAULT_2.getValue())); //差评 Long poorCount = this.baseMapper.selectCount(Wrappers.lambdaQuery() - .eq(StoreProductReplyDO::getProductId,productId) - .lt(StoreProductReplyDO::getProductScore,ScoreEnum.DEFAULT_2.getValue())); + .eq(StoreProductReplyDO::getProductId, productId) + .lt(StoreProductReplyDO::getProductScore, ScoreEnum.DEFAULT_2.getValue())); //好评率 - String replyChance = ""+NumberUtil.round(NumberUtil.mul(NumberUtil.div(goodCount,sumCount),100),2); - String replyStar = ""+NumberUtil.round(NumberUtil.mul(NumberUtil.div(goodCount,sumCount),5),2); + String replyChance = "" + NumberUtil.round(NumberUtil.mul(NumberUtil.div(goodCount, sumCount), 100), 2); + String replyStar = "" + NumberUtil.round(NumberUtil.mul(NumberUtil.div(goodCount, sumCount), 5), 2); return AppReplyCountVo.builder() .sumCount(sumCount) @@ -172,15 +185,16 @@ public class AppStoreProductReplyServiceImpl extends ServiceImpl(list, storeProductReplyMapper.allReplyListCount(pageReqVO.getNickname())); } + @Override + public Boolean merchantReply(StoreProductMerchantReplyReqVO reqVO){ + // 校验存在 + validateStoreProductReplyExists(reqVO.getId()); + StoreProductReplyDO storeProductReplyDO = new StoreProductReplyDO(); + storeProductReplyDO.setId(reqVO.getId()).setIsReply(1) + .setMerchantReplyTime(LocalDateTime.now()).setMerchantReplyContent(reqVO.getMerchantReplyContent()); + storeProductReplyMapper.updateById(storeProductReplyDO); + return true; + } + } diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcoupon/ProductCouponMapper.xml b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcoupon/ProductCouponMapper.xml new file mode 100644 index 0000000..f23e67b --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcoupon/ProductCouponMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml new file mode 100644 index 0000000..a9df893 --- /dev/null +++ b/yshop-module-mall/yshop-module-product-biz/src/main/resources/mapper/productcouponrelation/ProductCouponRelationMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java index c09ff27..1ad97b9 100644 --- a/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java +++ b/yshop-module-member/yshop-module-member-api/src/main/java/co/yixiang/yshop/module/member/api/user/dto/WechatUserDto.java @@ -1,41 +1,41 @@ -package co.yixiang.yshop.module.member.api.user.dto; - -import lombok.*; - -/** - * @ClassName WechatUserDTO - * @Author hupeng <610796224@qq.com> - * @Date 2023/7/18 - **/ -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class WechatUserDto { - - private String openid; - - private String unionId; - - private String routineOpenid; - - private String nickname; - - private String headimgurl; - - private Integer sex; - - private String city; - - private String language; - - private String province; - - private String country; - - private Boolean subscribe; - - private Long subscribeTime; - -} +package co.yixiang.yshop.module.member.api.user.dto; + +import lombok.*; + +/** + * @ClassName WechatUserDTO + * @Author hupeng <610796224@qq.com> + * @Date 2023/7/18 + **/ +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WechatUserDto { + + private String openid; + + private String unionId; + + private String routineOpenid; + + private String nickname; + + private String headimgurl; + + private Integer sex; + + private String city; + + private String language; + + private String province; + + private String country; + + private Boolean subscribe; + + private Long subscribeTime; + +} diff --git a/yshop-module-member/yshop-module-member-biz/pom.xml b/yshop-module-member/yshop-module-member-biz/pom.xml index abce8d9..db15284 100644 --- a/yshop-module-member/yshop-module-member-biz/pom.xml +++ b/yshop-module-member/yshop-module-member-biz/pom.xml @@ -91,6 +91,12 @@ co.yixiang.boot yshop-spring-boot-starter-biz-ip + + co.yixiang.boot + yshop-module-system-biz + 1.0.0 + compile + diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java index db380e0..134b133 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/AppUserAddressController.java @@ -63,14 +63,14 @@ public class AppUserAddressController { } /** - * 添加或修改地址 - */ + * 添加或修改地址 + */ @PreAuthenticated @PostMapping("/addAndEdit") @Operation(summary = "添加或修改地址") - public CommonResult addYxUserAddress(@Valid @RequestBody AppAddressParam param){ + public CommonResult addYxUserAddress(@Valid @RequestBody AppAddressParam param) { Long uid = getLoginUserId(); - Long id = appUserAddressService.addAndEdit(uid,param); + Long id = appUserAddressService.addAndEdit(uid, param); return success(id); } @@ -81,22 +81,21 @@ public class AppUserAddressController { @PostMapping("/default/set/{id}") @Parameter(name = "id", description = "地址id", required = true) @Operation(summary = "设置默认地址") - public CommonResult setDefault(@PathVariable String id){ + public CommonResult setDefault(@PathVariable String id) { Long uid = getLoginUserId(); - appUserAddressService.setDefault(uid,id); + appUserAddressService.setDefault(uid, id); return success(true); } - /** - * 删除用户地址 - */ + * 删除用户地址 + */ @PreAuthenticated @PostMapping("/del/{id}") @Operation(summary = "删除用户地址") - public CommonResult deleteYxUserAddress(@PathVariable String id){ - if(StrUtil.isBlank(id) || !NumberUtil.isNumber(id)){ + public CommonResult deleteYxUserAddress(@PathVariable Long id) { + if (id == null) { throw exception(USER_ADDRESS_PARAM_NOT_EXISTS); } appUserAddressService.removeById(id); @@ -110,13 +109,12 @@ public class AppUserAddressController { @PreAuthenticated @GetMapping("/list") @Operation(summary = "用户地址列表") - public CommonResult> getYxUserAddressPageList(@RequestParam(value = "page",defaultValue = "1") int page, - @RequestParam(value = "limit",defaultValue = "10") int limit){ + public CommonResult> getYxUserAddressPageList(@RequestParam(value = "page", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "10") int limit) { Long uid = getLoginUserId(); - return success(appUserAddressService.getList(uid,page,limit)); + return success(appUserAddressService.getList(uid, page, limit)); } - } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AddressDetailParam.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AddressDetailParam.java index 8a2bd88..4ae6d64 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AddressDetailParam.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AddressDetailParam.java @@ -1,27 +1,27 @@ -package co.yixiang.yshop.module.member.controller.app.address.param; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName AddressDetailParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/28 - **/ -@Data -public class AddressDetailParam implements Serializable { - - @Schema(description = "城市ID", required = true) - private Integer cityId; - - @Schema(description = "城市", required = true) - private String city; - - @Schema(description = "地区", required = true) - private String district; - - @Schema(description = "省份", required = true) - private String province; -} +package co.yixiang.yshop.module.member.controller.app.address.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName AddressDetailParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/28 + **/ +@Data +public class AddressDetailParam implements Serializable { + + @Schema(description = "城市ID", required = true) + private Integer cityId; + + @Schema(description = "城市", required = true) + private String city; + + @Schema(description = "地区", required = true) + private String district; + + @Schema(description = "省份", required = true) + private String province; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AppAddressParam.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AppAddressParam.java index 6f612e6..ec1e828 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AppAddressParam.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/param/AppAddressParam.java @@ -1,45 +1,45 @@ -package co.yixiang.yshop.module.member.controller.app.address.param; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import java.io.Serializable; - -/** - * @ClassName AddressParam - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/28 - **/ -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class AppAddressParam implements Serializable { - - @Schema(description = "地址ID", required = true) - private String id; - - @NotBlank - @Size(min = 1, max = 30,message = "长度超过了限制") - @Schema(description = "收货地址真实名字", required = true) - private String realName; - - @Schema(description = "收货地址邮编", required = true) - private String postCode; - - @Schema(description = "是否默认收货地址 1是 0否", required = true) - private Integer isDefault; - - @NotBlank - @Size(min = 1, max = 60,message = "长度超过了限制") - @Schema(description = "收货详细地址", required = true) - private String detail; - - @NotBlank - @Schema(description = "收货手机号码", required = true) - private String phone; - - @Schema(description = "收货地址详情", required = true) - private AddressDetailParam address; -} +package co.yixiang.yshop.module.member.controller.app.address.param; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * @ClassName AddressParam + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/28 + **/ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class AppAddressParam implements Serializable { + + @Schema(description = "地址ID", required = true) + private String id; + + @NotBlank + @Size(min = 1, max = 30,message = "长度超过了限制") + @Schema(description = "收货地址真实名字", required = true) + private String realName; + + @Schema(description = "收货地址邮编", required = true) + private String postCode; + + @Schema(description = "是否默认收货地址 1是 0否", required = true) + private Integer isDefault; + + @NotBlank + @Size(min = 1, max = 60,message = "长度超过了限制") + @Schema(description = "收货详细地址", required = true) + private String detail; + + @NotBlank + @Schema(description = "收货手机号码", required = true) + private String phone; + + @Schema(description = "收货地址详情", required = true) + private AddressDetailParam address; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java index 8ee0ab9..2634c88 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/address/vo/AppUserAddressQueryVo.java @@ -54,5 +54,8 @@ public class AppUserAddressQueryVo implements Serializable { @Schema(description = "是否默认", required = true, example = "24169") private Integer isDefault; + @Schema(description = "城市id", required = true, example = "24169") + private Integer cityId; + } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java index cded2c0..0e9389a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java @@ -38,6 +38,7 @@ public class AppAuthController { private SecurityProperties securityProperties; @PostMapping("/login") + @PermitAll @Operation(summary = "使用手机 + 密码登录") public CommonResult login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { return success(authService.login(reqVO)); @@ -65,12 +66,14 @@ public class AppAuthController { // ========== 短信登录相关 ========== @PostMapping("/sms-login") + @PermitAll @Operation(summary = "使用手机 + 验证码登录") public CommonResult smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { return success(authService.smsLogin(reqVO)); } @PostMapping("/send-sms-code") + @PermitAll @Operation(summary = "发送手机验证码") public CommonResult sendSmsCode(@RequestBody @Valid AppAuthSmsSendReqVO reqVO) { authService.sendSmsCode(getLoginUserId(), reqVO); diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java index 6f60044..a20cff9 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/AppUserController.java @@ -40,12 +40,15 @@ public class AppUserController { @Parameter(name = "nickname", description = "用户昵称", required = true, example = "wang"), @Parameter(name = "birthday", description = "生日", - required = true, example = "2023-11-12") + required = true, example = "2023-11-12"), + @Parameter(name = "sex", description = "性别", + required = true, example = "1") }) @PreAuthenticated public CommonResult updateUserNickname(@RequestParam("nickname") String nickname, - @RequestParam("birthday") String birthday) { - userService.updateUserNickname(getLoginUserId(), nickname,birthday); + @RequestParam("birthday") String birthday, + @RequestParam("sex") Integer sex) { + userService.updateUserNickname(getLoginUserId(), nickname, birthday, sex); return success(true); } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java index 8cfb120..ddc76b2 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserInfoRespVO.java @@ -25,4 +25,7 @@ public class AppUserInfoRespVO { @Schema(description = "生日", required = true, example = "2023-10-11") private String birthday; + + @Schema(description = "性别", required = true, example = "1") + private Integer sex; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java index c7f2ae7..6e21898 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/user/vo/AppUserOrderCountVo.java @@ -1,52 +1,52 @@ -package co.yixiang.yshop.module.member.controller.app.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -import java.io.Serializable; - -/** - * @ClassName OrderCountDTO - * @Author hupeng <610796224@qq.com> - * @Date 2023/6/18 - **/ -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Schema(description = "用户 APP - 用户 OrderCountDTO") -public class AppUserOrderCountVo implements Serializable { - - /**订单支付没有退款 数量*/ - @Schema(description = "订单支付没有退款数量", required = true) - private Long orderCount; - - /**订单支付没有退款 支付总金额*/ - @Schema(description = "订单支付没有退款支付总金额", required = true) - private Double sumPrice; - - /**订单待支付 数量*/ - @Schema(description = "订单待支付数量", required = true) - private Long unpaidCount; - - /**订单待发货数量*/ - @Schema(description = "订单待发货数量", required = true) - private Long unshippedCount; - - /**订单待收货数量*/ - @Schema(description = "订单待收货数量", required = true) - private Long receivedCount; - - /**订单待评价数量*/ - @Schema(description = "订单待评价数量", required = true) - private Long evaluatedCount; - - /**订单已完成数量*/ - @Schema(description = "订单已完成数量", required = true) - private Long completeCount; - - /**订单退款数量*/ - @Schema(description = "订单退款数量", required = true) - private Long refundCount; -} +package co.yixiang.yshop.module.member.controller.app.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.io.Serializable; + +/** + * @ClassName OrderCountDTO + * @Author hupeng <610796224@qq.com> + * @Date 2023/6/18 + **/ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(description = "用户 APP - 用户 OrderCountDTO") +public class AppUserOrderCountVo implements Serializable { + + /**订单支付没有退款 数量*/ + @Schema(description = "订单支付没有退款数量", required = true) + private Long orderCount; + + /**订单支付没有退款 支付总金额*/ + @Schema(description = "订单支付没有退款支付总金额", required = true) + private Double sumPrice; + + /**订单待支付 数量*/ + @Schema(description = "订单待支付数量", required = true) + private Long unpaidCount; + + /**订单待发货数量*/ + @Schema(description = "订单待发货数量", required = true) + private Long unshippedCount; + + /**订单待收货数量*/ + @Schema(description = "订单待收货数量", required = true) + private Long receivedCount; + + /**订单待评价数量*/ + @Schema(description = "订单待评价数量", required = true) + private Long evaluatedCount; + + /**订单已完成数量*/ + @Schema(description = "订单已完成数量", required = true) + private Long completeCount; + + /**订单退款数量*/ + @Schema(description = "订单退款数量", required = true) + private Long refundCount; +} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java index e2df5a8..2914cad 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/dal/dataobject/user/MemberUserDO.java @@ -87,6 +87,12 @@ public class MemberUserDO extends TenantBaseDO { * 生日 */ private String birthday; + + /** + * 性别 + */ + private Integer sex; + /** * 身份证号码 */ @@ -179,7 +185,7 @@ public class MemberUserDO extends TenantBaseDO { /** 微信用户json信息 */ @TableField(typeHandler = FastjsonTypeHandler.class) - @Deprecated + // @Deprecated private WechatUserDto wxProfile; } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java index 4c02443..cf0e8c3 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java @@ -91,11 +91,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { @Transactional public AppAuthLoginRespVO smsLogin(AppAuthSmsLoginReqVO reqVO) { // 校验验证码 - String userIp = getClientIP(); - smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)); + String userIp = "9999"; + if (!userIp.equals(reqVO.getCode())) { + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)); + } // 获得获得注册用户 - MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp,reqVO.getFrom()); + MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, reqVO.getFrom()); Assert.notNull(user, "获取用户失败,结果为空"); // 如果 socialType 非空,说明需要绑定社交用户 @@ -148,7 +150,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { log.error(e.getMessage()); throw exception(MINI_AUTH_LOGIN_BAD); } - if(memberUserDO == null){ + if (memberUserDO == null) { // 获得获得注册用户 memberUserDO = userService.createUserIfAbsent(phoneNumberInfo.getPhoneNumber(), getClientIP(), LoginTypeEnum.WXAPP.getValue()); @@ -280,7 +282,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { throw exception(USER_NOT_EXISTS); } // 参数:未加密密码,编码后的密码 - if (!passwordEncoder.matches(oldPassword,user.getPassword())) { + if (!passwordEncoder.matches(oldPassword, user.getPassword())) { throw exception(USER_PASSWORD_FAILED); } return user; diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java index 2f2dc5c..25bba3c 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserService.java @@ -96,8 +96,9 @@ public interface MemberUserService extends IService { * 修改用户昵称 * @param userId 用户id * @param nickname 用户新昵称 + * @param sex 性别 */ - void updateUserNickname(Long userId, String nickname,String birthday); + void updateUserNickname(Long userId, String nickname,String birthday, Integer sex); /** * 修改用户头像 diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java index d6df253..db8921a 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImpl.java @@ -2,6 +2,7 @@ package co.yixiang.yshop.module.member.service.user; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.module.infra.api.file.FileApi; import co.yixiang.yshop.module.member.controller.app.user.vo.AppUserQueryVo; @@ -11,7 +12,9 @@ import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; import co.yixiang.yshop.module.member.dal.mysql.user.MemberUserMapper; import co.yixiang.yshop.module.system.api.sms.SmsCodeApi; import co.yixiang.yshop.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataRespVO; import co.yixiang.yshop.module.system.enums.sms.SmsSceneEnum; +import co.yixiang.yshop.module.system.service.dict.DictDataService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; @@ -41,11 +44,14 @@ import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_NOT_E @Service @Valid @Slf4j -public class MemberUserServiceImpl extends ServiceImpl implements MemberUserService { +public class MemberUserServiceImpl extends ServiceImpl implements MemberUserService { @Resource private MemberUserMapper memberUserMapper; + @Resource + private DictDataService dictDataService; + @Resource private FileApi fileApi; @Resource @@ -55,7 +61,6 @@ public class MemberUserServiceImpl extends ServiceImpl0){ - memberUserMapper.incMoney(uid,price); + if (price != null && price.doubleValue() > 0) { + memberUserMapper.incMoney(uid, price); } } diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java index 8493c96..cecbbbf 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/user/dto/WechatUserDto.java @@ -1,41 +1,41 @@ -//package co.yixiang.yshop.module.member.service.user.dto; -// -//import lombok.*; -// -///** -// * @ClassName WechatUserDTO -// * @Author hupeng <610796224@qq.com> -// * @Date 2023/7/18 -// **/ -//@Getter -//@Setter -//@Builder -//@AllArgsConstructor -//@NoArgsConstructor -//public class WechatUserDto { -// -// private String openid; -// -// private String unionId; -// -// private String routineOpenid; -// -// private String nickname; -// -// private String headimgurl; -// -// private Integer sex; -// -// private String city; -// -// private String language; -// -// private String province; -// -// private String country; -// -// private Boolean subscribe; -// -// private Long subscribeTime; -// -//} +package co.yixiang.yshop.module.member.service.user.dto;//package co.yixiang.yshop.module.member.service.user.dto; +// +//import lombok.*; +// +///** +// * @ClassName WechatUserDTO +// * @Author hupeng <610796224@qq.com> +// * @Date 2023/7/18 +// **/ +//@Getter +//@Setter +//@Builder +//@AllArgsConstructor +//@NoArgsConstructor +//public class WechatUserDto { +// +// private String openid; +// +// private String unionId; +// +// private String routineOpenid; +// +// private String nickname; +// +// private String headimgurl; +// +// private Integer sex; +// +// private String city; +// +// private String language; +// +// private String province; +// +// private String country; +// +// private Boolean subscribe; +// +// private Long subscribeTime; +// +//} diff --git a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/AppUserAddressServiceImpl.java b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/AppUserAddressServiceImpl.java index eda2a1f..500642b 100644 --- a/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/AppUserAddressServiceImpl.java +++ b/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/useraddress/AppUserAddressServiceImpl.java @@ -9,6 +9,7 @@ import co.yixiang.yshop.module.member.convert.useraddress.UserAddressConvert; import co.yixiang.yshop.module.member.dal.dataobject.useraddress.UserAddressDO; import co.yixiang.yshop.module.member.dal.mysql.useraddress.UserAddressMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -20,7 +21,6 @@ import javax.annotation.Resource; import java.util.List; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; -import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_ADDRESS_NOT_EXISTS; import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_ADDRESS_PARAM_NOT_EXISTS; /** @@ -30,19 +30,20 @@ import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_ADDRE */ @Service @Validated -public class AppUserAddressServiceImpl extends ServiceImpl implements AppUserAddressService { +public class AppUserAddressServiceImpl extends ServiceImpl implements AppUserAddressService { @Resource private UserAddressMapper userAddressMapper; /** * 添加或者修改地址 - * @param uid uid + * + * @param uid uid * @param param AddressParam * @return id 地址id */ @Override - public Long addAndEdit(Long uid, AppAddressParam param){ + public Long addAndEdit(Long uid, AppAddressParam param) { UserAddressDO userAddress = UserAddressDO.builder() .city(param.getAddress().getCity()) .cityId(param.getAddress().getCityId()) @@ -55,33 +56,40 @@ public class AppUserAddressServiceImpl extends ServiceImpl() + .eq(UserAddressDO::getUid,uid).ne(UserAddressDO::getId,userAddress.getId())); + } return userAddress.getId(); } /** * 设置默认地址 - * @param uid uid + * + * @param uid uid * @param addressId 地址id */ @Override - public void setDefault(Long uid,String addressId){ - if(StrUtil.isBlank(addressId) || !NumberUtil.isNumber(addressId)){ + public void setDefault(Long uid, String addressId) { + if (StrUtil.isBlank(addressId) || !NumberUtil.isNumber(addressId)) { throw exception(USER_ADDRESS_PARAM_NOT_EXISTS); } UserAddressDO address = new UserAddressDO(); - address.setIsDefault(ShopCommonEnum.DEFAULT_0.getValue()); + address.setIsDefault(ShopCommonEnum.NON_DEFAULT.getValue()); userAddressMapper.update(address, - new LambdaQueryWrapper().eq(UserAddressDO::getUid,uid)); + new LambdaQueryWrapper().eq(UserAddressDO::getUid, uid)); UserAddressDO userAddress = new UserAddressDO(); - userAddress.setIsDefault(ShopCommonEnum.DEFAULT_1.getValue()); + userAddress.setIsDefault(ShopCommonEnum.IS_DEFAULT.getValue()); userAddress.setId(Long.valueOf(addressId)); userAddressMapper.updateById(userAddress); } @@ -89,15 +97,17 @@ public class AppUserAddressServiceImpl extends ServiceImpl getList(Long uid, int page, int limit){ + public List getList(Long uid, int page, int limit) { Page pageModel = new Page<>(page, limit); - IPage pageList = this.lambdaQuery().eq(UserAddressDO::getUid,uid).page(pageModel); + IPage pageList = this.lambdaQuery().eq(UserAddressDO::getUid, uid) + .orderByDesc(UserAddressDO::getIsDefault).page(pageModel); return UserAddressConvert.INSTANCE.convertList02(pageList.getRecords()); } diff --git a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImplTest.java b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImplTest.java index 8fc6858..89b390d 100644 --- a/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImplTest.java +++ b/yshop-module-member/yshop-module-member-biz/src/test/java/co/yixiang/yshop/module/member/service/user/MemberUserServiceImplTest.java @@ -67,7 +67,7 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { String newNickName = randomString(); // 调用接口修改昵称 - memberUserService.updateUserNickname(userDO.getId(),newNickName,""); + memberUserService.updateUserNickname(userDO.getId(),newNickName,"", 1); // 查询新修改后的昵称 String nickname = memberUserService.getUser(userDO.getId()).getNickname(); // 断言 diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/dal/dataobject/wechattemplate/WechatTemplateDO.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/dal/dataobject/wechattemplate/WechatTemplateDO.java index 3ab7a58..db3b9a3 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/dal/dataobject/wechattemplate/WechatTemplateDO.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/dal/dataobject/wechattemplate/WechatTemplateDO.java @@ -1,9 +1,6 @@ package co.yixiang.yshop.module.message.dal.dataobject.wechattemplate; import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO; diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java index b408c5b..5f786de 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeiXinSubscribeService.java @@ -1,212 +1,208 @@ -package co.yixiang.yshop.module.message.supply; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; -import cn.hutool.core.util.StrUtil; -import co.yixiang.yshop.framework.common.constant.ShopConstants; -import co.yixiang.yshop.framework.common.enums.ShopCommonEnum; -import co.yixiang.yshop.framework.common.exception.ErrorCode; -import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; -import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; -import co.yixiang.yshop.module.member.service.user.MemberUserService; -import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; -import co.yixiang.yshop.module.message.enums.WechatTempateEnum; -import co.yixiang.yshop.module.message.service.wechattemplate.WechatTemplateService; -import me.chanjar.weixin.common.error.WxErrorException; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; - -; - -/** - * 小程序订阅消息通知 - */ -@Service -public class WeiXinSubscribeService { - - @Resource - private MemberUserService userService; - @Resource - private WechatTemplateService wechatTemplateService; - @Resource - private WxMaService wxMaService; - /** - * 充值成功通知 - * @param time 时间 - * @param price 金额 - * @param uid uid - */ - public void rechargeSuccessNotice(String time,String price,Long uid){ - String openid = this.getUserOpenid(uid); - - if(StrUtil.isBlank(openid)) { - return; - } - - Map map = new HashMap<>(); - map.put("first","您的账户金币发生变动,详情如下:"); - map.put("keyword1","充值"); - map.put("keyword2",time); - map.put("keyword3",price); - map.put("remark", ShopConstants.YSHOP_WECHAT_PUSH_REMARK); - String tempId = this.getTempId(WechatTempateEnum.RECHARGE_SUCCESS.getValue()); - if(StrUtil.isNotBlank(tempId)) { - this.sendSubscribeMsg( openid, tempId, "/user/account",map); - } - } - - - /** - * 支付成功通知 - * @param orderId 订单号 - * @param price 金额 - * @param uid uid - */ - public void paySuccessNotice(String orderId,String price,Long uid){ - - String openid = this.getUserOpenid(uid); - if(StrUtil.isBlank(openid)) { - return; - } - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); - Map map = new HashMap<>(); - map.put("amount1",price); - map.put("date2", simpleDateFormat.format(new Date())); - map.put("character_string3",orderId); - map.put("time4",simpleDateFormat.format(new Date())); - map.put("thing5","yshop购买商品"); - String tempId = this.getTempId(WechatTempateEnum.PAY_SUCCESS.getValue()); - if(StrUtil.isNotBlank(tempId)) { - this.sendSubscribeMsg( openid,tempId, "/order/detail/"+orderId,map); - } - } - - /** - * 退款成功通知 - * @param orderId 订单号 - * @param price 金额 - * @param uid uid - * @param time 时间 - */ - public void refundSuccessNotice(String orderId,String price,Long uid,String time){ - - String openid = this.getUserOpenid(uid); - - if(StrUtil.isBlank(openid)) { - return; - } - - Map map = new HashMap<>(); - map.put("first","您的订单退款申请被通过,钱款将很快还至您的支付账户。"); - //订单号 - map.put("keyword1",orderId); - map.put("keyword2",price); - map.put("keyword3", time); - map.put("remark",ShopConstants.YSHOP_WECHAT_PUSH_REMARK); - String tempId = this.getTempId(WechatTempateEnum.REFUND_SUCCESS.getValue()); - if(StrUtil.isNotBlank(tempId)) { - this.sendSubscribeMsg( openid,tempId, "/order/detail/"+orderId,map); - } - } - - /** - * 发货成功通知 - * @param orderId 单号 - * @param deliveryName 快递公司 - * @param deliveryId 快递单号 - * @param uid uid - */ - public void deliverySuccessNotice(String orderId,String deliveryName, - String deliveryId,Long uid){ - - String openid = this.getUserOpenid(uid); - - if(StrUtil.isEmpty(openid)) { - return; - } - - Map map = new HashMap<>(); - map.put("first","亲,宝贝已经启程了,好想快点来到你身边。"); - map.put("keyword2",deliveryName); - map.put("keyword1",orderId); - map.put("keyword3",deliveryId); - map.put("remark",ShopConstants.YSHOP_WECHAT_PUSH_REMARK); - String tempId = this.getTempId(WechatTempateEnum.DELIVERY_SUCCESS.getValue()); - if(StrUtil.isNotBlank(tempId)) { - this.sendSubscribeMsg( openid,tempId, "/order/detail/"+orderId,map); - } - } - - - /** - * 构建小程序一次性订阅消息 - * @param openId 单号 - * @param templateId 模板id - * @param page 跳转页面 - * @param map map内容 - * @return String - */ - private void sendSubscribeMsg(String openId, String templateId, String page, Map map){ - WxMaSubscribeMessage wxMaSubscribeMessage = WxMaSubscribeMessage.builder() - .toUser(openId) - .templateId(templateId) - .page(page) - .build(); - map.forEach( (k,v)-> { wxMaSubscribeMessage.addData(new WxMaSubscribeMessage.MsgData(k, v));} ); - // WxMaService wxMaService = WxMaConfiguration.getWxMaService(); - try { - wxMaService.getMsgService().sendSubscribeMsg(wxMaSubscribeMessage); - } catch (WxErrorException e) { - e.printStackTrace(); - } - } - - /** - * 获取模板消息id - * @param key 模板key - * @return string - */ - private String getTempId(String key){ - WechatTemplateDO yxWechatTemplate = wechatTemplateService.lambdaQuery() - .eq(WechatTemplateDO::getType,"subscribe") - .eq(WechatTemplateDO::getTempkey,key) - .one(); - if (yxWechatTemplate == null) { - throw exception(new ErrorCode(9999999,"请后台配置key:" + key + "订阅消息id")); - } - if(ShopCommonEnum.IS_STATUS_0.getValue().equals(yxWechatTemplate.getStatus())){ - return ""; - } - return yxWechatTemplate.getTempid(); - } - - - /** - * 获取openid - * @param uid uid - * @return String - */ - private String getUserOpenid(Long uid){ - MemberUserDO yxUser = userService.getById(uid); - if(yxUser == null) { - return ""; - } - - WechatUserDto wechatUserDto = yxUser.getWxProfile(); - if(wechatUserDto == null) { - return ""; - } - if(StrUtil.isBlank(wechatUserDto.getRoutineOpenid())) { - return ""; - } - return wechatUserDto.getRoutineOpenid(); - - } -} +package co.yixiang.yshop.module.message.supply; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; +import cn.hutool.core.util.StrUtil; +import co.yixiang.yshop.framework.common.constant.ShopConstants; +import co.yixiang.yshop.framework.common.exception.ErrorCode; +import co.yixiang.yshop.module.member.api.user.dto.WechatUserDto; +import co.yixiang.yshop.module.member.dal.dataobject.user.MemberUserDO; +import co.yixiang.yshop.module.member.service.user.MemberUserService; +import co.yixiang.yshop.module.message.dal.dataobject.wechattemplate.WechatTemplateDO; +import co.yixiang.yshop.module.message.enums.WechatTempateEnum; +import co.yixiang.yshop.module.message.service.wechattemplate.WechatTemplateService; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; + +; + +/** + * 小程序订阅消息通知 + */ +@Service +public class WeiXinSubscribeService { + + @Resource + private MemberUserService userService; + @Resource + private WechatTemplateService wechatTemplateService; + @Resource + private WxMaService wxMaService; + /** + * 充值成功通知 + * @param time 时间 + * @param price 金额 + * @param uid uid + */ + public void rechargeSuccessNotice(String time,String price,Long uid){ + String openid = this.getUserOpenid(uid); + + if(StrUtil.isBlank(openid)) { + return; + } + + Map map = new HashMap<>(); + map.put("first","您的账户金币发生变动,详情如下:"); + map.put("keyword1","充值"); + map.put("keyword2",time); + map.put("keyword3",price); + map.put("remark", ShopConstants.YSHOP_WECHAT_PUSH_REMARK); + String tempId = this.getTempId(WechatTempateEnum.RECHARGE_SUCCESS.getValue()); + if(StrUtil.isNotBlank(tempId)) { + this.sendSubscribeMsg( openid, tempId, "/user/account",map); + } + } + + + /** + * 支付成功通知 + * @param orderId 订单号 + * @param price 金额 + * @param uid uid + */ + public void paySuccessNotice(String orderId,String price,Long uid){ + + String openid = this.getUserOpenid(uid); + if(StrUtil.isBlank(openid)) { + return; + } + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); + Map map = new HashMap<>(); + map.put("amount1",price); + map.put("date2", simpleDateFormat.format(new Date())); + map.put("character_string3",orderId); + map.put("time4",simpleDateFormat.format(new Date())); + map.put("thing5","yshop购买商品"); + String tempId = this.getTempId(WechatTempateEnum.PAY_SUCCESS.getValue()); + if(StrUtil.isNotBlank(tempId)) { + this.sendSubscribeMsg( openid,tempId, "/order/detail/"+orderId,map); + } + } + + /** + * 退款成功通知 + * @param orderId 订单号 + * @param price 金额 + * @param uid uid + * @param time 时间 + */ + public void refundSuccessNotice(String orderId,String price,Long uid,String time){ + + String openid = this.getUserOpenid(uid); + + if(StrUtil.isBlank(openid)) { + return; + } + + Map map = new HashMap<>(); + map.put("first","您的订单退款申请被通过,钱款将很快还至您的支付账户。"); + //订单号 + map.put("keyword1",orderId); + map.put("keyword2",price); + map.put("keyword3", time); + map.put("remark",ShopConstants.YSHOP_WECHAT_PUSH_REMARK); + String tempId = this.getTempId(WechatTempateEnum.REFUND_SUCCESS.getValue()); + if(StrUtil.isNotBlank(tempId)) { + this.sendSubscribeMsg( openid,tempId, "/order/detail/"+orderId,map); + } + } + + /** + * 发货成功通知 + * @param orderId 单号 + * @param deliveryName 快递公司 + * @param deliveryId 快递单号 + * @param uid uid + */ + public void deliverySuccessNotice(String orderId,String deliveryName, + String deliveryId,Long uid){ + + String openid = this.getUserOpenid(uid); + + if(StrUtil.isEmpty(openid)) { + return; + } + + Map map = new HashMap<>(); + map.put("first","亲,宝贝已经启程了,好想快点来到你身边。"); + map.put("keyword2",deliveryName); + map.put("keyword1",orderId); + map.put("keyword3",deliveryId); + map.put("remark",ShopConstants.YSHOP_WECHAT_PUSH_REMARK); + String tempId = this.getTempId(WechatTempateEnum.DELIVERY_SUCCESS.getValue()); + if(StrUtil.isNotBlank(tempId)) { + this.sendSubscribeMsg( openid,tempId, "/order/detail/"+orderId,map); + } + } + + + /** + * 构建小程序一次性订阅消息 + * @param openId 单号 + * @param templateId 模板id + * @param page 跳转页面 + * @param map map内容 + * @return String + */ + private void sendSubscribeMsg(String openId, String templateId, String page, Map map){ + WxMaSubscribeMessage wxMaSubscribeMessage = WxMaSubscribeMessage.builder() + .toUser(openId) + .templateId(templateId) + .page(page) + .build(); + map.forEach( (k,v)-> { wxMaSubscribeMessage.addData(new WxMaSubscribeMessage.MsgData(k, v));} ); + // WxMaService wxMaService = WxMaConfiguration.getWxMaService(); + try { + wxMaService.getMsgService().sendSubscribeMsg(wxMaSubscribeMessage); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } + + /** + * 获取模板消息id + * @param key 模板key + * @return string + */ + private String getTempId(String key){ + WechatTemplateDO yxWechatTemplate = wechatTemplateService.lambdaQuery() + .eq(WechatTemplateDO::getType,"subscribe") + .eq(WechatTemplateDO::getTempkey,key) + .one(); + if (yxWechatTemplate == null) { + throw exception(new ErrorCode(9999999,"请后台配置key:" + key + "订阅消息id")); + } + return yxWechatTemplate.getTempid(); + } + + + /** + * 获取openid + * @param uid uid + * @return String + */ + private String getUserOpenid(Long uid){ + MemberUserDO yxUser = userService.getById(uid); + if(yxUser == null) { + return ""; + } + + WechatUserDto wechatUserDto = yxUser.getWxProfile(); + if(wechatUserDto == null) { + return ""; + } + if(StrUtil.isBlank(wechatUserDto.getRoutineOpenid())) { + return ""; + } + return wechatUserDto.getRoutineOpenid(); + + } +} diff --git a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java index a254e6d..fdc9340 100644 --- a/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java +++ b/yshop-module-message/yshop-module-message-biz/src/main/java/co/yixiang/yshop/module/message/supply/WeixinTemplateService.java @@ -206,7 +206,7 @@ public class WeixinTemplateService { throw exception(new ErrorCode(9999999,"请后台配置key:" + key + "订阅消息id")); } - if(ShopCommonEnum.IS_STATUS_0.getValue().equals(yxWechatTemplate.getStatus())){ + if(ShopCommonEnum.NO.getValue().equals(yxWechatTemplate.getStatus())){ return ""; } diff --git a/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/ErrorCodeConstants.java b/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/ErrorCodeConstants.java index 43c0575..892ca73 100644 --- a/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/ErrorCodeConstants.java +++ b/yshop-module-mp/yshop-module-mp-api/src/main/java/co/yixiang/yshop/module/mp/enums/ErrorCodeConstants.java @@ -20,6 +20,8 @@ public interface ErrorCodeConstants { ErrorCode STATISTICS_GET_UPSTREAM_MESSAGE_FAIL = new ErrorCode(1006001002, "获得消息发送概况数据失败,原因:{}"); ErrorCode STATISTICS_GET_INTERFACE_SUMMARY_FAIL = new ErrorCode(1006001003, "获得接口分析数据失败,原因:{}"); + ErrorCode STATISTICS_GET_DATETIME_FAIL = new ErrorCode(1006001004, "获得接口分析数据失败,筛选时间不能大于当前时间"); + // ========== 公众号标签 1006002000============ ErrorCode TAG_NOT_EXISTS = new ErrorCode(1006002000, "标签不存在"); ErrorCode TAG_CREATE_FAIL = new ErrorCode(1006002001, "创建标签失败,原因:{}"); diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountBaseVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountBaseVO.java index e73a6e6..389a56c 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountBaseVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountBaseVO.java @@ -14,23 +14,23 @@ import javax.validation.constraints.NotEmpty; @Data public class MpAccountBaseVO { - @Schema(description = "公众号名称", required = true, example = "yshop") + @Schema(description = "公众号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshop") @NotEmpty(message = "公众号名称不能为空") private String name; - @Schema(description = "公众号微信号", required = true, example = "yshopyuanma") + @Schema(description = "公众号微信号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshopyuanma") @NotEmpty(message = "公众号微信号不能为空") private String account; - @Schema(description = "公众号 appId", required = true, example = "wx5b23ba7a5589ecbb") + @Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx5b23ba7a5589ecbb") @NotEmpty(message = "公众号 appId 不能为空") private String appId; - @Schema(description = "公众号密钥", required = true, example = "3a7b3b20c537e52e74afd395eb85f61f") + @Schema(description = "公众号密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "3a7b3b20c537e52e74afd395eb85f61f") @NotEmpty(message = "公众号密钥不能为空") private String appSecret; - @Schema(description = "公众号 token", required = true, example = "kangdayuzhen") + @Schema(description = "公众号 token", requiredMode = Schema.RequiredMode.REQUIRED, example = "kangdayuzhen") @NotEmpty(message = "公众号 token 不能为空") private String token; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountRespVO.java index 6b10e7c..c09a5ea 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountRespVO.java @@ -13,13 +13,13 @@ import java.util.Date; @ToString(callSuper = true) public class MpAccountRespVO extends MpAccountBaseVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; @Schema(description = "二维码图片URL", example = "https://www.yixiang.co/1024.png") private String qrCodeUrl; - @Schema(description = "创建时间", required = true) + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private Date createTime; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java index 72520eb..9d8de63 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountSimpleRespVO.java @@ -7,10 +7,10 @@ import lombok.Data; @Data public class MpAccountSimpleRespVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; - @Schema(description = "公众号名称", required = true, example = "yshop") + @Schema(description = "公众号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshop") private String name; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java index 2ee3f83..00df62b 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/account/vo/MpAccountUpdateReqVO.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpAccountUpdateReqVO extends MpAccountBaseVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "编号不能为空") private Long id; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuRespVO.java index d171f4a..69720a1 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuRespVO.java @@ -13,16 +13,16 @@ import java.util.Date; @ToString(callSuper = true) public class MpMenuRespVO extends MpMenuBaseVO { - @Schema(description = "主键", required = true, example = "1024") + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") private Long accountId; - @Schema(description = "公众号 appId", required = true, example = "wx1234567890ox") + @Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890ox") private String appId; - @Schema(description = "创建时间", required = true) + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private Date createTime; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java index 48312cd..309f807 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/menu/vo/MpMenuSaveReqVO.java @@ -12,7 +12,7 @@ import java.util.List; @Data public class MpMenuSaveReqVO { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java index a483170..64298e3 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpAutoReplyPageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "1") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java index 8aaed62..4474be8 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java @@ -13,15 +13,15 @@ import java.util.Date; @ToString(callSuper = true) public class MpAutoReplyRespVO extends MpAutoReplyBaseVO { - @Schema(description = "主键", required = true, example = "1024") + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; - @Schema(description = "公众号账号的编号", required = true, example = "1024") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long accountId; - @Schema(description = "公众号 appId", required = true, example = "wx1234567890") + @Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") private String appId; - @Schema(description = "创建时间", required = true) + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private Date createTime; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java index 782889f..c4dffe3 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java @@ -18,7 +18,7 @@ import static co.yixiang.yshop.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class MpMessagePageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "1024") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java index a6f0e17..9cb82e4 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java @@ -13,25 +13,25 @@ import java.util.List; @Data public class MpMessageRespVO { - @Schema(description = "主键", required = true, example = "1024") + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Integer id; - @Schema(description = "微信公众号消息 id", required = true, example = "23953173569869169") + @Schema(description = "微信公众号消息 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23953173569869169") private Long msgId; - @Schema(description = "公众号账号的编号", required = true, example = "1") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long accountId; - @Schema(description = "公众号账号的 appid", required = true, example = "wx1234567890") + @Schema(description = "公众号账号的 appid", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") private String appId; - @Schema(description = "公众号粉丝编号", required = true, example = "2048") + @Schema(description = "公众号粉丝编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") private Long userId; - @Schema(description = "公众号粉丝标志", required = true, example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") + @Schema(description = "公众号粉丝标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") private String openid; - @Schema(description = "消息类型 参见 WxConsts.XmlMsgType 枚举", required = true, example = "text") + @Schema(description = "消息类型 参见 WxConsts.XmlMsgType 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "text") private String type; - @Schema(description = "消息来源 参见 MpMessageSendFromEnum 枚举", required = true, example = "1") + @Schema(description = "消息来源 参见 MpMessageSendFromEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer sendFrom; // ========= 普通消息内容 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html @@ -95,7 +95,7 @@ public class MpMessageRespVO { @Schema(description = "事件 Key 参见 WxConsts.EventType 枚举", example = "qrscene_123456") private String eventKey; - @Schema(description = "创建时间", required = true) + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private Date createTime; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java index 1ba0f91..f478997 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java @@ -14,37 +14,37 @@ import java.util.List; @Data public class MpMessageSendReqVO { - @Schema(description = "公众号粉丝的编号", required = true, example = "1024") + @Schema(description = "公众号粉丝的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "公众号粉丝的编号不能为空") private Long userId; // ========== 消息内容 ========== - @Schema(description = "消息类型 TEXT/IMAGE/VOICE/VIDEO/NEWS", required = true, example = "text") + @Schema(description = "消息类型 TEXT/IMAGE/VOICE/VIDEO/NEWS", requiredMode = Schema.RequiredMode.REQUIRED, example = "text") @NotEmpty(message = "消息类型不能为空") public String type; - @Schema(description = "消息内容", required = true, example = "你好呀") + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好呀") @NotEmpty(message = "消息内容不能为空", groups = TextMessageGroup.class) private String content; - @Schema(description = "媒体 ID", required = true, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP") + @Schema(description = "媒体 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP") @NotEmpty(message = "消息内容不能为空", groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class}) private String mediaId; - @Schema(description = "标题", required = true, example = "没有标题") + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "没有标题") @NotEmpty(message = "消息内容不能为空", groups = VideoMessageGroup.class) private String title; - @Schema(description = "描述", required = true, example = "你猜") + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") @NotEmpty(message = "消息描述不能为空", groups = VideoMessageGroup.class) private String description; - @Schema(description = "缩略图的媒体 id", required = true, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP") + @Schema(description = "缩略图的媒体 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "qqc_2Fot30Jse-HDoZmo5RrUDijz2nGUkP") @NotEmpty(message = "缩略图的媒体 id 不能为空", groups = MusicMessageGroup.class) private String thumbMediaId; - @Schema(description = "图文消息", required = true) + @Schema(description = "图文消息", requiredMode = Schema.RequiredMode.REQUIRED) @Valid @NotNull(message = "图文消息不能为空", groups = NewsMessageGroup.class) private List articles; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java index c1db729..929a5ea 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpDraftPageReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpDraftPageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "1024") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java index 298c639..234f265 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/news/vo/MpFreePublishPageReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpFreePublishPageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "1024") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java index bd713f7..3c47acf 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenCheckSignatureReqVO.java @@ -9,19 +9,19 @@ import javax.validation.constraints.NotEmpty; @Data public class MpOpenCheckSignatureReqVO { - @Schema(description = "微信加密签名", required = true, example = "490eb57f448b87bd5f20ccef58aa4de46aa1908e") + @Schema(description = "微信加密签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "490eb57f448b87bd5f20ccef58aa4de46aa1908e") @NotEmpty(message = "微信加密签名不能为空") private String signature; - @Schema(description = "时间戳", required = true, example = "1672587863") + @Schema(description = "时间戳", requiredMode = Schema.RequiredMode.REQUIRED, example = "1672587863") @NotEmpty(message = "时间戳不能为空") private String timestamp; - @Schema(description = "随机数", required = true, example = "1827365808") + @Schema(description = "随机数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1827365808") @NotEmpty(message = "随机数不能为空") private String nonce; - @Schema(description = "随机字符串", required = true, example = "2721154047828672511") + @Schema(description = "随机字符串", requiredMode = Schema.RequiredMode.REQUIRED, example = "2721154047828672511") @NotEmpty(message = "随机字符串不能为空") @SuppressWarnings("SpellCheckingInspection") private String echostr; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java index 9058746..113b457 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/open/vo/MpOpenHandleMessageReqVO.java @@ -12,19 +12,19 @@ public class MpOpenHandleMessageReqVO { public static final String ENCRYPT_TYPE_AES = "aes"; - @Schema(description = "微信加密签名", required = true, example = "490eb57f448b87bd5f20ccef58aa4de46aa1908e") + @Schema(description = "微信加密签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "490eb57f448b87bd5f20ccef58aa4de46aa1908e") @NotEmpty(message = "微信加密签名不能为空") private String signature; - @Schema(description = "时间戳", required = true, example = "1672587863") + @Schema(description = "时间戳", requiredMode = Schema.RequiredMode.REQUIRED, example = "1672587863") @NotEmpty(message = "时间戳不能为空") private String timestamp; - @Schema(description = "随机数", required = true, example = "1827365808") + @Schema(description = "随机数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1827365808") @NotEmpty(message = "随机数不能为空") private String nonce; - @Schema(description = "粉丝 openid", required = true, example = "oz-Jdtyn-WGm4C4I5Z-nvBMO_ZfY") + @Schema(description = "粉丝 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "oz-Jdtyn-WGm4C4I5Z-nvBMO_ZfY") @NotEmpty(message = "粉丝 openid 不能为空") private String openid; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/MpStatisticsController.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/MpStatisticsController.java index 95404fa..a4d305b 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/MpStatisticsController.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/statistics/MpStatisticsController.java @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.List; import static co.yixiang.yshop.framework.common.pojo.CommonResult.success; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagBaseVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagBaseVO.java index 9bc5d8e..559d17d 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagBaseVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagBaseVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotEmpty; @Data public class MpTagBaseVO { - @Schema(description = "标签名", required = true, example = "土豆") + @Schema(description = "标签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") @NotEmpty(message = "标签名不能为空") private String name; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java index 17512bd..c86adda 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagCreateReqVO.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpTagCreateReqVO extends MpTagBaseVO { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java index 0dfe4e9..ab25813 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagPageReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotEmpty; @ToString(callSuper = true) public class MpTagPageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotEmpty(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagRespVO.java index e96174b..c0541ee 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagRespVO.java @@ -13,13 +13,13 @@ import java.util.Date; @ToString(callSuper = true) public class MpTagRespVO extends MpTagBaseVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; - @Schema(description = "此标签下粉丝数量", required = true, example = "0") + @Schema(description = "此标签下粉丝数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") private Integer count; - @Schema(description = "创建时间", required = true) + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private Date createTime; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java index e381f5f..f6d1b1f 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagSimpleRespVO.java @@ -7,13 +7,13 @@ import lombok.Data; @Data public class MpTagSimpleRespVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; - @Schema(description = "公众号的标签编号", required = true, example = "2048") + @Schema(description = "公众号的标签编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") private Long tagId; - @Schema(description = "标签名称", required = true, example = "快乐") + @Schema(description = "标签名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "快乐") private String name; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java index 8d165df..969e16b 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/tag/vo/MpTagUpdateReqVO.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpTagUpdateReqVO extends MpTagBaseVO { - @Schema(description = "编号", required = true) + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "编号不能为空") private Long id; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserPageReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserPageReqVO.java index 80c951d..05361c7 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserPageReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserPageReqVO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; @ToString(callSuper = true) public class MpUserPageReqVO extends PageParam { - @Schema(description = "公众号账号的编号", required = true, example = "2048") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") @NotNull(message = "公众号账号的编号不能为空") private Long accountId; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserRespVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserRespVO.java index bfad194..28eb4eb 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserRespVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserRespVO.java @@ -4,22 +4,21 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; -import java.util.Date; import java.util.List; @Schema(description = "管理后台 - 公众号粉丝 Response VO") @Data public class MpUserRespVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; - @Schema(description = "公众号粉丝标识", required = true, example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") + @Schema(description = "公众号粉丝标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "o6_bmjrPTlm6_2sgVt7hMZOPfL2M") private String openid; - @Schema(description = "关注状态 参见 CommonStatusEnum 枚举", required = true, example = "1") + @Schema(description = "关注状态 参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer subscribeStatus; - @Schema(description = "关注时间", required = true) + @Schema(description = "关注时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime subscribeTime; @Schema(description = "取消关注时间") private LocalDateTime unsubscribeTime; @@ -42,12 +41,12 @@ public class MpUserRespVO { @Schema(description = "标签编号数组", example = "1,2,3") private List tagIds; - @Schema(description = "公众号账号的编号", required = true, example = "1") + @Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long accountId; - @Schema(description = "公众号账号的 appId", required = true, example = "wx1234567890") + @Schema(description = "公众号账号的 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx1234567890") private String appId; - @Schema(description = "创建时间", required = true) - private Date createTime; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java index ca7580f..5ff5f18 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/user/vo/MpUserUpdateReqVO.java @@ -10,7 +10,7 @@ import java.util.List; @Data public class MpUserUpdateReqVO { - @Schema(description = "编号", required = true, example = "1024") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "编号不能为空") private Long id; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java index 7dd823c..26bba9c 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/message/MpAutoReplyDO.java @@ -30,9 +30,9 @@ import java.util.Set; @ToString(callSuper = true) public class MpAutoReplyDO extends BaseDO { - public static Set REQUEST_MESSAGE_TYPE = SetUtils.asSet(WxConsts.XmlMsgType.TEXT, WxConsts.XmlMsgType.IMAGE, - WxConsts.XmlMsgType.VOICE, WxConsts.XmlMsgType.VIDEO, WxConsts.XmlMsgType.SHORTVIDEO, - WxConsts.XmlMsgType.LOCATION, WxConsts.XmlMsgType.LINK); + public static Set REQUEST_MESSAGE_TYPE = SetUtils.asSet(XmlMsgType.TEXT, XmlMsgType.IMAGE, + XmlMsgType.VOICE, XmlMsgType.VIDEO, XmlMsgType.SHORTVIDEO, + XmlMsgType.LOCATION, XmlMsgType.LINK); /** * 主键 @@ -97,14 +97,14 @@ public class MpAutoReplyDO extends BaseDO { /** * 回复的消息内容 * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT + * 消息类型为 {@link XmlMsgType} 的 TEXT */ private String responseContent; /** * 回复的媒体 id * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO + * 消息类型为 {@link XmlMsgType} 的 IMAGE、VOICE、VIDEO */ private String responseMediaId; /** @@ -115,33 +115,33 @@ public class MpAutoReplyDO extends BaseDO { /** * 回复的标题 * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO + * 消息类型为 {@link XmlMsgType} 的 VIDEO */ private String responseTitle; /** * 回复的描述 * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO + * 消息类型为 {@link XmlMsgType} 的 VIDEO */ private String responseDescription; /** * 回复的缩略图的媒体 id,通过素材管理中的接口上传多媒体文件,得到的 id * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO + * 消息类型为 {@link XmlMsgType} 的 MUSIC、VIDEO */ private String responseThumbMediaId; /** * 回复的缩略图的媒体 URL * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC、VIDEO + * 消息类型为 {@link XmlMsgType} 的 MUSIC、VIDEO */ private String responseThumbMediaUrl; /** * 回复的图文消息 * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS + * 消息类型为 {@link XmlMsgType} 的 NEWS */ @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class) private List responseArticles; @@ -149,7 +149,7 @@ public class MpAutoReplyDO extends BaseDO { /** * 回复的音乐链接 * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC + * 消息类型为 {@link XmlMsgType} 的 MUSIC */ private String responseMusicUrl; /** @@ -157,7 +157,7 @@ public class MpAutoReplyDO extends BaseDO { * * WIFI 环境优先使用该链接播放音乐 * - * 消息类型为 {@link WxConsts.XmlMsgType} 的 MUSIC + * 消息类型为 {@link XmlMsgType} 的 MUSIC */ private String responseHqMusicUrl; diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/statistics/MpStatisticsServiceImpl.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/statistics/MpStatisticsServiceImpl.java index dbb1200..d5e7a49 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/statistics/MpStatisticsServiceImpl.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/statistics/MpStatisticsServiceImpl.java @@ -1,6 +1,7 @@ package co.yixiang.yshop.module.mp.service.statistics; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; import co.yixiang.yshop.module.mp.framework.mp.core.MpServiceFactory; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -13,6 +14,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -32,6 +34,7 @@ public class MpStatisticsServiceImpl implements MpStatisticsService { @Override public List getUserSummary(Long accountId, LocalDateTime[] date) { + validDate(date); WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); try { return mpService.getDataCubeService().getUserSummary( @@ -43,6 +46,7 @@ public class MpStatisticsServiceImpl implements MpStatisticsService { @Override public List getUserCumulate(Long accountId, LocalDateTime[] date) { + validDate(date); WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); try { return mpService.getDataCubeService().getUserCumulate( @@ -54,6 +58,7 @@ public class MpStatisticsServiceImpl implements MpStatisticsService { @Override public List getUpstreamMessage(Long accountId, LocalDateTime[] date) { + validDate(date); WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); try { return mpService.getDataCubeService().getUpstreamMsg( @@ -65,6 +70,7 @@ public class MpStatisticsServiceImpl implements MpStatisticsService { @Override public List getInterfaceSummary(Long accountId, LocalDateTime[] date) { + validDate(date); WxMpService mpService = mpServiceFactory.getRequiredMpService(accountId); try { return mpService.getDataCubeService().getInterfaceSummary( @@ -74,4 +80,11 @@ public class MpStatisticsServiceImpl implements MpStatisticsService { } } + private void validDate(LocalDateTime[] date){ + if(date != null) { + if (date[0].isAfter(LocalDateTime.now()) || date[1].isAfter(LocalDateTime.now())) + throw exception(STATISTICS_GET_DATETIME_FAIL); + } + } + } diff --git a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java index 350780d..641e1df 100644 --- a/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java +++ b/yshop-module-pay/yshop-module-pay-api/src/main/java/co/yixiang/yshop/module/pay/config/handlers/AliPayMessageHandler.java @@ -1,11 +1,13 @@ package co.yixiang.yshop.module.pay.config.handlers; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; import co.yixiang.yshop.module.pay.mq.producer.PayNoticeProducer; import com.egzosn.pay.ali.api.AliPayService; import com.egzosn.pay.ali.bean.AliPayMessage; import com.egzosn.pay.common.api.PayMessageHandler; import com.egzosn.pay.common.bean.PayOutMessage; import com.egzosn.pay.common.exception.PayErrorException; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -16,6 +18,7 @@ import java.util.Map; * @author hupeng * @date 2023/7/15 */ +@Slf4j @Component public class AliPayMessageHandler implements PayMessageHandler { @@ -41,9 +44,10 @@ public class AliPayMessageHandler implements PayMessageHandler { @@ -33,7 +35,8 @@ public class WxPayMessageHandler implements PayMessageHandler p.value.equals(value)) + .findAny() + .orElse(null); + } + + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/pom.xml b/yshop-module-pay/yshop-module-pay-biz/pom.xml index c19be8b..5b10c84 100644 --- a/yshop-module-pay/yshop-module-pay-biz/pom.xml +++ b/yshop-module-pay/yshop-module-pay-biz/pom.xml @@ -65,7 +65,12 @@ co.yixiang.boot yshop-spring-boot-starter-excel - + + commons-io + commons-io + 2.11.0 + compile + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayClient.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayClient.java new file mode 100644 index 0000000..12d9787 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayClient.java @@ -0,0 +1,11 @@ +package co.yixiang.yshop.module.pay; + +import co.yixiang.yshop.module.pay.strategy.PayEnum; + +public class PayClient { + public static void main(String[] args) { + PayContext payContext = new PayContext(); + // System.out.println(payContext.selectPayWay(PayEnum.WEIXIN.getCode(), )); + } + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java new file mode 100644 index 0000000..e8cbbb9 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/PayContext.java @@ -0,0 +1,25 @@ +package co.yixiang.yshop.module.pay; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.strategy.Pay; +import co.yixiang.yshop.module.pay.strategy.PayFactory; +import lombok.Getter; + +import java.util.Map; + +@Getter +public class PayContext { + + private Pay pay; + + public Map selectPayWay(String payCode, PayParam payParam) throws Exception { + pay = PayFactory.getInstance().create(payCode); + return pay.selectPayWay(payCode, payParam); + } + + public void setPay(Pay pay) { + this.pay = pay; + } +} + + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java new file mode 100644 index 0000000..ad2aa44 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/controller/admin/merchantdetails/vo/PayParam.java @@ -0,0 +1,37 @@ +package co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo; + +import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@AllArgsConstructor +public class PayParam { + /*** + * 商户订单号 + */ + String orderId; + + /*** + * 订单金额 + */ + BigDecimal money; + + /*** + * 用户openid + */ + String openid; + + String ip; + + /*** + * 支付类型 app h5 applet + */ + String type; + + String payDesc; + + MerchantDetailsDO merchantDetailsDO; +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java new file mode 100644 index 0000000..536b29d --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/Pay.java @@ -0,0 +1,9 @@ +package co.yixiang.yshop.module.pay.strategy; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; + +import java.util.Map; + +public interface Pay { + Map selectPayWay(String payCode, PayParam param) throws Exception; +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayEnum.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayEnum.java new file mode 100644 index 0000000..ec90112 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayEnum.java @@ -0,0 +1,24 @@ +package co.yixiang.yshop.module.pay.strategy; + +import lombok.Getter; + +@Getter +public enum PayEnum { + + ALI("alipay","支付宝支付"), + WEIXIN("weixin","微信支付"), + WEIXIN_H5("weixin_h5","微信H5支付"), + WEIXIN_APPLET("weixin_applet","微信小程序支付"), + WEIXIN_APP("weixin_app","微信app支付"), + YUE("yue","余额支付"), + INTEGRAL("integral","积分兑换"); + + private String msg; + private String code; + + PayEnum( String code,String msg) { + this.msg = msg; + this.code = code; + } + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java new file mode 100644 index 0000000..dfc0008 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/PayFactory.java @@ -0,0 +1,31 @@ +package co.yixiang.yshop.module.pay.strategy; + +import co.yixiang.yshop.module.pay.strategy.type.AliPay; +import co.yixiang.yshop.module.pay.strategy.type.WeChatPay; +import co.yixiang.yshop.module.pay.strategy.type.YuePay; + +import java.util.HashMap; +import java.util.Map; + +public class PayFactory { + + private static final PayFactory factory = new PayFactory(); + + private PayFactory(){} + + private static final Map PayMap = new HashMap<>(16); + + static { + PayMap.put(PayEnum.ALI.getCode(),new AliPay()); + PayMap.put(PayEnum.WEIXIN.getCode(),new WeChatPay()); + PayMap.put(PayEnum.YUE.getCode(),new YuePay()); + } + + public Pay create(String payCode){ + return (Pay) PayMap.get(payCode); + } + + public static PayFactory getInstance(){ + return factory; + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java new file mode 100644 index 0000000..a68376a --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/AliPay.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.pay.strategy.type; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.strategy.Pay; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Map; + +public class AliPay implements Pay { + + @Override + public Map selectPayWay(String payCode, PayParam param) throws Exception{ + //do something + return Collections.emptyMap(); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java new file mode 100644 index 0000000..22338ad --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/WeChatPay.java @@ -0,0 +1,23 @@ +package co.yixiang.yshop.module.pay.strategy.type; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; +import co.yixiang.yshop.module.pay.strategy.Pay; +import co.yixiang.yshop.module.pay.strategy.weixin.service.WxPayServiceUtils; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Map; +import java.util.Objects; + +public class WeChatPay implements Pay { + + @Override + public Map selectPayWay(String payCode, PayParam param) throws Exception { + //根据微信type选择不同的支付 H5/APPLET/APP + if (Objects.equals(param.getType(), PayTypeEnum.WEIXIN_H5.getValue())) { + return new WxPayServiceUtils().gotoPay(param); + } + return Collections.emptyMap(); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/YuePay.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/YuePay.java new file mode 100644 index 0000000..968a839 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/type/YuePay.java @@ -0,0 +1,17 @@ +package co.yixiang.yshop.module.pay.strategy.type; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.strategy.Pay; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Map; + +public class YuePay implements Pay { + + @Override + public Map selectPayWay(String payCode,PayParam param) throws Exception{ + //do something + return Collections.emptyMap(); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayService.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayService.java new file mode 100644 index 0000000..a70558a --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayService.java @@ -0,0 +1,56 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.service; + +import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Map; + +public interface WxPayService { + + /** + * 微信支付 + * @param orderTradeNo 订单编号 + * @param money 订单金额 + * @param openid 客户openid + * @param ip 服务ip地址 + * @param type 小程序或app + */ + Map gotoPay(String orderTradeNo, BigDecimal money, String openid, String ip, String type, MerchantDetailsDO merchantDetailsDO) throws Exception; + + /** + * 微信退款 + * @param transactionId 支付单号 + * @param outRefundNo 支付生成的退款单号 + * @param total 订单总金额 + * @param refund 退款金额 + * @throws Exception + */ + public Map refund(String transactionId,String outRefundNo,BigDecimal total,BigDecimal refund,MerchantDetailsDO merchantDetailsDO) throws Exception; + + /** + * 保证金退款 + * @param transactionId 支付单号 + * @param outRefundNo 支付生成的退款单号 + * @param total 订单总金额 + * @param refund 退款金额 + */ + public Map refundBond(String transactionId,String outRefundNo,BigDecimal total,BigDecimal refund) throws Exception; + + + /** + * 生成收款码返回 + * @param orderFormid 订单编号 + * @param money 金额 + * @param ip IP地址 + * @param tradeType 支付类型 + * @throws Exception + */ + public String getCollectionCode(String orderFormid, BigDecimal money, String ip, String tradeType) throws Exception; + + /** + * 验签 + */ + public boolean verifyNotify(Map params); + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java new file mode 100644 index 0000000..c67bcf9 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/WxPayServiceUtils.java @@ -0,0 +1,261 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.service; + +import co.yixiang.yshop.module.pay.controller.admin.merchantdetails.vo.PayParam; +import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentApi; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentKit; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.RandomStringUtil; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.WXPayUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +@Slf4j(topic = "WxPayServiceUtils") +public class WxPayServiceUtils { + /** + * 支付小程序appid + */ + @Value("${weixin.appid}") + private String appid; + + /** + * 支付APP端的appid + */ + @Value("${weixin.app_appid}") + private String app_appid; + + /** + * 支付小程序秘钥 + */ + @Value("${weixin.secret}") + private String secret; + + /** + * 商户号 + */ + @Value("${weixin.mchid}") + private String mch_id; + + /** + * 证书路径 + */ + @Value("${weixin.certurl}") + private String cert_url; + + /** + * app回调地址 + */ + @Value("${weixin.app_notifyurl}") + private String app_notify_url; + + /** + * 商户秘钥 + */ + @Value("${weixin.key}") + private String key; + + + public Map gotoPay(PayParam param) throws Exception { + Map reqParams = new HashMap<>(); + //获取商户信息 + //h5 + String outTradeNo = ""; + if(PayTypeEnum.WEIXIN_H5.getValue().equals(param.getType())){ + outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"H5"; + reqParams.put("appid", param.getMerchantDetailsDO().getAppid()); + //交易类型 + reqParams.put("trade_type", "MWEB"); + }else if(PayTypeEnum.WEIXIN_APP.getValue().equals(param.getType())){ + //微信app分配的APPID + //app_appid + outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"APP"; + reqParams.put("appid", app_appid); + //交易类型 + reqParams.put("trade_type", "APP"); + }else if(PayTypeEnum.WEIXIN_APPLET.getValue().equals(param.getType())){ + //微信app分配的APPID + //app_appid + outTradeNo=param.getOrderId()+"-"+ RandomStringUtil.getRandomCode(3,0)+"APPLET"; + reqParams.put("appid", appid); + //交易类型 + reqParams.put("trade_type", "JSAPI"); + } + //微信支付分配的商户号 + //保存对应的outTradeNo + + reqParams.put("mch_id", param.getMerchantDetailsDO().getMchId()); + //随机字符串 + reqParams.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //签名类型 + reqParams.put("sign_type", "MD5"); + //充值订单 商品描述 + reqParams.put("body", "充值"+param.getPayDesc()+"订单-微信支付"); + //商户订单编号 + reqParams.put("out_trade_no", outTradeNo); + //订单总金额,单位为分 + reqParams.put("total_fee", param.getMoney().multiply(BigDecimal.valueOf(100)).intValue() + ""); + //终端IP + reqParams.put("spbill_create_ip", param.getIp()); + //通知地址 + reqParams.put("notify_url", param.getMerchantDetailsDO().getNotifyUrl()); + //用户标识 + // reqParams.put("openid", openid); + //签名 + String sign = WXPayUtil.generateSignature(reqParams, param.getMerchantDetailsDO().getKeyPrivate()); + reqParams.put("sign", sign); + /* + 调用支付定义下单API,返回预付单信息 prepay_id + */ + String xmlResult = PaymentApi.pushOrder(reqParams); + log.info("微信下单成功:{}",xmlResult); + Map result = PaymentKit.xmlToMap(xmlResult); + //预付单信息 + String prepay_id = result.get("prepay_id"); + + /* + 小程序调起支付数据签名 + */ + Map packageParams = new HashMap(); + packageParams.put("appId", param.getMerchantDetailsDO().getAppid()); + packageParams.put("timeStamp", System.currentTimeMillis() / 1000 + ""); + packageParams.put("nonceStr", System.currentTimeMillis() + ""); + packageParams.put("package", "prepay_id=" + prepay_id); + packageParams.put("signType", param.getMerchantDetailsDO().getSignType()); + String packageSign = WXPayUtil.generateSignature(packageParams, param.getMerchantDetailsDO().getKeyPrivate()); + packageParams.put("paySign", packageSign); + packageParams.put("codeUrl", result.get("code_url")); + //将组合后的商户订单号返回 + packageParams.put("out_trade_no", outTradeNo); + packageParams.put("merchant_id", param.getMerchantDetailsDO().getMchId()); + Map map = PaymentApi.queryByOutTradeNo(param.getMerchantDetailsDO().getAppid(),param.getMerchantDetailsDO().getMchId(),param.getMerchantDetailsDO().getKeyPrivate(),outTradeNo); + log.info("查询到微信订单信息:" + map.toString()); + // payInfo.setTransaction_id(map.get("transaction_id")) + if (PayTypeEnum.WEIXIN_H5.getValue().equals(param.getType())) { + packageParams.put("mwebUrl", result.get("mweb_url") + "&redirect_url="+ URLEncoder.encode(param.getMerchantDetailsDO().getReturnUrl(), "GBK")); + } + return packageParams; + } + + public Map refund(String transactionId, String outRefundNo, BigDecimal total, BigDecimal refund,MerchantDetailsDO merchantDetailsDO) throws Exception { + //退款资金来源-可用余额退款 + String refundAccount="REFUND_SOURCE_RECHARGE_FUNDS"; + Map params = new HashMap<>(); + if(outRefundNo.contains("APPLET")){ + //小程序微信退款 + params.put("appid", appid); + }else if(outRefundNo.contains("APP")){ + //APP微信退款 + params.put("appid", app_appid); + }else if(outRefundNo.contains("H5")){ + //H5 + params.put("appid", app_appid); + } + params.put("mch_id",mch_id); + params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //商户订单号和微信订单号二选一 +// params.put("out_trade_no", wxPayLog.getOutTradeNo()); + params.put("transaction_id", transactionId); + params.put("out_refund_no", outRefundNo); + params.put("total_fee", total.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_fee", refund.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_account", refundAccount); + // 退款原因,若商户传入,会在下发给用户的退款消息中体现退款原因 + params.put("refund_desc","退款"); + //退款回调 先不做 + // params.put("notify_url", pc_refund_notify_url); + //签名算法 + String sign = WXPayUtil.generateSignature(params,key); + params.put("sign", sign); + String xml = PaymentKit.toXml(params); + log.info(xml); + String xmlStr = WXPayUtil.doRefund("https://api.mch.weixin.qq.com/secapi/pay/refund", xml,cert_url,mch_id); + log.info(xmlStr); + //加入微信支付日志 + return PaymentKit.xmlToMap(xmlStr); + } + + public Map refundBond(String transactionId, String outRefundNo, BigDecimal total, BigDecimal refund) throws Exception { + //退款资金来源-可用余额退款 + String refundAccount="REFUND_SOURCE_RECHARGE_FUNDS"; + Map params = new HashMap<>(); + if(outRefundNo.contains("XCX")){ + //小程序微信退款 + params.put("appid", appid); + }else if(outRefundNo.contains("APP")){ + //APP微信退款 + params.put("appid", app_appid); + } + params.put("mch_id",mch_id); + params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //商户订单号和微信订单号二选一 +// params.put("out_trade_no", wxPayLog.getOutTradeNo()); + params.put("transaction_id", transactionId); + params.put("out_refund_no", outRefundNo); + params.put("total_fee", total.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_fee", refund.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_account", refundAccount); + // 退款原因,若商户传入,会在下发给用户的退款消息中体现退款原因 + params.put("refund_desc","退款"); + //退款回调 + // params.put("notify_url", pc_bond_refund_notify_url); + //签名算法 + String sign = WXPayUtil.generateSignature(params,key); + params.put("sign", sign); + String xml = PaymentKit.toXml(params); + log.info(xml); + String xmlStr = WXPayUtil.doRefund("https://api.mch.weixin.qq.com/secapi/pay/refund", xml,cert_url,mch_id); + log.info(xmlStr); + //加入微信支付日志 + Map map = PaymentKit.xmlToMap(xmlStr); + return map; + } + + + public String getCollectionCode(String orderTradeNo, BigDecimal money, String ip, String tradeType) throws Exception { + Map reqParams = new HashMap<>(); + //微信分配的小程序ID + reqParams.put("appid",appid); + //微信支付分配的商户号 + reqParams.put("mch_id",mch_id); + //随机字符串 + reqParams.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //签名类型 + reqParams.put("sign_type", "MD5"); + //充值订单 商品描述 + reqParams.put("body", "充值"+orderTradeNo+"订单-微信小程序"); + + //商户订单编号 + reqParams.put("out_trade_no", orderTradeNo); + //订单总金额,单位为分 + reqParams.put("total_fee", money.multiply(BigDecimal.valueOf(100)).intValue() + ""); + //终端IP +// reqParams.put("spbill_create_ip", "127.0.0.1"); + reqParams.put("spbill_create_ip", ip); + //支付回调地址 + // reqParams.put("notify_url", pc_notify_url); + //交易类型 + reqParams.put("trade_type", tradeType); + //用户标识 +// reqParams.put("openid", openid); + //签名 + String sign = WXPayUtil.generateSignature(reqParams,key); + reqParams.put("sign", sign); + /* + 调用支付定义下单API,返回预付单信息 prepay_id + */ + String xmlResult = PaymentApi.pushOrder(reqParams); + log.info(xmlResult); + Map result = PaymentKit.xmlToMap(xmlResult); + return result.get("code_url"); + } + + public boolean verifyNotify(Map params){ + return PaymentKit.verifyNotify(params,key); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java new file mode 100644 index 0000000..e6cd211 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/service/impl/WxPayServiceImpl.java @@ -0,0 +1,273 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.service.impl; + +import co.yixiang.yshop.module.pay.dal.dataobject.merchantdetails.MerchantDetailsDO; +import co.yixiang.yshop.module.pay.enums.PayTypeEnum; +import co.yixiang.yshop.module.pay.strategy.weixin.service.WxPayService; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentApi; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.PaymentKit; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.RandomStringUtil; +import co.yixiang.yshop.module.pay.strategy.weixin.skd.WXPayUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.util.ClassUtils; +import org.springframework.util.ResourceUtils; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j(topic = "WxPayServiceImpl") +public class WxPayServiceImpl implements WxPayService { + /** + * 支付小程序appid + */ + @Value("${weixin.appid}") + private String appid; + + /** + * 支付APP端的appid + */ + @Value("${weixin.app_appid}") + private String app_appid; + + /** + * 支付小程序秘钥 + */ + @Value("${weixin.secret}") + private String secret; + + /** + * 商户号 + */ + @Value("${weixin.mchid}") + private String mch_id; + + /** + * 证书路径 + */ + @Value("${weixin.certurl}") + private String cert_url; + + /** + * app回调地址 + */ + @Value("${weixin.app_notifyurl}") + private String app_notify_url; + + /** + * 商户秘钥 + */ + @Value("${weixin.key}") + private String key; + + + @Override + public Map gotoPay(String orderId, BigDecimal money, String openid, String ip, String type, MerchantDetailsDO merchantDetailsDO) throws Exception { + Map reqParams = new HashMap<>(); + //获取商户信息 + //h5 + String outTradeNo = ""; + if(PayTypeEnum.WEIXIN_H5.getValue().equals(type)){ + outTradeNo=orderId+"-"+ RandomStringUtil.getRandomCode(3,0)+"H5"; + reqParams.put("appid", merchantDetailsDO.getAppid()); + //交易类型 + reqParams.put("trade_type", "MWEB"); + }else if(PayTypeEnum.WEIXIN_APP.getValue().equals(type)){ + //微信app分配的APPID + //app_appid + outTradeNo=orderId+"-"+ RandomStringUtil.getRandomCode(3,0)+"APP"; + reqParams.put("appid", app_appid); + //交易类型 + reqParams.put("trade_type", "APP"); + }else if(PayTypeEnum.WEIXIN_APPLET.getValue().equals(type)){ + //微信app分配的APPID + //app_appid + outTradeNo=orderId+"-"+ RandomStringUtil.getRandomCode(3,0)+"APPLET"; + reqParams.put("appid", appid); + //交易类型 + reqParams.put("trade_type", "JSAPI"); + } + //微信支付分配的商户号 + //保存对应的outTradeNo + + reqParams.put("mch_id", merchantDetailsDO.getMchId()); + //随机字符串 + reqParams.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //签名类型 + reqParams.put("sign_type", "MD5"); + //充值订单 商品描述 + reqParams.put("body", "充值"+outTradeNo+"订单-微信支付"); + //商户订单编号 + reqParams.put("out_trade_no", outTradeNo); + //订单总金额,单位为分 + reqParams.put("total_fee", money.multiply(BigDecimal.valueOf(100)).intValue() + ""); + //终端IP + reqParams.put("spbill_create_ip", ip); + //通知地址 + reqParams.put("notify_url", merchantDetailsDO.getNotifyUrl()); + //用户标识 + // reqParams.put("openid", openid); + //签名 + String sign = WXPayUtil.generateSignature(reqParams, merchantDetailsDO.getKeyPrivate()); + reqParams.put("sign", sign); + /* + 调用支付定义下单API,返回预付单信息 prepay_id + */ + String xmlResult = PaymentApi.pushOrder(reqParams); + log.info(xmlResult); + Map result = PaymentKit.xmlToMap(xmlResult); + //预付单信息 + String prepay_id = result.get("prepay_id"); + + /* + 小程序调起支付数据签名 + */ + Map packageParams = new HashMap(); + packageParams.put("appId", merchantDetailsDO.getAppid()); + packageParams.put("timeStamp", System.currentTimeMillis() / 1000 + ""); + packageParams.put("nonceStr", System.currentTimeMillis() + ""); + packageParams.put("package", "prepay_id=" + prepay_id); + packageParams.put("signType", merchantDetailsDO.getSignType()); + String packageSign = WXPayUtil.generateSignature(packageParams, merchantDetailsDO.getKeyPrivate()); + packageParams.put("paySign", packageSign); + packageParams.put("codeUrl", result.get("code_url")); + //将组合后的商户订单号返回 + packageParams.put("out_trade_no", outTradeNo); + packageParams.put("orderId", orderId); + packageParams.put("merchant_id", merchantDetailsDO.getMchId()); + Map map = PaymentApi.queryByOutTradeNo(merchantDetailsDO.getAppid(),merchantDetailsDO.getMchId(),merchantDetailsDO.getKeyPrivate(),outTradeNo); + log.info("查询到微信订单信息:" + map.toString()); + // payInfo.setTransaction_id(map.get("transaction_id")) + if (PayTypeEnum.WEIXIN_H5.getValue().equals(type)) { + packageParams.put("mwebUrl", result.get("mweb_url") + "&redirect_url="+ URLEncoder.encode(merchantDetailsDO.getReturnUrl(), "GBK")); + } + return packageParams; + } + + @Override + public Map refund(String transactionId, String outRefundNo, BigDecimal total, BigDecimal refund,MerchantDetailsDO merchantDetailsDO) throws Exception { + //退款资金来源-可用余额退款 + String refundAccount="REFUND_SOURCE_RECHARGE_FUNDS"; + Map params = new HashMap<>(); + if(outRefundNo.contains("APPLET")){ + //小程序微信退款 + params.put("appid", appid); + }else if(outRefundNo.contains("APP")){ + //APP微信退款 + params.put("appid", app_appid); + }else if(outRefundNo.contains("H5")){ + //H5 + params.put("appid", app_appid); + } + params.put("mch_id",mch_id); + params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //商户订单号和微信订单号二选一 +// params.put("out_trade_no", wxPayLog.getOutTradeNo()); + params.put("transaction_id", transactionId); + params.put("out_refund_no", outRefundNo); + params.put("total_fee", total.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_fee", refund.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_account", refundAccount); + // 退款原因,若商户传入,会在下发给用户的退款消息中体现退款原因 + params.put("refund_desc","退款"); + //退款回调 先不做 + // params.put("notify_url", pc_refund_notify_url); + //签名算法 + String sign = WXPayUtil.generateSignature(params,key); + params.put("sign", sign); + String xml = PaymentKit.toXml(params); + log.info(xml); + String cert_url = "/yshop-server/apiclient_cert.p12"; + log.info("certUrl:{}",cert_url); + String xmlStr = WXPayUtil.doRefund("https://api.mch.weixin.qq.com/secapi/pay/refund", xml,cert_url,mch_id); + log.info(xmlStr); + //加入微信支付日志 + return PaymentKit.xmlToMap(xmlStr); + } + + @Override + public Map refundBond(String transactionId, String outRefundNo, BigDecimal total, BigDecimal refund) throws Exception { + //退款资金来源-可用余额退款 + String refundAccount="REFUND_SOURCE_RECHARGE_FUNDS"; + Map params = new HashMap<>(); + if(outRefundNo.contains("XCX")){ + //小程序微信退款 + params.put("appid", appid); + }else if(outRefundNo.contains("APP")){ + //APP微信退款 + params.put("appid", app_appid); + } + params.put("mch_id",mch_id); + params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //商户订单号和微信订单号二选一 +// params.put("out_trade_no", wxPayLog.getOutTradeNo()); + params.put("transaction_id", transactionId); + params.put("out_refund_no", outRefundNo); + params.put("total_fee", total.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_fee", refund.multiply(BigDecimal.valueOf(100)).intValue() + ""); + params.put("refund_account", refundAccount); + // 退款原因,若商户传入,会在下发给用户的退款消息中体现退款原因 + params.put("refund_desc","退款"); + //退款回调 + // params.put("notify_url", pc_bond_refund_notify_url); + //签名算法 + String sign = WXPayUtil.generateSignature(params,key); + params.put("sign", sign); + String xml = PaymentKit.toXml(params); + log.info(xml); + String xmlStr = WXPayUtil.doRefund("https://api.mch.weixin.qq.com/secapi/pay/refund", xml,cert_url,mch_id); + log.info(xmlStr); + //加入微信支付日志 + Map map = PaymentKit.xmlToMap(xmlStr); + return map; + } + + @Override + public String getCollectionCode(String orderTradeNo, BigDecimal money, String ip, String tradeType) throws Exception { + Map reqParams = new HashMap<>(); + //微信分配的小程序ID + reqParams.put("appid",appid); + //微信支付分配的商户号 + reqParams.put("mch_id",mch_id); + //随机字符串 + reqParams.put("nonce_str", System.currentTimeMillis() / 1000 + ""); + //签名类型 + reqParams.put("sign_type", "MD5"); + //充值订单 商品描述 + reqParams.put("body", "充值"+orderTradeNo+"订单-微信小程序"); + + //商户订单编号 + reqParams.put("out_trade_no", orderTradeNo); + //订单总金额,单位为分 + reqParams.put("total_fee", money.multiply(BigDecimal.valueOf(100)).intValue() + ""); + //终端IP +// reqParams.put("spbill_create_ip", "127.0.0.1"); + reqParams.put("spbill_create_ip", ip); + //支付回调地址 + // reqParams.put("notify_url", pc_notify_url); + //交易类型 + reqParams.put("trade_type", tradeType); + //用户标识 +// reqParams.put("openid", openid); + //签名 + String sign = WXPayUtil.generateSignature(reqParams,key); + reqParams.put("sign", sign); + /* + 调用支付定义下单API,返回预付单信息 prepay_id + */ + String xmlResult = PaymentApi.pushOrder(reqParams); + log.info(xmlResult); + Map result = PaymentKit.xmlToMap(xmlResult); + return result.get("code_url"); + } + + @Override + public boolean verifyNotify(Map params){ + return PaymentKit.verifyNotify(params,key); + } +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/HttpKit.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/HttpKit.java new file mode 100644 index 0000000..eaffd95 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/HttpKit.java @@ -0,0 +1,260 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import javax.net.ssl.*; +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Iterator; +import java.util.Map; + +public class HttpKit { + private static final String GET = "GET"; + private static final String POST = "POST"; + private static String CHARSET = "UTF-8"; + private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory(); + private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new HttpKit().new TrustAnyHostnameVerifier(); + +// public static final OkHttp3Delegate delegate = new OkHttp3Delegate(); + + private HttpKit() { + } + + private static SSLSocketFactory initSSLSocketFactory() { + try { + TrustManager[] e = new TrustManager[]{new HttpKit().new TrustAnyTrustManager()}; + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init((KeyManager[])null, e, new SecureRandom()); + return sslContext.getSocketFactory(); + } catch (Exception var2) { + throw new RuntimeException(var2); + } + } + + public static void setCharSet(String charSet) { + if(charSet!=null && !charSet.equals("")) { + throw new IllegalArgumentException("charSet can not be blank."); + } else { + CHARSET = charSet; + } + } + + private static HttpURLConnection getHttpConnection(String url, String method, Map headers) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { + URL _url = new URL(url); + HttpURLConnection conn = (HttpURLConnection)_url.openConnection(); + if(conn instanceof HttpsURLConnection) { + ((HttpsURLConnection)conn).setSSLSocketFactory(sslSocketFactory); + ((HttpsURLConnection)conn).setHostnameVerifier(trustAnyHostnameVerifier); + } + + conn.setRequestMethod(method); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(19000); + conn.setReadTimeout(19000); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("AuthUser-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"); + if(headers != null && !headers.isEmpty()) { + Iterator i$ = headers.entrySet().iterator(); + + while(i$.hasNext()) { + Map.Entry entry = (Map.Entry)i$.next(); + conn.setRequestProperty((String)entry.getKey(), (String)entry.getValue()); + } + } + + return conn; + } + + public static String get(String url, Map queryParas, Map headers) { + HttpURLConnection conn = null; + String e; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), "GET", headers); + conn.connect(); + e = readResponseString(conn); + } catch (Exception var8) { + throw new RuntimeException(var8); + } finally { + if(conn != null) { + conn.disconnect(); + } + } + return e; + } + + public static String get(String url, Map queryParas) { + return get(url, queryParas, (Map)null); + } + + public static String get(String url) { + return get(url, (Map)null, (Map)null); + } + + public static String post(String url, Map queryParas, String data, Map headers) { + HttpURLConnection conn = null; + + String var6; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), "POST", headers); + conn.connect(); + OutputStream e = conn.getOutputStream(); + e.write(data.getBytes(CHARSET)); + e.flush(); + e.close(); + var6 = readResponseString(conn); + } catch (Exception var10) { + throw new RuntimeException(var10); + } finally { + if(conn != null) { + conn.disconnect(); + } + } + return var6; + } + + public static String post(String url, Map queryParas, String data) { + return post(url, queryParas, data, (Map)null); + } + + public static String post(String url, String data, Map headers) { + return post(url, (Map)null, data, headers); + } + + public static String post(String url, String data) { + return post(url, (Map)null, data, (Map)null); + } + + private static String readResponseString(HttpURLConnection conn) { + StringBuilder sb = new StringBuilder(); + InputStream inputStream = null; + + try { + inputStream = conn.getInputStream(); + BufferedReader e = new BufferedReader(new InputStreamReader(inputStream, CHARSET)); + String line = null; + + while((line = e.readLine()) != null) { + sb.append(line).append("\n"); + } + + String var5 = sb.toString(); + return var5; + } catch (Exception var14) { + throw new RuntimeException(var14); + } finally { + if(inputStream != null) { + try { + inputStream.close(); + } catch (IOException var13) { + } + } + + } + } + + private static String buildUrlWithQueryString(String url, Map queryParas) { + if(queryParas != null && !queryParas.isEmpty()) { + StringBuilder sb = new StringBuilder(url); + boolean isFirst; + if(url.indexOf("?") == -1) { + isFirst = true; + sb.append("?"); + } else { + isFirst = false; + } + + String key; + String value; + for(Iterator i$ = queryParas.entrySet().iterator(); i$.hasNext(); sb.append(key).append("=").append(value)) { + Map.Entry entry = (Map.Entry)i$.next(); + if(isFirst) { + isFirst = false; + } else { + sb.append("&"); + } + + key = (String)entry.getKey(); + value = (String)entry.getValue(); + if(value!=null && !value.equals("")) { + try { + value = URLEncoder.encode(value, CHARSET); + } catch (UnsupportedEncodingException var9) { + throw new RuntimeException(var9); + } + } + } + + return sb.toString(); + } else { + return url; + } + } + + public static String readData(HttpServletRequest request) { + BufferedReader br = null; + + try { + StringBuilder e = new StringBuilder(); + br = request.getReader(); + String line = null; + + while((line = br.readLine()) != null) { + e.append(line).append("\n"); + } + + line = e.toString(); + return line; + } catch (IOException var12) { + throw new RuntimeException(var12); + } finally { + if(br != null) { + try { + br.close(); + } catch (IOException var11) { + } + } + + } + } + + /** @deprecated */ + @Deprecated + public static String readIncommingRequestData(HttpServletRequest request) { + return readData(request); + } + + + private class TrustAnyTrustManager implements X509TrustManager { + private TrustAnyTrustManager() { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + } + + private class TrustAnyHostnameVerifier implements HostnameVerifier { + private TrustAnyHostnameVerifier() { + } + + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/IOUtils.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/IOUtils.java new file mode 100644 index 0000000..e33f5d9 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/IOUtils.java @@ -0,0 +1,79 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import org.apache.commons.io.Charsets; + +import java.io.*; +import java.nio.charset.Charset; + +/** + * IOUtils + * @author majker + */ +public abstract class IOUtils { + private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; + + /** + * closeQuietly + * @param closeable 自动关闭 + */ + public static void closeQuietly(Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (IOException ioe) { + // ignore + } + } + + /** + * InputStream to String utf-8 + * + * @param input the InputStream to read from + * @return the requested String + * @throws NullPointerException if the input is null + * @throws IOException if an I/O error occurs + */ + public static String toString(InputStream input) throws IOException { + return toString(input, Charsets.UTF_8); + } + + /** + * InputStream to String + * + * @param input the InputStream to read from + * @param charset the Charset + * @return the requested String + * @throws NullPointerException if the input is null + * @throws IOException if an I/O error occurs + */ + public static String toString(InputStream input, Charset charset) throws IOException { + InputStreamReader in = new InputStreamReader(input, charset); + StringBuffer out = new StringBuffer(); + char[] c = new char[DEFAULT_BUFFER_SIZE]; + for (int n; (n = in.read(c)) != -1;) { + out.append(new String(c, 0, n)); + } + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(input); + return out.toString(); + } + + /** + * InputStream to File + * @param input the InputStream to read from + * @param file the File to write + * @throws IOException id异常 + */ + public static void toFile(InputStream input, File file) throws IOException { + OutputStream os = new FileOutputStream(file); + int bytesRead = 0; + byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; + while ((bytesRead = input.read(buffer, 0, DEFAULT_BUFFER_SIZE)) != -1) { + os.write(buffer, 0, bytesRead); + } + IOUtils.closeQuietly(os); + IOUtils.closeQuietly(input); + } +} + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/PaymentApi.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/PaymentApi.java new file mode 100644 index 0000000..922afdf --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/PaymentApi.java @@ -0,0 +1,277 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +/**************************************************** + * + * 微信支付api + * + * @author majker + * @version 1.0 + **************************************************/ +public class PaymentApi { + + private PaymentApi() {} + + // 文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 + private static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; + + /** + * 交易类型枚举 + * WAP的文档:https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1 + * @author L.cm + *
+    * email: 596392912@qq.com
+    * site: http://www.dreamlu.net
+    * date: 2015年10月27日 下午9:46:27
+    * 
+ */ + public enum TradeType { + JSAPI, NATIVE, APP, WAP, MWEB + } + + /** + * 统一下单 + * @param params 参数map + * @return String + */ + public static String pushOrder(Map params) { + return HttpKit.post(unifiedOrderUrl, PaymentKit.toXml(params)); + } + + private static Map request(String url, Map params, String paternerKey) { + params.put("nonce_str", System.currentTimeMillis() + ""); + String sign = PaymentKit.createSign(params, paternerKey); + params.put("sign", sign); + String xmlStr = HttpKit.post(url, PaymentKit.toXml(params)); + return PaymentKit.xmlToMap(xmlStr); + } + + /** + * 文档说明:https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_4 + *
+    * @param appId 公众账号ID         是    String(32)    wx8888888888888888    微信分配的公众账号ID
+    * 随机字符串         noncestr    是    String(32)    5K8264ILTKCH16CQ2502SI8ZNMTM67VS    随机字符串,不长于32位。推荐随机数生成算法
+    * 订单详情扩展字符串    package        是    String(32)    WAP    扩展字段,固定填写WAP
+    * @param prepayId 预支付交易会话标识    是    String(64)    wx201410272009395522657a690389285100    微信统一下单接口返回的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时
+    * 签名                 sign        是    String(32)    C380BEC2BFD727A4B6845133519F3AD6    签名,详见签名生成算法
+    * 时间戳            timestamp    是    String(32)    1414561699    当前的时间,其他详见时间戳规则
+    * @param paternerKey 签名密匙
+    * 
+ * @return {String} + */ + public static String getDeepLink(String appId, String prepayId, String paternerKey) { + Map params = new HashMap(); + params.put("appid", appId); + params.put("noncestr", System.currentTimeMillis() + ""); + params.put("package", "WAP"); + params.put("prepayid", prepayId); + params.put("timestamp", System.currentTimeMillis() / 1000 + ""); + String sign = PaymentKit.createSign(params, paternerKey); + params.put("sign", sign); + + String string1 = PaymentKit.packageSign(params, true); + + String string2 = ""; + try { string2 = PaymentKit.urlEncode(string1); } catch (UnsupportedEncodingException e) {} + + return "wechat://wap/pay?" + string2; + } + + // 文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 + private static String orderQueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery"; + + /** + * 根据商户订单号查询信息 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param transaction_id 微信订单号 + * @return 回调信息 + */ + public static Map queryByTransactionId(String appid, String mch_id, String paternerKey, String transaction_id) { + Map params = new HashMap(); + params.put("appid", appid); + params.put("mch_id", mch_id); + params.put("transaction_id", transaction_id); + return request(orderQueryUrl, params, paternerKey); + } + + /** + * 根据商户订单号查询信息 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param out_trade_no 商户订单号 + * @return 回调信息 + */ + public static Map queryByOutTradeNo(String appid, String mch_id, String paternerKey, String out_trade_no) { + Map params = new HashMap(); + params.put("appid", appid); + params.put("mch_id", mch_id); + params.put("out_trade_no", out_trade_no); + return request(orderQueryUrl, params, paternerKey); + } + + // 文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3 + private static String closeOrderUrl = "https://api.mch.weixin.qq.com/pay/closeorder"; + + /** + * 关闭订单 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param out_trade_no 商户订单号 + * @return 回调信息 + */ + public static Map closeOrder(String appid, String mch_id, String paternerKey, String out_trade_no) { + Map params = new HashMap(); + params.put("appid", appid); + params.put("mch_id", mch_id); + params.put("out_trade_no", out_trade_no); + return request(closeOrderUrl, params, paternerKey); + } + + // 申请退款文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 + public static String refundUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund"; + + + // 查询退款文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5 + private static String refundQueryUrl = "https://api.mch.weixin.qq.com/pay/refundquery"; + + private static Map baseRefundQuery(Map params, String appid, String mch_id, String paternerKey) { + params.put("appid", appid); + params.put("mch_id", mch_id); + return request(refundQueryUrl, params, paternerKey); + } + + /** + * 根据微信订单号查询退款 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param transaction_id 微信订单号 + * @return map + */ + public static Map refundQueryByTransactionId(String appid, String mch_id, String paternerKey, String transaction_id) { + Map params = new HashMap(); + params.put("transaction_id", transaction_id); + return baseRefundQuery(params, appid, mch_id, paternerKey); + } + + /** + * 根据商户订单号查询退款 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param out_trade_no 商户订单号 + * @return map + */ + public static Map refundQueryByOutTradeNo(String appid, String mch_id, String paternerKey, String out_trade_no) { + Map params = new HashMap(); + params.put("out_trade_no", out_trade_no); + return baseRefundQuery(params, appid, mch_id, paternerKey); + } + + /** + * 根据微信订单号查询退款 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param out_refund_no 商户退款单号 + * @return map + */ + public static Map refundQueryByOutRefundNo(String appid, String mch_id, String paternerKey, String out_refund_no) { + Map params = new HashMap(); + params.put("out_refund_no", out_refund_no); + return baseRefundQuery(params, appid, mch_id, paternerKey); + } + + /** + * 根据微信订单号查询退款 + * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 商户密钥 + * @param refund_id 微信退款单号 + * @return map + */ + public static Map refundQueryByRefundId(String appid, String mch_id, String paternerKey, String refund_id) { + Map params = new HashMap(); + params.put("refund_id", refund_id); + return baseRefundQuery(params, appid, mch_id, paternerKey); + } + + private static String downloadBillUrl = "https://api.mch.weixin.qq.com/pay/downloadbill"; + + /** + *
+    * ALL,返回当日所有订单信息,默认值
+    * SUCCESS,返回当日成功支付的订单
+    * REFUND,返回当日退款订单
+    * REVOKED,已撤销的订单
+    * 
+ */ + public static enum BillType { + ALL, SUCCESS, REFUND, REVOKED + } + + /** + * 下载对账单 + *
+    * 公众账号ID    appid        是    String(32)    wx8888888888888888    微信分配的公众账号ID(企业号corpid即为此appId)
+    * 商户号        mch_id        是    String(32)    1900000109    微信支付分配的商户号
+    * 设备号        device_info    否    String(32)    013467007045764    微信支付分配的终端设备号
+    * 随机字符串    nonce_str    是    String(32)    5K8264ILTKCH16CQ2502SI8ZNMTM67VS    随机字符串,不长于32位。推荐随机数生成算法
+    * 签名        sign        是    String(32)    C380BEC2BFD727A4B6845133519F3AD6    签名,详见签名生成算法
+    * 对账单日期    bill_date    是    String(8)    20140603    下载对账单的日期,格式:20140603
+    * 账单类型        bill_type    否    String(8)
+    * 
+ * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 签名密匙 + * @param billDate 对账单日期 + * @return String + */ + public static String downloadBill(String appid, String mch_id, String paternerKey, String billDate) { + return downloadBill(appid, mch_id, paternerKey, billDate, null); + } + + /** + * 下载对账单 + *
+    * 公众账号ID    appid        是    String(32)    wx8888888888888888    微信分配的公众账号ID(企业号corpid即为此appId)
+    * 商户号        mch_id        是    String(32)    1900000109    微信支付分配的商户号
+    * 设备号        device_info    否    String(32)    013467007045764    微信支付分配的终端设备号
+    * 随机字符串    nonce_str    是    String(32)    5K8264ILTKCH16CQ2502SI8ZNMTM67VS    随机字符串,不长于32位。推荐随机数生成算法
+    * 签名        sign        是    String(32)    C380BEC2BFD727A4B6845133519F3AD6    签名,详见签名生成算法
+    * 对账单日期    bill_date    是    String(8)    20140603    下载对账单的日期,格式:20140603
+    * 账单类型        bill_type    否    String(8)
+    * 
+ * @param appid 公众账号ID + * @param mch_id 商户号 + * @param paternerKey 签名密匙 + * @param billDate 对账单日期 + * @param billType 账单类型 + * @return String + */ + public static String downloadBill(String appid, String mch_id, String paternerKey, String billDate, BillType billType) { + Map params = new HashMap(); + params.put("appid", appid); + params.put("mch_id", mch_id); + params.put("nonce_str", System.currentTimeMillis() + ""); + params.put("bill_date", billDate); + if (null != billType) { + params.put("bill_type", billType.name()); + } else { + params.put("bill_type", BillType.ALL.name()); + } + String sign = PaymentKit.createSign(params, paternerKey); + params.put("sign", sign); + return HttpKit.post(downloadBillUrl, PaymentKit.toXml(params)); + } + +} + + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/PaymentKit.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/PaymentKit.java new file mode 100644 index 0000000..9ca785c --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/PaymentKit.java @@ -0,0 +1,120 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + + +import org.apache.commons.io.Charsets; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; + + +/**************************************************** + * + * 微信支付的统一下单工具类 + * + * @author majker + * @version 1.0 + **************************************************/ +public class PaymentKit { + + /** + * 组装签名的字段 + * @param params 参数 + * @param urlEncoder 是否urlEncoder + * @return String + */ + public static String packageSign(Map params, boolean urlEncoder) { + // 先将参数以其参数名的字典序升序进行排序 + TreeMap sortedParams = new TreeMap(params); + // 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起 + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (Entry param : sortedParams.entrySet()) { + String value = param.getValue(); + if (Tools.isEmpty(value)) { + continue; + } + if (first) { + first = false; + } else { + sb.append("&"); + } + sb.append(param.getKey()).append("="); + if (urlEncoder) { + try { value = urlEncode(value); } catch (UnsupportedEncodingException e) {} + } + sb.append(value); + } + return sb.toString(); + } + + /** + * urlEncode + * @param src 微信参数 + * @return String + * @throws UnsupportedEncodingException 编码错误 + */ + public static String urlEncode(String src) throws UnsupportedEncodingException { + return URLEncoder.encode(src, Charsets.UTF_8.name()).replace("+", "%20"); + } + + /** + * 生成签名 + * @param params 参数 + * @param paternerKey 支付密钥 + * @return sign + */ + public static String createSign(Map params, String paternerKey) { + // 生成签名前先去除sign + params.remove("sign"); + String stringA = packageSign(params, false); + String stringSignTemp = stringA + "&key=" + paternerKey; + return Tools.md5(stringSignTemp).toUpperCase(); + } + + /** + * 支付异步通知时校验sign + * @param params 参数 + * @param paternerKey 支付密钥 + * @return {boolean} + */ + public static boolean verifyNotify(Map params, String paternerKey){ + String sign = params.get("sign"); + String localSign = PaymentKit.createSign(params, paternerKey); + return sign.equals(localSign); + } + + /** + * 微信下单,map to xml + * @param params 参数 + * @return String + */ + public static String toXml(Map params) { + StringBuilder xml = new StringBuilder(); + xml.append(""); + for (Entry entry : params.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + // 略过空值 + if (Tools.isEmpty(value)) continue; + xml.append("<").append(key).append(">"); + xml.append(entry.getValue()); + xml.append(""); + } + xml.append(""); + return xml.toString(); + } + + /** + * 针对支付的xml,没有嵌套节点的简单处理 + * @param xmlStr xml字符串 + * @return map集合 + */ + public static Map xmlToMap(String xmlStr) { + XmlHelper xmlHelper = XmlHelper.of(xmlStr); + return xmlHelper.toMap(); + } + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/RandomStringUtil.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/RandomStringUtil.java new file mode 100644 index 0000000..1cba321 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/RandomStringUtil.java @@ -0,0 +1,84 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import java.util.Date; +import java.util.Random; +import java.util.UUID; + +/** + * @Name RandomStringUtil + * @Descr 生成随机字符串 + * @author lnexin@aliyun.com + * @date 2015年10月15日下午2:36:05 + */ +public class RandomStringUtil { + /** + * @param passLength + * : 要生成多少长度的字符串 + * @param type + * : 需要哪种类型 + * @return 根据传入的type来判定 + */ + + // 可以根据自己需求来删减下面的代码,不要要的类型可以删掉 + + // type=0:纯数字(0-9) + // type=1:全小写字母(a-z) + // type=2:全大写字母(A-Z) + // type=3: 数字+小写字母 + // type=4: 数字+大写字母 + // type=5:大写字母+小写字母 + // type=6:数字+大写字母+小写字母 + // type=7:固定长度33位:根据UUID拿到的随机字符串,去掉了四个"-"(相当于长度33位的小写字母加数字) + + public static String getRandomCode(int passLength, int type) { + StringBuffer buffer = null; + StringBuffer sb = new StringBuffer(); + Random r = new Random(); + r.setSeed(new Date().getTime()); + switch (type) { + case 0: + buffer = new StringBuffer("123456789"); + break; + case 1: + buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz"); + break; + case 2: + buffer = new StringBuffer("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + break; + case 3: + buffer = new StringBuffer("0123456789abcdefghijklmnopqrstuvwxyz"); + break; + case 4: + buffer = new StringBuffer("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + break; + case 5: + buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + break; + case 6: + buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); + sb.append(buffer.charAt(r.nextInt(buffer.length() - 10))); + passLength -= 1; + break; + case 7: + String s = UUID.randomUUID().toString(); + sb.append(s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24)); + } + + if (type != 7) { + int range = buffer.length(); + for (int i = 0; i < passLength; ++i) { + sb.append(buffer.charAt(r.nextInt(range))); + } + } + return sb.toString(); + } + + + public static String getRandom() { + String num = ""; + for (int i = 0; i < 4; i++) { + num = num + String.valueOf((int) Math.floor(Math.random() * 9 + 1)); + } + return num; + } +} \ No newline at end of file diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/Tools.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/Tools.java new file mode 100644 index 0000000..2cab01c --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/Tools.java @@ -0,0 +1,310 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import java.security.MessageDigest; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/**************************************************** + * + * 常用工具 + * + * @author majker + * @version 1.0 + **************************************************/ +public class Tools { + + /** + * 随机生成六位数验证码 + * @return + */ + public static int getRandomNum(){ + Random r = new Random(); + return r.nextInt(900000)+100000;//(Math.random()*(999999-100000)+100000) + } + + /** + * 检测字符串是否不为空(null,"","null") + * @param s + * @return 不为空则返回true,否则返回false + */ + public static boolean notEmpty(String s){ + return s!=null && !"".equals(s) && !"null".equals(s); + } + + /** + * 检测字符串是否为空(null,"","null") + * @param s + * @return 为空则返回true,不否则返回false + */ + public static boolean isEmpty(String s){ + return s==null || "".equals(s) || "null".equals(s); + } + + /** + * 字符串转换为字符串数组 + * @param str 字符串 + * @param splitRegex 分隔符 + * @return + */ + public static String[] str2StrArray(String str,String splitRegex){ + if(isEmpty(str)){ + return null; + } + return str.split(splitRegex); + } + + /** + * 用默认的分隔符(,)将字符串转换为字符串数组 + * @param str 字符串 + * @return + */ + public static String[] str2StrArray(String str){ + return str2StrArray(str,",\\s*"); + } + + /** + * 按照yyyy-MM-dd HH:mm:ss的格式,日期转字符串 + * @param date + * @return yyyy-MM-dd HH:mm:ss + */ + public static String date2Str(Date date){ + return date2Str(date,"yyyy-MM-dd HH:mm:ss"); + } + + /** + * 按照yyyy-MM-dd HH:mm:ss的格式,字符串转日期 + * @param date + * @return + */ + public static Date str2Date(String date){ + if(notEmpty(date)){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return sdf.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return new Date(); + }else{ + return null; + } + } + + /** + * 按照参数format的格式,日期转字符串 + * @param date + * @param format + * @return + */ + public static String date2Str(Date date,String format){ + if(date!=null){ + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + }else{ + return ""; + } + } + + /** + * 把时间根据时、分、秒转换为时间段 + * @param StrDate + */ + public static String getTimes(String StrDate){ + String resultTimes = ""; + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date now; + + try { + now = new Date(); + Date date=df.parse(StrDate); + long times = now.getTime()-date.getTime(); + long day = times/(24*60*60*1000); + long hour = (times/(60*60*1000)-day*24); + long min = ((times/(60*1000))-day*24*60-hour*60); + long sec = (times/1000-day*24*60*60-hour*60*60-min*60); + + StringBuffer sb = new StringBuffer(); + //sb.append("发表于:"); + if(hour>0 ){ + sb.append(hour+"小时前"); + } else if(min>0){ + sb.append(min+"分钟前"); + } else{ + sb.append(sec+"秒前"); + } + + resultTimes = sb.toString(); + } catch (ParseException e) { + e.printStackTrace(); + } + + return resultTimes; + } + + /** + * 验证邮箱 + * @param email + * @return + */ + public static boolean checkEmail(String email){ + boolean flag = false; + try{ + String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; + Pattern regex = Pattern.compile(check); + Matcher matcher = regex.matcher(email); + flag = matcher.matches(); + }catch(Exception e){ + flag = false; + } + return flag; + } + + /** + * 验证手机号码 + * @return + */ + public static boolean checkMobileNumber(String mobileNumber){ + Pattern p = null; + Matcher m = null; + boolean b = false; + p = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$"); // 验证手机号 + m = p.matcher(mobileNumber); + b = m.matches(); + return b; + } + + /** + * 将驼峰转下划线 + * @param param + * @return + */ + public static String camelToUnderline(String param){ + if (param==null||"".equals(param.trim())){ + return ""; + } + int len=param.length(); + StringBuilder sb=new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c=param.charAt(i); + if (Character.isUpperCase(c)){ + sb.append("_"); + sb.append(Character.toLowerCase(c)); + }else{ + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 去掉下划线并将下划线后的首字母转为大写 + * @param str + * @return + */ + public static String transformStr(String str){ + //去掉数据库字段的下划线 + if(str.contains("_")) { + String[] names = str.split("_"); + String firstPart = names[0]; + String otherPart = ""; + for (int i = 1; i < names.length; i++) { + String word = names[i].replaceFirst(names[i].substring(0, 1), names[i].substring(0, 1).toUpperCase()); + otherPart += word; + } + str = firstPart + otherPart; + } + return str; + } + + /** + * 转换为map + * @param list + * @return + */ + public static List> transformMap(List> list){ + List> resultMapList = new ArrayList<>(); + + for (Map map : list) { + Map tempMap = new HashMap<>(); + for (String s : map.keySet()) { + tempMap.put(transformStr(s),map.get(s)); + } + resultMapList.add(tempMap); + } + return resultMapList; + } + + public static String clearHtml(String content,int p) { + if(null==content) return ""; + if(0==p) return ""; + + Pattern p_script; + Matcher m_script; + Pattern p_style; + Matcher m_style; + Pattern p_html; + Matcher m_html; + + try { + String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; + //定义script的正则表达式{或]*?>[\\s\\S]*?<\\/script> } + String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; + //定义style的正则表达式{或]*?>[\\s\\S]*?<\\/style> } + String regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式 + + p_script = Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE); + m_script = p_script.matcher(content); + content = m_script.replaceAll(""); //过滤script标签 + p_style = Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE); + m_style = p_style.matcher(content); + content = m_style.replaceAll(""); //过滤style标签 + + p_html = Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE); + m_html = p_html.matcher(content); + + content = m_html.replaceAll(""); //过滤html标签 + }catch(Exception e) { + return ""; + } + + if(content.length()>p){ + content = content.substring(0, p)+"..."; + }else{ + content = content + "..."; + } + + return content; + } + + public static String md5(String str) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(str.getBytes()); + byte b[] = md.digest(); + + int i; + + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + str = buf.toString(); + } catch (Exception e) { + e.printStackTrace(); + + } + return str; + } + + +} + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WXPayConstants.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WXPayConstants.java new file mode 100644 index 0000000..551926f --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WXPayConstants.java @@ -0,0 +1,53 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +/** + * 常量 + */ +public class WXPayConstants { + + public enum SignType { + MD5, HMACSHA256 + } + + public static final String DOMAIN_API = "api.mch.wechat.qq.com"; + public static final String DOMAIN_API2 = "api2.mch.wechat.qq.com"; + public static final String DOMAIN_APIHK = "apihk.mch.wechat.qq.com"; + public static final String DOMAIN_APIUS = "apius.mch.wechat.qq.com"; + + + public static final String FAIL = "FAIL"; + public static final String SUCCESS = "SUCCESS"; + public static final String HMACSHA256 = "HMAC-SHA256"; + public static final String MD5 = "MD5"; + + public static final String FIELD_SIGN = "sign"; + public static final String FIELD_SIGN_TYPE = "sign_type"; + + public static final String MICROPAY_URL_SUFFIX = "/pay/micropay"; + public static final String UNIFIEDORDER_URL_SUFFIX = "/pay/unifiedorder"; + public static final String ORDERQUERY_URL_SUFFIX = "/pay/orderquery"; + public static final String REVERSE_URL_SUFFIX = "/secapi/pay/reverse"; + public static final String CLOSEORDER_URL_SUFFIX = "/pay/closeorder"; + public static final String REFUND_URL_SUFFIX = "/secapi/pay/refund"; + public static final String REFUNDQUERY_URL_SUFFIX = "/pay/refundquery"; + public static final String DOWNLOADBILL_URL_SUFFIX = "/pay/downloadbill"; + public static final String REPORT_URL_SUFFIX = "/payitil/report"; + public static final String SHORTURL_URL_SUFFIX = "/tools/shorturl"; + public static final String AUTHCODETOOPENID_URL_SUFFIX = "/tools/authcodetoopenid"; + + // sandbox + public static final String SANDBOX_MICROPAY_URL_SUFFIX = "/sandboxnew/pay/micropay"; + public static final String SANDBOX_UNIFIEDORDER_URL_SUFFIX = "/sandboxnew/pay/unifiedorder"; + public static final String SANDBOX_ORDERQUERY_URL_SUFFIX = "/sandboxnew/pay/orderquery"; + public static final String SANDBOX_REVERSE_URL_SUFFIX = "/sandboxnew/secapi/pay/reverse"; + public static final String SANDBOX_CLOSEORDER_URL_SUFFIX = "/sandboxnew/pay/closeorder"; + public static final String SANDBOX_REFUND_URL_SUFFIX = "/sandboxnew/secapi/pay/refund"; + public static final String SANDBOX_REFUNDQUERY_URL_SUFFIX = "/sandboxnew/pay/refundquery"; + public static final String SANDBOX_DOWNLOADBILL_URL_SUFFIX = "/sandboxnew/pay/downloadbill"; + public static final String SANDBOX_REPORT_URL_SUFFIX = "/sandboxnew/payitil/report"; + public static final String SANDBOX_SHORTURL_URL_SUFFIX = "/sandboxnew/tools/shorturl"; + public static final String SANDBOX_AUTHCODETOOPENID_URL_SUFFIX = "/sandboxnew/tools/authcodetoopenid"; + +} + + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WXPayUtil.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WXPayUtil.java new file mode 100644 index 0000000..c68ef74 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WXPayUtil.java @@ -0,0 +1,366 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ResourceUtils; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.SSLContext; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.*; +import java.nio.file.Files; +import java.security.KeyStore; +import java.security.MessageDigest; +import java.util.*; + +/**************************************************** + * + * + * + * @author majker + * @date: 2019/3/7 + * @version 1.0 + **************************************************/ +@Slf4j +public class WXPayUtil { + + /** + * XML格式字符串转换为Map + * + * @param strXML XML字符串 + * @return XML数据转换后的Map + * @throws Exception + */ + public static Map xmlToMap(String strXML) throws Exception { + try { + Map data = new HashMap(); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8")); + org.w3c.dom.Document doc = documentBuilder.parse(stream); + doc.getDocumentElement().normalize(); + NodeList nodeList = doc.getDocumentElement().getChildNodes(); + for (int idx = 0; idx < nodeList.getLength(); ++idx) { + Node node = nodeList.item(idx); + if (node.getNodeType() == Node.ELEMENT_NODE) { + org.w3c.dom.Element element = (org.w3c.dom.Element) node; + data.put(element.getNodeName(), element.getTextContent()); + } + } + try { + stream.close(); + } catch (Exception ex) { + // do nothing + } + return data; + } catch (Exception ex) { + WXPayUtil.getLogger().warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML); + throw ex; + } + + } + + /** + * 将Map转换为XML格式的字符串 + * + * @param data Map类型数据 + * @return XML格式的字符串 + * @throws Exception + */ + public static String mapToXml(Map data) throws Exception { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder(); + org.w3c.dom.Document document = documentBuilder.newDocument(); + org.w3c.dom.Element root = document.createElement("xml"); + document.appendChild(root); + for (String key: data.keySet()) { + String value = data.get(key); + if (value == null) { + value = ""; + } + value = value.trim(); + org.w3c.dom.Element filed = document.createElement(key); + filed.appendChild(document.createTextNode(value)); + root.appendChild(filed); + } + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + DOMSource source = new DOMSource(document); + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + transformer.transform(source, result); + String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", ""); + try { + writer.close(); + } + catch (Exception ex) { + } + return output; + } + + + /** + * 生成带有 sign 的 XML 格式字符串 + * + * @param data Map类型数据 + * @param key API密钥 + * @return 含有sign字段的XML + */ + public static String generateSignedXml(final Map data, String key) throws Exception { + return generateSignedXml(data, key, WXPayConstants.SignType.MD5); + } + + /** + * 生成带有 sign 的 XML 格式字符串 + * + * @param data Map类型数据 + * @param key API密钥 + * @param signType 签名类型 + * @return 含有sign字段的XML + */ + public static String generateSignedXml(final Map data, String key, WXPayConstants.SignType signType) throws Exception { + String sign = generateSignature(data, key, signType); + data.put(WXPayConstants.FIELD_SIGN, sign); + return mapToXml(data); + } + + + /** + * 判断签名是否正确 + * + * @param xmlStr XML格式数据 + * @param key API密钥 + * @return 签名是否正确 + * @throws Exception + */ + public static boolean isSignatureValid(String xmlStr, String key) throws Exception { + Map data = xmlToMap(xmlStr); + if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) { + return false; + } + String sign = data.get(WXPayConstants.FIELD_SIGN); + return generateSignature(data, key).equals(sign); + } + + /** + * 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。 + * + * @param data Map类型数据 + * @param key API密钥 + * @return 签名是否正确 + * @throws Exception + */ + public static boolean isSignatureValid(Map data, String key) throws Exception { + return isSignatureValid(data, key, WXPayConstants.SignType.MD5); + } + + /** + * 判断签名是否正确,必须包含sign字段,否则返回false。 + * + * @param data Map类型数据 + * @param key API密钥 + * @param signType 签名方式 + * @return 签名是否正确 + * @throws Exception + */ + public static boolean isSignatureValid(Map data, String key, WXPayConstants.SignType signType) throws Exception { + if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) { + return false; + } + String sign = data.get(WXPayConstants.FIELD_SIGN); + return generateSignature(data, key, signType).equals(sign); + } + + /** + * 生成签名 + * + * @param data 待签名数据 + * @param key API密钥 + * @return 签名 + */ + public static String generateSignature(final Map data, String key) throws Exception { + return generateSignature(data, key, WXPayConstants.SignType.MD5); + } + + /** + * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。 + * + * @param data 待签名数据 + * @param key API密钥 + * @param signType 签名方式 + * @return 签名 + */ + public static String generateSignature(final Map data, String key, WXPayConstants.SignType signType) throws Exception { + Set keySet = data.keySet(); + String[] keyArray = keySet.toArray(new String[0]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + if (k.equals(WXPayConstants.FIELD_SIGN)) { + continue; + } + if(data.get(k).trim().length() > 0) { // 参数值为空,则不参与签名 + sb.append(k).append("=").append(data.get(k).trim()).append("&"); + } + } + sb.append("key=").append(key); + if (WXPayConstants.SignType.MD5.equals(signType)) { + return MD5(sb.toString()).toUpperCase(); + } + else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) { + return HMACSHA256(sb.toString(), key); + } + else { + throw new Exception(String.format("Invalid sign_type: %s", signType)); + } + } + + + /** + * 获取随机字符串 Nonce Str + * + * @return String 随机字符串 + */ + public static String generateNonceStr() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); + } + + + /** + * 生成 MD5 + * + * @param data 待处理数据 + * @return MD5结果 + */ + public static String MD5(String data) throws Exception { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(data.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + } + + /** + * 生成 HMACSHA256 + * @param data 待处理数据 + * @param key 密钥 + * @return 加密结果 + * @throws Exception + */ + public static String HMACSHA256(String data, String key) throws Exception { + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + } + + /** + * 日志 + * @return + */ + public static Logger getLogger() { + Logger logger = LoggerFactory.getLogger("wxpay java sdk"); + return logger; + } + + /** + * 获取当前时间戳,单位秒 + * @return + */ + public static long getCurrentTimestamp() { + return System.currentTimeMillis()/1000; + } + + /** + * 获取当前时间戳,单位毫秒 + * @return + */ + public static long getCurrentTimestampMs() { + return System.currentTimeMillis(); + } + + /** + * 生成 uuid, 即用来标识一笔单,也用做 nonce_str + * @return + */ + public static String generateUUID() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); + } + + /** + * 申请退款 + */ + public static String doRefund(String url, String data,String cert_url,String mch_id) throws Exception { + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + File file = ResourceUtils.getFile(cert_url); +// FileInputStream is = new FileInputStream(file); + try (InputStream is = Files.newInputStream(file.toPath())) { + keyStore.load(is, mch_id.toCharArray()); + } + // Trust own CA and all self-signed certs + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial( + keyStore, + mch_id.toCharArray()) + .build(); + // Allow TLSv1 protocol only + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + sslcontext, + // new String[]{"TLSv1"}, + null, + null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER + ); + CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + try { + HttpPost httpost = new HttpPost(url); // 设置响应头信息 +// httpost.addHeader("Connection", "keep-alive"); +// httpost.addHeader("Accept", "*/*"); +// httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); +// httpost.addHeader("Host", "api.mch.wechat.qq.com"); +// httpost.addHeader("X-Requested-With", "XMLHttpRequest"); +// httpost.addHeader("Cache-Control", "max-age=0"); +// httpost.addHeader("ElectronicUser-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); + httpost.setEntity(new StringEntity(data, "UTF-8")); + CloseableHttpResponse response = httpclient.execute(httpost); + try { + HttpEntity entity = response.getEntity(); + String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); + EntityUtils.consume(entity); + return jsonStr; + } finally { + response.close(); + } + } finally { + httpclient.close(); + } + } +} + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WechatUtil.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WechatUtil.java new file mode 100644 index 0000000..3a73f6f --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/WechatUtil.java @@ -0,0 +1,359 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; /** + * Create by eval on 2019/3/20 + */ + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.URL; +import java.net.URLConnection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * @ClassName WechatUtil + * @Description TODO + * @Author eval + * @Date 9:44 2019/3/20 + * @Version 1.0 + */ +@Slf4j(topic = "WechatUtil") +@Component +public class WechatUtil { + + /** + * 支付小程序appid + */ + private static String appId; + + /** + * 支付小程序秘钥 + */ + private static String secret; + + @Value("${weixin.appid}") + public void setAppId(String appId){ + this.appId = appId; + } + + @Value("${weixin.secret}") + public void setSecret(String secret){ + this.secret = secret; + } + + /** + * 获取小程序codeid换取openid + * @param code + * @return + */ + public static JSONObject getOpenId(String code) { + String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+ appId +"&secret=" + + secret +"&js_code="+code+"&grant_type=authorization_code"; + PrintWriter out = null; + BufferedReader in = null; + String line; + StringBuffer stringBuffer = new StringBuffer(); + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + + // 设置通用的请求属性 设置请求格式 + //设置返回类型 + conn.setRequestProperty("contentType", "text/plain"); + //设置请求类型 + conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); + //设置超时时间 + conn.setConnectTimeout(1000); + conn.setReadTimeout(1000); + conn.setDoOutput(true); + conn.connect(); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 设置接收格式 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream(), "UTF-8")); + while ((line = in.readLine()) != null) { + stringBuffer.append(line); + } + JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString()); + return jsonObject; + + } catch (Exception e) { + e.printStackTrace(); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return null; + } + + /** + * 获取小程序token和openid + * @param code + * @return + */ + public static JSONObject getAccessTokenOrOpenid(String code) { + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + + "appid="+ appId +"&secret="+ secret +"&code="+code+"&grant_type=authorization_code"; + PrintWriter out = null; + BufferedReader in = null; + String line; + StringBuffer stringBuffer = new StringBuffer(); + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + + // 设置通用的请求属性 设置请求格式 + //设置返回类型 + conn.setRequestProperty("contentType", "text/plain"); + //设置请求类型 + conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); + //设置超时时间 + conn.setConnectTimeout(1000); + conn.setReadTimeout(1000); + conn.setDoOutput(true); + conn.connect(); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 设置接收格式 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream(), "UTF-8")); + while ((line = in.readLine()) != null) { + stringBuffer.append(line); + } + JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString()); + return jsonObject; + + } catch (Exception e) { + e.printStackTrace(); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return null; + } + + /** + * 获取小程序unionId + * @return + */ + public static String getUnionId(String accessToken,String openid) { + String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openid; + PrintWriter out = null; + BufferedReader in = null; + String line; + StringBuffer stringBuffer = new StringBuffer(); + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + + // 设置通用的请求属性 设置请求格式 + //设置返回类型 + conn.setRequestProperty("contentType", "text/plain"); + //设置请求类型 + conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); + //设置超时时间 + conn.setConnectTimeout(1000); + conn.setReadTimeout(1000); + conn.setDoOutput(true); + conn.connect(); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 设置接收格式 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream(), "UTF-8")); + while ((line = in.readLine()) != null) { + stringBuffer.append(line); + } + JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString()); + return jsonObject.get("unionId").toString(); + + } catch (Exception e) { + e.printStackTrace(); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return null; + } + +// public static Map getPhoneNumber(BuyerUserVo vo) { +// Map map=new HashMap<>(); +// String openid= vo.getWechatOpenId(); +// String session_key = vo.getSessionKey(); +// if (!EmptyUtils.isEmpty(openid)) { +// +// if(EmptyUtils.isEmpty(session_key)){ +// return null; +// } +// map.put("openid",openid); +// // 被加密的数据 +// byte[] dataByte = Base64.decode(vo.getEncryptedData()); +// // 加密秘钥 +// byte[] keyByte = Base64.decode(session_key); +// // 偏移量 +// byte[] ivByte = Base64.decode(vo.getIv()); +// try { +// // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 +// int base = 16; +// if (keyByte.length % base != 0) { +// int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); +// byte[] temp = new byte[groups * base]; +// Arrays.fill(temp, (byte) 0); +// System.arraycopy(keyByte, 0, temp, 0, keyByte.length); +// keyByte = temp; +// } +// // 初始化 +// Security.addProvider(new BouncyCastleProvider()); +// Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); +// SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); +// AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); +// IvParameterSpec ivParameterSpec=new IvParameterSpec(ivByte); +// parameters.init(ivParameterSpec); +// cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 +// byte[] resultByte = cipher.doFinal(dataByte); +// if (null != resultByte && resultByte.length > 0) { +// String result = new String(resultByte, "UTF-8"); +// JSONObject jsonObject = JSONObject.parseObject(result); +// map.put("param",jsonObject); +// return map; +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// return null; +// } + + /** + * 获取微信小程序 session_key 和 openid + * + * @param code 调用微信登陆返回的Code + * @return + */ + public static JSONObject getSessionKeyOropenid(String code) { + //微信端登录code值 + String wxCode = code; + String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; //请求地址 https://api.weixin.qq.com/sns/jscode2session + Map requestUrlParam = new HashMap(); + requestUrlParam.put("appid", appId); //开发者设置中的appId + requestUrlParam.put("secret", secret); //开发者设置中的appSecret + requestUrlParam.put("js_code", wxCode); //小程序调用wx.login返回的code + requestUrlParam.put("grant_type", "authorization_code"); //默认参数 authorization_code + + //发送post请求读取调用微信 https://api.weixin.qq.com/sns/jscode2session 接口获取openid用户唯一标识 + JSONObject jsonObject = JSON.parseObject(sendPost(requestUrl, requestUrlParam)); + return jsonObject; + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, Map paramMap) { + PrintWriter out = null; + BufferedReader in = null; + String result = ""; + + String param = ""; + Iterator it = paramMap.keySet().iterator(); + + while (it.hasNext()) { + String key = it.next(); + param += key + "=" + paramMap.get(key) + "&"; + } + + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 发送请求参数 + out.print(param); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return result; + } + + +} diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/XmlHelper.java b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/XmlHelper.java new file mode 100644 index 0000000..07ab264 --- /dev/null +++ b/yshop-module-pay/yshop-module-pay-biz/src/main/java/co/yixiang/yshop/module/pay/strategy/weixin/skd/XmlHelper.java @@ -0,0 +1,209 @@ +package co.yixiang.yshop.module.pay.strategy.weixin.skd; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; + +/** + * xpath解析xml + *
+ *     文档地址:
+ *     http://www.w3school.com.cn/xpath/index.asp
+ * 
+ * @author majker + */ +public class XmlHelper { + private final XPath path; + private final Document doc; + + private XmlHelper(InputSource inputSource) throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory dbf = getDocumentBuilderFactory(); + DocumentBuilder db = dbf.newDocumentBuilder(); + doc = db.parse(inputSource); + path = getXPathFactory().newXPath(); + } + + private static XmlHelper create(InputSource inputSource) { + try { + return new XmlHelper(inputSource); + } catch (ParserConfigurationException e) { + throw new RuntimeException(e); + } catch (SAXException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static XmlHelper of(InputStream is) { + InputSource inputSource = new InputSource(is); + return create(inputSource); + } + + public static XmlHelper of(String xmlStr) { + StringReader sr = new StringReader(xmlStr.trim()); + InputSource inputSource = new InputSource(sr); + XmlHelper xmlHelper = create(inputSource); + IOUtils.closeQuietly(sr); + return xmlHelper; + } + + private Object evalXPath(String expression, Object item, QName returnType) { + item = null == item ? doc : item; + try { + return path.evaluate(expression, item, returnType); + } catch (XPathExpressionException e) { + throw new RuntimeException(e); + } + } + + /** + * 获取String + * @param expression 路径 + * @return String + */ + public String getString(String expression) { + return (String) evalXPath(expression, null, XPathConstants.STRING); + } + + /** + * 获取Boolean + * @param expression 路径 + * @return String + */ + public Boolean getBoolean(String expression) { + return (Boolean) evalXPath(expression, null, XPathConstants.BOOLEAN); + } + + /** + * 获取Number + * @param expression 路径 + * @return {Number} + */ + public Number getNumber(String expression) { + return (Number) evalXPath(expression, null, XPathConstants.NUMBER); + } + + /** + * 获取某个节点 + * @param expression 路径 + * @return {Node} + */ + public Node getNode(String expression) { + return (Node) evalXPath(expression, null, XPathConstants.NODE); + } + + /** + * 获取子节点 + * @param expression 路径 + * @return NodeList + */ + public NodeList getNodeList(String expression) { + return (NodeList) evalXPath(expression, null, XPathConstants.NODESET); + } + + + /** + * 获取String + * @param node 节点 + * @param expression 相对于node的路径 + * @return String + */ + public String getString(Object node, String expression) { + return (String) evalXPath(expression, node, XPathConstants.STRING); + } + + /** + * 获取 + * @param node 节点 + * @param expression 相对于node的路径 + * @return String + */ + public Boolean getBoolean(Object node, String expression) { + return (Boolean) evalXPath(expression, node, XPathConstants.BOOLEAN); + } + + /** + * 获取 + * @param node 节点 + * @param expression 相对于node的路径 + * @return {Number} + */ + public Number getNumber(Object node, String expression) { + return (Number) evalXPath(expression, node, XPathConstants.NUMBER); + } + + /** + * 获取某个节点 + * @param node 节点 + * @param expression 路径 + * @return {Node} + */ + public Node getNode(Object node, String expression) { + return (Node) evalXPath(expression, node, XPathConstants.NODE); + } + + /** + * 获取子节点 + * @param node 节点 + * @param expression 相对于node的路径 + * @return NodeList + */ + public NodeList getNodeList(Object node, String expression) { + return (NodeList) evalXPath(expression, node, XPathConstants.NODESET); + } + + /** + * 针对没有嵌套节点的简单处理 + * @return map集合 + */ + public Map toMap() { + Element root = doc.getDocumentElement(); + Map params = new HashMap(); + + // 将节点封装成map形式 + NodeList list = root.getChildNodes(); + for (int i = 0; i < list.getLength(); i++) { + Node node = list.item(i); + if (node instanceof Element) { + params.put(node.getNodeName(), node.getTextContent()); + } + } + return params; + } + + private static DocumentBuilderFactory getDocumentBuilderFactory(){ + return XmlHelperHolder.documentBuilderFactory; + } + + private static XPathFactory getXPathFactory() { + return XmlHelperHolder.xPathFactory; + } + + /** + * 内部类单例 + */ + private static class XmlHelperHolder { + private static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + private static XPathFactory xPathFactory = XPathFactory.newInstance(); + } + +} + diff --git a/yshop-module-pay/yshop-module-pay-biz/src/main/resources/cert/apiclient_cert.p12 b/yshop-module-pay/yshop-module-pay-biz/src/main/resources/cert/apiclient_cert.p12 new file mode 100644 index 0000000..05b291b Binary files /dev/null and b/yshop-module-pay/yshop-module-pay-biz/src/main/resources/cert/apiclient_cert.p12 differ diff --git a/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java index 56767d1..95630e0 100644 --- a/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java +++ b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/DictTypeConstants.java @@ -26,4 +26,9 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + String USER_AGREEMENT = "user_agreement"; // 用户协议 + String PRIVACY_AGREEMENT = "privacy_agreement"; // 隐私协议 + + String DEFAULT_HEAD = "default_head"; // 用户默认头像 + } diff --git a/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/agreement/AgreementTypeEnum.java b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/agreement/AgreementTypeEnum.java new file mode 100644 index 0000000..3a27f63 --- /dev/null +++ b/yshop-module-system/yshop-module-system-api/src/main/java/co/yixiang/yshop/module/system/enums/agreement/AgreementTypeEnum.java @@ -0,0 +1,28 @@ +package co.yixiang.yshop.module.system.enums.agreement; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知类型 + * + * @author yshop + */ +@Getter +@AllArgsConstructor +public enum AgreementTypeEnum { + + USER(1, "用户协议"), + PRIVACY(2, "隐私协议"); + + /** + * 类型 + */ + private final Integer type; + + /** + * 描述 + */ + private final String des; + +} diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java index 71c221c..6f9f3d3 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/DictDataController.java @@ -49,8 +49,8 @@ public class DictDataController { return success(true); } - @DeleteMapping("/delete") @Operation(summary = "删除字典数据") + @DeleteMapping("/delete") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:dict:delete')") public CommonResult deleteDictData(Long id) { diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java index 5b4c43d..5a9ea79 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java @@ -25,7 +25,6 @@ public class DictDataBaseVO { @Schema(description = "字典值", required = true, example = "iocoder") @NotBlank(message = "字典键值不能为空") - @Size(max = 100, message = "字典键值长度不能超过100个字符") private String value; @Schema(description = "字典类型", required = true, example = "sys_common_sex") diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/sms/SmsCallbackController.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/sms/SmsCallbackController.java index ebd5ad1..7637e9d 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/sms/SmsCallbackController.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/admin/sms/SmsCallbackController.java @@ -35,14 +35,14 @@ public class SmsCallbackController { return success(true); } - @PostMapping("/tencent") - @PermitAll - @Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档") - @OperateLog(enable = false) - public CommonResult receiveTencentSmsStatus(HttpServletRequest request) throws Throwable { - String text = ServletUtils.getBody(request); - smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text); - return success(true); - } +// @PostMapping("/tencent") +// @PermitAll +// @Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档") +// @OperateLog(enable = false) +// public CommonResult receiveTencentSmsStatus(HttpServletRequest request) throws Throwable { +// String text = ServletUtils.getBody(request); +// smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text); +// return success(true); +// } } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java index 18bb341..f368d00 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/controller/app/dict/AppDictDataController.java @@ -1,4 +1,42 @@ package co.yixiang.yshop.module.system.controller.app.dict; +import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataRespVO; +import co.yixiang.yshop.module.system.service.dict.DictDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; + + +@Tag(name = "用户 APP - 数据字典") +@RestController +@RequestMapping("/system/dict-data") +@Validated public class AppDictDataController { + + @Resource + private DictDataService dictDataService; + + @GetMapping("/agreement/{type}") + @Operation(summary = "获得协议", description = "包括用户协议和隐私协议") + // 无需添加权限认证,因为前端全局都需要 + @PermitAll + public void getAgreement(@PathVariable Integer type, HttpServletResponse response) throws IOException { + response.setHeader("Content-Type","text/html;charset=UTF-8"); + DictDataRespVO dict = dictDataService.getAgreement(type); + PrintWriter writer = response.getWriter(); + writer.write(dict.getValue()); + writer.flush(); + // return success(dictDataService.getAgreement(type)); + } } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/mq/consumer/sms/SmsSendConsumer.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/mq/consumer/sms/SmsSendConsumer.java index 8c8505f..ba53220 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/mq/consumer/sms/SmsSendConsumer.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * 针对 {@link SmsSendMessage} 的消费者 + * 针对 {@link SmsSendMessage} 发送短信的消费者 * * @author zzf */ diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataService.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataService.java index b1b03dd..a6afe86 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataService.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataService.java @@ -1,10 +1,8 @@ package co.yixiang.yshop.module.system.service.dict; import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.*; +import co.yixiang.yshop.module.system.controller.admin.dict.vo.type.DictTypeSimpleRespVO; import co.yixiang.yshop.module.system.dal.dataobject.dict.DictDataDO; import java.util.Collection; @@ -105,4 +103,18 @@ public interface DictDataService { * @return 字典数据 */ DictDataDO parseDictData(String dictType, String label); + + + /** + * 获得协议 + * + * @return 字典类型列表 + */ + DictDataRespVO getAgreement(Integer type); + + /** + * 获得用户默认头像 + * @return + */ + DictDataRespVO getDefaultHead(); } diff --git a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java index 022efd1..f21acb9 100644 --- a/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java +++ b/yshop-module-system/yshop-module-system-biz/src/main/java/co/yixiang/yshop/module/system/service/dict/DictDataServiceImpl.java @@ -4,14 +4,14 @@ import cn.hutool.core.collection.CollUtil; import co.yixiang.yshop.framework.common.enums.CommonStatusEnum; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.framework.common.util.collection.CollectionUtils; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; -import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import co.yixiang.yshop.module.system.controller.admin.dict.vo.data.*; +import co.yixiang.yshop.module.system.controller.admin.dict.vo.type.DictTypeSimpleRespVO; import co.yixiang.yshop.module.system.convert.dict.DictDataConvert; import co.yixiang.yshop.module.system.dal.dataobject.dict.DictDataDO; import co.yixiang.yshop.module.system.dal.dataobject.dict.DictTypeDO; import co.yixiang.yshop.module.system.dal.mysql.dict.DictDataMapper; +import co.yixiang.yshop.module.system.enums.agreement.AgreementTypeEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -23,6 +23,9 @@ import java.util.List; import java.util.Map; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; +import static co.yixiang.yshop.module.system.enums.DictTypeConstants.PRIVACY_AGREEMENT; +import static co.yixiang.yshop.module.system.enums.DictTypeConstants.USER_AGREEMENT; +import static co.yixiang.yshop.module.system.enums.DictTypeConstants.DEFAULT_HEAD; import static co.yixiang.yshop.module.system.enums.ErrorCodeConstants.*; /** @@ -181,4 +184,23 @@ public class DictDataServiceImpl implements DictDataService { return dictDataMapper.selectByDictTypeAndLabel(dictType, label); } -} + + @Override + public DictDataRespVO getAgreement(Integer type) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + if (type.equals(AgreementTypeEnum.USER.getType())) { + qw.eq(DictDataDO::getLabel, USER_AGREEMENT); + } else { + qw.eq(DictDataDO::getLabel, PRIVACY_AGREEMENT); + } + DictDataDO dictDataDO = dictDataMapper.selectOne(qw); + return DictDataConvert.INSTANCE.convert(dictDataDO); + } + + @Override + public DictDataRespVO getDefaultHead(){ + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + DictDataDO dictDataDO = dictDataMapper.selectOne(qw.eq(DictDataDO::getLabel,DEFAULT_HEAD)); + return DictDataConvert.INSTANCE.convert(dictDataDO); + } +} \ No newline at end of file diff --git a/yshop-server/Dockerfile b/yshop-server/Dockerfile index 98c0f87..970e9a5 100644 --- a/yshop-server/Dockerfile +++ b/yshop-server/Dockerfile @@ -7,7 +7,7 @@ RUN mkdir -p /yshop-server WORKDIR /yshop-server ## 将后端项目的 Jar 文件,复制到镜像中 COPY ./target/yshop-server.jar app.jar - +COPY ./src/main/resources/cert/apiclient_cert.p12 apiclient_cert.p12 ## 设置 TZ 时区 ## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m" diff --git a/yshop-server/pom.xml b/yshop-server/pom.xml index abb327e..355cc83 100644 --- a/yshop-server/pom.xml +++ b/yshop-server/pom.xml @@ -21,11 +21,11 @@ https://github.com/guchengwuyue/yshop-pro - - - - - + + + + + co.yixiang.boot yshop-module-system-biz @@ -70,21 +70,21 @@ - - - - - + + + + + co.yixiang.boot yshop-module-shop-biz ${revision} - - - - - + + + + + co.yixiang.boot yshop-module-order-biz @@ -130,7 +130,24 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + true + + + diff --git a/yshop-server/src/main/resources/application-local.yaml b/yshop-server/src/main/resources/application-local.yaml index 28ecf4b..6f5aa1d 100644 --- a/yshop-server/src/main/resources/application-local.yaml +++ b/yshop-server/src/main/resources/application-local.yaml @@ -44,35 +44,36 @@ spring: primary: master datasource: master: - name: yshop-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: yshop_pro_dev + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 username: root - password: root + password: a6ID9^3%7kD # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W slave: # 模拟从库,可根据自己需要修改 - name: yshop-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: yshop_pro_dev_slave + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 username: root - password: root + password: a6ID9^3%7kD # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 - port: 6379 # 端口 - database: 0 # 数据库索引 + port: 23719 # 端口 + database: 11 # 数据库索引 # password: dev # 密码,建议生产环境开启 - --- #################### 定时任务相关配置 #################### # Quartz 配置项,对应 QuartzProperties 配置类 @@ -180,6 +181,26 @@ wx: key-prefix: wa # Redis Key 的前缀 TODO yshop:解决下 Redis key 管理的配置 http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 +--- #微信支付配置 +weixin: + #小程序appid + appid: + #APP端的appid + app_appid: + #小程序秘钥 + secret: + #商户号 + mchid: + #证书路径 + certurl: + #订单取消退款回调地址 + order_refund_notifyurl: + #APP回调地址 + app_notifyurl: + #商户秘钥 + key: + #h5支付之后跳转地址 + redirect_url: http://localhost:8080/ --- #################### yshop相关配置 #################### # yshop配置项,设置当前项目所有自定义的配置 @@ -198,6 +219,10 @@ yshop: error-code: # 错误码相关配置项 enable: false demo: false # 关闭演示模式 + sms-code: + api-key: LTAI5tBBPdRd4f2YZt5UhVjF + api-secret: iVP7EsjX309epI7MqsScziGhcrEHiT + justauth: enabled: true diff --git a/yshop-server/src/main/resources/application.yaml b/yshop-server/src/main/resources/application.yaml index 3b0b496..6d1e1e8 100644 --- a/yshop-server/src/main/resources/application.yaml +++ b/yshop-server/src/main/resources/application.yaml @@ -195,6 +195,8 @@ yshop: send-maximum-quantity-per-day: 10 begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 end-code: 9999 # 这里配置 9999 的原因是,测试方便。 + api-key: LTAI5tBBPdRd4f2YZt5UhVjF + api-secret: iVP7EsjX309epI7MqsScziGhcrEHiT trade: order: app-id: 1 # 商户编号 diff --git a/yshop-server/src/main/resources/cert/apiclient_cert.p12 b/yshop-server/src/main/resources/cert/apiclient_cert.p12 new file mode 100644 index 0000000..05b291b Binary files /dev/null and b/yshop-server/src/main/resources/cert/apiclient_cert.p12 differ